@trailstep/core 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/agent-execution/interactive-agent/launch-interactive-agent-target.ts","../src/cli-provider-runtime/process/resolve-cli-command.ts","../src/contracts/failures/failure.ts","../src/agent-execution/custom-provider/render-custom-provider-args.ts","../src/agent-targeting/parse-trailstep-config/parse-utils.ts","../src/providers/provider-manifest.ts","../src/agent-targeting/parse-trailstep-config/expand-agent-refs.ts","../src/agent-targeting/parse-trailstep-config/parse-agent-targets.ts","../src/agent-targeting/parse-trailstep-config/parse-agent-mappings.ts","../src/agent-targeting/parse-trailstep-config/parse-custom-providers.ts","../src/agent-targeting/parse-trailstep-config/parse-settings.ts","../src/runtime/storage-lifecycle/storage-lifecycle.ts","../src/runtime/artifacts/run-storage.ts","../src/runtime/runs/run-summaries.ts","../src/runtime/retry/latest-unresolved-failure.ts","../src/runtime/runs/track-summary.ts","../src/agent-targeting/parse-trailstep-config/parse-storage-config.ts","../src/agent-targeting/parse-trailstep-config/parse-workflow-agent-mappings.ts","../src/agent-targeting/parse-trailstep-config/validate-provider-references.ts","../src/agent-targeting/parse-trailstep-config/parse-trailstep-config.ts","../src/agent-targeting/resolve-agent-targets/resolve-agent-targets.ts","../src/runtime/run-context/run-context-storage.ts","../src/authoring/document/document.ts","../src/authoring/global-state/global-state.ts","../src/runtime/events/create-run-event.ts","../src/authoring/notify/notify.ts","../src/authoring/prompt-composition/prompt-composition.ts","../src/authoring/prompt-template/prompt-template.ts","../src/authoring/shape/json-schema.ts","../src/authoring/state/state.ts","../src/authoring/step/step-node.ts","../src/runtime/sub-prompts/run-sub-prompt.ts","../src/agent-execution/adapter-agent/run-adapter-agent-step/run-adapter-agent-step.ts","../src/agent-execution/dispatch-agent-step/dispatch-agent-step.ts","../src/runtime/artifacts/step-artifacts.ts","../src/agent-execution/interactive-agent/run-interactive-agent-command.ts","../src/runtime/interactive-session/interactive-session-protocol.ts","../src/agent-execution/working-agent/run-working-agent-command.ts","../src/agent-execution/working-agent/artifacts/resolve-step-agent-files.ts","../src/agent-execution/working-agent/prompts/build-working-agent-prompt.ts","../src/agent-execution/working-agent/targets/run-working-agent-target-attempt.ts","../src/agent-execution/working-agent/output/read-working-agent-output.ts","../src/agent-execution/working-agent/targets/custom-provider/build-working-agent-args.ts","../src/agent-execution/working-agent/targets/custom-provider/spawn-working-agent-process.ts","../src/agent-execution/working-agent/targets/custom-provider/run-custom-working-provider.ts","../src/agent-execution/working-agent/targets/manifest-provider/run-manifest-working-provider.ts","../src/cli-provider-runtime/envelopes/envelope.ts","../src/agent-execution/working-agent/targets/target-failures.ts","../src/runtime/sub-prompts/sub-prompt-artifacts.ts","../src/runtime/failures/failure-like.ts","../src/runtime/sub-prompts/sub-prompt-failures.ts","../src/runtime/sub-prompts/sub-prompt-fingerprint.ts","../src/runtime/sub-prompts/sub-prompt-replay.ts","../src/authoring/step/sub-prompt.ts","../src/authoring/workflow/define-workflow.ts","../src/authoring/workflow/workflow.ts","../src/deprecations/deprecation-manifest.ts","../src/runtime/cancellation/cancellation.ts","../src/runtime/retry/retry-policy.ts","../src/runtime/run-workflow/run-workflow.ts","../src/runtime/continuation/run-continuation/run-continuation.ts","../src/runtime/failures/step-execution-failure.ts","../src/runtime/run-context/with-step-context.ts","../src/runtime/run-workflow/cwd.ts","../src/runtime/timeout/timeout-policy.ts","../src/runtime/interactive-session/default-interactive-output-shape.ts","../src/runtime/continuation/resolve-step-output-schema/resolve-step-output-schema.ts","../src/runtime/failures/workflow-failure.ts","../src/runtime/resume/replay-completed-steps/replay-completed-steps.ts","../src/runtime/resume/reattach-in-progress-step/reattach-in-progress-step.ts","../src/runtime/resume/replay-to-failed-step/replay-to-failed-step.ts","../src/runtime/resume/replay-to-waiting-step/replay-to-waiting-step.ts","../src/runtime/retry/replay-to-retry-failure.ts","../src/runtime/run-context/create-run-context.ts","../src/runtime/run-workflow/initialize-run.ts","../src/runtime/run-workflow/root-continuation-array-scheduler.ts","../src/runtime/run-workflow/trailstep-config-input.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nimport type {\n TrailStepAgentTarget,\n TrailStepConfig,\n} from \"../../agent-targeting/targeting.types.js\";\nimport type { ManagedSessionPromptInjectionMode } from \"../../cli-provider-runtime/catalog/provider-adapter.types.js\";\nimport { resolveCliCommandForSpawn } from \"../../cli-provider-runtime/process/resolve-cli-command.js\";\nimport { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type {\n InteractiveProcessResult,\n InteractiveProcessRunner,\n} from \"../../runtime/run-workflow/run-workflow.types.js\";\nimport { renderCustomProviderArgs } from \"../custom-provider/render-custom-provider-args.js\";\n\nexport interface LaunchInteractiveAgentTargetOptions {\n readonly config: TrailStepConfig;\n readonly target: TrailStepAgentTarget;\n readonly prompt: string;\n readonly promptFile: string;\n readonly cwd: string;\n readonly runner?: InteractiveProcessRunner;\n readonly signal?: AbortSignal;\n}\n\nexport type LaunchInteractiveAgentTargetResult = InteractiveProcessResult & {\n readonly promptInjectionMode: ManagedSessionPromptInjectionMode;\n};\n\nexport async function launchInteractiveAgentTarget(\n options: LaunchInteractiveAgentTargetOptions,\n): Promise<LaunchInteractiveAgentTargetResult> {\n const manifestProvider = options.config.providers?.[options.target.provider];\n if (manifestProvider !== undefined && manifestProvider.source.type !== \"legacy-custom-provider\") {\n const interactive = manifestProvider.manifest.interactive;\n if (!interactive.supported || interactive.command === undefined) {\n throw new TrailStepFailureError({\n code: \"agent_provider_interactive_unsupported\",\n message: `Provider '${options.target.provider}' does not support interactive launch.`,\n details: { provider: options.target.provider },\n });\n }\n\n const command = interactive.command;\n const args = renderCustomProviderArgs({\n argv: options.target.args ?? [\"{{prompt}}\"],\n values: {\n prompt: options.prompt,\n promptFile: options.promptFile,\n ...(options.target.model === undefined ? {} : { model: options.target.model }),\n ...(options.target.thinking === undefined ? {} : { thinking: options.target.thinking }),\n },\n errorCode: \"interactive_command_invalid\",\n commandDescription: \"Manifest interactive provider command\",\n });\n const promptInjectionMode: ManagedSessionPromptInjectionMode = args.includes(options.promptFile)\n ? \"visible-prompt-file\"\n : \"visible-inline-prompt\";\n\n if (args.includes(options.promptFile)) {\n await mkdir(dirname(options.promptFile), { recursive: true });\n await writeFile(options.promptFile, options.prompt, \"utf8\");\n }\n\n let result: InteractiveProcessResult;\n try {\n result = await (options.runner ?? spawnInteractiveProcess)({\n command,\n args,\n cwd: options.cwd,\n shell: false,\n stdio: \"inherit\",\n env: definedProcessEnv(),\n signal: options.signal,\n });\n } catch (error) {\n throw mapInteractiveProviderLaunchError({\n error,\n provider: options.target.provider,\n command,\n });\n }\n\n return { ...result, promptInjectionMode };\n }\n\n const customProvider = options.config.customProviders[options.target.provider];\n if (!customProvider) {\n throw new TrailStepFailureError({\n code: \"agent_provider_unavailable\",\n message: `Interactive agent target '${options.target.provider}' does not reference a configured custom provider.`,\n details: { provider: options.target.provider },\n });\n }\n\n if (!customProvider.interactiveArgs) {\n throw new TrailStepFailureError({\n code: \"agent_provider_interactive_unsupported\",\n message: `Custom provider '${options.target.provider}' cannot run interactive sessions because customProviders.${options.target.provider}.interactiveArgs is not declared.`,\n details: { provider: options.target.provider },\n });\n }\n\n const args = renderCustomProviderArgs({\n argv: options.target.args ?? customProvider.interactiveArgs,\n values: {\n prompt: options.prompt,\n promptFile: options.promptFile,\n ...(options.target.model === undefined ? {} : { model: options.target.model }),\n ...(options.target.thinking === undefined ? {} : { thinking: options.target.thinking }),\n },\n errorCode: \"interactive_command_invalid\",\n commandDescription: \"Interactive agent command\",\n });\n const promptInjectionMode: ManagedSessionPromptInjectionMode = args.includes(options.promptFile)\n ? \"visible-prompt-file\"\n : \"visible-inline-prompt\";\n\n if (args.includes(options.promptFile)) {\n await mkdir(dirname(options.promptFile), { recursive: true });\n await writeFile(options.promptFile, options.prompt, \"utf8\");\n }\n\n const result = await (options.runner ?? spawnInteractiveProcess)({\n command: customProvider.binary,\n args,\n cwd: options.cwd,\n shell: false,\n stdio: \"inherit\",\n env: { ...definedProcessEnv(), ...customProvider.env },\n signal: options.signal,\n });\n\n return { ...result, promptInjectionMode };\n}\n\nfunction mapInteractiveProviderLaunchError(options: {\n readonly error: unknown;\n readonly provider: string;\n readonly command: string;\n}): unknown {\n if (options.error instanceof TrailStepFailureError) {\n return options.error;\n }\n\n const message = errorMessage(options.error);\n if (isSpawnEnoentError(options.error, options.command, message)) {\n return new TrailStepFailureError({\n code: \"agent_provider_spawn_error\",\n message: `Provider '${options.provider}' could not be opened because the '${options.command}' CLI was not found on PATH. Install the CLI or configure a different TrailStep agent target.`,\n details: { provider: options.provider, command: options.command, cause: message },\n });\n }\n\n return options.error;\n}\n\nfunction isSpawnEnoentError(error: unknown, command: string, message: string): boolean {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return true;\n }\n\n return new RegExp(\n `(?:spawn|ENOENT).*${escapeRegExp(command)}|${escapeRegExp(command)}.*ENOENT`,\n \"iu\",\n ).test(message);\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/gu, \"\\\\$&\");\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nfunction definedProcessEnv(): Record<string, string> {\n return Object.fromEntries(\n Object.entries(process.env).filter(\n (entry): entry is [string, string] => entry[1] !== undefined,\n ),\n );\n}\n\nconst spawnInteractiveProcess: InteractiveProcessRunner = async ({\n command,\n args,\n cwd,\n env,\n signal,\n}) => {\n const executable = await resolveCliCommandForSpawn({ command, args, env });\n\n return await new Promise((resolve, reject) => {\n const child = spawn(executable.command, executable.args, {\n cwd,\n env,\n signal,\n detached: process.platform !== \"win32\",\n shell: false,\n stdio: \"inherit\",\n });\n\n signal?.addEventListener(\"abort\", () => terminateChildProcessTree(child), { once: true });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => resolve({ exitCode: code ?? 1 }));\n });\n};\n\nfunction terminateChildProcessTree(child: ReturnType<typeof spawn>): void {\n if (!child.pid) {\n return;\n }\n\n if (process.platform === \"win32\") {\n spawn(\"taskkill\", [\"/PID\", String(child.pid), \"/T\", \"/F\"], { stdio: \"ignore\" }).on(\n \"error\",\n () => {\n child.kill();\n },\n );\n return;\n }\n\n try {\n process.kill(-child.pid, \"SIGTERM\");\n } catch {\n child.kill();\n }\n}\n","import { constants } from \"node:fs\";\nimport { access, readFile } from \"node:fs/promises\";\nimport { dirname, extname, join } from \"node:path\";\n\nconst WINDOWS_EXECUTABLE_EXTENSIONS = [\".cmd\", \".exe\", \".bat\", \"\"] as const;\n\nexport interface CliCommandSpawnRequest {\n readonly command: string;\n readonly args: readonly string[];\n readonly env?: Readonly<Record<string, string | undefined>>;\n}\n\nexport interface ResolvedCliCommandSpawnRequest {\n readonly command: string;\n readonly args: readonly string[];\n}\n\nexport interface ResolveCliCommandForSpawnOptions {\n readonly platform?: NodeJS.Platform;\n readonly execPath?: string;\n}\n\n/**\n * Built-in provider CLIs are commonly npm-installed. On Windows, npm exposes\n * those CLIs as `.cmd` shims, which cannot be launched through Node's\n * `spawn(..., { shell: false })` by their bare command name. Resolve npm shims\n * to their underlying Node entrypoint when possible so provider prompts remain\n * argv values instead of being reinterpreted by a shell.\n */\nexport async function resolveCliCommandForSpawn(\n request: CliCommandSpawnRequest,\n options: ResolveCliCommandForSpawnOptions = {},\n): Promise<ResolvedCliCommandSpawnRequest> {\n if ((options.platform ?? process.platform) !== \"win32\") {\n return request;\n }\n\n const commandPath = await findWindowsCommandPath(request.command, request.env ?? process.env);\n if (!commandPath) {\n return request;\n }\n\n if (isWindowsCommandShim(commandPath)) {\n const nodeScript = await readNpmCmdShimEntrypoint(commandPath);\n if (nodeScript) {\n return {\n command: options.execPath ?? process.execPath,\n args: [nodeScript, ...request.args],\n };\n }\n\n return {\n command: \"cmd.exe\",\n args: [\"/d\", \"/s\", \"/c\", commandPath, ...request.args],\n };\n }\n\n return { command: commandPath, args: request.args };\n}\n\nasync function findWindowsCommandPath(\n command: string,\n env: Readonly<Record<string, string | undefined>>,\n): Promise<string | undefined> {\n const commandCandidates = windowsCommandCandidates(command);\n if (hasPathSeparator(command)) {\n return await firstExistingPath(commandCandidates);\n }\n\n const pathValue = readCaseInsensitiveEnv(env, \"PATH\");\n if (!pathValue) {\n return await firstExistingPath(commandCandidates);\n }\n\n for (const directory of pathValue.split(windowsPathDelimiter()).filter(Boolean)) {\n const found = await firstExistingPath(\n commandCandidates.map((candidate) => join(directory, candidate)),\n );\n if (found) {\n return found;\n }\n }\n\n return undefined;\n}\n\nfunction windowsCommandCandidates(command: string): readonly string[] {\n if (extname(command)) {\n return [command];\n }\n\n return WINDOWS_EXECUTABLE_EXTENSIONS.map((extension) => `${command}${extension}`);\n}\n\nasync function firstExistingPath(paths: readonly string[]): Promise<string | undefined> {\n for (const path of paths) {\n try {\n await access(path, constants.X_OK);\n return path;\n } catch {\n try {\n await access(path, constants.F_OK);\n return path;\n } catch {\n // Keep looking.\n }\n }\n }\n\n return undefined;\n}\n\nasync function readNpmCmdShimEntrypoint(commandPath: string): Promise<string | undefined> {\n let shim: string;\n try {\n shim = await readFile(commandPath, \"utf8\");\n } catch {\n return undefined;\n }\n\n const match = shim.match(/\"%dp0%\\\\?([^\"]+?\\.js)\"\\s+%\\*/i);\n if (!match?.[1]) {\n return undefined;\n }\n\n return join(dirname(commandPath), match[1].replace(/\\\\/g, \"/\"));\n}\n\nfunction isWindowsCommandShim(path: string): boolean {\n const extension = extname(path).toLowerCase();\n return extension === \".cmd\" || extension === \".bat\";\n}\n\nfunction hasPathSeparator(command: string): boolean {\n return command.includes(\"/\") || command.includes(\"\\\\\");\n}\n\nfunction readCaseInsensitiveEnv(\n env: Readonly<Record<string, string | undefined>>,\n key: string,\n): string | undefined {\n return Object.entries(env).find(([name]) => name.toLowerCase() === key.toLowerCase())?.[1];\n}\n\nfunction windowsPathDelimiter(): string {\n return \";\";\n}\n","export interface Failure {\n readonly code: string;\n readonly message: string;\n readonly details?: unknown;\n}\n\nexport class TrailStepFailureError extends Error {\n readonly failure: Failure;\n\n constructor(failure: Failure) {\n super(failure.message);\n this.name = \"TrailStepFailureError\";\n this.failure = failure;\n }\n}\n\nexport function validationFailure(message: string, details?: unknown): Failure {\n return {\n code: \"validation_failed\",\n message,\n ...(details === undefined ? {} : { details }),\n };\n}\n","import type { WorkflowAgentThinking } from \"../../contracts/agents/agent-role.types.js\";\nimport { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\n\ntype PlaceholderName = \"prompt\" | \"promptFile\" | \"outputFile\" | \"model\" | \"thinking\";\ntype ConditionalName = \"model\" | \"thinking\";\n\ntype PlaceholderValues = Readonly<Partial<Record<PlaceholderName, string>>>;\n\nconst PLACEHOLDER_NAMES = new Set<PlaceholderName>([\n \"prompt\",\n \"promptFile\",\n \"outputFile\",\n \"model\",\n \"thinking\",\n]);\nconst CONDITIONAL_NAMES = new Set<ConditionalName>([\"model\", \"thinking\"]);\nconst TEMPLATE_TOKEN_PATTERN = /^{{([#/]?)([A-Za-z][A-Za-z0-9]*)}}$/;\n\nexport function renderCustomProviderArgs(options: {\n readonly argv: readonly string[];\n readonly values: {\n readonly prompt?: string;\n readonly promptFile?: string;\n readonly outputFile?: string;\n readonly model?: string;\n readonly thinking?: WorkflowAgentThinking;\n };\n readonly errorCode: string;\n readonly commandDescription: string;\n}): string[] {\n const values: PlaceholderValues = {\n ...(options.values.prompt === undefined ? {} : { prompt: options.values.prompt }),\n ...(options.values.promptFile === undefined ? {} : { promptFile: options.values.promptFile }),\n ...(options.values.outputFile === undefined ? {} : { outputFile: options.values.outputFile }),\n ...(optionalNonEmptyString(options.values.model) === undefined\n ? {}\n : { model: optionalNonEmptyString(options.values.model) }),\n ...(options.values.thinking === undefined ? {} : { thinking: options.values.thinking }),\n };\n\n return renderRange({\n argv: options.argv,\n values,\n errorCode: options.errorCode,\n commandDescription: options.commandDescription,\n });\n}\n\nfunction renderRange(options: {\n readonly argv: readonly string[];\n readonly values: PlaceholderValues;\n readonly errorCode: string;\n readonly commandDescription: string;\n}): string[] {\n const rendered: string[] = [];\n\n for (let index = 0; index < options.argv.length; index += 1) {\n const arg = options.argv[index] ?? \"\";\n const token = parseTemplateToken(arg);\n\n if (token?.kind === \"open\") {\n const closeIndex = findConditionalClose({\n argv: options.argv,\n openIndex: index,\n condition: token.name,\n errorCode: options.errorCode,\n commandDescription: options.commandDescription,\n });\n if (options.values[token.name] !== undefined) {\n rendered.push(\n ...renderRange({\n ...options,\n argv: options.argv.slice(index + 1, closeIndex),\n }),\n );\n }\n index = closeIndex;\n continue;\n }\n\n if (token?.kind === \"close\") {\n throw templateError({\n code: options.errorCode,\n message: `${options.commandDescription} template has unexpected ${closingToken(token.name)} without a matching ${openingToken(token.name)}.`,\n });\n }\n\n if (token?.kind === \"placeholder\") {\n rendered.push(renderPlaceholder({ ...options, name: token.name }));\n continue;\n }\n\n if (TEMPLATE_TOKEN_PATTERN.test(arg)) {\n throw templateError({\n code: options.errorCode,\n message: `${options.commandDescription} template token ${arg} is not supported.`,\n details: { arg },\n });\n }\n\n if (arg.includes(\"{{\") || arg.includes(\"}}\")) {\n rendered.push(renderInterpolatedArg({ ...options, arg }));\n continue;\n }\n\n rendered.push(arg);\n }\n\n return rendered;\n}\n\nfunction parseTemplateToken(\n arg: string,\n):\n | { readonly kind: \"placeholder\"; readonly name: PlaceholderName }\n | { readonly kind: \"open\"; readonly name: ConditionalName }\n | { readonly kind: \"close\"; readonly name: ConditionalName }\n | undefined {\n const match = TEMPLATE_TOKEN_PATTERN.exec(arg);\n if (!match) {\n return undefined;\n }\n\n const prefix = match[1] ?? \"\";\n const name = match[2] ?? \"\";\n\n if (prefix === \"\") {\n if (PLACEHOLDER_NAMES.has(name as PlaceholderName)) {\n return { kind: \"placeholder\", name: name as PlaceholderName };\n }\n return undefined;\n }\n\n if (CONDITIONAL_NAMES.has(name as ConditionalName)) {\n return {\n kind: prefix === \"#\" ? \"open\" : \"close\",\n name: name as ConditionalName,\n };\n }\n\n return undefined;\n}\n\nfunction renderInterpolatedArg(options: {\n readonly arg: string;\n readonly values: PlaceholderValues;\n readonly errorCode: string;\n readonly commandDescription: string;\n}): string {\n let foundTemplateToken = false;\n const rendered = options.arg.replaceAll(\n /\\{\\{([#/]?)([A-Za-z][A-Za-z0-9]*)\\}\\}/gu,\n (match: string, prefix: string, name: string) => {\n foundTemplateToken = true;\n\n if (prefix !== \"\") {\n throw templateError({\n code: options.errorCode,\n message: `${options.commandDescription} conditional blocks must be whole argv values.`,\n details: { arg: options.arg, token: match },\n });\n }\n\n if (!PLACEHOLDER_NAMES.has(name as PlaceholderName)) {\n throw templateError({\n code: options.errorCode,\n message: `${options.commandDescription} template token ${match} is not supported.`,\n details: { arg: options.arg },\n });\n }\n\n return renderPlaceholder({ ...options, name: name as PlaceholderName });\n },\n );\n\n if (!foundTemplateToken || rendered.includes(\"{{\") || rendered.includes(\"}}\")) {\n throw templateError({\n code: options.errorCode,\n message: `${options.commandDescription} has malformed template syntax.`,\n details: { arg: options.arg },\n });\n }\n\n return rendered;\n}\n\nfunction findConditionalClose(options: {\n readonly argv: readonly string[];\n readonly openIndex: number;\n readonly condition: ConditionalName;\n readonly errorCode: string;\n readonly commandDescription: string;\n}): number {\n let depth = 1;\n\n for (let index = options.openIndex + 1; index < options.argv.length; index += 1) {\n const token = parseTemplateToken(options.argv[index] ?? \"\");\n if (token?.name !== options.condition) {\n continue;\n }\n\n if (token.kind === \"open\") {\n depth += 1;\n continue;\n }\n\n if (token.kind === \"close\") {\n depth -= 1;\n if (depth === 0) {\n return index;\n }\n }\n }\n\n throw templateError({\n code: options.errorCode,\n message: `${options.commandDescription} template is missing ${closingToken(options.condition)} for ${openingToken(options.condition)}.`,\n });\n}\n\nfunction renderPlaceholder(options: {\n readonly name: PlaceholderName;\n readonly values: PlaceholderValues;\n readonly errorCode: string;\n readonly commandDescription: string;\n}): string {\n const value = options.values[options.name];\n if (value !== undefined) {\n return value;\n }\n\n if (options.name === \"model\" || options.name === \"thinking\") {\n throw templateError({\n code: options.errorCode,\n message: `${options.commandDescription} placeholder ${placeholderToken(options.name)} must be guarded with ${openingToken(options.name)} ... ${closingToken(options.name)} when no ${options.name} override is set.`,\n details: { placeholder: placeholderToken(options.name) },\n });\n }\n\n throw templateError({\n code: options.errorCode,\n message: `${options.commandDescription} placeholder ${placeholderToken(options.name)} is not available in this command template.`,\n details: { placeholder: placeholderToken(options.name) },\n });\n}\n\nfunction templateError(options: {\n readonly code: string;\n readonly message: string;\n readonly details?: unknown;\n}): TrailStepFailureError {\n return new TrailStepFailureError({\n code: options.code,\n message: options.message,\n ...(options.details === undefined ? {} : { details: options.details }),\n });\n}\n\nfunction placeholderToken(name: PlaceholderName): string {\n return `{{${name}}}`;\n}\n\nfunction openingToken(name: ConditionalName): string {\n return `{{#${name}}}`;\n}\n\nfunction closingToken(name: ConditionalName): string {\n return `{{/${name}}}`;\n}\n\nfunction optionalNonEmptyString(value: string | undefined): string | undefined {\n if (value === undefined || value.trim().length === 0) {\n return undefined;\n }\n\n return value;\n}\n","import { TrailStepFailureError, validationFailure } from \"../../contracts/failures/failure.js\";\n\nexport function throwValidationFailure(diagnostics: readonly string[]): never {\n throw new TrailStepFailureError(\n validationFailure(\"Invalid .trailstep/config.json.\", { diagnostics }),\n );\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function parseOptionalStringArray(\n path: string,\n value: unknown,\n diagnostics: string[],\n): readonly string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n diagnostics.push(`${path} must be an array of strings when present.`);\n return undefined;\n }\n\n return value;\n}\n\nexport function parseOptionalStringRecord(\n path: string,\n value: unknown,\n diagnostics: string[],\n): Readonly<Record<string, string>> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object when present.`);\n return undefined;\n }\n\n const env: Record<string, string> = {};\n for (const [key, envValue] of Object.entries(value)) {\n if (typeof envValue !== \"string\") {\n diagnostics.push(`${path}.${key} must be a string.`);\n } else {\n env[key] = envValue;\n }\n }\n\n return env;\n}\n","import {\n isRecord,\n parseOptionalStringArray,\n parseOptionalStringRecord,\n throwValidationFailure,\n} from \"../agent-targeting/parse-trailstep-config/parse-utils.js\";\nimport type { WorkflowAgentThinking } from \"../contracts/agents/agent-role.types.js\";\n\nexport interface TrailStepProviderRegistration {\n readonly source: TrailStepProviderSource;\n readonly manifest: TrailStepProviderManifest;\n}\n\nexport type TrailStepProviderSource =\n | { readonly type: \"local-manifest\"; readonly path: string }\n | { readonly type: \"legacy-custom-provider\" }\n | {\n readonly type: \"npm\" | \"github\" | \"local-package\";\n readonly packageName: string;\n readonly spec: string;\n readonly resolvedVersion?: string;\n };\n\n/**\n * ESM package contract for provider packages: export `trailstepProvider` from\n * the package root. Keep hook functions outside `manifest` so the manifest is\n * serializable and safe to persist.\n */\nexport interface TrailStepProviderPackageDefinition {\n readonly manifest: TrailStepProviderManifest;\n readonly hooks?: Record<string, unknown>;\n}\n\nexport interface TrailStepProviderManifest {\n readonly schemaVersion: 1;\n readonly id: string;\n readonly displayName: string;\n readonly working: TrailStepProviderWorkingManifest;\n readonly interactive: TrailStepProviderInteractiveManifest;\n readonly model: TrailStepProviderModelManifest;\n readonly thinking: TrailStepProviderThinkingManifest;\n readonly env?: TrailStepProviderEnvironmentManifest;\n readonly hooks?: Record<string, unknown>;\n}\n\nexport type TrailStepProviderPromptFileReferenceStyle = \"at-prefixed-argument\";\n\nexport interface TrailStepProviderPromptManifest {\n readonly kind: \"prompt-file\";\n readonly reference?: TrailStepProviderPromptFileReferenceStyle;\n}\n\nexport type TrailStepProviderOutputStyle =\n | \"provider-output-file\"\n | \"stdout-json-envelope\"\n | \"stdout-jsonl-transcript\";\n\nexport interface TrailStepProviderOutputParsingManifest {\n readonly resultField?: string;\n}\n\nexport interface TrailStepProviderOutputManifest {\n readonly style: TrailStepProviderOutputStyle;\n readonly parsing?: TrailStepProviderOutputParsingManifest;\n}\n\nexport interface TrailStepProviderWorkingManifest {\n readonly supported: boolean;\n readonly command?: string;\n readonly args?: readonly string[];\n readonly prompt?: TrailStepProviderPromptManifest;\n readonly output?: TrailStepProviderOutputManifest;\n}\n\nexport interface TrailStepProviderInteractiveManifest {\n readonly supported: boolean;\n readonly reason?: string;\n readonly command?: string;\n readonly args?: readonly string[];\n readonly requiresSystemPromptFile?: boolean;\n readonly systemPromptFileFlag?: string;\n readonly modelFlag?: string;\n readonly permissionBypassFlag?: string;\n}\n\nexport interface TrailStepProviderEnvironmentManifest {\n readonly required?: readonly string[];\n readonly optional?: readonly string[];\n}\n\nexport interface TrailStepProviderModelDiscoveryManifest {\n readonly command: string;\n readonly args: readonly string[];\n readonly outputParser: string;\n}\n\nexport interface TrailStepProviderModelManifest {\n readonly supported: boolean;\n readonly reason?: string;\n readonly flag?: string;\n readonly discovery?: TrailStepProviderModelDiscoveryManifest;\n}\n\nexport interface TrailStepProviderThinkingManifest {\n readonly supported: boolean;\n readonly reason?: string;\n readonly flag?: string;\n readonly levels?: readonly WorkflowAgentThinking[];\n}\n\nconst THINKING_LEVELS = new Set<WorkflowAgentThinking>([\"low\", \"medium\", \"high\", \"xhigh\", \"max\"]);\n\nexport function parseTrailStepProviderManifest(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderManifest | undefined {\n return parseManifest(path, value, diagnostics);\n}\n\nexport function parseTrailStepProviderRegistrations(\n path: string,\n value: unknown,\n diagnostics: string[],\n): Record<string, TrailStepProviderRegistration> {\n const start = diagnostics.length;\n const providers: Record<string, TrailStepProviderRegistration> = {};\n\n if (value === undefined) {\n return providers;\n }\n\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object when present.`);\n throwIfNewDiagnostics(diagnostics, start);\n return providers;\n }\n\n for (const [name, registration] of Object.entries(value)) {\n const parsed = parseProviderRegistration(`${path}.${name}`, registration, diagnostics);\n if (parsed !== undefined) {\n providers[name] = parsed;\n }\n }\n\n throwIfNewDiagnostics(diagnostics, start);\n return providers;\n}\n\nfunction parseProviderRegistration(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderRegistration | undefined {\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object.`);\n return undefined;\n }\n\n const source = parseSource(`${path}.source`, value.source, diagnostics);\n const manifest =\n source?.type === \"legacy-custom-provider\"\n ? parseLegacyCustomProviderManifest(`${path}.manifest`, value.manifest, diagnostics)\n : parseManifest(`${path}.manifest`, value.manifest, diagnostics);\n\n if (source === undefined || manifest === undefined) {\n return undefined;\n }\n\n return { source, manifest };\n}\n\nfunction parseSource(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderRegistration[\"source\"] | undefined {\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object.`);\n return undefined;\n }\n\n if (value.type === \"local-manifest\") {\n if (typeof value.path !== \"string\" || value.path.length === 0) {\n diagnostics.push(`${path}.path must be a non-empty string.`);\n return undefined;\n }\n return { type: \"local-manifest\", path: value.path };\n }\n\n if (value.type === \"legacy-custom-provider\") {\n return { type: \"legacy-custom-provider\" };\n }\n\n if (value.type === \"npm\" || value.type === \"github\" || value.type === \"local-package\") {\n if (typeof value.packageName !== \"string\" || value.packageName.length === 0) {\n diagnostics.push(`${path}.packageName must be a non-empty string.`);\n }\n if (typeof value.spec !== \"string\" || value.spec.length === 0) {\n diagnostics.push(`${path}.spec must be a non-empty string.`);\n }\n if (\n typeof value.packageName !== \"string\" ||\n value.packageName.length === 0 ||\n typeof value.spec !== \"string\" ||\n value.spec.length === 0\n ) {\n return undefined;\n }\n return {\n type: value.type,\n packageName: value.packageName,\n spec: value.spec,\n ...(typeof value.resolvedVersion === \"string\" && value.resolvedVersion.length > 0\n ? { resolvedVersion: value.resolvedVersion }\n : {}),\n };\n }\n\n diagnostics.push(\n `${path}.type must be local-manifest, legacy-custom-provider, npm, github, or local-package.`,\n );\n return undefined;\n}\n\nfunction parseLegacyCustomProviderManifest(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderManifest | undefined {\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object.`);\n return undefined;\n }\n\n if (value.schemaVersion !== 1) {\n diagnostics.push(`${path}.schemaVersion must be 1.`);\n }\n const id = parseRequiredString(`${path}.id`, value.id, diagnostics);\n const displayName = parseRequiredString(`${path}.displayName`, value.displayName, diagnostics);\n const working = parseWorking(`${path}.working`, value.working, diagnostics);\n const interactive = parseLegacyInteractive(`${path}.interactive`, value.interactive, diagnostics);\n const model = parseLegacyModel(`${path}.model`, value.model, diagnostics);\n const thinking = parseLegacyThinking(`${path}.thinking`, value.thinking, diagnostics);\n const env = parseOptionalStringRecord(`${path}.env`, value.env, diagnostics);\n\n if (\n value.schemaVersion !== 1 ||\n id === undefined ||\n displayName === undefined ||\n working === undefined ||\n interactive === undefined ||\n model === undefined ||\n thinking === undefined\n ) {\n return undefined;\n }\n\n return {\n schemaVersion: 1,\n id,\n displayName,\n working,\n interactive,\n model,\n thinking,\n ...(typeof value.cwd === \"string\" ? { cwd: value.cwd } : {}),\n ...(env === undefined ? {} : { env }),\n } as TrailStepProviderManifest;\n}\n\nfunction parseManifest(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderManifest | undefined {\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object.`);\n return undefined;\n }\n\n if (value.schemaVersion !== 1) {\n diagnostics.push(`${path}.schemaVersion must be 1.`);\n }\n const id = parseRequiredString(`${path}.id`, value.id, diagnostics);\n const displayName = parseRequiredString(`${path}.displayName`, value.displayName, diagnostics);\n const working = parseWorking(`${path}.working`, value.working, diagnostics);\n const interactive = parseInteractive(`${path}.interactive`, value.interactive, diagnostics);\n const model = parseModel(`${path}.model`, value.model, diagnostics);\n const thinking = parseThinking(`${path}.thinking`, value.thinking, diagnostics);\n const env = parseEnvironment(`${path}.env`, value.env, diagnostics);\n\n if (\n value.schemaVersion !== 1 ||\n id === undefined ||\n displayName === undefined ||\n working === undefined ||\n interactive === undefined ||\n model === undefined ||\n thinking === undefined ||\n env === null\n ) {\n return undefined;\n }\n\n return {\n schemaVersion: 1,\n id,\n displayName,\n working,\n interactive,\n model,\n thinking,\n ...(env === undefined ? {} : { env }),\n ...(isRecord(value.hooks) ? { hooks: value.hooks } : {}),\n };\n}\n\nfunction parseWorking(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderWorkingManifest | undefined {\n if (!isRecord(value) || typeof value.supported !== \"boolean\") {\n diagnostics.push(`${path} must be an object with a boolean supported field.`);\n return undefined;\n }\n\n if (!value.supported) {\n return { supported: false };\n }\n\n const command = parseRequiredString(`${path}.command`, value.command, diagnostics);\n const args = parseOptionalStringArray(`${path}.args`, value.args, diagnostics);\n const prompt = parsePrompt(`${path}.prompt`, value.prompt, diagnostics);\n const output = parseOutput(`${path}.output`, value.output, diagnostics);\n\n if (command === undefined || prompt === undefined || output === undefined) {\n return undefined;\n }\n\n return { supported: true, command, ...(args === undefined ? {} : { args }), prompt, output };\n}\n\nfunction parseLegacyInteractive(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderManifest[\"interactive\"] | undefined {\n const parsed = parseSupportedObject(path, value, diagnostics);\n if (parsed === undefined || !isRecord(value)) {\n return undefined;\n }\n const command = parseOptionalNonEmptyString(`${path}.command`, value.command, diagnostics);\n const args = parseOptionalStringArray(`${path}.args`, value.args, diagnostics);\n if (command === null) {\n return undefined;\n }\n return {\n ...parsed,\n ...(command === undefined ? {} : { command }),\n ...(args === undefined ? {} : { args }),\n } as TrailStepProviderManifest[\"interactive\"];\n}\n\nfunction parseInteractive(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderInteractiveManifest | undefined {\n const parsed = parseSupportedObject(path, value, diagnostics);\n if (parsed === undefined || !isRecord(value)) {\n return undefined;\n }\n const command = parseOptionalNonEmptyString(`${path}.command`, value.command, diagnostics);\n const args = parseOptionalStringArray(`${path}.args`, value.args, diagnostics);\n const systemPromptFileFlag = parseOptionalNonEmptyString(\n `${path}.systemPromptFileFlag`,\n value.systemPromptFileFlag,\n diagnostics,\n );\n const modelFlag = parseOptionalNonEmptyString(`${path}.modelFlag`, value.modelFlag, diagnostics);\n const permissionBypassFlag = parseOptionalNonEmptyString(\n `${path}.permissionBypassFlag`,\n value.permissionBypassFlag,\n diagnostics,\n );\n if (\n command === null ||\n systemPromptFileFlag === null ||\n modelFlag === null ||\n permissionBypassFlag === null\n ) {\n return undefined;\n }\n return {\n ...parsed,\n ...(command === undefined ? {} : { command }),\n ...(args === undefined ? {} : { args }),\n ...(typeof value.requiresSystemPromptFile === \"boolean\"\n ? { requiresSystemPromptFile: value.requiresSystemPromptFile }\n : {}),\n ...(systemPromptFileFlag === undefined ? {} : { systemPromptFileFlag }),\n ...(modelFlag === undefined ? {} : { modelFlag }),\n ...(permissionBypassFlag === undefined ? {} : { permissionBypassFlag }),\n };\n}\n\nfunction parseSupportedObject(\n path: string,\n value: unknown,\n diagnostics: string[],\n): { readonly supported: boolean; readonly reason?: string } | undefined {\n if (!isRecord(value) || typeof value.supported !== \"boolean\") {\n diagnostics.push(`${path} must be an object with a boolean supported field.`);\n return undefined;\n }\n return {\n supported: value.supported,\n ...(typeof value.reason === \"string\" ? { reason: value.reason } : {}),\n };\n}\n\nfunction parseEnvironment(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderEnvironmentManifest | undefined | null {\n if (value === undefined) {\n return undefined;\n }\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object when present.`);\n return null;\n }\n const start = diagnostics.length;\n const required = parseOptionalStringArray(`${path}.required`, value.required, diagnostics);\n const optional = parseOptionalStringArray(`${path}.optional`, value.optional, diagnostics);\n if (diagnostics.length > start) {\n return null;\n }\n return {\n ...(required === undefined ? {} : { required }),\n ...(optional === undefined ? {} : { optional }),\n };\n}\n\nfunction parseLegacyModel(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderManifest[\"model\"] | undefined {\n const parsed = parseSupportedObject(path, value, diagnostics);\n if (parsed === undefined || !isRecord(value)) {\n return undefined;\n }\n const flag = parseOptionalNonEmptyString(`${path}.flag`, value.flag, diagnostics);\n if (flag === null) {\n return undefined;\n }\n return {\n ...parsed,\n ...(flag === undefined ? {} : { flag }),\n } as TrailStepProviderManifest[\"model\"];\n}\n\nfunction parseLegacyThinking(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderManifest[\"thinking\"] | undefined {\n if (!isRecord(value) || typeof value.supported !== \"boolean\") {\n diagnostics.push(`${path} must be an object with a boolean supported field.`);\n return undefined;\n }\n\n const flag = parseOptionalNonEmptyString(`${path}.flag`, value.flag, diagnostics);\n if (flag === null) {\n return undefined;\n }\n\n if (value.levels !== undefined) {\n if (\n !Array.isArray(value.levels) ||\n value.levels.some(\n (level) =>\n typeof level !== \"string\" || !THINKING_LEVELS.has(level as WorkflowAgentThinking),\n )\n ) {\n diagnostics.push(\n `${path}.levels must be an array of supported thinking levels when present.`,\n );\n return undefined;\n }\n return {\n supported: value.supported,\n ...(flag === undefined ? {} : { flag }),\n levels: value.levels as WorkflowAgentThinking[],\n } as TrailStepProviderManifest[\"thinking\"];\n }\n\n return {\n supported: value.supported,\n ...(flag === undefined ? {} : { flag }),\n } as TrailStepProviderManifest[\"thinking\"];\n}\n\nfunction parseModel(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderModelManifest | undefined {\n const parsed = parseSupportedObject(path, value, diagnostics);\n if (parsed === undefined || !isRecord(value)) {\n return undefined;\n }\n const flag = parseOptionalNonEmptyString(`${path}.flag`, value.flag, diagnostics);\n const discovery = parseModelDiscovery(`${path}.discovery`, value.discovery, diagnostics);\n if (flag === null || discovery === null) {\n return undefined;\n }\n return {\n ...parsed,\n ...(flag === undefined ? {} : { flag }),\n ...(discovery === undefined ? {} : { discovery }),\n };\n}\n\nfunction parseModelDiscovery(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderModelDiscoveryManifest | undefined | null {\n if (value === undefined) {\n return undefined;\n }\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object when present.`);\n return null;\n }\n const command = parseRequiredString(`${path}.command`, value.command, diagnostics);\n const args = parseRequiredStringArray(`${path}.args`, value.args, diagnostics);\n const outputParser = parseRequiredString(`${path}.outputParser`, value.outputParser, diagnostics);\n if (command === undefined || args === undefined || outputParser === undefined) {\n return null;\n }\n return { command, args, outputParser };\n}\n\nfunction parseThinking(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderThinkingManifest | undefined {\n const parsed = parseSupportedObject(path, value, diagnostics);\n if (parsed === undefined || !isRecord(value)) {\n return undefined;\n }\n\n const flag = parseOptionalNonEmptyString(`${path}.flag`, value.flag, diagnostics);\n if (flag === null) {\n return undefined;\n }\n\n if (value.levels !== undefined) {\n if (\n !Array.isArray(value.levels) ||\n value.levels.some(\n (level) =>\n typeof level !== \"string\" || !THINKING_LEVELS.has(level as WorkflowAgentThinking),\n )\n ) {\n diagnostics.push(\n `${path}.levels must be an array of supported thinking levels when present.`,\n );\n return undefined;\n }\n return {\n ...parsed,\n ...(flag === undefined ? {} : { flag }),\n levels: value.levels as WorkflowAgentThinking[],\n };\n }\n\n return { ...parsed, ...(flag === undefined ? {} : { flag }) };\n}\n\nfunction parsePrompt(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderPromptManifest | undefined {\n if (!isRecord(value) || value.kind !== \"prompt-file\") {\n diagnostics.push(`${path}.kind must be prompt-file.`);\n return undefined;\n }\n if (value.reference !== undefined && value.reference !== \"at-prefixed-argument\") {\n diagnostics.push(`${path}.reference must be at-prefixed-argument when present.`);\n return undefined;\n }\n return {\n kind: \"prompt-file\",\n ...(value.reference === undefined ? {} : { reference: value.reference }),\n };\n}\n\nfunction parseOutput(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderOutputManifest | undefined {\n if (!isRecord(value) || !isProviderOutputStyle(value.style)) {\n diagnostics.push(\n `${path}.style must be provider-output-file, stdout-json-envelope, or stdout-jsonl-transcript.`,\n );\n return undefined;\n }\n const parsing = parseOutputParsing(`${path}.parsing`, value.parsing, diagnostics);\n if (parsing === null) {\n return undefined;\n }\n return {\n style: value.style,\n ...(parsing === undefined ? {} : { parsing }),\n };\n}\n\nfunction parseOutputParsing(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderOutputParsingManifest | undefined | null {\n if (value === undefined) {\n return undefined;\n }\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object when present.`);\n return null;\n }\n const resultField = parseOptionalNonEmptyString(\n `${path}.resultField`,\n value.resultField,\n diagnostics,\n );\n if (resultField === null) {\n return null;\n }\n return {\n ...(resultField === undefined ? {} : { resultField }),\n };\n}\n\nfunction isProviderOutputStyle(value: unknown): value is TrailStepProviderOutputStyle {\n return (\n value === \"provider-output-file\" ||\n value === \"stdout-json-envelope\" ||\n value === \"stdout-jsonl-transcript\"\n );\n}\n\nfunction parseRequiredString(\n path: string,\n value: unknown,\n diagnostics: string[],\n): string | undefined {\n if (typeof value !== \"string\" || value.length === 0) {\n diagnostics.push(`${path} must be a non-empty string.`);\n return undefined;\n }\n return value;\n}\n\nfunction parseRequiredStringArray(\n path: string,\n value: unknown,\n diagnostics: string[],\n): readonly string[] | undefined {\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n diagnostics.push(`${path} must be an array of strings.`);\n return undefined;\n }\n return value;\n}\n\nfunction parseOptionalNonEmptyString(\n path: string,\n value: unknown,\n diagnostics: string[],\n): string | undefined | null {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"string\" || value.length === 0) {\n diagnostics.push(`${path} must be a non-empty string when present.`);\n return null;\n }\n return value;\n}\n\nfunction throwIfNewDiagnostics(diagnostics: string[], start: number): void {\n if (diagnostics.length > start) {\n throwValidationFailure(diagnostics);\n }\n}\n","import { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type {\n TrailStepAgentMappings,\n TrailStepAgentTarget,\n TrailStepSettings,\n} from \"../targeting.types.js\";\nimport type { RawTrailStepAgentMappings, RawTrailStepAgentTarget } from \"./parse-agent-targets.js\";\n\nexport function expandAgentRefs(options: {\n readonly agents: RawTrailStepAgentMappings;\n readonly workflows:\n | Readonly<\n Record<\n string,\n {\n readonly agents?: RawTrailStepAgentMappings;\n readonly settings?: TrailStepSettings;\n }\n >\n >\n | undefined;\n}): {\n readonly agents: TrailStepAgentMappings;\n readonly workflows:\n | Readonly<\n Record<\n string,\n {\n readonly agents?: TrailStepAgentMappings;\n readonly settings?: TrailStepSettings;\n }\n >\n >\n | undefined;\n} {\n const expandedAgents: Record<string, readonly TrailStepAgentTarget[]> = {};\n const memo = new Map<string, readonly TrailStepAgentTarget[]>();\n\n for (const name of Object.keys(options.agents)) {\n expandedAgents[name] = expandTopLevelAgent({\n name,\n agents: options.agents,\n memo,\n stack: [],\n rootRefPath: undefined,\n });\n }\n\n const expandedWorkflows =\n options.workflows === undefined\n ? undefined\n : Object.fromEntries(\n Object.entries(options.workflows).map(([workflowId, workflow]) => {\n const workflowAgents =\n workflow.agents === undefined\n ? undefined\n : Object.fromEntries(\n Object.entries(workflow.agents).map(([roleName, targets]) => [\n roleName,\n expandTargetArray({\n path: `workflows.${workflowId}.agents.${roleName}`,\n targets,\n agents: options.agents,\n memo,\n stack: [],\n rootRefPath: undefined,\n }),\n ]),\n );\n\n return [\n workflowId,\n {\n ...(workflowAgents === undefined ? {} : { agents: workflowAgents }),\n ...(workflow.settings === undefined ? {} : { settings: workflow.settings }),\n },\n ];\n }),\n );\n\n return { agents: expandedAgents, workflows: expandedWorkflows };\n}\n\nfunction expandTopLevelAgent(options: {\n readonly name: string;\n readonly agents: RawTrailStepAgentMappings;\n readonly memo: Map<string, readonly TrailStepAgentTarget[]>;\n readonly stack: readonly string[];\n readonly rootRefPath: string | undefined;\n}): readonly TrailStepAgentTarget[] {\n const memoized = options.memo.get(options.name);\n if (memoized !== undefined) {\n return memoized;\n }\n\n const targets = options.agents[options.name];\n if (targets === undefined) {\n throwUnknownRef(`agents.${options.name}`, options.name);\n }\n\n const expanded = expandTargetArray({\n path: `agents.${options.name}`,\n targets,\n agents: options.agents,\n memo: options.memo,\n stack: [...options.stack, options.name],\n rootRefPath: options.rootRefPath,\n });\n options.memo.set(options.name, expanded);\n return expanded;\n}\n\nfunction expandTargetArray(options: {\n readonly path: string;\n readonly targets: readonly RawTrailStepAgentTarget[];\n readonly agents: RawTrailStepAgentMappings;\n readonly memo: Map<string, readonly TrailStepAgentTarget[]>;\n readonly stack: readonly string[];\n readonly rootRefPath: string | undefined;\n}): readonly TrailStepAgentTarget[] {\n return options.targets.flatMap((target, index) => {\n if (\"provider\" in target) {\n return [target];\n }\n\n const refPath = `${options.path}[${index}].ref`;\n const referencedTargets = options.agents[target.ref];\n if (referencedTargets === undefined) {\n throwUnknownRef(refPath, target.ref);\n }\n\n const existingRefIndex = options.stack.indexOf(target.ref);\n if (existingRefIndex !== -1) {\n throwCycle(options.rootRefPath ?? refPath, [\n ...options.stack.slice(existingRefIndex),\n target.ref,\n ]);\n }\n\n const memoized = options.memo.get(target.ref);\n if (memoized !== undefined) {\n return memoized;\n }\n\n const expanded = expandTargetArray({\n path: `agents.${target.ref}`,\n targets: referencedTargets,\n agents: options.agents,\n memo: options.memo,\n stack: [...options.stack, target.ref],\n rootRefPath: options.rootRefPath ?? refPath,\n });\n options.memo.set(target.ref, expanded);\n return expanded;\n });\n}\n\nfunction throwUnknownRef(path: string, ref: string): never {\n throw new TrailStepFailureError({\n code: \"agent_ref_unknown\",\n message: \"One or more agent refs reference an unknown top-level agent.\",\n details: { diagnostics: [`${path} references unknown agent '${ref}'.`] },\n });\n}\n\nfunction throwCycle(path: string, cycle: readonly string[]): never {\n throw new TrailStepFailureError({\n code: \"agent_ref_cycle\",\n message: \"One or more agent refs create a cycle.\",\n details: { diagnostics: [`${path} creates an agent ref cycle: ${cycle.join(\" -> \")}.`] },\n });\n}\n","import type {\n WorkflowAgentSize,\n WorkflowAgentThinking,\n} from \"../../contracts/agents/agent-role.types.js\";\nimport type { TrailStepAgentTarget } from \"../targeting.types.js\";\nimport { isRecord, parseOptionalStringArray } from \"./parse-utils.js\";\n\nexport interface RawTrailStepAgentRef {\n readonly ref: string;\n}\n\nexport type RawTrailStepAgentTarget = TrailStepAgentTarget | RawTrailStepAgentRef;\nexport type RawTrailStepAgentMappings = Readonly<\n Record<string, readonly RawTrailStepAgentTarget[]>\n>;\n\nexport const AGENT_SIZES = new Set<WorkflowAgentSize>([\n \"default\",\n \"tiny\",\n \"small\",\n \"medium\",\n \"large\",\n \"xl\",\n]);\n\nconst THINKING_LEVELS = new Set<WorkflowAgentThinking>([\"low\", \"medium\", \"high\", \"xhigh\", \"max\"]);\n\nexport function parseTargetArray(\n path: string,\n value: unknown,\n diagnostics: string[],\n): readonly RawTrailStepAgentTarget[] {\n if (!Array.isArray(value)) {\n diagnostics.push(`${path} must be an array.`);\n return [];\n }\n\n return value.flatMap((target, index): readonly RawTrailStepAgentTarget[] => {\n const targetPath = `${path}[${index}]`;\n\n if (!isRecord(target)) {\n diagnostics.push(`${targetPath} must be an object.`);\n return [];\n }\n\n if (target.ref !== undefined) {\n if (typeof target.ref !== \"string\" || target.ref.length === 0) {\n diagnostics.push(`${targetPath}.ref must be a non-empty string when present.`);\n return [];\n }\n\n return [{ ref: target.ref }];\n }\n\n if (typeof target.provider !== \"string\" || target.provider.length === 0) {\n diagnostics.push(`${targetPath}.provider must be a non-empty string.`);\n return [];\n }\n\n if (target.model !== undefined && typeof target.model !== \"string\") {\n diagnostics.push(`${targetPath}.model must be a string when present.`);\n }\n\n if (\n target.thinking !== undefined &&\n !THINKING_LEVELS.has(target.thinking as WorkflowAgentThinking)\n ) {\n diagnostics.push(\n `${targetPath}.thinking must be one of low, medium, high, xhigh, or max when present.`,\n );\n }\n\n const model =\n typeof target.model === \"string\" ? optionalNonEmptyString(target.model) : undefined;\n const args = parseOptionalStringArray(`${targetPath}.args`, target.args, diagnostics);\n\n return [\n {\n provider: target.provider,\n ...(model === undefined ? {} : { model }),\n ...(typeof target.thinking === \"string\" &&\n THINKING_LEVELS.has(target.thinking as WorkflowAgentThinking)\n ? { thinking: target.thinking as WorkflowAgentThinking }\n : {}),\n ...(args === undefined ? {} : { args }),\n },\n ];\n });\n}\n\nfunction optionalNonEmptyString(value: string): string | undefined {\n return value.trim().length === 0 ? undefined : value;\n}\n","import {\n parseTargetArray,\n type RawTrailStepAgentMappings,\n type RawTrailStepAgentTarget,\n} from \"./parse-agent-targets.js\";\nimport { isRecord } from \"./parse-utils.js\";\n\nexport function parseAgentMappings(\n path: string,\n value: unknown,\n diagnostics: string[],\n): RawTrailStepAgentMappings {\n const mappings: Record<string, readonly RawTrailStepAgentTarget[]> = {};\n\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object.`);\n return mappings;\n }\n\n for (const [name, entry] of Object.entries(value)) {\n mappings[name] = parseTargetArray(`${path}.${name}`, entry, diagnostics);\n }\n\n return mappings;\n}\n","import type { WorkflowAgentThinking } from \"../../contracts/agents/agent-role.types.js\";\nimport type {\n TrailStepCustomProviderConfig,\n TrailStepCustomProviderModelOverrideSupport,\n TrailStepCustomProviderThinkingOverrideSupport,\n} from \"../targeting.types.js\";\nimport { isRecord, parseOptionalStringArray, parseOptionalStringRecord } from \"./parse-utils.js\";\n\nconst THINKING_LEVELS = new Set<WorkflowAgentThinking>([\"low\", \"medium\", \"high\", \"xhigh\", \"max\"]);\n\nexport function parseCustomProviders(\n value: unknown,\n diagnostics: string[],\n): Record<string, TrailStepCustomProviderConfig> {\n const customProviders: Record<string, TrailStepCustomProviderConfig> = {};\n\n if (value === undefined) {\n return customProviders;\n }\n\n if (!isRecord(value)) {\n diagnostics.push(\"customProviders must be an object.\");\n return customProviders;\n }\n\n for (const [name, providerConfig] of Object.entries(value)) {\n if (!isRecord(providerConfig)) {\n diagnostics.push(`customProviders.${name} must be an object.`);\n continue;\n }\n\n if (typeof providerConfig.binary !== \"string\" || providerConfig.binary.length === 0) {\n diagnostics.push(`customProviders.${name}.binary must be a non-empty string.`);\n continue;\n }\n\n const args = parseOptionalStringArray(\n `customProviders.${name}.args`,\n providerConfig.args,\n diagnostics,\n );\n const interactiveArgs = parseOptionalStringArray(\n `customProviders.${name}.interactiveArgs`,\n providerConfig.interactiveArgs,\n diagnostics,\n );\n const model = parseCustomProviderModelSupport(\n `customProviders.${name}.model`,\n providerConfig.model,\n diagnostics,\n );\n const thinking = parseCustomProviderThinkingSupport(\n `customProviders.${name}.thinking`,\n providerConfig.thinking,\n diagnostics,\n );\n const env = parseOptionalStringRecord(\n `customProviders.${name}.env`,\n providerConfig.env,\n diagnostics,\n );\n\n if (providerConfig.cwd !== undefined && typeof providerConfig.cwd !== \"string\") {\n diagnostics.push(`customProviders.${name}.cwd must be a string when present.`);\n }\n\n customProviders[name] = {\n binary: providerConfig.binary,\n ...(args === undefined ? {} : { args }),\n ...(interactiveArgs === undefined ? {} : { interactiveArgs }),\n ...(model === undefined ? {} : { model }),\n ...(thinking === undefined ? {} : { thinking }),\n ...(typeof providerConfig.cwd === \"string\" ? { cwd: providerConfig.cwd } : {}),\n ...(env === undefined ? {} : { env }),\n };\n }\n\n return customProviders;\n}\n\nfunction parseCustomProviderModelSupport(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepCustomProviderModelOverrideSupport | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value) || typeof value.supported !== \"boolean\") {\n diagnostics.push(`${path} must be an object with a boolean supported field when present.`);\n return undefined;\n }\n\n if (!value.supported) {\n return { supported: false };\n }\n\n if (value.flag !== undefined && (typeof value.flag !== \"string\" || value.flag.length === 0)) {\n diagnostics.push(`${path}.flag must be a non-empty string when present.`);\n return undefined;\n }\n\n return {\n supported: true,\n ...(typeof value.flag === \"string\" ? { flag: value.flag } : {}),\n };\n}\n\nfunction parseCustomProviderThinkingSupport(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepCustomProviderThinkingOverrideSupport | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value) || typeof value.supported !== \"boolean\") {\n diagnostics.push(`${path} must be an object with a boolean supported field when present.`);\n return undefined;\n }\n\n if (!value.supported) {\n if (value.levels !== undefined && (!Array.isArray(value.levels) || value.levels.length > 0)) {\n diagnostics.push(`${path}.levels must be an empty array when thinking support is disabled.`);\n return undefined;\n }\n\n return value.levels === undefined ? { supported: false } : { supported: false, levels: [] };\n }\n\n if (value.flag !== undefined && (typeof value.flag !== \"string\" || value.flag.length === 0)) {\n diagnostics.push(`${path}.flag must be a non-empty string when present.`);\n return undefined;\n }\n\n if (!Array.isArray(value.levels) || value.levels.length === 0) {\n diagnostics.push(`${path}.levels must be a non-empty array of supported thinking levels.`);\n return undefined;\n }\n\n const levels: WorkflowAgentThinking[] = [];\n for (const [index, level] of value.levels.entries()) {\n if (typeof level !== \"string\" || !THINKING_LEVELS.has(level as WorkflowAgentThinking)) {\n diagnostics.push(`${path}.levels[${index}] must be one of low, medium, high, xhigh, or max.`);\n continue;\n }\n levels.push(level as WorkflowAgentThinking);\n }\n\n if (levels.length !== value.levels.length) {\n return undefined;\n }\n\n return {\n supported: true,\n ...(typeof value.flag === \"string\" ? { flag: value.flag } : {}),\n levels,\n };\n}\n","import type { RetryPolicyInput } from \"../../runtime/retry/retry-policy.js\";\nimport type { TrailStepSettings } from \"../targeting.types.js\";\nimport { isRecord } from \"./parse-utils.js\";\n\nexport function parseSettings(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepSettings | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object when present.`);\n return undefined;\n }\n\n const settings: Record<string, unknown> = { ...value };\n\n if (value.retry !== undefined) {\n if (!isRecord(value.retry)) {\n diagnostics.push(`${path}.retry must be an object when present.`);\n delete settings.retry;\n } else if (value.retry.maxAttempts === undefined) {\n delete settings.retry;\n } else {\n settings.retry = { maxAttempts: value.retry.maxAttempts } satisfies RetryPolicyInput;\n }\n }\n\n if (value.timeout !== undefined && typeof value.timeout !== \"number\") {\n diagnostics.push(`${path}.timeout must be a number when present.`);\n delete settings.timeout;\n }\n\n return settings;\n}\n","import { createReadStream, type Dirent } from \"node:fs\";\nimport { mkdir, readdir, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join, relative } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { gunzip, gzip } from \"node:zlib\";\nimport { defaultRunsRoot } from \"../artifacts/run-storage.js\";\nimport { listRunSummaries, type RunSummary } from \"../runs/run-summaries.js\";\n\nconst gzipAsync = promisify(gzip);\nconst gunzipAsync = promisify(gunzip);\n\nexport interface StorageLifecyclePolicy {\n readonly enabled?: boolean;\n readonly archiveAfterDays?: number | false;\n readonly deleteAfterDays?: number | false;\n readonly workflows?: Readonly<\n Record<\n string,\n { readonly archiveAfterDays?: number | false; readonly deleteAfterDays?: number | false }\n >\n >;\n}\n\nexport interface StorageLifecycleAction {\n readonly action: \"archive\" | \"delete-hot\" | \"delete-archive\";\n readonly runId: string;\n readonly reason: string;\n readonly path: string;\n}\n\nexport interface StorageLifecycleStatus {\n readonly runsRoot: string;\n readonly enabled: boolean;\n readonly hotRuns: number;\n readonly archivedRuns: number;\n readonly pinnedRuns: readonly string[];\n}\n\ninterface ArchiveManifest {\n readonly schemaVersion: 1;\n readonly runId: string;\n readonly archivedAt: string;\n readonly sourceRunDir: string;\n readonly workflowId?: string;\n readonly lastTimestamp?: string;\n readonly status?: string;\n readonly pinned?: boolean;\n}\n\ninterface ArchivePayload {\n readonly manifest: ArchiveManifest;\n readonly files: readonly { readonly path: string; readonly contentBase64: string }[];\n}\n\nconst TERMINAL_STATUSES = new Set([\"completed\", \"failed\", \"cancelled\"]);\n\nexport function storageArchiveDir(runsRoot: string): string {\n return join(runsRoot, \".archive\");\n}\n\nexport function storagePinPath(runDir: string): string {\n return join(runDir, \".trailstep-pin.json\");\n}\n\nexport async function readStorageLifecycleStatus(options: {\n readonly cwd: string;\n readonly runsRoot?: string;\n readonly policy?: StorageLifecyclePolicy;\n}): Promise<StorageLifecycleStatus> {\n const runsRoot = options.runsRoot ?? defaultRunsRoot(options.cwd);\n const [runSummaries, archivedRuns, pinnedRuns] = await Promise.all([\n listRunSummaries({ cwd: options.cwd, runsRoot }),\n listArchivedRunIds(runsRoot),\n listPinnedRunIds({ cwd: options.cwd, runsRoot }),\n ]);\n const hotRuns = runSummaries.filter((summary) => summary.status !== \"archived\");\n return {\n runsRoot,\n enabled: options.policy?.enabled === true,\n hotRuns: hotRuns.length,\n archivedRuns: archivedRuns.length,\n pinnedRuns,\n };\n}\n\nexport async function planStorageLifecycle(options: {\n readonly cwd: string;\n readonly runsRoot?: string;\n readonly policy?: StorageLifecyclePolicy;\n readonly now?: Date;\n}): Promise<StorageLifecycleAction[]> {\n const policy = options.policy;\n if (policy?.enabled !== true) {\n return [];\n }\n\n const runsRoot = options.runsRoot ?? defaultRunsRoot(options.cwd);\n const now = options.now ?? new Date();\n const summaries = await listRunSummaries({ cwd: options.cwd, runsRoot });\n const actions: StorageLifecycleAction[] = [];\n\n for (const summary of summaries) {\n if (!isLifecycleEligible(summary) || (await isRunPinned(summary.runDir))) {\n continue;\n }\n\n const workflowPolicy = summary.workflowId ? policy.workflows?.[summary.workflowId] : undefined;\n const archiveAfterDays = resolvePolicyDays(workflowPolicy, policy, \"archiveAfterDays\");\n const deleteAfterDays = resolvePolicyDays(workflowPolicy, policy, \"deleteAfterDays\");\n const ageDays = ageInDays(summary.lastTimestamp, now);\n if (ageDays === undefined) {\n continue;\n }\n\n if (deleteAfterDays !== undefined && ageDays >= deleteAfterDays) {\n actions.push({\n action: \"delete-hot\",\n runId: summary.runId,\n path: summary.runDir,\n reason: `${summary.status} run is ${Math.floor(ageDays)}d old (deleteAfterDays=${deleteAfterDays})`,\n });\n } else if (archiveAfterDays !== undefined && ageDays >= archiveAfterDays) {\n actions.push({\n action: \"archive\",\n runId: summary.runId,\n path: summary.runDir,\n reason: `${summary.status} run is ${Math.floor(ageDays)}d old (archiveAfterDays=${archiveAfterDays})`,\n });\n }\n }\n\n for (const manifest of await readArchiveManifests(runsRoot)) {\n const workflowPolicy = manifest.workflowId\n ? policy.workflows?.[manifest.workflowId]\n : undefined;\n const deleteAfterDays = resolvePolicyDays(workflowPolicy, policy, \"deleteAfterDays\");\n const ageDays = ageInDays(manifest.lastTimestamp, now);\n if (manifest.pinned === true || deleteAfterDays === undefined || ageDays === undefined) {\n continue;\n }\n if (ageDays >= deleteAfterDays) {\n actions.push({\n action: \"delete-archive\",\n runId: manifest.runId,\n path: archivePayloadPath(runsRoot, manifest.runId),\n reason: `archived run is ${Math.floor(ageDays)}d old (deleteAfterDays=${deleteAfterDays})`,\n });\n }\n }\n\n return actions;\n}\n\nexport async function applyStorageLifecycle(options: {\n readonly cwd: string;\n readonly runsRoot?: string;\n readonly policy?: StorageLifecyclePolicy;\n readonly now?: Date;\n readonly dryRun?: boolean;\n}): Promise<StorageLifecycleAction[]> {\n const actions = await planStorageLifecycle(options);\n if (options.dryRun === true) {\n return actions;\n }\n const runsRoot = options.runsRoot ?? defaultRunsRoot(options.cwd);\n for (const action of actions) {\n if (action.action === \"archive\") {\n await archiveRun({ runsRoot, runId: action.runId, now: options.now });\n } else if (action.action === \"delete-hot\") {\n await deleteRun({ runsRoot, runId: action.runId });\n } else {\n await deleteArchivedRun({ runsRoot, runId: action.runId });\n }\n }\n return actions;\n}\n\nexport async function archiveRun(options: {\n readonly runsRoot: string;\n readonly runId: string;\n readonly now?: Date;\n}): Promise<void> {\n assertRunId(options.runId);\n const runDir = join(options.runsRoot, options.runId);\n const summaries = await listRunSummaries({\n cwd: dirname(dirname(options.runsRoot)),\n runsRoot: options.runsRoot,\n });\n const summary = summaries.find(\n (candidate) => candidate.runId === options.runId && candidate.status !== \"archived\",\n );\n if (summary === undefined || !isLifecycleEligible(summary)) {\n throw new Error(`Run ${options.runId} is not a terminal readable run and cannot be archived.`);\n }\n if (await isRunPinned(runDir)) {\n throw new Error(`Run ${options.runId} is pinned and cannot be archived.`);\n }\n\n const manifest: ArchiveManifest = {\n schemaVersion: 1,\n runId: options.runId,\n archivedAt: (options.now ?? new Date()).toISOString(),\n sourceRunDir: runDir,\n ...(summary.workflowId === undefined ? {} : { workflowId: summary.workflowId }),\n ...(summary.lastTimestamp === undefined ? {} : { lastTimestamp: summary.lastTimestamp }),\n status: summary.status,\n };\n const payload: ArchivePayload = { manifest, files: await readDirectoryPayload(runDir) };\n await mkdir(storageArchiveDir(options.runsRoot), { recursive: true });\n await writeFile(\n archivePayloadPath(options.runsRoot, options.runId),\n await gzipAsync(JSON.stringify(payload)),\n \"utf8\",\n );\n await writeFile(\n archiveManifestPath(options.runsRoot, options.runId),\n `${JSON.stringify(manifest, null, 2)}\\n`,\n \"utf8\",\n );\n await rm(runDir, { recursive: true, force: true });\n}\n\nexport async function restoreArchivedRun(options: {\n readonly runsRoot: string;\n readonly runId: string;\n}): Promise<void> {\n assertRunId(options.runId);\n const payloadPath = archivePayloadPath(options.runsRoot, options.runId);\n const manifestPath = archiveManifestPath(options.runsRoot, options.runId);\n const runDir = join(options.runsRoot, options.runId);\n if (await pathExists(runDir)) {\n throw new Error(\n `Run ${options.runId} already exists in hot storage; refusing to overwrite it.`,\n );\n }\n const payload = JSON.parse(\n String(await gunzipAsync(await readFile(payloadPath))),\n ) as ArchivePayload;\n await mkdir(runDir, { recursive: true });\n for (const file of payload.files) {\n const target = join(runDir, file.path);\n if (!relative(runDir, target) || relative(runDir, target).startsWith(\"..\")) {\n throw new Error(`Archive for ${options.runId} contains an invalid path.`);\n }\n await mkdir(dirname(target), { recursive: true });\n await writeFile(target, Buffer.from(file.contentBase64, \"base64\"));\n }\n await rm(payloadPath, { force: true });\n await rm(manifestPath, { force: true });\n}\n\nexport async function pinRun(options: {\n readonly runsRoot: string;\n readonly runId: string;\n}): Promise<void> {\n assertRunId(options.runId);\n const runDir = join(options.runsRoot, options.runId);\n if (!(await pathExists(runDir))) {\n if (await pathExists(archiveManifestPath(options.runsRoot, options.runId))) {\n throw new Error(`Run ${options.runId} is archived; restore it before pinning.`);\n }\n throw new Error(`Run ${options.runId} does not exist.`);\n }\n await writeFile(\n storagePinPath(runDir),\n `${JSON.stringify({ schemaVersion: 1, pinnedAt: new Date().toISOString() }, null, 2)}\\n`,\n \"utf8\",\n );\n}\n\nexport async function unpinRun(options: {\n readonly runsRoot: string;\n readonly runId: string;\n}): Promise<void> {\n assertRunId(options.runId);\n const runDir = join(options.runsRoot, options.runId);\n if (!(await pathExists(runDir))) {\n if (await pathExists(archiveManifestPath(options.runsRoot, options.runId))) {\n throw new Error(`Run ${options.runId} is archived; restore it before unpinning.`);\n }\n throw new Error(`Run ${options.runId} does not exist.`);\n }\n await rm(storagePinPath(runDir), { force: true });\n}\n\nexport async function deleteRun(options: {\n readonly runsRoot: string;\n readonly runId: string;\n}): Promise<void> {\n assertRunId(options.runId);\n const runDir = join(options.runsRoot, options.runId);\n if (await pathExists(runDir)) {\n if (await isRunPinned(runDir)) {\n throw new Error(`Run ${options.runId} is pinned and cannot be deleted.`);\n }\n await rm(runDir, { recursive: true, force: true });\n return;\n }\n const manifest = await readArchiveManifest(options.runsRoot, options.runId);\n if (manifest === undefined) {\n throw new Error(`Run ${options.runId} does not exist.`);\n }\n if (manifest.pinned === true) {\n throw new Error(`Run ${options.runId} is pinned and cannot be deleted.`);\n }\n await deleteArchivedRun(options);\n}\n\nexport async function deleteArchivedRun(options: {\n readonly runsRoot: string;\n readonly runId: string;\n}): Promise<void> {\n assertRunId(options.runId);\n await rm(archivePayloadPath(options.runsRoot, options.runId), { force: true });\n await rm(archiveManifestPath(options.runsRoot, options.runId), { force: true });\n}\n\nasync function readDirectoryPayload(root: string): Promise<ArchivePayload[\"files\"]> {\n const files: { path: string; contentBase64: string }[] = [];\n async function visit(dir: string): Promise<void> {\n for (const entry of await readdir(dir, { withFileTypes: true })) {\n const entryPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n await visit(entryPath);\n } else if (entry.isFile()) {\n files.push({\n path: normalizeArchivePath(relative(root, entryPath)),\n contentBase64: await streamFileBase64(entryPath),\n });\n }\n }\n }\n await visit(root);\n return files;\n}\n\nfunction normalizeArchivePath(path: string): string {\n return path.replace(/\\\\/g, \"/\");\n}\n\nasync function streamFileBase64(path: string): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of createReadStream(path)) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"base64\");\n}\n\nasync function listPinnedRunIds(options: {\n readonly cwd: string;\n readonly runsRoot: string;\n}): Promise<string[]> {\n const summaries = (await listRunSummaries(options)).filter(\n (summary) => summary.status !== \"archived\",\n );\n const pinned: string[] = [];\n for (const summary of summaries) {\n if (await isRunPinned(summary.runDir)) {\n pinned.push(summary.runId);\n }\n }\n return pinned.sort();\n}\n\nasync function isRunPinned(runDir: string): Promise<boolean> {\n try {\n await stat(storagePinPath(runDir));\n return true;\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nasync function listArchivedRunIds(runsRoot: string): Promise<string[]> {\n return (await readArchiveManifests(runsRoot)).map((manifest) => manifest.runId).sort();\n}\n\nasync function readArchiveManifest(\n runsRoot: string,\n runId: string,\n): Promise<ArchiveManifest | undefined> {\n try {\n return JSON.parse(\n await readFile(archiveManifestPath(runsRoot, runId), \"utf8\"),\n ) as ArchiveManifest;\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function readArchiveManifests(runsRoot: string): Promise<ArchiveManifest[]> {\n let entries: Dirent[];\n try {\n entries = await readdir(storageArchiveDir(runsRoot), { withFileTypes: true });\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n const manifests: ArchiveManifest[] = [];\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(\".manifest.json\")) {\n continue;\n }\n manifests.push(\n JSON.parse(\n await readFile(join(storageArchiveDir(runsRoot), entry.name), \"utf8\"),\n ) as ArchiveManifest,\n );\n }\n return manifests;\n}\n\nfunction archivePayloadPath(runsRoot: string, runId: string): string {\n return join(storageArchiveDir(runsRoot), `${runId}.json.gz`);\n}\n\nfunction archiveManifestPath(runsRoot: string, runId: string): string {\n return join(storageArchiveDir(runsRoot), `${runId}.manifest.json`);\n}\n\nfunction isLifecycleEligible(summary: RunSummary): boolean {\n return TERMINAL_STATUSES.has(summary.status);\n}\n\nfunction resolvePolicyDays(\n workflowPolicy: NonNullable<StorageLifecyclePolicy[\"workflows\"]>[string] | undefined,\n defaultPolicy: StorageLifecyclePolicy,\n key: \"archiveAfterDays\" | \"deleteAfterDays\",\n): number | undefined {\n if (workflowPolicy !== undefined && Object.hasOwn(workflowPolicy, key)) {\n const value = workflowPolicy[key];\n return value === false ? undefined : value;\n }\n const value = defaultPolicy[key];\n return value === false ? undefined : value;\n}\n\nfunction ageInDays(timestamp: string | undefined, now: Date): number | undefined {\n if (timestamp === undefined) {\n return undefined;\n }\n const time = Date.parse(timestamp);\n return Number.isFinite(time) ? (now.getTime() - time) / (24 * 60 * 60 * 1000) : undefined;\n}\n\nexport function parseStorageLifecycleDurationDays(value: string): number | undefined {\n const match = /^(\\d+(?:\\.\\d+)?)(ms|s|m|h|d|w)$/u.exec(value.trim());\n if (match === null) {\n return undefined;\n }\n const amount = Number(match[1]);\n if (!Number.isFinite(amount) || amount < 0) {\n return undefined;\n }\n const unit = match[2] as \"ms\" | \"s\" | \"m\" | \"h\" | \"d\" | \"w\";\n const daysByUnit: Record<typeof unit, number> = {\n ms: 1 / 86_400_000,\n s: 1 / 86_400,\n m: 1 / 1_440,\n h: 1 / 24,\n d: 1,\n w: 7,\n };\n return amount * daysByUnit[unit];\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nfunction assertRunId(runId: string): void {\n if (runId !== basename(runId) || runId === \".\" || runId === \"..\" || runId.trim() === \"\") {\n throw new Error(\"Run id must be a single path segment.\");\n }\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n","import { appendFile, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\nimport { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type { Event } from \"../../runtime/run-workflow/run-workflow.types.js\";\n\nexport type RunState = Record<string, unknown>;\n\nexport function defaultRunsRoot(cwd: string): string {\n return join(cwd, \".trailstep\", \"runs\");\n}\n\nexport async function createRunDirectory(options: {\n readonly cwd: string;\n readonly runName: string;\n readonly runsRoot?: string;\n}): Promise<{ runId: string; runDir: string }> {\n const runsRoot = options.runsRoot ?? defaultRunsRoot(options.cwd);\n validateRunName(options.runName);\n await mkdir(runsRoot, { recursive: true });\n await ensureTrailStepGitignoreForRunsRoot(runsRoot);\n\n for (let suffix = 1; ; suffix += 1) {\n const runId = suffix === 1 ? options.runName : `${options.runName}-${suffix}`;\n const runDir = join(runsRoot, runId);\n\n try {\n await mkdir(runDir);\n return { runId, runDir };\n } catch (error) {\n if (isNodeError(error) && error.code === \"EEXIST\") {\n continue;\n }\n\n throw error;\n }\n }\n}\n\nexport async function appendEvent(runDir: string, event: Event): Promise<void> {\n await appendFile(join(runDir, \"events.jsonl\"), `${JSON.stringify(event)}\\n`, \"utf8\");\n}\n\nexport async function readRunEvents(runDir: string): Promise<Event[]> {\n let contents: string;\n try {\n contents = await readFile(join(runDir, \"events.jsonl\"), \"utf8\");\n } catch (error) {\n if (isNodeError(error)) {\n throw new TrailStepFailureError({\n code: \"resume_target_not_found\",\n message: `Resume target not found or unreadable: ${join(runDir, \"events.jsonl\")}.`,\n details: { runDir, causeCode: error.code },\n });\n }\n\n throw error;\n }\n\n const rawLines = contents.split(\"\\n\");\n const lines = rawLines.filter((line, index) => line.length > 0 || index < rawLines.length - 1);\n const events: Event[] = [];\n\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index];\n if (!line) {\n continue;\n }\n\n try {\n events.push(JSON.parse(line) as Event);\n } catch (error) {\n const isTrailingLine = index === lines.length - 1;\n if (isTrailingLine) {\n return events;\n }\n\n throw error;\n }\n }\n\n return events;\n}\n\nexport async function persistEvents(runDir: string, events: readonly Event[]): Promise<void> {\n const jsonl = events.map((event) => JSON.stringify(event)).join(\"\\n\");\n await writeFile(join(runDir, \"events.jsonl\"), `${jsonl}\\n`, \"utf8\");\n}\n\nexport async function writeDocumentArtifact(\n dir: string,\n filename: string,\n content: string,\n): Promise<string> {\n await mkdir(dir, { recursive: true });\n\n const documentPath = join(dir, filename);\n await writeFile(documentPath, content, \"utf8\");\n\n return documentPath;\n}\n\nexport async function readJsonStateArtifact(path: string): Promise<RunState> {\n try {\n const contents = await readFile(path, \"utf8\");\n const parsed: unknown = JSON.parse(contents);\n\n if (!isRunState(parsed)) {\n throw new Error(\"run state must be a JSON object\");\n }\n\n return parsed;\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return {};\n }\n\n throw error;\n }\n}\n\nexport async function writeJsonStateArtifact(path: string, state: RunState): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, `${JSON.stringify(state, null, 2)}\\n`, \"utf8\");\n}\n\nexport function runStatePath(runDir: string): string {\n return join(runDir, \"state.json\");\n}\n\nexport function globalStatePath(runDir: string): string {\n return join(runDir, \"global-state.json\");\n}\n\nexport function branchStatePath(runDir: string, branchId: string): string {\n return join(runDir, \"branches\", `${branchId}.state.json`);\n}\n\nexport async function readRunState(runDir: string): Promise<RunState> {\n return await readJsonStateArtifact(runStatePath(runDir));\n}\n\nexport async function writeRunState(runDir: string, state: RunState): Promise<void> {\n await writeJsonStateArtifact(runStatePath(runDir), state);\n}\n\nexport async function readGlobalState(runDir: string): Promise<RunState> {\n return await readJsonStateArtifact(globalStatePath(runDir));\n}\n\nexport async function writeGlobalState(runDir: string, state: RunState): Promise<void> {\n await writeJsonStateArtifact(globalStatePath(runDir), state);\n}\n\nexport async function readBranchRunState(runDir: string, branchId: string): Promise<RunState> {\n return await readJsonStateArtifact(branchStatePath(runDir, branchId));\n}\n\nexport async function writeBranchRunState(\n runDir: string,\n branchId: string,\n state: RunState,\n): Promise<void> {\n await writeJsonStateArtifact(branchStatePath(runDir, branchId), state);\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n\nfunction validateRunName(runName: string): void {\n if (\n runName.trim().length === 0 ||\n runName === \".\" ||\n runName === \"..\" ||\n runName.includes(\"/\") ||\n runName.includes(\"\\\\\")\n ) {\n throw new TrailStepFailureError({\n code: \"run_name_invalid\",\n message: \"Run name must be a non-empty single path segment.\",\n details: { runName },\n });\n }\n}\n\nfunction isRunState(value: unknown): value is RunState {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\nasync function ensureTrailStepGitignoreForRunsRoot(runsRoot: string): Promise<void> {\n const trailstepRoot = dirname(runsRoot);\n if (basename(trailstepRoot) !== \".trailstep\") {\n return;\n }\n\n await ensureTrailStepGitignore(trailstepRoot);\n}\n\nasync function ensureTrailStepGitignore(trailstepRoot: string): Promise<void> {\n try {\n await writeFile(join(trailstepRoot, \".gitignore\"), \"*\\n!.gitignore\\n\", { flag: \"wx\" });\n } catch (error) {\n if (isNodeError(error) && error.code === \"EEXIST\") {\n return;\n }\n\n throw error;\n }\n}\n","import type { Dirent } from \"node:fs\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { defaultRunsRoot, readRunEvents } from \"../artifacts/run-storage.js\";\nimport type { LatestUnresolvedFailure } from \"../retry/latest-unresolved-failure.js\";\nimport { selectLatestUnresolvedFailure } from \"../retry/latest-unresolved-failure.js\";\nimport type { Event } from \"../run-workflow/run-workflow.types.js\";\nimport type { TrackSummary } from \"./track-summary.js\";\nimport { readTrackSummary } from \"./track-summary.js\";\n\nexport type RunSummaryStatus =\n | \"active\"\n | \"completed\"\n | \"failed\"\n | \"cancelled\"\n | \"archived\"\n | \"unknown\";\n\nexport interface RunSummary {\n readonly runId: string;\n readonly runDir: string;\n readonly status: RunSummaryStatus;\n readonly workflowId?: string;\n readonly lastTimestamp?: string;\n readonly latestFailure?: LatestUnresolvedFailure;\n readonly track?: TrackSummary;\n readonly trackWarning?: string;\n readonly warning?: string;\n}\n\nexport async function listRunSummaries(options: {\n readonly cwd: string;\n readonly runsRoot?: string;\n}): Promise<RunSummary[]> {\n const runsRoot = options.runsRoot ?? defaultRunsRoot(options.cwd);\n\n let entries: Dirent[];\n try {\n entries = await readdir(runsRoot, { withFileTypes: true });\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return [];\n }\n\n throw error;\n }\n\n const summaries: RunSummary[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name === \".archive\") {\n continue;\n }\n\n const runId = entry.name;\n const runDir = join(runsRoot, runId);\n\n try {\n summaries.push(\n await summarizeReadableRun({ runId, runDir, events: await readRunEvents(runDir) }),\n );\n } catch (error) {\n summaries.push({\n runId,\n runDir,\n status: \"unknown\",\n warning: `Warning: Could not read run ${runId}: ${readErrorMessage(error)}`,\n });\n }\n }\n\n summaries.push(...(await listArchivedRunSummaries(runsRoot)));\n\n return summaries.sort(newestFirst);\n}\n\nexport function selectRecentFailedRunSummaries(\n summaries: readonly RunSummary[],\n options: { readonly now?: Date } = {},\n): RunSummary[] {\n const cutoffMs = (options.now ?? new Date()).getTime() - 7 * 24 * 60 * 60 * 1000;\n\n return summaries\n .filter((summary) => {\n if (summary.status !== \"failed\" || !summary.latestFailure) {\n return false;\n }\n\n const failureTime = Date.parse(summary.latestFailure.event.timestamp);\n return Number.isFinite(failureTime) && failureTime >= cutoffMs;\n })\n .sort(newestFirst)\n .slice(0, 10);\n}\n\nexport function newestFirst(left: RunSummary, right: RunSummary): number {\n return (\n compareTimestampDescending(left.lastTimestamp, right.lastTimestamp) ||\n left.runId.localeCompare(right.runId)\n );\n}\n\nasync function summarizeReadableRun(options: {\n readonly runId: string;\n readonly runDir: string;\n readonly events: readonly Event[];\n}): Promise<RunSummary> {\n let track: TrackSummary | undefined;\n let trackWarning: string | undefined;\n try {\n track = await readTrackSummary(options);\n } catch (error) {\n trackWarning = `Warning: Could not read track summary for run ${options.runId}: ${readErrorMessage(error)}`;\n }\n const trackFields = {\n ...(track === undefined ? {} : { track }),\n ...(trackWarning === undefined ? {} : { trackWarning }),\n };\n const latestFailure = selectLatestUnresolvedFailure(options.events);\n const terminalStatus = selectTerminalStatus(options.events);\n const lastEvent = options.events.at(-1);\n const workflowId =\n lastEvent?.workflowId ?? options.events.find((event) => event.workflowId)?.workflowId;\n\n if (terminalStatus === \"completed\" || terminalStatus === \"cancelled\") {\n return {\n ...options,\n ...trackFields,\n status: terminalStatus,\n workflowId,\n lastTimestamp: lastEvent?.timestamp,\n };\n }\n\n if (latestFailure) {\n return {\n ...options,\n ...trackFields,\n status: \"failed\",\n workflowId: latestFailure.workflowId,\n lastTimestamp: latestFailure.event.timestamp,\n latestFailure,\n };\n }\n\n return {\n ...options,\n ...trackFields,\n status: terminalStatus ?? \"active\",\n workflowId,\n lastTimestamp: lastEvent?.timestamp,\n };\n}\n\nfunction selectTerminalStatus(\n events: readonly Event[],\n): \"completed\" | \"failed\" | \"cancelled\" | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (event?.type === \"workflow.completed\") {\n return \"completed\";\n }\n\n if (event?.type === \"workflow.failed\") {\n return \"failed\";\n }\n\n if (event?.type === \"workflow.cancelled\") {\n return \"cancelled\";\n }\n }\n\n return undefined;\n}\n\nasync function listArchivedRunSummaries(runsRoot: string): Promise<RunSummary[]> {\n const archiveDir = join(runsRoot, \".archive\");\n let entries: Dirent[];\n try {\n entries = await readdir(archiveDir, { withFileTypes: true });\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n\n const summaries: RunSummary[] = [];\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(\".manifest.json\")) {\n continue;\n }\n try {\n const manifest = JSON.parse(await readFile(join(archiveDir, entry.name), \"utf8\")) as {\n readonly runId?: unknown;\n readonly workflowId?: unknown;\n readonly lastTimestamp?: unknown;\n };\n if (typeof manifest.runId === \"string\") {\n summaries.push({\n runId: manifest.runId,\n runDir: join(archiveDir, `${manifest.runId}.json.gz`),\n status: \"archived\",\n ...(typeof manifest.workflowId === \"string\" ? { workflowId: manifest.workflowId } : {}),\n ...(typeof manifest.lastTimestamp === \"string\"\n ? { lastTimestamp: manifest.lastTimestamp }\n : {}),\n });\n }\n } catch (error) {\n summaries.push({\n runId: entry.name.replace(/\\.manifest\\.json$/u, \"\"),\n runDir: join(archiveDir, entry.name),\n status: \"unknown\",\n warning: `Warning: Could not read archived run manifest ${entry.name}: ${readErrorMessage(error)}`,\n });\n }\n }\n return summaries;\n}\n\nfunction compareTimestampDescending(left: string | undefined, right: string | undefined): number {\n const leftTime = left ? Date.parse(left) : Number.NEGATIVE_INFINITY;\n const rightTime = right ? Date.parse(right) : Number.NEGATIVE_INFINITY;\n return rightTime - leftTime;\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n","import type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport type { Event } from \"../run-workflow/run-workflow.types.js\";\n\nexport interface LatestUnresolvedFailure {\n readonly event: Event;\n readonly replayPosition: number;\n readonly sourceFailureEventId?: string;\n readonly workflowId: string;\n readonly workflowInput?: PlainObject;\n readonly stepId?: string;\n}\n\ninterface ResolvedFailureIdentity {\n readonly eventId?: string;\n readonly replayPosition?: number;\n}\n\nexport function selectLatestUnresolvedFailure(\n events: readonly Event[],\n): LatestUnresolvedFailure | undefined {\n const startedEvent = events.find((event) => event.type === \"workflow.started\");\n const workflowInput = startedEvent ? readPlainPayload(startedEvent, \"input\") : undefined;\n const resolvedFailures = events.flatMap((event) =>\n event.type === \"workflow.retryStarted\" ? readResolvedFailureIdentity(event) : [],\n );\n\n let workflowFailureFallback: LatestUnresolvedFailure | undefined;\n let laterWorkflowTerminalSeen = false;\n const laterTerminalStepCounts = new Map<string, number>();\n\n for (let replayPosition = events.length - 1; replayPosition >= 0; replayPosition -= 1) {\n const event = events[replayPosition];\n if (!event) {\n continue;\n }\n\n if (event.type === \"workflow.completed\" || event.type === \"workflow.cancelled\") {\n return undefined;\n }\n\n if (event.type === \"step.completed\" || event.type === \"step.cancelled\") {\n rememberTerminalStep(event, laterTerminalStepCounts);\n continue;\n }\n\n if (event.type === \"step.failed\") {\n rememberTerminalStep(event, laterTerminalStepCounts);\n if (isResolvedFailure(event, replayPosition, resolvedFailures)) {\n continue;\n }\n\n return toLatestUnresolvedFailure(event, replayPosition, workflowInput);\n }\n\n if (event.type === \"workflow.failed\") {\n laterWorkflowTerminalSeen = true;\n if (!workflowFailureFallback) {\n if (isResolvedFailure(event, replayPosition, resolvedFailures)) {\n continue;\n }\n\n workflowFailureFallback = toLatestUnresolvedFailure(event, replayPosition, workflowInput);\n }\n continue;\n }\n\n if (event.type === \"step.started\" && event.stepId) {\n if (consumeTerminalStep(event.stepId, laterTerminalStepCounts)) {\n continue;\n }\n\n if (!laterWorkflowTerminalSeen) {\n if (isResolvedFailure(event, replayPosition, resolvedFailures)) {\n continue;\n }\n\n return toLatestUnresolvedFailure(event, replayPosition, workflowInput);\n }\n }\n }\n\n return workflowFailureFallback;\n}\n\nfunction rememberTerminalStep(event: Event, stepCounts: Map<string, number>): void {\n if (event.stepId) {\n stepCounts.set(event.stepId, (stepCounts.get(event.stepId) ?? 0) + 1);\n }\n}\n\nfunction consumeTerminalStep(stepId: string, stepCounts: Map<string, number>): boolean {\n const count = stepCounts.get(stepId) ?? 0;\n if (count <= 0) {\n return false;\n }\n\n if (count === 1) {\n stepCounts.delete(stepId);\n } else {\n stepCounts.set(stepId, count - 1);\n }\n return true;\n}\n\nfunction readResolvedFailureIdentity(event: Event): readonly ResolvedFailureIdentity[] {\n const { sourceFailureEventId, sourceFailureReplayPosition } = event.payload;\n if (typeof sourceFailureEventId !== \"string\" && typeof sourceFailureReplayPosition !== \"number\") {\n return [];\n }\n\n return [\n {\n eventId: typeof sourceFailureEventId === \"string\" ? sourceFailureEventId : undefined,\n replayPosition:\n typeof sourceFailureReplayPosition === \"number\" ? sourceFailureReplayPosition : undefined,\n },\n ];\n}\n\nfunction isResolvedFailure(\n event: Event,\n replayPosition: number,\n resolvedFailures: readonly ResolvedFailureIdentity[],\n): boolean {\n return resolvedFailures.some((resolvedFailure) => {\n if (resolvedFailure.replayPosition !== undefined) {\n return resolvedFailure.replayPosition === replayPosition;\n }\n\n return resolvedFailure.eventId !== undefined && resolvedFailure.eventId === event.id;\n });\n}\n\nfunction toLatestUnresolvedFailure(\n event: Event,\n replayPosition: number,\n workflowInput: PlainObject | undefined,\n): LatestUnresolvedFailure {\n return {\n event,\n replayPosition,\n sourceFailureEventId: typeof event.id === \"string\" ? event.id : undefined,\n workflowId: event.workflowId,\n workflowInput,\n stepId: event.stepId,\n };\n}\n\nfunction readPlainPayload(event: Event, key: string): PlainObject | undefined {\n const value = event.payload[key];\n return isPlainObject(value) ? value : undefined;\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport type { Event } from \"../run-workflow/run-workflow.types.js\";\n\nexport interface TrackSummary {\n readonly runId: string;\n readonly status: string;\n readonly workers?: number;\n readonly failurePolicy?: string;\n readonly rootBranchId?: string;\n readonly terminalBranchId?: string;\n readonly terminalKind?: string;\n readonly terminalOutput?: unknown;\n readonly failure?: unknown;\n readonly splitOccurred?: boolean;\n readonly branches: readonly BranchSummary[];\n}\n\nexport interface BranchSummary {\n readonly branchId: string;\n readonly requestedBranchId?: string;\n readonly parentBranchId?: string;\n readonly status?: string;\n readonly workflowId?: string;\n readonly latestStepIndex?: number;\n readonly latestStepId?: string;\n readonly latestMessage?: string;\n readonly wait?: unknown;\n readonly failure?: unknown;\n readonly output?: unknown;\n}\n\nexport async function readTrackSummary(options: {\n readonly runId: string;\n readonly runDir: string;\n readonly events: readonly Event[];\n}): Promise<TrackSummary | undefined> {\n const track = await readJsonObject(join(options.runDir, \"track.json\"));\n if (track === undefined) {\n return undefined;\n }\n\n const branchIds = Array.isArray(track.branches)\n ? track.branches.filter((branchId): branchId is string => typeof branchId === \"string\")\n : [];\n\n const branches = await Promise.all(\n branchIds.map(async (branchId) => summarizeBranch(options.runDir, branchId, options.events)),\n );\n\n return {\n runId: stringValue(track.runId) ?? options.runId,\n status: stringValue(track.status) ?? \"unknown\",\n ...(numberValue(track.workers) === undefined ? {} : { workers: numberValue(track.workers) }),\n ...(stringValue(track.failurePolicy) === undefined\n ? {}\n : { failurePolicy: stringValue(track.failurePolicy) }),\n ...(stringValue(track.rootBranchId) === undefined\n ? {}\n : { rootBranchId: stringValue(track.rootBranchId) }),\n ...(stringValue(track.terminalBranchId) === undefined\n ? {}\n : { terminalBranchId: stringValue(track.terminalBranchId) }),\n ...(stringValue(track.terminalKind) === undefined\n ? {}\n : { terminalKind: stringValue(track.terminalKind) }),\n ...(track.terminalOutput === undefined ? {} : { terminalOutput: track.terminalOutput }),\n ...(track.failure === undefined ? {} : { failure: track.failure }),\n ...(typeof track.splitOccurred === \"boolean\" ? { splitOccurred: track.splitOccurred } : {}),\n branches,\n };\n}\n\nasync function summarizeBranch(\n runDir: string,\n branchId: string,\n events: readonly Event[],\n): Promise<BranchSummary> {\n const branch = (await readJsonObject(join(runDir, \"branches\", `${branchId}.json`))) ?? {};\n const branchEvents = events.filter((event) => event.payload.branchId === branchId);\n const latestFailureMessage = selectLatestEventFailureMessage(branchEvents);\n const latestMessage =\n latestFailureMessage ?? stringValue(branch.message) ?? selectLatestEventMessage(branchEvents);\n const failure = branch.failure ?? selectLatestEventFailure(branchEvents);\n\n return {\n branchId: stringValue(branch.branchId) ?? branchId,\n ...(stringValue(branch.requestedBranchId) === undefined\n ? {}\n : { requestedBranchId: stringValue(branch.requestedBranchId) }),\n ...(stringValue(branch.parentBranchId) === undefined\n ? {}\n : { parentBranchId: stringValue(branch.parentBranchId) }),\n ...(stringValue(branch.status) === undefined ? {} : { status: stringValue(branch.status) }),\n ...(stringValue(branch.workflowId) === undefined\n ? {}\n : { workflowId: stringValue(branch.workflowId) }),\n ...(numberValue(branch.latestStepIndex) === undefined\n ? {}\n : { latestStepIndex: numberValue(branch.latestStepIndex) }),\n ...(stringValue(branch.latestStepId) === undefined\n ? {}\n : { latestStepId: stringValue(branch.latestStepId) }),\n ...(latestMessage === undefined ? {} : { latestMessage }),\n ...(branch.wait === undefined ? {} : { wait: branch.wait }),\n ...(failure === undefined ? {} : { failure }),\n ...(branch.output === undefined ? {} : { output: branch.output }),\n };\n}\n\nasync function readJsonObject(path: string): Promise<PlainObject | undefined> {\n try {\n const value = JSON.parse(await readFile(path, \"utf8\")) as unknown;\n return isPlainObject(value) ? value : {};\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nfunction selectLatestEventMessage(events: readonly Event[]): string | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n const message = stringValue(event?.payload.message);\n if (message !== undefined) {\n return message;\n }\n const failureMessage = isPlainObject(event?.payload.failure)\n ? stringValue(event.payload.failure.message)\n : undefined;\n if (failureMessage !== undefined) {\n return failureMessage;\n }\n }\n return undefined;\n}\n\nfunction selectLatestEventFailureMessage(events: readonly Event[]): string | undefined {\n const failure = selectLatestEventFailure(events);\n return isPlainObject(failure) ? stringValue(failure.message) : undefined;\n}\n\nfunction selectLatestEventFailure(events: readonly Event[]): unknown {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const failure = events[index]?.payload.failure;\n if (failure !== undefined) {\n return failure;\n }\n }\n return undefined;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n","import { parseStorageLifecycleDurationDays } from \"../../runtime/storage-lifecycle/storage-lifecycle.js\";\nimport type { TrailStepStorageConfig } from \"../targeting.types.js\";\nimport { isRecord, parseOptionalStringArray } from \"./parse-utils.js\";\n\nconst VALID_RUN_ON = new Set([\"run\", \"open\", \"runs\"]);\n\nexport function parseStorageConfig(\n value: unknown,\n diagnostics: string[],\n): TrailStepStorageConfig | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value)) {\n diagnostics.push(\"storage must be an object when present.\");\n return undefined;\n }\n\n const lifecycle = parseLifecycleConfig(value.lifecycle, diagnostics);\n return lifecycle === undefined ? {} : { lifecycle };\n}\n\nfunction parseLifecycleConfig(\n value: unknown,\n diagnostics: string[],\n): NonNullable<TrailStepStorageConfig[\"lifecycle\"]> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value)) {\n diagnostics.push(\"storage.lifecycle must be an object when present.\");\n return undefined;\n }\n\n const runOn = parseOptionalStringArray(\"storage.lifecycle.runOn\", value.runOn, diagnostics);\n if (runOn !== undefined) {\n for (const entry of runOn) {\n if (!VALID_RUN_ON.has(entry)) {\n diagnostics.push(\"storage.lifecycle.runOn entries must be one of run, open, or runs.\");\n break;\n }\n }\n }\n\n if (value.enabled !== undefined && typeof value.enabled !== \"boolean\") {\n diagnostics.push(\"storage.lifecycle.enabled must be a boolean when present.\");\n }\n if (\n value.throttle !== undefined &&\n value.throttle !== false &&\n typeof value.throttle !== \"string\"\n ) {\n diagnostics.push(\"storage.lifecycle.throttle must be a string or false when present.\");\n }\n\n const retention = parseRetentionConfig(\"storage.lifecycle\", value, diagnostics);\n const workflows = parseWorkflowRetentionConfigs(value.workflows, diagnostics);\n\n return {\n ...(typeof value.enabled === \"boolean\" ? { enabled: value.enabled } : {}),\n ...(runOn === undefined ? {} : { runOn: runOn as readonly (\"run\" | \"open\" | \"runs\")[] }),\n ...(value.throttle === undefined ||\n (value.throttle !== false && typeof value.throttle !== \"string\")\n ? {}\n : { throttle: value.throttle }),\n ...(retention === undefined ? {} : retention),\n ...(workflows === undefined ? {} : { workflows }),\n };\n}\n\nfunction parseWorkflowRetentionConfigs(\n value: unknown,\n diagnostics: string[],\n): NonNullable<NonNullable<TrailStepStorageConfig[\"lifecycle\"]>[\"workflows\"]> | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!isRecord(value)) {\n diagnostics.push(\"storage.lifecycle.workflows must be an object when present.\");\n return undefined;\n }\n\n const workflows: Record<\n string,\n NonNullable<NonNullable<TrailStepStorageConfig[\"lifecycle\"]>[\"workflows\"]>[string]\n > = {};\n for (const [workflowId, config] of Object.entries(value)) {\n const parsed = parseRetentionConfig(\n `storage.lifecycle.workflows.${workflowId}`,\n config,\n diagnostics,\n );\n if (parsed !== undefined) {\n workflows[workflowId] = parsed;\n }\n }\n return workflows;\n}\n\nfunction parseRetentionConfig(\n path: string,\n value: unknown,\n diagnostics: string[],\n): NonNullable<NonNullable<TrailStepStorageConfig[\"lifecycle\"]>[\"workflows\"]>[string] | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object when present.`);\n return undefined;\n }\n\n validateDurationOrFalse(`${path}.compressAfter`, value.compressAfter, diagnostics);\n validateDurationOrFalse(`${path}.deleteAfter`, value.deleteAfter, diagnostics);\n\n return {\n ...(value.compressAfter === undefined ||\n (value.compressAfter !== false && typeof value.compressAfter !== \"string\")\n ? {}\n : { compressAfter: value.compressAfter }),\n ...(value.deleteAfter === undefined ||\n (value.deleteAfter !== false && typeof value.deleteAfter !== \"string\")\n ? {}\n : { deleteAfter: value.deleteAfter }),\n };\n}\n\nfunction validateDurationOrFalse(path: string, value: unknown, diagnostics: string[]): void {\n if (value === undefined || value === false) {\n return;\n }\n if (typeof value === \"string\" && parseStorageLifecycleDurationDays(value) !== undefined) {\n return;\n }\n diagnostics.push(\n `${path} must be a duration string (for example 7d, 12h, or 2w) or false when present.`,\n );\n}\n","import type { TrailStepSettings } from \"../targeting.types.js\";\nimport { parseAgentMappings } from \"./parse-agent-mappings.js\";\nimport type { RawTrailStepAgentMappings } from \"./parse-agent-targets.js\";\nimport { parseSettings } from \"./parse-settings.js\";\nimport { isRecord } from \"./parse-utils.js\";\n\nexport interface RawTrailStepWorkflowConfig {\n readonly agents?: RawTrailStepAgentMappings;\n readonly settings?: TrailStepSettings;\n}\n\nexport function parseWorkflows(\n value: unknown,\n diagnostics: string[],\n): Record<string, RawTrailStepWorkflowConfig> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const workflows: Record<string, RawTrailStepWorkflowConfig> = {};\n\n if (!isRecord(value)) {\n diagnostics.push(\"workflows must be an object when present.\");\n return workflows;\n }\n\n for (const [workflowId, workflow] of Object.entries(value)) {\n if (!isRecord(workflow)) {\n diagnostics.push(`workflows.${workflowId} must be an object.`);\n continue;\n }\n\n const agents =\n workflow.agents === undefined\n ? undefined\n : parseAgentMappings(`workflows.${workflowId}.agents`, workflow.agents, diagnostics);\n\n const settings = parseSettings(\n `workflows.${workflowId}.settings`,\n workflow.settings,\n diagnostics,\n );\n\n workflows[workflowId] = {\n ...(agents === undefined ? {} : { agents }),\n ...(settings === undefined ? {} : { settings }),\n };\n }\n\n return workflows;\n}\n","import { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type { RawTrailStepAgentMappings, RawTrailStepAgentTarget } from \"./parse-agent-targets.js\";\nimport type { RawTrailStepWorkflowConfig } from \"./parse-workflow-agent-mappings.js\";\n\nexport function validateProviderReferences(options: {\n readonly agents: RawTrailStepAgentMappings;\n readonly workflows: Readonly<Record<string, RawTrailStepWorkflowConfig>> | undefined;\n readonly providerNames: Set<string>;\n}): void {\n const providerViolations: string[] = [];\n\n validateAgentMappings(\"agents\", options.agents, options.providerNames, providerViolations);\n\n if (options.workflows !== undefined) {\n for (const [workflowId, workflow] of Object.entries(options.workflows)) {\n validateAgentMappings(\n `workflows.${workflowId}.agents`,\n workflow.agents,\n options.providerNames,\n providerViolations,\n );\n }\n }\n\n if (providerViolations.length > 0) {\n throw new TrailStepFailureError({\n code: \"agent_provider_unknown\",\n message:\n \"One or more agent targets reference a provider that is not declared under customProviders/providers.\",\n details: { diagnostics: providerViolations },\n });\n }\n}\n\nfunction validateAgentMappings(\n path: string,\n mappings: RawTrailStepAgentMappings | undefined,\n providerNames: Set<string>,\n diagnostics: string[],\n): void {\n if (mappings === undefined) {\n return;\n }\n\n for (const [name, targets] of Object.entries(mappings)) {\n validateTargetReferences(`${path}.${name}`, targets, providerNames, diagnostics);\n }\n}\n\nfunction validateTargetReferences(\n path: string,\n targets: readonly RawTrailStepAgentTarget[],\n providerNames: Set<string>,\n diagnostics: string[],\n): void {\n for (const [index, target] of targets.entries()) {\n if (!(\"provider\" in target)) {\n continue;\n }\n\n if (!providerNames.has(target.provider)) {\n diagnostics.push(\n `${path}[${index}].provider references unknown provider '${target.provider}'. Declare it under customProviders/providers.`,\n );\n }\n }\n}\n","import {\n parseTrailStepProviderRegistrations,\n type TrailStepProviderRegistration,\n} from \"../../providers/provider-manifest.js\";\nimport type { TrailStepConfig } from \"../targeting.types.js\";\nimport { expandAgentRefs } from \"./expand-agent-refs.js\";\nimport { parseAgentMappings } from \"./parse-agent-mappings.js\";\nimport { parseCustomProviders } from \"./parse-custom-providers.js\";\nimport { parseSettings } from \"./parse-settings.js\";\nimport { parseStorageConfig } from \"./parse-storage-config.js\";\nimport { isRecord, throwValidationFailure } from \"./parse-utils.js\";\nimport { parseWorkflows } from \"./parse-workflow-agent-mappings.js\";\nimport { validateProviderReferences } from \"./validate-provider-references.js\";\n\nexport type ParsedTrailStepConfig = TrailStepConfig & {\n readonly providers: NonNullable<TrailStepConfig[\"providers\"]>;\n};\n\nconst parsedConfigs = new WeakSet<TrailStepConfig>();\n\nexport function isParsedTrailStepConfig(value: unknown): value is TrailStepConfig {\n return isRecord(value) && parsedConfigs.has(value as unknown as TrailStepConfig);\n}\n\nexport function parseTrailStepConfig(value: unknown): ParsedTrailStepConfig {\n const diagnostics: string[] = [];\n\n if (!isRecord(value)) {\n throwValidationFailure([\"config must be an object.\"]);\n }\n\n if (value.version !== 1) {\n diagnostics.push(\"version must be 1.\");\n }\n\n const customProviders = parseCustomProviders(value.customProviders, diagnostics);\n const providers = parseTrailStepProviderRegistrations(\"providers\", value.providers, diagnostics);\n for (const providerId of Object.keys(customProviders)) {\n if (providers[providerId] !== undefined) {\n diagnostics.push(\n `providers.${providerId} conflicts with legacy customProviders.${providerId}. Rename one provider id or migrate customProviders.${providerId} to providers.${providerId}.`,\n );\n }\n }\n const compatibilityProviders = legacyCustomProvidersAsRegistrations(customProviders);\n const providerNames = new Set([\n ...Object.keys(customProviders),\n ...Object.keys(providers),\n ...Object.keys(compatibilityProviders),\n ]);\n const agents = parseAgentMappings(\"agents\", value.agents, diagnostics);\n const settings = parseSettings(\"settings\", value.settings, diagnostics);\n const storage = parseStorageConfig(value.storage, diagnostics);\n const workflows = parseWorkflows(value.workflows, diagnostics);\n\n if (diagnostics.length > 0) {\n throwValidationFailure(diagnostics);\n }\n\n validateProviderReferences({ agents, workflows, providerNames });\n const expanded = expandAgentRefs({ agents, workflows });\n\n const unifiedProviders = { ...compatibilityProviders, ...providers };\n const config = {\n version: 1,\n customProviders,\n ...(Object.keys(providers).length === 0 ? {} : { providers: unifiedProviders }),\n agents: expanded.agents,\n ...(settings === undefined ? {} : { settings }),\n ...(storage === undefined ? {} : { storage }),\n ...(expanded.workflows === undefined ? {} : { workflows: expanded.workflows }),\n } as ParsedTrailStepConfig;\n\n if (Object.keys(providers).length === 0) {\n Object.defineProperty(config, \"providers\", { value: unifiedProviders, enumerable: false });\n }\n\n parsedConfigs.add(config);\n\n return config;\n}\n\nfunction legacyCustomProvidersAsRegistrations(\n customProviders: Record<string, TrailStepConfig[\"customProviders\"][string]>,\n): Record<string, TrailStepProviderRegistration> {\n return Object.fromEntries(\n Object.entries(customProviders).map(([id, provider]) => [\n id,\n {\n source: { type: \"legacy-custom-provider\" },\n manifest: {\n schemaVersion: 1,\n id,\n displayName: id,\n working: {\n supported: true,\n command: provider.binary,\n ...(provider.args === undefined ? {} : { args: provider.args }),\n prompt: { kind: \"prompt-file\" },\n output: { style: \"provider-output-file\" },\n },\n interactive: provider.interactiveArgs\n ? {\n supported: true,\n command: provider.binary,\n args: provider.interactiveArgs,\n }\n : { supported: false, reason: \"interactiveArgs is not declared\" },\n model: provider.model ?? { supported: false },\n thinking: provider.thinking ?? { supported: false },\n ...(provider.cwd === undefined ? {} : { cwd: provider.cwd }),\n ...(provider.env === undefined ? {} : { env: provider.env }),\n },\n } as TrailStepProviderRegistration,\n ]),\n );\n}\n","import { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type { ResolveAgentTargetsOptions, TrailStepAgentTarget } from \"../targeting.types.js\";\n\nexport function resolveAgentTargets(\n options: ResolveAgentTargetsOptions,\n): readonly TrailStepAgentTarget[] {\n const workflowMappings = options.config.workflows?.[options.workflowId]?.agents;\n\n const topLevelAgentKeys = uniqueAgentKeys([options.roleName, options.roleSize, \"default\"]);\n const targetLists = [\n workflowMappings?.[options.roleName],\n ...topLevelAgentKeys.map((key) => options.config.agents[key]),\n ];\n\n const targets = targetLists.flatMap((targets) =>\n targets && targets.length > 0 ? [...targets] : [],\n );\n\n if (targets.length > 0) {\n return targets;\n }\n\n throw new TrailStepFailureError({\n code: \"agent_targets_unavailable\",\n message: `No agent targets found for role ${options.roleName} with size ${options.roleSize} in workflow ${options.workflowId}.`,\n details: {\n roleName: options.roleName,\n roleSize: options.roleSize,\n workflowId: options.workflowId,\n },\n });\n}\n\nfunction uniqueAgentKeys(keys: readonly string[]): readonly string[] {\n return keys.filter((key, index) => keys.indexOf(key) === index);\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { RunContext } from \"../../contracts/run-context/run-context.types.js\";\n\n/**\n * A module-scoped `new AsyncLocalStorage()` is not safe here: the CLI's\n * direct-file workflow resolver loads workflow source through `tsx`'s\n * `tsImport`, which re-transpiles and re-evaluates everything reachable from\n * that entry point -- including this module -- as a second, independent\n * instantiation, even though it's the exact same file on disk. Two distinct\n * `AsyncLocalStorage` objects never see each other's stores no matter how\n * carefully `.run(...)` is nested, so `run-workflow.ts`/`with-step-context.ts`\n * (loaded the normal way) and a workflow's own step code (loaded via\n * `tsImport`) would silently end up talking to two different storages.\n * Keying the single instance off a well-known symbol on `globalThis` -- shared\n * by every module instantiation within the same process/realm -- keeps them\n * talking to the same storage regardless of which loader touched this file.\n */\nconst RUN_CONTEXT_STORAGE_KEY = Symbol.for(\"trailstep.core.runContextStorage\");\n\ninterface GlobalWithRunContextStorage {\n [RUN_CONTEXT_STORAGE_KEY]?: AsyncLocalStorage<RunContext>;\n}\n\nconst globalScope = globalThis as GlobalWithRunContextStorage;\n\nfunction getOrCreateRunContextStorage(): AsyncLocalStorage<RunContext> {\n const existing = globalScope[RUN_CONTEXT_STORAGE_KEY];\n if (existing) {\n return existing;\n }\n\n const created = new AsyncLocalStorage<RunContext>();\n globalScope[RUN_CONTEXT_STORAGE_KEY] = created;\n return created;\n}\n\nexport const runContextStorage: AsyncLocalStorage<RunContext> = getOrCreateRunContextStorage();\n\nexport function currentRunContext(): RunContext {\n const runContext = runContextStorage.getStore();\n if (!runContext) {\n throw new Error(\"state.* called outside an active TrailStep run.\");\n }\n\n return runContext;\n}\n","import { TrailStepFailureError, validationFailure } from \"../../contracts/failures/failure.js\";\nimport type { ValidationDiagnostic } from \"../../contracts/shapes/shape.types.js\";\nimport { writeDocumentArtifact } from \"../../runtime/artifacts/run-storage.js\";\nimport { currentRunContext } from \"../../runtime/run-context/run-context-storage.js\";\n\n/**\n * A captured document artifact. `Document` doubles as its own\n * `Schema<Document>`: `validate`/`diagnostics`/`assert`/`jsonSchema`/\n * `captureMode` are static members, so passing the class itself as\n * `.prompt(source, { output: Document })` gives both the TypeScript output\n * type and the runtime validator from one symbol -- no separate schema\n * constant to import or keep in sync.\n */\nexport class Document {\n // Index signature satisfies the `PlainObject` (`Record<string, unknown>`)\n // constraint required by `Schema<T extends PlainObject>` — a plain class\n // with only named properties does not structurally provide one otherwise.\n [key: string]: unknown;\n\n static readonly captureMode = \"raw-text\" as const;\n\n static readonly jsonSchema: Record<string, unknown> = {\n type: \"string\",\n description: \"Document content, captured as raw text.\",\n };\n\n static validate(value: unknown): value is Document {\n return isDocumentLike(value);\n }\n\n static diagnostics(value: unknown): readonly ValidationDiagnostic[] {\n if (isDocumentLike(value)) {\n return [];\n }\n\n return [\n { path: \"/\", message: \"must be a document (an object with string content and path fields)\" },\n ];\n }\n\n /**\n * Deliberately duck-types instead of checking `instanceof Document`: on\n * resume, a completed step's recorded output is replayed from\n * `events.jsonl` via `JSON.parse`, producing a plain deserialized object —\n * never a live `Document` instance — before `assert` is called on it. An\n * `instanceof` check would fail every such replay. `assert` reconstructs a\n * genuine `Document` from any content/path-shaped value, so every\n * consumer downstream — a live capture or a replayed value alike — always\n * receives a real `Document` instance with working prototype methods.\n */\n static assert(value: unknown, label = \"value\"): Document {\n const valueDiagnostics = Document.diagnostics(value);\n\n if (valueDiagnostics.length > 0 || !isDocumentLike(value)) {\n throw new TrailStepFailureError(\n validationFailure(\n `${label} failed schema validation: ${formatDiagnostics(valueDiagnostics)}`,\n {\n diagnostics: valueDiagnostics,\n },\n ),\n );\n }\n\n return new Document(value.content, value.path);\n }\n\n constructor(\n public readonly content: string,\n public readonly path: string,\n ) {}\n}\n\n/**\n * Captures `content` as a durable document artifact for the currently\n * executing step. Must be called from within a step's `.do()` callback —\n * it reads the step-scoped ambient context (`RunContext.currentStep`, set\n * by `withStepContext` for the duration of the step) to determine both the\n * directory to write into and this call's 1-based index within the step, so\n * that a step calling `document(...)` more than once gets\n * `document-1.md`, `document-2.md`, etc.\n */\nexport async function document(content: string): Promise<Document> {\n const { currentStep } = currentRunContext();\n\n if (!currentStep) {\n throw new Error(\n \"document(...) must be called from within a step's `.do()` callback; no active step context was found.\",\n );\n }\n\n const index = currentStep.nextDocumentIndex();\n const path = await writeDocumentArtifact(currentStep.dir, `document-${index}.md`, content);\n\n return new Document(content, path);\n}\n\nfunction isDocumentLike(value: unknown): value is { content: string; path: string } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as Record<string, unknown>).content === \"string\" &&\n typeof (value as Record<string, unknown>).path === \"string\"\n );\n}\n\nfunction formatDiagnostics(diagnostics: readonly ValidationDiagnostic[]): string {\n return diagnostics.map((diagnostic) => `${diagnostic.path} ${diagnostic.message}`).join(\"; \");\n}\n","import { currentRunContext } from \"../../runtime/run-context/run-context-storage.js\";\n\n/** Ambient handle onto the active run's track-scoped durable key-value store. */\nexport const globalState = {\n async get<T = unknown>(key: string): Promise<T | undefined> {\n return currentRunContext().globalState.get<T>(key);\n },\n async set(key: string, value: unknown): Promise<void> {\n await currentRunContext().globalState.set(key, value);\n },\n async update<T = unknown>(\n key: string,\n updater: (current: T | undefined) => T | Promise<T>,\n ): Promise<T> {\n return await currentRunContext().globalState.update<T>(key, updater);\n },\n};\n","import { randomUUID } from \"node:crypto\";\n\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport type { Event } from \"../../runtime/run-workflow/run-workflow.types.js\";\n\nexport function createEvent(options: {\n readonly runId: string;\n readonly workflowId: string;\n readonly stepId?: string;\n readonly type: Event[\"type\"];\n readonly payload?: PlainObject;\n}): Event {\n return {\n id: `evt_${randomUUID()}`,\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: options.stepId,\n type: options.type,\n timestamp: new Date().toISOString(),\n schemaVersion: \"v0\",\n payload: options.payload ?? {},\n };\n}\n","import type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport { createEvent } from \"../../runtime/events/create-run-event.js\";\nimport { runContextStorage } from \"../../runtime/run-context/run-context-storage.js\";\n\nexport interface NotifyArtifact {\n readonly path: string;\n readonly mediaType?: string;\n readonly data?: PlainObject;\n}\n\nexport interface NotifyApi {\n progress(message: string, data?: PlainObject): Promise<void>;\n warning(message: string, data?: PlainObject): Promise<void>;\n artifact(name: string, artifact: NotifyArtifact): Promise<void>;\n}\n\nexport const notify: NotifyApi = {\n async progress(message, data) {\n await emitNotification(\"step.progress\", { message, ...(data === undefined ? {} : { data }) });\n },\n async warning(message, data) {\n await emitNotification(\"step.warning\", { message, ...(data === undefined ? {} : { data }) });\n },\n async artifact(name, artifact) {\n await emitNotification(\"step.artifact\", {\n name,\n path: artifact.path,\n ...(artifact.mediaType === undefined ? {} : { mediaType: artifact.mediaType }),\n ...(artifact.data === undefined ? {} : { data: artifact.data }),\n });\n },\n};\n\nasync function emitNotification(\n type: \"step.progress\" | \"step.warning\" | \"step.artifact\",\n payload: PlainObject,\n): Promise<void> {\n const runContext = runContextStorage.getStore();\n if (!runContext?.workflowId || !runContext.emit) {\n throw new Error(\"notify.* called outside an active TrailStep run.\");\n }\n\n await runContext.emit(\n createEvent({\n runId: runContext.id,\n workflowId: runContext.workflowId,\n ...(runContext.currentStep === undefined ? {} : { stepId: runContext.currentStep.id }),\n type,\n payload,\n }),\n );\n}\n","import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/**\n * Synchronously reads each named file relative to `dir` and returns its\n * trimmed content keyed the same way, so a step's `prompt.ts` can load all\n * of its shared markdown fragments in one call:\n * `loadFragments(import.meta.dirname, { methodology: \"../shared/methodology.md\" })`.\n */\nexport function loadFragments<TKey extends string>(\n dir: string,\n files: Record<TKey, string>,\n): Record<TKey, string> {\n const fragments = {} as Record<TKey, string>;\n\n for (const key of Object.keys(files) as TKey[]) {\n fragments[key] = readFileSync(join(dir, files[key]), \"utf8\").trimEnd();\n }\n\n return fragments;\n}\n\n/**\n * Renders `body` as a `## title` markdown section, or `undefined` when\n * `body` is falsy -- so a conditional section can be inlined directly as a\n * `promptSections(...)` argument instead of built up separately.\n */\nexport function section(\n title: string,\n body: string | false | null | undefined,\n): string | undefined {\n return body ? `## ${title}\\n\\n${body.trimEnd()}` : undefined;\n}\n\n/**\n * Joins prompt fragments and `section(...)` results with a blank line\n * between each, dropping any falsy (conditionally-omitted) part.\n */\nexport function promptSections(...parts: ReadonlyArray<string | false | null | undefined>): string {\n return parts.filter((part): part is string => Boolean(part)).join(\"\\n\\n\");\n}\n\n/** Renders `items` as a markdown bullet list, one `- item` per line. */\nexport function list(items: readonly string[]): string {\n return items.map((item) => `- ${item}`).join(\"\\n\");\n}\n","import type { PromptTemplateSource } from \"../step/continuation.types.js\";\n\n/** Loads a step's prompt from a local text file, resolved relative to the workflow/project `cwd` at dispatch time. */\nexport function promptTemplate(path: string): PromptTemplateSource {\n return { kind: \"promptTemplate\", path };\n}\n","import { Ajv, type ErrorObject, type JSONSchemaType } from \"ajv/dist/ajv.js\";\n\nimport { TrailStepFailureError, validationFailure } from \"../../contracts/failures/failure.js\";\nimport type {\n PlainObject,\n Schema,\n ShapeInput,\n ShapeObject,\n ValidationDiagnostic,\n} from \"../../contracts/shapes/shape.types.js\";\n\nexport type JsonSchemaObject = JSONSchemaType<PlainObject> | Record<string, unknown>;\n\nconst ajv = new Ajv({ allErrors: true });\n\nexport function normalizeShape<T extends PlainObject>(shapeInput: ShapeInput<T>): Schema<T> {\n if (isSchema(shapeInput)) {\n return shapeInput;\n }\n\n return shape<T>(shapeInput);\n}\n\nexport function shape<T extends PlainObject>(shapeObject: ShapeObject): Schema<T> {\n return jsonSchema<T>({\n type: \"object\",\n properties: Object.fromEntries(\n Object.entries(shapeObject).map(([key, type]) => [key, { type }]),\n ),\n required: Object.keys(shapeObject),\n additionalProperties: false,\n });\n}\n\nexport function jsonSchema<T extends PlainObject>(schema: JsonSchemaObject): Schema<T> {\n const validateWithAjv = ajv.compile(schema);\n\n return {\n validate(value: unknown): value is T {\n return validateWithAjv(value);\n },\n diagnostics(value: unknown): readonly ValidationDiagnostic[] {\n if (!isPlainObject(value)) {\n return [{ path: \"/\", message: \"must be a plain object\" }];\n }\n\n if (validateWithAjv(value)) {\n return [];\n }\n\n return diagnosticsFromAjvErrors(validateWithAjv.errors);\n },\n assert(value: unknown, label = \"value\"): T {\n const diagnostics = this.diagnostics(value);\n\n if (diagnostics.length > 0) {\n throw new TrailStepFailureError(\n validationFailure(\n `${label} failed schema validation: ${formatDiagnostics(diagnostics)}`,\n { diagnostics },\n ),\n );\n }\n\n return value as T;\n },\n jsonSchema: schema as Record<string, unknown>,\n };\n}\n\nfunction isSchema<T extends PlainObject>(value: ShapeInput<T>): value is Schema<T> {\n // Checked structurally rather than via `isPlainObject` so that a class\n // carrying its schema as static members (e.g. `Document`) -- a function,\n // not a plain object -- is recognized as a `Schema<T>` too.\n if (value === null || (typeof value !== \"object\" && typeof value !== \"function\")) {\n return false;\n }\n\n const candidate = value as Record<string, unknown>;\n\n return (\n typeof candidate.validate === \"function\" &&\n typeof candidate.diagnostics === \"function\" &&\n typeof candidate.assert === \"function\"\n );\n}\n\nexport function isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\nfunction diagnosticsFromAjvErrors(\n errors: ErrorObject[] | null | undefined,\n): readonly ValidationDiagnostic[] {\n if (!errors || errors.length === 0) {\n return [{ path: \"/\", message: \"is invalid\" }];\n }\n\n return errors.map((error) => ({\n path: error.instancePath || \"/\",\n message: error.message ?? \"is invalid\",\n }));\n}\n\nfunction formatDiagnostics(diagnostics: readonly ValidationDiagnostic[]): string {\n return diagnostics.map((diagnostic) => `${diagnostic.path} ${diagnostic.message}`).join(\"; \");\n}\n","import { currentRunContext } from \"../../runtime/run-context/run-context-storage.js\";\n\n/**\n * Ambient handle onto the active run's identity and durable key-value store.\n * Backed by AsyncLocalStorage, set once per run by `runWorkflow`; step\n * continuations import this directly rather than receiving it as an argument.\n */\nexport const state = {\n async get<T = unknown>(key: string): Promise<T | undefined> {\n return currentRunContext().state.get<T>(key);\n },\n async getPersisted<T = unknown>(key: string): Promise<T | undefined> {\n return currentRunContext().state.getPersisted<T>(key);\n },\n async set(key: string, value: unknown): Promise<void> {\n const context = currentRunContext();\n await context.state.set(key, value, {\n persist: context.currentStep?.replay?.kind !== \"completed-step\",\n });\n },\n get id(): string {\n return currentRunContext().id;\n },\n get name(): string {\n return currentRunContext().name;\n },\n get path(): string {\n return currentRunContext().path;\n },\n get cwd(): string | undefined {\n return currentRunContext().cwd;\n },\n get executionCwd(): string | undefined {\n return currentRunContext().executionCwd ?? currentRunContext().cwd;\n },\n get isReplayingCompletedStep(): boolean {\n return currentRunContext().currentStep?.replay?.kind === \"completed-step\";\n },\n get projectCwd(): string | undefined {\n return currentRunContext().projectCwd;\n },\n};\n","import type { AgentPrompt } from \"../../contracts/agents/agent-adapter.types.js\";\nimport type { Failure } from \"../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport type {\n AbsoluteDoneNode,\n AbsoluteFailNode,\n CheckWaitCallback,\n ContinuationArray,\n ContinuationStepConfig,\n DisplayPhase,\n DoneNode,\n DoPhase,\n FailNode,\n ParallelNode,\n ParallelOptions,\n PostContinuation,\n PromptOptions,\n PromptPhase,\n PromptTemplateSource,\n StepConfig,\n StepContextContinuation,\n StepContinuation,\n StepDisplayContent,\n StepErrorContinuation,\n StepFactory,\n StepInvocationOptions,\n StepNode,\n StepPhase,\n TerminalMessageOptions,\n WaitInput,\n WaitOptions,\n WaitPhase,\n WorkflowInvocationNode,\n} from \"../step/continuation.types.js\";\n\n/**\n * The only step-authoring primitive. `.prompt(...)` is optional; when present,\n * the step dispatches to an agent and `.do(...)` receives its structured\n * output. When absent, nothing is dispatched -- `.do(...)` receives the\n * step's input directly and is responsible for the work and the continuation\n * in one function. Either way, `.do(...)` produces a reusable `StepFactory`\n * -- call it with a live input value (`stepA(input)`) to get a `StepNode`.\n * When the inferred input type has no required keys, the argument is\n * optional (`stepA()`) and defaults to `{}`.\n */\ninterface StepBuilder {\n display(\n content?: StepDisplayContent<PlainObject, PlainObject>,\n options?: PlainObject,\n ): StepBuilder;\n wait(wait: WaitInput<PlainObject, PlainObject>): StepBuilder;\n wait<TWaitOutput extends PlainObject = PlainObject>(\n wait: CheckWaitCallback<PlainObject, PlainObject, TWaitOutput>,\n options: WaitOptions<TWaitOutput>,\n ): StepBuilder;\n prompt<TInput extends PlainObject = PlainObject, TOutput extends PlainObject = PlainObject>(\n source: AgentPrompt<TInput> | PromptTemplateSource,\n options?: PromptOptions<TOutput>,\n ): PromptedStepBuilder<TInput, TOutput>;\n do<TInput extends PlainObject = PlainObject>(\n onOutput: StepContextContinuation<TInput, TInput>,\n ): FluentStepFactory<TInput, TInput>;\n do<TInput extends PlainObject = PlainObject>(\n onOutput: StepContinuation<TInput, TInput>,\n ): FluentStepFactory<TInput, TInput>;\n}\n\ninterface PromptedStepBuilder<\n TInput extends PlainObject = PlainObject,\n TOutput extends PlainObject = PlainObject,\n> {\n display(\n content?: StepDisplayContent<TInput, TOutput>,\n options?: PlainObject,\n ): PromptedStepBuilder<TInput, TOutput>;\n wait(wait: WaitInput<TInput, TOutput>): PromptedStepBuilder<TInput, TOutput>;\n wait<TWaitOutput extends PlainObject = PlainObject>(\n wait: CheckWaitCallback<TInput, TOutput, TWaitOutput>,\n options: WaitOptions<TWaitOutput>,\n ): PromptedStepBuilder<TInput, TOutput>;\n do(onOutput: StepContextContinuation<TInput, TOutput>): FluentStepFactory<TInput, TOutput>;\n do(onOutput: StepContinuation<TInput, TOutput>): FluentStepFactory<TInput, TOutput>;\n}\n\ntype FluentStepFactory<\n TInput extends PlainObject = PlainObject,\n TOutput extends PlainObject = PlainObject,\n> = StepFactory<TInput, TOutput> & {\n catch(onError: StepErrorContinuation): FluentStepFactory<TInput, TOutput>;\n display(\n content?: StepDisplayContent<TInput, TOutput>,\n options?: PlainObject,\n ): FluentStepFactory<TInput, TOutput>;\n wait(wait: WaitInput<TInput, TOutput>): FluentStepFactory<TInput, TOutput>;\n wait<TWaitOutput extends PlainObject = PlainObject>(\n wait: CheckWaitCallback<TInput, TOutput, TWaitOutput>,\n options: WaitOptions<TWaitOutput>,\n ): FluentStepFactory<TInput, TOutput>;\n};\n\nexport function step(config: StepConfig): StepBuilder {\n const makeBuilder = (phaseTemplates: readonly StepPhase[] = []): StepBuilder => ({\n display(content, options) {\n return makeBuilder([...phaseTemplates, displayPhase(content, options)]);\n },\n wait(\n wait: WaitInput<PlainObject, PlainObject> | CheckWaitCallback<PlainObject, PlainObject>,\n options?: WaitOptions,\n ) {\n return makeBuilder([...phaseTemplates, waitPhase(wait, options)]);\n },\n prompt<TInput extends PlainObject = PlainObject, TStepOutput extends PlainObject = PlainObject>(\n source: AgentPrompt<TInput> | PromptTemplateSource,\n options?: PromptOptions<TStepOutput>,\n ) {\n assertPromptOptions(options);\n return makePromptedBuilder<TInput, TStepOutput>([\n ...(phaseTemplates as readonly StepPhase<TInput, TStepOutput>[]),\n promptPhase(source, options),\n ]);\n },\n do<TInput extends PlainObject = PlainObject>(onOutput: StepContinuation<TInput, TInput>) {\n return buildFactory<TInput, TInput>(\n [...(phaseTemplates as readonly StepPhase<TInput, TInput>[]), doPhase(onOutput)],\n onOutput,\n );\n },\n });\n\n const makePromptedBuilder = <TInput extends PlainObject, TStepOutput extends PlainObject>(\n phaseTemplates: readonly StepPhase<TInput, TStepOutput>[],\n ): PromptedStepBuilder<TInput, TStepOutput> => ({\n display(content, options) {\n return makePromptedBuilder([...phaseTemplates, displayPhase(content, options)]);\n },\n wait(\n wait: WaitInput<TInput, TStepOutput> | CheckWaitCallback<TInput, TStepOutput>,\n options?: WaitOptions,\n ) {\n return makePromptedBuilder([...phaseTemplates, waitPhase(wait, options)]);\n },\n do(onOutput) {\n return buildFactory([...phaseTemplates, doPhase(onOutput)], onOutput);\n },\n });\n\n const buildFactory = <TInput extends PlainObject, TStepOutput extends PlainObject>(\n phaseTemplates: readonly StepPhase<TInput, TStepOutput>[],\n onOutput: StepContinuation<TInput, TStepOutput> | StepContextContinuation<TInput, TStepOutput>,\n onError?: StepErrorContinuation,\n ): FluentStepFactory<TInput, TStepOutput> => {\n const factory = ((\n input?: TInput,\n options?: StepInvocationOptions,\n ): StepNode<TInput, TStepOutput> => {\n const phases = phaseTemplates.slice();\n const prompt = firstPromptPhase(phases);\n const { branchId: _branchId, ...configOverrides } = options ?? {};\n\n return {\n kind: \"step\",\n config: {\n ...config,\n ...configOverrides,\n ...(prompt ? promptOptionsForConfig(prompt) : {}),\n input: input ?? ({} as TInput),\n } as ContinuationStepConfig<TInput, TStepOutput>,\n phases,\n onOutput: onOutput as StepContinuation<TInput, TStepOutput>,\n onError,\n ...(options === undefined ? {} : { options }),\n };\n }) as FluentStepFactory<TInput, TStepOutput>;\n\n factory.catch = (nextOnError: StepErrorContinuation) =>\n buildFactory(phaseTemplates, onOutput, nextOnError);\n factory.display = (content?: StepDisplayContent<TInput, TStepOutput>, options?: PlainObject) =>\n buildFactory([...phaseTemplates, displayPhase(content, options)], onOutput, onError);\n factory.wait = (\n wait: WaitInput<TInput, TStepOutput> | CheckWaitCallback<TInput, TStepOutput>,\n options?: WaitOptions,\n ) => buildFactory([...phaseTemplates, waitPhase(wait, options)], onOutput, onError);\n\n return factory;\n };\n\n return makeBuilder();\n}\n\nexport function done<TOutput extends PlainObject = PlainObject>(\n output?: TOutput,\n options?: TerminalMessageOptions,\n): DoneNode<TOutput> {\n return {\n kind: \"done\",\n output: output ?? ({} as TOutput),\n ...(options?.message === undefined ? {} : { message: options.message }),\n };\n}\n\nexport function fail(failure: Failure, options?: TerminalMessageOptions): FailNode {\n return {\n kind: \"fail\",\n failure,\n ...(options?.message === undefined ? {} : { message: options.message }),\n };\n}\n\nexport function absoluteDone<TOutput extends PlainObject = PlainObject>(\n output?: TOutput,\n options?: TerminalMessageOptions,\n): AbsoluteDoneNode<TOutput> {\n return {\n kind: \"absoluteDone\",\n output: output ?? ({} as TOutput),\n ...(options?.message === undefined ? {} : { message: options.message }),\n };\n}\n\nexport function absoluteFail(failure: Failure, options?: TerminalMessageOptions): AbsoluteFailNode {\n return {\n kind: \"absoluteFail\",\n failure,\n ...(options?.message === undefined ? {} : { message: options.message }),\n };\n}\n\nexport function parallel<TOutput extends PlainObject = PlainObject>(\n nodes: ContinuationArray,\n options?: ParallelOptions,\n): ParallelNode<TOutput> {\n const makeParallel = (postContinuation?: PostContinuation<TOutput>): ParallelNode<TOutput> => ({\n kind: \"parallel\",\n nodes,\n ...(options === undefined ? {} : { options }),\n ...(postContinuation === undefined ? {} : { postContinuation }),\n post(continuation: PostContinuation<TOutput>) {\n return makeParallel(continuation);\n },\n });\n\n return makeParallel();\n}\n\nexport function isStepNode(value: unknown): value is StepNode {\n return isPlainObject(value) && value.kind === \"step\";\n}\n\nexport function isDoneNode(value: unknown): value is DoneNode {\n return isPlainObject(value) && value.kind === \"done\";\n}\n\nexport function isFailNode(value: unknown): value is FailNode {\n return isPlainObject(value) && value.kind === \"fail\";\n}\n\nexport function isWorkflowInvocationNode(value: unknown): value is WorkflowInvocationNode {\n return isPlainObject(value) && value.kind === \"workflowInvocation\";\n}\n\nexport function isParallelNode(value: unknown): value is ParallelNode {\n return isPlainObject(value) && value.kind === \"parallel\" && Array.isArray(value.nodes);\n}\n\nexport function isAbsoluteDoneNode(value: unknown): value is AbsoluteDoneNode {\n return isPlainObject(value) && value.kind === \"absoluteDone\";\n}\n\nexport function isAbsoluteFailNode(value: unknown): value is AbsoluteFailNode {\n return isPlainObject(value) && value.kind === \"absoluteFail\";\n}\n\n/** Returns a step's ordered phases, synthesizing phases for legacy StepNode-shaped objects. */\nexport function getStepPhases<\n TInput extends PlainObject = PlainObject,\n TOutput extends PlainObject = PlainObject,\n>(node: StepNode<TInput, TOutput>): readonly StepPhase<TInput, TOutput>[] {\n if (Array.isArray(node.phases)) {\n return node.phases;\n }\n\n const phases: StepPhase<TInput, TOutput>[] = [];\n if (node.config.prompt !== undefined) {\n phases.push(\n promptPhase(node.config.prompt, {\n ...(node.config.output === undefined ? {} : { output: node.config.output }),\n ...(node.config.agent === undefined ? {} : { agent: node.config.agent }),\n ...(node.config.mode === undefined ? {} : { mode: node.config.mode }),\n ...(node.config.adapter === undefined ? {} : { adapter: node.config.adapter }),\n ...(node.config.maxSubPrompts === undefined\n ? {}\n : { maxSubPrompts: node.config.maxSubPrompts }),\n }),\n );\n }\n phases.push(doPhase(node.onOutput));\n return phases;\n}\n\nexport function hasPromptPhase(node: StepNode): boolean {\n return getStepPhases(node).some((phase) => phase.kind === \"prompt\");\n}\n\nexport function firstPromptPhase(phases: readonly StepPhase[]): PromptPhase | undefined {\n return phases.find((phase): phase is PromptPhase => phase.kind === \"prompt\");\n}\n\nfunction displayPhase<TInput extends PlainObject, TOutput extends PlainObject>(\n content?: StepDisplayContent<TInput, TOutput>,\n options?: PlainObject,\n): DisplayPhase<TInput, TOutput> {\n return {\n kind: \"display\",\n ...(content === undefined ? {} : { content }),\n ...(options === undefined ? {} : { options }),\n };\n}\n\nfunction waitPhase<TInput extends PlainObject, TOutput extends PlainObject>(\n wait: WaitInput<TInput, TOutput> | CheckWaitCallback<TInput, TOutput>,\n options?: WaitOptions,\n): WaitPhase<TInput, TOutput> {\n return {\n kind: \"wait\",\n wait,\n ...(options === undefined ? {} : { options }),\n };\n}\n\nfunction promptPhase<TInput extends PlainObject, TOutput extends PlainObject>(\n prompt: AgentPrompt<TInput> | PromptTemplateSource,\n options?: PromptOptions<TOutput>,\n): PromptPhase<TInput, TOutput> {\n return {\n kind: \"prompt\",\n ...options,\n prompt,\n };\n}\n\nfunction doPhase<TInput extends PlainObject, TOutput extends PlainObject>(\n onOutput: StepContinuation<TInput, TOutput> | StepContextContinuation<TInput, TOutput>,\n): DoPhase<TInput, TOutput> {\n return { kind: \"do\", onOutput: onOutput as StepContinuation<TInput, TOutput> };\n}\n\nfunction promptOptionsForConfig<TInput extends PlainObject, TOutput extends PlainObject>(\n phase: PromptPhase<TInput, TOutput>,\n): Omit<PromptPhase<TInput, TOutput>, \"kind\"> {\n const { kind: _kind, ...options } = phase;\n return options;\n}\n\nfunction assertPromptOptions(value: unknown): void {\n if (hasRetryOption(value)) {\n throw new TypeError(\"Retry config belongs on step(...), not .prompt(...) options.\");\n }\n\n if (hasTimeoutOption(value)) {\n throw new TypeError(\"Timeout config belongs on step(...), not .prompt(...) options.\");\n }\n}\n\nfunction hasRetryOption(value: unknown): boolean {\n return isPlainObject(value) && \"retry\" in value;\n}\n\nfunction hasTimeoutOption(value: unknown): boolean {\n return isPlainObject(value) && \"timeout\" in value;\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\n\nimport { runAgentStep } from \"../../agent-execution/adapter-agent/run-adapter-agent-step/run-adapter-agent-step.js\";\nimport {\n resolvePromptSource,\n resolveWorkflowAgentRole,\n} from \"../../agent-execution/dispatch-agent-step/dispatch-agent-step.js\";\nimport { runWorkingAgentCommand } from \"../../agent-execution/working-agent/run-working-agent-command.js\";\nimport { normalizeShape } from \"../../authoring/shape/json-schema.js\";\nimport type {\n PromptTemplateSource,\n SubPromptOptions,\n} from \"../../authoring/step/continuation.types.js\";\nimport type { AgentPrompt } from \"../../contracts/agents/agent-adapter.types.js\";\nimport { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport { createEvent } from \"../events/create-run-event.js\";\nimport { runContextStorage } from \"../run-context/run-context-storage.js\";\nimport { resolveSubPromptArtifactPaths } from \"./sub-prompt-artifacts.js\";\nimport {\n emitSubPromptFailed,\n maxSubPromptsGuardError,\n subPromptFailureError,\n throwMissingSubPromptAgentConfig,\n} from \"./sub-prompt-failures.js\";\nimport { fingerprintSubPrompt } from \"./sub-prompt-fingerprint.js\";\nimport { findCompletedSubPromptEvent } from \"./sub-prompt-replay.js\";\n\nexport function resolveMaxSubPrompts(value: unknown): number {\n if (value === undefined) {\n return 25;\n }\n\n if (Number.isInteger(value) && typeof value === \"number\" && value > 0) {\n return value;\n }\n\n throw new TrailStepFailureError({\n code: \"invalid_max_sub_prompts\",\n message: \"maxSubPrompts must be a positive integer.\",\n });\n}\n\nexport async function runSubPrompt<\n TInput extends PlainObject = PlainObject,\n TOutput extends PlainObject = PlainObject,\n>(\n source: AgentPrompt<TInput> | PromptTemplateSource,\n options: SubPromptOptions<TOutput>,\n input?: TInput,\n): Promise<TOutput> {\n const resolvedInput = (input ?? {}) as TInput;\n const context = runContextStorage.getStore();\n if (!context?.currentStep) {\n throw new TrailStepFailureError({\n code: \"sub_prompt_outside_step_context\",\n message: \"subPrompt requires an active TrailStep step run context.\",\n });\n }\n\n if (!context.workflowId || !context.workflowAgents || !context.cwd || !context.emit) {\n throw new TrailStepFailureError({\n code: \"sub_prompt_context_unavailable\",\n message: \"subPrompt requires a full active TrailStep step run context.\",\n });\n }\n\n const parentStep = context.currentStep;\n if (options.output === undefined) {\n throw new TrailStepFailureError({\n code: \"sub_prompt_output_required\",\n message: `subPrompt in step ${parentStep.id} with a prompt requires an output shape`,\n });\n }\n\n const outputSchema = normalizeShape(options.output);\n const ordinal = parentStep.nextSubPromptIndex();\n const maxSubPrompts = resolveMaxSubPrompts(options.maxSubPrompts ?? parentStep.maxSubPrompts);\n if (ordinal > maxSubPrompts) {\n const failureError = maxSubPromptsGuardError(maxSubPrompts);\n await emitSubPromptFailed({\n context,\n parentStepId: parentStep.id,\n ordinal,\n failure: failureError.failure,\n });\n throw failureError;\n }\n\n const renderedPrompt = await resolvePromptSource(\n source,\n resolvedInput,\n context.projectCwd ?? context.cwd,\n );\n const fingerprint = fingerprintSubPrompt({ input: resolvedInput, prompt: renderedPrompt });\n const cachedEvent = findCompletedSubPromptEvent(\n context.events?.() ?? [],\n parentStep.id,\n ordinal,\n fingerprint,\n );\n if (cachedEvent) {\n return outputSchema.assert(cachedEvent.payload.output, \"subPrompt output\");\n }\n\n const artifactPaths = resolveSubPromptArtifactPaths({\n runDir: context.path,\n stepDir: parentStep.dir,\n ordinal,\n fingerprint,\n });\n\n await mkdir(artifactPaths.subPromptDir, { recursive: true });\n await writeFile(artifactPaths.promptFile, renderedPrompt, \"utf8\");\n\n const resolvedRole = resolveWorkflowAgentRole({\n agent: options.agent,\n workflowAgents: context.workflowAgents,\n workflowId: context.workflowId,\n stepId: parentStep.id,\n });\n\n await context.emit(\n createEvent({\n runId: context.id,\n workflowId: context.workflowId,\n stepId: parentStep.id,\n type: \"subPrompt.started\",\n payload: {\n parentStepId: parentStep.id,\n ordinal,\n fingerprint,\n artifactPaths: artifactPaths.runRelative,\n },\n }),\n );\n\n try {\n const agentStep = {\n kind: \"agent\" as const,\n id: `${parentStep.id}.subPrompt.${ordinal}`,\n output: outputSchema,\n prompt: renderedPrompt,\n requirements: resolvedRole.role,\n adapter: options.adapter,\n };\n\n if (!context.trailstepConfig && options.adapter === undefined) {\n throwMissingSubPromptAgentConfig({\n workflowId: context.workflowId,\n parentStepId: parentStep.id,\n subPromptId: agentStep.id,\n agent: resolvedRole.roleName,\n });\n }\n\n const rawOutput =\n context.trailstepConfig && options.adapter === undefined\n ? await runWorkingAgentCommand({\n config: context.trailstepConfig,\n workflowId: context.workflowId,\n roleName: resolvedRole.roleName,\n role: resolvedRole.role,\n step: agentStep,\n renderedPrompt,\n runDir: context.path,\n cwd: context.cwd,\n runner: context.workingAgentProcessRunner,\n providerWorkingRunner: context.providerWorkingRunner,\n stepIndex: ordinal,\n files: {\n stepDir: artifactPaths.subPromptDir,\n promptFile: artifactPaths.promptFile,\n outputFile: artifactPaths.outputFile,\n usageFile: artifactPaths.usageFile,\n },\n })\n : await runAgentStep({\n step: agentStep,\n input: resolvedInput,\n onToolCall: async (toolCall) => {\n await context.emit?.(\n createEvent({\n runId: context.id,\n workflowId: context.workflowId ?? \"\",\n stepId: parentStep.id,\n type: \"agent.toolCall\",\n payload: { ...toolCall },\n }),\n );\n },\n });\n\n const output = outputSchema.assert(rawOutput, \"subPrompt output\");\n await writeFile(artifactPaths.outputFile, `${JSON.stringify(output, null, 2)}\\n`, \"utf8\");\n\n await context.emit(\n createEvent({\n runId: context.id,\n workflowId: context.workflowId,\n stepId: parentStep.id,\n type: \"subPrompt.completed\",\n payload: {\n parentStepId: parentStep.id,\n ordinal,\n fingerprint,\n output,\n artifactPaths: artifactPaths.runRelative,\n },\n }),\n );\n\n return output;\n } catch (error) {\n const failureError = subPromptFailureError(error);\n await emitSubPromptFailed({\n context,\n parentStepId: parentStep.id,\n ordinal,\n fingerprint,\n artifactPaths: artifactPaths.runRelative,\n failure: failureError.failure,\n });\n throw failureError;\n }\n}\n","import type { AgentStepRequestConfig } from \"../../../authoring/step/agent-step.types.js\";\nimport type {\n AgentAdapter,\n AgentAdapterSelection,\n AgentPrompt,\n AgentTool,\n} from \"../../../contracts/agents/agent-adapter.types.js\";\nimport type { AgentModelTarget } from \"../../../contracts/agents/agent-role.types.js\";\nimport { TrailStepFailureError } from \"../../../contracts/failures/failure.js\";\nimport type { PlainObject, Schema } from \"../../../contracts/shapes/shape.types.js\";\n\nconst PROVIDER_NEUTRAL_ADAPTER_KEY = \"custom\";\nconst PROVIDER_NEUTRAL_MODEL = \"configured-agent\";\n\nexport interface AgentToolCallEvent {\n readonly name: string;\n readonly input: PlainObject;\n readonly output: PlainObject;\n}\n\nexport interface RunAgentStepOptions<\n TInput extends PlainObject = PlainObject,\n TOutput extends PlainObject = PlainObject,\n> {\n readonly step: AgentStepRequestConfig<TInput, TOutput>;\n readonly input: TInput;\n readonly onToolCall?: (event: AgentToolCallEvent) => void | Promise<void>;\n}\n\nexport async function runAgentStep<\n TInput extends PlainObject = PlainObject,\n TOutput extends PlainObject = PlainObject,\n>(options: RunAgentStepOptions<TInput, TOutput>): Promise<PlainObject> {\n const model = resolveAgentRequirements(options.step.requirements);\n const adapter = resolveAgentAdapter(options.step.adapter);\n let submittedOutput: PlainObject | undefined;\n\n const tools: AgentTool<TOutput>[] = [\n createSubmitOutputTool(options.step.output, async (output) => {\n options.step.output.assert(output, `agent step ${options.step.id} submit_output`);\n submittedOutput = output;\n await options.onToolCall?.({\n name: \"submit_output\",\n input: output,\n output: { accepted: true },\n });\n }),\n ];\n\n const prompt = renderAgentPrompt(options.step.prompt, options.input);\n\n await adapter({\n messages: [{ role: \"user\", content: prompt }],\n tools,\n requirements: options.step.requirements,\n model,\n step: options.step,\n input: options.input,\n });\n\n if (submittedOutput === undefined) {\n throw new TrailStepFailureError({\n code: \"agent_output_missing\",\n message: `Agent step ${options.step.id} did not call submit_output.`,\n });\n }\n\n return submittedOutput;\n}\n\nexport function renderAgentPrompt<TInput extends PlainObject>(\n prompt: AgentPrompt<TInput>,\n input: TInput,\n): string {\n return typeof prompt === \"function\" ? prompt({ input }) : prompt;\n}\n\nexport function resolveAgentRequirements(\n requirements: AgentStepRequestConfig[\"requirements\"],\n): AgentModelTarget {\n return {\n adapterKey: PROVIDER_NEUTRAL_ADAPTER_KEY,\n model: requirements.name ?? requirements.size ?? PROVIDER_NEUTRAL_MODEL,\n };\n}\n\nfunction resolveAgentAdapter<TInput extends PlainObject, TOutput extends PlainObject = PlainObject>(\n selection: AgentAdapterSelection<TInput, TOutput> | undefined,\n): AgentAdapter<TInput, TOutput> {\n if (typeof selection === \"function\") {\n return selection;\n }\n\n if (typeof selection === \"object\" && selection !== null) {\n return (request) => selection.runAgentStep(request);\n }\n\n throw new TrailStepFailureError({\n code: \"agent_adapter_unavailable\",\n message:\n \"Agent steps that do not use a configured command runner require a custom adapter function or adapter object.\",\n });\n}\n\nfunction createSubmitOutputTool<TOutput extends PlainObject>(\n schema: Schema<TOutput>,\n onOutput: (output: TOutput) => void | Promise<void>,\n): AgentTool<TOutput> {\n return {\n name: \"submit_output\",\n description: \"Submit the typed output for this TrailStep agent step.\",\n schema,\n async call(input) {\n await onOutput(input);\n },\n };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport type { TrailStepConfig } from \"../../agent-targeting/targeting.types.js\";\nimport type {\n ContinuationStepConfig,\n PromptTemplateSource,\n} from \"../../authoring/step/continuation.types.js\";\nimport type { AgentPrompt } from \"../../contracts/agents/agent-adapter.types.js\";\nimport type { WorkflowAgentRole } from \"../../contracts/agents/agent-role.types.js\";\nimport { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type { PlainObject, Schema } from \"../../contracts/shapes/shape.types.js\";\nimport { resolveStepArtifactPaths } from \"../../runtime/artifacts/step-artifacts.js\";\nimport { createEvent } from \"../../runtime/events/create-run-event.js\";\nimport type { Event, RunWorkflowOptions } from \"../../runtime/run-workflow/run-workflow.types.js\";\nimport {\n renderAgentPrompt,\n runAgentStep,\n} from \"../adapter-agent/run-adapter-agent-step/run-adapter-agent-step.js\";\nimport { runInteractiveAgentCommand } from \"../interactive-agent/run-interactive-agent-command.js\";\nimport { runWorkingAgentCommand } from \"../working-agent/run-working-agent-command.js\";\n\n/**\n * Runs a prompt phase's agent dispatch: resolves the workflow agent role,\n * renders the prompt, and executes it in adapter, working, or interactive\n * mode. Steps with no prompt phase are never dispatched at all; their do\n * phase receives the step input directly.\n */\nexport async function dispatchAgentStep(options: {\n readonly config: ContinuationStepConfig & {\n readonly prompt: NonNullable<ContinuationStepConfig[\"prompt\"]>;\n };\n readonly outputSchema: Schema;\n readonly interactiveOutputMode: \"session-file\" | \"json\";\n readonly runId: string;\n readonly workflowId: string;\n readonly emit: (event: Event) => Promise<void>;\n readonly workflowAgents: Readonly<Record<string, WorkflowAgentRole>>;\n readonly runDir: string;\n readonly projectCwd: string;\n readonly cwd: string;\n readonly trailstepConfig: TrailStepConfig | undefined;\n readonly workingAgentProcessRunner: RunWorkflowOptions[\"workingAgentProcessRunner\"];\n readonly providerWorkingRunner: RunWorkflowOptions[\"providerWorkingRunner\"];\n readonly processRunner: RunWorkflowOptions[\"processRunner\"];\n readonly stepIndex: number;\n readonly signal?: AbortSignal;\n}): Promise<PlainObject> {\n const { config, outputSchema } = options;\n\n const resolvedRole = resolveWorkflowAgentRole({\n agent: config.agent,\n workflowAgents: options.workflowAgents,\n workflowId: options.workflowId,\n stepId: config.id,\n });\n\n const renderedPrompt = await resolvePromptSource(config.prompt, config.input, options.projectCwd);\n const agentMode = config.mode ?? \"working\";\n\n const agentStep = {\n kind: \"agent\" as const,\n id: config.id,\n output: outputSchema,\n prompt: renderedPrompt,\n requirements: resolvedRole.role,\n adapter: config.adapter,\n };\n\n if (!options.trailstepConfig && config.adapter === undefined) {\n throwMissingAgentConfig({\n workflowId: options.workflowId,\n stepId: config.id,\n agent: resolvedRole.roleName,\n mode: agentMode,\n });\n }\n\n if (options.trailstepConfig && agentMode === \"interactive\") {\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: config.id,\n type: \"interactive.sessionStarted\",\n payload: { roleName: resolvedRole.roleName, stepIndex: options.stepIndex },\n }),\n );\n const artifactPaths = resolveStepArtifactPaths({\n runDir: options.runDir,\n stepId: config.id,\n stepIndex: options.stepIndex,\n });\n const interactiveResult = await runInteractiveAgentCommand({\n config: options.trailstepConfig,\n workflowId: options.workflowId,\n roleName: resolvedRole.roleName,\n role: resolvedRole.role,\n stepId: config.id,\n renderedPrompt,\n runDir: options.runDir,\n cwd: options.cwd,\n runner: options.processRunner,\n outputSchema,\n outputMode: options.interactiveOutputMode,\n artifactPaths,\n signal: options.signal,\n });\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: config.id,\n type: \"interactive.sessionCompleted\",\n payload: {\n exitCode: interactiveResult.exitCode,\n outputMode: options.interactiveOutputMode,\n stepDir: artifactPaths.runRelativeStepDir,\n },\n }),\n );\n return interactiveResult.output;\n }\n\n return options.trailstepConfig && agentMode === \"working\"\n ? await runWorkingAgentCommand({\n config: options.trailstepConfig,\n workflowId: options.workflowId,\n roleName: resolvedRole.roleName,\n role: resolvedRole.role,\n step: agentStep,\n renderedPrompt,\n runDir: options.runDir,\n cwd: options.cwd,\n runner: options.workingAgentProcessRunner,\n providerWorkingRunner: options.providerWorkingRunner,\n onTargetAttempt: async (target) => {\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: config.id,\n type: \"step.progress\",\n payload: {\n message: `agent ${resolvedRole.roleName} via ${target.provider}${\n target.model === undefined ? \"\" : ` ${target.model}`\n }`,\n },\n }),\n );\n },\n stepIndex: options.stepIndex,\n signal: options.signal,\n })\n : await runAgentStep({\n step: agentStep,\n input: config.input,\n onToolCall: async (toolCall) => {\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: config.id,\n type: \"agent.toolCall\",\n payload: { ...toolCall },\n }),\n );\n },\n });\n}\n\n/**\n * Resolves a step's prompt source to a rendered string. A `promptTemplate(...)`\n * source is read from disk relative to the workflow/project `cwd`; a thrown/rejected\n * read propagates up through the same try/catch that already wraps step\n * dispatch, so an unreadable file becomes a normal step failure. Any other\n * source (string or callback) renders synchronously via `renderAgentPrompt`.\n */\nexport async function resolvePromptSource<TInput extends PlainObject>(\n source: AgentPrompt<TInput> | PromptTemplateSource,\n input: TInput,\n cwd: string,\n): Promise<string> {\n if (isPromptTemplateSource(source)) {\n return await readFile(resolve(cwd, source.path), \"utf8\");\n }\n\n return renderAgentPrompt(source, input);\n}\n\nfunction isPromptTemplateSource(\n source: AgentPrompt<PlainObject> | PromptTemplateSource,\n): source is PromptTemplateSource {\n return typeof source === \"object\" && source !== null && source.kind === \"promptTemplate\";\n}\n\nfunction throwMissingAgentConfig(options: {\n readonly workflowId: string;\n readonly stepId: string;\n readonly agent: string;\n readonly mode: \"working\" | \"interactive\";\n}): never {\n throw new TrailStepFailureError({\n code: \"missing_agent_config\",\n message: `Missing .trailstep/config.json: workflow ${options.workflowId} step ${options.stepId} needs configured ${options.mode} agent '${options.agent}'.`,\n details: {\n workflowId: options.workflowId,\n stepId: options.stepId,\n agent: options.agent,\n mode: options.mode,\n },\n });\n}\n\nconst DEFAULT_AGENT_ROLE_NAME = \"default\";\n\nconst BUILTIN_DEFAULT_AGENT_ROLE: WorkflowAgentRole = { size: \"default\" };\n\n/**\n * A step's `.agent` is optional. With none given, falls back to\n * `workflow.agents.default` if the workflow declares one, else a builtin\n * `{ size: \"default\" }` role — which `resolveAgentTargets` in turn resolves\n * against `.trailstep/config.json`'s unified `agents.default` mapping. An explicit `.agent(...)` naming an undeclared\n * role is still a hard error (typo protection).\n */\nexport function resolveWorkflowAgentRole(options: {\n readonly agent: string | undefined;\n readonly workflowAgents: Readonly<Record<string, WorkflowAgentRole>>;\n readonly workflowId: string;\n readonly stepId: string;\n}): { readonly role: WorkflowAgentRole; readonly roleName: string } {\n const roleName = options.agent ?? DEFAULT_AGENT_ROLE_NAME;\n const role = options.workflowAgents[roleName];\n\n if (role) {\n return { role, roleName };\n }\n\n if (options.agent === undefined) {\n return { role: BUILTIN_DEFAULT_AGENT_ROLE, roleName: DEFAULT_AGENT_ROLE_NAME };\n }\n\n throw new TrailStepFailureError({\n code: \"agent_role_unknown\",\n message: `Step ${options.stepId} references unknown agent role '${options.agent}' in workflow ${options.workflowId}. Declare workflow.agents.${options.agent} before referencing it with step agent.`,\n details: {\n workflowId: options.workflowId,\n stepId: options.stepId,\n agent: options.agent,\n declaredAgents: Object.keys(options.workflowAgents),\n },\n });\n}\n","import { join } from \"node:path\";\n\nexport interface WaitArtifactPaths {\n readonly requestFile: string;\n readonly answerFile: string;\n}\n\nexport interface ResolvedWaitArtifactPaths {\n readonly waitDir: string;\n readonly requestFile: string;\n readonly answerFile: string;\n readonly runRelative: WaitArtifactPaths;\n}\n\nexport interface StepArtifactPaths {\n readonly artifactStepId: string;\n readonly stepDir: string;\n readonly promptFile: string;\n readonly outputFile: string;\n readonly usageFile: string;\n readonly interactiveFile: string;\n readonly sessionDescriptionFile: string;\n readonly runRelativeStepDir: string;\n readonly runRelativeSessionDescriptionFile: string;\n}\n\nexport function resolveStepArtifactPaths(options: {\n readonly runDir: string;\n readonly stepId: string;\n readonly stepIndex: number;\n}): StepArtifactPaths {\n const artifactStepId = `${String(options.stepIndex).padStart(4, \"0\")}-${sanitizeStepId(\n options.stepId,\n )}`;\n const runRelativeStepDir = `steps/${artifactStepId}`;\n const runRelativeSessionDescriptionFile = `${runRelativeStepDir}/session-description.md`;\n const stepDir = join(options.runDir, \"steps\", artifactStepId);\n\n return {\n artifactStepId,\n stepDir,\n promptFile: join(stepDir, \"prompt.txt\"),\n outputFile: join(stepDir, \"output.json\"),\n usageFile: join(stepDir, \"usage.json\"),\n interactiveFile: join(stepDir, \"interactive.json\"),\n sessionDescriptionFile: join(stepDir, \"session-description.md\"),\n runRelativeStepDir,\n runRelativeSessionDescriptionFile,\n };\n}\n\nexport function resolveWaitArtifactPaths(options: {\n readonly runDir: string;\n readonly stepArtifactId: string;\n readonly waitId: string;\n}): ResolvedWaitArtifactPaths {\n const runRelativeWaitDir = `steps/${options.stepArtifactId}/waits/${options.waitId}`;\n const waitDir = join(options.runDir, \"steps\", options.stepArtifactId, \"waits\", options.waitId);\n\n return {\n waitDir,\n requestFile: join(waitDir, \"request.json\"),\n answerFile: join(waitDir, \"answer.json\"),\n runRelative: {\n requestFile: `${runRelativeWaitDir}/request.json`,\n answerFile: `${runRelativeWaitDir}/answer.json`,\n },\n };\n}\n\nfunction sanitizeStepId(stepId: string): string {\n return (\n stepId\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"step\"\n );\n}\n","import { spawn } from \"node:child_process\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { resolveAgentTargets } from \"../../agent-targeting/resolve-agent-targets/resolve-agent-targets.js\";\nimport type {\n TrailStepAgentTarget,\n TrailStepConfig,\n} from \"../../agent-targeting/targeting.types.js\";\nimport type { WorkflowAgentRole } from \"../../contracts/agents/agent-role.types.js\";\nimport { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type { PlainObject, Schema } from \"../../contracts/shapes/shape.types.js\";\nimport type { StepArtifactPaths } from \"../../runtime/artifacts/step-artifacts.js\";\nimport {\n isInteractiveCompleted,\n readCompletedInteractiveOutput,\n waitForInteractiveCompletion,\n} from \"../../runtime/interactive-session/interactive-session-protocol.js\";\nimport type {\n InteractiveProcessResult,\n InteractiveProcessRunner,\n} from \"../../runtime/run-workflow/run-workflow.types.js\";\nimport { renderCustomProviderArgs } from \"../custom-provider/render-custom-provider-args.js\";\n\nexport async function runInteractiveAgentCommand(options: {\n readonly config: TrailStepConfig;\n readonly workflowId: string;\n readonly roleName: string;\n readonly role: WorkflowAgentRole;\n readonly stepId: string;\n readonly renderedPrompt: string;\n readonly runDir: string;\n readonly cwd?: string;\n readonly outputSchema: Schema;\n readonly artifactPaths: StepArtifactPaths;\n readonly outputMode: \"session-file\" | \"json\";\n readonly runner?: InteractiveProcessRunner;\n readonly signal?: AbortSignal;\n}): Promise<{ readonly exitCode: number; readonly output: PlainObject }> {\n const [target] = resolveAgentTargets({\n config: options.config,\n workflowId: options.workflowId,\n roleName: options.roleName,\n roleSize: options.role.size,\n });\n\n if (!target) {\n throw new TrailStepFailureError({\n code: \"agent_targets_unavailable\",\n message: `No interactive agent targets found for role ${options.roleName} with size ${options.role.size} in workflow ${options.workflowId}.`,\n });\n }\n\n return await runInteractiveAgentTarget({ ...options, target });\n}\n\nasync function runInteractiveAgentTarget(options: {\n readonly config: TrailStepConfig;\n readonly workflowId: string;\n readonly roleName: string;\n readonly role: WorkflowAgentRole;\n readonly stepId: string;\n readonly renderedPrompt: string;\n readonly runDir: string;\n readonly cwd?: string;\n readonly outputSchema: Schema;\n readonly artifactPaths: StepArtifactPaths;\n readonly outputMode: \"session-file\" | \"json\";\n readonly runner?: InteractiveProcessRunner;\n readonly target: TrailStepAgentTarget;\n readonly signal?: AbortSignal;\n}): Promise<{ readonly exitCode: number; readonly output: PlainObject }> {\n const files = options.artifactPaths;\n const thinking = options.target.thinking ?? options.role.thinking;\n await prepareInteractiveArtifacts({\n files,\n runDir: options.runDir,\n stepId: options.stepId,\n outputSchema: options.outputSchema,\n outputMode: options.outputMode,\n });\n const prompt = buildInteractivePrompt({\n renderedPrompt: options.renderedPrompt,\n files,\n outputSchema: options.outputSchema,\n outputMode: options.outputMode,\n });\n const env = { ...definedProcessEnv(), TRAILSTEP_INTERACTIVE_FILE: files.interactiveFile };\n const executionCwd = options.cwd ?? files.stepDir;\n\n const abortController = new AbortController();\n options.signal?.addEventListener(\"abort\", () => abortController.abort(), { once: true });\n\n const manifestProvider = options.config.providers?.[options.target.provider];\n if (manifestProvider !== undefined && manifestProvider.source.type !== \"legacy-custom-provider\") {\n const interactive = manifestProvider.manifest.interactive;\n if (!interactive.supported || interactive.command === undefined) {\n throw new TrailStepFailureError({\n code: \"agent_provider_interactive_unsupported\",\n message: `Provider '${options.target.provider}' cannot run interactive agent steps because its provider manifest does not declare supported interactive execution.`,\n details: { provider: options.target.provider },\n });\n }\n\n const command = interactive.command;\n const args = renderCustomProviderArgs({\n argv: options.target.args ?? [\"{{prompt}}\"],\n values: {\n prompt,\n promptFile: files.promptFile,\n ...(options.target.model === undefined ? {} : { model: options.target.model }),\n ...(thinking === undefined ? {} : { thinking }),\n },\n errorCode: \"interactive_command_invalid\",\n commandDescription: \"Manifest interactive provider command\",\n });\n\n if (args.includes(files.promptFile)) {\n await mkdir(dirname(files.promptFile), { recursive: true });\n await writeFile(files.promptFile, prompt, \"utf8\");\n }\n\n return await runProcessUntilExitOrCompletion({\n stepId: options.stepId,\n target: options.target.provider,\n interactiveFile: files.interactiveFile,\n abortController,\n readOutput: async () => await readCompletedOutput(options),\n mapSpawnError: (error) =>\n new TrailStepFailureError({\n code: \"interactive_command_spawn_error\",\n message: `Interactive agent step ${options.stepId} could not start provider '${options.target.provider}'.`,\n details: {\n provider: options.target.provider,\n ...(options.target.model === undefined ? {} : { model: options.target.model }),\n cause: error instanceof Error ? error.message : String(error),\n },\n }),\n runProcess: async () =>\n await (options.runner ?? spawnInteractiveProcess)({\n command,\n args,\n cwd: executionCwd,\n shell: false,\n stdio: \"inherit\",\n env,\n signal: abortController.signal,\n }),\n });\n }\n\n const agentConfig = options.config.customProviders[options.target.provider];\n if (!agentConfig) {\n throw new TrailStepFailureError({\n code: \"agent_provider_unavailable\",\n message: `Interactive agent target '${options.target.provider}' does not reference a configured custom agent.`,\n details: { provider: options.target.provider },\n });\n }\n\n if (!agentConfig.interactiveArgs) {\n throw new TrailStepFailureError({\n code: \"agent_provider_interactive_unsupported\",\n message: `Custom provider '${options.target.provider}' cannot run interactive agent steps because customProviders.${options.target.provider}.interactiveArgs is not declared.`,\n details: { provider: options.target.provider },\n });\n }\n\n const args = renderCustomProviderArgs({\n argv: options.target.args ?? agentConfig.interactiveArgs,\n values: {\n prompt,\n promptFile: files.promptFile,\n ...(options.target.model === undefined ? {} : { model: options.target.model }),\n ...(thinking === undefined ? {} : { thinking }),\n },\n errorCode: \"interactive_command_invalid\",\n commandDescription: \"Interactive agent command\",\n });\n\n if (args.includes(files.promptFile)) {\n await mkdir(dirname(files.promptFile), { recursive: true });\n await writeFile(files.promptFile, prompt, \"utf8\");\n }\n\n return await runProcessUntilExitOrCompletion({\n stepId: options.stepId,\n target: options.target.provider,\n interactiveFile: files.interactiveFile,\n abortController,\n readOutput: async () => await readCompletedOutput(options),\n mapSpawnError: (error) =>\n new TrailStepFailureError({\n code: \"interactive_command_spawn_error\",\n message: `Interactive agent step ${options.stepId} could not start target '${options.target.provider}'.`,\n details: {\n target: options.target.provider,\n ...(options.target.model === undefined ? {} : { model: options.target.model }),\n cause: error instanceof Error ? error.message : String(error),\n },\n }),\n runProcess: async () =>\n await (options.runner ?? spawnInteractiveProcess)({\n command: agentConfig.binary,\n args,\n cwd: executionCwd,\n shell: false,\n stdio: \"inherit\",\n env,\n signal: abortController.signal,\n }),\n });\n}\n\nfunction definedProcessEnv(): Record<string, string> {\n return Object.fromEntries(\n Object.entries(process.env).filter(\n (entry): entry is [string, string] => entry[1] !== undefined,\n ),\n );\n}\n\nasync function runProcessUntilExitOrCompletion(options: {\n readonly stepId: string;\n readonly target: string;\n readonly interactiveFile: string;\n readonly abortController: AbortController;\n readonly runProcess: () => Promise<InteractiveProcessResult>;\n readonly readOutput: () => Promise<PlainObject>;\n readonly mapSpawnError?: (error: unknown) => TrailStepFailureError;\n}): Promise<{ readonly exitCode: number; readonly output: PlainObject }> {\n const processPromise = options.runProcess();\n void processPromise.catch(() => undefined);\n const watcherAbortController = new AbortController();\n\n const winner = await Promise.race<\n | { readonly type: \"completed\" }\n | { readonly type: \"process\"; readonly result: InteractiveProcessResult }\n | { readonly type: \"processError\"; readonly error: unknown }\n >([\n processPromise.then(\n (result) => ({ type: \"process\", result }) as const,\n (error) => ({ type: \"processError\", error }) as const,\n ),\n waitForInteractiveCompletion(options.interactiveFile, watcherAbortController.signal).then(\n () => ({ type: \"completed\" }) as const,\n ),\n ]);\n\n watcherAbortController.abort();\n\n if (winner.type === \"processError\") {\n throw options.mapSpawnError?.(winner.error) ?? winner.error;\n }\n\n if (winner.type === \"process\") {\n if (await isInteractiveCompleted(options.interactiveFile)) {\n return { exitCode: 0, output: await options.readOutput() };\n }\n\n if (winner.result.exitCode !== 0) {\n throw new TrailStepFailureError({\n code: \"interactive_session_failed\",\n message: `Interactive agent step ${options.stepId} exited with code ${winner.result.exitCode}.`,\n details: { exitCode: winner.result.exitCode, target: options.target },\n });\n }\n\n return { exitCode: winner.result.exitCode, output: await options.readOutput() };\n }\n\n options.abortController.abort();\n return { exitCode: 0, output: await options.readOutput() };\n}\n\nasync function prepareInteractiveArtifacts(options: {\n readonly files: StepArtifactPaths;\n readonly runDir: string;\n readonly stepId: string;\n readonly outputSchema: Schema;\n readonly outputMode: \"session-file\" | \"json\";\n}): Promise<void> {\n await mkdir(options.files.stepDir, { recursive: true });\n await writeFile(\n options.files.interactiveFile,\n `${JSON.stringify(\n {\n status: \"active\",\n stepId: options.stepId,\n artifactStepId: options.files.artifactStepId,\n outputMode: options.outputMode,\n runDir: options.runDir,\n stepDir: options.files.stepDir,\n promptFile: options.files.promptFile,\n outputFile: options.files.outputFile,\n interactiveFile: options.files.interactiveFile,\n ...(options.outputMode === \"session-file\"\n ? {\n sessionDescriptionFile: options.files.sessionDescriptionFile,\n runRelativeSessionDescriptionFile: options.files.runRelativeSessionDescriptionFile,\n }\n : {}),\n runRelativeStepDir: options.files.runRelativeStepDir,\n outputSchema: options.outputSchema.jsonSchema,\n },\n null,\n 2,\n )}\\n`,\n \"utf8\",\n );\n}\n\nfunction buildInteractivePrompt(options: {\n readonly renderedPrompt: string;\n readonly files: StepArtifactPaths;\n readonly outputSchema: Schema;\n readonly outputMode: \"session-file\" | \"json\";\n}): string {\n const preamble =\n options.outputMode === \"session-file\"\n ? [\n \"You are running inside a TrailStep interactive step.\",\n \"Write a dense session description to session-description.md in the current directory.\",\n \"preserve as much usable context as possible.\",\n \"describe the conversation rather than aggressively summarize it.\",\n \"include decisions, rejected options, tradeoffs, constraints, side comments, terminology, open questions, assumptions, file paths, commands, APIs, package names, examples, preferences, reasoning, and abandoned options.\",\n \"The goal is context preservation, not polish.\",\n \"Do not omit low-importance details merely because they seem minor.\",\n \"When complete, run: trailstep continue --session-file session-description.md\",\n ]\n : [\n \"You are running inside a TrailStep interactive step.\",\n \"Submit a JSON object matching this schema:\",\n JSON.stringify(options.outputSchema.jsonSchema, null, 2),\n \"When complete, run one of:\",\n \" trailstep continue --json-file output.json\",\n ` trailstep continue --json '${JSON.stringify(exampleJsonObject(options.outputSchema.jsonSchema))}'`,\n \"If validation fails, update the JSON so it matches the schema and run trailstep continue again.\",\n ];\n\n return [...preamble, \"\", \"## Original prompt\", options.renderedPrompt].join(\"\\n\");\n}\n\nasync function readCompletedOutput(options: {\n readonly stepId: string;\n readonly artifactPaths: StepArtifactPaths;\n readonly outputSchema: Schema;\n}): Promise<PlainObject> {\n return await readCompletedInteractiveOutput({\n stepId: options.stepId,\n interactiveFile: options.artifactPaths.interactiveFile,\n outputSchema: options.outputSchema,\n });\n}\n\nfunction exampleJsonObject(schema: Record<string, unknown>): Record<string, unknown> {\n const properties =\n typeof schema.properties === \"object\" &&\n schema.properties !== null &&\n !Array.isArray(schema.properties)\n ? (schema.properties as Record<string, unknown>)\n : {};\n\n return Object.fromEntries(\n Object.entries(properties).map(([key, property]) => {\n const type =\n typeof property === \"object\" && property !== null && \"type\" in property\n ? (property as { readonly type?: unknown }).type\n : undefined;\n if (type === \"boolean\") {\n return [key, true];\n }\n if (type === \"number\") {\n return [key, 1];\n }\n return [key, \"string\"];\n }),\n );\n}\n\nconst spawnInteractiveProcess: InteractiveProcessRunner = async ({\n command,\n args,\n cwd,\n env,\n signal,\n}) => {\n return await new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n env,\n signal,\n detached: process.platform !== \"win32\",\n shell: false,\n stdio: \"inherit\",\n });\n\n signal?.addEventListener(\"abort\", () => terminateChildProcessTree(child), { once: true });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => resolve({ exitCode: code ?? 1 }));\n });\n};\n\nfunction terminateChildProcessTree(child: ReturnType<typeof spawn>): void {\n if (!child.pid) {\n return;\n }\n\n if (process.platform === \"win32\") {\n spawn(\"taskkill\", [\"/PID\", String(child.pid), \"/T\", \"/F\"], { stdio: \"ignore\" }).on(\n \"error\",\n () => {\n child.kill();\n },\n );\n return;\n }\n\n try {\n process.kill(-child.pid, \"SIGTERM\");\n } catch {\n child.kill();\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { setTimeout as delay } from \"node:timers/promises\";\n\nimport { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type { PlainObject, Schema } from \"../../contracts/shapes/shape.types.js\";\n\nexport async function waitForInteractiveCompletion(\n interactiveFile: string,\n signal: AbortSignal,\n): Promise<void> {\n while (!signal.aborted) {\n if (await isInteractiveCompleted(interactiveFile)) {\n return;\n }\n\n await delay(100, undefined, { signal }).catch(() => undefined);\n }\n}\n\nexport async function isInteractiveCompleted(interactiveFile: string): Promise<boolean> {\n try {\n const protocol = await readPlainJsonFile(interactiveFile, {\n readCode: \"interactive_session_invalid\",\n invalidCode: \"interactive_session_invalid\",\n message: \"Interactive session protocol file is invalid.\",\n });\n return protocol.status === \"completed\" || protocol.status === \"cancelled\";\n } catch {\n // The process-exit path reports authoritative protocol validation errors.\n // The watcher is intentionally best-effort and only needs to notice completion.\n return false;\n }\n}\n\nexport async function readCompletedInteractiveOutput(options: {\n readonly stepId: string;\n readonly interactiveFile: string;\n readonly outputSchema: Schema;\n}): Promise<PlainObject> {\n const protocol = await readPlainJsonFile(options.interactiveFile, {\n readCode: \"interactive_session_invalid\",\n invalidCode: \"interactive_session_invalid\",\n message: `Interactive agent step ${options.stepId} has an invalid interactive.json file.`,\n });\n\n if (protocol.status === \"cancelled\") {\n throw new TrailStepFailureError({\n code: \"interactive_session_cancelled\",\n message: `Interactive agent step ${options.stepId} was cancelled.`,\n details: {\n status: protocol.status,\n ...(typeof protocol.reason === \"string\" ? { reason: protocol.reason } : {}),\n },\n });\n }\n\n if (protocol.status !== \"completed\") {\n throw new TrailStepFailureError({\n code: \"interactive_session_incomplete\",\n message: `Interactive agent step ${options.stepId} did not complete the file-based protocol.`,\n details: { status: protocol.status },\n });\n }\n\n const outputFile = requireProtocolString(protocol.outputFile, \"outputFile\", options.stepId);\n const output = await readPlainJsonFile(outputFile, {\n readCode: \"interactive_output_missing\",\n invalidCode: \"interactive_output_invalid\",\n message: `Interactive agent step ${options.stepId} completed without a valid output.json file.`,\n });\n\n const diagnostics = options.outputSchema.diagnostics(output);\n if (diagnostics.length > 0) {\n throw new TrailStepFailureError({\n code: \"interactive_output_invalid\",\n message: `Interactive agent step ${options.stepId} output.json failed schema validation: ${formatDiagnostics(diagnostics)}`,\n details: { diagnostics },\n });\n }\n\n return output;\n}\n\nasync function readPlainJsonFile(\n path: string,\n failure: {\n readonly readCode: string;\n readonly invalidCode: string;\n readonly message: string;\n },\n): Promise<PlainObject> {\n let contents: string;\n try {\n contents = await readFile(path, \"utf8\");\n } catch (error) {\n throw new TrailStepFailureError({\n code: failure.readCode,\n message: failure.message,\n details: { path, cause: error instanceof Error ? error.message : String(error) },\n });\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(contents);\n } catch (error) {\n throw new TrailStepFailureError({\n code: failure.invalidCode,\n message: failure.message,\n details: { path, cause: error instanceof Error ? error.message : String(error) },\n });\n }\n\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new TrailStepFailureError({\n code: failure.invalidCode,\n message: `${failure.message} Expected a plain JSON object.`,\n details: { path },\n });\n }\n\n return parsed as PlainObject;\n}\n\nfunction requireProtocolString(value: unknown, field: string, stepId: string): string {\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n\n throw new TrailStepFailureError({\n code: \"interactive_session_invalid\",\n message: `Interactive agent step ${stepId} interactive.json is missing ${field}.`,\n });\n}\n\nfunction formatDiagnostics(\n diagnostics: readonly { readonly path: string; readonly message: string }[],\n): string {\n return diagnostics.map((diagnostic) => `${diagnostic.path} ${diagnostic.message}`).join(\"; \");\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\n\nimport { resolveAgentTargets } from \"../../agent-targeting/resolve-agent-targets/resolve-agent-targets.js\";\nimport type {\n TrailStepAgentTarget,\n TrailStepConfig,\n} from \"../../agent-targeting/targeting.types.js\";\nimport type { AgentStepRequestConfig } from \"../../authoring/step/agent-step.types.js\";\nimport type { ProviderWorkingRunner } from \"../../cli-provider-runtime/catalog/provider-adapter.types.js\";\nimport type { WorkflowAgentRole } from \"../../contracts/agents/agent-role.types.js\";\nimport { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport type { WorkingAgentProcessRunner } from \"../../runtime/run-workflow/run-workflow.types.js\";\nimport {\n resolveStepAgentFiles,\n type WorkingAgentFiles,\n} from \"./artifacts/resolve-step-agent-files.js\";\nimport { buildWorkingAgentPrompt } from \"./prompts/build-working-agent-prompt.js\";\nimport { runWorkingAgentTargetAttempt } from \"./targets/run-working-agent-target-attempt.js\";\nimport {\n summarizeWorkingAgentAttemptFailure,\n type WorkingAgentAttemptFailure,\n} from \"./targets/target-failures.js\";\n\nexport type { WorkingAgentFiles } from \"./artifacts/resolve-step-agent-files.js\";\n\nexport async function runWorkingAgentCommand<TOutput extends PlainObject>(options: {\n readonly config: TrailStepConfig;\n readonly workflowId: string;\n readonly roleName: string;\n readonly role: WorkflowAgentRole;\n readonly step: AgentStepRequestConfig<PlainObject, TOutput>;\n readonly renderedPrompt: string;\n readonly runDir: string;\n readonly cwd: string;\n readonly runner?: WorkingAgentProcessRunner;\n readonly providerWorkingRunner?: ProviderWorkingRunner;\n /** Called with the selected target immediately before each target attempt runs. */\n readonly onTargetAttempt?: (target: TrailStepAgentTarget) => void | Promise<void>;\n readonly stepIndex: number;\n readonly files?: WorkingAgentFiles;\n readonly signal?: AbortSignal;\n}): Promise<TOutput> {\n const targets = resolveAgentTargets({\n config: options.config,\n workflowId: options.workflowId,\n roleName: options.roleName,\n roleSize: options.role.size,\n });\n\n const files =\n options.files ??\n resolveStepAgentFiles({\n runDir: options.runDir,\n stepId: options.step.id,\n stepIndex: options.stepIndex,\n });\n await mkdir(files.stepDir, { recursive: true });\n await writeFile(\n files.promptFile,\n buildWorkingAgentPrompt({\n prompt: options.renderedPrompt,\n outputFile: files.outputFile,\n outputSchema: options.step.output.jsonSchema,\n captureMode: options.step.output.captureMode,\n }),\n \"utf8\",\n );\n\n const failures: WorkingAgentAttemptFailure[] = [];\n\n for (const target of targets) {\n await options.onTargetAttempt?.(target);\n try {\n return await runWorkingAgentTargetAttempt({ ...options, target, files });\n } catch (error) {\n failures.push(summarizeWorkingAgentAttemptFailure(target, error));\n }\n }\n\n throw new TrailStepFailureError({\n code: \"agent_target_exhausted\",\n message: `Working agent step ${options.step.id} for role ${options.roleName} exhausted ${failures.length} target(s).`,\n details: {\n stepId: options.step.id,\n roleName: options.roleName,\n attempts: failures,\n },\n });\n}\n","import { join } from \"node:path\";\n\nimport { resolveStepArtifactPaths } from \"../../../runtime/artifacts/step-artifacts.js\";\n\nexport interface WorkingAgentFiles {\n readonly stepDir: string;\n readonly promptFile: string;\n readonly outputFile: string;\n readonly usageFile: string;\n}\n\nexport function resolveStepAgentFiles(options: {\n readonly runDir: string;\n readonly stepId: string;\n readonly stepIndex: number;\n}): WorkingAgentFiles {\n const artifactPaths = resolveStepArtifactPaths(options);\n return {\n stepDir: artifactPaths.stepDir,\n promptFile: join(artifactPaths.stepDir, \"prompt.md\"),\n outputFile: artifactPaths.outputFile,\n usageFile: artifactPaths.usageFile,\n };\n}\n","export function buildWorkingAgentPrompt(options: {\n readonly prompt: string;\n readonly outputFile: string;\n readonly outputSchema: Record<string, unknown>;\n readonly captureMode?: \"json\" | \"raw-text\";\n}): string {\n if (options.captureMode === \"raw-text\") {\n return [\n \"# TrailStep working-agent task\",\n \"\",\n \"Run the task described below and write the document content to the output file.\",\n \"Print the document content directly as your entire response — no JSON wrapper, no surrounding commentary, no markdown fences unless they are literally part of the document content itself.\",\n \"\",\n `Output file: ${options.outputFile}`,\n \"\",\n \"## Original prompt\",\n \"\",\n options.prompt,\n \"\",\n ].join(\"\\n\");\n }\n\n return [\n \"# TrailStep working-agent task\",\n \"\",\n \"Run the task described below and write exactly one JSON object to the output file.\",\n \"Do not write prose, markdown fences, or multiple JSON values to the output file.\",\n \"\",\n `Output file: ${options.outputFile}`,\n \"\",\n \"The JSON object must match this output schema:\",\n \"\",\n \"```json\",\n JSON.stringify(options.outputSchema, null, 2),\n \"```\",\n \"\",\n \"## Original prompt\",\n \"\",\n options.prompt,\n \"\",\n ].join(\"\\n\");\n}\n","import { rm } from \"node:fs/promises\";\n\nimport type {\n TrailStepAgentTarget,\n TrailStepConfig,\n} from \"../../../agent-targeting/targeting.types.js\";\nimport type { AgentStepRequestConfig } from \"../../../authoring/step/agent-step.types.js\";\nimport type { ProviderWorkingRunner } from \"../../../cli-provider-runtime/catalog/provider-adapter.types.js\";\nimport type { WorkflowAgentRole } from \"../../../contracts/agents/agent-role.types.js\";\nimport type { PlainObject } from \"../../../contracts/shapes/shape.types.js\";\nimport type { WorkingAgentProcessRunner } from \"../../../runtime/run-workflow/run-workflow.types.js\";\nimport type { WorkingAgentFiles } from \"../artifacts/resolve-step-agent-files.js\";\nimport { runCustomWorkingProvider } from \"./custom-provider/run-custom-working-provider.js\";\nimport { runManifestWorkingProvider } from \"./manifest-provider/run-manifest-working-provider.js\";\n\nexport async function runWorkingAgentTargetAttempt<TOutput extends PlainObject>(options: {\n readonly config: TrailStepConfig;\n readonly workflowId: string;\n readonly roleName: string;\n readonly role: WorkflowAgentRole;\n readonly step: AgentStepRequestConfig<PlainObject, TOutput>;\n readonly renderedPrompt: string;\n readonly runDir: string;\n readonly cwd: string;\n readonly runner?: WorkingAgentProcessRunner;\n readonly providerWorkingRunner?: ProviderWorkingRunner;\n readonly stepIndex: number;\n readonly target: TrailStepAgentTarget;\n readonly files: WorkingAgentFiles;\n readonly signal?: AbortSignal;\n}): Promise<TOutput> {\n await rm(options.files.outputFile, { force: true });\n await rm(options.files.usageFile, { force: true });\n\n if (\n options.config.providers?.[options.target.provider] !== undefined &&\n options.config.providers[options.target.provider]?.source.type !== \"legacy-custom-provider\"\n ) {\n return runManifestWorkingProvider({\n config: options.config,\n step: options.step,\n role: options.role,\n cwd: options.cwd,\n runner: options.runner,\n target: options.target,\n files: options.files,\n signal: options.signal,\n });\n }\n\n return runCustomWorkingProvider({\n config: options.config,\n step: options.step,\n role: options.role,\n cwd: options.cwd,\n runner: options.runner,\n target: options.target,\n files: options.files,\n signal: options.signal,\n });\n}\n","import { readFile } from \"node:fs/promises\";\n\nimport { document } from \"../../../authoring/document/document.js\";\nimport type { AgentStepRequestConfig } from \"../../../authoring/step/agent-step.types.js\";\nimport { TrailStepFailureError } from \"../../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../../contracts/shapes/shape.types.js\";\n\nexport async function readWorkingAgentOutput<TOutput extends PlainObject>(options: {\n readonly stepId: string;\n readonly outputFile: string;\n readonly step: AgentStepRequestConfig<PlainObject, TOutput>;\n}): Promise<TOutput> {\n let raw: string;\n try {\n raw = await readFile(options.outputFile, \"utf8\");\n } catch (error) {\n throw new TrailStepFailureError({\n code: \"agent_output_unreadable\",\n message: `Working agent step ${options.stepId} output.json could not be read.`,\n details:\n error instanceof Error\n ? { path: options.outputFile, cause: error.message }\n : { path: options.outputFile },\n });\n }\n\n if (options.step.output.captureMode === \"raw-text\") {\n // Delegates to the shared `document(...)` capture path (the same one\n // code-authored steps use), so agent-captured and code-captured\n // documents share one persistence implementation. `document(...)`\n // resolves its target directory and index from the ambient step\n // context (`currentStep`), which is active for the whole duration of\n // this step's dispatch (see `withStepContext` in run-continuation.ts).\n const capturedDocument = await document(raw);\n\n return options.step.output.assert(capturedDocument, `step ${options.stepId} output`);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (error) {\n throw new TrailStepFailureError({\n code: \"agent_output_invalid_json\",\n message: `Working agent step ${options.stepId} output.json must contain one JSON object.`,\n details:\n error instanceof Error\n ? { path: options.outputFile, cause: error.message }\n : { path: options.outputFile },\n });\n }\n\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new TrailStepFailureError({\n code: \"agent_output_invalid_json\",\n message: `Working agent step ${options.stepId} output.json must contain one JSON object.`,\n details: { path: options.outputFile },\n });\n }\n\n return options.step.output.assert(parsed, `step ${options.stepId} output`);\n}\n","import type { WorkflowAgentThinking } from \"../../../../contracts/agents/agent-role.types.js\";\nimport { renderCustomProviderArgs } from \"../../../custom-provider/render-custom-provider-args.js\";\n\nexport function buildWorkingAgentArgs(options: {\n readonly argv: readonly string[] | undefined;\n readonly promptFile: string;\n readonly outputFile: string;\n readonly model?: string;\n readonly thinking?: WorkflowAgentThinking;\n}): string[] {\n if (!options.argv) {\n return [\n \"--prompt-file\",\n options.promptFile,\n \"--output-file\",\n options.outputFile,\n ...(options.model ? [\"--model\", options.model] : []),\n ];\n }\n\n return renderCustomProviderArgs({\n argv: options.argv,\n values: {\n promptFile: options.promptFile,\n outputFile: options.outputFile,\n ...(options.model === undefined ? {} : { model: options.model }),\n ...(options.thinking === undefined ? {} : { thinking: options.thinking }),\n },\n errorCode: \"agent_provider_invalid\",\n commandDescription: \"Working agent command\",\n });\n}\n","import { spawn } from \"node:child_process\";\n\nimport type { WorkingAgentProcessRunner } from \"../../../../runtime/run-workflow/run-workflow.types.js\";\n\nexport const spawnWorkingAgentProcess: WorkingAgentProcessRunner = async ({\n command,\n args,\n cwd,\n stdio,\n signal,\n}) => {\n return await new Promise((resolve, reject) => {\n let stdout = \"\";\n const child = spawn(command, args, {\n cwd,\n shell: false,\n stdio: stdio === \"pipe\" ? [\"ignore\", \"pipe\", \"inherit\"] : \"inherit\",\n detached: process.platform !== \"win32\",\n });\n\n if (child.stdout !== null) {\n child.stdout.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n }\n\n signal?.addEventListener(\"abort\", () => terminateChildProcessTree(child), { once: true });\n child.on(\"error\", reject);\n child.on(\"close\", (code) =>\n resolve({ exitCode: code ?? 1, ...(stdio === \"pipe\" ? { stdout } : {}) }),\n );\n });\n};\n\nfunction terminateChildProcessTree(child: ReturnType<typeof spawn>): void {\n if (!child.pid) {\n return;\n }\n\n if (process.platform === \"win32\") {\n spawn(\"taskkill\", [\"/PID\", String(child.pid), \"/T\", \"/F\"], { stdio: \"ignore\" }).on(\n \"error\",\n () => {\n child.kill();\n },\n );\n return;\n }\n\n try {\n process.kill(-child.pid, \"SIGTERM\");\n } catch {\n child.kill();\n }\n}\n","import type {\n TrailStepAgentTarget,\n TrailStepConfig,\n} from \"../../../../agent-targeting/targeting.types.js\";\nimport type { AgentStepRequestConfig } from \"../../../../authoring/step/agent-step.types.js\";\nimport type { WorkflowAgentRole } from \"../../../../contracts/agents/agent-role.types.js\";\nimport { TrailStepFailureError } from \"../../../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../../../contracts/shapes/shape.types.js\";\nimport type {\n WorkingAgentProcessResult,\n WorkingAgentProcessRunner,\n} from \"../../../../runtime/run-workflow/run-workflow.types.js\";\nimport type { WorkingAgentFiles } from \"../../artifacts/resolve-step-agent-files.js\";\nimport { readWorkingAgentOutput } from \"../../output/read-working-agent-output.js\";\nimport { buildWorkingAgentArgs } from \"./build-working-agent-args.js\";\nimport { spawnWorkingAgentProcess } from \"./spawn-working-agent-process.js\";\n\nexport async function runCustomWorkingProvider<TOutput extends PlainObject>(options: {\n readonly config: TrailStepConfig;\n readonly step: AgentStepRequestConfig<PlainObject, TOutput>;\n readonly role: WorkflowAgentRole;\n readonly cwd: string;\n readonly runner?: WorkingAgentProcessRunner;\n readonly target: TrailStepAgentTarget;\n readonly files: WorkingAgentFiles;\n readonly signal?: AbortSignal;\n}): Promise<TOutput> {\n const agentConfig = options.config.customProviders[options.target.provider];\n if (!agentConfig) {\n throw new TrailStepFailureError({\n code: \"agent_provider_unavailable\",\n message: `Working agent target '${options.target.provider}' does not reference a configured custom agent.`,\n details: { provider: options.target.provider },\n });\n }\n\n const thinking = options.target.thinking ?? options.role.thinking;\n const args = buildWorkingAgentArgs({\n argv: options.target.args ?? agentConfig.args,\n promptFile: options.files.promptFile,\n outputFile: options.files.outputFile,\n model: options.target.model,\n thinking,\n });\n\n let result: WorkingAgentProcessResult;\n try {\n result = await (options.runner ?? spawnWorkingAgentProcess)({\n command: agentConfig.binary,\n args,\n cwd: options.cwd,\n shell: false,\n stdio: \"inherit\",\n promptFile: options.files.promptFile,\n outputFile: options.files.outputFile,\n ...(options.target.model === undefined ? {} : { model: options.target.model }),\n signal: options.signal,\n });\n } catch (error) {\n throw new TrailStepFailureError({\n code: \"agent_provider_spawn_error\",\n message: `Working agent step ${options.step.id} could not start target '${options.target.provider}'.`,\n details: {\n target: options.target.provider,\n ...(options.target.model === undefined ? {} : { model: options.target.model }),\n cause: error instanceof Error ? error.message : String(error),\n },\n });\n }\n\n if (result.exitCode !== 0) {\n throw new TrailStepFailureError({\n code: \"agent_provider_failed\",\n message: `Working agent step ${options.step.id} target '${options.target.provider}' exited with code ${result.exitCode}.`,\n details: {\n exitCode: result.exitCode,\n provider: agentConfig.binary,\n target: options.target.provider,\n ...(options.target.model === undefined ? {} : { model: options.target.model }),\n },\n });\n }\n\n return readWorkingAgentOutput({\n stepId: options.step.id,\n outputFile: options.files.outputFile,\n step: options.step,\n });\n}\n","import { writeFile } from \"node:fs/promises\";\n\nimport type {\n TrailStepAgentTarget,\n TrailStepConfig,\n} from \"../../../../agent-targeting/targeting.types.js\";\nimport type { AgentStepRequestConfig } from \"../../../../authoring/step/agent-step.types.js\";\nimport {\n extractEnvelopeOutput,\n extractEnvelopeText,\n} from \"../../../../cli-provider-runtime/envelopes/envelope.js\";\nimport type {\n WorkflowAgentRole,\n WorkflowAgentThinking,\n} from \"../../../../contracts/agents/agent-role.types.js\";\nimport { TrailStepFailureError } from \"../../../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../../../contracts/shapes/shape.types.js\";\nimport type {\n TrailStepProviderManifest,\n TrailStepProviderOutputManifest,\n} from \"../../../../providers/provider-manifest.js\";\nimport type {\n WorkingAgentProcessResult,\n WorkingAgentProcessRunner,\n} from \"../../../../runtime/run-workflow/run-workflow.types.js\";\nimport { renderCustomProviderArgs } from \"../../../custom-provider/render-custom-provider-args.js\";\nimport type { WorkingAgentFiles } from \"../../artifacts/resolve-step-agent-files.js\";\nimport { readWorkingAgentOutput } from \"../../output/read-working-agent-output.js\";\nimport { spawnWorkingAgentProcess } from \"../custom-provider/spawn-working-agent-process.js\";\n\nexport async function runManifestWorkingProvider<TOutput extends PlainObject>(options: {\n readonly config: TrailStepConfig;\n readonly step: AgentStepRequestConfig<PlainObject, TOutput>;\n readonly role: WorkflowAgentRole;\n readonly cwd: string;\n readonly runner?: WorkingAgentProcessRunner;\n readonly target: TrailStepAgentTarget;\n readonly files: WorkingAgentFiles;\n readonly signal?: AbortSignal;\n}): Promise<TOutput> {\n const registration = options.config.providers?.[options.target.provider];\n const manifest = registration?.manifest;\n const working = manifest?.working;\n\n if (\n manifest === undefined ||\n working === undefined ||\n !working.supported ||\n working.command === undefined\n ) {\n throw new TrailStepFailureError({\n code: \"agent_provider_unavailable\",\n message: `Working agent target '${options.target.provider}' does not reference a supported manifest working provider.`,\n details: { provider: options.target.provider },\n });\n }\n\n const thinking = options.target.thinking ?? options.role.thinking;\n const model = optionalNonEmptyString(options.target.model);\n const args = renderCustomProviderArgs({\n argv:\n working.args ??\n defaultManifestWorkingArgs({\n manifest,\n promptFile: options.files.promptFile,\n outputFile: options.files.outputFile,\n model,\n thinking,\n }),\n values: {\n promptFile: options.files.promptFile,\n outputFile: options.files.outputFile,\n ...(model === undefined ? {} : { model }),\n ...(thinking === undefined ? {} : { thinking }),\n },\n errorCode: \"agent_provider_invalid\",\n commandDescription: \"Manifest working provider command\",\n });\n const captureStdout = working.output?.style !== \"provider-output-file\";\n\n let result: WorkingAgentProcessResult;\n try {\n result = await (options.runner ?? spawnWorkingAgentProcess)({\n command: working.command,\n args,\n cwd: options.cwd,\n shell: false,\n stdio: captureStdout ? \"pipe\" : \"inherit\",\n promptFile: options.files.promptFile,\n outputFile: options.files.outputFile,\n ...(model === undefined ? {} : { model }),\n signal: options.signal,\n });\n } catch (error) {\n throw new TrailStepFailureError({\n code: \"agent_provider_spawn_error\",\n message: `Working agent step ${options.step.id} could not start target '${options.target.provider}'.`,\n details: {\n target: options.target.provider,\n ...(model === undefined ? {} : { model }),\n cause: error instanceof Error ? error.message : String(error),\n },\n });\n }\n\n if (result.exitCode !== 0) {\n throw new TrailStepFailureError({\n code: \"agent_provider_failed\",\n message: `Working agent step ${options.step.id} target '${options.target.provider}' exited with code ${result.exitCode}.`,\n details: {\n exitCode: result.exitCode,\n provider: working.command,\n target: options.target.provider,\n ...(model === undefined ? {} : { model }),\n },\n });\n }\n\n await writeCapturedStdoutOutput({\n provider: options.target.provider,\n stepId: options.step.id,\n outputFile: options.files.outputFile,\n captureMode: options.step.output.captureMode,\n stdout: (result as WorkingAgentProcessResult & { readonly stdout?: string }).stdout,\n output: working.output,\n extractOutputHook: registration?.manifest.hooks?.extractOutput,\n });\n\n return readWorkingAgentOutput({\n stepId: options.step.id,\n outputFile: options.files.outputFile,\n step: options.step,\n });\n}\n\nasync function writeCapturedStdoutOutput(options: {\n readonly provider: string;\n readonly stepId: string;\n readonly outputFile: string;\n readonly captureMode?: \"json\" | \"raw-text\";\n readonly stdout?: string;\n readonly output?: TrailStepProviderOutputManifest;\n readonly extractOutputHook?: unknown;\n}): Promise<void> {\n if (options.stdout === undefined) {\n return;\n }\n\n if (\n options.output?.style === \"stdout-json-envelope\" ||\n options.output?.style === \"stdout-jsonl-transcript\"\n ) {\n await writeEnvelopeOutput({ ...options, stdout: options.stdout });\n return;\n }\n\n if (isRecord(options.extractOutputHook)) {\n const extracted = extractJsonObject(options.stdout);\n if (extracted === undefined) {\n throw new TrailStepFailureError({\n code: \"agent_provider_output_invalid\",\n message: `Working agent step ${options.stepId} provider '${options.provider}' could not extract JSON output from stdout using declared hook metadata.`,\n details: { provider: options.provider },\n });\n }\n\n await writeFile(options.outputFile, `${JSON.stringify(extracted)}\\n`, \"utf8\");\n }\n}\n\nasync function writeEnvelopeOutput(options: {\n readonly provider: string;\n readonly stepId: string;\n readonly outputFile: string;\n readonly captureMode?: \"json\" | \"raw-text\";\n readonly stdout: string;\n readonly output?: TrailStepProviderOutputManifest;\n}): Promise<void> {\n try {\n const resultField = options.output?.parsing?.resultField ?? \"result\";\n if (options.captureMode === \"raw-text\") {\n const text = extractEnvelopeText(options.stdout, { resultField });\n await writeFile(options.outputFile, text, \"utf8\");\n return;\n }\n\n const extracted = extractEnvelopeOutput(options.stdout, { resultField });\n await writeFile(options.outputFile, `${JSON.stringify(extracted)}\\n`, \"utf8\");\n } catch (error) {\n throw new TrailStepFailureError({\n code: \"agent_provider_output_invalid\",\n message: `Working agent step ${options.stepId} provider '${options.provider}' could not parse stdout envelope output.`,\n details: {\n provider: options.provider,\n cause: error instanceof Error ? error.message : String(error),\n },\n });\n }\n}\n\nfunction defaultManifestWorkingArgs(options: {\n readonly manifest: TrailStepProviderManifest;\n readonly promptFile: string;\n readonly outputFile: string;\n readonly model?: string;\n readonly thinking?: WorkflowAgentThinking;\n}): readonly string[] {\n const args: string[] = [];\n\n if (options.model !== undefined && options.manifest.model.supported) {\n args.push(...renderFlaggedValue(options.manifest.model.flag, options.model));\n }\n\n if (options.thinking !== undefined && options.manifest.thinking.supported) {\n args.push(...renderFlaggedValue(options.manifest.thinking.flag, options.thinking));\n }\n\n if (options.manifest.working.prompt?.reference === \"at-prefixed-argument\") {\n args.push(`@${options.promptFile}`);\n } else {\n args.push(\"--prompt-file\", options.promptFile);\n }\n\n if (options.manifest.working.output?.style === \"provider-output-file\") {\n args.push(\"--output-file\", options.outputFile);\n }\n\n return args;\n}\n\nfunction renderFlaggedValue(flag: string | undefined, value: string): readonly string[] {\n if (flag === undefined) {\n return [];\n }\n\n const parts = flag.split(/\\s+/u).filter(Boolean);\n if (parts.length === 0) {\n return [];\n }\n\n if (parts.length === 2) {\n return [parts[0] as string, `${parts[1] as string}=${value}`];\n }\n\n return [...parts, value];\n}\n\nfunction optionalNonEmptyString(value: string | undefined): string | undefined {\n return value === undefined || value.length === 0 ? undefined : value;\n}\n\nfunction extractJsonObject(stdout: string): Record<string, unknown> | undefined {\n const trimmed = stdout.trim();\n const candidates = [trimmed];\n const firstBrace = trimmed.indexOf(\"{\");\n const lastBrace = trimmed.lastIndexOf(\"}\");\n if (firstBrace >= 0 && lastBrace > firstBrace) {\n candidates.push(trimmed.slice(firstBrace, lastBrace + 1));\n }\n\n for (const candidate of candidates) {\n try {\n const parsed = JSON.parse(candidate) as unknown;\n if (isRecord(parsed)) {\n return parsed;\n }\n } catch {\n // Try the next candidate.\n }\n }\n\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\n\n/**\n * Extraction logic ported from the retired `claude-rpc-trailstep-agent.mjs` mock\n * wrapper's `extractTrailStepOutput`, parameterized by which envelope field holds\n * the provider's final text (e.g. `\"result\"` for `claude --output-format json`).\n *\n * Handles four shapes of vendor CLI stdout:\n * 1. A single JSON envelope object whose `resultField` holds the final text\n * (or is itself already the final JSON object).\n * 2. Streaming JSON-lines output, where the last line containing a usable\n * `resultField`/`content` wins.\n * 3. A `resultField` value that is itself a message-shaped object with a\n * `content` array of `{type, text}` blocks (confirmed empirically for\n * `pi --mode json`, whose per-event `\"message\"` field nests the final\n * answer inside `message.content[].text` rather than a flat string like\n * Claude's `\"result\"`) — all `type: \"text\"` blocks are concatenated, in\n * order, and the joined text is parsed the same way a flat string would be.\n * 4. Plain text that itself contains (or is) the JSON object.\n */\nexport interface EnvelopeOptions {\n readonly resultField: string;\n}\n\nexport interface EnvelopeMetadataOptions {\n readonly harnessDurationMs: number;\n}\n\nexport interface ClaudeEnvelopeMetadata {\n readonly usage?: PlainObject;\n readonly costUsd?: number;\n readonly durationMs?: number;\n readonly harnessDurationMs: number;\n readonly turns?: number;\n readonly sessionId?: string;\n}\n\nexport function extractEnvelopeMetadata(\n rawStdout: string,\n options: EnvelopeMetadataOptions,\n): ClaudeEnvelopeMetadata {\n const metadata: Record<string, unknown> = { harnessDurationMs: options.harnessDurationMs };\n const envelope = parseEnvelopeObject(rawStdout);\n\n if (envelope) {\n const usage = camelCaseUsage(envelope.usage);\n if (usage) {\n metadata.usage = usage;\n }\n\n if (typeof envelope.total_cost_usd === \"number\") {\n metadata.costUsd = envelope.total_cost_usd;\n }\n\n if (typeof envelope.duration_ms === \"number\") {\n metadata.durationMs = envelope.duration_ms;\n }\n\n if (typeof envelope.num_turns === \"number\") {\n metadata.turns = envelope.num_turns;\n }\n\n if (typeof envelope.session_id === \"string\") {\n metadata.sessionId = envelope.session_id;\n }\n }\n\n return metadata as unknown as ClaudeEnvelopeMetadata;\n}\n\nexport function extractEnvelopeOutput(rawStdout: string, options: EnvelopeOptions): PlainObject {\n const text = rawStdout.trim();\n if (!text) {\n throw new Error(\"Provider process returned empty stdout.\");\n }\n\n const parsedEnvelope = parseJson(text);\n if (isPlainObject(parsedEnvelope)) {\n if (parsedEnvelope.is_error === true) {\n throw new Error(\n `Provider reported an error: ${String(parsedEnvelope[options.resultField] ?? text)}`,\n );\n }\n\n const resolved = resolveFieldValue(parsedEnvelope[options.resultField]);\n if (resolved) {\n return resolved;\n }\n\n if (typeof parsedEnvelope.content === \"string\") {\n return parseObjectFromText(parsedEnvelope.content);\n }\n }\n\n const streamResult = parseLastJsonLineResult(text, options.resultField);\n if (streamResult) {\n return streamResult;\n }\n\n return parseObjectFromText(text);\n}\n\n/**\n * Text-only counterpart to `extractEnvelopeOutput`, for steps whose\n * `captureMode` is `\"raw-text\"` (see `Document.captureMode` in\n * `authoring/document/document.ts`): the agent's final answer is a plain-text\n * document, not JSON, so the `resultField` value must be taken verbatim\n * rather than JSON-parsed. Mirrors the same four documented stdout shapes as\n * `extractEnvelopeOutput` — single JSON envelope, JSON-lines transcript,\n * message-shaped `resultField` with a `content` block array, and plain text —\n * but never throws on non-JSON text; the raw text is always the answer.\n */\nexport function extractEnvelopeText(rawStdout: string, options: EnvelopeOptions): string {\n const text = rawStdout.trim();\n if (!text) {\n throw new Error(\"Provider process returned empty stdout.\");\n }\n\n const parsedEnvelope = parseJson(text);\n if (isPlainObject(parsedEnvelope)) {\n if (parsedEnvelope.is_error === true) {\n throw new Error(\n `Provider reported an error: ${String(parsedEnvelope[options.resultField] ?? text)}`,\n );\n }\n\n const resolved = resolveFieldText(parsedEnvelope[options.resultField]);\n if (resolved !== undefined) {\n return resolved;\n }\n\n if (typeof parsedEnvelope.content === \"string\") {\n return parsedEnvelope.content;\n }\n }\n\n const streamResult = parseLastJsonLineText(text, options.resultField);\n if (streamResult !== undefined) {\n return streamResult;\n }\n\n return text;\n}\n\nfunction parseLastJsonLineText(text: string, resultField: string): string | undefined {\n const lines = text\n .split(/\\r?\\n/u)\n .map((line) => line.trim())\n .filter(Boolean);\n\n for (const line of [...lines].reverse()) {\n const parsed = parseJson(line);\n if (!isPlainObject(parsed)) {\n continue;\n }\n\n const resolved = resolveFieldText(parsed[resultField]);\n if (resolved !== undefined) {\n return resolved;\n }\n\n if (typeof parsed.content === \"string\") {\n return parsed.content;\n }\n }\n\n return undefined;\n}\n\n/**\n * Text-only counterpart to `resolveFieldValue`: resolves a raw `resultField`\n * value into the final raw text, handling a plain string (verbatim) or a\n * message-shaped object carrying a `content` array of text blocks (Pi),\n * without ever attempting to JSON-parse the resolved text.\n */\nfunction resolveFieldText(fieldValue: unknown): string | undefined {\n if (typeof fieldValue === \"string\") {\n return fieldValue;\n }\n\n if (isPlainObject(fieldValue)) {\n return extractTextFromContentBlocks(fieldValue);\n }\n\n return undefined;\n}\n\nfunction parseLastJsonLineResult(text: string, resultField: string): PlainObject | undefined {\n const lines = text\n .split(/\\r?\\n/u)\n .map((line) => line.trim())\n .filter(Boolean);\n\n for (const line of [...lines].reverse()) {\n const parsed = parseJson(line);\n if (!isPlainObject(parsed)) {\n continue;\n }\n\n const resolved = resolveFieldValue(parsed[resultField]);\n if (resolved) {\n return resolved;\n }\n\n if (typeof parsed.content === \"string\") {\n return parseObjectFromText(parsed.content);\n }\n }\n\n return undefined;\n}\n\n/**\n * Resolves a raw `resultField` value into the final output object, handling\n * the three shapes that field's value can take across vendors: a JSON-text\n * string (Claude), an object that already is the final output (also legal for\n * Claude-style envelopes), or a message-shaped object carrying a `content`\n * array of text blocks (Pi). Returns `undefined` when `fieldValue` is absent\n * or is a plain object with no extractable text, so callers can fall through\n * to their next fallback instead of misreporting an unrelated object.\n */\nfunction resolveFieldValue(fieldValue: unknown): PlainObject | undefined {\n if (typeof fieldValue === \"string\") {\n return parseObjectFromText(fieldValue);\n }\n\n if (isPlainObject(fieldValue)) {\n const blockText = extractTextFromContentBlocks(fieldValue);\n if (blockText !== undefined) {\n return parseObjectFromText(blockText);\n }\n\n return fieldValue;\n }\n\n return undefined;\n}\n\n/**\n * Extracts and concatenates `text` from every `{type: \"text\", text: string}`\n * content block in `value.content`, if `value.content` is such an array.\n * Returns `undefined` when `value` has no `content` array to extract from, so\n * the caller can fall back to treating `value` itself as the output object.\n */\nfunction extractTextFromContentBlocks(value: PlainObject): string | undefined {\n const content = value.content;\n if (!Array.isArray(content)) {\n return undefined;\n }\n\n const textParts = content\n .filter(isPlainObject)\n .filter((block) => block.type === \"text\" && typeof block.text === \"string\")\n .map((block) => block.text as string);\n\n if (textParts.length === 0) {\n return undefined;\n }\n\n return textParts.join(\"\");\n}\n\nfunction parseObjectFromText(text: string): PlainObject {\n const parsed = parseJson(text.trim());\n if (isPlainObject(parsed)) {\n return parsed;\n }\n\n const firstBrace = text.indexOf(\"{\");\n const lastBrace = text.lastIndexOf(\"}\");\n if (firstBrace === -1 || lastBrace === -1 || lastBrace <= firstBrace) {\n throw new Error(`Provider response did not contain a JSON object: ${text}`);\n }\n\n const extracted = parseJson(text.slice(firstBrace, lastBrace + 1));\n if (!isPlainObject(extracted)) {\n throw new Error(\"Provider response JSON was not an object.\");\n }\n\n return extracted;\n}\n\nfunction parseEnvelopeObject(rawStdout: string): PlainObject | undefined {\n const text = rawStdout.trim();\n const parsed = parseJson(text);\n if (isPlainObject(parsed)) {\n return parsed;\n }\n\n const lines = text\n .split(/\\r?\\n/u)\n .map((line) => line.trim())\n .filter(Boolean);\n\n for (const line of [...lines].reverse()) {\n const parsedLine = parseJson(line);\n if (isPlainObject(parsedLine)) {\n return parsedLine;\n }\n }\n\n return undefined;\n}\n\nfunction camelCaseUsage(value: unknown): PlainObject | undefined {\n if (!isPlainObject(value)) {\n return undefined;\n }\n\n const usage: Record<string, unknown> = {};\n for (const [key, fieldValue] of Object.entries(value)) {\n if (typeof fieldValue === \"number\") {\n usage[snakeToCamel(key)] = fieldValue;\n }\n }\n\n return Object.keys(usage).length > 0 ? usage : undefined;\n}\n\nfunction snakeToCamel(value: string): string {\n return value.replace(/_([a-z])/gu, (_match, letter: string) => letter.toUpperCase());\n}\n\nfunction parseJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { TrailStepAgentTarget } from \"../../../agent-targeting/targeting.types.js\";\nimport { TrailStepFailureError } from \"../../../contracts/failures/failure.js\";\n\nexport interface WorkingAgentAttemptFailure {\n readonly target: string;\n readonly model?: string;\n readonly code: string;\n readonly message: string;\n readonly details?: unknown;\n}\n\nexport function summarizeWorkingAgentAttemptFailure(\n target: TrailStepAgentTarget,\n error: unknown,\n): WorkingAgentAttemptFailure {\n if (error instanceof TrailStepFailureError) {\n return {\n target: target.provider,\n ...(target.model === undefined ? {} : { model: target.model }),\n code: error.failure.code,\n message: error.failure.message,\n ...(error.failure.details === undefined ? {} : { details: error.failure.details }),\n };\n }\n\n return {\n target: target.provider,\n ...(target.model === undefined ? {} : { model: target.model }),\n code: \"agent_target_failed\",\n message: error instanceof Error ? error.message : \"Working agent target failed.\",\n };\n}\n","import { join, relative } from \"node:path\";\n\nexport function resolveSubPromptArtifactPaths(options: {\n readonly runDir: string;\n readonly stepDir: string;\n readonly ordinal: number;\n readonly fingerprint: string;\n}): {\n readonly subPromptDir: string;\n readonly promptFile: string;\n readonly outputFile: string;\n readonly usageFile: string;\n readonly runRelative: {\n readonly subPromptDir: string;\n readonly promptFile: string;\n readonly outputFile: string;\n };\n} {\n const artifactSubPromptId = `${String(options.ordinal).padStart(4, \"0\")}-${options.fingerprint.slice(0, 12)}`;\n const subPromptDir = join(options.stepDir, \"subPrompts\", artifactSubPromptId);\n const promptFile = join(subPromptDir, \"prompt.txt\");\n const outputFile = join(subPromptDir, \"output.json\");\n const usageFile = join(subPromptDir, \"usage.json\");\n\n return {\n subPromptDir,\n promptFile,\n outputFile,\n usageFile,\n runRelative: {\n subPromptDir: toRunRelativePath(options.runDir, subPromptDir),\n promptFile: toRunRelativePath(options.runDir, promptFile),\n outputFile: toRunRelativePath(options.runDir, outputFile),\n },\n };\n}\n\nfunction toRunRelativePath(runDir: string, path: string): string {\n return relative(runDir, path).replaceAll(\"\\\\\", \"/\");\n}\n","import type { Failure } from \"../../contracts/failures/failure.js\";\n\nexport function isFailureLikeError(error: unknown): error is { readonly failure: Failure } {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"failure\" in error &&\n typeof error.failure === \"object\" &&\n error.failure !== null &&\n \"code\" in error.failure &&\n typeof error.failure.code === \"string\" &&\n \"message\" in error.failure &&\n typeof error.failure.message === \"string\"\n );\n}\n","import type { Failure } from \"../../contracts/failures/failure.js\";\nimport { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type { RunContext } from \"../../contracts/run-context/run-context.types.js\";\nimport { createEvent } from \"../events/create-run-event.js\";\nimport { isFailureLikeError } from \"../failures/failure-like.js\";\n\nexport async function emitSubPromptFailed(options: {\n readonly context: RunContext;\n readonly parentStepId: string;\n readonly ordinal: number;\n readonly fingerprint?: string;\n readonly artifactPaths?: {\n readonly subPromptDir: string;\n readonly promptFile: string;\n readonly outputFile: string;\n };\n readonly failure: Failure;\n}): Promise<void> {\n await options.context.emit?.(\n createEvent({\n runId: options.context.id,\n workflowId: options.context.workflowId ?? \"\",\n stepId: options.parentStepId,\n type: \"subPrompt.failed\",\n payload: {\n parentStepId: options.parentStepId,\n ordinal: options.ordinal,\n ...(options.fingerprint === undefined ? {} : { fingerprint: options.fingerprint }),\n ...(options.artifactPaths === undefined ? {} : { artifactPaths: options.artifactPaths }),\n failure: options.failure,\n },\n }),\n );\n}\n\nexport function maxSubPromptsGuardError(maxSubPrompts: number): TrailStepFailureError {\n return new TrailStepFailureError({\n code: \"max_sub_prompts_exceeded\",\n message: `workflow exceeded maxSubPrompts guard (${maxSubPrompts})`,\n });\n}\n\nexport function throwMissingSubPromptAgentConfig(options: {\n readonly workflowId: string;\n readonly parentStepId: string;\n readonly subPromptId: string;\n readonly agent: string;\n}): never {\n throw new TrailStepFailureError({\n code: \"missing_agent_config\",\n message: `Missing .trailstep/config.json: workflow ${options.workflowId} parent step ${options.parentStepId} subPrompt ${options.subPromptId} needs configured working agent '${options.agent}'.`,\n details: {\n workflowId: options.workflowId,\n parentStepId: options.parentStepId,\n subPromptId: options.subPromptId,\n agent: options.agent,\n mode: \"working\",\n },\n });\n}\n\nexport function subPromptFailureError(error: unknown): TrailStepFailureError {\n if (error instanceof TrailStepFailureError) {\n if (error.failure.code === \"validation_failed\") {\n return new TrailStepFailureError({\n ...error.failure,\n message: normalizeSubPromptValidationMessage(error.failure.message),\n });\n }\n\n return error;\n }\n\n if (isFailureLikeError(error)) {\n return new TrailStepFailureError(error.failure);\n }\n\n return new TrailStepFailureError({\n code: \"sub_prompt_failed\",\n message: error instanceof Error ? error.message : \"subPrompt failed.\",\n ...(error instanceof Error\n ? { details: { name: error.name } }\n : error === undefined\n ? {}\n : { details: { cause: error } }),\n });\n}\n\nfunction normalizeSubPromptValidationMessage(message: string): string {\n if (message.startsWith(\"subPrompt output failed schema validation\")) {\n return message;\n }\n\n const diagnostics = message.match(/failed schema validation: (.*)$/)?.[1];\n return diagnostics === undefined\n ? `subPrompt output failed schema validation: ${message}`\n : `subPrompt output failed schema validation: ${diagnostics}`;\n}\n","import { createHash } from \"node:crypto\";\n\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\n\nexport function fingerprintSubPrompt(options: {\n readonly input: PlainObject;\n readonly prompt: string;\n}): string {\n return createHash(\"sha256\").update(stableJsonStringify(options)).digest(\"hex\");\n}\n\nexport function stableJsonStringify(value: unknown): string {\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableJsonStringify(item)).join(\",\")}]`;\n }\n\n if (isPlainObject(value)) {\n const entries = Object.entries(value).sort(([left], [right]) => left.localeCompare(right));\n return `{${entries\n .map(([key, entryValue]) => `${JSON.stringify(key)}:${stableJsonStringify(entryValue)}`)\n .join(\",\")}}`;\n }\n\n return JSON.stringify(value);\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n","import type { RunContextEvent } from \"../../contracts/run-context/run-context.types.js\";\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\n\ninterface CompletedSubPromptEventPayload extends PlainObject {\n readonly parentStepId: string;\n readonly ordinal: number;\n readonly fingerprint: string;\n readonly output: PlainObject;\n}\n\nexport function findCompletedSubPromptEvent(\n events: readonly RunContextEvent[],\n parentStepId: string,\n ordinal: number,\n fingerprint: string,\n): RunContextEvent<CompletedSubPromptEventPayload> | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (event?.type !== \"subPrompt.completed\") {\n continue;\n }\n\n const payload = event.payload;\n if (\n payload.parentStepId === parentStepId &&\n payload.ordinal === ordinal &&\n payload.fingerprint === fingerprint &&\n isPlainObject(payload.output)\n ) {\n return event as RunContextEvent<CompletedSubPromptEventPayload>;\n }\n }\n\n return undefined;\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n","import type { AgentPrompt } from \"../../contracts/agents/agent-adapter.types.js\";\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport { runSubPrompt } from \"../../runtime/sub-prompts/run-sub-prompt.js\";\nimport type {\n PromptTemplateSource,\n SubPromptFactory,\n SubPromptOptions,\n} from \"./continuation.types.js\";\n\nexport function subPrompt<\n TInput extends PlainObject = PlainObject,\n TOutput extends PlainObject = PlainObject,\n>(\n source: AgentPrompt<TInput> | PromptTemplateSource,\n options: SubPromptOptions<TOutput>,\n): SubPromptFactory<TInput, TOutput> {\n const run = (input?: TInput): Promise<TOutput> => runSubPrompt(source, options, input);\n\n return run as SubPromptFactory<TInput, TOutput>;\n}\n","import type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport type { WorkflowInvocationOptions } from \"../step/continuation.types.js\";\nimport type { DefinedWorkflow, WorkflowBuilderOptions } from \"./workflow.types.js\";\n\nexport type { DefinedWorkflow, WorkflowBuilderOptions } from \"./workflow.types.js\";\n\nexport function defineWorkflow<\n TInput extends PlainObject = PlainObject,\n TOutput extends PlainObject = PlainObject,\n>(options: WorkflowBuilderOptions<TInput, TOutput>): DefinedWorkflow<TInput, TOutput> {\n assertBuilderObject(options, \"defineWorkflow\");\n if (typeof options.start !== \"function\") {\n throw new TypeError(\"defineWorkflow requires a start function.\");\n }\n\n const workflow = ((input: TInput, invocationOptions?: WorkflowInvocationOptions) => {\n const makeInvocation = (postContinuation?: (output: TOutput) => unknown) => ({\n kind: \"workflowInvocation\" as const,\n workflow,\n input,\n ...(invocationOptions === undefined ? {} : { options: invocationOptions }),\n ...(postContinuation === undefined ? {} : { postContinuation }),\n post(continuation: (output: TOutput) => unknown) {\n return makeInvocation(continuation);\n },\n });\n\n return makeInvocation();\n }) as unknown as DefinedWorkflow<TInput, TOutput>;\n\n return Object.assign(workflow, options);\n}\n\nfunction assertBuilderObject(\n value: unknown,\n builderName: string,\n): asserts value is { readonly id: string } {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new TypeError(`${builderName} requires a single object argument.`);\n }\n if (typeof (value as { readonly id?: unknown }).id !== \"string\") {\n throw new TypeError(`${builderName} requires an id string.`);\n }\n}\n","import type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport { runContextStorage } from \"../../runtime/run-context/run-context-storage.js\";\n\nexport type DeepReadonly<T> = T extends (...args: never[]) => unknown\n ? T\n : T extends readonly (infer U)[]\n ? readonly DeepReadonly<U>[]\n : T extends object\n ? { readonly [K in keyof T]: DeepReadonly<T[K]> }\n : T;\n\nexport interface WorkflowInputApi<TInput extends PlainObject = PlainObject> {\n input(): Promise<DeepReadonly<TInput>>;\n input<TOverrideInput extends PlainObject>(): Promise<DeepReadonly<TOverrideInput>>;\n inputValue<TKey extends keyof TInput & string>(key: TKey): Promise<DeepReadonly<TInput[TKey]>>;\n inputValue<TOverrideInput extends PlainObject, TKey extends keyof TOverrideInput & string>(\n key: TKey,\n ): Promise<DeepReadonly<TOverrideInput[TKey]>>;\n withInput<TTypedInput extends PlainObject>(): WorkflowInputApi<TTypedInput>;\n}\n\nexport const workflow: WorkflowInputApi = createWorkflowInputApi<PlainObject>();\n\nfunction createWorkflowInputApi<TInput extends PlainObject>(): WorkflowInputApi<TInput> {\n return {\n async input() {\n return cloneAndFreeze(readWorkflowInput());\n },\n async inputValue(key: string) {\n const input = readWorkflowInput();\n return cloneAndFreeze(input[key]);\n },\n withInput<TTypedInput extends PlainObject>(): WorkflowInputApi<TTypedInput> {\n return createWorkflowInputApi<TTypedInput>();\n },\n } as WorkflowInputApi<TInput>;\n}\n\nfunction readWorkflowInput(): PlainObject {\n const runContext = runContextStorage.getStore();\n if (!runContext) {\n throw new Error(\"workflow.input() called outside an active TrailStep run.\");\n }\n\n const input = runContext.events?.().find((event) => event.type === \"workflow.started\")\n ?.payload.input;\n if (!isPlainObject(input)) {\n throw new Error(\"workflow input is not available in the active TrailStep run.\");\n }\n\n return input;\n}\n\nfunction cloneAndFreeze<T>(value: T): DeepReadonly<T> {\n return deepFreeze(structuredClone(value)) as DeepReadonly<T>;\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value !== \"object\" || value === null) {\n return value;\n }\n\n Object.freeze(value);\n for (const property of Object.values(value)) {\n deepFreeze(property);\n }\n\n return value;\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n","import { lte } from \"semver\";\n\nimport type {\n DeprecationEntry,\n DeprecationManifest,\n DeprecationStatus,\n DeprecationTargetPackage,\n} from \"./deprecations.types.js\";\n\n// Scaffolding only — genuinely empty. No deprecation exists yet in this codebase. Real entries get\n// appended here the day a real breaking change to @trailstep/core or @trailstep/authoring's authoring API\n// actually happens. Do not add a fake/example entry to this array.\nexport const deprecationManifest: DeprecationManifest = [];\n\nexport interface FindDeprecationsAsOfQuery {\n readonly package: DeprecationTargetPackage;\n readonly version: string;\n}\n\n/**\n * Returns every manifest entry for query.package whose deprecatedSince is at or before\n * query.version, tagged with a severity. Calling this once with version set to a target\n * version naturally captures every entry between the installed version and the target, no matter\n * how many majors are being skipped in one update.\n */\nexport function findDeprecationsAsOf(\n manifest: DeprecationManifest,\n query: FindDeprecationsAsOfQuery,\n): readonly DeprecationStatus[] {\n return manifest\n .filter((entry) => entry.package === query.package && lte(entry.deprecatedSince, query.version))\n .map((entry) => toDeprecationStatus(entry, query.version));\n}\n\nfunction toDeprecationStatus(entry: DeprecationEntry, version: string): DeprecationStatus {\n const isRemoved = entry.removedIn !== undefined && lte(entry.removedIn, version);\n return { ...entry, severity: isRemoved ? \"blocking\" : \"warning\" };\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport const CANCELLATION_MARKER_FILE = \"cancel.json\";\n\nexport interface CancellationMarker {\n readonly requestedAt?: string;\n readonly reason?: string;\n readonly source?: string;\n}\n\nexport class WorkflowCancellationError extends Error {\n readonly cancellation: CancellationMarker;\n\n constructor(cancellation: CancellationMarker = {}) {\n super(\"Workflow cancellation requested.\");\n this.name = \"WorkflowCancellationError\";\n this.cancellation = cancellation;\n }\n}\n\nexport function cancellationMarkerPath(runDir: string): string {\n return join(runDir, CANCELLATION_MARKER_FILE);\n}\n\nexport async function readCancellationMarker(\n runDir: string,\n): Promise<CancellationMarker | undefined> {\n let contents: string;\n try {\n contents = await readFile(cancellationMarkerPath(runDir), \"utf8\");\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n\n try {\n return normalizeCancellationMarker(JSON.parse(contents));\n } catch {\n return {};\n }\n}\n\nexport async function writeCancellationMarker(options: {\n readonly runDir: string;\n readonly reason?: string;\n readonly source?: string;\n readonly requestedAt?: Date;\n}): Promise<{ readonly marker: CancellationMarker; readonly alreadyExisted: boolean }> {\n const marker: CancellationMarker = {\n requestedAt: (options.requestedAt ?? new Date()).toISOString(),\n ...(options.reason === undefined ? {} : { reason: options.reason }),\n ...(options.source === undefined ? {} : { source: options.source }),\n };\n const path = cancellationMarkerPath(options.runDir);\n\n try {\n await mkdir(options.runDir, { recursive: true });\n await writeFile(path, `${JSON.stringify(marker, null, 2)}\\n`, { flag: \"wx\" });\n return { marker, alreadyExisted: false };\n } catch (error) {\n if (isNodeError(error) && error.code === \"EEXIST\") {\n return { marker: (await readCancellationMarker(options.runDir)) ?? {}, alreadyExisted: true };\n }\n throw error;\n }\n}\n\nexport function cancellationPayload(cancellation: CancellationMarker): Record<string, unknown> {\n return {\n ...(cancellation.requestedAt === undefined ? {} : { requestedAt: cancellation.requestedAt }),\n ...(cancellation.reason === undefined ? {} : { reason: cancellation.reason }),\n ...(cancellation.source === undefined ? {} : { source: cancellation.source }),\n };\n}\n\nexport function isWorkflowCancellationError(error: unknown): error is WorkflowCancellationError {\n return error instanceof WorkflowCancellationError;\n}\n\nexport function throwIfCancellationRequested(cancellation: CancellationMarker | undefined): void {\n if (cancellation !== undefined) {\n throw new WorkflowCancellationError(cancellation);\n }\n}\n\nfunction normalizeCancellationMarker(value: unknown): CancellationMarker {\n if (!isPlainObject(value)) {\n return {};\n }\n\n return {\n ...(typeof value.requestedAt === \"string\" ? { requestedAt: value.requestedAt } : {}),\n ...(typeof value.reason === \"string\" ? { reason: value.reason } : {}),\n ...(typeof value.source === \"string\" ? { source: value.source } : {}),\n };\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n","export interface RetryPolicy {\n readonly maxAttempts: number;\n}\n\nexport interface RetryPolicyInput {\n readonly maxAttempts?: unknown;\n}\n\nexport interface ResolveRetryPolicyOptions {\n readonly global?: RetryPolicyInput;\n readonly workflow?: RetryPolicyInput;\n readonly step?: RetryPolicyInput;\n}\n\nconst BUILT_IN_RETRY_POLICY: RetryPolicy = { maxAttempts: 2 };\n\nexport function resolveRetryPolicy(options: ResolveRetryPolicyOptions): RetryPolicy {\n return validateRetryPolicy(\n firstConfiguredPolicy(options.step, options.workflow, options.global) ?? BUILT_IN_RETRY_POLICY,\n );\n}\n\nexport function validateRetryPolicy(input: RetryPolicyInput): RetryPolicy {\n const maxAttempts = input.maxAttempts ?? BUILT_IN_RETRY_POLICY.maxAttempts;\n\n if (typeof maxAttempts !== \"number\" || !Number.isInteger(maxAttempts) || maxAttempts < 1) {\n throw new TypeError(\"retry.maxAttempts must be an integer greater than or equal to 1.\");\n }\n\n return { maxAttempts };\n}\n\nfunction firstConfiguredPolicy(\n ...policies: readonly (RetryPolicyInput | undefined)[]\n): RetryPolicyInput | undefined {\n return policies.find((policy) => policy?.maxAttempts !== undefined);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport { normalizeShape } from \"../../authoring/shape/json-schema.js\";\nimport type { ContinuationResult } from \"../../authoring/step/continuation.types.js\";\nimport type { Failure } from \"../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport type {\n Event,\n Result,\n RunWorkflowOptions,\n} from \"../../runtime/run-workflow/run-workflow.types.js\";\nimport { appendEvent, readRunState, writeRunState } from \"../artifacts/run-storage.js\";\nimport {\n type CancellationMarker,\n cancellationPayload,\n isWorkflowCancellationError,\n readCancellationMarker,\n} from \"../cancellation/cancellation.js\";\nimport { runContinuation } from \"../continuation/run-continuation/run-continuation.js\";\nimport { createEvent } from \"../events/create-run-event.js\";\nimport { isFailureLikeError } from \"../failures/failure-like.js\";\nimport { workflowFailure } from \"../failures/workflow-failure.js\";\nimport {\n findDanglingInteractiveSessionStart,\n reattachInProgressStep,\n} from \"../resume/reattach-in-progress-step/reattach-in-progress-step.js\";\nimport { replayToFailedStep } from \"../resume/replay-to-failed-step/replay-to-failed-step.js\";\nimport {\n type ReplayToWaitingStepResult,\n replayToWaitingStep,\n} from \"../resume/replay-to-waiting-step/replay-to-waiting-step.js\";\nimport { replayToRetryFailure } from \"../retry/replay-to-retry-failure.js\";\nimport { createRunContext } from \"../run-context/create-run-context.js\";\nimport { runContextStorage } from \"../run-context/run-context-storage.js\";\nimport { resolveAndValidateRunCwds } from \"./cwd.js\";\nimport { initializeRun } from \"./initialize-run.js\";\nimport { runRootContinuationArrayScheduler } from \"./root-continuation-array-scheduler.js\";\nimport { parseTrailStepConfigInput } from \"./trailstep-config-input.js\";\n\nexport async function runWorkflow<TInput extends PlainObject, TOutput extends PlainObject>(\n options: RunWorkflowOptions<TInput, TOutput>,\n): Promise<Result<TOutput>> {\n const maxSteps = options.maxSteps ?? 1000;\n const isResume = options.resume !== undefined;\n const isRetry = options.retry !== undefined;\n const isWaitContinue = options.continue !== undefined;\n const initialized = await initializeRun(options).catch((error) => {\n const existingRunDir =\n options.resume?.runDir ?? options.retry?.runDir ?? options.continue?.runDir;\n if (existingRunDir && isFailureLikeError(error)) {\n return {\n status: \"failure\" as const,\n runId: basename(existingRunDir),\n runName: basename(existingRunDir),\n runDir: existingRunDir,\n previousEvents: [],\n failure: workflowFailure(error),\n };\n }\n\n throw error;\n });\n\n if (\"status\" in initialized && initialized.status === \"failure\") {\n return {\n status: \"failure\",\n runId: initialized.runId,\n runDir: initialized.runDir,\n failure: initialized.failure,\n events: initialized.previousEvents,\n };\n }\n\n const { runId, runName, runDir, previousEvents } = initialized;\n const trailstepConfig =\n options.trailstepConfig === undefined\n ? undefined\n : parseTrailStepConfigInput(options.trailstepConfig);\n const { projectCwd, cwd } = await resolveAndValidateRunCwds(options);\n const events: Event[] = [...previousEvents];\n\n const emit = async (event: Event): Promise<void> => {\n events.push(event);\n await appendEvent(runDir, event);\n await options.eventSink?.(event);\n };\n\n const runContext = createRunContext({\n runId,\n runName,\n runDir,\n workflowId: options.workflow.id,\n workflowAgents: options.workflow.agents ?? {},\n projectCwd,\n cwd,\n executionCwd: cwd,\n trailstepConfig,\n workingAgentProcessRunner: options.workingAgentProcessRunner,\n providerWorkingRunner: options.providerWorkingRunner,\n emit,\n events: () => events,\n ...(isResume || isRetry ? { initialState: {} } : {}),\n });\n\n const cancelWorkflow = async (cancellation: CancellationMarker): Promise<Result<TOutput>> => {\n if (!events.some((event) => event.type === \"workflow.cancelRequested\")) {\n await emit(\n createEvent({\n runId,\n workflowId: options.workflow.id,\n type: \"workflow.cancelRequested\",\n payload: cancellationPayload(cancellation),\n }),\n );\n }\n\n if (!events.some((event) => event.type === \"workflow.cancelled\")) {\n await emit(\n createEvent({\n runId,\n workflowId: options.workflow.id,\n type: \"workflow.cancelled\",\n payload: cancellationPayload(cancellation),\n }),\n );\n }\n\n return {\n status: \"cancelled\",\n runId,\n runDir,\n cancellation,\n events,\n } as unknown as Result<TOutput>;\n };\n\n const failWorkflow = async (failure: Failure, message?: string): Promise<Result<TOutput>> => {\n await emit(\n createEvent({\n runId,\n workflowId: options.workflow.id,\n type: \"workflow.failed\",\n payload: {\n failure,\n ...(message === undefined ? {} : { message }),\n },\n }),\n );\n return {\n status: \"failure\",\n runId,\n runDir,\n failure,\n events,\n };\n };\n\n const failResumeValidation = (failure: Failure): Result<TOutput> => ({\n status: \"failure\",\n runId,\n runDir,\n failure,\n events,\n });\n\n try {\n return await runContextStorage.run(runContext, () => runWorkflowBody());\n } catch (error) {\n if (isWorkflowCancellationError(error)) {\n return await cancelWorkflow(error.cancellation);\n }\n\n return await failWorkflow(workflowFailure(error));\n }\n\n async function runWorkflowBody(): Promise<Result<TOutput>> {\n const inputSchema = options.workflow.inputShape\n ? normalizeShape(options.workflow.inputShape)\n : options.workflow.input;\n\n const previousTerminalStatus = readPreviousTerminalWorkflowStatus(previousEvents);\n const existingCancellation = readExistingCancellationEvent(previousEvents);\n const cancellation =\n previousTerminalStatus === undefined || previousTerminalStatus === \"cancelled\"\n ? (existingCancellation ?? (await readCancellationMarker(runDir)))\n : undefined;\n if (cancellation !== undefined) {\n return await cancelWorkflow(cancellation);\n }\n\n let workflowInput: TInput;\n let startNode: ContinuationResult | undefined;\n let waitResume: ReplayToWaitingStepResult | undefined;\n let isTrackRetry = false;\n\n if (isResume) {\n const danglingAnchor = findDanglingInteractiveSessionStart(previousEvents);\n const replay = await replayWithoutClobberingStateOnFailure(runDir, () =>\n danglingAnchor\n ? reattachInProgressStep({\n workflow: options.workflow,\n events: previousEvents,\n runDir,\n })\n : replayToFailedStep({\n workflow: options.workflow,\n events: previousEvents,\n runDir,\n }),\n );\n if (replay.status === \"failure\") {\n return failResumeValidation(replay.failure);\n }\n await runContext.state.hydratePersisted();\n\n workflowInput = inputSchema\n ? (inputSchema.assert(replay.input, \"workflow input\") as TInput)\n : (replay.input as TInput);\n startNode = replay.node;\n await emit(\n createEvent({\n runId,\n workflowId: options.workflow.id,\n type: \"workflow.resumed\",\n payload: {\n resumedFromRunDir: runDir,\n resumedStepId: replay.resumedStepId,\n sourceFailureEventId: replay.sourceFailureEventId,\n },\n }),\n );\n } else if (isWaitContinue) {\n if (await hasSupportedRootParallelTrackRetryMetadata(runDir)) {\n return failResumeValidation({\n code: \"continue_parallel_track_unsupported\",\n message:\n \"Continuing a waiting parallel track is not yet supported; retry the run or restart the workflow instead.\",\n });\n }\n\n const replay = await replayWithoutClobberingStateOnFailure(runDir, () =>\n replayToWaitingStep({\n workflow: options.workflow,\n events: previousEvents,\n runDir,\n }),\n );\n if (replay.status === \"failure\") {\n return failResumeValidation(replay.failure);\n }\n await runContext.state.hydratePersisted();\n\n workflowInput = inputSchema\n ? (inputSchema.assert(replay.input, \"workflow input\") as TInput)\n : (replay.input as TInput);\n startNode = replay.node;\n waitResume = replay;\n await emit(\n createEvent({\n runId,\n workflowId: options.workflow.id,\n type: \"workflow.resumed\",\n payload: {\n resumeKind: \"wait\",\n resumedFromRunDir: runDir,\n resumedStepId: replay.resumedStepId,\n sourceWaitEventId: replay.sourceWaitEventId,\n },\n }),\n );\n } else if (isRetry) {\n if (await hasSupportedRootParallelTrackRetryMetadata(runDir)) {\n const persistedInput = readWorkflowStartedInput(previousEvents);\n if (persistedInput === undefined) {\n return failResumeValidation({\n code: \"retry_target_not_found\",\n message: \"workflow.started payload is missing input.\",\n });\n }\n await runContext.state.hydratePersisted();\n await runContext.globalState.hydratePersisted();\n workflowInput = inputSchema\n ? (inputSchema.assert(persistedInput, \"workflow input\") as TInput)\n : (persistedInput as TInput);\n isTrackRetry = true;\n await emit(\n createEvent({\n runId,\n workflowId: options.workflow.id,\n type: \"workflow.retryStarted\",\n payload: {\n retryKind: options.retry.kind,\n retryPlanner: \"track\",\n retriedFromRunDir: runDir,\n },\n }),\n );\n } else {\n const replay = await replayWithoutClobberingStateOnFailure(runDir, () =>\n replayToRetryFailure({\n workflow: options.workflow,\n events: previousEvents,\n runDir,\n }),\n );\n if (replay.status === \"failure\") {\n return failResumeValidation(replay.failure);\n }\n await runContext.state.hydratePersisted();\n\n workflowInput = inputSchema\n ? (inputSchema.assert(replay.input, \"workflow input\") as TInput)\n : (replay.input as TInput);\n startNode = replay.node;\n await emit(\n createEvent({\n runId,\n workflowId: options.workflow.id,\n type: \"workflow.retryStarted\",\n payload: {\n retryKind: options.retry.kind,\n retriedFromRunDir: runDir,\n retriedStepId: replay.retriedStepId,\n sourceFailureEventId: replay.sourceFailureEventId,\n sourceFailureReplayPosition: replay.sourceFailureReplayPosition,\n },\n }),\n );\n }\n } else {\n workflowInput = inputSchema\n ? inputSchema.assert(options.input, \"workflow input\")\n : (options.input as TInput);\n await emit(\n createEvent({\n runId,\n workflowId: options.workflow.id,\n type: \"workflow.started\",\n payload: { input: workflowInput },\n }),\n );\n }\n\n const rootNode = startNode ?? options.workflow.start(workflowInput);\n const rootNodes = Array.isArray(rootNode) ? rootNode : [rootNode];\n const shouldUseRootArrayScheduler = (!isResume && !isRetry && !isWaitContinue) || isTrackRetry;\n const continuationResult = shouldUseRootArrayScheduler\n ? await runRootContinuationArrayScheduler({\n nodes: rootNodes,\n ...(Array.isArray(rootNode) ? { rootIsArray: true } : {}),\n runId,\n workflowId: options.workflow.id,\n emit,\n maxSteps,\n initialSource: `workflow.start for workflow ${options.workflow.id}`,\n workers: options.scheduler?.workers,\n workflowAgents: options.workflow.agents ?? {},\n workflowTimeout: options.workflow.timeout,\n runDir,\n projectCwd,\n cwd,\n trailstepConfig,\n workingAgentProcessRunner: options.workingAgentProcessRunner,\n providerWorkingRunner: options.providerWorkingRunner,\n processRunner: options.processRunner,\n ...(isTrackRetry\n ? {\n retry: {\n initialExecutedSteps: previousEvents.filter(\n (event) => event.type === \"step.started\",\n ).length,\n track: options.retry?.track,\n },\n }\n : {}),\n })\n : await runContinuation({\n node: rootNode,\n runId,\n workflowId: options.workflow.id,\n emit,\n maxSteps,\n initialSource: isRetry\n ? `retry for workflow ${options.workflow.id}`\n : isResume\n ? `resume for workflow ${options.workflow.id}`\n : `workflow.start for workflow ${options.workflow.id}`,\n // The original run already used one step-index slot per step.started\n // event ever recorded (successful or failed) -- newly-dispatched steps\n // after resume must continue that sequence, not restart at 1, or their\n // artifact directories collide with the pre-resume steps' directories.\n initialExecutedSteps:\n isResume || isRetry || isWaitContinue\n ? previousEvents.filter((event) => event.type === \"step.started\").length\n : undefined,\n ...(waitResume === undefined\n ? {}\n : {\n resumeWait: {\n stepId: waitResume.resumedStepId,\n stepIndex: waitResume.stepIndex,\n phaseIndex: waitResume.phaseIndex,\n phaseValue: waitResume.phaseValue,\n waitOutputs: waitResume.waitOutputs,\n seenWaitIds: waitResume.seenWaitIds,\n wait: waitResume.wait,\n },\n }),\n workflowAgents: options.workflow.agents ?? {},\n workflowTimeout: options.workflow.timeout,\n runDir,\n projectCwd,\n cwd,\n trailstepConfig,\n workingAgentProcessRunner: options.workingAgentProcessRunner,\n providerWorkingRunner: options.providerWorkingRunner,\n processRunner: options.processRunner,\n });\n\n if (\n continuationResult.status === \"failure\" ||\n continuationResult.status === \"absoluteFailure\"\n ) {\n return await failWorkflow(continuationResult.failure, continuationResult.message);\n }\n\n if (continuationResult.status === \"cancelled\") {\n return await cancelWorkflow(continuationResult.cancellation);\n }\n\n if (continuationResult.status === \"waiting\") {\n return {\n status: \"waiting\",\n runId,\n runDir,\n wait: continuationResult.wait,\n events,\n } as unknown as Result<TOutput>;\n }\n\n if (continuationResult.status === \"split\") {\n return await failWorkflow({\n code: \"unsupported_continuation\",\n message: \"A continuation array escaped workflow scheduling.\",\n });\n }\n\n const current = continuationResult.output;\n\n const outputSchema = options.workflow.outputShape\n ? normalizeShape(options.workflow.outputShape)\n : options.workflow.output;\n const output = (\n outputSchema ? outputSchema.assert(current, \"workflow output\") : current\n ) as TOutput;\n\n await emit(\n createEvent({\n runId,\n workflowId: options.workflow.id,\n type: \"workflow.completed\",\n payload: {\n output,\n ...(continuationResult.message === undefined\n ? {}\n : { message: continuationResult.message }),\n },\n }),\n );\n\n return {\n status: \"success\",\n runId,\n runDir,\n output,\n events,\n };\n }\n}\n\nasync function replayWithoutClobberingStateOnFailure<T extends { readonly status: string }>(\n runDir: string,\n replay: () => Promise<T>,\n): Promise<T> {\n const stateBeforeReplay = await readRunState(runDir);\n const result = await replay();\n if (result.status === \"failure\") {\n await writeRunState(runDir, stateBeforeReplay);\n }\n return result;\n}\n\nasync function hasSupportedRootParallelTrackRetryMetadata(runDir: string): Promise<boolean> {\n try {\n const track = JSON.parse(await readFile(join(runDir, \"track.json\"), \"utf8\")) as {\n readonly rootBranchId?: unknown;\n readonly splitOccurred?: unknown;\n readonly branches?: unknown;\n };\n if (\n track.splitOccurred !== true ||\n typeof track.rootBranchId !== \"string\" ||\n !Array.isArray(track.branches) ||\n !track.branches.every((branchId): branchId is string => typeof branchId === \"string\")\n ) {\n return false;\n }\n\n const branches = await Promise.all(\n track.branches.map(async (branchId) => {\n const branch = JSON.parse(\n await readFile(join(runDir, \"branches\", `${branchId}.json`), \"utf8\"),\n ) as { readonly branchId?: unknown; readonly parentBranchId?: unknown };\n return branch;\n }),\n );\n\n return branches.every((branch) =>\n branch.branchId === track.rootBranchId\n ? branch.parentBranchId === undefined\n : branch.parentBranchId === track.rootBranchId,\n );\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nfunction readWorkflowStartedInput(events: readonly Event[]): PlainObject | undefined {\n const started = events.find((event) => event.type === \"workflow.started\");\n const input = started?.payload.input;\n return typeof input === \"object\" && input !== null && !Array.isArray(input)\n ? (input as PlainObject)\n : undefined;\n}\n\nfunction readPreviousTerminalWorkflowStatus(\n events: readonly Event[],\n): \"completed\" | \"failed\" | \"cancelled\" | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (event?.type === \"workflow.completed\") {\n return \"completed\";\n }\n if (event?.type === \"workflow.failed\") {\n return \"failed\";\n }\n if (event?.type === \"workflow.cancelled\") {\n return \"cancelled\";\n }\n }\n\n return undefined;\n}\n\nfunction readExistingCancellationEvent(events: readonly Event[]): CancellationMarker | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (event?.type !== \"workflow.cancelled\") {\n continue;\n }\n\n return cancellationFromPayload(event.payload);\n }\n\n return undefined;\n}\n\nfunction cancellationFromPayload(payload: Record<string, unknown>): CancellationMarker {\n return {\n ...(typeof payload.requestedAt === \"string\" ? { requestedAt: payload.requestedAt } : {}),\n ...(typeof payload.reason === \"string\" ? { reason: payload.reason } : {}),\n ...(typeof payload.source === \"string\" ? { source: payload.source } : {}),\n };\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { dispatchAgentStep } from \"../../../agent-execution/dispatch-agent-step/dispatch-agent-step.js\";\nimport type { TrailStepConfig } from \"../../../agent-targeting/targeting.types.js\";\nimport { jsonSchema, normalizeShape } from \"../../../authoring/shape/json-schema.js\";\nimport type {\n CheckWaitHelpers,\n ContinuationResult,\n DisplayPhase,\n ParallelOptions,\n PromptPhase,\n StepCwdInput,\n StepDisplayValue,\n StepNode,\n WaitCheckResult,\n WaitDefinition,\n WaitPhase,\n} from \"../../../authoring/step/continuation.types.js\";\nimport {\n done,\n firstPromptPhase,\n getStepPhases,\n isAbsoluteDoneNode,\n isAbsoluteFailNode,\n isDoneNode,\n isFailNode,\n isParallelNode,\n isStepNode,\n isWorkflowInvocationNode,\n} from \"../../../authoring/step/step-node.js\";\nimport type { WorkflowAgentRole } from \"../../../contracts/agents/agent-role.types.js\";\nimport type { Failure } from \"../../../contracts/failures/failure.js\";\nimport { TrailStepFailureError } from \"../../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../../contracts/shapes/shape.types.js\";\nimport type {\n Event,\n RunWorkflowOptions,\n} from \"../../../runtime/run-workflow/run-workflow.types.js\";\nimport {\n resolveStepArtifactPaths,\n resolveWaitArtifactPaths,\n type WaitArtifactPaths,\n} from \"../../artifacts/step-artifacts.js\";\nimport {\n type CancellationMarker,\n cancellationPayload,\n isWorkflowCancellationError,\n readCancellationMarker,\n throwIfCancellationRequested,\n WorkflowCancellationError,\n} from \"../../cancellation/cancellation.js\";\nimport { createEvent } from \"../../events/create-run-event.js\";\nimport { stepExecutionFailure } from \"../../failures/step-execution-failure.js\";\nimport { runContextStorage } from \"../../run-context/run-context-storage.js\";\nimport { withStepContext } from \"../../run-context/with-step-context.js\";\nimport { validateDirectoryCwd } from \"../../run-workflow/cwd.js\";\nimport type { TimeoutPolicyInput } from \"../../timeout/timeout-policy.js\";\nimport { resolveTimeoutPolicy } from \"../../timeout/timeout-policy.js\";\nimport { resolveStepOutputSchema } from \"../resolve-step-output-schema/resolve-step-output-schema.js\";\n\nexport interface RunContinuationOptions {\n readonly node: ContinuationResult;\n readonly runId: string;\n readonly workflowId: string;\n readonly emit: (event: Event) => Promise<void>;\n readonly maxSteps: number;\n readonly initialSource: string;\n readonly initialExecutedSteps?: number;\n readonly allocateStepIndex?: () => number;\n readonly workflowAgents: Readonly<Record<string, WorkflowAgentRole>>;\n readonly workflowTimeout?: TimeoutPolicyInput;\n readonly runDir: string;\n readonly projectCwd?: string;\n readonly cwd: string;\n readonly trailstepConfig?: TrailStepConfig;\n readonly workingAgentProcessRunner?: RunWorkflowOptions[\"workingAgentProcessRunner\"];\n readonly providerWorkingRunner?: RunWorkflowOptions[\"providerWorkingRunner\"];\n readonly processRunner?: RunWorkflowOptions[\"processRunner\"];\n readonly resumeWait?: ResumeWaitOptions;\n readonly returnContinuationArrays?: boolean;\n}\n\nexport interface ResumeWaitOptions {\n readonly stepId: string;\n readonly stepIndex: number;\n readonly phaseIndex: number;\n readonly phaseValue: PlainObject;\n readonly waitOutputs: Readonly<Record<string, PlainObject>>;\n readonly seenWaitIds: readonly string[];\n readonly wait: ResumedWaitDetails;\n}\n\ntype WaitKind = \"input\" | \"check\";\n\nexport interface ResumedWaitDetails {\n readonly waitId: string;\n readonly kind: WaitKind;\n readonly message: string;\n readonly artifactPaths: WaitArtifactPaths;\n readonly outputSchema: Record<string, unknown>;\n}\n\nexport interface WaitingWait {\n readonly stepId: string;\n readonly waitId: string;\n readonly kind?: WaitKind;\n readonly message: string;\n readonly retryAfterSeconds?: number;\n readonly artifactPaths: WaitArtifactPaths;\n}\n\ninterface WorkflowInvocationFrame {\n readonly workflowId: string;\n readonly workflowAgents: Readonly<Record<string, WorkflowAgentRole>>;\n readonly workflowTimeout?: TimeoutPolicyInput;\n readonly workflowOutputSchema?: ReturnType<typeof normalizeShape>;\n readonly invocationWorkflowId: string;\n readonly postContinuation?: (\n output: PlainObject,\n ) => ContinuationResult | Promise<ContinuationResult>;\n}\n\nexport type RunContinuationResult =\n | { readonly status: \"success\"; readonly output: PlainObject; readonly message?: string }\n | { readonly status: \"failure\"; readonly failure: Failure; readonly message?: string }\n | { readonly status: \"absoluteSuccess\"; readonly output: PlainObject; readonly message?: string }\n | { readonly status: \"absoluteFailure\"; readonly failure: Failure; readonly message?: string }\n | { readonly status: \"waiting\"; readonly wait: WaitingWait }\n | { readonly status: \"cancelled\"; readonly cancellation: CancellationMarker }\n | {\n readonly status: \"split\";\n readonly nodes: readonly ContinuationResult[];\n readonly source: string;\n readonly parallelOptions?: ParallelOptions;\n readonly postContinuation?: (\n output: PlainObject,\n ) => ContinuationResult | Promise<ContinuationResult>;\n readonly afterPostContinuation?: (\n output: PlainObject,\n ) => ContinuationResult | Promise<ContinuationResult>;\n };\n\nexport async function runContinuation(\n options: RunContinuationOptions,\n): Promise<RunContinuationResult> {\n let node: ContinuationResult = options.node;\n let source = options.initialSource;\n // A resumed run's newly-dispatched steps must continue the on-disk step\n // index sequence from where the original run left off (every step.started\n // ever recorded, successful or failed), not restart at 1 -- otherwise their\n // artifact directories collide with/shadow the pre-resume steps' dirs.\n let executedSteps = options.initialExecutedSteps ?? 0;\n let pendingResumeWait = options.resumeWait;\n const trailstepConfig = options.trailstepConfig;\n const invocationFrames: WorkflowInvocationFrame[] = [];\n let currentWorkflowId = options.workflowId;\n let currentWorkflowAgents = options.workflowAgents;\n let currentWorkflowTimeout = options.workflowTimeout;\n let currentWorkflowOutputSchema: ReturnType<typeof normalizeShape> | undefined;\n\n const splitPostContinuationForInvocationFrames = ():\n | ((output: PlainObject) => ContinuationResult | Promise<ContinuationResult>)\n | undefined => {\n if (invocationFrames.length === 0) {\n return undefined;\n }\n\n const frames = [...invocationFrames];\n const splitWorkflowOutputSchema = currentWorkflowOutputSchema;\n return async (aggregateOutput: PlainObject): Promise<ContinuationResult> => {\n let output: PlainObject;\n try {\n output =\n splitWorkflowOutputSchema === undefined\n ? aggregateOutput\n : splitWorkflowOutputSchema.assert(\n aggregateOutput,\n `invoked workflow ${frames[frames.length - 1]?.invocationWorkflowId ?? currentWorkflowId} output`,\n );\n } catch (error) {\n throw failureFromError(error);\n }\n\n while (frames.length > 0) {\n const frame = frames.pop();\n if (frame?.postContinuation !== undefined) {\n return await frame.postContinuation(output);\n }\n }\n\n return done(output);\n };\n };\n\n const splitPostContinuations = (\n postContinuation:\n | ((output: PlainObject) => ContinuationResult | Promise<ContinuationResult>)\n | undefined,\n ) => {\n const invocationPostContinuation = splitPostContinuationForInvocationFrames();\n if (postContinuation === undefined) {\n return invocationPostContinuation === undefined\n ? {}\n : { postContinuation: invocationPostContinuation };\n }\n return invocationPostContinuation === undefined\n ? { postContinuation }\n : { postContinuation, afterPostContinuation: invocationPostContinuation };\n };\n\n while (true) {\n const pendingCancellation = await readCancellationMarker(options.runDir);\n if (pendingCancellation !== undefined) {\n return { status: \"cancelled\", cancellation: pendingCancellation };\n }\n\n if (isDoneNode(node)) {\n const frame = invocationFrames.pop();\n if (frame !== undefined) {\n const invocationWorkflowId = frame.invocationWorkflowId;\n let output: PlainObject;\n try {\n output =\n currentWorkflowOutputSchema === undefined\n ? node.output\n : currentWorkflowOutputSchema.assert(\n node.output,\n `invoked workflow ${invocationWorkflowId} output`,\n );\n } catch (error) {\n return { status: \"failure\", failure: failureFromError(error) };\n }\n\n currentWorkflowId = frame.workflowId;\n currentWorkflowAgents = frame.workflowAgents;\n currentWorkflowTimeout = frame.workflowTimeout;\n currentWorkflowOutputSchema = frame.workflowOutputSchema;\n\n if (frame.postContinuation !== undefined) {\n try {\n node = await frame.postContinuation(output);\n } catch (error) {\n return {\n status: \"failure\",\n failure: stepExecutionFailure(\n new Error(\n `workflow invocation post failed for ${invocationWorkflowId}: ${errorMessage(error)}`,\n ),\n ),\n };\n }\n source = `post for workflow invocation ${invocationWorkflowId}`;\n continue;\n }\n\n return {\n status: \"success\",\n output,\n ...(node.message === undefined ? {} : { message: node.message }),\n };\n }\n\n return {\n status: \"success\",\n output: node.output,\n ...(node.message === undefined ? {} : { message: node.message }),\n };\n }\n\n if (isFailNode(node)) {\n return {\n status: \"failure\",\n failure: node.failure,\n ...(node.message === undefined ? {} : { message: node.message }),\n };\n }\n\n if (options.returnContinuationArrays === true && isAbsoluteDoneNode(node)) {\n return {\n status: \"absoluteSuccess\",\n output: node.output,\n ...(node.message === undefined ? {} : { message: node.message }),\n };\n }\n\n if (options.returnContinuationArrays === true && isAbsoluteFailNode(node)) {\n return {\n status: \"absoluteFailure\",\n failure: node.failure,\n ...(node.message === undefined ? {} : { message: node.message }),\n };\n }\n\n if (Array.isArray(node) && options.returnContinuationArrays === true) {\n return {\n status: \"split\",\n nodes: node,\n source,\n ...splitPostContinuations(undefined),\n };\n }\n\n if (isParallelNode(node) && options.returnContinuationArrays === true) {\n return {\n status: \"split\",\n nodes: node.nodes,\n source,\n ...(node.options === undefined ? {} : { parallelOptions: node.options }),\n ...splitPostContinuations(node.postContinuation),\n };\n }\n\n if (isWorkflowInvocationNode(node)) {\n const invocation = node;\n const inputSchema = invocation.workflow.inputShape\n ? normalizeShape(invocation.workflow.inputShape)\n : invocation.workflow.input;\n let input: PlainObject;\n try {\n input =\n inputSchema === undefined\n ? invocation.input\n : inputSchema.assert(\n invocation.input,\n `invoked workflow ${invocation.workflow.id} input`,\n );\n } catch (error) {\n return { status: \"failure\", failure: failureFromError(error) };\n }\n\n invocationFrames.push({\n workflowId: currentWorkflowId,\n workflowAgents: currentWorkflowAgents,\n ...(currentWorkflowTimeout === undefined\n ? {}\n : { workflowTimeout: currentWorkflowTimeout }),\n ...(currentWorkflowOutputSchema === undefined\n ? {}\n : { workflowOutputSchema: currentWorkflowOutputSchema }),\n invocationWorkflowId: invocation.workflow.id,\n ...(invocation.postContinuation === undefined\n ? {}\n : { postContinuation: invocation.postContinuation }),\n });\n currentWorkflowId = invocation.workflow.id;\n currentWorkflowAgents = invocation.workflow.agents ?? {};\n currentWorkflowTimeout = invocation.workflow.timeout;\n currentWorkflowOutputSchema = invocation.workflow.outputShape\n ? normalizeShape(invocation.workflow.outputShape)\n : invocation.workflow.output === undefined\n ? undefined\n : normalizeShape(invocation.workflow.output);\n node = invocation.workflow.start(input);\n source = `workflow.start for workflow ${invocation.workflow.id}`;\n continue;\n }\n\n const unsupportedFailure = unsupportedContinuationFailure(node, source);\n if (unsupportedFailure !== undefined) {\n return {\n status: \"failure\",\n failure: unsupportedFailure,\n };\n }\n\n if (!isStepNode(node)) {\n return {\n status: \"failure\",\n failure: continuationFailure(source),\n };\n }\n\n const stepNode = node;\n const { config } = stepNode;\n const resumeWait = pendingResumeWait;\n if (resumeWait !== undefined && resumeWait.stepId !== config.id) {\n return {\n status: \"failure\",\n failure: continuationFailure(`wait resume for step ${resumeWait.stepId}`),\n };\n }\n\n let stepIndex: number;\n if (resumeWait === undefined) {\n if (executedSteps >= options.maxSteps) {\n return {\n status: \"failure\",\n failure: stepExecutionFailure(\n new Error(`workflow exceeded maxSteps guard (${options.maxSteps})`),\n ),\n };\n }\n if (options.allocateStepIndex !== undefined) {\n stepIndex = options.allocateStepIndex();\n executedSteps += 1;\n } else {\n executedSteps += 1;\n stepIndex = executedSteps;\n }\n } else {\n stepIndex = resumeWait.stepIndex;\n pendingResumeWait = undefined;\n }\n const phases = getStepPhases(stepNode);\n const hasPrompt = phases.some((phase) => phase.kind === \"prompt\");\n const timeoutPolicy = resolveTimeoutPolicy({\n global: trailstepConfig?.settings?.timeout,\n workflow:\n currentWorkflowTimeout ??\n trailstepConfig?.workflows?.[currentWorkflowId]?.settings?.timeout,\n step: config.timeout,\n });\n const maxSubPrompts =\n firstPromptPhase(phases)?.maxSubPrompts ??\n config.maxSubPrompts ??\n trailstepConfig?.workflows?.[currentWorkflowId]?.settings?.maxSubPrompts;\n\n if (resumeWait === undefined) {\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: currentWorkflowId,\n stepId: config.id,\n type: \"step.started\",\n payload: {\n stepName: config.id,\n ...(config.title === undefined ? {} : { title: config.title }),\n ...(config.description === undefined ? {} : { description: config.description }),\n kind: hasPrompt ? \"agent\" : \"code\",\n },\n }),\n );\n }\n\n try {\n const stepCwd = await resolveStepExecutionCwd({\n stepId: config.id,\n workflowId: currentWorkflowId,\n defaultCwd: options.cwd,\n input: config.input,\n cwdInput: config.cwd,\n });\n const stepArtifacts = resolveStepArtifactPaths({\n runDir: options.runDir,\n stepId: config.id,\n stepIndex,\n });\n\n const stepResult = await runWithStepControl({\n stepId: config.id,\n timeoutMs: timeoutPolicy.timeoutMs,\n readCancellation: async () => await readCancellationMarker(options.runDir),\n run: async (signal) =>\n await withStepContext(\n config.id,\n stepArtifacts.stepDir,\n async () => {\n const phaseResult = await runStepPhases({\n stepNode,\n timeoutMs: timeoutPolicy.timeoutMs,\n signal,\n readCancellation: async () => await readCancellationMarker(options.runDir),\n ...(resumeWait === undefined\n ? {}\n : {\n resume: {\n startPhaseIndex: resumeWait.phaseIndex,\n phaseValue: resumeWait.phaseValue,\n waitOutputs: resumeWait.waitOutputs,\n seenWaitIds: resumeWait.seenWaitIds,\n wait: resumeWait.wait,\n },\n }),\n emitDisplay: async (phase, output, phaseIndex) => {\n const payload = await resolveDisplayPayload({\n phase,\n input: config.input,\n output,\n phaseIndex,\n stepId: config.id,\n });\n\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: currentWorkflowId,\n stepId: config.id,\n type: \"step.display\",\n payload,\n }),\n );\n },\n handleWait: async (phase, output, phaseIndex, waits, previousWaitId) => {\n return await handleWaitPhase({\n phase,\n input: config.input,\n output,\n waits,\n phaseIndex,\n previousWaitId,\n stepId: config.id,\n stepArtifactId: stepArtifacts.artifactStepId,\n runDir: options.runDir,\n runId: options.runId,\n workflowId: currentWorkflowId,\n emit: options.emit,\n });\n },\n handleResumedWait: async (wait) =>\n await handleResumedWaitPhase({\n wait,\n stepId: config.id,\n runDir: options.runDir,\n runId: options.runId,\n workflowId: currentWorkflowId,\n emit: options.emit,\n }),\n dispatchPrompt: async (phase) => {\n const outputSchema = resolveStepOutputSchema(phase);\n if (!outputSchema) {\n throw new Error(`step ${config.id} with a prompt requires an output shape`);\n }\n\n const rawOutput = await dispatchAgentStep({\n config: { ...config, ...phase },\n outputSchema,\n interactiveOutputMode:\n phase.mode === \"interactive\" && phase.output !== undefined\n ? \"json\"\n : \"session-file\",\n runId: options.runId,\n workflowId: currentWorkflowId,\n emit: options.emit,\n workflowAgents: currentWorkflowAgents,\n runDir: options.runDir,\n projectCwd: options.projectCwd ?? options.cwd,\n cwd: stepCwd,\n trailstepConfig,\n workingAgentProcessRunner: options.workingAgentProcessRunner,\n providerWorkingRunner: options.providerWorkingRunner,\n processRunner: options.processRunner,\n stepIndex,\n signal,\n });\n throwIfStepTimedOut(signal, config.id, timeoutPolicy.timeoutMs);\n const output = outputSchema.assert(rawOutput, `step ${config.id} output`);\n\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: currentWorkflowId,\n stepId: config.id,\n type: \"step.completed\",\n payload: { output },\n }),\n );\n\n return output;\n },\n });\n\n if (phaseResult.status === \"waiting\") {\n return phaseResult;\n }\n\n const nextNode = phaseResult.node;\n if (isFailNode(nextNode)) {\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: currentWorkflowId,\n stepId: config.id,\n type: \"step.failed\",\n payload: { failure: nextNode.failure },\n }),\n );\n return phaseResult;\n }\n\n if (!hasPrompt) {\n // A no-prompt step's .do(...) IS its work — only report completion once it has\n // actually run without throwing or returning fail(...), matching the with-prompt\n // case's \"step.completed means the step's own work succeeded\" meaning.\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: currentWorkflowId,\n stepId: config.id,\n type: \"step.completed\",\n payload: {},\n }),\n );\n }\n\n throwIfStepTimedOut(signal, config.id, timeoutPolicy.timeoutMs);\n return phaseResult;\n },\n { maxSubPrompts, cwd: stepCwd, executionCwd: stepCwd },\n ),\n });\n\n if (stepResult.status === \"waiting\") {\n return stepResult;\n }\n\n const nextNode = stepResult.node;\n if (Array.isArray(nextNode) && options.returnContinuationArrays === true) {\n return {\n status: \"split\",\n nodes: nextNode,\n source: `step ${config.id}`,\n ...splitPostContinuations(undefined),\n };\n }\n\n if (isParallelNode(nextNode) && options.returnContinuationArrays === true) {\n return {\n status: \"split\",\n nodes: nextNode.nodes,\n source: `step ${config.id}`,\n ...splitPostContinuations(nextNode.postContinuation),\n };\n }\n\n if (options.returnContinuationArrays === true && isAbsoluteDoneNode(nextNode)) {\n return {\n status: \"absoluteSuccess\",\n output: nextNode.output,\n ...(nextNode.message === undefined ? {} : { message: nextNode.message }),\n };\n }\n\n if (options.returnContinuationArrays === true && isAbsoluteFailNode(nextNode)) {\n return {\n status: \"absoluteFailure\",\n failure: nextNode.failure,\n ...(nextNode.message === undefined ? {} : { message: nextNode.message }),\n };\n }\n\n const unsupportedStepFailure = unsupportedContinuationFailure(nextNode, `step ${config.id}`);\n if (unsupportedStepFailure !== undefined) {\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: currentWorkflowId,\n stepId: config.id,\n type: \"step.failed\",\n payload: { failure: unsupportedStepFailure },\n }),\n );\n return { status: \"failure\", failure: unsupportedStepFailure };\n }\n\n if (\n !isStepNode(nextNode) &&\n !isWorkflowInvocationNode(nextNode) &&\n !isDoneNode(nextNode) &&\n !isFailNode(nextNode)\n ) {\n const failure = continuationFailure(`step ${config.id}`);\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: currentWorkflowId,\n stepId: config.id,\n type: \"step.failed\",\n payload: { failure },\n }),\n );\n return { status: \"failure\", failure };\n }\n\n if (isFailNode(nextNode)) {\n return {\n status: \"failure\",\n failure: nextNode.failure,\n ...(nextNode.message === undefined ? {} : { message: nextNode.message }),\n };\n }\n\n node = nextNode;\n source = `step ${config.id}`;\n } catch (error) {\n if (isWorkflowCancellationError(error)) {\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: currentWorkflowId,\n stepId: config.id,\n type: \"step.cancelled\",\n payload: cancellationPayload(error.cancellation),\n }),\n );\n return { status: \"cancelled\", cancellation: error.cancellation };\n }\n\n const failure = stepExecutionFailure(error);\n\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: currentWorkflowId,\n stepId: config.id,\n type: \"step.failed\",\n payload: { failure },\n }),\n );\n\n if (!stepNode.onError) {\n return { status: \"failure\", failure };\n }\n\n try {\n const nextNode = stepNode.onError(failure);\n const errorSource = `error continuation for step ${config.id}`;\n if (Array.isArray(nextNode) && options.returnContinuationArrays === true) {\n return {\n status: \"split\",\n nodes: nextNode,\n source: errorSource,\n ...splitPostContinuations(undefined),\n };\n }\n\n if (isParallelNode(nextNode) && options.returnContinuationArrays === true) {\n return {\n status: \"split\",\n nodes: nextNode.nodes,\n source: errorSource,\n ...splitPostContinuations(nextNode.postContinuation),\n };\n }\n\n if (options.returnContinuationArrays === true && isAbsoluteDoneNode(nextNode)) {\n return {\n status: \"absoluteSuccess\",\n output: nextNode.output,\n ...(nextNode.message === undefined ? {} : { message: nextNode.message }),\n };\n }\n\n if (options.returnContinuationArrays === true && isAbsoluteFailNode(nextNode)) {\n return {\n status: \"absoluteFailure\",\n failure: nextNode.failure,\n ...(nextNode.message === undefined ? {} : { message: nextNode.message }),\n };\n }\n\n const unsupportedErrorFailure = unsupportedContinuationFailure(nextNode, errorSource);\n if (unsupportedErrorFailure !== undefined) {\n return {\n status: \"failure\",\n failure: unsupportedErrorFailure,\n };\n }\n\n if (\n !isStepNode(nextNode) &&\n !isWorkflowInvocationNode(nextNode) &&\n !isDoneNode(nextNode) &&\n !isFailNode(nextNode)\n ) {\n return {\n status: \"failure\",\n failure: continuationFailure(errorSource),\n };\n }\n\n node = nextNode;\n source = errorSource;\n } catch (errorContinuationError) {\n return {\n status: \"failure\",\n failure: stepExecutionFailure(\n new Error(\n `error continuation for step ${config.id} failed: ${errorMessage(errorContinuationError)}`,\n ),\n ),\n };\n }\n }\n }\n}\n\ntype RunStepPhasesResult =\n | { readonly status: \"continued\"; readonly node: ContinuationResult }\n | { readonly status: \"waiting\"; readonly wait: WaitingWait };\n\ntype HandleWaitResult =\n | { readonly status: \"satisfied\"; readonly waitId: string; readonly output: PlainObject }\n | { readonly status: \"waiting\"; readonly wait: WaitingWait };\n\nasync function resolveStepExecutionCwd(options: {\n readonly stepId: string;\n readonly workflowId: string;\n readonly defaultCwd: string;\n readonly input: PlainObject;\n readonly cwdInput: StepCwdInput | undefined;\n}): Promise<string> {\n if (options.cwdInput === undefined) {\n return options.defaultCwd;\n }\n\n const cwd =\n typeof options.cwdInput === \"function\"\n ? await resolveStepCwdCallback(options.cwdInput, options)\n : options.cwdInput;\n\n if (typeof cwd !== \"string\") {\n throw new TypeError(`step ${options.stepId} cwd must resolve to a string.`);\n }\n\n await validateDirectoryCwd(cwd, `step ${options.stepId} cwd`);\n return cwd;\n}\n\nasync function resolveStepCwdCallback(\n cwdInput: Exclude<StepCwdInput, string>,\n options: {\n readonly stepId: string;\n readonly workflowId: string;\n readonly input: PlainObject;\n },\n): Promise<unknown> {\n const context = runContextStorage.getStore();\n if (!context) {\n throw new Error(`step ${options.stepId} cwd callback requires an active run context.`);\n }\n\n return await cwdInput({\n input: options.input,\n state: context.state,\n workflow: { id: options.workflowId },\n });\n}\n\nasync function runStepPhases(options: {\n readonly stepNode: StepNode;\n readonly timeoutMs?: number;\n readonly signal?: AbortSignal;\n readonly readCancellation: () => Promise<CancellationMarker | undefined>;\n readonly emitDisplay: (\n phase: DisplayPhase,\n output: PlainObject,\n phaseIndex: number,\n ) => Promise<void>;\n readonly handleWait: (\n phase: WaitPhase,\n output: PlainObject,\n phaseIndex: number,\n waits: Readonly<Record<string, PlainObject>>,\n previousWaitId?: string,\n ) => Promise<HandleWaitResult>;\n readonly handleResumedWait: (wait: ResumedWaitDetails) => Promise<HandleWaitResult>;\n readonly dispatchPrompt: (phase: PromptPhase) => Promise<PlainObject>;\n readonly resume?: {\n readonly startPhaseIndex: number;\n readonly phaseValue: PlainObject;\n readonly waitOutputs: Readonly<Record<string, PlainObject>>;\n readonly seenWaitIds: readonly string[];\n readonly wait: ResumedWaitDetails;\n };\n}): Promise<RunStepPhasesResult> {\n const { stepNode } = options;\n let phaseValue = options.resume?.phaseValue ?? stepNode.config.input;\n let nextNode: ContinuationResult | undefined;\n const waitOutputs: Record<string, PlainObject> = { ...(options.resume?.waitOutputs ?? {}) };\n const seenWaitIds = new Set<string>(options.resume?.seenWaitIds ?? []);\n const phases = getStepPhases(stepNode);\n assertNoDuplicateStaticWaitIds(phases, stepNode.config.id);\n\n for (const [phaseIndex, phase] of phases.entries()) {\n if (phaseIndex < (options.resume?.startPhaseIndex ?? 0)) {\n continue;\n }\n throwIfCancellationRequested(await options.readCancellation());\n\n if (phase.kind === \"display\") {\n await options.emitDisplay(phase, phaseValue, phaseIndex);\n throwIfCancellationRequested(await options.readCancellation());\n throwIfStepTimedOut(options.signal, stepNode.config.id, options.timeoutMs);\n continue;\n }\n\n if (phase.kind === \"wait\") {\n const waitResult =\n options.resume !== undefined && phaseIndex === options.resume.startPhaseIndex\n ? options.resume.wait.kind === \"check\"\n ? await options.handleWait(\n phase,\n phaseValue,\n phaseIndex,\n waitOutputs,\n options.resume.wait.waitId,\n )\n : await options.handleResumedWait(options.resume.wait)\n : await options.handleWait(phase, phaseValue, phaseIndex, waitOutputs);\n const waitId = waitResult.status === \"waiting\" ? waitResult.wait.waitId : waitResult.waitId;\n if (seenWaitIds.has(waitId)) {\n throw new Error(`step ${stepNode.config.id} has duplicate wait id '${waitId}'`);\n }\n seenWaitIds.add(waitId);\n\n if (waitResult.status === \"waiting\") {\n throwIfCancellationRequested(await options.readCancellation());\n return waitResult;\n }\n\n waitOutputs[waitResult.waitId] = waitResult.output;\n throwIfCancellationRequested(await options.readCancellation());\n throwIfStepTimedOut(options.signal, stepNode.config.id, options.timeoutMs);\n continue;\n }\n\n if (nextNode !== undefined) {\n throw new Error(`step ${stepNode.config.id} has executable phases after a do phase`);\n }\n\n if (phase.kind === \"prompt\") {\n phaseValue = await options.dispatchPrompt(phase);\n throwIfCancellationRequested(await options.readCancellation());\n throwIfStepTimedOut(options.signal, stepNode.config.id, options.timeoutMs);\n continue;\n }\n\n nextNode = await phase.onOutput(\n withWaitsDoContext(phaseValue, waitOutputs),\n stepNode.config.input,\n );\n throwIfCancellationRequested(await options.readCancellation());\n throwIfStepTimedOut(options.signal, stepNode.config.id, options.timeoutMs);\n }\n\n if (nextNode === undefined) {\n throw new Error(`step ${stepNode.config.id} has no do phase`);\n }\n\n return { status: \"continued\", node: nextNode };\n}\n\nfunction assertNoDuplicateStaticWaitIds(phases: readonly unknown[], stepId: string): void {\n const seenWaitIds = new Set<string>();\n for (const phase of phases) {\n if (!isPlainObject(phase) || phase.kind !== \"wait\") {\n continue;\n }\n const wait = phase.wait;\n if (typeof wait === \"function\" || !isPlainObject(wait) || typeof wait.id !== \"string\") {\n continue;\n }\n if (seenWaitIds.has(wait.id)) {\n throw new Error(`step ${stepId} has duplicate wait id '${wait.id}'`);\n }\n seenWaitIds.add(wait.id);\n }\n}\n\nasync function handleWaitPhase(options: {\n readonly phase: WaitPhase;\n readonly input: PlainObject;\n readonly output: PlainObject;\n readonly waits: Readonly<Record<string, PlainObject>>;\n readonly phaseIndex: number;\n readonly previousWaitId?: string;\n readonly stepId: string;\n readonly stepArtifactId: string;\n readonly runDir: string;\n readonly runId: string;\n readonly workflowId: string;\n readonly emit: (event: Event) => Promise<void>;\n}): Promise<HandleWaitResult> {\n if (options.phase.options !== undefined) {\n return await handleCheckWaitPhase({\n ...options,\n phase: options.phase as WaitPhase & { readonly options: NonNullable<WaitPhase[\"options\"]> },\n });\n }\n\n const wait = await resolveWaitDefinition(options.phase, {\n input: options.input,\n output: options.output,\n waits: options.waits,\n });\n validateWaitDefinition(wait, options.stepId, options.phaseIndex);\n\n const artifactPaths = resolveWaitArtifactPaths({\n runDir: options.runDir,\n stepArtifactId: options.stepArtifactId,\n waitId: wait.id,\n });\n const request = {\n stepId: options.stepId,\n waitId: wait.id,\n kind: wait.kind,\n message: wait.message,\n phaseIndex: options.phaseIndex,\n outputSchema: normalizeShape(wait.output).jsonSchema,\n };\n\n await mkdir(artifactPaths.waitDir, { recursive: true });\n await writeFile(artifactPaths.requestFile, `${JSON.stringify(request, null, 2)}\\n`, \"utf8\");\n\n const answerText = await readTextIfExists(artifactPaths.answerFile);\n if (answerText.status === \"missing\") {\n const waiting = {\n stepId: options.stepId,\n waitId: wait.id,\n message: wait.message,\n artifactPaths: artifactPaths.runRelative,\n };\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: options.stepId,\n type: \"wait.started\",\n payload: {\n waitId: wait.id,\n kind: wait.kind,\n message: wait.message,\n phaseIndex: options.phaseIndex,\n artifactPaths: artifactPaths.runRelative,\n },\n }),\n );\n return { status: \"waiting\", wait: waiting };\n }\n\n try {\n const parsedAnswer: unknown = JSON.parse(answerText.value);\n if (!isPlainObject(parsedAnswer)) {\n throw new TypeError(`step ${options.stepId} wait ${wait.id} answer must be a plain object`);\n }\n const output = normalizeShape(wait.output).assert(\n parsedAnswer,\n `step ${options.stepId} wait ${wait.id} answer`,\n );\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: options.stepId,\n type: \"wait.satisfied\",\n payload: {\n waitId: wait.id,\n kind: wait.kind,\n message: wait.message,\n phaseIndex: options.phaseIndex,\n artifactPaths: artifactPaths.runRelative,\n output,\n },\n }),\n );\n return { status: \"satisfied\", waitId: wait.id, output };\n } catch (error) {\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: options.stepId,\n type: \"wait.failed\",\n payload: {\n waitId: wait.id,\n kind: wait.kind,\n message: wait.message,\n phaseIndex: options.phaseIndex,\n artifactPaths: artifactPaths.runRelative,\n failure: stepExecutionFailure(error),\n },\n }),\n );\n throw error;\n }\n}\n\nasync function handleCheckWaitPhase(options: {\n readonly phase: WaitPhase & { readonly options: NonNullable<WaitPhase[\"options\"]> };\n readonly input: PlainObject;\n readonly output: PlainObject;\n readonly waits: Readonly<Record<string, PlainObject>>;\n readonly phaseIndex: number;\n readonly previousWaitId?: string;\n readonly stepId: string;\n readonly stepArtifactId: string;\n readonly runDir: string;\n readonly runId: string;\n readonly workflowId: string;\n readonly emit: (event: Event) => Promise<void>;\n}): Promise<HandleWaitResult> {\n const outputSchema = normalizeShape(options.phase.options.output);\n const defaultWaitId = options.previousWaitId ?? `check-${options.phaseIndex}`;\n let waitId = defaultWaitId;\n\n try {\n if (typeof options.phase.wait !== \"function\") {\n throw new TypeError(\n `step ${options.stepId} check wait phase ${options.phaseIndex} requires a callback.`,\n );\n }\n\n const check = options.phase.wait as (context: {\n readonly input: PlainObject;\n readonly output: PlainObject;\n readonly waits: Readonly<Record<string, PlainObject>>;\n readonly wait: CheckWaitHelpers<PlainObject>;\n }) => WaitCheckResult | Promise<WaitCheckResult>;\n const result = await check({\n input: options.input,\n output: options.output,\n waits: options.waits,\n wait: createCheckWaitHelpers(),\n });\n validateCheckWaitResult(result, options.stepId, options.phaseIndex);\n\n if (result.status === \"pending\") {\n validatePendingWait(result, options.stepId, options.phaseIndex);\n waitId = result.id;\n const artifactPaths = resolveWaitArtifactPaths({\n runDir: options.runDir,\n stepArtifactId: options.stepArtifactId,\n waitId,\n });\n const request = {\n stepId: options.stepId,\n waitId,\n kind: \"check\",\n message: result.message,\n phaseIndex: options.phaseIndex,\n ...(result.retryAfterSeconds === undefined\n ? {}\n : { retryAfterSeconds: result.retryAfterSeconds }),\n outputSchema: outputSchema.jsonSchema,\n };\n\n await mkdir(artifactPaths.waitDir, { recursive: true });\n await writeFile(artifactPaths.requestFile, `${JSON.stringify(request, null, 2)}\\n`, \"utf8\");\n\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: options.stepId,\n type: \"wait.started\",\n payload: {\n waitId,\n kind: \"check\",\n message: result.message,\n phaseIndex: options.phaseIndex,\n ...(result.retryAfterSeconds === undefined\n ? {}\n : { retryAfterSeconds: result.retryAfterSeconds }),\n artifactPaths: artifactPaths.runRelative,\n },\n }),\n );\n\n return {\n status: \"waiting\",\n wait: {\n stepId: options.stepId,\n waitId,\n kind: \"check\",\n message: result.message,\n ...(result.retryAfterSeconds === undefined\n ? {}\n : { retryAfterSeconds: result.retryAfterSeconds }),\n artifactPaths: artifactPaths.runRelative,\n },\n };\n }\n\n const output = outputSchema.assert(\n result.output,\n `step ${options.stepId} check wait ${waitId} output`,\n );\n const artifactPaths = resolveWaitArtifactPaths({\n runDir: options.runDir,\n stepArtifactId: options.stepArtifactId,\n waitId,\n });\n await mkdir(artifactPaths.waitDir, { recursive: true });\n await writeFile(\n artifactPaths.requestFile,\n `${JSON.stringify(\n {\n stepId: options.stepId,\n waitId,\n kind: \"check\",\n phaseIndex: options.phaseIndex,\n outputSchema: outputSchema.jsonSchema,\n },\n null,\n 2,\n )}\\n`,\n \"utf8\",\n );\n\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: options.stepId,\n type: \"wait.satisfied\",\n payload: {\n waitId,\n kind: \"check\",\n phaseIndex: options.phaseIndex,\n artifactPaths: artifactPaths.runRelative,\n output,\n },\n }),\n );\n return { status: \"satisfied\", waitId, output };\n } catch (error) {\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: options.stepId,\n type: \"wait.failed\",\n payload: {\n waitId,\n kind: \"check\",\n phaseIndex: options.phaseIndex,\n failure: stepExecutionFailure(error),\n },\n }),\n );\n throw error;\n }\n}\n\nasync function handleResumedWaitPhase(options: {\n readonly wait: ResumedWaitDetails;\n readonly stepId: string;\n readonly runDir: string;\n readonly runId: string;\n readonly workflowId: string;\n readonly emit: (event: Event) => Promise<void>;\n}): Promise<HandleWaitResult> {\n const answerFile = joinRunPath(options.runDir, options.wait.artifactPaths.answerFile);\n const answerText = await readTextIfExists(answerFile);\n if (answerText.status === \"missing\") {\n return {\n status: \"waiting\",\n wait: {\n stepId: options.stepId,\n waitId: options.wait.waitId,\n message: options.wait.message,\n artifactPaths: options.wait.artifactPaths,\n },\n };\n }\n\n try {\n const parsedAnswer: unknown = JSON.parse(answerText.value);\n if (!isPlainObject(parsedAnswer)) {\n throw new TypeError(\n `step ${options.stepId} wait ${options.wait.waitId} answer must be a plain object`,\n );\n }\n const output = jsonSchema<PlainObject>(options.wait.outputSchema).assert(\n parsedAnswer,\n `step ${options.stepId} wait ${options.wait.waitId} answer`,\n );\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: options.stepId,\n type: \"wait.satisfied\",\n payload: {\n waitId: options.wait.waitId,\n kind: options.wait.kind,\n message: options.wait.message,\n artifactPaths: options.wait.artifactPaths,\n output,\n },\n }),\n );\n return { status: \"satisfied\", waitId: options.wait.waitId, output };\n } catch (error) {\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: options.stepId,\n type: \"wait.failed\",\n payload: {\n waitId: options.wait.waitId,\n kind: options.wait.kind,\n message: options.wait.message,\n artifactPaths: options.wait.artifactPaths,\n failure: stepExecutionFailure(error),\n },\n }),\n );\n throw error;\n }\n}\n\nfunction joinRunPath(runDir: string, runRelativePath: string): string {\n return join(runDir, ...runRelativePath.split(\"/\"));\n}\n\nasync function resolveWaitDefinition(\n phase: WaitPhase,\n context: {\n readonly input: PlainObject;\n readonly output: PlainObject;\n readonly waits: Readonly<Record<string, PlainObject>>;\n },\n): Promise<WaitDefinition> {\n if (typeof phase.wait !== \"function\") {\n return phase.wait;\n }\n\n const resolveInputWait = phase.wait as (context: {\n readonly input: PlainObject;\n readonly output: PlainObject;\n readonly waits: Readonly<Record<string, PlainObject>>;\n }) => WaitDefinition | Promise<WaitDefinition>;\n return await resolveInputWait(context);\n}\n\nfunction createCheckWaitHelpers<TWaitOutput extends PlainObject>(): CheckWaitHelpers<TWaitOutput> {\n return {\n done(output) {\n return { status: \"done\", output };\n },\n pending(input) {\n return {\n status: \"pending\",\n id: input.id,\n message: input.message,\n ...(input.retryAfterSeconds === undefined\n ? {}\n : { retryAfterSeconds: input.retryAfterSeconds }),\n };\n },\n };\n}\n\nfunction validateCheckWaitResult(\n result: unknown,\n stepId: string,\n phaseIndex: number,\n): asserts result is WaitCheckResult {\n const label = `step ${stepId} check wait phase ${phaseIndex}`;\n if (!isPlainObject(result)) {\n throw new TypeError(`${label} must return wait.done(...) or wait.pending(...).`);\n }\n\n if (result.status !== \"done\" && result.status !== \"pending\") {\n throw new TypeError(`${label} must return wait.done(...) or wait.pending(...).`);\n }\n\n if (result.status === \"done\" && !(\"output\" in result)) {\n throw new TypeError(`${label} wait.done(...) requires output.`);\n }\n}\n\nfunction validatePendingWait(\n pending: WaitCheckResult,\n stepId: string,\n phaseIndex: number,\n): asserts pending is Extract<WaitCheckResult, { readonly status: \"pending\" }> {\n const label = `step ${stepId} check wait phase ${phaseIndex}`;\n if (pending.status !== \"pending\") {\n throw new TypeError(`${label} expected a pending result.`);\n }\n\n if (typeof pending.id !== \"string\" || pending.id.trim().length === 0) {\n throw new TypeError(`${label} pending result requires a non-empty string id.`);\n }\n\n if (\n pending.id === \".\" ||\n pending.id === \"..\" ||\n pending.id.includes(\"/\") ||\n pending.id.includes(\"\\\\\")\n ) {\n throw new TypeError(`${label} pending result id must be a single path-safe segment.`);\n }\n\n if (typeof pending.message !== \"string\" || pending.message.trim().length === 0) {\n throw new TypeError(`${label} pending result requires a non-empty string message.`);\n }\n\n if (\n pending.retryAfterSeconds !== undefined &&\n (!Number.isFinite(pending.retryAfterSeconds) || pending.retryAfterSeconds < 0)\n ) {\n throw new TypeError(`${label} pending retryAfterSeconds must be a non-negative number.`);\n }\n}\n\nfunction validateWaitDefinition(wait: WaitDefinition, stepId: string, phaseIndex: number): void {\n const label = `step ${stepId} wait phase ${phaseIndex}`;\n if (!isPlainObject(wait)) {\n throw new TypeError(`${label} must resolve to a wait object.`);\n }\n\n if (typeof wait.id !== \"string\" || wait.id.trim().length === 0) {\n throw new TypeError(`${label} requires a non-empty string id.`);\n }\n\n if (wait.id === \".\" || wait.id === \"..\" || wait.id.includes(\"/\") || wait.id.includes(\"\\\\\")) {\n throw new TypeError(`${label} id must be a single path-safe segment.`);\n }\n\n if (wait.kind !== \"input\") {\n throw new TypeError(`${label} kind must be \"input\".`);\n }\n\n if (typeof wait.message !== \"string\" || wait.message.trim().length === 0) {\n throw new TypeError(`${label} requires a non-empty string message.`);\n }\n\n if (!(\"output\" in wait) || wait.output === undefined) {\n throw new TypeError(`${label} requires an output shape.`);\n }\n\n normalizeShape(wait.output);\n}\n\nasync function readTextIfExists(\n path: string,\n): Promise<{ readonly status: \"found\"; readonly value: string } | { readonly status: \"missing\" }> {\n try {\n return { status: \"found\", value: await readFile(path, \"utf8\") };\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return { status: \"missing\" };\n }\n throw error;\n }\n}\n\nfunction withWaitsDoContext(\n output: PlainObject,\n waits: Readonly<Record<string, PlainObject>>,\n): PlainObject {\n return new Proxy(output, {\n get(target, property, receiver) {\n if (property === \"output\") {\n return target;\n }\n if (property === \"waits\") {\n return waits;\n }\n return Reflect.get(target, property, receiver);\n },\n has(target, property) {\n return property === \"output\" || property === \"waits\" || Reflect.has(target, property);\n },\n getOwnPropertyDescriptor(target, property) {\n if (property === \"output\") {\n return { configurable: true, enumerable: false, value: target };\n }\n if (property === \"waits\") {\n return { configurable: true, enumerable: false, value: waits };\n }\n return Reflect.getOwnPropertyDescriptor(target, property);\n },\n });\n}\n\nasync function resolveDisplayPayload(options: {\n readonly phase: DisplayPhase;\n readonly input: PlainObject;\n readonly output: PlainObject;\n readonly phaseIndex: number;\n readonly stepId: string;\n}): Promise<PlainObject> {\n const { phase, input, output, phaseIndex, stepId } = options;\n const rawValue =\n typeof phase.content === \"function\" ? await phase.content({ input, output }) : phase.content;\n\n const display = normalizeDisplayValue(rawValue, { stepId, phaseIndex });\n if (typeof display === \"string\") {\n return { message: display, level: \"info\", phaseIndex };\n }\n\n return {\n message: display.message,\n level: display.level ?? \"info\",\n ...(\"data\" in display ? { data: display.data } : {}),\n phaseIndex,\n };\n}\n\nfunction normalizeDisplayValue(\n value: unknown,\n context: { readonly stepId: string; readonly phaseIndex: number },\n): StepDisplayValue {\n const label = `step ${context.stepId} display phase ${context.phaseIndex}`;\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (!isPlainObject(value) || typeof value.message !== \"string\") {\n throw new TypeError(`${label} must resolve to a string or an object with a string message.`);\n }\n\n const level = value.level ?? \"info\";\n if (!isDisplayLevel(level)) {\n throw new TypeError(`${label} level must be one of: info, warning, error, debug.`);\n }\n\n return {\n message: value.message,\n level,\n ...(\"data\" in value ? { data: value.data } : {}),\n };\n}\n\nfunction isDisplayLevel(value: unknown): value is \"info\" | \"warning\" | \"error\" | \"debug\" {\n return value === \"info\" || value === \"warning\" || value === \"error\" || value === \"debug\";\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\nasync function runWithStepControl<T>(options: {\n readonly stepId: string;\n readonly timeoutMs?: number;\n readonly readCancellation: () => Promise<CancellationMarker | undefined>;\n readonly run: (signal: AbortSignal) => Promise<T>;\n}): Promise<T> {\n const initialCancellation = await options.readCancellation();\n if (initialCancellation !== undefined) {\n throw new WorkflowCancellationError(initialCancellation);\n }\n\n const abortController = new AbortController();\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let stopCancellationWatch: (() => void) | undefined;\n\n const runPromise = options.run(abortController.signal);\n void runPromise.catch(() => undefined);\n\n const cancellationPromise = new Promise<never>((_, reject) => {\n stopCancellationWatch = watchCancellation(options.readCancellation, (result) => {\n abortController.abort();\n if (\"error\" in result) {\n reject(result.error);\n return;\n }\n reject(new WorkflowCancellationError(result.cancellation));\n });\n });\n\n const raced: Array<Promise<T> | Promise<never>> = [runPromise, cancellationPromise];\n\n if (options.timeoutMs !== undefined) {\n const timeoutMs = options.timeoutMs;\n raced.push(\n new Promise<never>((_, reject) => {\n timeout = setTimeout(() => {\n abortController.abort();\n reject(stepTimeoutFailure(options.stepId, timeoutMs));\n }, timeoutMs);\n }),\n );\n }\n\n try {\n return await Promise.race(raced);\n } finally {\n stopCancellationWatch?.();\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n }\n}\n\nfunction watchCancellation(\n readCancellation: () => Promise<CancellationMarker | undefined>,\n onCancel: (\n result: { readonly cancellation: CancellationMarker } | { readonly error: unknown },\n ) => void,\n): () => void {\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const poll = async (): Promise<void> => {\n if (stopped) {\n return;\n }\n\n try {\n const cancellation = await readCancellation();\n if (cancellation !== undefined) {\n stopped = true;\n onCancel({ cancellation });\n return;\n }\n } catch (error) {\n stopped = true;\n onCancel({ error });\n return;\n }\n\n timer = setTimeout(() => void poll(), 100);\n };\n\n timer = setTimeout(() => void poll(), 0);\n\n return () => {\n stopped = true;\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n };\n}\n\nfunction throwIfStepTimedOut(\n signal: AbortSignal | undefined,\n stepId: string,\n timeoutMs: number | undefined,\n): void {\n if (signal?.aborted && timeoutMs !== undefined) {\n throw stepTimeoutFailure(stepId, timeoutMs);\n }\n}\n\nfunction stepTimeoutFailure(stepId: string, timeoutMs: number): TrailStepFailureError {\n return new TrailStepFailureError({\n code: \"step_timeout\",\n message: `Step ${stepId} timed out after ${timeoutMs}ms.`,\n details: { stepId, timeoutMs },\n });\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof TrailStepFailureError) {\n return error.message;\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n return \"Error continuation failed.\";\n}\n\nfunction continuationFailure(source: string): Failure {\n return {\n code: \"invalid_continuation\",\n message: `${source} returned an invalid continuation node.`,\n };\n}\n\nfunction failureFromError(error: unknown): Failure {\n if (error instanceof TrailStepFailureError) {\n return error.failure;\n }\n\n return stepExecutionFailure(error);\n}\n\nfunction unsupportedContinuationFailure(node: unknown, source: string): Failure | undefined {\n const form = unsupportedContinuationForm(node);\n if (form === undefined) {\n return undefined;\n }\n\n return {\n code: \"unsupported_continuation\",\n message: `${source} returned ${form}, but parallel tracks/workflow invocation execution is not implemented yet.`,\n };\n}\n\nfunction unsupportedContinuationForm(node: unknown): string | undefined {\n if (Array.isArray(node)) {\n return \"a continuation array\";\n }\n\n if (isAbsoluteDoneNode(node)) {\n return \"an absolute done continuation\";\n }\n\n if (isAbsoluteFailNode(node)) {\n return \"an absolute fail continuation\";\n }\n\n return undefined;\n}\n","import type { Failure } from \"../../contracts/failures/failure.js\";\n\nimport { isFailureLikeError } from \"./failure-like.js\";\n\nexport function stepExecutionFailure(error: unknown): Failure {\n if (isFailureLikeError(error)) {\n return error.failure;\n }\n\n return {\n code: \"step_execution_failed\",\n message: error instanceof Error ? error.message : \"Step execution failed.\",\n ...(error instanceof Error\n ? {\n details: {\n name: error.name,\n },\n }\n : error === undefined\n ? {}\n : { details: { cause: error } }),\n };\n}\n","import { runContextStorage } from \"./run-context-storage.js\";\n\n/**\n * Runs `fn` with a step-scoped ambient `RunContext.currentStep` shadowing\n * whatever run-level context is already active (set once, for the whole\n * run, by `run-workflow.ts`). This is a genuine nested `AsyncLocalStorage`\n * scope — it does not mutate or replace the outer context, only shadows it\n * for the duration of `fn`, so code outside any step (or in a sibling step)\n * is unaffected.\n *\n * `nextDocumentIndex()` hands out 1, 2, 3, ... on each call within this one\n * invocation of `withStepContext` — a fresh counter every time, including\n * across resume replay of already-completed steps and retries of a failed\n * step, since each of those call sites invokes `withStepContext` anew.\n *\n * If there is no ambient run context at all (a step-executing function\n * called directly, outside of `runWorkflow`'s `runContextStorage.run(...)`\n * scope — e.g. unit tests that exercise the resume/continuation internals\n * in isolation), this falls back to running `fn` with no ambient context,\n * matching prior behavior exactly rather than throwing.\n */\nexport async function withStepContext<T>(\n stepId: string,\n stepDir: string,\n fn: () => Promise<T>,\n options: {\n readonly maxSubPrompts?: unknown;\n readonly cwd?: string;\n readonly executionCwd?: string;\n readonly replay?: { readonly kind: \"completed-step\" };\n } = {},\n): Promise<T> {\n const parentContext = runContextStorage.getStore();\n if (!parentContext) {\n return await fn();\n }\n\n let nextDocumentIndex = 0;\n let nextSubPromptIndex = 0;\n\n const executionCwd = options.executionCwd ?? options.cwd ?? parentContext.executionCwd;\n const stepContext = {\n ...parentContext,\n cwd: executionCwd ?? parentContext.cwd,\n executionCwd: executionCwd ?? parentContext.executionCwd,\n currentStep: {\n id: stepId,\n dir: stepDir,\n maxSubPrompts: options.maxSubPrompts,\n cwd: executionCwd ?? parentContext.cwd,\n executionCwd: executionCwd ?? parentContext.executionCwd,\n replay: options.replay,\n nextDocumentIndex(): number {\n nextDocumentIndex += 1;\n return nextDocumentIndex;\n },\n nextSubPromptIndex(): number {\n nextSubPromptIndex += 1;\n return nextSubPromptIndex;\n },\n },\n };\n\n return await runContextStorage.run(stepContext, fn);\n}\n","import { stat } from \"node:fs/promises\";\n\nexport interface RunCwds {\n /** Root used for workflow/config-relative resolution and default artifact storage. */\n readonly projectCwd: string;\n /** Default execution cwd for steps and agent processes. */\n readonly cwd: string;\n}\n\nexport async function resolveAndValidateRunCwds(options: {\n readonly projectCwd?: string;\n readonly cwd?: string;\n}): Promise<RunCwds> {\n const projectCwd = options.projectCwd ?? options.cwd ?? process.cwd();\n const cwd = options.cwd ?? projectCwd;\n\n await validateDirectoryCwd(projectCwd, \"projectCwd\");\n if (cwd === projectCwd) {\n return { projectCwd, cwd };\n }\n\n await validateDirectoryCwd(cwd, \"cwd\");\n return { projectCwd, cwd };\n}\n\nexport async function validateDirectoryCwd(cwd: string, label: string): Promise<void> {\n if (cwd.trim().length === 0) {\n throw new TypeError(`${label} must be a non-empty string.`);\n }\n\n const stats = await stat(cwd).catch((error) => {\n throw new Error(`${label} must be an existing directory: ${cwd}`, { cause: error });\n });\n\n if (!stats.isDirectory()) {\n throw new Error(`${label} must be an existing directory: ${cwd}`);\n }\n}\n","export interface TimeoutPolicy {\n readonly timeoutMs?: number;\n}\n\nexport type TimeoutPolicyInput = number;\n\nexport interface ResolveTimeoutPolicyOptions {\n readonly global?: TimeoutPolicyInput;\n readonly workflow?: TimeoutPolicyInput;\n readonly step?: TimeoutPolicyInput;\n}\n\nconst BUILT_IN_TIMEOUT_POLICY: TimeoutPolicy = {};\n\nexport function resolveTimeoutPolicy(options: ResolveTimeoutPolicyOptions): TimeoutPolicy {\n const configured = firstConfiguredPolicy(options.step, options.workflow, options.global);\n return configured !== undefined ? validateTimeoutPolicy(configured) : BUILT_IN_TIMEOUT_POLICY;\n}\n\nexport function validateTimeoutPolicy(input: unknown): TimeoutPolicy {\n if (typeof input !== \"number\" || !Number.isInteger(input) || input < 1) {\n throw new TypeError(\n \"timeout must be an integer number of milliseconds greater than or equal to 1.\",\n );\n }\n\n return { timeoutMs: input };\n}\n\nfunction firstConfiguredPolicy(...policies: readonly unknown[]): unknown | undefined {\n return policies.find((policy) => policy !== undefined);\n}\n","export const DEFAULT_INTERACTIVE_OUTPUT_SHAPE = { sessionFile: \"string\" } as const;\n","import { normalizeShape } from \"../../../authoring/shape/json-schema.js\";\nimport type { PlainObject, Schema, ShapeInput } from \"../../../contracts/shapes/shape.types.js\";\nimport { DEFAULT_INTERACTIVE_OUTPUT_SHAPE } from \"../../interactive-session/default-interactive-output-shape.js\";\n\n/**\n * A prompt phase's effective output schema: its own `output`, or -- for an\n * interactive phase with none given -- the default interactive output shape.\n * Shared by dispatch (`runContinuation`) and both resume paths\n * (`reattachInProgressStep`, `replayCompletedSteps`), which must all resolve\n * the identical schema a step was originally dispatched with.\n */\nexport function resolveStepOutputSchema(config: {\n readonly output?: ShapeInput<PlainObject>;\n readonly mode?: \"working\" | \"interactive\";\n}): Schema<PlainObject> | undefined {\n const effectiveOutput =\n config.output ?? (config.mode === \"interactive\" ? DEFAULT_INTERACTIVE_OUTPUT_SHAPE : undefined);\n\n return effectiveOutput ? normalizeShape(effectiveOutput) : undefined;\n}\n","import type { Failure } from \"../../contracts/failures/failure.js\";\n\nimport { isFailureLikeError } from \"./failure-like.js\";\n\nexport function workflowFailure(error: unknown): Failure {\n if (isFailureLikeError(error)) {\n return error.failure;\n }\n\n return {\n code: \"workflow_failed\",\n message: error instanceof Error ? error.message : \"Unknown workflow failure.\",\n ...(error === undefined ? {} : { details: { cause: error } }),\n };\n}\n","import type { ContinuationResult, StepNode } from \"../../../authoring/step/continuation.types.js\";\nimport {\n firstPromptPhase,\n getStepPhases,\n hasPromptPhase,\n isStepNode,\n} from \"../../../authoring/step/step-node.js\";\nimport type { Failure } from \"../../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../../contracts/shapes/shape.types.js\";\nimport type {\n Event,\n RunWorkflowOptions,\n} from \"../../../runtime/run-workflow/run-workflow.types.js\";\nimport { resolveStepArtifactPaths } from \"../../artifacts/step-artifacts.js\";\nimport { resolveStepOutputSchema } from \"../../continuation/resolve-step-output-schema/resolve-step-output-schema.js\";\nimport { withStepContext } from \"../../run-context/with-step-context.js\";\n\n/**\n * Walks a workflow's `start(...)` continuation forward through its recorded\n * `step.completed` history — trusting each completed prompt/agent step's\n * persisted output rather than recomputing it — until it reaches\n * `targetStepId`. Shared by `replayToFailedStep` (target = the step that\n * failed) and `reattachInProgressStep` (target = a dangling interactive\n * step): both need the identical \"replay what already happened\" walk: only\n * their handling of the target step once reached differs.\n */\nexport async function replayCompletedSteps<\n TInput extends PlainObject,\n TOutput extends PlainObject,\n>(options: {\n readonly workflow: RunWorkflowOptions<TInput, TOutput>[\"workflow\"];\n readonly events: readonly Event[];\n readonly input: PlainObject;\n readonly targetStepId: string;\n readonly runDir: string;\n}): Promise<\n | { readonly status: \"success\"; readonly node: StepNode }\n | { readonly status: \"failure\"; readonly failure: Failure }\n> {\n let node: ContinuationResult = options.workflow.start(options.input as TInput);\n const completedAttempts = pairCompletedStepAttempts(options.events);\n\n for (const attempt of completedAttempts) {\n const { completedEvent, stepIndex } = attempt;\n if (!isStepNode(node)) {\n return {\n status: \"failure\",\n failure: replayFailure(\n \"resume_step_id_drift\",\n \"Completed history continues after the current workflow reaches done.\",\n ),\n };\n }\n\n if (node.config.id !== completedEvent.stepId) {\n return {\n status: \"failure\",\n failure: replayFailure(\n \"resume_step_id_drift\",\n `Expected completed step ${node.config.id} but found ${completedEvent.stepId ?? \"<missing>\"}.`,\n ),\n };\n }\n\n if (hasPromptPhase(node)) {\n const recordedOutput = readPlainPayload(completedEvent, \"output\");\n if (!recordedOutput) {\n return {\n status: \"failure\",\n failure: replayFailure(\n \"resume_missing_step_output\",\n `Completed step ${node.config.id} has no recorded output to resume from.`,\n ),\n };\n }\n\n const promptPhase = firstPromptPhase(getStepPhases(node));\n const outputSchema = promptPhase ? resolveStepOutputSchema(promptPhase) : undefined;\n if (!outputSchema) {\n return {\n status: \"failure\",\n failure: replayFailure(\n \"resume_output_schema_unresolvable\",\n `Step ${node.config.id} has no resolvable output schema to replay with.`,\n ),\n };\n }\n const validatedOutput = outputSchema.assert(recordedOutput, `step ${node.config.id} output`);\n\n const stepDir = resolveStepArtifactPaths({\n runDir: options.runDir,\n stepId: node.config.id,\n stepIndex,\n }).stepDir;\n const completedNode = node;\n const recordedWaitOutputs = readCompletedStepWaitOutputs({\n events: options.events,\n attempt,\n });\n if (recordedWaitOutputs.status === \"failure\") {\n return recordedWaitOutputs;\n }\n node = await withStepContext(\n completedNode.config.id,\n stepDir,\n async () =>\n replayStepPhases(completedNode, validatedOutput, recordedWaitOutputs.waitOutputs),\n { replay: { kind: \"completed-step\" } },\n );\n } else {\n const stepDir = resolveStepArtifactPaths({\n runDir: options.runDir,\n stepId: node.config.id,\n stepIndex,\n }).stepDir;\n const completedNode = node;\n const recordedWaitOutputs = readCompletedStepWaitOutputs({\n events: options.events,\n attempt,\n });\n if (recordedWaitOutputs.status === \"failure\") {\n return recordedWaitOutputs;\n }\n node = await withStepContext(\n completedNode.config.id,\n stepDir,\n async () => replayStepPhases(completedNode, undefined, recordedWaitOutputs.waitOutputs),\n { replay: { kind: \"completed-step\" } },\n );\n }\n }\n\n if (!isStepNode(node) || node.config.id !== options.targetStepId) {\n return {\n status: \"failure\",\n failure: replayFailure(\n \"resume_step_id_drift\",\n `Target step ${options.targetStepId} is not the next live step.`,\n ),\n };\n }\n\n return { status: \"success\", node };\n}\n\nasync function replayStepPhases(\n stepNode: StepNode,\n recordedPromptOutput?: PlainObject,\n recordedWaitOutputs: Readonly<Record<string, PlainObject>> = {},\n): Promise<ContinuationResult> {\n let phaseValue = stepNode.config.input;\n let usedRecordedPromptOutput = false;\n let nextNode: ContinuationResult | undefined;\n\n for (const phase of getStepPhases(stepNode)) {\n if (phase.kind === \"display\" || phase.kind === \"wait\") {\n continue;\n }\n\n if (nextNode !== undefined) {\n throw new Error(`step ${stepNode.config.id} has executable phases after a do phase`);\n }\n\n if (phase.kind === \"prompt\") {\n if (recordedPromptOutput === undefined || usedRecordedPromptOutput) {\n throw new Error(`step ${stepNode.config.id} has no recorded output to replay prompt phase`);\n }\n phaseValue = recordedPromptOutput;\n usedRecordedPromptOutput = true;\n continue;\n }\n\n nextNode = await phase.onOutput(\n withWaitsDoContext(phaseValue, recordedWaitOutputs),\n stepNode.config.input,\n );\n }\n\n if (nextNode === undefined) {\n throw new Error(`step ${stepNode.config.id} has no do phase`);\n }\n\n return nextNode;\n}\n\ninterface CompletedStepAttempt {\n readonly stepId: string;\n readonly stepIndex: number;\n readonly completedEvent: Event;\n readonly startedEventIndex: number;\n readonly completedEventIndex: number;\n}\n\ninterface CompletedStepAttemptStart {\n readonly event: Event;\n readonly eventIndex: number;\n readonly stepIndex: number;\n}\n\nfunction pairCompletedStepAttempts(events: readonly Event[]): readonly CompletedStepAttempt[] {\n const startedByStepId = new Map<string, CompletedStepAttemptStart[]>();\n const attempts: CompletedStepAttempt[] = [];\n let stepIndex = 0;\n\n for (const [eventIndex, event] of events.entries()) {\n if (event.type === \"step.started\" && event.stepId) {\n stepIndex += 1;\n const starts = startedByStepId.get(event.stepId) ?? [];\n starts.push({ event, eventIndex, stepIndex });\n startedByStepId.set(event.stepId, starts);\n continue;\n }\n\n if (\n (event.type === \"step.completed\" ||\n event.type === \"step.failed\" ||\n event.type === \"step.cancelled\") &&\n event.stepId\n ) {\n const starts = startedByStepId.get(event.stepId);\n const started = starts?.pop();\n if (!started || event.type !== \"step.completed\") {\n continue;\n }\n\n attempts.push({\n stepId: event.stepId,\n stepIndex: started.stepIndex,\n completedEvent: event,\n startedEventIndex: started.eventIndex,\n completedEventIndex: eventIndex,\n });\n }\n }\n\n return attempts.sort((left, right) => left.completedEventIndex - right.completedEventIndex);\n}\n\nfunction readCompletedStepWaitOutputs(options: {\n readonly events: readonly Event[];\n readonly attempt: CompletedStepAttempt;\n}):\n | { readonly status: \"success\"; readonly waitOutputs: Readonly<Record<string, PlainObject>> }\n | { readonly status: \"failure\"; readonly failure: Failure } {\n const inStepEvents = options.events.slice(\n options.attempt.startedEventIndex + 1,\n options.attempt.completedEventIndex,\n );\n const waitOutputs: Record<string, PlainObject> = {};\n\n for (const event of inStepEvents) {\n if (event.type !== \"wait.satisfied\" || event.stepId !== options.attempt.stepId) {\n continue;\n }\n\n const waitId = typeof event.payload.waitId === \"string\" ? event.payload.waitId : undefined;\n const output = readPlainPayload(event, \"output\");\n if (!waitId || !output) {\n return {\n status: \"failure\",\n failure: replayFailure(\n \"resume_missing_wait_output\",\n `Completed step ${options.attempt.stepId} has an invalid recorded satisfied wait output.`,\n ),\n };\n }\n\n if (Object.hasOwn(waitOutputs, waitId)) {\n return {\n status: \"failure\",\n failure: replayFailure(\n \"resume_duplicate_wait_id\",\n `Completed step ${options.attempt.stepId} has duplicate wait id '${waitId}'.`,\n ),\n };\n }\n waitOutputs[waitId] = output;\n }\n\n return { status: \"success\", waitOutputs };\n}\n\nfunction withWaitsDoContext(\n output: PlainObject,\n waits: Readonly<Record<string, PlainObject>>,\n): PlainObject {\n return new Proxy(output, {\n get(target, property, receiver) {\n if (property === \"output\") {\n return target;\n }\n if (property === \"waits\") {\n return waits;\n }\n return Reflect.get(target, property, receiver);\n },\n has(target, property) {\n return property === \"output\" || property === \"waits\" || Reflect.has(target, property);\n },\n getOwnPropertyDescriptor(target, property) {\n if (property === \"output\") {\n return { configurable: true, enumerable: false, value: target };\n }\n if (property === \"waits\") {\n return { configurable: true, enumerable: false, value: waits };\n }\n return Reflect.getOwnPropertyDescriptor(target, property);\n },\n });\n}\n\nfunction readPlainPayload(event: Event, key: string): PlainObject | undefined {\n const value = event.payload[key];\n return isPlainObject(value) ? value : undefined;\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\nfunction replayFailure(code: string, message: string): Failure {\n return { code, message };\n}\n","import type { ContinuationResult } from \"../../../authoring/step/continuation.types.js\";\nimport { firstPromptPhase, getStepPhases } from \"../../../authoring/step/step-node.js\";\nimport type { Failure } from \"../../../contracts/failures/failure.js\";\nimport { TrailStepFailureError } from \"../../../contracts/failures/failure.js\";\nimport type { PlainObject, Schema } from \"../../../contracts/shapes/shape.types.js\";\nimport type {\n Event,\n RunWorkflowOptions,\n} from \"../../../runtime/run-workflow/run-workflow.types.js\";\nimport { resolveStepArtifactPaths } from \"../../artifacts/step-artifacts.js\";\nimport { resolveStepOutputSchema } from \"../../continuation/resolve-step-output-schema/resolve-step-output-schema.js\";\nimport {\n readCompletedInteractiveOutput,\n waitForInteractiveCompletion,\n} from \"../../interactive-session/interactive-session-protocol.js\";\nimport { withStepContext } from \"../../run-context/with-step-context.js\";\nimport { replayCompletedSteps } from \"../replay-completed-steps/replay-completed-steps.js\";\n\n/**\n * Detects the \"process died mid-interactive-step\" resume shape: the run's\n * last event is `interactive.sessionStarted` for a step, with nothing after\n * it — no `interactive.sessionCompleted`, `step.completed`, `step.failed`,\n * `workflow.failed`, or `workflow.completed` was ever written, because the\n * process was killed before any of those could be recorded. Anything else\n * (an already-terminal `workflow.failed`/`workflow.completed` run) is not\n * this shape, even if an interactive.sessionStarted appears earlier in\n * history — `run-workflow.ts` falls back to `replayToFailedStep` for that.\n */\nexport function findDanglingInteractiveSessionStart(events: readonly Event[]): Event | undefined {\n const anchor = events.at(-1);\n if (anchor?.type !== \"interactive.sessionStarted\" || !anchor.stepId) {\n return undefined;\n }\n\n const hasTerminalWorkflowEvent = events.some(\n (event) => event.type === \"workflow.failed\" || event.type === \"workflow.completed\",\n );\n\n return hasTerminalWorkflowEvent ? undefined : anchor;\n}\n\nexport async function reattachInProgressStep<\n TInput extends PlainObject,\n TOutput extends PlainObject,\n>(options: {\n readonly workflow: RunWorkflowOptions<TInput, TOutput>[\"workflow\"];\n readonly events: readonly Event[];\n readonly runDir: string;\n}): Promise<\n | {\n readonly status: \"success\";\n readonly input: PlainObject;\n readonly node: ContinuationResult;\n readonly resumedStepId: string;\n readonly sourceFailureEventId: string;\n }\n | { readonly status: \"failure\"; readonly failure: Failure }\n> {\n const anchor = findDanglingInteractiveSessionStart(options.events);\n if (!anchor?.stepId) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_target_not_dangling\",\n \"Resume target has no dangling interactive.sessionStarted event to reattach.\",\n ),\n };\n }\n\n const stepIndex = anchor.payload.stepIndex;\n if (typeof stepIndex !== \"number\") {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_missing_step_index\",\n `Dangling interactive.sessionStarted event for step ${anchor.stepId} has no recorded stepIndex.`,\n ),\n };\n }\n\n const startedEvent = options.events.find((event) => event.type === \"workflow.started\");\n if (!startedEvent) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_target_not_found\",\n \"Resume target has no workflow.started event.\",\n ),\n };\n }\n\n if (startedEvent.workflowId !== options.workflow.id) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_workflow_mismatch\",\n `Resume target workflow ${startedEvent.workflowId} does not match ${options.workflow.id}.`,\n ),\n };\n }\n\n const input = readPlainPayload(startedEvent, \"input\");\n if (!input) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_target_not_found\",\n \"workflow.started payload is missing input.\",\n ),\n };\n }\n\n const replay = await replayCompletedSteps({\n workflow: options.workflow,\n events: options.events,\n input,\n targetStepId: anchor.stepId,\n runDir: options.runDir,\n });\n if (replay.status === \"failure\") {\n return replay;\n }\n\n const { node } = replay;\n const artifactPaths = resolveStepArtifactPaths({\n runDir: options.runDir,\n stepId: anchor.stepId,\n stepIndex,\n });\n\n const promptPhase = firstPromptPhase(getStepPhases(node));\n const outputSchema = promptPhase ? resolveStepOutputSchema(promptPhase) : undefined;\n if (!outputSchema) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_output_schema_unresolvable\",\n `Step ${node.config.id} has no resolvable output schema to reattach with.`,\n ),\n };\n }\n\n const reattached = await readReattachedInteractiveOutput({\n stepId: anchor.stepId,\n interactiveFile: artifactPaths.interactiveFile,\n outputSchema,\n });\n if (reattached.status === \"failure\") {\n return reattached;\n }\n\n const nextNode = await withStepContext(anchor.stepId, artifactPaths.stepDir, async () =>\n continueAfterPromptPhase(\n node,\n outputSchema.assert(reattached.output, `step ${node.config.id} output`),\n ),\n );\n\n return {\n status: \"success\",\n input,\n node: nextNode,\n resumedStepId: anchor.stepId,\n sourceFailureEventId: anchor.id,\n };\n}\n\n/**\n * Reads the anchor step's already-existing interactive.json protocol file —\n * never spawns a new agent process. If the session was still \"active\" when\n * the previous process died, re-enters the same file-polling wait the live\n * dispatch path uses (`waitForInteractiveCompletion`) rather than giving up.\n */\nasync function readReattachedInteractiveOutput(options: {\n readonly stepId: string;\n readonly interactiveFile: string;\n readonly outputSchema: Schema;\n}): Promise<\n | { readonly status: \"success\"; readonly output: PlainObject }\n | { readonly status: \"failure\"; readonly failure: Failure }\n> {\n const first = await tryReadCompletedInteractiveOutput(options);\n if (first.status !== \"still-active\") {\n return first;\n }\n\n const abortController = new AbortController();\n await waitForInteractiveCompletion(options.interactiveFile, abortController.signal);\n\n const second = await tryReadCompletedInteractiveOutput(options);\n if (second.status !== \"still-active\") {\n return second;\n }\n\n throw new TrailStepFailureError({\n code: \"interactive_session_incomplete\",\n message: `Interactive agent step ${options.stepId} did not complete after reattaching.`,\n });\n}\n\nasync function tryReadCompletedInteractiveOutput(options: {\n readonly stepId: string;\n readonly interactiveFile: string;\n readonly outputSchema: Schema;\n}): Promise<\n | { readonly status: \"success\"; readonly output: PlainObject }\n | { readonly status: \"failure\"; readonly failure: Failure }\n | { readonly status: \"still-active\" }\n> {\n try {\n return { status: \"success\", output: await readCompletedInteractiveOutput(options) };\n } catch (error) {\n if (error instanceof TrailStepFailureError) {\n if (error.failure.code === \"interactive_session_incomplete\") {\n return { status: \"still-active\" };\n }\n\n if (error.failure.code === \"interactive_session_cancelled\") {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_interactive_session_cancelled\",\n `Interactive agent step ${options.stepId} was cancelled and cannot be resumed.`,\n ),\n };\n }\n\n if (error.failure.code === \"interactive_session_invalid\") {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_interactive_protocol_missing\",\n `Interactive agent step ${options.stepId} has no readable interactive.json to reattach to.`,\n ),\n };\n }\n }\n\n throw error;\n }\n}\n\nasync function continueAfterPromptPhase(\n stepNode: Extract<ContinuationResult, { kind: \"step\" }>,\n promptOutput: PlainObject,\n): Promise<ContinuationResult> {\n let phaseValue = stepNode.config.input;\n let consumedPromptOutput = false;\n let nextNode: ContinuationResult | undefined;\n\n for (const phase of getStepPhases(stepNode)) {\n if (phase.kind === \"display\" || phase.kind === \"wait\") {\n continue;\n }\n\n if (nextNode !== undefined) {\n throw new Error(`step ${stepNode.config.id} has executable phases after a do phase`);\n }\n\n if (phase.kind === \"prompt\") {\n if (consumedPromptOutput) {\n throw new Error(`step ${stepNode.config.id} cannot reattach multiple prompt phases`);\n }\n phaseValue = promptOutput;\n consumedPromptOutput = true;\n continue;\n }\n\n nextNode = await phase.onOutput(phaseValue, stepNode.config.input);\n }\n\n if (nextNode === undefined) {\n throw new Error(`step ${stepNode.config.id} has no do phase`);\n }\n\n return nextNode;\n}\n\nfunction readPlainPayload(event: Event, key: string): PlainObject | undefined {\n const value = event.payload[key];\n return isPlainObject(value) ? value : undefined;\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\nfunction resumeFailure(code: string, message: string): Failure {\n return { code, message };\n}\n","import type { StepNode } from \"../../../authoring/step/continuation.types.js\";\nimport type { Failure } from \"../../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../../contracts/shapes/shape.types.js\";\nimport type {\n Event,\n RunWorkflowOptions,\n} from \"../../../runtime/run-workflow/run-workflow.types.js\";\nimport { replayCompletedSteps } from \"../replay-completed-steps/replay-completed-steps.js\";\n\nexport async function replayToFailedStep<\n TInput extends PlainObject,\n TOutput extends PlainObject,\n>(options: {\n readonly workflow: RunWorkflowOptions<TInput, TOutput>[\"workflow\"];\n readonly events: readonly Event[];\n readonly runDir: string;\n}): Promise<\n | {\n readonly status: \"success\";\n readonly input: PlainObject;\n readonly node: StepNode;\n readonly resumedStepId: string;\n readonly sourceFailureEventId: string;\n }\n | { readonly status: \"failure\"; readonly failure: Failure }\n> {\n const startedEvent = options.events.find((event) => event.type === \"workflow.started\");\n if (!startedEvent) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_target_not_found\",\n \"Resume target has no workflow.started event.\",\n ),\n };\n }\n\n if (startedEvent.workflowId !== options.workflow.id) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_workflow_mismatch\",\n `Resume target workflow ${startedEvent.workflowId} does not match ${options.workflow.id}.`,\n ),\n };\n }\n\n const terminalEvent = options.events.at(-1);\n if (terminalEvent?.type !== \"workflow.failed\") {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_target_not_failed\",\n \"Resume target must end in workflow.failed.\",\n ),\n };\n }\n\n const recoveredFailedStep = options.events.find(\n (event, index) =>\n event.type === \"step.failed\" &&\n options.events\n .slice(index + 1)\n .some(\n (laterEvent) =>\n laterEvent.type === \"step.completed\" && laterEvent.stepId === event.stepId,\n ),\n );\n if (recoveredFailedStep) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_unsupported_history\",\n `Resume does not support recovered onError history for step ${recoveredFailedStep.stepId ?? \"<missing>\"}.`,\n ),\n };\n }\n\n const failedStepEvents = options.events.filter((event) => event.type === \"step.failed\");\n if (failedStepEvents.length !== 1) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_multiple_failed_steps\",\n \"Resume target must contain exactly one failed step.\",\n ),\n };\n }\n\n const failedStepEvent = failedStepEvents[0];\n if (!failedStepEvent) {\n return {\n status: \"failure\",\n failure: resumeFailure(\"resume_target_not_failed\", \"Resume target has no failed step.\"),\n };\n }\n\n if (!failedStepEvent.stepId) {\n return {\n status: \"failure\",\n failure: resumeFailure(\"resume_target_not_failed\", \"Failed step event has no step id.\"),\n };\n }\n\n const input = readPlainPayload(startedEvent, \"input\");\n if (!input) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_target_not_found\",\n \"workflow.started payload is missing input.\",\n ),\n };\n }\n\n const replay = await replayCompletedSteps({\n workflow: options.workflow,\n events: options.events,\n input,\n targetStepId: failedStepEvent.stepId,\n runDir: options.runDir,\n });\n if (replay.status === \"failure\") {\n return replay;\n }\n\n const { node } = replay;\n if (node.onError) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_unsupported_history\",\n `Resume does not support onError history for step ${node.config.id}.`,\n ),\n };\n }\n\n return {\n status: \"success\",\n input,\n node,\n resumedStepId: failedStepEvent.stepId,\n sourceFailureEventId: failedStepEvent.id,\n };\n}\n\nfunction readPlainPayload(event: Event, key: string): PlainObject | undefined {\n const value = event.payload[key];\n return isPlainObject(value) ? value : undefined;\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\nfunction resumeFailure(code: string, message: string): Failure {\n return { code, message };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { StepNode, WaitPhase } from \"../../../authoring/step/continuation.types.js\";\nimport { getStepPhases } from \"../../../authoring/step/step-node.js\";\nimport type { Failure } from \"../../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../../contracts/shapes/shape.types.js\";\nimport type {\n Event,\n RunWorkflowOptions,\n} from \"../../../runtime/run-workflow/run-workflow.types.js\";\nimport { resolveStepOutputSchema } from \"../../continuation/resolve-step-output-schema/resolve-step-output-schema.js\";\nimport { withStepContext } from \"../../run-context/with-step-context.js\";\nimport { replayCompletedSteps } from \"../replay-completed-steps/replay-completed-steps.js\";\n\nexport interface ReplayToWaitingStepResult {\n readonly status: \"success\";\n readonly input: PlainObject;\n readonly node: StepNode;\n readonly resumedStepId: string;\n readonly sourceWaitEventId: string;\n readonly stepIndex: number;\n readonly phaseIndex: number;\n readonly phaseValue: PlainObject;\n readonly waitOutputs: Readonly<Record<string, PlainObject>>;\n readonly seenWaitIds: readonly string[];\n readonly wait: {\n readonly waitId: string;\n readonly kind: \"input\" | \"check\";\n readonly message: string;\n readonly artifactPaths: { readonly requestFile: string; readonly answerFile: string };\n readonly outputSchema: Record<string, unknown>;\n };\n}\n\nexport async function replayToWaitingStep<\n TInput extends PlainObject,\n TOutput extends PlainObject,\n>(options: {\n readonly workflow: RunWorkflowOptions<TInput, TOutput>[\"workflow\"];\n readonly events: readonly Event[];\n readonly runDir: string;\n}): Promise<ReplayToWaitingStepResult | { readonly status: \"failure\"; readonly failure: Failure }> {\n const startedEvent = options.events.find((event) => event.type === \"workflow.started\");\n if (!startedEvent) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_target_not_found\",\n \"Continue target has no workflow.started event.\",\n ),\n };\n }\n\n if (startedEvent.workflowId !== options.workflow.id) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_workflow_mismatch\",\n `Continue target workflow ${startedEvent.workflowId} does not match ${options.workflow.id}.`,\n ),\n };\n }\n\n if (options.events.some((event) => event.type === \"workflow.completed\")) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_target_not_waiting\",\n \"Continue target is already completed.\",\n ),\n };\n }\n\n const pendingWait = findLatestPendingWait(options.events);\n if (!pendingWait?.stepId) {\n return {\n status: \"failure\",\n failure: resumeFailure(\"continue_target_not_waiting\", \"Continue target has no pending wait.\"),\n };\n }\n\n const input = readPlainPayload(startedEvent, \"input\");\n if (!input) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_target_not_found\",\n \"workflow.started payload is missing input.\",\n ),\n };\n }\n\n const waitId = readWaitId(pendingWait);\n if (!waitId) {\n return {\n status: \"failure\",\n failure: resumeFailure(\"continue_wait_invalid\", \"Pending wait event has no wait id.\"),\n };\n }\n\n const stepIndex =\n readStepIndex(pendingWait) ?? stepStartedOrdinalBefore(options.events, pendingWait);\n if (stepIndex === undefined) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_wait_invalid\",\n `Pending wait ${waitId} has no resolvable step artifact index.`,\n ),\n };\n }\n\n const targetStepStartedIndex = findStepStartedIndex(options.events, pendingWait, stepIndex);\n if (targetStepStartedIndex === undefined) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_wait_invalid\",\n `Pending wait ${waitId} has no matching step.started event.`,\n ),\n };\n }\n\n const replay = await replayCompletedSteps({\n workflow: options.workflow,\n events: options.events.slice(0, targetStepStartedIndex),\n input,\n targetStepId: pendingWait.stepId,\n runDir: options.runDir,\n });\n if (replay.status === \"failure\") {\n return replay;\n }\n\n const prefix = await withStepContext(\n pendingWait.stepId,\n stepDirForIndex(options.runDir, pendingWait, stepIndex),\n async () =>\n replayWaitingStepPrefix({\n node: replay.node,\n events: options.events,\n targetStepStartedIndex,\n pendingWait,\n }),\n );\n if (prefix.status === \"failure\") {\n return prefix;\n }\n\n const wait = await readResumedWaitDetails(options.runDir, pendingWait, waitId);\n if (wait.status === \"failure\") {\n return wait;\n }\n\n return {\n status: \"success\",\n input,\n node: replay.node,\n resumedStepId: pendingWait.stepId,\n sourceWaitEventId: pendingWait.id,\n stepIndex,\n phaseIndex: prefix.phaseIndex,\n phaseValue: prefix.phaseValue,\n waitOutputs: prefix.waitOutputs,\n seenWaitIds: prefix.seenWaitIds,\n wait: wait.wait,\n };\n}\n\nasync function readResumedWaitDetails(\n runDir: string,\n waitEvent: Event,\n waitId: string,\n): Promise<\n | {\n readonly status: \"success\";\n readonly wait: {\n readonly waitId: string;\n readonly kind: \"input\" | \"check\";\n readonly message: string;\n readonly artifactPaths: { readonly requestFile: string; readonly answerFile: string };\n readonly outputSchema: Record<string, unknown>;\n };\n }\n | { readonly status: \"failure\"; readonly failure: Failure }\n> {\n const artifactPaths = readWaitArtifactPaths(waitEvent);\n if (!artifactPaths) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_wait_invalid\",\n `Pending wait ${waitId} has no recorded artifact paths.`,\n ),\n };\n }\n\n let request: unknown;\n try {\n request = JSON.parse(\n await readFile(join(runDir, ...artifactPaths.requestFile.split(\"/\")), \"utf8\"),\n );\n } catch {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_wait_invalid\",\n `Pending wait ${waitId} has no readable wait request artifact.`,\n ),\n };\n }\n\n if (!isPlainObject(request) || !isPlainObject(request.outputSchema)) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_wait_invalid\",\n `Pending wait ${waitId} request artifact is missing outputSchema.`,\n ),\n };\n }\n\n const kind = request.kind === \"check\" ? \"check\" : \"input\";\n const message = typeof waitEvent.payload.message === \"string\" ? waitEvent.payload.message : \"\";\n return {\n status: \"success\",\n wait: {\n waitId,\n kind,\n message,\n artifactPaths,\n outputSchema: request.outputSchema,\n },\n };\n}\n\nfunction findLatestPendingWait(events: readonly Event[]): Event | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (event?.type !== \"wait.started\") {\n continue;\n }\n\n const key = waitEventKey(event);\n if (!key) {\n continue;\n }\n\n const resolvedLater = events\n .slice(index + 1)\n .some(\n (laterEvent) =>\n (laterEvent.type === \"wait.satisfied\" || laterEvent.type === \"wait.failed\") &&\n waitEventKey(laterEvent) === key,\n );\n if (!resolvedLater) {\n return event;\n }\n }\n\n return undefined;\n}\n\nasync function replayWaitingStepPrefix(options: {\n readonly node: StepNode;\n readonly events: readonly Event[];\n readonly targetStepStartedIndex: number;\n readonly pendingWait: Event;\n}): Promise<\n | {\n readonly status: \"success\";\n readonly phaseIndex: number;\n readonly phaseValue: PlainObject;\n readonly waitOutputs: Readonly<Record<string, PlainObject>>;\n readonly seenWaitIds: readonly string[];\n }\n | { readonly status: \"failure\"; readonly failure: Failure }\n> {\n const waitId = readWaitId(options.pendingWait);\n const targetPhaseIndex =\n typeof options.pendingWait.payload.phaseIndex === \"number\"\n ? options.pendingWait.payload.phaseIndex\n : undefined;\n const pendingWaitIndex = options.events.indexOf(options.pendingWait);\n const inStepEvents = options.events.slice(options.targetStepStartedIndex + 1, pendingWaitIndex);\n const promptOutputs = inStepEvents.filter(\n (event) =>\n event.type === \"step.completed\" &&\n event.stepId === options.node.config.id &&\n isPlainObject(event.payload.output),\n );\n const satisfiedWaits = inStepEvents.filter(\n (event) =>\n event.type === \"wait.satisfied\" &&\n event.stepId === options.node.config.id &&\n isPlainObject(event.payload.output) &&\n typeof event.payload.waitId === \"string\",\n );\n\n let phaseValue = options.node.config.input;\n let promptOutputIndex = 0;\n let satisfiedWaitIndex = 0;\n const waitOutputs: Record<string, PlainObject> = {};\n const seenWaitIds: string[] = [];\n\n for (const [phaseIndex, phase] of getStepPhases(options.node).entries()) {\n if (phase.kind === \"display\") {\n continue;\n }\n\n if (phase.kind === \"prompt\") {\n const completedEvent = promptOutputs[promptOutputIndex];\n promptOutputIndex += 1;\n if (!completedEvent || !isPlainObject(completedEvent.payload.output)) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_missing_step_output\",\n `Step ${options.node.config.id} has no recorded prompt output before wait ${waitId ?? \"<missing>\"}.`,\n ),\n };\n }\n\n const outputSchema = resolveStepOutputSchema(phase);\n if (!outputSchema) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_output_schema_unresolvable\",\n `Step ${options.node.config.id} has no resolvable output schema to continue with.`,\n ),\n };\n }\n phaseValue = outputSchema.assert(\n completedEvent.payload.output,\n `step ${options.node.config.id} output`,\n );\n continue;\n }\n\n if (phase.kind === \"wait\") {\n const isTargetPhase =\n targetPhaseIndex === undefined\n ? await waitPhaseMatches(phase, {\n phaseValue,\n waitOutputs,\n input: options.node.config.input,\n waitId,\n })\n : phaseIndex === targetPhaseIndex;\n if (isTargetPhase) {\n return {\n status: \"success\",\n phaseIndex,\n phaseValue,\n waitOutputs,\n seenWaitIds,\n };\n }\n\n const satisfiedEvent = satisfiedWaits[satisfiedWaitIndex];\n satisfiedWaitIndex += 1;\n const satisfiedWaitId =\n typeof satisfiedEvent?.payload.waitId === \"string\"\n ? satisfiedEvent.payload.waitId\n : undefined;\n if (!satisfiedWaitId || !isPlainObject(satisfiedEvent?.payload.output)) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_missing_wait_output\",\n `Step ${options.node.config.id} has no recorded satisfied wait output before wait ${waitId ?? \"<missing>\"}.`,\n ),\n };\n }\n\n if (seenWaitIds.includes(satisfiedWaitId)) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_duplicate_wait_id\",\n `Step ${options.node.config.id} has duplicate wait id '${satisfiedWaitId}'.`,\n ),\n };\n }\n seenWaitIds.push(satisfiedWaitId);\n waitOutputs[satisfiedWaitId] = satisfiedEvent.payload.output;\n continue;\n }\n\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_wait_after_do\",\n `Pending wait ${waitId ?? \"<missing>\"} occurs after step ${options.node.config.id}'s do phase.`,\n ),\n };\n }\n\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_wait_not_reachable\",\n `Pending wait ${waitId ?? \"<missing>\"} was not found in step ${options.node.config.id}.`,\n ),\n };\n}\n\nasync function waitPhaseMatches(\n phase: WaitPhase,\n context: {\n readonly phaseValue: PlainObject;\n readonly waitOutputs: Readonly<Record<string, PlainObject>>;\n readonly input: PlainObject;\n readonly waitId: string | undefined;\n },\n): Promise<boolean> {\n if (!context.waitId) {\n return false;\n }\n\n if (phase.options !== undefined) {\n return false;\n }\n\n const wait =\n typeof phase.wait === \"function\"\n ? await (\n phase.wait as (waitContext: {\n readonly input: PlainObject;\n readonly output: PlainObject;\n readonly waits: Readonly<Record<string, PlainObject>>;\n }) => unknown | Promise<unknown>\n )({\n input: context.input,\n output: context.phaseValue,\n waits: context.waitOutputs,\n })\n : phase.wait;\n return isPlainObject(wait) && wait.id === context.waitId;\n}\n\nfunction findStepStartedIndex(\n events: readonly Event[],\n pendingWait: Event,\n stepIndex: number,\n): number | undefined {\n let ordinal = 0;\n for (const [index, event] of events.entries()) {\n if (event.type !== \"step.started\") {\n continue;\n }\n ordinal += 1;\n if (ordinal === stepIndex) {\n return index;\n }\n }\n\n for (let index = events.indexOf(pendingWait); index >= 0; index -= 1) {\n const event = events[index];\n if (event?.type === \"step.started\" && event.stepId === pendingWait.stepId) {\n return index;\n }\n }\n\n return undefined;\n}\n\nfunction stepStartedOrdinalBefore(\n events: readonly Event[],\n pendingWait: Event,\n): number | undefined {\n const waitIndex = events.indexOf(pendingWait);\n if (waitIndex === -1) {\n return undefined;\n }\n const count = events.slice(0, waitIndex).filter((event) => event.type === \"step.started\").length;\n return count > 0 ? count : undefined;\n}\n\nfunction readStepIndex(event: Event): number | undefined {\n const artifactStepId = readArtifactStepId(event);\n const prefix = artifactStepId?.match(/^(\\d+)-/u)?.[1];\n if (prefix === undefined) {\n return undefined;\n }\n\n const stepIndex = Number(prefix);\n return Number.isInteger(stepIndex) && stepIndex > 0 ? stepIndex : undefined;\n}\n\nfunction stepDirForIndex(runDir: string, event: Event, stepIndex: number): string {\n const artifactStepId =\n readArtifactStepId(event) ?? `${String(stepIndex).padStart(4, \"0\")}-${event.stepId ?? \"step\"}`;\n return join(runDir, \"steps\", artifactStepId);\n}\n\nfunction readArtifactStepId(event: Event): string | undefined {\n const artifactPaths = readWaitArtifactPaths(event);\n const path = artifactPaths?.requestFile ?? artifactPaths?.answerFile;\n return path?.match(/^steps\\/([^/]+)\\/waits\\//u)?.[1];\n}\n\nfunction readWaitArtifactPaths(\n event: Event,\n): { readonly requestFile: string; readonly answerFile: string } | undefined {\n const artifactPaths = event.payload.artifactPaths;\n if (!isPlainObject(artifactPaths)) {\n return undefined;\n }\n\n const requestFile = artifactPaths.requestFile;\n const answerFile = artifactPaths.answerFile;\n if (typeof requestFile !== \"string\" || typeof answerFile !== \"string\") {\n return undefined;\n }\n\n return { requestFile, answerFile };\n}\n\nfunction waitEventKey(event: Event): string | undefined {\n const artifactPaths = event.payload.artifactPaths;\n if (isPlainObject(artifactPaths) && typeof artifactPaths.answerFile === \"string\") {\n return artifactPaths.answerFile;\n }\n\n const waitId = readWaitId(event);\n return event.stepId && waitId ? `${event.stepId}:${waitId}` : undefined;\n}\n\nfunction readWaitId(event: Event): string | undefined {\n return typeof event.payload.waitId === \"string\" ? event.payload.waitId : undefined;\n}\n\nfunction readPlainPayload(event: Event, key: string): PlainObject | undefined {\n const value = event.payload[key];\n return isPlainObject(value) ? value : undefined;\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\nfunction resumeFailure(code: string, message: string): Failure {\n return { code, message };\n}\n","import type { StepNode } from \"../../authoring/step/continuation.types.js\";\nimport type { Failure } from \"../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport { replayCompletedSteps } from \"../resume/replay-completed-steps/replay-completed-steps.js\";\nimport type { Event, RunWorkflowOptions } from \"../run-workflow/run-workflow.types.js\";\nimport { selectLatestUnresolvedFailure } from \"./latest-unresolved-failure.js\";\n\nexport async function replayToRetryFailure<\n TInput extends PlainObject,\n TOutput extends PlainObject,\n>(options: {\n readonly workflow: RunWorkflowOptions<TInput, TOutput>[\"workflow\"];\n readonly events: readonly Event[];\n readonly runDir: string;\n}): Promise<\n | {\n readonly status: \"success\";\n readonly input: PlainObject;\n readonly node: StepNode;\n readonly retriedStepId: string;\n readonly sourceFailureEventId: string;\n readonly sourceFailureReplayPosition: number;\n }\n | { readonly status: \"failure\"; readonly failure: Failure }\n> {\n const failure = selectLatestUnresolvedFailure(options.events);\n if (!failure) {\n return {\n status: \"failure\",\n failure: retryFailure(\n \"retry_target_not_failed\",\n \"Retry target has no latest unresolved failure.\",\n ),\n };\n }\n\n if (failure.workflowId !== options.workflow.id) {\n return {\n status: \"failure\",\n failure: retryFailure(\n \"retry_workflow_mismatch\",\n `Retry target workflow ${failure.workflowId} does not match ${options.workflow.id}.`,\n ),\n };\n }\n\n if (!failure.workflowInput) {\n return {\n status: \"failure\",\n failure: retryFailure(\"retry_target_not_found\", \"workflow.started payload is missing input.\"),\n };\n }\n\n if (!failure.stepId) {\n return {\n status: \"failure\",\n failure: retryFailure(\n \"retry_target_not_failed\",\n failure.event.type === \"workflow.failed\"\n ? \"Workflow failure has no associated step ID. This run may use unsupported historical retry metadata.\"\n : \"Failed retry target event has no step ID.\",\n ),\n };\n }\n\n const replay = await replayCompletedSteps({\n workflow: options.workflow,\n events: eventsBeforeRetryTarget(\n options.events,\n failure.replayPosition,\n failure.stepId,\n failure.event,\n ),\n input: failure.workflowInput,\n targetStepId: failure.stepId,\n runDir: options.runDir,\n });\n if (replay.status === \"failure\") {\n return replay;\n }\n\n const { node } = replay;\n if (node.onError) {\n return {\n status: \"failure\",\n failure: retryFailure(\n \"retry_unsupported_history\",\n `Retry does not support onError history for step ${node.config.id}.`,\n ),\n };\n }\n\n return {\n status: \"success\",\n input: failure.workflowInput,\n node,\n retriedStepId: failure.stepId,\n sourceFailureEventId: failure.sourceFailureEventId ?? failure.event.id,\n sourceFailureReplayPosition: failure.replayPosition,\n };\n}\n\nfunction eventsBeforeRetryTarget(\n events: readonly Event[],\n replayPosition: number,\n targetStepId: string,\n targetEvent: Event,\n): readonly Event[] {\n const eventsBeforeFailure = events.slice(0, replayPosition);\n const excludedPositions = new Set<number>();\n\n for (const event of eventsBeforeFailure) {\n if (event.type !== \"workflow.retryStarted\") {\n continue;\n }\n\n const resolvedPosition = readSourceFailureReplayPosition(event);\n if (resolvedPosition === undefined || resolvedPosition >= replayPosition) {\n continue;\n }\n\n for (const position of resolvedAttemptPositions(events, resolvedPosition)) {\n excludedPositions.add(position);\n }\n }\n\n if (targetEvent.type === \"step.started\") {\n return eventsBeforeFailure.filter(\n (event, index) => !excludedPositions.has(index) || shouldKeepResolvedAttemptEvent(event),\n );\n }\n\n let targetAttemptStartPosition = -1;\n for (let index = eventsBeforeFailure.length - 1; index >= 0; index -= 1) {\n const event = eventsBeforeFailure[index];\n if (excludedPositions.has(index)) {\n continue;\n }\n\n if (event?.type === \"step.started\" && event.stepId === targetStepId) {\n targetAttemptStartPosition = index;\n break;\n }\n }\n\n return eventsBeforeFailure.filter((event, index) => {\n if (excludedPositions.has(index) && !shouldKeepResolvedAttemptEvent(event)) {\n return false;\n }\n\n return (\n targetAttemptStartPosition === -1 ||\n index <= targetAttemptStartPosition ||\n event.type !== \"step.completed\" ||\n event.stepId !== targetStepId\n );\n });\n}\n\nfunction shouldKeepResolvedAttemptEvent(event: Event): boolean {\n // Replay must not consume completed outputs from a previously failed attempt,\n // but it still needs the attempt's start/terminal events so step artifact\n // ordinals remain aligned with the original event stream and failed starts are\n // paired off before later retried attempts with the same step id complete.\n return (\n event.type === \"step.started\" || event.type === \"step.failed\" || event.type === \"step.cancelled\"\n );\n}\n\nfunction readSourceFailureReplayPosition(event: Event): number | undefined {\n const { sourceFailureReplayPosition } = event.payload;\n return typeof sourceFailureReplayPosition === \"number\" ? sourceFailureReplayPosition : undefined;\n}\n\nfunction resolvedAttemptPositions(\n events: readonly Event[],\n resolvedPosition: number,\n): readonly number[] {\n const resolvedEvent = events[resolvedPosition];\n if (!resolvedEvent?.stepId) {\n return [resolvedPosition];\n }\n\n const attemptStartPosition = findAttemptStartPosition(\n events,\n resolvedPosition,\n resolvedEvent.stepId,\n );\n const startPosition = attemptStartPosition === -1 ? resolvedPosition : attemptStartPosition;\n const positions: number[] = [];\n for (let position = startPosition; position <= resolvedPosition; position += 1) {\n positions.push(position);\n }\n\n return positions;\n}\n\nfunction findAttemptStartPosition(\n events: readonly Event[],\n resolvedPosition: number,\n stepId: string,\n): number {\n for (let index = resolvedPosition; index >= 0; index -= 1) {\n const event = events[index];\n if (event?.type === \"step.started\" && event.stepId === stepId) {\n return index;\n }\n }\n\n return -1;\n}\n\nfunction retryFailure(code: string, message: string): Failure {\n return { code, message };\n}\n","import type { TrailStepConfig } from \"../../agent-targeting/targeting.types.js\";\nimport type { WorkflowAgentRole } from \"../../contracts/agents/agent-role.types.js\";\nimport type {\n RunContext,\n RunContextEvent,\n RunContextGlobalState,\n RunContextProviderWorkingRunner,\n RunContextState,\n RunContextWorkingAgentProcessRunner,\n} from \"../../contracts/run-context/run-context.types.js\";\nimport {\n type RunState,\n readGlobalState,\n readRunState,\n writeGlobalState,\n writeRunState,\n} from \"../artifacts/run-storage.js\";\n\nexport function createRunContext(options: {\n readonly runId: string;\n readonly runName: string;\n readonly runDir: string;\n readonly initialState?: RunState;\n readonly workflowId?: string;\n readonly workflowAgents?: Readonly<Record<string, WorkflowAgentRole>>;\n readonly projectCwd?: string;\n readonly cwd?: string;\n readonly executionCwd?: string;\n readonly trailstepConfig?: TrailStepConfig;\n readonly workingAgentProcessRunner?: RunContextWorkingAgentProcessRunner;\n readonly providerWorkingRunner?: RunContextProviderWorkingRunner;\n readonly emit?: (event: RunContextEvent) => Promise<void>;\n readonly events?: () => readonly RunContextEvent[];\n}): RunContext {\n const state = createQueuedRunState({\n read: () => readRunState(options.runDir),\n write: (nextState) => writeRunState(options.runDir, nextState),\n ...(options.initialState === undefined ? {} : { initialState: options.initialState }),\n });\n const globalState = createQueuedGlobalState({\n read: () => readGlobalState(options.runDir),\n write: (nextState) => writeGlobalState(options.runDir, nextState),\n });\n\n return {\n id: options.runId,\n name: options.runName,\n path: options.runDir,\n workflowId: options.workflowId,\n workflowAgents: options.workflowAgents,\n projectCwd: options.projectCwd,\n cwd: options.cwd,\n executionCwd: options.executionCwd ?? options.cwd,\n trailstepConfig: options.trailstepConfig,\n workingAgentProcessRunner: options.workingAgentProcessRunner,\n providerWorkingRunner: options.providerWorkingRunner,\n emit: options.emit,\n events: options.events,\n state,\n globalState,\n };\n}\n\nexport function createQueuedRunState(options: {\n readonly read: () => Promise<RunState>;\n readonly write: (state: RunState) => Promise<void>;\n readonly initialState?: RunState;\n}): RunContextState {\n let cache: RunState | undefined;\n let loadPromise: Promise<RunState> | undefined;\n let writeQueue: Promise<unknown> = Promise.resolve();\n\n function ensureLoaded(): Promise<RunState> {\n if (cache) return Promise.resolve(cache);\n if (options.initialState !== undefined) {\n cache = { ...options.initialState };\n return Promise.resolve(cache);\n }\n loadPromise ??= options.read().then((state) => (cache = state));\n return loadPromise;\n }\n\n function enqueueWrite(): Promise<void> {\n const next = writeQueue.then(async () => {\n const state = await ensureLoaded();\n await options.write(state);\n });\n writeQueue = next.catch(() => {});\n return next;\n }\n\n return {\n async get<T = unknown>(key: string): Promise<T | undefined> {\n const state = await ensureLoaded();\n return state[key] as T | undefined;\n },\n async getPersisted<T = unknown>(key: string): Promise<T | undefined> {\n const state = await options.read();\n return state[key] as T | undefined;\n },\n async hydratePersisted(): Promise<void> {\n const persisted = await options.read();\n const state = await ensureLoaded();\n cache = { ...state, ...persisted };\n },\n async set(\n key: string,\n value: unknown,\n options: { readonly persist?: boolean } = {},\n ): Promise<void> {\n const state = await ensureLoaded();\n state[key] = value;\n if (options.persist !== false) {\n await enqueueWrite();\n }\n },\n };\n}\n\nexport function createQueuedGlobalState(options: {\n readonly read: () => Promise<RunState>;\n readonly write: (state: RunState) => Promise<void>;\n}): RunContextGlobalState {\n let cache: RunState | undefined;\n let loadPromise: Promise<RunState> | undefined;\n let mutationQueue: Promise<unknown> = Promise.resolve();\n\n function ensureLoaded(): Promise<RunState> {\n if (cache) return Promise.resolve(cache);\n loadPromise ??= options.read().then((state) => (cache = state));\n return loadPromise;\n }\n\n function enqueueMutation<T>(mutation: (state: RunState) => Promise<T>): Promise<T> {\n const next = mutationQueue.then(async () => {\n const state = await ensureLoaded();\n return await mutation(state);\n });\n mutationQueue = next.catch(() => {});\n return next;\n }\n\n return {\n async get<T = unknown>(key: string): Promise<T | undefined> {\n const state = await mutationQueue.then(() => ensureLoaded());\n return state[key] as T | undefined;\n },\n async getPersisted<T = unknown>(key: string): Promise<T | undefined> {\n const state = await mutationQueue.then(() => options.read());\n return state[key] as T | undefined;\n },\n async hydratePersisted(): Promise<void> {\n await enqueueMutation(async (state) => {\n const persisted = await options.read();\n for (const [key, value] of Object.entries(persisted)) {\n state[key] = value;\n }\n });\n },\n async set(\n key: string,\n value: unknown,\n setOptions: { readonly persist?: boolean } = {},\n ): Promise<void> {\n await enqueueMutation(async (state) => {\n state[key] = value;\n if (setOptions.persist !== false) {\n await options.write(state);\n }\n });\n },\n async update<T = unknown>(\n key: string,\n updater: (current: T | undefined) => T | Promise<T>,\n ): Promise<T> {\n return await enqueueMutation(async (state) => {\n const updated = await updater(state[key] as T | undefined);\n state[key] = updated;\n await options.write(state);\n return updated;\n });\n },\n };\n}\n","import { basename } from \"node:path\";\n\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport { createRunDirectory, readRunEvents } from \"../artifacts/run-storage.js\";\nimport { resolveAndValidateRunCwds } from \"./cwd.js\";\nimport type { Event, RunWorkflowOptions } from \"./run-workflow.types.js\";\n\nexport async function initializeRun<TInput extends PlainObject, TOutput extends PlainObject>(\n options: RunWorkflowOptions<TInput, TOutput>,\n): Promise<{\n readonly runId: string;\n readonly runName: string;\n readonly runDir: string;\n readonly previousEvents: readonly Event[];\n}> {\n const existingRunDir =\n options.resume?.runDir ?? options.retry?.runDir ?? options.continue?.runDir;\n if (existingRunDir) {\n const previousEvents = await readRunEvents(existingRunDir);\n const startedEvent = previousEvents.find((event) => event.type === \"workflow.started\");\n return {\n runId: startedEvent?.runId ?? basename(existingRunDir),\n runName: startedEvent?.runId ?? basename(existingRunDir),\n runDir: existingRunDir,\n previousEvents,\n };\n }\n\n const { projectCwd } = await resolveAndValidateRunCwds(options);\n const runName = options.runName;\n if (runName === undefined) {\n throw new Error(\"Expected runName for a new workflow run.\");\n }\n const { runId, runDir } = await createRunDirectory({\n cwd: projectCwd,\n runName,\n runsRoot: options.runsRoot,\n });\n return { runId, runName, runDir, previousEvents: [] };\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { availableParallelism } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { TrailStepConfig } from \"../../agent-targeting/targeting.types.js\";\nimport type {\n ContinuationResult,\n ParallelFailurePolicy,\n ParallelOptions,\n} from \"../../authoring/step/continuation.types.js\";\nimport {\n isParallelNode,\n isStepNode,\n isWorkflowInvocationNode,\n} from \"../../authoring/step/step-node.js\";\nimport type { WorkflowAgentRole } from \"../../contracts/agents/agent-role.types.js\";\nimport type { Failure } from \"../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport { readBranchRunState, writeBranchRunState } from \"../artifacts/run-storage.js\";\nimport { resolveStepArtifactPaths } from \"../artifacts/step-artifacts.js\";\nimport {\n type RunContinuationResult,\n runContinuation,\n type WaitingWait,\n} from \"../continuation/run-continuation/run-continuation.js\";\nimport { createQueuedRunState } from \"../run-context/create-run-context.js\";\nimport { runContextStorage } from \"../run-context/run-context-storage.js\";\nimport type { TimeoutPolicyInput } from \"../timeout/timeout-policy.js\";\nimport type {\n Event,\n RunWorkflowOptions,\n RunWorkflowTrackRetryOptions,\n} from \"./run-workflow.types.js\";\n\ninterface RunRootContinuationArraySchedulerOptions {\n readonly nodes: readonly ContinuationResult[];\n readonly rootIsArray?: boolean;\n readonly runId: string;\n readonly workflowId: string;\n readonly emit: (event: Event) => Promise<void>;\n readonly maxSteps: number;\n readonly initialSource: string;\n readonly workers?: number;\n readonly workflowAgents: Readonly<Record<string, WorkflowAgentRole>>;\n readonly workflowTimeout?: TimeoutPolicyInput;\n readonly runDir: string;\n readonly projectCwd?: string;\n readonly cwd: string;\n readonly trailstepConfig?: TrailStepConfig;\n readonly workingAgentProcessRunner?: RunWorkflowOptions[\"workingAgentProcessRunner\"];\n readonly providerWorkingRunner?: RunWorkflowOptions[\"providerWorkingRunner\"];\n readonly processRunner?: RunWorkflowOptions[\"processRunner\"];\n readonly retry?: {\n readonly initialExecutedSteps: number;\n readonly track?: RunWorkflowTrackRetryOptions;\n };\n}\n\ntype BranchStatus = \"queued\" | \"running\" | \"done\" | \"failed\" | \"waiting\" | \"cancelled\" | \"split\";\ntype TrackTerminalKind = \"absoluteDone\" | \"absoluteFail\" | \"failure\" | \"waiting\" | \"cancelled\";\ntype AbsoluteTerminalKind = \"absoluteDone\" | \"absoluteFail\";\n\ninterface TrackStateJson {\n readonly runId: string;\n readonly status: string;\n readonly workers: number;\n readonly failurePolicy: \"fail-fast\";\n readonly rootBranchId: string;\n readonly splitOccurred: boolean;\n readonly branches: readonly string[];\n readonly terminalBranchId?: string;\n readonly terminalKind?: TrackTerminalKind;\n readonly terminalOutput?: PlainObject;\n readonly failure?: Failure;\n}\n\ninterface BranchState {\n readonly branchId: string;\n readonly parentBranchId?: string;\n readonly requestedBranchId?: string;\n readonly joinContinuation?: boolean;\n pendingPostJoin?: boolean;\n readonly workflowId: string;\n readonly createdAt: string;\n status: BranchStatus;\n output?: PlainObject;\n failure?: Failure;\n wait?: WaitingWait;\n terminalKind?: AbsoluteTerminalKind;\n message?: string;\n source: string;\n splitSource?: string;\n updatedAt: string;\n latestStepIndex: number;\n latestStepId?: string;\n}\n\ninterface PendingJoin {\n readonly parentBranchId: string;\n readonly childBranchIds: readonly string[];\n readonly source: string;\n readonly failurePolicy: ParallelFailurePolicy;\n readonly postContinuation: (\n output: PlainObject,\n ) => ContinuationResult | Promise<ContinuationResult>;\n readonly afterPostContinuation?: (\n output: PlainObject,\n ) => ContinuationResult | Promise<ContinuationResult>;\n completed: Readonly<Record<string, PlainObject>>;\n}\n\ninterface BranchStateJson {\n readonly branchId: string;\n readonly parentBranchId?: string;\n readonly requestedBranchId?: string;\n readonly joinContinuation?: boolean;\n readonly pendingPostJoin?: boolean;\n readonly status: BranchStatus;\n readonly workflowId: string;\n readonly source: string;\n readonly splitSource?: string;\n readonly output: PlainObject;\n readonly failure?: Failure;\n readonly wait?: WaitingWait;\n readonly terminalKind?: AbsoluteTerminalKind;\n readonly message?: string;\n readonly createdAt: string;\n readonly updatedAt: string;\n readonly latestStepIndex: number;\n readonly latestStepId?: string;\n}\n\ninterface QueuedBranch {\n readonly node: ContinuationResult;\n readonly branch: BranchState;\n readonly source: string;\n readonly requireRunnableBranchCandidate: boolean;\n readonly parallelGroupId?: string;\n readonly parallelConcurrency?: number;\n readonly failurePolicy: ParallelFailurePolicy;\n}\n\nexport async function runRootContinuationArrayScheduler(\n options: RunRootContinuationArraySchedulerOptions,\n): Promise<RunContinuationResult> {\n const resolvedWorkers = resolveSchedulerWorkerCount(options.workers);\n if (!resolvedWorkers.ok) {\n return resolvedWorkers.failure;\n }\n\n const workers = resolvedWorkers.workers;\n const rootBranchId = \"root\";\n const branches: BranchState[] = [];\n const queue: QueuedBranch[] = [];\n let splitOccurred = options.rootIsArray === true;\n let nextStepIndex = options.retry?.initialExecutedSteps ?? 0;\n let nextBranchId = 1;\n let terminalResult: RunContinuationResult | undefined;\n let terminalBranchId: string | undefined;\n let terminalKind: TrackTerminalKind | undefined;\n const pendingJoins: PendingJoin[] = [];\n const activeByParallelGroup = new Map<string, number>();\n\n const allocateStepIndex = (branch: BranchState): number => {\n if (nextStepIndex >= options.maxSteps) {\n throw new Error(`workflow exceeded maxSteps guard (${options.maxSteps})`);\n }\n nextStepIndex += 1;\n branch.latestStepIndex = nextStepIndex;\n branch.updatedAt = new Date().toISOString();\n return nextStepIndex;\n };\n\n const allocateBranchId = (node: ContinuationResult): string => {\n const explicitBranchId = requestedBranchMetadata(node).requestedBranchId;\n if (explicitBranchId !== undefined) {\n return explicitBranchId;\n }\n\n const baseBranchId = branchIdBaseForNode(node);\n let suffix = 1;\n while (branches.some((branch) => branch.branchId === `${baseBranchId}-${suffix}`)) {\n suffix += 1;\n }\n nextBranchId = Math.max(nextBranchId, suffix + 1);\n return `${baseBranchId}-${suffix}`;\n };\n\n const enqueue = (\n node: ContinuationResult,\n parentBranchId: string | undefined,\n source: string,\n requireRunnableBranchCandidate: boolean,\n joinContinuation = false,\n scheduling?: {\n readonly parallelGroupId?: string;\n readonly parallelConcurrency?: number;\n readonly failurePolicy?: ParallelFailurePolicy;\n },\n ): BranchState => {\n const branch = createBranchRecord({\n node,\n parentBranchId,\n source,\n workflowId: workflowIdForBranchNode(node, options.workflowId),\n branchId:\n parentBranchId === undefined && branches.length === 0\n ? rootBranchId\n : allocateBranchId(node),\n joinContinuation,\n });\n branches.push(branch);\n if (terminalResult === undefined) {\n queue.push({\n node,\n branch,\n source,\n requireRunnableBranchCandidate,\n failurePolicy: scheduling?.failurePolicy ?? \"fail-fast\",\n ...(scheduling?.parallelGroupId === undefined\n ? {}\n : { parallelGroupId: scheduling.parallelGroupId }),\n ...(scheduling?.parallelConcurrency === undefined\n ? {}\n : { parallelConcurrency: scheduling.parallelConcurrency }),\n });\n } else {\n branch.status = \"cancelled\";\n branch.updatedAt = new Date().toISOString();\n }\n return branch;\n };\n\n const cancelQueuedAndPreventableBranches = async (preservedBranchId?: string): Promise<void> => {\n queue.length = 0;\n await cancelPreventableBranches(branches, options.runDir, preservedBranchId);\n };\n\n const terminalizeTrack = async (\n result: RunContinuationResult,\n terminal?: { readonly branchId: string; readonly kind: TrackTerminalKind },\n ): Promise<void> => {\n if (terminalResult === undefined) {\n terminalResult = result;\n terminalBranchId = terminal?.branchId;\n terminalKind = terminal?.kind;\n await cancelQueuedAndPreventableBranches(terminal?.branchId);\n }\n };\n\n if (options.retry !== undefined) {\n const retryPlan = await createPersistedTrackRetryPlan({\n nodes: options.nodes,\n runDir: options.runDir,\n workflowId: options.workflowId,\n initialSource: options.initialSource,\n track: options.retry.track,\n });\n if (retryPlan.status === \"failure\") {\n return retryPlan.failure;\n }\n branches.push(...retryPlan.branches);\n queue.push(...retryPlan.queue);\n splitOccurred = retryPlan.splitOccurred;\n nextBranchId = retryPlan.nextBranchId;\n } else if (options.rootIsArray === true) {\n if (!options.nodes.every(isRunnableBranchCandidate)) {\n return invalidArrayCandidateFailure(options.initialSource);\n }\n const duplicateBranchIdFailure = explicitDuplicateBranchIdFailure(\n options.nodes,\n options.initialSource,\n branches,\n );\n if (duplicateBranchIdFailure !== undefined) {\n return duplicateBranchIdFailure;\n }\n for (const node of options.nodes) {\n enqueue(node, rootBranchId, options.initialSource, true);\n }\n } else {\n const rootNode = options.nodes[0];\n if (rootNode === undefined) {\n return {\n status: \"failure\",\n failure: {\n code: \"invalid_continuation\",\n message: `${options.initialSource} returned an invalid continuation node.`,\n },\n };\n }\n enqueue(rootNode, undefined, options.initialSource, false);\n }\n\n await persistTrack(options, workers, rootBranchId, branches, \"running\", splitOccurred);\n\n let activeWorkers = 0;\n\n await new Promise<void>((resolve, reject) => {\n const schedule = (): void => {\n if (terminalResult !== undefined || queue.length === 0) {\n if (activeWorkers === 0) {\n resolve();\n }\n return;\n }\n\n while (terminalResult === undefined && activeWorkers < workers && queue.length > 0) {\n const queued = shiftRunnableQueuedBranch(queue, activeByParallelGroup);\n if (queued === undefined) {\n if (activeWorkers === 0) {\n resolve();\n }\n return;\n }\n activeWorkers += 1;\n incrementActiveParallelGroup(queued.parallelGroupId, activeByParallelGroup);\n\n void runBranch(queued)\n .then(async (branchResult) => {\n if (branchResult.status !== \"success\") {\n await terminalizeTrack(branchResult);\n }\n })\n .then(\n () => {\n activeWorkers -= 1;\n decrementActiveParallelGroup(queued.parallelGroupId, activeByParallelGroup);\n schedule();\n },\n (error: unknown) => {\n reject(error);\n },\n );\n }\n };\n\n schedule();\n });\n\n if (terminalResult !== undefined) {\n await cancelQueuedAndPreventableBranches(terminalBranchId);\n await Promise.all(branches.map((branch) => persistBranch(options.runDir, branch)));\n await persistTrack(\n options,\n workers,\n rootBranchId,\n branches,\n trackStatusFromTerminalResult(terminalResult),\n splitOccurred,\n terminalResult.status === \"failure\" || terminalResult.status === \"absoluteFailure\"\n ? terminalResult.failure\n : undefined,\n terminalBranchId,\n terminalKind,\n terminalResult.status === \"success\" || terminalResult.status === \"absoluteSuccess\"\n ? terminalResult.output\n : undefined,\n );\n return publicTerminalResult(terminalResult);\n }\n\n await Promise.all(branches.map((branch) => persistBranch(options.runDir, branch)));\n await persistTrack(options, workers, rootBranchId, branches, \"completed\", splitOccurred);\n\n const terminalBranches = branches.filter((branch) => isBranchTerminalStatus(branch.status));\n const joinContinuationBranch = [...terminalBranches]\n .reverse()\n .find((branch) => branch.joinContinuation === true && branch.status === \"done\");\n if (joinContinuationBranch !== undefined) {\n return {\n status: \"success\",\n output: joinContinuationBranch.output ?? {},\n ...(joinContinuationBranch.message === undefined\n ? {}\n : { message: joinContinuationBranch.message }),\n };\n }\n\n if (!splitOccurred && terminalBranches.length === 1 && terminalBranches[0]?.status === \"done\") {\n return {\n status: \"success\",\n output: terminalBranches[0].output ?? {},\n ...(terminalBranches[0].message === undefined\n ? {}\n : { message: terminalBranches[0].message }),\n };\n }\n\n return {\n status: \"success\",\n output: {\n status: \"completed\",\n branches: Object.fromEntries(\n terminalBranches.map((branch) => [branch.branchId, branchSettlementForSummary(branch)]),\n ),\n },\n };\n\n async function runWithBranchState<T>(branchId: string, fn: () => Promise<T>): Promise<T> {\n const parentContext = runContextStorage.getStore();\n if (!parentContext || (!splitOccurred && branchId === rootBranchId)) {\n return await fn();\n }\n\n const branchContext = {\n ...parentContext,\n state: createQueuedRunState({\n read: () => readBranchRunState(options.runDir, branchId),\n write: (nextState) => writeBranchRunState(options.runDir, branchId, nextState),\n }),\n };\n return await runContextStorage.run(branchContext, fn);\n }\n\n async function runBranch(queued: QueuedBranch): Promise<RunContinuationResult> {\n const { node, branch, source, requireRunnableBranchCandidate, failurePolicy } = queued;\n if (requireRunnableBranchCandidate && !isRunnableBranchCandidate(node)) {\n branch.status = \"failed\";\n branch.updatedAt = new Date().toISOString();\n await persistBranch(options.runDir, branch);\n return invalidArrayCandidateFailure(source);\n }\n\n branch.status = \"running\";\n branch.updatedAt = new Date().toISOString();\n await persistBranch(options.runDir, branch);\n\n const branchResult = await runWithBranchState(branch.branchId, async () =>\n runContinuation({\n node,\n runId: options.runId,\n workflowId: options.workflowId,\n emit: async (event) => {\n if (event.type === \"step.started\" && event.stepId !== undefined) {\n branch.latestStepId = event.stepId;\n }\n if (splitOccurred && event.type === \"step.started\" && event.stepId !== undefined) {\n const stepArtifacts = resolveStepArtifactPaths({\n runDir: options.runDir,\n stepId: event.stepId,\n stepIndex: branch.latestStepIndex,\n });\n await mkdir(stepArtifacts.stepDir, { recursive: true });\n }\n await options.emit(decorateBranchEvent(event, options.runId, branch));\n },\n maxSteps: options.maxSteps,\n initialSource:\n !splitOccurred && branch.branchId === rootBranchId\n ? source\n : `${source} branch ${branch.branchId}`,\n allocateStepIndex: () => allocateStepIndex(branch),\n returnContinuationArrays: true,\n workflowAgents: options.workflowAgents,\n workflowTimeout: options.workflowTimeout,\n runDir: options.runDir,\n projectCwd: options.projectCwd,\n cwd: options.cwd,\n trailstepConfig: options.trailstepConfig,\n workingAgentProcessRunner: options.workingAgentProcessRunner,\n providerWorkingRunner: options.providerWorkingRunner,\n processRunner: options.processRunner,\n }),\n );\n\n branch.updatedAt = new Date().toISOString();\n const branchResultWasSplit = branchResult.status === \"split\";\n if (terminalResult !== undefined) {\n if (!isBranchTerminalStatus(branch.status)) {\n branch.status = \"cancelled\";\n branch.updatedAt = new Date().toISOString();\n }\n await persistBranch(options.runDir, branch);\n return { status: \"cancelled\", cancellation: { requestedAt: branch.updatedAt } };\n }\n\n if (branchResult.status === \"absoluteSuccess\") {\n branch.status = \"done\";\n branch.output = branchResult.output;\n branch.message = branchResult.message;\n branch.terminalKind = \"absoluteDone\";\n await terminalizeTrack(branchResult, { branchId: branch.branchId, kind: \"absoluteDone\" });\n await persistBranch(options.runDir, branch);\n return branchResult;\n }\n\n if (branchResult.status === \"absoluteFailure\") {\n branch.status = \"failed\";\n branch.failure = branchResult.failure;\n branch.message = branchResult.message;\n branch.terminalKind = \"absoluteFail\";\n await terminalizeTrack(branchResult, { branchId: branch.branchId, kind: \"absoluteFail\" });\n await persistBranch(options.runDir, branch);\n return branchResult;\n }\n\n if (branchResult.status === \"failure\") {\n branch.status = \"failed\";\n branch.failure = branchResult.failure;\n branch.message = branchResult.message;\n if (failurePolicy === \"all-settled\") {\n await enqueueSatisfiedJoins(branch);\n await persistBranch(options.runDir, branch);\n await persistTrack(options, workers, rootBranchId, branches, \"running\", splitOccurred);\n return { status: \"success\", output: {} };\n }\n await terminalizeTrack(branchResult, { branchId: branch.branchId, kind: \"failure\" });\n await persistBranch(options.runDir, branch);\n return branchResult;\n }\n\n if (branchResult.status === \"waiting\") {\n branch.status = \"waiting\";\n branch.wait = branchResult.wait;\n await terminalizeTrack(branchResult, { branchId: branch.branchId, kind: \"waiting\" });\n await persistBranch(options.runDir, branch);\n return branchResult;\n }\n\n if (branchResult.status === \"cancelled\") {\n branch.status = \"cancelled\";\n await terminalizeTrack(branchResult, { branchId: branch.branchId, kind: \"cancelled\" });\n await persistBranch(options.runDir, branch);\n return branchResult;\n }\n\n if (branchResult.status === \"split\") {\n if (!branchResult.nodes.every(isRunnableBranchCandidate)) {\n branch.status = \"failed\";\n branch.failure = invalidArrayCandidateFailure(branchResult.source).failure;\n await persistBranch(options.runDir, branch);\n return invalidArrayCandidateFailure(branchResult.source);\n }\n const duplicateBranchIdFailure = explicitDuplicateBranchIdFailure(\n branchResult.nodes,\n branchResult.source,\n branches,\n );\n if (duplicateBranchIdFailure !== undefined) {\n branch.status = \"failed\";\n branch.failure = duplicateBranchIdFailure.failure;\n await persistBranch(options.runDir, branch);\n return duplicateBranchIdFailure;\n }\n splitOccurred = true;\n branch.status = \"split\";\n branch.splitSource = branchResult.source;\n if (branch.latestStepId !== undefined && branch.latestStepIndex > 0) {\n const stepArtifacts = resolveStepArtifactPaths({\n runDir: options.runDir,\n stepId: branch.latestStepId,\n stepIndex: branch.latestStepIndex,\n });\n await mkdir(stepArtifacts.stepDir, { recursive: true });\n }\n if (terminalResult !== undefined) {\n branch.status = \"cancelled\";\n branch.updatedAt = new Date().toISOString();\n await persistBranch(options.runDir, branch);\n return { status: \"cancelled\", cancellation: { requestedAt: branch.updatedAt } };\n }\n const parallelOptions = normalizeParallelOptions(branchResult.parallelOptions);\n const childBranches = branchResult.nodes.map((childNode) =>\n enqueue(childNode, branch.branchId, branchResult.source, true, false, {\n parallelGroupId: branch.branchId,\n ...(parallelOptions.concurrency === undefined\n ? {}\n : { parallelConcurrency: parallelOptions.concurrency }),\n failurePolicy: parallelOptions.failurePolicy,\n }),\n );\n if (branchResult.postContinuation !== undefined) {\n branch.pendingPostJoin = true;\n pendingJoins.push({\n parentBranchId: branch.branchId,\n childBranchIds: childBranches.map((childBranch) => childBranch.branchId),\n source: branchResult.source,\n failurePolicy: parallelOptions.failurePolicy,\n postContinuation: branchResult.postContinuation,\n ...(branchResult.afterPostContinuation === undefined\n ? {}\n : { afterPostContinuation: branchResult.afterPostContinuation }),\n completed: {},\n });\n }\n await Promise.all(\n branches.map((persistedBranch) => persistBranch(options.runDir, persistedBranch)),\n );\n } else if (branchResult.status === \"success\") {\n branch.status = \"done\";\n branch.output = branchResult.output;\n branch.message = branchResult.message;\n await enqueueSatisfiedJoins(branch);\n }\n await persistBranch(options.runDir, branch);\n await persistTrack(options, workers, rootBranchId, branches, \"running\", splitOccurred);\n return branchResultWasSplit ? { status: \"success\", output: {} } : branchResult;\n }\n\n async function enqueueSatisfiedJoins(branch: BranchState): Promise<void> {\n for (const join of pendingJoins) {\n if (!join.childBranchIds.includes(branch.branchId)) {\n continue;\n }\n const settlement = branchSettlementForJoin(branch, join.failurePolicy);\n if (settlement === undefined) {\n continue;\n }\n join.completed = { ...join.completed, [branch.branchId]: settlement };\n if (Object.keys(join.completed).length !== join.childBranchIds.length) {\n continue;\n }\n\n let nextNode: ContinuationResult;\n try {\n nextNode = await join.postContinuation({ status: \"completed\", branches: join.completed });\n } catch (error) {\n await terminalizeTrack({\n status: \"failure\",\n failure: {\n code: \"step_execution_failed\",\n message: `parallel post failed for ${join.source}: ${String(error)}`,\n },\n });\n continue;\n }\n const postBranch = enqueue(\n nextNode,\n join.parentBranchId,\n `post for ${join.source}`,\n false,\n true,\n );\n if (join.afterPostContinuation !== undefined) {\n const afterPostContinuation = join.afterPostContinuation;\n pendingJoins.push({\n parentBranchId: join.parentBranchId,\n childBranchIds: [postBranch.branchId],\n source: `post for ${join.source}`,\n failurePolicy: \"fail-fast\",\n postContinuation: async (aggregateOutput) => {\n const branches = aggregateOutput.branches as Record<string, PlainObject> | undefined;\n const [output] = Object.values(branches ?? {});\n return afterPostContinuation(output ?? {});\n },\n completed: {},\n });\n }\n }\n }\n}\n\nfunction createBranchRecord(input: {\n readonly node: ContinuationResult;\n readonly parentBranchId: string | undefined;\n readonly source: string;\n readonly workflowId: string;\n readonly branchId: string;\n readonly joinContinuation: boolean;\n}): BranchState {\n const now = new Date().toISOString();\n return {\n branchId: input.branchId,\n ...(input.parentBranchId === undefined ? {} : { parentBranchId: input.parentBranchId }),\n ...(input.joinContinuation ? { joinContinuation: true } : {}),\n ...requestedBranchMetadata(input.node),\n workflowId: input.workflowId,\n createdAt: now,\n updatedAt: now,\n status: \"queued\",\n source: input.source,\n latestStepIndex: 0,\n };\n}\n\nfunction workflowIdForBranchNode(node: ContinuationResult, fallbackWorkflowId: string): string {\n if (isWorkflowInvocationNode(node)) {\n return node.workflow.id;\n }\n\n return fallbackWorkflowId;\n}\n\nfunction requestedBranchMetadata(node: ContinuationResult): {\n readonly requestedBranchId?: string;\n} {\n if (isWorkflowInvocationNode(node) && node.options?.branchId !== undefined) {\n return { requestedBranchId: node.options.branchId };\n }\n if (isStepNode(node) && node.options?.branchId !== undefined) {\n return { requestedBranchId: node.options.branchId };\n }\n\n return {};\n}\n\nfunction branchIdBaseForNode(node: ContinuationResult): string {\n const rawId = isWorkflowInvocationNode(node)\n ? node.workflow.id\n : isStepNode(node)\n ? node.config.id\n : \"branch\";\n return rawId.replaceAll(/[^A-Za-z0-9._-]/g, \"-\") || \"branch\";\n}\n\nfunction explicitDuplicateBranchIdFailure(\n nodes: readonly ContinuationResult[],\n source: string,\n existingBranches: readonly BranchState[],\n): (RunContinuationResult & { readonly status: \"failure\" }) | undefined {\n const seen = new Set<string>(existingBranches.map((branch) => branch.branchId));\n for (const node of nodes) {\n const branchId = requestedBranchMetadata(node).requestedBranchId;\n if (branchId === undefined) {\n continue;\n }\n if (seen.has(branchId)) {\n return {\n status: \"failure\",\n failure: {\n code: \"duplicate_branch_id\",\n message: `${source} scheduled multiple parallel branches with branchId ${JSON.stringify(\n branchId,\n )}; explicit branchId values must be unique within a parallel track.`,\n },\n };\n }\n seen.add(branchId);\n }\n return undefined;\n}\n\nfunction isRunnableBranchCandidate(node: ContinuationResult): boolean {\n return isStepNode(node) || isWorkflowInvocationNode(node);\n}\n\nfunction invalidArrayCandidateFailure(\n source: string,\n): RunContinuationResult & { readonly status: \"failure\" } {\n return {\n status: \"failure\",\n failure: {\n code: \"invalid_continuation\",\n message: `${source} returned a continuation array containing non-runnable branch candidates; array candidates must be runnable step or workflow invocation nodes.`,\n },\n };\n}\n\nfunction isBranchTerminalStatus(status: BranchStatus): boolean {\n return status === \"done\" || status === \"failed\" || status === \"cancelled\";\n}\n\nfunction normalizeParallelOptions(options: ParallelOptions | undefined): {\n readonly concurrency?: number;\n readonly failurePolicy: ParallelFailurePolicy;\n} {\n const concurrency = options?.concurrency;\n return {\n ...(concurrency === undefined ? {} : { concurrency }),\n failurePolicy: options?.failurePolicy ?? \"fail-fast\",\n };\n}\n\nfunction shiftRunnableQueuedBranch(\n queue: QueuedBranch[],\n activeByParallelGroup: ReadonlyMap<string, number>,\n): QueuedBranch | undefined {\n const index = queue.findIndex((candidate) => {\n if (candidate.parallelGroupId === undefined || candidate.parallelConcurrency === undefined) {\n return true;\n }\n return (\n (activeByParallelGroup.get(candidate.parallelGroupId) ?? 0) < candidate.parallelConcurrency\n );\n });\n if (index < 0) {\n return undefined;\n }\n const [queued] = queue.splice(index, 1);\n return queued;\n}\n\nfunction incrementActiveParallelGroup(\n parallelGroupId: string | undefined,\n activeByParallelGroup: Map<string, number>,\n): void {\n if (parallelGroupId === undefined) {\n return;\n }\n activeByParallelGroup.set(parallelGroupId, (activeByParallelGroup.get(parallelGroupId) ?? 0) + 1);\n}\n\nfunction decrementActiveParallelGroup(\n parallelGroupId: string | undefined,\n activeByParallelGroup: Map<string, number>,\n): void {\n if (parallelGroupId === undefined) {\n return;\n }\n const next = (activeByParallelGroup.get(parallelGroupId) ?? 1) - 1;\n if (next <= 0) {\n activeByParallelGroup.delete(parallelGroupId);\n } else {\n activeByParallelGroup.set(parallelGroupId, next);\n }\n}\n\nfunction branchSettlementForJoin(\n branch: BranchState,\n failurePolicy: ParallelFailurePolicy,\n): PlainObject | undefined {\n if (failurePolicy === \"all-settled\") {\n return branchSettlementForSummary(branch);\n }\n return branch.status === \"done\" && branch.output !== undefined ? branch.output : undefined;\n}\n\nfunction branchSettlementForSummary(branch: BranchState): PlainObject {\n if (branch.status === \"failed\") {\n return {\n status: \"failed\",\n ...(branch.failure === undefined ? {} : { failure: branch.failure }),\n ...(branch.message === undefined ? {} : { message: branch.message }),\n };\n }\n\n return {\n status: branch.status,\n output: branch.output ?? {},\n ...(branch.message === undefined ? {} : { message: branch.message }),\n };\n}\n\nfunction trackStatusFromTerminalResult(result: RunContinuationResult): string {\n if (result.status === \"failure\" || result.status === \"absoluteFailure\") {\n return \"failed\";\n }\n if (result.status === \"absoluteSuccess\") {\n return \"completed\";\n }\n return result.status;\n}\n\nfunction publicTerminalResult(result: RunContinuationResult): RunContinuationResult {\n if (result.status === \"absoluteSuccess\") {\n return {\n status: \"success\",\n output: result.output,\n ...(result.message === undefined ? {} : { message: result.message }),\n };\n }\n\n if (result.status === \"absoluteFailure\") {\n return {\n status: \"failure\",\n failure: result.failure,\n ...(result.message === undefined ? {} : { message: result.message }),\n };\n }\n\n return result;\n}\n\nasync function cancelPreventableBranches(\n branches: readonly BranchState[],\n runDir: string,\n preservedBranchId?: string,\n): Promise<void> {\n const now = new Date().toISOString();\n await Promise.all(\n branches.map((branch) => {\n if (branch.branchId !== preservedBranchId && !isBranchTerminalStatus(branch.status)) {\n branch.status = \"cancelled\";\n branch.updatedAt = now;\n }\n return persistBranch(runDir, branch);\n }),\n );\n}\n\nfunction resolveSchedulerWorkerCount(\n workers: number | undefined,\n):\n | { readonly ok: true; readonly workers: number }\n | { readonly ok: false; readonly failure: RunContinuationResult } {\n if (workers === undefined) {\n return {\n ok: true,\n workers: Math.max(1, Math.floor(availableParallelism() / 2)),\n };\n }\n\n if (!Number.isFinite(workers) || !Number.isInteger(workers) || workers < 1) {\n return {\n ok: false,\n failure: {\n status: \"failure\",\n failure: {\n code: \"invalid_scheduler_workers\",\n message: \"scheduler.workers must be an integer greater than or equal to 1.\",\n },\n },\n };\n }\n\n return { ok: true, workers };\n}\n\nfunction decorateBranchEvent(event: Event, trackId: string, branch: BranchState): Event {\n if (event.type !== \"step.started\" && event.type !== \"step.completed\") {\n return event;\n }\n\n const stepArtifactPaths =\n event.stepId === undefined || branch.latestStepIndex < 1\n ? undefined\n : resolveStepArtifactPaths({\n runDir: \"\",\n stepId: event.stepId,\n stepIndex: branch.latestStepIndex,\n });\n\n return {\n ...event,\n payload: {\n ...event.payload,\n trackId,\n branchId: branch.branchId,\n ...(branch.requestedBranchId === undefined\n ? {}\n : { requestedBranchId: branch.requestedBranchId }),\n ...(stepArtifactPaths === undefined\n ? {}\n : {\n stepIndex: branch.latestStepIndex,\n stepArtifactId: stepArtifactPaths.artifactStepId,\n stepArtifactPath: stepArtifactPaths.runRelativeStepDir,\n }),\n },\n };\n}\n\nasync function createPersistedTrackRetryPlan(input: {\n readonly nodes: readonly ContinuationResult[];\n readonly runDir: string;\n readonly workflowId: string;\n readonly initialSource: string;\n readonly track?: RunWorkflowTrackRetryOptions;\n}): Promise<\n | {\n readonly status: \"success\";\n readonly branches: readonly BranchState[];\n readonly queue: readonly QueuedBranch[];\n readonly splitOccurred: boolean;\n readonly nextBranchId: number;\n }\n | { readonly status: \"failure\"; readonly failure: RunContinuationResult }\n> {\n let track: TrackStateJson;\n try {\n track = JSON.parse(await readFile(join(input.runDir, \"track.json\"), \"utf8\")) as TrackStateJson;\n } catch (error) {\n return {\n status: \"failure\",\n failure: {\n status: \"failure\",\n failure: {\n code: \"retry_track_metadata_unreadable\",\n message: `Retry target track metadata is missing or unreadable: ${error instanceof Error ? error.message : String(error)}`,\n },\n },\n };\n }\n\n const retryRootParallelNode =\n input.nodes.length === 1 && isParallelNode(input.nodes[0]) ? input.nodes[0] : undefined;\n const retryCandidateNodes = retryRootParallelNode?.nodes ?? input.nodes;\n if (retryRootParallelNode?.postContinuation !== undefined) {\n return { status: \"failure\", failure: unsupportedPostJoinRetryFailure() };\n }\n\n if (!retryCandidateNodes.every(isRunnableBranchCandidate)) {\n return { status: \"failure\", failure: invalidArrayCandidateFailure(input.initialSource) };\n }\n\n const branches = await Promise.all(\n track.branches.map(async (branchId) =>\n branchFromJson(\n JSON.parse(\n await readFile(join(input.runDir, \"branches\", `${branchId}.json`), \"utf8\"),\n ) as BranchStateJson,\n ),\n ),\n );\n if (\n branches.some((branch) => branch.joinContinuation === true || branch.pendingPostJoin === true)\n ) {\n return { status: \"failure\", failure: unsupportedPostJoinRetryFailure() };\n }\n\n const nodesByRequestedBranchId = new Map<string, ContinuationResult>();\n for (const node of retryCandidateNodes) {\n const requestedBranchId = requestedBranchMetadata(node).requestedBranchId;\n if (requestedBranchId !== undefined) {\n nodesByRequestedBranchId.set(requestedBranchId, node);\n }\n }\n\n const selection = selectPersistedBranchesForRetry(branches, input.track);\n if (selection.status === \"failure\") {\n return selection;\n }\n\n const queue: QueuedBranch[] = [];\n for (const [index, branch] of branches.entries()) {\n if (!selection.branchIds.has(branch.branchId)) {\n continue;\n }\n if (retryRootParallelNode !== undefined && branch.branchId === track.rootBranchId) {\n continue;\n }\n\n if (branch.status === \"split\") {\n return {\n status: \"failure\",\n failure: {\n status: \"failure\",\n failure: {\n code: \"retry_track_split_branch_unsupported\",\n message: `Retrying split parent branch ${branch.branchId} is not supported; retry a failed child branch or restart the workflow instead.`,\n },\n },\n };\n }\n\n branch.status = \"queued\";\n branch.failure = undefined;\n branch.wait = undefined;\n branch.terminalKind = undefined;\n branch.message = undefined;\n branch.updatedAt = new Date().toISOString();\n const rootParallelBranchIndex =\n retryRootParallelNode === undefined\n ? undefined\n : branches\n .filter((candidate) => candidate.parentBranchId === track.rootBranchId)\n .findIndex((candidate) => candidate.branchId === branch.branchId);\n const node =\n (branch.requestedBranchId === undefined\n ? undefined\n : nodesByRequestedBranchId.get(branch.requestedBranchId)) ??\n (rootParallelBranchIndex === undefined || rootParallelBranchIndex < 0\n ? retryCandidateNodes[index]\n : retryCandidateNodes[rootParallelBranchIndex]);\n if (node === undefined) {\n return {\n status: \"failure\",\n failure: {\n status: \"failure\",\n failure: {\n code: \"retry_track_branch_not_found\",\n message: `Retry target branch ${branch.branchId} no longer has a matching workflow branch candidate.`,\n },\n },\n };\n }\n queue.push({\n node,\n branch,\n source: branch.splitSource ?? branch.source ?? input.initialSource,\n requireRunnableBranchCandidate: true,\n failurePolicy: \"fail-fast\",\n });\n }\n\n const maxNumericBranchId = branches.reduce((max, branch) => {\n const match = /^branch-(\\d+)$/.exec(branch.branchId);\n return match ? Math.max(max, Number(match[1])) : max;\n }, 0);\n\n return {\n status: \"success\",\n branches,\n queue,\n splitOccurred: track.splitOccurred,\n nextBranchId: maxNumericBranchId + 1,\n };\n}\n\nfunction unsupportedPostJoinRetryFailure(): RunContinuationResult {\n return {\n status: \"failure\",\n failure: {\n code: \"retry_parallel_post_join_unsupported\",\n message:\n \"Retrying parallel tracks with pending or completed parallel .post joins is not yet supported; restart the workflow instead.\",\n },\n };\n}\n\nfunction selectPersistedBranchesForRetry(\n branches: readonly BranchState[],\n track: RunWorkflowTrackRetryOptions | undefined,\n):\n | { readonly status: \"success\"; readonly branchIds: ReadonlySet<string> }\n | { readonly status: \"failure\"; readonly failure: RunContinuationResult } {\n if (track === undefined) {\n return {\n status: \"success\",\n branchIds: new Set(\n branches\n .filter((branch) => [\"failed\", \"waiting\", \"cancelled\"].includes(branch.status))\n .map((branch) => branch.branchId),\n ),\n };\n }\n\n if (track.mode === \"failed-only\") {\n if ((track as { readonly branchId?: unknown }).branchId !== undefined) {\n return {\n status: \"failure\",\n failure: {\n status: \"failure\",\n failure: {\n code: \"retry_track_filter_unsupported\",\n message: \"Track failed-only retry cannot also specify a branchId.\",\n },\n },\n };\n }\n\n return {\n status: \"success\",\n branchIds: new Set(\n branches.filter((branch) => branch.status === \"failed\").map((branch) => branch.branchId),\n ),\n };\n }\n\n if (track.mode !== \"branch\") {\n return {\n status: \"failure\",\n failure: {\n status: \"failure\",\n failure: {\n code: \"retry_track_filter_unsupported\",\n message: `Unsupported track retry mode: ${String((track as { readonly mode?: unknown }).mode)}.`,\n },\n },\n };\n }\n\n if (typeof track.branchId !== \"string\" || track.branchId.length === 0) {\n return {\n status: \"failure\",\n failure: {\n status: \"failure\",\n failure: {\n code: \"retry_track_branch_required\",\n message: \"Track branch retry requires a persisted branchId.\",\n },\n },\n };\n }\n\n const branch = branches.find((candidate) => candidate.branchId === track.branchId);\n if (branch === undefined) {\n return {\n status: \"failure\",\n failure: {\n status: \"failure\",\n failure: {\n code: \"retry_track_branch_not_found\",\n message: `Retry target branch ${track.branchId} was not found in persisted track metadata.`,\n },\n },\n };\n }\n\n return { status: \"success\", branchIds: new Set([branch.branchId]) };\n}\n\nfunction branchFromJson(json: BranchStateJson): BranchState {\n return {\n branchId: json.branchId,\n ...(json.parentBranchId === undefined ? {} : { parentBranchId: json.parentBranchId }),\n ...(json.requestedBranchId === undefined ? {} : { requestedBranchId: json.requestedBranchId }),\n ...(json.joinContinuation === undefined ? {} : { joinContinuation: json.joinContinuation }),\n ...(json.pendingPostJoin === undefined ? {} : { pendingPostJoin: json.pendingPostJoin }),\n workflowId: json.workflowId,\n createdAt: json.createdAt,\n updatedAt: json.updatedAt,\n status: json.status,\n source: json.source,\n ...(json.splitSource === undefined ? {} : { splitSource: json.splitSource }),\n output: json.output,\n ...(json.failure === undefined ? {} : { failure: json.failure }),\n ...(json.wait === undefined ? {} : { wait: json.wait }),\n ...(json.terminalKind === undefined ? {} : { terminalKind: json.terminalKind }),\n ...(json.message === undefined ? {} : { message: json.message }),\n latestStepIndex: json.latestStepIndex,\n ...(json.latestStepId === undefined ? {} : { latestStepId: json.latestStepId }),\n };\n}\n\nasync function persistTrack(\n options: RunRootContinuationArraySchedulerOptions,\n workers: number,\n rootBranchId: string,\n branches: readonly BranchState[],\n status: string,\n splitOccurred: boolean,\n failure?: Failure,\n terminalBranchId?: string,\n terminalKind?: TrackTerminalKind,\n terminalOutput?: PlainObject,\n): Promise<void> {\n const trackState: TrackStateJson = {\n runId: options.runId,\n status,\n workers,\n failurePolicy: \"fail-fast\",\n rootBranchId,\n splitOccurred,\n branches: branches.map((branch) => branch.branchId),\n ...(terminalBranchId === undefined ? {} : { terminalBranchId }),\n ...(terminalKind === undefined ? {} : { terminalKind }),\n ...(terminalOutput === undefined ? {} : { terminalOutput }),\n ...(failure === undefined ? {} : { failure }),\n };\n await writeJson(join(options.runDir, \"track.json\"), trackState);\n}\n\nasync function persistBranch(runDir: string, branch: BranchState): Promise<void> {\n const branchState: BranchStateJson = {\n branchId: branch.branchId,\n ...(branch.parentBranchId === undefined ? {} : { parentBranchId: branch.parentBranchId }),\n ...(branch.requestedBranchId === undefined\n ? {}\n : { requestedBranchId: branch.requestedBranchId }),\n ...(branch.joinContinuation === undefined ? {} : { joinContinuation: branch.joinContinuation }),\n ...(branch.pendingPostJoin === undefined ? {} : { pendingPostJoin: branch.pendingPostJoin }),\n status: branch.status,\n workflowId: branch.workflowId,\n source: branch.source,\n ...(branch.splitSource === undefined ? {} : { splitSource: branch.splitSource }),\n output: branch.output ?? {},\n ...(branch.failure === undefined ? {} : { failure: branch.failure }),\n ...(branch.wait === undefined ? {} : { wait: branch.wait }),\n ...(branch.terminalKind === undefined ? {} : { terminalKind: branch.terminalKind }),\n ...(branch.message === undefined ? {} : { message: branch.message }),\n createdAt: branch.createdAt,\n updatedAt: branch.updatedAt,\n latestStepIndex: branch.latestStepIndex,\n ...(branch.latestStepId === undefined ? {} : { latestStepId: branch.latestStepId }),\n };\n await writeJson(join(runDir, \"branches\", `${branch.branchId}.json`), branchState);\n}\n\nasync function writeJson(path: string, value: unknown): Promise<void> {\n await mkdir(join(path, \"..\"), { recursive: true });\n await writeFile(path, `${JSON.stringify(value, null, 2)}\\n`, \"utf8\");\n}\n","import {\n isParsedTrailStepConfig,\n parseTrailStepConfig,\n} from \"../../agent-targeting/parse-trailstep-config/parse-trailstep-config.js\";\nimport type { TrailStepConfig } from \"../../agent-targeting/targeting.types.js\";\nimport type { RunWorkflowOptions } from \"./run-workflow.types.js\";\n\nexport function parseTrailStepConfigInput(\n value: RunWorkflowOptions[\"trailstepConfig\"],\n): TrailStepConfig {\n if (isParsedTrailStepConfig(value) || isFlattenedTrailStepConfig(value)) {\n return value;\n }\n\n return parseTrailStepConfig(value);\n}\n\nfunction isFlattenedTrailStepConfig(\n value: RunWorkflowOptions[\"trailstepConfig\"],\n): value is TrailStepConfig {\n if (!isPlainRecord(value) || value.version !== 1) {\n return false;\n }\n\n if (!isPlainRecord(value.customProviders) || !isFlattenedAgentMappings(value.agents)) {\n return false;\n }\n\n if (value.settings !== undefined && !isFlattenedSettings(value.settings)) {\n return false;\n }\n\n if (value.workflows === undefined) {\n return true;\n }\n\n if (!isPlainRecord(value.workflows)) {\n return false;\n }\n\n return Object.values(value.workflows).every(\n (workflow) =>\n isPlainRecord(workflow) &&\n (workflow.agents === undefined || isFlattenedAgentMappings(workflow.agents)) &&\n (workflow.settings === undefined || isFlattenedSettings(workflow.settings)),\n );\n}\n\nfunction isFlattenedSettings(value: unknown): value is NonNullable<TrailStepConfig[\"settings\"]> {\n return (\n isPlainRecord(value) &&\n (value.retry === undefined || isPlainRecord(value.retry)) &&\n (value.timeout === undefined || typeof value.timeout === \"number\")\n );\n}\n\nfunction isFlattenedAgentMappings(value: unknown): value is TrailStepConfig[\"agents\"] {\n return (\n isPlainRecord(value) &&\n Object.values(value).every(\n (targets) => Array.isArray(targets) && targets.every(isFlattenedAgentTarget),\n )\n );\n}\n\nfunction isFlattenedAgentTarget(\n value: unknown,\n): value is TrailStepConfig[\"agents\"][string][number] {\n if (!isPlainRecord(value) || typeof value.provider !== \"string\") {\n return false;\n }\n\n if (value.model !== undefined) {\n return typeof value.model === \"string\" && value.model.trim().length > 0;\n }\n\n return true;\n}\n\nfunction isPlainRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":["dirname","args","promptInjectionMode","dirname","result","resolve","workflow","THINKING_LEVELS","optionalNonEmptyString","THINKING_LEVELS","mkdir","readdir","readFile","writeFile","basename","dirname","join","mkdir","readFile","writeFile","dirname","join","join","mkdir","isNodeError","readFile","mkdir","join","writeFile","readFile","isNodeError","state","dirname","readFile","join","readFile","join","isPlainObject","isNodeError","isNodeError","join","readFile","join","dirname","mkdir","writeFile","readFile","readdir","isNodeError","value","basename","workflow","workflow","targets","join","isPlainObject","formatDiagnostics","isPlainObject","mkdir","writeFile","readFile","join","spawn","mkdir","writeFile","dirname","readFile","formatDiagnostics","readFile","definedProcessEnv","args","mkdir","dirname","writeFile","spawnInteractiveProcess","resolve","spawn","terminateChildProcessTree","mkdir","writeFile","join","join","rm","readFile","readFile","spawn","resolve","terminateChildProcessTree","writeFile","isPlainObject","isPlainObject","optionalNonEmptyString","isRecord","writeFile","rm","mkdir","writeFile","readFile","join","relative","isPlainObject","isPlainObject","mkdir","writeFile","workflow","isPlainObject","mkdir","readFile","writeFile","join","isNodeError","isPlainObject","readFile","basename","join","mkdir","readFile","writeFile","join","stat","firstConfiguredPolicy","errorMessage","nextNode","isPlainObject","mkdir","writeFile","artifactPaths","join","readFile","isNodeError","readPlainPayload","promptPhase","withWaitsDoContext","isPlainObject","readPlainPayload","promptPhase","isPlainObject","resumeFailure","readPlainPayload","isPlainObject","readFile","join","resumeFailure","readPlainPayload","readFile","join","isPlainObject","state","globalState","options","basename","basename","mkdir","readFile","writeFile","join","resolve","mkdir","join","branches","readFile","branch","writeFile","workflow","basename","readFile","join"]}
1
+ {"version":3,"sources":["../src/agent-execution/interactive-agent/launch-interactive-agent-target.ts","../src/cli-provider-runtime/process/resolve-cli-command.ts","../src/contracts/failures/failure.ts","../src/agent-execution/custom-provider/render-custom-provider-args.ts","../src/agent-targeting/parse-trailstep-config/parse-utils.ts","../src/providers/provider-manifest.ts","../src/agent-targeting/parse-trailstep-config/expand-agent-refs.ts","../src/agent-targeting/parse-trailstep-config/parse-agent-targets.ts","../src/agent-targeting/parse-trailstep-config/parse-agent-mappings.ts","../src/agent-targeting/parse-trailstep-config/parse-custom-providers.ts","../src/agent-targeting/parse-trailstep-config/parse-settings.ts","../src/runtime/storage-lifecycle/storage-lifecycle.ts","../src/runtime/artifacts/run-storage.ts","../src/runtime/runs/run-summaries.ts","../src/runtime/retry/latest-unresolved-failure.ts","../src/runtime/runs/track-summary.ts","../src/agent-targeting/parse-trailstep-config/parse-storage-config.ts","../src/agent-targeting/parse-trailstep-config/parse-workflow-agent-mappings.ts","../src/agent-targeting/parse-trailstep-config/validate-provider-references.ts","../src/agent-targeting/parse-trailstep-config/parse-trailstep-config.ts","../src/agent-targeting/resolve-agent-targets/resolve-agent-targets.ts","../src/runtime/run-context/run-context-storage.ts","../src/authoring/document/document.ts","../src/authoring/global-state/global-state.ts","../src/runtime/events/create-run-event.ts","../src/authoring/notify/notify.ts","../src/authoring/prompt-composition/prompt-composition.ts","../src/authoring/prompt-template/prompt-template.ts","../src/authoring/shape/json-schema.ts","../src/authoring/state/state.ts","../src/authoring/step/step-node.ts","../src/runtime/sub-prompts/run-sub-prompt.ts","../src/agent-execution/adapter-agent/run-adapter-agent-step/run-adapter-agent-step.ts","../src/agent-execution/dispatch-agent-step/dispatch-agent-step.ts","../src/runtime/artifacts/step-artifacts.ts","../src/agent-execution/interactive-agent/run-interactive-agent-command.ts","../src/runtime/interactive-session/interactive-session-protocol.ts","../src/agent-execution/working-agent/run-working-agent-command.ts","../src/agent-execution/working-agent/artifacts/resolve-step-agent-files.ts","../src/agent-execution/working-agent/prompts/build-working-agent-prompt.ts","../src/agent-execution/working-agent/targets/run-working-agent-target-attempt.ts","../src/agent-execution/working-agent/output/read-working-agent-output.ts","../src/agent-execution/working-agent/targets/custom-provider/build-working-agent-args.ts","../src/agent-execution/working-agent/targets/custom-provider/spawn-working-agent-process.ts","../src/agent-execution/working-agent/targets/custom-provider/run-custom-working-provider.ts","../src/agent-execution/working-agent/targets/manifest-provider/run-manifest-working-provider.ts","../src/cli-provider-runtime/envelopes/envelope.ts","../src/agent-execution/working-agent/prompts/build-two-phase-prompts.ts","../src/agent-execution/working-agent/targets/target-failures.ts","../src/runtime/sub-prompts/sub-prompt-artifacts.ts","../src/runtime/failures/failure-like.ts","../src/runtime/sub-prompts/sub-prompt-failures.ts","../src/runtime/sub-prompts/sub-prompt-fingerprint.ts","../src/runtime/sub-prompts/sub-prompt-replay.ts","../src/authoring/step/sub-prompt.ts","../src/authoring/workflow/define-workflow.ts","../src/authoring/workflow/workflow.ts","../src/deprecations/deprecation-manifest.ts","../src/runtime/cancellation/cancellation.ts","../src/runtime/retry/retry-policy.ts","../src/runtime/run-workflow/run-workflow.ts","../src/runtime/continuation/run-continuation/run-continuation.ts","../src/runtime/failures/step-execution-failure.ts","../src/runtime/run-context/with-step-context.ts","../src/runtime/run-workflow/cwd.ts","../src/runtime/timeout/timeout-policy.ts","../src/runtime/interactive-session/default-interactive-output-shape.ts","../src/runtime/continuation/resolve-step-output-schema/resolve-step-output-schema.ts","../src/runtime/failures/workflow-failure.ts","../src/runtime/resume/replay-completed-steps/replay-completed-steps.ts","../src/runtime/resume/reattach-in-progress-step/reattach-in-progress-step.ts","../src/runtime/resume/replay-to-failed-step/replay-to-failed-step.ts","../src/runtime/resume/replay-to-waiting-step/replay-to-waiting-step.ts","../src/runtime/retry/replay-to-retry-failure.ts","../src/runtime/run-context/create-run-context.ts","../src/runtime/run-workflow/initialize-run.ts","../src/runtime/run-workflow/root-continuation-array-scheduler.ts","../src/runtime/run-workflow/trailstep-config-input.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nimport type {\n TrailStepAgentTarget,\n TrailStepConfig,\n} from \"../../agent-targeting/targeting.types.js\";\nimport type { ManagedSessionPromptInjectionMode } from \"../../cli-provider-runtime/catalog/provider-adapter.types.js\";\nimport { resolveCliCommandForSpawn } from \"../../cli-provider-runtime/process/resolve-cli-command.js\";\nimport { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type {\n InteractiveProcessResult,\n InteractiveProcessRunner,\n} from \"../../runtime/run-workflow/run-workflow.types.js\";\nimport { renderCustomProviderArgs } from \"../custom-provider/render-custom-provider-args.js\";\n\nexport interface LaunchInteractiveAgentTargetOptions {\n readonly config: TrailStepConfig;\n readonly target: TrailStepAgentTarget;\n readonly prompt: string;\n readonly promptFile: string;\n readonly cwd: string;\n readonly runner?: InteractiveProcessRunner;\n readonly signal?: AbortSignal;\n}\n\nexport type LaunchInteractiveAgentTargetResult = InteractiveProcessResult & {\n readonly promptInjectionMode: ManagedSessionPromptInjectionMode;\n};\n\nexport async function launchInteractiveAgentTarget(\n options: LaunchInteractiveAgentTargetOptions,\n): Promise<LaunchInteractiveAgentTargetResult> {\n const manifestProvider = options.config.providers?.[options.target.provider];\n if (manifestProvider !== undefined && manifestProvider.source.type !== \"legacy-custom-provider\") {\n const interactive = manifestProvider.manifest.interactive;\n if (!interactive.supported || interactive.command === undefined) {\n throw new TrailStepFailureError({\n code: \"agent_provider_interactive_unsupported\",\n message: `Provider '${options.target.provider}' does not support interactive launch.`,\n details: { provider: options.target.provider },\n });\n }\n\n const command = interactive.command;\n const args = renderCustomProviderArgs({\n argv: options.target.args ?? [\"{{prompt}}\"],\n values: {\n prompt: options.prompt,\n promptFile: options.promptFile,\n ...(options.target.model === undefined ? {} : { model: options.target.model }),\n ...(options.target.thinking === undefined ? {} : { thinking: options.target.thinking }),\n },\n errorCode: \"interactive_command_invalid\",\n commandDescription: \"Manifest interactive provider command\",\n });\n const promptInjectionMode: ManagedSessionPromptInjectionMode = args.includes(options.promptFile)\n ? \"visible-prompt-file\"\n : \"visible-inline-prompt\";\n\n if (args.includes(options.promptFile)) {\n await mkdir(dirname(options.promptFile), { recursive: true });\n await writeFile(options.promptFile, options.prompt, \"utf8\");\n }\n\n let result: InteractiveProcessResult;\n try {\n result = await (options.runner ?? spawnInteractiveProcess)({\n command,\n args,\n cwd: options.cwd,\n shell: false,\n stdio: \"inherit\",\n env: definedProcessEnv(),\n signal: options.signal,\n });\n } catch (error) {\n throw mapInteractiveProviderLaunchError({\n error,\n provider: options.target.provider,\n command,\n });\n }\n\n return { ...result, promptInjectionMode };\n }\n\n const customProvider = options.config.customProviders[options.target.provider];\n if (!customProvider) {\n throw new TrailStepFailureError({\n code: \"agent_provider_unavailable\",\n message: `Interactive agent target '${options.target.provider}' does not reference a configured custom provider.`,\n details: { provider: options.target.provider },\n });\n }\n\n if (!customProvider.interactiveArgs) {\n throw new TrailStepFailureError({\n code: \"agent_provider_interactive_unsupported\",\n message: `Custom provider '${options.target.provider}' cannot run interactive sessions because customProviders.${options.target.provider}.interactiveArgs is not declared.`,\n details: { provider: options.target.provider },\n });\n }\n\n const args = renderCustomProviderArgs({\n argv: options.target.args ?? customProvider.interactiveArgs,\n values: {\n prompt: options.prompt,\n promptFile: options.promptFile,\n ...(options.target.model === undefined ? {} : { model: options.target.model }),\n ...(options.target.thinking === undefined ? {} : { thinking: options.target.thinking }),\n },\n errorCode: \"interactive_command_invalid\",\n commandDescription: \"Interactive agent command\",\n });\n const promptInjectionMode: ManagedSessionPromptInjectionMode = args.includes(options.promptFile)\n ? \"visible-prompt-file\"\n : \"visible-inline-prompt\";\n\n if (args.includes(options.promptFile)) {\n await mkdir(dirname(options.promptFile), { recursive: true });\n await writeFile(options.promptFile, options.prompt, \"utf8\");\n }\n\n const result = await (options.runner ?? spawnInteractiveProcess)({\n command: customProvider.binary,\n args,\n cwd: options.cwd,\n shell: false,\n stdio: \"inherit\",\n env: { ...definedProcessEnv(), ...customProvider.env },\n signal: options.signal,\n });\n\n return { ...result, promptInjectionMode };\n}\n\nfunction mapInteractiveProviderLaunchError(options: {\n readonly error: unknown;\n readonly provider: string;\n readonly command: string;\n}): unknown {\n if (options.error instanceof TrailStepFailureError) {\n return options.error;\n }\n\n const message = errorMessage(options.error);\n if (isSpawnEnoentError(options.error, options.command, message)) {\n return new TrailStepFailureError({\n code: \"agent_provider_spawn_error\",\n message: `Provider '${options.provider}' could not be opened because the '${options.command}' CLI was not found on PATH. Install the CLI or configure a different TrailStep agent target.`,\n details: { provider: options.provider, command: options.command, cause: message },\n });\n }\n\n return options.error;\n}\n\nfunction isSpawnEnoentError(error: unknown, command: string, message: string): boolean {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return true;\n }\n\n return new RegExp(\n `(?:spawn|ENOENT).*${escapeRegExp(command)}|${escapeRegExp(command)}.*ENOENT`,\n \"iu\",\n ).test(message);\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/gu, \"\\\\$&\");\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nfunction definedProcessEnv(): Record<string, string> {\n return Object.fromEntries(\n Object.entries(process.env).filter(\n (entry): entry is [string, string] => entry[1] !== undefined,\n ),\n );\n}\n\nconst spawnInteractiveProcess: InteractiveProcessRunner = async ({\n command,\n args,\n cwd,\n env,\n signal,\n}) => {\n const executable = await resolveCliCommandForSpawn({ command, args, env });\n\n return await new Promise((resolve, reject) => {\n const child = spawn(executable.command, executable.args, {\n cwd,\n env,\n signal,\n detached: process.platform !== \"win32\",\n shell: false,\n stdio: \"inherit\",\n });\n\n signal?.addEventListener(\"abort\", () => terminateChildProcessTree(child), { once: true });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => resolve({ exitCode: code ?? 1 }));\n });\n};\n\nfunction terminateChildProcessTree(child: ReturnType<typeof spawn>): void {\n if (!child.pid) {\n return;\n }\n\n if (process.platform === \"win32\") {\n spawn(\"taskkill\", [\"/PID\", String(child.pid), \"/T\", \"/F\"], { stdio: \"ignore\" }).on(\n \"error\",\n () => {\n child.kill();\n },\n );\n return;\n }\n\n try {\n process.kill(-child.pid, \"SIGTERM\");\n } catch {\n child.kill();\n }\n}\n","import { constants } from \"node:fs\";\nimport { access, readFile } from \"node:fs/promises\";\nimport { dirname, extname, join } from \"node:path\";\n\nconst WINDOWS_EXECUTABLE_EXTENSIONS = [\".cmd\", \".exe\", \".bat\", \"\"] as const;\n\nexport interface CliCommandSpawnRequest {\n readonly command: string;\n readonly args: readonly string[];\n readonly env?: Readonly<Record<string, string | undefined>>;\n}\n\nexport interface ResolvedCliCommandSpawnRequest {\n readonly command: string;\n readonly args: readonly string[];\n}\n\nexport interface ResolveCliCommandForSpawnOptions {\n readonly platform?: NodeJS.Platform;\n readonly execPath?: string;\n}\n\n/**\n * Built-in provider CLIs are commonly npm-installed. On Windows, npm exposes\n * those CLIs as `.cmd` shims, which cannot be launched through Node's\n * `spawn(..., { shell: false })` by their bare command name. Resolve npm shims\n * to their underlying Node entrypoint when possible so provider prompts remain\n * argv values instead of being reinterpreted by a shell.\n */\nexport async function resolveCliCommandForSpawn(\n request: CliCommandSpawnRequest,\n options: ResolveCliCommandForSpawnOptions = {},\n): Promise<ResolvedCliCommandSpawnRequest> {\n if ((options.platform ?? process.platform) !== \"win32\") {\n return request;\n }\n\n const commandPath = await findWindowsCommandPath(request.command, request.env ?? process.env);\n if (!commandPath) {\n return request;\n }\n\n if (isWindowsCommandShim(commandPath)) {\n const nodeScript = await readNpmCmdShimEntrypoint(commandPath);\n if (nodeScript) {\n return {\n command: options.execPath ?? process.execPath,\n args: [nodeScript, ...request.args],\n };\n }\n\n return {\n command: \"cmd.exe\",\n args: [\"/d\", \"/s\", \"/c\", commandPath, ...request.args],\n };\n }\n\n return { command: commandPath, args: request.args };\n}\n\nasync function findWindowsCommandPath(\n command: string,\n env: Readonly<Record<string, string | undefined>>,\n): Promise<string | undefined> {\n const commandCandidates = windowsCommandCandidates(command);\n if (hasPathSeparator(command)) {\n return await firstExistingPath(commandCandidates);\n }\n\n const pathValue = readCaseInsensitiveEnv(env, \"PATH\");\n if (!pathValue) {\n return await firstExistingPath(commandCandidates);\n }\n\n for (const directory of pathValue.split(windowsPathDelimiter()).filter(Boolean)) {\n const found = await firstExistingPath(\n commandCandidates.map((candidate) => join(directory, candidate)),\n );\n if (found) {\n return found;\n }\n }\n\n return undefined;\n}\n\nfunction windowsCommandCandidates(command: string): readonly string[] {\n if (extname(command)) {\n return [command];\n }\n\n return WINDOWS_EXECUTABLE_EXTENSIONS.map((extension) => `${command}${extension}`);\n}\n\nasync function firstExistingPath(paths: readonly string[]): Promise<string | undefined> {\n for (const path of paths) {\n try {\n await access(path, constants.X_OK);\n return path;\n } catch {\n try {\n await access(path, constants.F_OK);\n return path;\n } catch {\n // Keep looking.\n }\n }\n }\n\n return undefined;\n}\n\nasync function readNpmCmdShimEntrypoint(commandPath: string): Promise<string | undefined> {\n let shim: string;\n try {\n shim = await readFile(commandPath, \"utf8\");\n } catch {\n return undefined;\n }\n\n const match = shim.match(/\"%dp0%\\\\?([^\"]+?\\.js)\"\\s+%\\*/i);\n if (!match?.[1]) {\n return undefined;\n }\n\n return join(dirname(commandPath), match[1].replace(/\\\\/g, \"/\"));\n}\n\nfunction isWindowsCommandShim(path: string): boolean {\n const extension = extname(path).toLowerCase();\n return extension === \".cmd\" || extension === \".bat\";\n}\n\nfunction hasPathSeparator(command: string): boolean {\n return command.includes(\"/\") || command.includes(\"\\\\\");\n}\n\nfunction readCaseInsensitiveEnv(\n env: Readonly<Record<string, string | undefined>>,\n key: string,\n): string | undefined {\n return Object.entries(env).find(([name]) => name.toLowerCase() === key.toLowerCase())?.[1];\n}\n\nfunction windowsPathDelimiter(): string {\n return \";\";\n}\n","export interface Failure {\n readonly code: string;\n readonly message: string;\n readonly details?: unknown;\n}\n\nexport class TrailStepFailureError extends Error {\n readonly failure: Failure;\n\n constructor(failure: Failure) {\n super(failure.message);\n this.name = \"TrailStepFailureError\";\n this.failure = failure;\n }\n}\n\nexport function validationFailure(message: string, details?: unknown): Failure {\n return {\n code: \"validation_failed\",\n message,\n ...(details === undefined ? {} : { details }),\n };\n}\n","import type { WorkflowAgentThinking } from \"../../contracts/agents/agent-role.types.js\";\nimport { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\n\ntype PlaceholderName = \"prompt\" | \"promptFile\" | \"outputFile\" | \"model\" | \"thinking\" | \"sessionId\";\ntype ConditionalName = \"model\" | \"thinking\";\n\ntype PlaceholderValues = Readonly<Partial<Record<PlaceholderName, string>>>;\n\nconst PLACEHOLDER_NAMES = new Set<PlaceholderName>([\n \"prompt\",\n \"promptFile\",\n \"outputFile\",\n \"model\",\n \"thinking\",\n \"sessionId\",\n]);\nconst CONDITIONAL_NAMES = new Set<ConditionalName>([\"model\", \"thinking\"]);\nconst TEMPLATE_TOKEN_PATTERN = /^{{([#/]?)([A-Za-z][A-Za-z0-9]*)}}$/;\n\nexport function renderCustomProviderArgs(options: {\n readonly argv: readonly string[];\n readonly values: {\n readonly prompt?: string;\n readonly promptFile?: string;\n readonly outputFile?: string;\n readonly model?: string;\n readonly thinking?: WorkflowAgentThinking;\n readonly sessionId?: string;\n };\n readonly errorCode: string;\n readonly commandDescription: string;\n}): string[] {\n const values: PlaceholderValues = {\n ...(options.values.prompt === undefined ? {} : { prompt: options.values.prompt }),\n ...(options.values.promptFile === undefined ? {} : { promptFile: options.values.promptFile }),\n ...(options.values.outputFile === undefined ? {} : { outputFile: options.values.outputFile }),\n ...(optionalNonEmptyString(options.values.model) === undefined\n ? {}\n : { model: optionalNonEmptyString(options.values.model) }),\n ...(options.values.thinking === undefined ? {} : { thinking: options.values.thinking }),\n ...(options.values.sessionId === undefined ? {} : { sessionId: options.values.sessionId }),\n };\n\n return renderRange({\n argv: options.argv,\n values,\n errorCode: options.errorCode,\n commandDescription: options.commandDescription,\n });\n}\n\nfunction renderRange(options: {\n readonly argv: readonly string[];\n readonly values: PlaceholderValues;\n readonly errorCode: string;\n readonly commandDescription: string;\n}): string[] {\n const rendered: string[] = [];\n\n for (let index = 0; index < options.argv.length; index += 1) {\n const arg = options.argv[index] ?? \"\";\n const token = parseTemplateToken(arg);\n\n if (token?.kind === \"open\") {\n const closeIndex = findConditionalClose({\n argv: options.argv,\n openIndex: index,\n condition: token.name,\n errorCode: options.errorCode,\n commandDescription: options.commandDescription,\n });\n if (options.values[token.name] !== undefined) {\n rendered.push(\n ...renderRange({\n ...options,\n argv: options.argv.slice(index + 1, closeIndex),\n }),\n );\n }\n index = closeIndex;\n continue;\n }\n\n if (token?.kind === \"close\") {\n throw templateError({\n code: options.errorCode,\n message: `${options.commandDescription} template has unexpected ${closingToken(token.name)} without a matching ${openingToken(token.name)}.`,\n });\n }\n\n if (token?.kind === \"placeholder\") {\n rendered.push(renderPlaceholder({ ...options, name: token.name }));\n continue;\n }\n\n if (TEMPLATE_TOKEN_PATTERN.test(arg)) {\n throw templateError({\n code: options.errorCode,\n message: `${options.commandDescription} template token ${arg} is not supported.`,\n details: { arg },\n });\n }\n\n if (arg.includes(\"{{\") || arg.includes(\"}}\")) {\n rendered.push(renderInterpolatedArg({ ...options, arg }));\n continue;\n }\n\n rendered.push(arg);\n }\n\n return rendered;\n}\n\nfunction parseTemplateToken(\n arg: string,\n):\n | { readonly kind: \"placeholder\"; readonly name: PlaceholderName }\n | { readonly kind: \"open\"; readonly name: ConditionalName }\n | { readonly kind: \"close\"; readonly name: ConditionalName }\n | undefined {\n const match = TEMPLATE_TOKEN_PATTERN.exec(arg);\n if (!match) {\n return undefined;\n }\n\n const prefix = match[1] ?? \"\";\n const name = match[2] ?? \"\";\n\n if (prefix === \"\") {\n if (PLACEHOLDER_NAMES.has(name as PlaceholderName)) {\n return { kind: \"placeholder\", name: name as PlaceholderName };\n }\n return undefined;\n }\n\n if (CONDITIONAL_NAMES.has(name as ConditionalName)) {\n return {\n kind: prefix === \"#\" ? \"open\" : \"close\",\n name: name as ConditionalName,\n };\n }\n\n return undefined;\n}\n\nfunction renderInterpolatedArg(options: {\n readonly arg: string;\n readonly values: PlaceholderValues;\n readonly errorCode: string;\n readonly commandDescription: string;\n}): string {\n let foundTemplateToken = false;\n const rendered = options.arg.replaceAll(\n /\\{\\{([#/]?)([A-Za-z][A-Za-z0-9]*)\\}\\}/gu,\n (match: string, prefix: string, name: string) => {\n foundTemplateToken = true;\n\n if (prefix !== \"\") {\n throw templateError({\n code: options.errorCode,\n message: `${options.commandDescription} conditional blocks must be whole argv values.`,\n details: { arg: options.arg, token: match },\n });\n }\n\n if (!PLACEHOLDER_NAMES.has(name as PlaceholderName)) {\n throw templateError({\n code: options.errorCode,\n message: `${options.commandDescription} template token ${match} is not supported.`,\n details: { arg: options.arg },\n });\n }\n\n return renderPlaceholder({ ...options, name: name as PlaceholderName });\n },\n );\n\n if (!foundTemplateToken || rendered.includes(\"{{\") || rendered.includes(\"}}\")) {\n throw templateError({\n code: options.errorCode,\n message: `${options.commandDescription} has malformed template syntax.`,\n details: { arg: options.arg },\n });\n }\n\n return rendered;\n}\n\nfunction findConditionalClose(options: {\n readonly argv: readonly string[];\n readonly openIndex: number;\n readonly condition: ConditionalName;\n readonly errorCode: string;\n readonly commandDescription: string;\n}): number {\n let depth = 1;\n\n for (let index = options.openIndex + 1; index < options.argv.length; index += 1) {\n const token = parseTemplateToken(options.argv[index] ?? \"\");\n if (token?.name !== options.condition) {\n continue;\n }\n\n if (token.kind === \"open\") {\n depth += 1;\n continue;\n }\n\n if (token.kind === \"close\") {\n depth -= 1;\n if (depth === 0) {\n return index;\n }\n }\n }\n\n throw templateError({\n code: options.errorCode,\n message: `${options.commandDescription} template is missing ${closingToken(options.condition)} for ${openingToken(options.condition)}.`,\n });\n}\n\nfunction renderPlaceholder(options: {\n readonly name: PlaceholderName;\n readonly values: PlaceholderValues;\n readonly errorCode: string;\n readonly commandDescription: string;\n}): string {\n const value = options.values[options.name];\n if (value !== undefined) {\n return value;\n }\n\n if (options.name === \"model\" || options.name === \"thinking\") {\n throw templateError({\n code: options.errorCode,\n message: `${options.commandDescription} placeholder ${placeholderToken(options.name)} must be guarded with ${openingToken(options.name)} ... ${closingToken(options.name)} when no ${options.name} override is set.`,\n details: { placeholder: placeholderToken(options.name) },\n });\n }\n\n throw templateError({\n code: options.errorCode,\n message: `${options.commandDescription} placeholder ${placeholderToken(options.name)} is not available in this command template.`,\n details: { placeholder: placeholderToken(options.name) },\n });\n}\n\nfunction templateError(options: {\n readonly code: string;\n readonly message: string;\n readonly details?: unknown;\n}): TrailStepFailureError {\n return new TrailStepFailureError({\n code: options.code,\n message: options.message,\n ...(options.details === undefined ? {} : { details: options.details }),\n });\n}\n\nfunction placeholderToken(name: PlaceholderName): string {\n return `{{${name}}}`;\n}\n\nfunction openingToken(name: ConditionalName): string {\n return `{{#${name}}}`;\n}\n\nfunction closingToken(name: ConditionalName): string {\n return `{{/${name}}}`;\n}\n\nfunction optionalNonEmptyString(value: string | undefined): string | undefined {\n if (value === undefined || value.trim().length === 0) {\n return undefined;\n }\n\n return value;\n}\n","import { TrailStepFailureError, validationFailure } from \"../../contracts/failures/failure.js\";\n\nexport function throwValidationFailure(diagnostics: readonly string[]): never {\n throw new TrailStepFailureError(\n validationFailure(\"Invalid .trailstep/config.json.\", { diagnostics }),\n );\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function parseOptionalStringArray(\n path: string,\n value: unknown,\n diagnostics: string[],\n): readonly string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n diagnostics.push(`${path} must be an array of strings when present.`);\n return undefined;\n }\n\n return value;\n}\n\nexport function parseOptionalStringRecord(\n path: string,\n value: unknown,\n diagnostics: string[],\n): Readonly<Record<string, string>> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object when present.`);\n return undefined;\n }\n\n const env: Record<string, string> = {};\n for (const [key, envValue] of Object.entries(value)) {\n if (typeof envValue !== \"string\") {\n diagnostics.push(`${path}.${key} must be a string.`);\n } else {\n env[key] = envValue;\n }\n }\n\n return env;\n}\n","import {\n isRecord,\n parseOptionalStringArray,\n parseOptionalStringRecord,\n throwValidationFailure,\n} from \"../agent-targeting/parse-trailstep-config/parse-utils.js\";\nimport type { WorkflowAgentThinking } from \"../contracts/agents/agent-role.types.js\";\n\nexport interface TrailStepProviderRegistration {\n readonly source: TrailStepProviderSource;\n readonly manifest: TrailStepProviderManifest;\n}\n\nexport type TrailStepProviderSource =\n | { readonly type: \"local-manifest\"; readonly path: string }\n | { readonly type: \"legacy-custom-provider\" }\n | {\n readonly type: \"npm\" | \"github\" | \"local-package\";\n readonly packageName: string;\n readonly spec: string;\n readonly resolvedVersion?: string;\n };\n\n/**\n * ESM package contract for provider packages: export `trailstepProvider` from\n * the package root. Keep hook functions outside `manifest` so the manifest is\n * serializable and safe to persist.\n */\nexport interface TrailStepProviderPackageDefinition {\n readonly manifest: TrailStepProviderManifest;\n readonly hooks?: Record<string, unknown>;\n}\n\nexport interface TrailStepProviderManifest {\n readonly schemaVersion: 1;\n readonly id: string;\n readonly displayName: string;\n readonly working: TrailStepProviderWorkingManifest;\n readonly interactive: TrailStepProviderInteractiveManifest;\n readonly model: TrailStepProviderModelManifest;\n readonly thinking: TrailStepProviderThinkingManifest;\n readonly env?: TrailStepProviderEnvironmentManifest;\n readonly hooks?: Record<string, unknown>;\n}\n\nexport type TrailStepProviderPromptFileReferenceStyle = \"at-prefixed-argument\";\n\nexport interface TrailStepProviderPromptManifest {\n readonly kind: \"prompt-file\";\n readonly reference?: TrailStepProviderPromptFileReferenceStyle;\n}\n\nexport type TrailStepProviderOutputStyle =\n | \"provider-output-file\"\n | \"stdout-json-envelope\"\n | \"stdout-jsonl-transcript\";\n\nexport interface TrailStepProviderOutputParsingManifest {\n readonly resultField?: string;\n}\n\nexport interface TrailStepProviderOutputManifest {\n readonly style: TrailStepProviderOutputStyle;\n readonly parsing?: TrailStepProviderOutputParsingManifest;\n}\n\nexport interface TrailStepProviderWorkingManifest {\n readonly supported: boolean;\n readonly command?: string;\n readonly args?: readonly string[];\n readonly prompt?: TrailStepProviderPromptManifest;\n readonly output?: TrailStepProviderOutputManifest;\n readonly followUp?: TrailStepProviderFollowUpManifest;\n}\n\nexport interface TrailStepProviderFollowUpManifest {\n readonly supported: boolean;\n readonly reason?: string;\n readonly sessionIdFlag?: string;\n readonly resumeArgs?: readonly string[];\n}\n\nexport interface TrailStepProviderInteractiveManifest {\n readonly supported: boolean;\n readonly reason?: string;\n readonly command?: string;\n readonly args?: readonly string[];\n readonly requiresSystemPromptFile?: boolean;\n readonly systemPromptFileFlag?: string;\n readonly modelFlag?: string;\n readonly permissionBypassFlag?: string;\n}\n\nexport interface TrailStepProviderEnvironmentManifest {\n readonly required?: readonly string[];\n readonly optional?: readonly string[];\n}\n\nexport interface TrailStepProviderModelDiscoveryManifest {\n readonly command: string;\n readonly args: readonly string[];\n readonly outputParser: string;\n}\n\nexport interface TrailStepProviderModelManifest {\n readonly supported: boolean;\n readonly reason?: string;\n readonly flag?: string;\n readonly discovery?: TrailStepProviderModelDiscoveryManifest;\n}\n\nexport interface TrailStepProviderThinkingManifest {\n readonly supported: boolean;\n readonly reason?: string;\n readonly flag?: string;\n readonly levels?: readonly WorkflowAgentThinking[];\n}\n\nconst THINKING_LEVELS = new Set<WorkflowAgentThinking>([\"low\", \"medium\", \"high\", \"xhigh\", \"max\"]);\n\nexport function parseTrailStepProviderManifest(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderManifest | undefined {\n return parseManifest(path, value, diagnostics);\n}\n\nexport function parseTrailStepProviderRegistrations(\n path: string,\n value: unknown,\n diagnostics: string[],\n): Record<string, TrailStepProviderRegistration> {\n const start = diagnostics.length;\n const providers: Record<string, TrailStepProviderRegistration> = {};\n\n if (value === undefined) {\n return providers;\n }\n\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object when present.`);\n throwIfNewDiagnostics(diagnostics, start);\n return providers;\n }\n\n for (const [name, registration] of Object.entries(value)) {\n const parsed = parseProviderRegistration(`${path}.${name}`, registration, diagnostics);\n if (parsed !== undefined) {\n providers[name] = parsed;\n }\n }\n\n throwIfNewDiagnostics(diagnostics, start);\n return providers;\n}\n\nfunction parseProviderRegistration(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderRegistration | undefined {\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object.`);\n return undefined;\n }\n\n const source = parseSource(`${path}.source`, value.source, diagnostics);\n const manifest =\n source?.type === \"legacy-custom-provider\"\n ? parseLegacyCustomProviderManifest(`${path}.manifest`, value.manifest, diagnostics)\n : parseManifest(`${path}.manifest`, value.manifest, diagnostics);\n\n if (source === undefined || manifest === undefined) {\n return undefined;\n }\n\n return { source, manifest };\n}\n\nfunction parseSource(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderRegistration[\"source\"] | undefined {\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object.`);\n return undefined;\n }\n\n if (value.type === \"local-manifest\") {\n if (typeof value.path !== \"string\" || value.path.length === 0) {\n diagnostics.push(`${path}.path must be a non-empty string.`);\n return undefined;\n }\n return { type: \"local-manifest\", path: value.path };\n }\n\n if (value.type === \"legacy-custom-provider\") {\n return { type: \"legacy-custom-provider\" };\n }\n\n if (value.type === \"npm\" || value.type === \"github\" || value.type === \"local-package\") {\n if (typeof value.packageName !== \"string\" || value.packageName.length === 0) {\n diagnostics.push(`${path}.packageName must be a non-empty string.`);\n }\n if (typeof value.spec !== \"string\" || value.spec.length === 0) {\n diagnostics.push(`${path}.spec must be a non-empty string.`);\n }\n if (\n typeof value.packageName !== \"string\" ||\n value.packageName.length === 0 ||\n typeof value.spec !== \"string\" ||\n value.spec.length === 0\n ) {\n return undefined;\n }\n return {\n type: value.type,\n packageName: value.packageName,\n spec: value.spec,\n ...(typeof value.resolvedVersion === \"string\" && value.resolvedVersion.length > 0\n ? { resolvedVersion: value.resolvedVersion }\n : {}),\n };\n }\n\n diagnostics.push(\n `${path}.type must be local-manifest, legacy-custom-provider, npm, github, or local-package.`,\n );\n return undefined;\n}\n\nfunction parseLegacyCustomProviderManifest(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderManifest | undefined {\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object.`);\n return undefined;\n }\n\n if (value.schemaVersion !== 1) {\n diagnostics.push(`${path}.schemaVersion must be 1.`);\n }\n const id = parseRequiredString(`${path}.id`, value.id, diagnostics);\n const displayName = parseRequiredString(`${path}.displayName`, value.displayName, diagnostics);\n const working = parseWorking(`${path}.working`, value.working, diagnostics);\n const interactive = parseLegacyInteractive(`${path}.interactive`, value.interactive, diagnostics);\n const model = parseLegacyModel(`${path}.model`, value.model, diagnostics);\n const thinking = parseLegacyThinking(`${path}.thinking`, value.thinking, diagnostics);\n const env = parseOptionalStringRecord(`${path}.env`, value.env, diagnostics);\n\n if (\n value.schemaVersion !== 1 ||\n id === undefined ||\n displayName === undefined ||\n working === undefined ||\n interactive === undefined ||\n model === undefined ||\n thinking === undefined\n ) {\n return undefined;\n }\n\n return {\n schemaVersion: 1,\n id,\n displayName,\n working,\n interactive,\n model,\n thinking,\n ...(typeof value.cwd === \"string\" ? { cwd: value.cwd } : {}),\n ...(env === undefined ? {} : { env }),\n } as TrailStepProviderManifest;\n}\n\nfunction parseManifest(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderManifest | undefined {\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object.`);\n return undefined;\n }\n\n if (value.schemaVersion !== 1) {\n diagnostics.push(`${path}.schemaVersion must be 1.`);\n }\n const id = parseRequiredString(`${path}.id`, value.id, diagnostics);\n const displayName = parseRequiredString(`${path}.displayName`, value.displayName, diagnostics);\n const working = parseWorking(`${path}.working`, value.working, diagnostics);\n const interactive = parseInteractive(`${path}.interactive`, value.interactive, diagnostics);\n const model = parseModel(`${path}.model`, value.model, diagnostics);\n const thinking = parseThinking(`${path}.thinking`, value.thinking, diagnostics);\n const env = parseEnvironment(`${path}.env`, value.env, diagnostics);\n\n if (\n value.schemaVersion !== 1 ||\n id === undefined ||\n displayName === undefined ||\n working === undefined ||\n interactive === undefined ||\n model === undefined ||\n thinking === undefined ||\n env === null\n ) {\n return undefined;\n }\n\n return {\n schemaVersion: 1,\n id,\n displayName,\n working,\n interactive,\n model,\n thinking,\n ...(env === undefined ? {} : { env }),\n ...(isRecord(value.hooks) ? { hooks: value.hooks } : {}),\n };\n}\n\nfunction parseWorking(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderWorkingManifest | undefined {\n if (!isRecord(value) || typeof value.supported !== \"boolean\") {\n diagnostics.push(`${path} must be an object with a boolean supported field.`);\n return undefined;\n }\n\n if (!value.supported) {\n return { supported: false };\n }\n\n const command = parseRequiredString(`${path}.command`, value.command, diagnostics);\n const args = parseOptionalStringArray(`${path}.args`, value.args, diagnostics);\n const prompt = parsePrompt(`${path}.prompt`, value.prompt, diagnostics);\n const output = parseOutput(`${path}.output`, value.output, diagnostics);\n const followUp = parseFollowUp(`${path}.followUp`, value.followUp, diagnostics);\n\n if (command === undefined || prompt === undefined || output === undefined || followUp === null) {\n return undefined;\n }\n\n return {\n supported: true,\n command,\n ...(args === undefined ? {} : { args }),\n prompt,\n output,\n ...(followUp === undefined ? {} : { followUp }),\n };\n}\n\nfunction parseFollowUp(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderFollowUpManifest | undefined | null {\n if (value === undefined) {\n return undefined;\n }\n if (!isRecord(value) || typeof value.supported !== \"boolean\") {\n diagnostics.push(`${path} must be an object with a boolean supported field.`);\n return null;\n }\n if (!value.supported) {\n return {\n supported: false,\n ...(typeof value.reason === \"string\" ? { reason: value.reason } : {}),\n };\n }\n const sessionIdFlag = parseOptionalNonEmptyString(\n `${path}.sessionIdFlag`,\n value.sessionIdFlag,\n diagnostics,\n );\n if (sessionIdFlag === null) {\n return null;\n }\n let resumeArgs: readonly string[] | undefined;\n if (value.resumeArgs !== undefined) {\n if (\n !Array.isArray(value.resumeArgs) ||\n value.resumeArgs.some((item) => typeof item !== \"string\")\n ) {\n diagnostics.push(`${path}.resumeArgs must be an array of strings when present.`);\n return null;\n }\n resumeArgs = value.resumeArgs;\n }\n return {\n supported: true,\n ...(sessionIdFlag === undefined ? {} : { sessionIdFlag }),\n ...(resumeArgs === undefined ? {} : { resumeArgs }),\n };\n}\n\nfunction parseLegacyInteractive(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderManifest[\"interactive\"] | undefined {\n const parsed = parseSupportedObject(path, value, diagnostics);\n if (parsed === undefined || !isRecord(value)) {\n return undefined;\n }\n const command = parseOptionalNonEmptyString(`${path}.command`, value.command, diagnostics);\n const args = parseOptionalStringArray(`${path}.args`, value.args, diagnostics);\n if (command === null) {\n return undefined;\n }\n return {\n ...parsed,\n ...(command === undefined ? {} : { command }),\n ...(args === undefined ? {} : { args }),\n } as TrailStepProviderManifest[\"interactive\"];\n}\n\nfunction parseInteractive(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderInteractiveManifest | undefined {\n const parsed = parseSupportedObject(path, value, diagnostics);\n if (parsed === undefined || !isRecord(value)) {\n return undefined;\n }\n const command = parseOptionalNonEmptyString(`${path}.command`, value.command, diagnostics);\n const args = parseOptionalStringArray(`${path}.args`, value.args, diagnostics);\n const systemPromptFileFlag = parseOptionalNonEmptyString(\n `${path}.systemPromptFileFlag`,\n value.systemPromptFileFlag,\n diagnostics,\n );\n const modelFlag = parseOptionalNonEmptyString(`${path}.modelFlag`, value.modelFlag, diagnostics);\n const permissionBypassFlag = parseOptionalNonEmptyString(\n `${path}.permissionBypassFlag`,\n value.permissionBypassFlag,\n diagnostics,\n );\n if (\n command === null ||\n systemPromptFileFlag === null ||\n modelFlag === null ||\n permissionBypassFlag === null\n ) {\n return undefined;\n }\n return {\n ...parsed,\n ...(command === undefined ? {} : { command }),\n ...(args === undefined ? {} : { args }),\n ...(typeof value.requiresSystemPromptFile === \"boolean\"\n ? { requiresSystemPromptFile: value.requiresSystemPromptFile }\n : {}),\n ...(systemPromptFileFlag === undefined ? {} : { systemPromptFileFlag }),\n ...(modelFlag === undefined ? {} : { modelFlag }),\n ...(permissionBypassFlag === undefined ? {} : { permissionBypassFlag }),\n };\n}\n\nfunction parseSupportedObject(\n path: string,\n value: unknown,\n diagnostics: string[],\n): { readonly supported: boolean; readonly reason?: string } | undefined {\n if (!isRecord(value) || typeof value.supported !== \"boolean\") {\n diagnostics.push(`${path} must be an object with a boolean supported field.`);\n return undefined;\n }\n return {\n supported: value.supported,\n ...(typeof value.reason === \"string\" ? { reason: value.reason } : {}),\n };\n}\n\nfunction parseEnvironment(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderEnvironmentManifest | undefined | null {\n if (value === undefined) {\n return undefined;\n }\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object when present.`);\n return null;\n }\n const start = diagnostics.length;\n const required = parseOptionalStringArray(`${path}.required`, value.required, diagnostics);\n const optional = parseOptionalStringArray(`${path}.optional`, value.optional, diagnostics);\n if (diagnostics.length > start) {\n return null;\n }\n return {\n ...(required === undefined ? {} : { required }),\n ...(optional === undefined ? {} : { optional }),\n };\n}\n\nfunction parseLegacyModel(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderManifest[\"model\"] | undefined {\n const parsed = parseSupportedObject(path, value, diagnostics);\n if (parsed === undefined || !isRecord(value)) {\n return undefined;\n }\n const flag = parseOptionalNonEmptyString(`${path}.flag`, value.flag, diagnostics);\n if (flag === null) {\n return undefined;\n }\n return {\n ...parsed,\n ...(flag === undefined ? {} : { flag }),\n } as TrailStepProviderManifest[\"model\"];\n}\n\nfunction parseLegacyThinking(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderManifest[\"thinking\"] | undefined {\n if (!isRecord(value) || typeof value.supported !== \"boolean\") {\n diagnostics.push(`${path} must be an object with a boolean supported field.`);\n return undefined;\n }\n\n const flag = parseOptionalNonEmptyString(`${path}.flag`, value.flag, diagnostics);\n if (flag === null) {\n return undefined;\n }\n\n if (value.levels !== undefined) {\n if (\n !Array.isArray(value.levels) ||\n value.levels.some(\n (level) =>\n typeof level !== \"string\" || !THINKING_LEVELS.has(level as WorkflowAgentThinking),\n )\n ) {\n diagnostics.push(\n `${path}.levels must be an array of supported thinking levels when present.`,\n );\n return undefined;\n }\n return {\n supported: value.supported,\n ...(flag === undefined ? {} : { flag }),\n levels: value.levels as WorkflowAgentThinking[],\n } as TrailStepProviderManifest[\"thinking\"];\n }\n\n return {\n supported: value.supported,\n ...(flag === undefined ? {} : { flag }),\n } as TrailStepProviderManifest[\"thinking\"];\n}\n\nfunction parseModel(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderModelManifest | undefined {\n const parsed = parseSupportedObject(path, value, diagnostics);\n if (parsed === undefined || !isRecord(value)) {\n return undefined;\n }\n const flag = parseOptionalNonEmptyString(`${path}.flag`, value.flag, diagnostics);\n const discovery = parseModelDiscovery(`${path}.discovery`, value.discovery, diagnostics);\n if (flag === null || discovery === null) {\n return undefined;\n }\n return {\n ...parsed,\n ...(flag === undefined ? {} : { flag }),\n ...(discovery === undefined ? {} : { discovery }),\n };\n}\n\nfunction parseModelDiscovery(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderModelDiscoveryManifest | undefined | null {\n if (value === undefined) {\n return undefined;\n }\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object when present.`);\n return null;\n }\n const command = parseRequiredString(`${path}.command`, value.command, diagnostics);\n const args = parseRequiredStringArray(`${path}.args`, value.args, diagnostics);\n const outputParser = parseRequiredString(`${path}.outputParser`, value.outputParser, diagnostics);\n if (command === undefined || args === undefined || outputParser === undefined) {\n return null;\n }\n return { command, args, outputParser };\n}\n\nfunction parseThinking(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderThinkingManifest | undefined {\n const parsed = parseSupportedObject(path, value, diagnostics);\n if (parsed === undefined || !isRecord(value)) {\n return undefined;\n }\n\n const flag = parseOptionalNonEmptyString(`${path}.flag`, value.flag, diagnostics);\n if (flag === null) {\n return undefined;\n }\n\n if (value.levels !== undefined) {\n if (\n !Array.isArray(value.levels) ||\n value.levels.some(\n (level) =>\n typeof level !== \"string\" || !THINKING_LEVELS.has(level as WorkflowAgentThinking),\n )\n ) {\n diagnostics.push(\n `${path}.levels must be an array of supported thinking levels when present.`,\n );\n return undefined;\n }\n return {\n ...parsed,\n ...(flag === undefined ? {} : { flag }),\n levels: value.levels as WorkflowAgentThinking[],\n };\n }\n\n return { ...parsed, ...(flag === undefined ? {} : { flag }) };\n}\n\nfunction parsePrompt(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderPromptManifest | undefined {\n if (!isRecord(value) || value.kind !== \"prompt-file\") {\n diagnostics.push(`${path}.kind must be prompt-file.`);\n return undefined;\n }\n if (value.reference !== undefined && value.reference !== \"at-prefixed-argument\") {\n diagnostics.push(`${path}.reference must be at-prefixed-argument when present.`);\n return undefined;\n }\n return {\n kind: \"prompt-file\",\n ...(value.reference === undefined ? {} : { reference: value.reference }),\n };\n}\n\nfunction parseOutput(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderOutputManifest | undefined {\n if (!isRecord(value) || !isProviderOutputStyle(value.style)) {\n diagnostics.push(\n `${path}.style must be provider-output-file, stdout-json-envelope, or stdout-jsonl-transcript.`,\n );\n return undefined;\n }\n const parsing = parseOutputParsing(`${path}.parsing`, value.parsing, diagnostics);\n if (parsing === null) {\n return undefined;\n }\n return {\n style: value.style,\n ...(parsing === undefined ? {} : { parsing }),\n };\n}\n\nfunction parseOutputParsing(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepProviderOutputParsingManifest | undefined | null {\n if (value === undefined) {\n return undefined;\n }\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object when present.`);\n return null;\n }\n const resultField = parseOptionalNonEmptyString(\n `${path}.resultField`,\n value.resultField,\n diagnostics,\n );\n if (resultField === null) {\n return null;\n }\n return {\n ...(resultField === undefined ? {} : { resultField }),\n };\n}\n\nfunction isProviderOutputStyle(value: unknown): value is TrailStepProviderOutputStyle {\n return (\n value === \"provider-output-file\" ||\n value === \"stdout-json-envelope\" ||\n value === \"stdout-jsonl-transcript\"\n );\n}\n\nfunction parseRequiredString(\n path: string,\n value: unknown,\n diagnostics: string[],\n): string | undefined {\n if (typeof value !== \"string\" || value.length === 0) {\n diagnostics.push(`${path} must be a non-empty string.`);\n return undefined;\n }\n return value;\n}\n\nfunction parseRequiredStringArray(\n path: string,\n value: unknown,\n diagnostics: string[],\n): readonly string[] | undefined {\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n diagnostics.push(`${path} must be an array of strings.`);\n return undefined;\n }\n return value;\n}\n\nfunction parseOptionalNonEmptyString(\n path: string,\n value: unknown,\n diagnostics: string[],\n): string | undefined | null {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"string\" || value.length === 0) {\n diagnostics.push(`${path} must be a non-empty string when present.`);\n return null;\n }\n return value;\n}\n\nfunction throwIfNewDiagnostics(diagnostics: string[], start: number): void {\n if (diagnostics.length > start) {\n throwValidationFailure(diagnostics);\n }\n}\n","import { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type {\n TrailStepAgentMappings,\n TrailStepAgentTarget,\n TrailStepSettings,\n} from \"../targeting.types.js\";\nimport type { RawTrailStepAgentMappings, RawTrailStepAgentTarget } from \"./parse-agent-targets.js\";\n\nexport function expandAgentRefs(options: {\n readonly agents: RawTrailStepAgentMappings;\n readonly workflows:\n | Readonly<\n Record<\n string,\n {\n readonly agents?: RawTrailStepAgentMappings;\n readonly settings?: TrailStepSettings;\n }\n >\n >\n | undefined;\n}): {\n readonly agents: TrailStepAgentMappings;\n readonly workflows:\n | Readonly<\n Record<\n string,\n {\n readonly agents?: TrailStepAgentMappings;\n readonly settings?: TrailStepSettings;\n }\n >\n >\n | undefined;\n} {\n const expandedAgents: Record<string, readonly TrailStepAgentTarget[]> = {};\n const memo = new Map<string, readonly TrailStepAgentTarget[]>();\n\n for (const name of Object.keys(options.agents)) {\n expandedAgents[name] = expandTopLevelAgent({\n name,\n agents: options.agents,\n memo,\n stack: [],\n rootRefPath: undefined,\n });\n }\n\n const expandedWorkflows =\n options.workflows === undefined\n ? undefined\n : Object.fromEntries(\n Object.entries(options.workflows).map(([workflowId, workflow]) => {\n const workflowAgents =\n workflow.agents === undefined\n ? undefined\n : Object.fromEntries(\n Object.entries(workflow.agents).map(([roleName, targets]) => [\n roleName,\n expandTargetArray({\n path: `workflows.${workflowId}.agents.${roleName}`,\n targets,\n agents: options.agents,\n memo,\n stack: [],\n rootRefPath: undefined,\n }),\n ]),\n );\n\n return [\n workflowId,\n {\n ...(workflowAgents === undefined ? {} : { agents: workflowAgents }),\n ...(workflow.settings === undefined ? {} : { settings: workflow.settings }),\n },\n ];\n }),\n );\n\n return { agents: expandedAgents, workflows: expandedWorkflows };\n}\n\nfunction expandTopLevelAgent(options: {\n readonly name: string;\n readonly agents: RawTrailStepAgentMappings;\n readonly memo: Map<string, readonly TrailStepAgentTarget[]>;\n readonly stack: readonly string[];\n readonly rootRefPath: string | undefined;\n}): readonly TrailStepAgentTarget[] {\n const memoized = options.memo.get(options.name);\n if (memoized !== undefined) {\n return memoized;\n }\n\n const targets = options.agents[options.name];\n if (targets === undefined) {\n throwUnknownRef(`agents.${options.name}`, options.name);\n }\n\n const expanded = expandTargetArray({\n path: `agents.${options.name}`,\n targets,\n agents: options.agents,\n memo: options.memo,\n stack: [...options.stack, options.name],\n rootRefPath: options.rootRefPath,\n });\n options.memo.set(options.name, expanded);\n return expanded;\n}\n\nfunction expandTargetArray(options: {\n readonly path: string;\n readonly targets: readonly RawTrailStepAgentTarget[];\n readonly agents: RawTrailStepAgentMappings;\n readonly memo: Map<string, readonly TrailStepAgentTarget[]>;\n readonly stack: readonly string[];\n readonly rootRefPath: string | undefined;\n}): readonly TrailStepAgentTarget[] {\n return options.targets.flatMap((target, index) => {\n if (\"provider\" in target) {\n return [target];\n }\n\n const refPath = `${options.path}[${index}].ref`;\n const referencedTargets = options.agents[target.ref];\n if (referencedTargets === undefined) {\n throwUnknownRef(refPath, target.ref);\n }\n\n const existingRefIndex = options.stack.indexOf(target.ref);\n if (existingRefIndex !== -1) {\n throwCycle(options.rootRefPath ?? refPath, [\n ...options.stack.slice(existingRefIndex),\n target.ref,\n ]);\n }\n\n const memoized = options.memo.get(target.ref);\n if (memoized !== undefined) {\n return memoized;\n }\n\n const expanded = expandTargetArray({\n path: `agents.${target.ref}`,\n targets: referencedTargets,\n agents: options.agents,\n memo: options.memo,\n stack: [...options.stack, target.ref],\n rootRefPath: options.rootRefPath ?? refPath,\n });\n options.memo.set(target.ref, expanded);\n return expanded;\n });\n}\n\nfunction throwUnknownRef(path: string, ref: string): never {\n throw new TrailStepFailureError({\n code: \"agent_ref_unknown\",\n message: \"One or more agent refs reference an unknown top-level agent.\",\n details: { diagnostics: [`${path} references unknown agent '${ref}'.`] },\n });\n}\n\nfunction throwCycle(path: string, cycle: readonly string[]): never {\n throw new TrailStepFailureError({\n code: \"agent_ref_cycle\",\n message: \"One or more agent refs create a cycle.\",\n details: { diagnostics: [`${path} creates an agent ref cycle: ${cycle.join(\" -> \")}.`] },\n });\n}\n","import type {\n WorkflowAgentSize,\n WorkflowAgentThinking,\n} from \"../../contracts/agents/agent-role.types.js\";\nimport type { TrailStepAgentTarget } from \"../targeting.types.js\";\nimport { isRecord, parseOptionalStringArray } from \"./parse-utils.js\";\n\nexport interface RawTrailStepAgentRef {\n readonly ref: string;\n}\n\nexport type RawTrailStepAgentTarget = TrailStepAgentTarget | RawTrailStepAgentRef;\nexport type RawTrailStepAgentMappings = Readonly<\n Record<string, readonly RawTrailStepAgentTarget[]>\n>;\n\nexport const AGENT_SIZES = new Set<WorkflowAgentSize>([\n \"default\",\n \"tiny\",\n \"small\",\n \"medium\",\n \"large\",\n \"xl\",\n]);\n\nconst THINKING_LEVELS = new Set<WorkflowAgentThinking>([\"low\", \"medium\", \"high\", \"xhigh\", \"max\"]);\n\nexport function parseTargetArray(\n path: string,\n value: unknown,\n diagnostics: string[],\n): readonly RawTrailStepAgentTarget[] {\n if (!Array.isArray(value)) {\n diagnostics.push(`${path} must be an array.`);\n return [];\n }\n\n return value.flatMap((target, index): readonly RawTrailStepAgentTarget[] => {\n const targetPath = `${path}[${index}]`;\n\n if (!isRecord(target)) {\n diagnostics.push(`${targetPath} must be an object.`);\n return [];\n }\n\n if (target.ref !== undefined) {\n if (typeof target.ref !== \"string\" || target.ref.length === 0) {\n diagnostics.push(`${targetPath}.ref must be a non-empty string when present.`);\n return [];\n }\n\n return [{ ref: target.ref }];\n }\n\n if (typeof target.provider !== \"string\" || target.provider.length === 0) {\n diagnostics.push(`${targetPath}.provider must be a non-empty string.`);\n return [];\n }\n\n if (target.model !== undefined && typeof target.model !== \"string\") {\n diagnostics.push(`${targetPath}.model must be a string when present.`);\n }\n\n if (\n target.thinking !== undefined &&\n !THINKING_LEVELS.has(target.thinking as WorkflowAgentThinking)\n ) {\n diagnostics.push(\n `${targetPath}.thinking must be one of low, medium, high, xhigh, or max when present.`,\n );\n }\n\n const model =\n typeof target.model === \"string\" ? optionalNonEmptyString(target.model) : undefined;\n const args = parseOptionalStringArray(`${targetPath}.args`, target.args, diagnostics);\n\n return [\n {\n provider: target.provider,\n ...(model === undefined ? {} : { model }),\n ...(typeof target.thinking === \"string\" &&\n THINKING_LEVELS.has(target.thinking as WorkflowAgentThinking)\n ? { thinking: target.thinking as WorkflowAgentThinking }\n : {}),\n ...(args === undefined ? {} : { args }),\n },\n ];\n });\n}\n\nfunction optionalNonEmptyString(value: string): string | undefined {\n return value.trim().length === 0 ? undefined : value;\n}\n","import {\n parseTargetArray,\n type RawTrailStepAgentMappings,\n type RawTrailStepAgentTarget,\n} from \"./parse-agent-targets.js\";\nimport { isRecord } from \"./parse-utils.js\";\n\nexport function parseAgentMappings(\n path: string,\n value: unknown,\n diagnostics: string[],\n): RawTrailStepAgentMappings {\n const mappings: Record<string, readonly RawTrailStepAgentTarget[]> = {};\n\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object.`);\n return mappings;\n }\n\n for (const [name, entry] of Object.entries(value)) {\n mappings[name] = parseTargetArray(`${path}.${name}`, entry, diagnostics);\n }\n\n return mappings;\n}\n","import type { WorkflowAgentThinking } from \"../../contracts/agents/agent-role.types.js\";\nimport type {\n TrailStepCustomProviderConfig,\n TrailStepCustomProviderModelOverrideSupport,\n TrailStepCustomProviderThinkingOverrideSupport,\n} from \"../targeting.types.js\";\nimport { isRecord, parseOptionalStringArray, parseOptionalStringRecord } from \"./parse-utils.js\";\n\nconst THINKING_LEVELS = new Set<WorkflowAgentThinking>([\"low\", \"medium\", \"high\", \"xhigh\", \"max\"]);\n\nexport function parseCustomProviders(\n value: unknown,\n diagnostics: string[],\n): Record<string, TrailStepCustomProviderConfig> {\n const customProviders: Record<string, TrailStepCustomProviderConfig> = {};\n\n if (value === undefined) {\n return customProviders;\n }\n\n if (!isRecord(value)) {\n diagnostics.push(\"customProviders must be an object.\");\n return customProviders;\n }\n\n for (const [name, providerConfig] of Object.entries(value)) {\n if (!isRecord(providerConfig)) {\n diagnostics.push(`customProviders.${name} must be an object.`);\n continue;\n }\n\n if (typeof providerConfig.binary !== \"string\" || providerConfig.binary.length === 0) {\n diagnostics.push(`customProviders.${name}.binary must be a non-empty string.`);\n continue;\n }\n\n const args = parseOptionalStringArray(\n `customProviders.${name}.args`,\n providerConfig.args,\n diagnostics,\n );\n const interactiveArgs = parseOptionalStringArray(\n `customProviders.${name}.interactiveArgs`,\n providerConfig.interactiveArgs,\n diagnostics,\n );\n const model = parseCustomProviderModelSupport(\n `customProviders.${name}.model`,\n providerConfig.model,\n diagnostics,\n );\n const thinking = parseCustomProviderThinkingSupport(\n `customProviders.${name}.thinking`,\n providerConfig.thinking,\n diagnostics,\n );\n const env = parseOptionalStringRecord(\n `customProviders.${name}.env`,\n providerConfig.env,\n diagnostics,\n );\n\n if (providerConfig.cwd !== undefined && typeof providerConfig.cwd !== \"string\") {\n diagnostics.push(`customProviders.${name}.cwd must be a string when present.`);\n }\n\n customProviders[name] = {\n binary: providerConfig.binary,\n ...(args === undefined ? {} : { args }),\n ...(interactiveArgs === undefined ? {} : { interactiveArgs }),\n ...(model === undefined ? {} : { model }),\n ...(thinking === undefined ? {} : { thinking }),\n ...(typeof providerConfig.cwd === \"string\" ? { cwd: providerConfig.cwd } : {}),\n ...(env === undefined ? {} : { env }),\n };\n }\n\n return customProviders;\n}\n\nfunction parseCustomProviderModelSupport(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepCustomProviderModelOverrideSupport | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value) || typeof value.supported !== \"boolean\") {\n diagnostics.push(`${path} must be an object with a boolean supported field when present.`);\n return undefined;\n }\n\n if (!value.supported) {\n return { supported: false };\n }\n\n if (value.flag !== undefined && (typeof value.flag !== \"string\" || value.flag.length === 0)) {\n diagnostics.push(`${path}.flag must be a non-empty string when present.`);\n return undefined;\n }\n\n return {\n supported: true,\n ...(typeof value.flag === \"string\" ? { flag: value.flag } : {}),\n };\n}\n\nfunction parseCustomProviderThinkingSupport(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepCustomProviderThinkingOverrideSupport | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value) || typeof value.supported !== \"boolean\") {\n diagnostics.push(`${path} must be an object with a boolean supported field when present.`);\n return undefined;\n }\n\n if (!value.supported) {\n if (value.levels !== undefined && (!Array.isArray(value.levels) || value.levels.length > 0)) {\n diagnostics.push(`${path}.levels must be an empty array when thinking support is disabled.`);\n return undefined;\n }\n\n return value.levels === undefined ? { supported: false } : { supported: false, levels: [] };\n }\n\n if (value.flag !== undefined && (typeof value.flag !== \"string\" || value.flag.length === 0)) {\n diagnostics.push(`${path}.flag must be a non-empty string when present.`);\n return undefined;\n }\n\n if (!Array.isArray(value.levels) || value.levels.length === 0) {\n diagnostics.push(`${path}.levels must be a non-empty array of supported thinking levels.`);\n return undefined;\n }\n\n const levels: WorkflowAgentThinking[] = [];\n for (const [index, level] of value.levels.entries()) {\n if (typeof level !== \"string\" || !THINKING_LEVELS.has(level as WorkflowAgentThinking)) {\n diagnostics.push(`${path}.levels[${index}] must be one of low, medium, high, xhigh, or max.`);\n continue;\n }\n levels.push(level as WorkflowAgentThinking);\n }\n\n if (levels.length !== value.levels.length) {\n return undefined;\n }\n\n return {\n supported: true,\n ...(typeof value.flag === \"string\" ? { flag: value.flag } : {}),\n levels,\n };\n}\n","import type { RetryPolicyInput } from \"../../runtime/retry/retry-policy.js\";\nimport type { TrailStepSettings } from \"../targeting.types.js\";\nimport { isRecord } from \"./parse-utils.js\";\n\nexport function parseSettings(\n path: string,\n value: unknown,\n diagnostics: string[],\n): TrailStepSettings | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object when present.`);\n return undefined;\n }\n\n const settings: Record<string, unknown> = { ...value };\n\n if (value.retry !== undefined) {\n if (!isRecord(value.retry)) {\n diagnostics.push(`${path}.retry must be an object when present.`);\n delete settings.retry;\n } else if (value.retry.maxAttempts === undefined) {\n delete settings.retry;\n } else {\n settings.retry = { maxAttempts: value.retry.maxAttempts } satisfies RetryPolicyInput;\n }\n }\n\n if (value.timeout !== undefined && typeof value.timeout !== \"number\") {\n diagnostics.push(`${path}.timeout must be a number when present.`);\n delete settings.timeout;\n }\n\n return settings;\n}\n","import { createReadStream, type Dirent } from \"node:fs\";\nimport { mkdir, readdir, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join, relative } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { gunzip, gzip } from \"node:zlib\";\nimport { defaultRunsRoot } from \"../artifacts/run-storage.js\";\nimport { listRunSummaries, type RunSummary } from \"../runs/run-summaries.js\";\n\nconst gzipAsync = promisify(gzip);\nconst gunzipAsync = promisify(gunzip);\n\nexport interface StorageLifecyclePolicy {\n readonly enabled?: boolean;\n readonly archiveAfterDays?: number | false;\n readonly deleteAfterDays?: number | false;\n readonly workflows?: Readonly<\n Record<\n string,\n { readonly archiveAfterDays?: number | false; readonly deleteAfterDays?: number | false }\n >\n >;\n}\n\nexport interface StorageLifecycleAction {\n readonly action: \"archive\" | \"delete-hot\" | \"delete-archive\";\n readonly runId: string;\n readonly reason: string;\n readonly path: string;\n}\n\nexport interface StorageLifecycleStatus {\n readonly runsRoot: string;\n readonly enabled: boolean;\n readonly hotRuns: number;\n readonly archivedRuns: number;\n readonly pinnedRuns: readonly string[];\n}\n\ninterface ArchiveManifest {\n readonly schemaVersion: 1;\n readonly runId: string;\n readonly archivedAt: string;\n readonly sourceRunDir: string;\n readonly workflowId?: string;\n readonly lastTimestamp?: string;\n readonly status?: string;\n readonly pinned?: boolean;\n}\n\ninterface ArchivePayload {\n readonly manifest: ArchiveManifest;\n readonly files: readonly { readonly path: string; readonly contentBase64: string }[];\n}\n\nconst TERMINAL_STATUSES = new Set([\"completed\", \"failed\", \"cancelled\"]);\n\nexport function storageArchiveDir(runsRoot: string): string {\n return join(runsRoot, \".archive\");\n}\n\nexport function storagePinPath(runDir: string): string {\n return join(runDir, \".trailstep-pin.json\");\n}\n\nexport async function readStorageLifecycleStatus(options: {\n readonly cwd: string;\n readonly runsRoot?: string;\n readonly policy?: StorageLifecyclePolicy;\n}): Promise<StorageLifecycleStatus> {\n const runsRoot = options.runsRoot ?? defaultRunsRoot(options.cwd);\n const [runSummaries, archivedRuns, pinnedRuns] = await Promise.all([\n listRunSummaries({ cwd: options.cwd, runsRoot }),\n listArchivedRunIds(runsRoot),\n listPinnedRunIds({ cwd: options.cwd, runsRoot }),\n ]);\n const hotRuns = runSummaries.filter((summary) => summary.status !== \"archived\");\n return {\n runsRoot,\n enabled: options.policy?.enabled === true,\n hotRuns: hotRuns.length,\n archivedRuns: archivedRuns.length,\n pinnedRuns,\n };\n}\n\nexport async function planStorageLifecycle(options: {\n readonly cwd: string;\n readonly runsRoot?: string;\n readonly policy?: StorageLifecyclePolicy;\n readonly now?: Date;\n}): Promise<StorageLifecycleAction[]> {\n const policy = options.policy;\n if (policy?.enabled !== true) {\n return [];\n }\n\n const runsRoot = options.runsRoot ?? defaultRunsRoot(options.cwd);\n const now = options.now ?? new Date();\n const summaries = await listRunSummaries({ cwd: options.cwd, runsRoot });\n const actions: StorageLifecycleAction[] = [];\n\n for (const summary of summaries) {\n if (!isLifecycleEligible(summary) || (await isRunPinned(summary.runDir))) {\n continue;\n }\n\n const workflowPolicy = summary.workflowId ? policy.workflows?.[summary.workflowId] : undefined;\n const archiveAfterDays = resolvePolicyDays(workflowPolicy, policy, \"archiveAfterDays\");\n const deleteAfterDays = resolvePolicyDays(workflowPolicy, policy, \"deleteAfterDays\");\n const ageDays = ageInDays(summary.lastTimestamp, now);\n if (ageDays === undefined) {\n continue;\n }\n\n if (deleteAfterDays !== undefined && ageDays >= deleteAfterDays) {\n actions.push({\n action: \"delete-hot\",\n runId: summary.runId,\n path: summary.runDir,\n reason: `${summary.status} run is ${Math.floor(ageDays)}d old (deleteAfterDays=${deleteAfterDays})`,\n });\n } else if (archiveAfterDays !== undefined && ageDays >= archiveAfterDays) {\n actions.push({\n action: \"archive\",\n runId: summary.runId,\n path: summary.runDir,\n reason: `${summary.status} run is ${Math.floor(ageDays)}d old (archiveAfterDays=${archiveAfterDays})`,\n });\n }\n }\n\n for (const manifest of await readArchiveManifests(runsRoot)) {\n const workflowPolicy = manifest.workflowId\n ? policy.workflows?.[manifest.workflowId]\n : undefined;\n const deleteAfterDays = resolvePolicyDays(workflowPolicy, policy, \"deleteAfterDays\");\n const ageDays = ageInDays(manifest.lastTimestamp, now);\n if (manifest.pinned === true || deleteAfterDays === undefined || ageDays === undefined) {\n continue;\n }\n if (ageDays >= deleteAfterDays) {\n actions.push({\n action: \"delete-archive\",\n runId: manifest.runId,\n path: archivePayloadPath(runsRoot, manifest.runId),\n reason: `archived run is ${Math.floor(ageDays)}d old (deleteAfterDays=${deleteAfterDays})`,\n });\n }\n }\n\n return actions;\n}\n\nexport async function applyStorageLifecycle(options: {\n readonly cwd: string;\n readonly runsRoot?: string;\n readonly policy?: StorageLifecyclePolicy;\n readonly now?: Date;\n readonly dryRun?: boolean;\n}): Promise<StorageLifecycleAction[]> {\n const actions = await planStorageLifecycle(options);\n if (options.dryRun === true) {\n return actions;\n }\n const runsRoot = options.runsRoot ?? defaultRunsRoot(options.cwd);\n for (const action of actions) {\n if (action.action === \"archive\") {\n await archiveRun({ runsRoot, runId: action.runId, now: options.now });\n } else if (action.action === \"delete-hot\") {\n await deleteRun({ runsRoot, runId: action.runId });\n } else {\n await deleteArchivedRun({ runsRoot, runId: action.runId });\n }\n }\n return actions;\n}\n\nexport async function archiveRun(options: {\n readonly runsRoot: string;\n readonly runId: string;\n readonly now?: Date;\n}): Promise<void> {\n assertRunId(options.runId);\n const runDir = join(options.runsRoot, options.runId);\n const summaries = await listRunSummaries({\n cwd: dirname(dirname(options.runsRoot)),\n runsRoot: options.runsRoot,\n });\n const summary = summaries.find(\n (candidate) => candidate.runId === options.runId && candidate.status !== \"archived\",\n );\n if (summary === undefined || !isLifecycleEligible(summary)) {\n throw new Error(`Run ${options.runId} is not a terminal readable run and cannot be archived.`);\n }\n if (await isRunPinned(runDir)) {\n throw new Error(`Run ${options.runId} is pinned and cannot be archived.`);\n }\n\n const manifest: ArchiveManifest = {\n schemaVersion: 1,\n runId: options.runId,\n archivedAt: (options.now ?? new Date()).toISOString(),\n sourceRunDir: runDir,\n ...(summary.workflowId === undefined ? {} : { workflowId: summary.workflowId }),\n ...(summary.lastTimestamp === undefined ? {} : { lastTimestamp: summary.lastTimestamp }),\n status: summary.status,\n };\n const payload: ArchivePayload = { manifest, files: await readDirectoryPayload(runDir) };\n await mkdir(storageArchiveDir(options.runsRoot), { recursive: true });\n await writeFile(\n archivePayloadPath(options.runsRoot, options.runId),\n await gzipAsync(JSON.stringify(payload)),\n \"utf8\",\n );\n await writeFile(\n archiveManifestPath(options.runsRoot, options.runId),\n `${JSON.stringify(manifest, null, 2)}\\n`,\n \"utf8\",\n );\n await rm(runDir, { recursive: true, force: true });\n}\n\nexport async function restoreArchivedRun(options: {\n readonly runsRoot: string;\n readonly runId: string;\n}): Promise<void> {\n assertRunId(options.runId);\n const payloadPath = archivePayloadPath(options.runsRoot, options.runId);\n const manifestPath = archiveManifestPath(options.runsRoot, options.runId);\n const runDir = join(options.runsRoot, options.runId);\n if (await pathExists(runDir)) {\n throw new Error(\n `Run ${options.runId} already exists in hot storage; refusing to overwrite it.`,\n );\n }\n const payload = JSON.parse(\n String(await gunzipAsync(await readFile(payloadPath))),\n ) as ArchivePayload;\n await mkdir(runDir, { recursive: true });\n for (const file of payload.files) {\n const target = join(runDir, file.path);\n if (!relative(runDir, target) || relative(runDir, target).startsWith(\"..\")) {\n throw new Error(`Archive for ${options.runId} contains an invalid path.`);\n }\n await mkdir(dirname(target), { recursive: true });\n await writeFile(target, Buffer.from(file.contentBase64, \"base64\"));\n }\n await rm(payloadPath, { force: true });\n await rm(manifestPath, { force: true });\n}\n\nexport async function pinRun(options: {\n readonly runsRoot: string;\n readonly runId: string;\n}): Promise<void> {\n assertRunId(options.runId);\n const runDir = join(options.runsRoot, options.runId);\n if (!(await pathExists(runDir))) {\n if (await pathExists(archiveManifestPath(options.runsRoot, options.runId))) {\n throw new Error(`Run ${options.runId} is archived; restore it before pinning.`);\n }\n throw new Error(`Run ${options.runId} does not exist.`);\n }\n await writeFile(\n storagePinPath(runDir),\n `${JSON.stringify({ schemaVersion: 1, pinnedAt: new Date().toISOString() }, null, 2)}\\n`,\n \"utf8\",\n );\n}\n\nexport async function unpinRun(options: {\n readonly runsRoot: string;\n readonly runId: string;\n}): Promise<void> {\n assertRunId(options.runId);\n const runDir = join(options.runsRoot, options.runId);\n if (!(await pathExists(runDir))) {\n if (await pathExists(archiveManifestPath(options.runsRoot, options.runId))) {\n throw new Error(`Run ${options.runId} is archived; restore it before unpinning.`);\n }\n throw new Error(`Run ${options.runId} does not exist.`);\n }\n await rm(storagePinPath(runDir), { force: true });\n}\n\nexport async function deleteRun(options: {\n readonly runsRoot: string;\n readonly runId: string;\n}): Promise<void> {\n assertRunId(options.runId);\n const runDir = join(options.runsRoot, options.runId);\n if (await pathExists(runDir)) {\n if (await isRunPinned(runDir)) {\n throw new Error(`Run ${options.runId} is pinned and cannot be deleted.`);\n }\n await rm(runDir, { recursive: true, force: true });\n return;\n }\n const manifest = await readArchiveManifest(options.runsRoot, options.runId);\n if (manifest === undefined) {\n throw new Error(`Run ${options.runId} does not exist.`);\n }\n if (manifest.pinned === true) {\n throw new Error(`Run ${options.runId} is pinned and cannot be deleted.`);\n }\n await deleteArchivedRun(options);\n}\n\nexport async function deleteArchivedRun(options: {\n readonly runsRoot: string;\n readonly runId: string;\n}): Promise<void> {\n assertRunId(options.runId);\n await rm(archivePayloadPath(options.runsRoot, options.runId), { force: true });\n await rm(archiveManifestPath(options.runsRoot, options.runId), { force: true });\n}\n\nasync function readDirectoryPayload(root: string): Promise<ArchivePayload[\"files\"]> {\n const files: { path: string; contentBase64: string }[] = [];\n async function visit(dir: string): Promise<void> {\n for (const entry of await readdir(dir, { withFileTypes: true })) {\n const entryPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n await visit(entryPath);\n } else if (entry.isFile()) {\n files.push({\n path: normalizeArchivePath(relative(root, entryPath)),\n contentBase64: await streamFileBase64(entryPath),\n });\n }\n }\n }\n await visit(root);\n return files;\n}\n\nfunction normalizeArchivePath(path: string): string {\n return path.replace(/\\\\/g, \"/\");\n}\n\nasync function streamFileBase64(path: string): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of createReadStream(path)) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"base64\");\n}\n\nasync function listPinnedRunIds(options: {\n readonly cwd: string;\n readonly runsRoot: string;\n}): Promise<string[]> {\n const summaries = (await listRunSummaries(options)).filter(\n (summary) => summary.status !== \"archived\",\n );\n const pinned: string[] = [];\n for (const summary of summaries) {\n if (await isRunPinned(summary.runDir)) {\n pinned.push(summary.runId);\n }\n }\n return pinned.sort();\n}\n\nasync function isRunPinned(runDir: string): Promise<boolean> {\n try {\n await stat(storagePinPath(runDir));\n return true;\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nasync function listArchivedRunIds(runsRoot: string): Promise<string[]> {\n return (await readArchiveManifests(runsRoot)).map((manifest) => manifest.runId).sort();\n}\n\nasync function readArchiveManifest(\n runsRoot: string,\n runId: string,\n): Promise<ArchiveManifest | undefined> {\n try {\n return JSON.parse(\n await readFile(archiveManifestPath(runsRoot, runId), \"utf8\"),\n ) as ArchiveManifest;\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function readArchiveManifests(runsRoot: string): Promise<ArchiveManifest[]> {\n let entries: Dirent[];\n try {\n entries = await readdir(storageArchiveDir(runsRoot), { withFileTypes: true });\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n const manifests: ArchiveManifest[] = [];\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(\".manifest.json\")) {\n continue;\n }\n manifests.push(\n JSON.parse(\n await readFile(join(storageArchiveDir(runsRoot), entry.name), \"utf8\"),\n ) as ArchiveManifest,\n );\n }\n return manifests;\n}\n\nfunction archivePayloadPath(runsRoot: string, runId: string): string {\n return join(storageArchiveDir(runsRoot), `${runId}.json.gz`);\n}\n\nfunction archiveManifestPath(runsRoot: string, runId: string): string {\n return join(storageArchiveDir(runsRoot), `${runId}.manifest.json`);\n}\n\nfunction isLifecycleEligible(summary: RunSummary): boolean {\n return TERMINAL_STATUSES.has(summary.status);\n}\n\nfunction resolvePolicyDays(\n workflowPolicy: NonNullable<StorageLifecyclePolicy[\"workflows\"]>[string] | undefined,\n defaultPolicy: StorageLifecyclePolicy,\n key: \"archiveAfterDays\" | \"deleteAfterDays\",\n): number | undefined {\n if (workflowPolicy !== undefined && Object.hasOwn(workflowPolicy, key)) {\n const value = workflowPolicy[key];\n return value === false ? undefined : value;\n }\n const value = defaultPolicy[key];\n return value === false ? undefined : value;\n}\n\nfunction ageInDays(timestamp: string | undefined, now: Date): number | undefined {\n if (timestamp === undefined) {\n return undefined;\n }\n const time = Date.parse(timestamp);\n return Number.isFinite(time) ? (now.getTime() - time) / (24 * 60 * 60 * 1000) : undefined;\n}\n\nexport function parseStorageLifecycleDurationDays(value: string): number | undefined {\n const match = /^(\\d+(?:\\.\\d+)?)(ms|s|m|h|d|w)$/u.exec(value.trim());\n if (match === null) {\n return undefined;\n }\n const amount = Number(match[1]);\n if (!Number.isFinite(amount) || amount < 0) {\n return undefined;\n }\n const unit = match[2] as \"ms\" | \"s\" | \"m\" | \"h\" | \"d\" | \"w\";\n const daysByUnit: Record<typeof unit, number> = {\n ms: 1 / 86_400_000,\n s: 1 / 86_400,\n m: 1 / 1_440,\n h: 1 / 24,\n d: 1,\n w: 7,\n };\n return amount * daysByUnit[unit];\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nfunction assertRunId(runId: string): void {\n if (runId !== basename(runId) || runId === \".\" || runId === \"..\" || runId.trim() === \"\") {\n throw new Error(\"Run id must be a single path segment.\");\n }\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n","import { appendFile, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\nimport { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type { Event } from \"../../runtime/run-workflow/run-workflow.types.js\";\n\nexport type RunState = Record<string, unknown>;\n\nexport function defaultRunsRoot(cwd: string): string {\n return join(cwd, \".trailstep\", \"runs\");\n}\n\nexport async function createRunDirectory(options: {\n readonly cwd: string;\n readonly runName: string;\n readonly runsRoot?: string;\n}): Promise<{ runId: string; runDir: string }> {\n const runsRoot = options.runsRoot ?? defaultRunsRoot(options.cwd);\n validateRunName(options.runName);\n await mkdir(runsRoot, { recursive: true });\n await ensureTrailStepGitignoreForRunsRoot(runsRoot);\n\n for (let suffix = 1; ; suffix += 1) {\n const runId = suffix === 1 ? options.runName : `${options.runName}-${suffix}`;\n const runDir = join(runsRoot, runId);\n\n try {\n await mkdir(runDir);\n return { runId, runDir };\n } catch (error) {\n if (isNodeError(error) && error.code === \"EEXIST\") {\n continue;\n }\n\n throw error;\n }\n }\n}\n\nexport async function appendEvent(runDir: string, event: Event): Promise<void> {\n await appendFile(join(runDir, \"events.jsonl\"), `${JSON.stringify(event)}\\n`, \"utf8\");\n}\n\nexport async function readRunEvents(runDir: string): Promise<Event[]> {\n let contents: string;\n try {\n contents = await readFile(join(runDir, \"events.jsonl\"), \"utf8\");\n } catch (error) {\n if (isNodeError(error)) {\n throw new TrailStepFailureError({\n code: \"resume_target_not_found\",\n message: `Resume target not found or unreadable: ${join(runDir, \"events.jsonl\")}.`,\n details: { runDir, causeCode: error.code },\n });\n }\n\n throw error;\n }\n\n const rawLines = contents.split(\"\\n\");\n const lines = rawLines.filter((line, index) => line.length > 0 || index < rawLines.length - 1);\n const events: Event[] = [];\n\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index];\n if (!line) {\n continue;\n }\n\n try {\n events.push(JSON.parse(line) as Event);\n } catch (error) {\n const isTrailingLine = index === lines.length - 1;\n if (isTrailingLine) {\n return events;\n }\n\n throw error;\n }\n }\n\n return events;\n}\n\nexport async function persistEvents(runDir: string, events: readonly Event[]): Promise<void> {\n const jsonl = events.map((event) => JSON.stringify(event)).join(\"\\n\");\n await writeFile(join(runDir, \"events.jsonl\"), `${jsonl}\\n`, \"utf8\");\n}\n\nexport async function writeDocumentArtifact(\n dir: string,\n filename: string,\n content: string,\n): Promise<string> {\n await mkdir(dir, { recursive: true });\n\n const documentPath = join(dir, filename);\n await writeFile(documentPath, content, \"utf8\");\n\n return documentPath;\n}\n\nexport async function readJsonStateArtifact(path: string): Promise<RunState> {\n try {\n const contents = await readFile(path, \"utf8\");\n const parsed: unknown = JSON.parse(contents);\n\n if (!isRunState(parsed)) {\n throw new Error(\"run state must be a JSON object\");\n }\n\n return parsed;\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return {};\n }\n\n throw error;\n }\n}\n\nexport async function writeJsonStateArtifact(path: string, state: RunState): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, `${JSON.stringify(state, null, 2)}\\n`, \"utf8\");\n}\n\nexport function runStatePath(runDir: string): string {\n return join(runDir, \"state.json\");\n}\n\nexport function globalStatePath(runDir: string): string {\n return join(runDir, \"global-state.json\");\n}\n\nexport function branchStatePath(runDir: string, branchId: string): string {\n return join(runDir, \"branches\", `${branchId}.state.json`);\n}\n\nexport async function readRunState(runDir: string): Promise<RunState> {\n return await readJsonStateArtifact(runStatePath(runDir));\n}\n\nexport async function writeRunState(runDir: string, state: RunState): Promise<void> {\n await writeJsonStateArtifact(runStatePath(runDir), state);\n}\n\nexport async function readGlobalState(runDir: string): Promise<RunState> {\n return await readJsonStateArtifact(globalStatePath(runDir));\n}\n\nexport async function writeGlobalState(runDir: string, state: RunState): Promise<void> {\n await writeJsonStateArtifact(globalStatePath(runDir), state);\n}\n\nexport async function readBranchRunState(runDir: string, branchId: string): Promise<RunState> {\n return await readJsonStateArtifact(branchStatePath(runDir, branchId));\n}\n\nexport async function writeBranchRunState(\n runDir: string,\n branchId: string,\n state: RunState,\n): Promise<void> {\n await writeJsonStateArtifact(branchStatePath(runDir, branchId), state);\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n\nfunction validateRunName(runName: string): void {\n if (\n runName.trim().length === 0 ||\n runName === \".\" ||\n runName === \"..\" ||\n runName.includes(\"/\") ||\n runName.includes(\"\\\\\")\n ) {\n throw new TrailStepFailureError({\n code: \"run_name_invalid\",\n message: \"Run name must be a non-empty single path segment.\",\n details: { runName },\n });\n }\n}\n\nfunction isRunState(value: unknown): value is RunState {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\nasync function ensureTrailStepGitignoreForRunsRoot(runsRoot: string): Promise<void> {\n const trailstepRoot = dirname(runsRoot);\n if (basename(trailstepRoot) !== \".trailstep\") {\n return;\n }\n\n await ensureTrailStepGitignore(trailstepRoot);\n}\n\nasync function ensureTrailStepGitignore(trailstepRoot: string): Promise<void> {\n try {\n await writeFile(join(trailstepRoot, \".gitignore\"), \"*\\n!.gitignore\\n\", { flag: \"wx\" });\n } catch (error) {\n if (isNodeError(error) && error.code === \"EEXIST\") {\n return;\n }\n\n throw error;\n }\n}\n","import type { Dirent } from \"node:fs\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { defaultRunsRoot, readRunEvents } from \"../artifacts/run-storage.js\";\nimport type { LatestUnresolvedFailure } from \"../retry/latest-unresolved-failure.js\";\nimport { selectLatestUnresolvedFailure } from \"../retry/latest-unresolved-failure.js\";\nimport type { Event } from \"../run-workflow/run-workflow.types.js\";\nimport type { TrackSummary } from \"./track-summary.js\";\nimport { readTrackSummary } from \"./track-summary.js\";\n\nexport type RunSummaryStatus =\n | \"active\"\n | \"completed\"\n | \"failed\"\n | \"cancelled\"\n | \"archived\"\n | \"unknown\";\n\nexport interface RunSummary {\n readonly runId: string;\n readonly runDir: string;\n readonly status: RunSummaryStatus;\n readonly workflowId?: string;\n readonly lastTimestamp?: string;\n readonly latestFailure?: LatestUnresolvedFailure;\n readonly track?: TrackSummary;\n readonly trackWarning?: string;\n readonly warning?: string;\n}\n\nexport async function listRunSummaries(options: {\n readonly cwd: string;\n readonly runsRoot?: string;\n}): Promise<RunSummary[]> {\n const runsRoot = options.runsRoot ?? defaultRunsRoot(options.cwd);\n\n let entries: Dirent[];\n try {\n entries = await readdir(runsRoot, { withFileTypes: true });\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return [];\n }\n\n throw error;\n }\n\n const summaries: RunSummary[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name === \".archive\") {\n continue;\n }\n\n const runId = entry.name;\n const runDir = join(runsRoot, runId);\n\n try {\n summaries.push(\n await summarizeReadableRun({ runId, runDir, events: await readRunEvents(runDir) }),\n );\n } catch (error) {\n summaries.push({\n runId,\n runDir,\n status: \"unknown\",\n warning: `Warning: Could not read run ${runId}: ${readErrorMessage(error)}`,\n });\n }\n }\n\n summaries.push(...(await listArchivedRunSummaries(runsRoot)));\n\n return summaries.sort(newestFirst);\n}\n\nexport function selectRecentFailedRunSummaries(\n summaries: readonly RunSummary[],\n options: { readonly now?: Date } = {},\n): RunSummary[] {\n const cutoffMs = (options.now ?? new Date()).getTime() - 7 * 24 * 60 * 60 * 1000;\n\n return summaries\n .filter((summary) => {\n if (summary.status !== \"failed\" || !summary.latestFailure) {\n return false;\n }\n\n const failureTime = Date.parse(summary.latestFailure.event.timestamp);\n return Number.isFinite(failureTime) && failureTime >= cutoffMs;\n })\n .sort(newestFirst)\n .slice(0, 10);\n}\n\nexport function newestFirst(left: RunSummary, right: RunSummary): number {\n return (\n compareTimestampDescending(left.lastTimestamp, right.lastTimestamp) ||\n left.runId.localeCompare(right.runId)\n );\n}\n\nasync function summarizeReadableRun(options: {\n readonly runId: string;\n readonly runDir: string;\n readonly events: readonly Event[];\n}): Promise<RunSummary> {\n let track: TrackSummary | undefined;\n let trackWarning: string | undefined;\n try {\n track = await readTrackSummary(options);\n } catch (error) {\n trackWarning = `Warning: Could not read track summary for run ${options.runId}: ${readErrorMessage(error)}`;\n }\n const trackFields = {\n ...(track === undefined ? {} : { track }),\n ...(trackWarning === undefined ? {} : { trackWarning }),\n };\n const latestFailure = selectLatestUnresolvedFailure(options.events);\n const terminalStatus = selectTerminalStatus(options.events);\n const lastEvent = options.events.at(-1);\n const workflowId =\n lastEvent?.workflowId ?? options.events.find((event) => event.workflowId)?.workflowId;\n\n if (terminalStatus === \"completed\" || terminalStatus === \"cancelled\") {\n return {\n ...options,\n ...trackFields,\n status: terminalStatus,\n workflowId,\n lastTimestamp: lastEvent?.timestamp,\n };\n }\n\n if (latestFailure) {\n return {\n ...options,\n ...trackFields,\n status: \"failed\",\n workflowId: latestFailure.workflowId,\n lastTimestamp: latestFailure.event.timestamp,\n latestFailure,\n };\n }\n\n return {\n ...options,\n ...trackFields,\n status: terminalStatus ?? \"active\",\n workflowId,\n lastTimestamp: lastEvent?.timestamp,\n };\n}\n\nfunction selectTerminalStatus(\n events: readonly Event[],\n): \"completed\" | \"failed\" | \"cancelled\" | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (event?.type === \"workflow.completed\") {\n return \"completed\";\n }\n\n if (event?.type === \"workflow.failed\") {\n return \"failed\";\n }\n\n if (event?.type === \"workflow.cancelled\") {\n return \"cancelled\";\n }\n }\n\n return undefined;\n}\n\nasync function listArchivedRunSummaries(runsRoot: string): Promise<RunSummary[]> {\n const archiveDir = join(runsRoot, \".archive\");\n let entries: Dirent[];\n try {\n entries = await readdir(archiveDir, { withFileTypes: true });\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n\n const summaries: RunSummary[] = [];\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(\".manifest.json\")) {\n continue;\n }\n try {\n const manifest = JSON.parse(await readFile(join(archiveDir, entry.name), \"utf8\")) as {\n readonly runId?: unknown;\n readonly workflowId?: unknown;\n readonly lastTimestamp?: unknown;\n };\n if (typeof manifest.runId === \"string\") {\n summaries.push({\n runId: manifest.runId,\n runDir: join(archiveDir, `${manifest.runId}.json.gz`),\n status: \"archived\",\n ...(typeof manifest.workflowId === \"string\" ? { workflowId: manifest.workflowId } : {}),\n ...(typeof manifest.lastTimestamp === \"string\"\n ? { lastTimestamp: manifest.lastTimestamp }\n : {}),\n });\n }\n } catch (error) {\n summaries.push({\n runId: entry.name.replace(/\\.manifest\\.json$/u, \"\"),\n runDir: join(archiveDir, entry.name),\n status: \"unknown\",\n warning: `Warning: Could not read archived run manifest ${entry.name}: ${readErrorMessage(error)}`,\n });\n }\n }\n return summaries;\n}\n\nfunction compareTimestampDescending(left: string | undefined, right: string | undefined): number {\n const leftTime = left ? Date.parse(left) : Number.NEGATIVE_INFINITY;\n const rightTime = right ? Date.parse(right) : Number.NEGATIVE_INFINITY;\n return rightTime - leftTime;\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n","import type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport type { Event } from \"../run-workflow/run-workflow.types.js\";\n\nexport interface LatestUnresolvedFailure {\n readonly event: Event;\n readonly replayPosition: number;\n readonly sourceFailureEventId?: string;\n readonly workflowId: string;\n readonly workflowInput?: PlainObject;\n readonly stepId?: string;\n}\n\ninterface ResolvedFailureIdentity {\n readonly eventId?: string;\n readonly replayPosition?: number;\n}\n\nexport function selectLatestUnresolvedFailure(\n events: readonly Event[],\n): LatestUnresolvedFailure | undefined {\n const startedEvent = events.find((event) => event.type === \"workflow.started\");\n const workflowInput = startedEvent ? readPlainPayload(startedEvent, \"input\") : undefined;\n const resolvedFailures = events.flatMap((event) =>\n event.type === \"workflow.retryStarted\" ? readResolvedFailureIdentity(event) : [],\n );\n\n let workflowFailureFallback: LatestUnresolvedFailure | undefined;\n let laterWorkflowTerminalSeen = false;\n const laterTerminalStepCounts = new Map<string, number>();\n\n for (let replayPosition = events.length - 1; replayPosition >= 0; replayPosition -= 1) {\n const event = events[replayPosition];\n if (!event) {\n continue;\n }\n\n if (event.type === \"workflow.completed\" || event.type === \"workflow.cancelled\") {\n return undefined;\n }\n\n if (event.type === \"step.completed\" || event.type === \"step.cancelled\") {\n rememberTerminalStep(event, laterTerminalStepCounts);\n continue;\n }\n\n if (event.type === \"step.failed\") {\n rememberTerminalStep(event, laterTerminalStepCounts);\n if (isResolvedFailure(event, replayPosition, resolvedFailures)) {\n continue;\n }\n\n return toLatestUnresolvedFailure(event, replayPosition, workflowInput);\n }\n\n if (event.type === \"workflow.failed\") {\n laterWorkflowTerminalSeen = true;\n if (!workflowFailureFallback) {\n if (isResolvedFailure(event, replayPosition, resolvedFailures)) {\n continue;\n }\n\n workflowFailureFallback = toLatestUnresolvedFailure(event, replayPosition, workflowInput);\n }\n continue;\n }\n\n if (event.type === \"step.started\" && event.stepId) {\n if (consumeTerminalStep(event.stepId, laterTerminalStepCounts)) {\n continue;\n }\n\n if (!laterWorkflowTerminalSeen) {\n if (isResolvedFailure(event, replayPosition, resolvedFailures)) {\n continue;\n }\n\n return toLatestUnresolvedFailure(event, replayPosition, workflowInput);\n }\n }\n }\n\n return workflowFailureFallback;\n}\n\nfunction rememberTerminalStep(event: Event, stepCounts: Map<string, number>): void {\n if (event.stepId) {\n stepCounts.set(event.stepId, (stepCounts.get(event.stepId) ?? 0) + 1);\n }\n}\n\nfunction consumeTerminalStep(stepId: string, stepCounts: Map<string, number>): boolean {\n const count = stepCounts.get(stepId) ?? 0;\n if (count <= 0) {\n return false;\n }\n\n if (count === 1) {\n stepCounts.delete(stepId);\n } else {\n stepCounts.set(stepId, count - 1);\n }\n return true;\n}\n\nfunction readResolvedFailureIdentity(event: Event): readonly ResolvedFailureIdentity[] {\n const { sourceFailureEventId, sourceFailureReplayPosition } = event.payload;\n if (typeof sourceFailureEventId !== \"string\" && typeof sourceFailureReplayPosition !== \"number\") {\n return [];\n }\n\n return [\n {\n eventId: typeof sourceFailureEventId === \"string\" ? sourceFailureEventId : undefined,\n replayPosition:\n typeof sourceFailureReplayPosition === \"number\" ? sourceFailureReplayPosition : undefined,\n },\n ];\n}\n\nfunction isResolvedFailure(\n event: Event,\n replayPosition: number,\n resolvedFailures: readonly ResolvedFailureIdentity[],\n): boolean {\n return resolvedFailures.some((resolvedFailure) => {\n if (resolvedFailure.replayPosition !== undefined) {\n return resolvedFailure.replayPosition === replayPosition;\n }\n\n return resolvedFailure.eventId !== undefined && resolvedFailure.eventId === event.id;\n });\n}\n\nfunction toLatestUnresolvedFailure(\n event: Event,\n replayPosition: number,\n workflowInput: PlainObject | undefined,\n): LatestUnresolvedFailure {\n return {\n event,\n replayPosition,\n sourceFailureEventId: typeof event.id === \"string\" ? event.id : undefined,\n workflowId: event.workflowId,\n workflowInput,\n stepId: event.stepId,\n };\n}\n\nfunction readPlainPayload(event: Event, key: string): PlainObject | undefined {\n const value = event.payload[key];\n return isPlainObject(value) ? value : undefined;\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport type { Event } from \"../run-workflow/run-workflow.types.js\";\n\nexport interface TrackSummary {\n readonly runId: string;\n readonly status: string;\n readonly workers?: number;\n readonly failurePolicy?: string;\n readonly rootBranchId?: string;\n readonly terminalBranchId?: string;\n readonly terminalKind?: string;\n readonly terminalOutput?: unknown;\n readonly failure?: unknown;\n readonly splitOccurred?: boolean;\n readonly branches: readonly BranchSummary[];\n}\n\nexport interface BranchSummary {\n readonly branchId: string;\n readonly requestedBranchId?: string;\n readonly parentBranchId?: string;\n readonly status?: string;\n readonly workflowId?: string;\n readonly latestStepIndex?: number;\n readonly latestStepId?: string;\n readonly latestMessage?: string;\n readonly wait?: unknown;\n readonly failure?: unknown;\n readonly output?: unknown;\n}\n\nexport async function readTrackSummary(options: {\n readonly runId: string;\n readonly runDir: string;\n readonly events: readonly Event[];\n}): Promise<TrackSummary | undefined> {\n const track = await readJsonObject(join(options.runDir, \"track.json\"));\n if (track === undefined) {\n return undefined;\n }\n\n const branchIds = Array.isArray(track.branches)\n ? track.branches.filter((branchId): branchId is string => typeof branchId === \"string\")\n : [];\n\n const branches = await Promise.all(\n branchIds.map(async (branchId) => summarizeBranch(options.runDir, branchId, options.events)),\n );\n\n return {\n runId: stringValue(track.runId) ?? options.runId,\n status: stringValue(track.status) ?? \"unknown\",\n ...(numberValue(track.workers) === undefined ? {} : { workers: numberValue(track.workers) }),\n ...(stringValue(track.failurePolicy) === undefined\n ? {}\n : { failurePolicy: stringValue(track.failurePolicy) }),\n ...(stringValue(track.rootBranchId) === undefined\n ? {}\n : { rootBranchId: stringValue(track.rootBranchId) }),\n ...(stringValue(track.terminalBranchId) === undefined\n ? {}\n : { terminalBranchId: stringValue(track.terminalBranchId) }),\n ...(stringValue(track.terminalKind) === undefined\n ? {}\n : { terminalKind: stringValue(track.terminalKind) }),\n ...(track.terminalOutput === undefined ? {} : { terminalOutput: track.terminalOutput }),\n ...(track.failure === undefined ? {} : { failure: track.failure }),\n ...(typeof track.splitOccurred === \"boolean\" ? { splitOccurred: track.splitOccurred } : {}),\n branches,\n };\n}\n\nasync function summarizeBranch(\n runDir: string,\n branchId: string,\n events: readonly Event[],\n): Promise<BranchSummary> {\n const branch = (await readJsonObject(join(runDir, \"branches\", `${branchId}.json`))) ?? {};\n const branchEvents = events.filter((event) => event.payload.branchId === branchId);\n const latestFailureMessage = selectLatestEventFailureMessage(branchEvents);\n const latestMessage =\n latestFailureMessage ?? stringValue(branch.message) ?? selectLatestEventMessage(branchEvents);\n const failure = branch.failure ?? selectLatestEventFailure(branchEvents);\n\n return {\n branchId: stringValue(branch.branchId) ?? branchId,\n ...(stringValue(branch.requestedBranchId) === undefined\n ? {}\n : { requestedBranchId: stringValue(branch.requestedBranchId) }),\n ...(stringValue(branch.parentBranchId) === undefined\n ? {}\n : { parentBranchId: stringValue(branch.parentBranchId) }),\n ...(stringValue(branch.status) === undefined ? {} : { status: stringValue(branch.status) }),\n ...(stringValue(branch.workflowId) === undefined\n ? {}\n : { workflowId: stringValue(branch.workflowId) }),\n ...(numberValue(branch.latestStepIndex) === undefined\n ? {}\n : { latestStepIndex: numberValue(branch.latestStepIndex) }),\n ...(stringValue(branch.latestStepId) === undefined\n ? {}\n : { latestStepId: stringValue(branch.latestStepId) }),\n ...(latestMessage === undefined ? {} : { latestMessage }),\n ...(branch.wait === undefined ? {} : { wait: branch.wait }),\n ...(failure === undefined ? {} : { failure }),\n ...(branch.output === undefined ? {} : { output: branch.output }),\n };\n}\n\nasync function readJsonObject(path: string): Promise<PlainObject | undefined> {\n try {\n const value = JSON.parse(await readFile(path, \"utf8\")) as unknown;\n return isPlainObject(value) ? value : {};\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nfunction selectLatestEventMessage(events: readonly Event[]): string | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n const message = stringValue(event?.payload.message);\n if (message !== undefined) {\n return message;\n }\n const failureMessage = isPlainObject(event?.payload.failure)\n ? stringValue(event.payload.failure.message)\n : undefined;\n if (failureMessage !== undefined) {\n return failureMessage;\n }\n }\n return undefined;\n}\n\nfunction selectLatestEventFailureMessage(events: readonly Event[]): string | undefined {\n const failure = selectLatestEventFailure(events);\n return isPlainObject(failure) ? stringValue(failure.message) : undefined;\n}\n\nfunction selectLatestEventFailure(events: readonly Event[]): unknown {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const failure = events[index]?.payload.failure;\n if (failure !== undefined) {\n return failure;\n }\n }\n return undefined;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n","import { parseStorageLifecycleDurationDays } from \"../../runtime/storage-lifecycle/storage-lifecycle.js\";\nimport type { TrailStepStorageConfig } from \"../targeting.types.js\";\nimport { isRecord, parseOptionalStringArray } from \"./parse-utils.js\";\n\nconst VALID_RUN_ON = new Set([\"run\", \"open\", \"runs\"]);\n\nexport function parseStorageConfig(\n value: unknown,\n diagnostics: string[],\n): TrailStepStorageConfig | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value)) {\n diagnostics.push(\"storage must be an object when present.\");\n return undefined;\n }\n\n const lifecycle = parseLifecycleConfig(value.lifecycle, diagnostics);\n return lifecycle === undefined ? {} : { lifecycle };\n}\n\nfunction parseLifecycleConfig(\n value: unknown,\n diagnostics: string[],\n): NonNullable<TrailStepStorageConfig[\"lifecycle\"]> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value)) {\n diagnostics.push(\"storage.lifecycle must be an object when present.\");\n return undefined;\n }\n\n const runOn = parseOptionalStringArray(\"storage.lifecycle.runOn\", value.runOn, diagnostics);\n if (runOn !== undefined) {\n for (const entry of runOn) {\n if (!VALID_RUN_ON.has(entry)) {\n diagnostics.push(\"storage.lifecycle.runOn entries must be one of run, open, or runs.\");\n break;\n }\n }\n }\n\n if (value.enabled !== undefined && typeof value.enabled !== \"boolean\") {\n diagnostics.push(\"storage.lifecycle.enabled must be a boolean when present.\");\n }\n if (\n value.throttle !== undefined &&\n value.throttle !== false &&\n typeof value.throttle !== \"string\"\n ) {\n diagnostics.push(\"storage.lifecycle.throttle must be a string or false when present.\");\n }\n\n const retention = parseRetentionConfig(\"storage.lifecycle\", value, diagnostics);\n const workflows = parseWorkflowRetentionConfigs(value.workflows, diagnostics);\n\n return {\n ...(typeof value.enabled === \"boolean\" ? { enabled: value.enabled } : {}),\n ...(runOn === undefined ? {} : { runOn: runOn as readonly (\"run\" | \"open\" | \"runs\")[] }),\n ...(value.throttle === undefined ||\n (value.throttle !== false && typeof value.throttle !== \"string\")\n ? {}\n : { throttle: value.throttle }),\n ...(retention === undefined ? {} : retention),\n ...(workflows === undefined ? {} : { workflows }),\n };\n}\n\nfunction parseWorkflowRetentionConfigs(\n value: unknown,\n diagnostics: string[],\n): NonNullable<NonNullable<TrailStepStorageConfig[\"lifecycle\"]>[\"workflows\"]> | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!isRecord(value)) {\n diagnostics.push(\"storage.lifecycle.workflows must be an object when present.\");\n return undefined;\n }\n\n const workflows: Record<\n string,\n NonNullable<NonNullable<TrailStepStorageConfig[\"lifecycle\"]>[\"workflows\"]>[string]\n > = {};\n for (const [workflowId, config] of Object.entries(value)) {\n const parsed = parseRetentionConfig(\n `storage.lifecycle.workflows.${workflowId}`,\n config,\n diagnostics,\n );\n if (parsed !== undefined) {\n workflows[workflowId] = parsed;\n }\n }\n return workflows;\n}\n\nfunction parseRetentionConfig(\n path: string,\n value: unknown,\n diagnostics: string[],\n): NonNullable<NonNullable<TrailStepStorageConfig[\"lifecycle\"]>[\"workflows\"]>[string] | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!isRecord(value)) {\n diagnostics.push(`${path} must be an object when present.`);\n return undefined;\n }\n\n validateDurationOrFalse(`${path}.compressAfter`, value.compressAfter, diagnostics);\n validateDurationOrFalse(`${path}.deleteAfter`, value.deleteAfter, diagnostics);\n\n return {\n ...(value.compressAfter === undefined ||\n (value.compressAfter !== false && typeof value.compressAfter !== \"string\")\n ? {}\n : { compressAfter: value.compressAfter }),\n ...(value.deleteAfter === undefined ||\n (value.deleteAfter !== false && typeof value.deleteAfter !== \"string\")\n ? {}\n : { deleteAfter: value.deleteAfter }),\n };\n}\n\nfunction validateDurationOrFalse(path: string, value: unknown, diagnostics: string[]): void {\n if (value === undefined || value === false) {\n return;\n }\n if (typeof value === \"string\" && parseStorageLifecycleDurationDays(value) !== undefined) {\n return;\n }\n diagnostics.push(\n `${path} must be a duration string (for example 7d, 12h, or 2w) or false when present.`,\n );\n}\n","import type { TrailStepSettings } from \"../targeting.types.js\";\nimport { parseAgentMappings } from \"./parse-agent-mappings.js\";\nimport type { RawTrailStepAgentMappings } from \"./parse-agent-targets.js\";\nimport { parseSettings } from \"./parse-settings.js\";\nimport { isRecord } from \"./parse-utils.js\";\n\nexport interface RawTrailStepWorkflowConfig {\n readonly agents?: RawTrailStepAgentMappings;\n readonly settings?: TrailStepSettings;\n}\n\nexport function parseWorkflows(\n value: unknown,\n diagnostics: string[],\n): Record<string, RawTrailStepWorkflowConfig> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const workflows: Record<string, RawTrailStepWorkflowConfig> = {};\n\n if (!isRecord(value)) {\n diagnostics.push(\"workflows must be an object when present.\");\n return workflows;\n }\n\n for (const [workflowId, workflow] of Object.entries(value)) {\n if (!isRecord(workflow)) {\n diagnostics.push(`workflows.${workflowId} must be an object.`);\n continue;\n }\n\n const agents =\n workflow.agents === undefined\n ? undefined\n : parseAgentMappings(`workflows.${workflowId}.agents`, workflow.agents, diagnostics);\n\n const settings = parseSettings(\n `workflows.${workflowId}.settings`,\n workflow.settings,\n diagnostics,\n );\n\n workflows[workflowId] = {\n ...(agents === undefined ? {} : { agents }),\n ...(settings === undefined ? {} : { settings }),\n };\n }\n\n return workflows;\n}\n","import { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type { RawTrailStepAgentMappings, RawTrailStepAgentTarget } from \"./parse-agent-targets.js\";\nimport type { RawTrailStepWorkflowConfig } from \"./parse-workflow-agent-mappings.js\";\n\nexport function validateProviderReferences(options: {\n readonly agents: RawTrailStepAgentMappings;\n readonly workflows: Readonly<Record<string, RawTrailStepWorkflowConfig>> | undefined;\n readonly providerNames: Set<string>;\n}): void {\n const providerViolations: string[] = [];\n\n validateAgentMappings(\"agents\", options.agents, options.providerNames, providerViolations);\n\n if (options.workflows !== undefined) {\n for (const [workflowId, workflow] of Object.entries(options.workflows)) {\n validateAgentMappings(\n `workflows.${workflowId}.agents`,\n workflow.agents,\n options.providerNames,\n providerViolations,\n );\n }\n }\n\n if (providerViolations.length > 0) {\n throw new TrailStepFailureError({\n code: \"agent_provider_unknown\",\n message:\n \"One or more agent targets reference a provider that is not declared under customProviders/providers.\",\n details: { diagnostics: providerViolations },\n });\n }\n}\n\nfunction validateAgentMappings(\n path: string,\n mappings: RawTrailStepAgentMappings | undefined,\n providerNames: Set<string>,\n diagnostics: string[],\n): void {\n if (mappings === undefined) {\n return;\n }\n\n for (const [name, targets] of Object.entries(mappings)) {\n validateTargetReferences(`${path}.${name}`, targets, providerNames, diagnostics);\n }\n}\n\nfunction validateTargetReferences(\n path: string,\n targets: readonly RawTrailStepAgentTarget[],\n providerNames: Set<string>,\n diagnostics: string[],\n): void {\n for (const [index, target] of targets.entries()) {\n if (!(\"provider\" in target)) {\n continue;\n }\n\n if (!providerNames.has(target.provider)) {\n diagnostics.push(\n `${path}[${index}].provider references unknown provider '${target.provider}'. Declare it under customProviders/providers.`,\n );\n }\n }\n}\n","import {\n parseTrailStepProviderRegistrations,\n type TrailStepProviderRegistration,\n} from \"../../providers/provider-manifest.js\";\nimport type { TrailStepConfig } from \"../targeting.types.js\";\nimport { expandAgentRefs } from \"./expand-agent-refs.js\";\nimport { parseAgentMappings } from \"./parse-agent-mappings.js\";\nimport { parseCustomProviders } from \"./parse-custom-providers.js\";\nimport { parseSettings } from \"./parse-settings.js\";\nimport { parseStorageConfig } from \"./parse-storage-config.js\";\nimport { isRecord, throwValidationFailure } from \"./parse-utils.js\";\nimport { parseWorkflows } from \"./parse-workflow-agent-mappings.js\";\nimport { validateProviderReferences } from \"./validate-provider-references.js\";\n\nexport type ParsedTrailStepConfig = TrailStepConfig & {\n readonly providers: NonNullable<TrailStepConfig[\"providers\"]>;\n};\n\nconst parsedConfigs = new WeakSet<TrailStepConfig>();\n\nexport function isParsedTrailStepConfig(value: unknown): value is TrailStepConfig {\n return isRecord(value) && parsedConfigs.has(value as unknown as TrailStepConfig);\n}\n\nexport function parseTrailStepConfig(value: unknown): ParsedTrailStepConfig {\n const diagnostics: string[] = [];\n\n if (!isRecord(value)) {\n throwValidationFailure([\"config must be an object.\"]);\n }\n\n if (value.version !== 1) {\n diagnostics.push(\"version must be 1.\");\n }\n\n const customProviders = parseCustomProviders(value.customProviders, diagnostics);\n const providers = parseTrailStepProviderRegistrations(\"providers\", value.providers, diagnostics);\n for (const providerId of Object.keys(customProviders)) {\n if (providers[providerId] !== undefined) {\n diagnostics.push(\n `providers.${providerId} conflicts with legacy customProviders.${providerId}. Rename one provider id or migrate customProviders.${providerId} to providers.${providerId}.`,\n );\n }\n }\n const compatibilityProviders = legacyCustomProvidersAsRegistrations(customProviders);\n const providerNames = new Set([\n ...Object.keys(customProviders),\n ...Object.keys(providers),\n ...Object.keys(compatibilityProviders),\n ]);\n const agents = parseAgentMappings(\"agents\", value.agents, diagnostics);\n const settings = parseSettings(\"settings\", value.settings, diagnostics);\n const storage = parseStorageConfig(value.storage, diagnostics);\n const workflows = parseWorkflows(value.workflows, diagnostics);\n\n if (diagnostics.length > 0) {\n throwValidationFailure(diagnostics);\n }\n\n validateProviderReferences({ agents, workflows, providerNames });\n const expanded = expandAgentRefs({ agents, workflows });\n\n const unifiedProviders = { ...compatibilityProviders, ...providers };\n const config = {\n version: 1,\n customProviders,\n ...(Object.keys(providers).length === 0 ? {} : { providers: unifiedProviders }),\n agents: expanded.agents,\n ...(settings === undefined ? {} : { settings }),\n ...(storage === undefined ? {} : { storage }),\n ...(expanded.workflows === undefined ? {} : { workflows: expanded.workflows }),\n } as ParsedTrailStepConfig;\n\n if (Object.keys(providers).length === 0) {\n Object.defineProperty(config, \"providers\", { value: unifiedProviders, enumerable: false });\n }\n\n parsedConfigs.add(config);\n\n return config;\n}\n\nfunction legacyCustomProvidersAsRegistrations(\n customProviders: Record<string, TrailStepConfig[\"customProviders\"][string]>,\n): Record<string, TrailStepProviderRegistration> {\n return Object.fromEntries(\n Object.entries(customProviders).map(([id, provider]) => [\n id,\n {\n source: { type: \"legacy-custom-provider\" },\n manifest: {\n schemaVersion: 1,\n id,\n displayName: id,\n working: {\n supported: true,\n command: provider.binary,\n ...(provider.args === undefined ? {} : { args: provider.args }),\n prompt: { kind: \"prompt-file\" },\n output: { style: \"provider-output-file\" },\n },\n interactive: provider.interactiveArgs\n ? {\n supported: true,\n command: provider.binary,\n args: provider.interactiveArgs,\n }\n : { supported: false, reason: \"interactiveArgs is not declared\" },\n model: provider.model ?? { supported: false },\n thinking: provider.thinking ?? { supported: false },\n ...(provider.cwd === undefined ? {} : { cwd: provider.cwd }),\n ...(provider.env === undefined ? {} : { env: provider.env }),\n },\n } as TrailStepProviderRegistration,\n ]),\n );\n}\n","import { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type { ResolveAgentTargetsOptions, TrailStepAgentTarget } from \"../targeting.types.js\";\n\nexport function resolveAgentTargets(\n options: ResolveAgentTargetsOptions,\n): readonly TrailStepAgentTarget[] {\n const workflowMappings = options.config.workflows?.[options.workflowId]?.agents;\n\n const topLevelAgentKeys = uniqueAgentKeys([options.roleName, options.roleSize, \"default\"]);\n const targetLists = [\n workflowMappings?.[options.roleName],\n ...topLevelAgentKeys.map((key) => options.config.agents[key]),\n ];\n\n const targets = targetLists.flatMap((targets) =>\n targets && targets.length > 0 ? [...targets] : [],\n );\n\n if (targets.length > 0) {\n return targets;\n }\n\n throw new TrailStepFailureError({\n code: \"agent_targets_unavailable\",\n message: `No agent targets found for role ${options.roleName} with size ${options.roleSize} in workflow ${options.workflowId}.`,\n details: {\n roleName: options.roleName,\n roleSize: options.roleSize,\n workflowId: options.workflowId,\n },\n });\n}\n\nfunction uniqueAgentKeys(keys: readonly string[]): readonly string[] {\n return keys.filter((key, index) => keys.indexOf(key) === index);\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { RunContext } from \"../../contracts/run-context/run-context.types.js\";\n\n/**\n * A module-scoped `new AsyncLocalStorage()` is not safe here: the CLI's\n * direct-file workflow resolver loads workflow source through `tsx`'s\n * `tsImport`, which re-transpiles and re-evaluates everything reachable from\n * that entry point -- including this module -- as a second, independent\n * instantiation, even though it's the exact same file on disk. Two distinct\n * `AsyncLocalStorage` objects never see each other's stores no matter how\n * carefully `.run(...)` is nested, so `run-workflow.ts`/`with-step-context.ts`\n * (loaded the normal way) and a workflow's own step code (loaded via\n * `tsImport`) would silently end up talking to two different storages.\n * Keying the single instance off a well-known symbol on `globalThis` -- shared\n * by every module instantiation within the same process/realm -- keeps them\n * talking to the same storage regardless of which loader touched this file.\n */\nconst RUN_CONTEXT_STORAGE_KEY = Symbol.for(\"trailstep.core.runContextStorage\");\n\ninterface GlobalWithRunContextStorage {\n [RUN_CONTEXT_STORAGE_KEY]?: AsyncLocalStorage<RunContext>;\n}\n\nconst globalScope = globalThis as GlobalWithRunContextStorage;\n\nfunction getOrCreateRunContextStorage(): AsyncLocalStorage<RunContext> {\n const existing = globalScope[RUN_CONTEXT_STORAGE_KEY];\n if (existing) {\n return existing;\n }\n\n const created = new AsyncLocalStorage<RunContext>();\n globalScope[RUN_CONTEXT_STORAGE_KEY] = created;\n return created;\n}\n\nexport const runContextStorage: AsyncLocalStorage<RunContext> = getOrCreateRunContextStorage();\n\nexport function currentRunContext(): RunContext {\n const runContext = runContextStorage.getStore();\n if (!runContext) {\n throw new Error(\"state.* called outside an active TrailStep run.\");\n }\n\n return runContext;\n}\n","import { TrailStepFailureError, validationFailure } from \"../../contracts/failures/failure.js\";\nimport type { ValidationDiagnostic } from \"../../contracts/shapes/shape.types.js\";\nimport { writeDocumentArtifact } from \"../../runtime/artifacts/run-storage.js\";\nimport { currentRunContext } from \"../../runtime/run-context/run-context-storage.js\";\n\n/**\n * A captured document artifact. `Document` doubles as its own\n * `Schema<Document>`: `validate`/`diagnostics`/`assert`/`jsonSchema`/\n * `captureMode` are static members, so passing the class itself as\n * `.prompt(source, { output: Document })` gives both the TypeScript output\n * type and the runtime validator from one symbol -- no separate schema\n * constant to import or keep in sync.\n */\nexport class Document {\n // Index signature satisfies the `PlainObject` (`Record<string, unknown>`)\n // constraint required by `Schema<T extends PlainObject>` — a plain class\n // with only named properties does not structurally provide one otherwise.\n [key: string]: unknown;\n\n static readonly captureMode = \"raw-text\" as const;\n\n static readonly jsonSchema: Record<string, unknown> = {\n type: \"string\",\n description: \"Document content, captured as raw text.\",\n };\n\n static validate(value: unknown): value is Document {\n return isDocumentLike(value);\n }\n\n static diagnostics(value: unknown): readonly ValidationDiagnostic[] {\n if (isDocumentLike(value)) {\n return [];\n }\n\n return [\n { path: \"/\", message: \"must be a document (an object with string content and path fields)\" },\n ];\n }\n\n /**\n * Deliberately duck-types instead of checking `instanceof Document`: on\n * resume, a completed step's recorded output is replayed from\n * `events.jsonl` via `JSON.parse`, producing a plain deserialized object —\n * never a live `Document` instance — before `assert` is called on it. An\n * `instanceof` check would fail every such replay. `assert` reconstructs a\n * genuine `Document` from any content/path-shaped value, so every\n * consumer downstream — a live capture or a replayed value alike — always\n * receives a real `Document` instance with working prototype methods.\n */\n static assert(value: unknown, label = \"value\"): Document {\n const valueDiagnostics = Document.diagnostics(value);\n\n if (valueDiagnostics.length > 0 || !isDocumentLike(value)) {\n throw new TrailStepFailureError(\n validationFailure(\n `${label} failed schema validation: ${formatDiagnostics(valueDiagnostics)}`,\n {\n diagnostics: valueDiagnostics,\n },\n ),\n );\n }\n\n return new Document(value.content, value.path);\n }\n\n constructor(\n public readonly content: string,\n public readonly path: string,\n ) {}\n}\n\n/**\n * Captures `content` as a durable document artifact for the currently\n * executing step. Must be called from within a step's `.do()` callback —\n * it reads the step-scoped ambient context (`RunContext.currentStep`, set\n * by `withStepContext` for the duration of the step) to determine both the\n * directory to write into and this call's 1-based index within the step, so\n * that a step calling `document(...)` more than once gets\n * `document-1.md`, `document-2.md`, etc.\n */\nexport async function document(content: string): Promise<Document> {\n const { currentStep } = currentRunContext();\n\n if (!currentStep) {\n throw new Error(\n \"document(...) must be called from within a step's `.do()` callback; no active step context was found.\",\n );\n }\n\n const index = currentStep.nextDocumentIndex();\n const path = await writeDocumentArtifact(currentStep.dir, `document-${index}.md`, content);\n\n return new Document(content, path);\n}\n\nfunction isDocumentLike(value: unknown): value is { content: string; path: string } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as Record<string, unknown>).content === \"string\" &&\n typeof (value as Record<string, unknown>).path === \"string\"\n );\n}\n\nfunction formatDiagnostics(diagnostics: readonly ValidationDiagnostic[]): string {\n return diagnostics.map((diagnostic) => `${diagnostic.path} ${diagnostic.message}`).join(\"; \");\n}\n","import { currentRunContext } from \"../../runtime/run-context/run-context-storage.js\";\n\n/** Ambient handle onto the active run's track-scoped durable key-value store. */\nexport const globalState = {\n async get<T = unknown>(key: string): Promise<T | undefined> {\n return currentRunContext().globalState.get<T>(key);\n },\n async set(key: string, value: unknown): Promise<void> {\n await currentRunContext().globalState.set(key, value);\n },\n async update<T = unknown>(\n key: string,\n updater: (current: T | undefined) => T | Promise<T>,\n ): Promise<T> {\n return await currentRunContext().globalState.update<T>(key, updater);\n },\n};\n","import { randomUUID } from \"node:crypto\";\n\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport type { Event } from \"../../runtime/run-workflow/run-workflow.types.js\";\n\nexport function createEvent(options: {\n readonly runId: string;\n readonly workflowId: string;\n readonly stepId?: string;\n readonly type: Event[\"type\"];\n readonly payload?: PlainObject;\n}): Event {\n return {\n id: `evt_${randomUUID()}`,\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: options.stepId,\n type: options.type,\n timestamp: new Date().toISOString(),\n schemaVersion: \"v0\",\n payload: options.payload ?? {},\n };\n}\n","import type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport { createEvent } from \"../../runtime/events/create-run-event.js\";\nimport { runContextStorage } from \"../../runtime/run-context/run-context-storage.js\";\n\nexport interface NotifyArtifact {\n readonly path: string;\n readonly mediaType?: string;\n readonly data?: PlainObject;\n}\n\nexport interface NotifyApi {\n progress(message: string, data?: PlainObject): Promise<void>;\n warning(message: string, data?: PlainObject): Promise<void>;\n artifact(name: string, artifact: NotifyArtifact): Promise<void>;\n}\n\nexport const notify: NotifyApi = {\n async progress(message, data) {\n await emitNotification(\"step.progress\", { message, ...(data === undefined ? {} : { data }) });\n },\n async warning(message, data) {\n await emitNotification(\"step.warning\", { message, ...(data === undefined ? {} : { data }) });\n },\n async artifact(name, artifact) {\n await emitNotification(\"step.artifact\", {\n name,\n path: artifact.path,\n ...(artifact.mediaType === undefined ? {} : { mediaType: artifact.mediaType }),\n ...(artifact.data === undefined ? {} : { data: artifact.data }),\n });\n },\n};\n\nasync function emitNotification(\n type: \"step.progress\" | \"step.warning\" | \"step.artifact\",\n payload: PlainObject,\n): Promise<void> {\n const runContext = runContextStorage.getStore();\n if (!runContext?.workflowId || !runContext.emit) {\n throw new Error(\"notify.* called outside an active TrailStep run.\");\n }\n\n await runContext.emit(\n createEvent({\n runId: runContext.id,\n workflowId: runContext.workflowId,\n ...(runContext.currentStep === undefined ? {} : { stepId: runContext.currentStep.id }),\n type,\n payload,\n }),\n );\n}\n","import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/**\n * Synchronously reads each named file relative to `dir` and returns its\n * trimmed content keyed the same way, so a step's `prompt.ts` can load all\n * of its shared markdown fragments in one call:\n * `loadFragments(import.meta.dirname, { methodology: \"../shared/methodology.md\" })`.\n */\nexport function loadFragments<TKey extends string>(\n dir: string,\n files: Record<TKey, string>,\n): Record<TKey, string> {\n const fragments = {} as Record<TKey, string>;\n\n for (const key of Object.keys(files) as TKey[]) {\n fragments[key] = readFileSync(join(dir, files[key]), \"utf8\").trimEnd();\n }\n\n return fragments;\n}\n\n/**\n * Renders `body` as a `## title` markdown section, or `undefined` when\n * `body` is falsy -- so a conditional section can be inlined directly as a\n * `promptSections(...)` argument instead of built up separately.\n */\nexport function section(\n title: string,\n body: string | false | null | undefined,\n): string | undefined {\n return body ? `## ${title}\\n\\n${body.trimEnd()}` : undefined;\n}\n\n/**\n * Joins prompt fragments and `section(...)` results with a blank line\n * between each, dropping any falsy (conditionally-omitted) part.\n */\nexport function promptSections(...parts: ReadonlyArray<string | false | null | undefined>): string {\n return parts.filter((part): part is string => Boolean(part)).join(\"\\n\\n\");\n}\n\n/** Renders `items` as a markdown bullet list, one `- item` per line. */\nexport function list(items: readonly string[]): string {\n return items.map((item) => `- ${item}`).join(\"\\n\");\n}\n","import type { PromptTemplateSource } from \"../step/continuation.types.js\";\n\n/** Loads a step's prompt from a local text file, resolved relative to the workflow/project `cwd` at dispatch time. */\nexport function promptTemplate(path: string): PromptTemplateSource {\n return { kind: \"promptTemplate\", path };\n}\n","import { Ajv, type ErrorObject, type JSONSchemaType } from \"ajv/dist/ajv.js\";\n\nimport { TrailStepFailureError, validationFailure } from \"../../contracts/failures/failure.js\";\nimport type {\n PlainObject,\n Schema,\n ShapeInput,\n ShapeObject,\n ValidationDiagnostic,\n} from \"../../contracts/shapes/shape.types.js\";\n\nexport type JsonSchemaObject = JSONSchemaType<PlainObject> | Record<string, unknown>;\n\nconst ajv = new Ajv({ allErrors: true });\n\nexport function normalizeShape<T extends PlainObject>(shapeInput: ShapeInput<T>): Schema<T> {\n if (isSchema(shapeInput)) {\n return shapeInput;\n }\n\n return shape<T>(shapeInput);\n}\n\nexport function shape<T extends PlainObject>(shapeObject: ShapeObject): Schema<T> {\n return jsonSchema<T>({\n type: \"object\",\n properties: Object.fromEntries(\n Object.entries(shapeObject).map(([key, type]) => [key, { type }]),\n ),\n required: Object.keys(shapeObject),\n additionalProperties: false,\n });\n}\n\nexport function jsonSchema<T extends PlainObject>(schema: JsonSchemaObject): Schema<T> {\n const validateWithAjv = ajv.compile(schema);\n\n return {\n validate(value: unknown): value is T {\n return validateWithAjv(value);\n },\n diagnostics(value: unknown): readonly ValidationDiagnostic[] {\n if (!isPlainObject(value)) {\n return [{ path: \"/\", message: \"must be a plain object\" }];\n }\n\n if (validateWithAjv(value)) {\n return [];\n }\n\n return diagnosticsFromAjvErrors(validateWithAjv.errors);\n },\n assert(value: unknown, label = \"value\"): T {\n const diagnostics = this.diagnostics(value);\n\n if (diagnostics.length > 0) {\n throw new TrailStepFailureError(\n validationFailure(\n `${label} failed schema validation: ${formatDiagnostics(diagnostics)}`,\n { diagnostics },\n ),\n );\n }\n\n return value as T;\n },\n jsonSchema: schema as Record<string, unknown>,\n };\n}\n\nfunction isSchema<T extends PlainObject>(value: ShapeInput<T>): value is Schema<T> {\n // Checked structurally rather than via `isPlainObject` so that a class\n // carrying its schema as static members (e.g. `Document`) -- a function,\n // not a plain object -- is recognized as a `Schema<T>` too.\n if (value === null || (typeof value !== \"object\" && typeof value !== \"function\")) {\n return false;\n }\n\n const candidate = value as Record<string, unknown>;\n\n return (\n typeof candidate.validate === \"function\" &&\n typeof candidate.diagnostics === \"function\" &&\n typeof candidate.assert === \"function\"\n );\n}\n\nexport function isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\nfunction diagnosticsFromAjvErrors(\n errors: ErrorObject[] | null | undefined,\n): readonly ValidationDiagnostic[] {\n if (!errors || errors.length === 0) {\n return [{ path: \"/\", message: \"is invalid\" }];\n }\n\n return errors.map((error) => ({\n path: error.instancePath || \"/\",\n message: error.message ?? \"is invalid\",\n }));\n}\n\nfunction formatDiagnostics(diagnostics: readonly ValidationDiagnostic[]): string {\n return diagnostics.map((diagnostic) => `${diagnostic.path} ${diagnostic.message}`).join(\"; \");\n}\n","import { currentRunContext } from \"../../runtime/run-context/run-context-storage.js\";\n\n/**\n * Ambient handle onto the active run's identity and durable key-value store.\n * Backed by AsyncLocalStorage, set once per run by `runWorkflow`; step\n * continuations import this directly rather than receiving it as an argument.\n */\nexport const state = {\n async get<T = unknown>(key: string): Promise<T | undefined> {\n return currentRunContext().state.get<T>(key);\n },\n async getPersisted<T = unknown>(key: string): Promise<T | undefined> {\n return currentRunContext().state.getPersisted<T>(key);\n },\n async set(key: string, value: unknown): Promise<void> {\n const context = currentRunContext();\n await context.state.set(key, value, {\n persist: context.currentStep?.replay?.kind !== \"completed-step\",\n });\n },\n get id(): string {\n return currentRunContext().id;\n },\n get name(): string {\n return currentRunContext().name;\n },\n get path(): string {\n return currentRunContext().path;\n },\n get cwd(): string | undefined {\n return currentRunContext().cwd;\n },\n get executionCwd(): string | undefined {\n return currentRunContext().executionCwd ?? currentRunContext().cwd;\n },\n get isReplayingCompletedStep(): boolean {\n return currentRunContext().currentStep?.replay?.kind === \"completed-step\";\n },\n get projectCwd(): string | undefined {\n return currentRunContext().projectCwd;\n },\n};\n","import type { AgentPrompt } from \"../../contracts/agents/agent-adapter.types.js\";\nimport type { Failure } from \"../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport type {\n AbsoluteDoneNode,\n AbsoluteFailNode,\n CheckWaitCallback,\n ContinuationArray,\n ContinuationStepConfig,\n DisplayPhase,\n DoneNode,\n DoPhase,\n FailNode,\n ParallelNode,\n ParallelOptions,\n PostContinuation,\n PromptOptions,\n PromptPhase,\n PromptTemplateSource,\n StepConfig,\n StepContextContinuation,\n StepContinuation,\n StepDisplayContent,\n StepErrorContinuation,\n StepFactory,\n StepInvocationOptions,\n StepNode,\n StepPhase,\n TerminalMessageOptions,\n WaitInput,\n WaitOptions,\n WaitPhase,\n WorkflowInvocationNode,\n} from \"../step/continuation.types.js\";\n\n/**\n * The only step-authoring primitive. `.prompt(...)` is optional; when present,\n * the step dispatches to an agent and `.do(...)` receives its structured\n * output. When absent, nothing is dispatched -- `.do(...)` receives the\n * step's input directly and is responsible for the work and the continuation\n * in one function. Either way, `.do(...)` produces a reusable `StepFactory`\n * -- call it with a live input value (`stepA(input)`) to get a `StepNode`.\n * When the inferred input type has no required keys, the argument is\n * optional (`stepA()`) and defaults to `{}`.\n */\ninterface StepBuilder {\n display(\n content?: StepDisplayContent<PlainObject, PlainObject>,\n options?: PlainObject,\n ): StepBuilder;\n wait(wait: WaitInput<PlainObject, PlainObject>): StepBuilder;\n wait<TWaitOutput extends PlainObject = PlainObject>(\n wait: CheckWaitCallback<PlainObject, PlainObject, TWaitOutput>,\n options: WaitOptions<TWaitOutput>,\n ): StepBuilder;\n prompt<TInput extends PlainObject = PlainObject, TOutput extends PlainObject = PlainObject>(\n source: AgentPrompt<TInput> | PromptTemplateSource,\n options?: PromptOptions<TOutput>,\n ): PromptedStepBuilder<TInput, TOutput>;\n do<TInput extends PlainObject = PlainObject>(\n onOutput: StepContextContinuation<TInput, TInput>,\n ): FluentStepFactory<TInput, TInput>;\n do<TInput extends PlainObject = PlainObject>(\n onOutput: StepContinuation<TInput, TInput>,\n ): FluentStepFactory<TInput, TInput>;\n}\n\ninterface PromptedStepBuilder<\n TInput extends PlainObject = PlainObject,\n TOutput extends PlainObject = PlainObject,\n> {\n display(\n content?: StepDisplayContent<TInput, TOutput>,\n options?: PlainObject,\n ): PromptedStepBuilder<TInput, TOutput>;\n wait(wait: WaitInput<TInput, TOutput>): PromptedStepBuilder<TInput, TOutput>;\n wait<TWaitOutput extends PlainObject = PlainObject>(\n wait: CheckWaitCallback<TInput, TOutput, TWaitOutput>,\n options: WaitOptions<TWaitOutput>,\n ): PromptedStepBuilder<TInput, TOutput>;\n do(onOutput: StepContextContinuation<TInput, TOutput>): FluentStepFactory<TInput, TOutput>;\n do(onOutput: StepContinuation<TInput, TOutput>): FluentStepFactory<TInput, TOutput>;\n}\n\ntype FluentStepFactory<\n TInput extends PlainObject = PlainObject,\n TOutput extends PlainObject = PlainObject,\n> = StepFactory<TInput, TOutput> & {\n catch(onError: StepErrorContinuation): FluentStepFactory<TInput, TOutput>;\n display(\n content?: StepDisplayContent<TInput, TOutput>,\n options?: PlainObject,\n ): FluentStepFactory<TInput, TOutput>;\n wait(wait: WaitInput<TInput, TOutput>): FluentStepFactory<TInput, TOutput>;\n wait<TWaitOutput extends PlainObject = PlainObject>(\n wait: CheckWaitCallback<TInput, TOutput, TWaitOutput>,\n options: WaitOptions<TWaitOutput>,\n ): FluentStepFactory<TInput, TOutput>;\n};\n\nexport function step(config: StepConfig): StepBuilder {\n const makeBuilder = (phaseTemplates: readonly StepPhase[] = []): StepBuilder => ({\n display(content, options) {\n return makeBuilder([...phaseTemplates, displayPhase(content, options)]);\n },\n wait(\n wait: WaitInput<PlainObject, PlainObject> | CheckWaitCallback<PlainObject, PlainObject>,\n options?: WaitOptions,\n ) {\n return makeBuilder([...phaseTemplates, waitPhase(wait, options)]);\n },\n prompt<TInput extends PlainObject = PlainObject, TStepOutput extends PlainObject = PlainObject>(\n source: AgentPrompt<TInput> | PromptTemplateSource,\n options?: PromptOptions<TStepOutput>,\n ) {\n assertPromptOptions(options);\n return makePromptedBuilder<TInput, TStepOutput>([\n ...(phaseTemplates as readonly StepPhase<TInput, TStepOutput>[]),\n promptPhase(source, options),\n ]);\n },\n do<TInput extends PlainObject = PlainObject>(onOutput: StepContinuation<TInput, TInput>) {\n return buildFactory<TInput, TInput>(\n [...(phaseTemplates as readonly StepPhase<TInput, TInput>[]), doPhase(onOutput)],\n onOutput,\n );\n },\n });\n\n const makePromptedBuilder = <TInput extends PlainObject, TStepOutput extends PlainObject>(\n phaseTemplates: readonly StepPhase<TInput, TStepOutput>[],\n ): PromptedStepBuilder<TInput, TStepOutput> => ({\n display(content, options) {\n return makePromptedBuilder([...phaseTemplates, displayPhase(content, options)]);\n },\n wait(\n wait: WaitInput<TInput, TStepOutput> | CheckWaitCallback<TInput, TStepOutput>,\n options?: WaitOptions,\n ) {\n return makePromptedBuilder([...phaseTemplates, waitPhase(wait, options)]);\n },\n do(onOutput) {\n return buildFactory([...phaseTemplates, doPhase(onOutput)], onOutput);\n },\n });\n\n const buildFactory = <TInput extends PlainObject, TStepOutput extends PlainObject>(\n phaseTemplates: readonly StepPhase<TInput, TStepOutput>[],\n onOutput: StepContinuation<TInput, TStepOutput> | StepContextContinuation<TInput, TStepOutput>,\n onError?: StepErrorContinuation,\n ): FluentStepFactory<TInput, TStepOutput> => {\n const factory = ((\n input?: TInput,\n options?: StepInvocationOptions,\n ): StepNode<TInput, TStepOutput> => {\n const phases = phaseTemplates.slice();\n const prompt = firstPromptPhase(phases);\n const { branchId: _branchId, ...configOverrides } = options ?? {};\n\n return {\n kind: \"step\",\n config: {\n ...config,\n ...configOverrides,\n ...(prompt ? promptOptionsForConfig(prompt) : {}),\n input: input ?? ({} as TInput),\n } as ContinuationStepConfig<TInput, TStepOutput>,\n phases,\n onOutput: onOutput as StepContinuation<TInput, TStepOutput>,\n onError,\n ...(options === undefined ? {} : { options }),\n };\n }) as FluentStepFactory<TInput, TStepOutput>;\n\n factory.catch = (nextOnError: StepErrorContinuation) =>\n buildFactory(phaseTemplates, onOutput, nextOnError);\n factory.display = (content?: StepDisplayContent<TInput, TStepOutput>, options?: PlainObject) =>\n buildFactory([...phaseTemplates, displayPhase(content, options)], onOutput, onError);\n factory.wait = (\n wait: WaitInput<TInput, TStepOutput> | CheckWaitCallback<TInput, TStepOutput>,\n options?: WaitOptions,\n ) => buildFactory([...phaseTemplates, waitPhase(wait, options)], onOutput, onError);\n\n return factory;\n };\n\n return makeBuilder();\n}\n\nexport function done<TOutput extends PlainObject = PlainObject>(\n output?: TOutput,\n options?: TerminalMessageOptions,\n): DoneNode<TOutput> {\n return {\n kind: \"done\",\n output: output ?? ({} as TOutput),\n ...(options?.message === undefined ? {} : { message: options.message }),\n };\n}\n\nexport function fail(failure: Failure, options?: TerminalMessageOptions): FailNode {\n return {\n kind: \"fail\",\n failure,\n ...(options?.message === undefined ? {} : { message: options.message }),\n };\n}\n\nexport function absoluteDone<TOutput extends PlainObject = PlainObject>(\n output?: TOutput,\n options?: TerminalMessageOptions,\n): AbsoluteDoneNode<TOutput> {\n return {\n kind: \"absoluteDone\",\n output: output ?? ({} as TOutput),\n ...(options?.message === undefined ? {} : { message: options.message }),\n };\n}\n\nexport function absoluteFail(failure: Failure, options?: TerminalMessageOptions): AbsoluteFailNode {\n return {\n kind: \"absoluteFail\",\n failure,\n ...(options?.message === undefined ? {} : { message: options.message }),\n };\n}\n\nexport function parallel<TOutput extends PlainObject = PlainObject>(\n nodes: ContinuationArray,\n options?: ParallelOptions,\n): ParallelNode<TOutput> {\n const makeParallel = (postContinuation?: PostContinuation<TOutput>): ParallelNode<TOutput> => ({\n kind: \"parallel\",\n nodes,\n ...(options === undefined ? {} : { options }),\n ...(postContinuation === undefined ? {} : { postContinuation }),\n post(continuation: PostContinuation<TOutput>) {\n return makeParallel(continuation);\n },\n });\n\n return makeParallel();\n}\n\nexport function isStepNode(value: unknown): value is StepNode {\n return isPlainObject(value) && value.kind === \"step\";\n}\n\nexport function isDoneNode(value: unknown): value is DoneNode {\n return isPlainObject(value) && value.kind === \"done\";\n}\n\nexport function isFailNode(value: unknown): value is FailNode {\n return isPlainObject(value) && value.kind === \"fail\";\n}\n\nexport function isWorkflowInvocationNode(value: unknown): value is WorkflowInvocationNode {\n return isPlainObject(value) && value.kind === \"workflowInvocation\";\n}\n\nexport function isParallelNode(value: unknown): value is ParallelNode {\n return isPlainObject(value) && value.kind === \"parallel\" && Array.isArray(value.nodes);\n}\n\nexport function isAbsoluteDoneNode(value: unknown): value is AbsoluteDoneNode {\n return isPlainObject(value) && value.kind === \"absoluteDone\";\n}\n\nexport function isAbsoluteFailNode(value: unknown): value is AbsoluteFailNode {\n return isPlainObject(value) && value.kind === \"absoluteFail\";\n}\n\n/** Returns a step's ordered phases, synthesizing phases for legacy StepNode-shaped objects. */\nexport function getStepPhases<\n TInput extends PlainObject = PlainObject,\n TOutput extends PlainObject = PlainObject,\n>(node: StepNode<TInput, TOutput>): readonly StepPhase<TInput, TOutput>[] {\n if (Array.isArray(node.phases)) {\n return node.phases;\n }\n\n const phases: StepPhase<TInput, TOutput>[] = [];\n if (node.config.prompt !== undefined) {\n phases.push(\n promptPhase(node.config.prompt, {\n ...(node.config.output === undefined ? {} : { output: node.config.output }),\n ...(node.config.agent === undefined ? {} : { agent: node.config.agent }),\n ...(node.config.mode === undefined ? {} : { mode: node.config.mode }),\n ...(node.config.adapter === undefined ? {} : { adapter: node.config.adapter }),\n ...(node.config.maxSubPrompts === undefined\n ? {}\n : { maxSubPrompts: node.config.maxSubPrompts }),\n }),\n );\n }\n phases.push(doPhase(node.onOutput));\n return phases;\n}\n\nexport function hasPromptPhase(node: StepNode): boolean {\n return getStepPhases(node).some((phase) => phase.kind === \"prompt\");\n}\n\nexport function firstPromptPhase(phases: readonly StepPhase[]): PromptPhase | undefined {\n return phases.find((phase): phase is PromptPhase => phase.kind === \"prompt\");\n}\n\nfunction displayPhase<TInput extends PlainObject, TOutput extends PlainObject>(\n content?: StepDisplayContent<TInput, TOutput>,\n options?: PlainObject,\n): DisplayPhase<TInput, TOutput> {\n return {\n kind: \"display\",\n ...(content === undefined ? {} : { content }),\n ...(options === undefined ? {} : { options }),\n };\n}\n\nfunction waitPhase<TInput extends PlainObject, TOutput extends PlainObject>(\n wait: WaitInput<TInput, TOutput> | CheckWaitCallback<TInput, TOutput>,\n options?: WaitOptions,\n): WaitPhase<TInput, TOutput> {\n return {\n kind: \"wait\",\n wait,\n ...(options === undefined ? {} : { options }),\n };\n}\n\nfunction promptPhase<TInput extends PlainObject, TOutput extends PlainObject>(\n prompt: AgentPrompt<TInput> | PromptTemplateSource,\n options?: PromptOptions<TOutput>,\n): PromptPhase<TInput, TOutput> {\n return {\n kind: \"prompt\",\n ...options,\n prompt,\n };\n}\n\nfunction doPhase<TInput extends PlainObject, TOutput extends PlainObject>(\n onOutput: StepContinuation<TInput, TOutput> | StepContextContinuation<TInput, TOutput>,\n): DoPhase<TInput, TOutput> {\n return { kind: \"do\", onOutput: onOutput as StepContinuation<TInput, TOutput> };\n}\n\nfunction promptOptionsForConfig<TInput extends PlainObject, TOutput extends PlainObject>(\n phase: PromptPhase<TInput, TOutput>,\n): Omit<PromptPhase<TInput, TOutput>, \"kind\"> {\n const { kind: _kind, ...options } = phase;\n return options;\n}\n\nfunction assertPromptOptions(value: unknown): void {\n if (hasRetryOption(value)) {\n throw new TypeError(\"Retry config belongs on step(...), not .prompt(...) options.\");\n }\n\n if (hasTimeoutOption(value)) {\n throw new TypeError(\"Timeout config belongs on step(...), not .prompt(...) options.\");\n }\n}\n\nfunction hasRetryOption(value: unknown): boolean {\n return isPlainObject(value) && \"retry\" in value;\n}\n\nfunction hasTimeoutOption(value: unknown): boolean {\n return isPlainObject(value) && \"timeout\" in value;\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { runAgentStep } from \"../../agent-execution/adapter-agent/run-adapter-agent-step/run-adapter-agent-step.js\";\nimport {\n resolvePromptSource,\n resolveWorkflowAgentRole,\n} from \"../../agent-execution/dispatch-agent-step/dispatch-agent-step.js\";\nimport { runWorkingAgentCommand } from \"../../agent-execution/working-agent/run-working-agent-command.js\";\nimport { normalizeShape } from \"../../authoring/shape/json-schema.js\";\nimport type {\n PromptTemplateSource,\n SubPromptOptions,\n} from \"../../authoring/step/continuation.types.js\";\nimport type { AgentPrompt } from \"../../contracts/agents/agent-adapter.types.js\";\nimport { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport { createEvent } from \"../events/create-run-event.js\";\nimport { runContextStorage } from \"../run-context/run-context-storage.js\";\nimport { resolveSubPromptArtifactPaths } from \"./sub-prompt-artifacts.js\";\nimport {\n emitSubPromptFailed,\n maxSubPromptsGuardError,\n subPromptFailureError,\n throwMissingSubPromptAgentConfig,\n} from \"./sub-prompt-failures.js\";\nimport { fingerprintSubPrompt } from \"./sub-prompt-fingerprint.js\";\nimport { findCompletedSubPromptEvent } from \"./sub-prompt-replay.js\";\n\nexport function resolveMaxSubPrompts(value: unknown): number {\n if (value === undefined) {\n return 25;\n }\n\n if (Number.isInteger(value) && typeof value === \"number\" && value > 0) {\n return value;\n }\n\n throw new TrailStepFailureError({\n code: \"invalid_max_sub_prompts\",\n message: \"maxSubPrompts must be a positive integer.\",\n });\n}\n\nexport async function runSubPrompt<\n TInput extends PlainObject = PlainObject,\n TOutput extends PlainObject = PlainObject,\n>(\n source: AgentPrompt<TInput> | PromptTemplateSource,\n options: SubPromptOptions<TOutput>,\n input?: TInput,\n): Promise<TOutput> {\n const resolvedInput = (input ?? {}) as TInput;\n const context = runContextStorage.getStore();\n if (!context?.currentStep) {\n throw new TrailStepFailureError({\n code: \"sub_prompt_outside_step_context\",\n message: \"subPrompt requires an active TrailStep step run context.\",\n });\n }\n\n if (!context.workflowId || !context.workflowAgents || !context.cwd || !context.emit) {\n throw new TrailStepFailureError({\n code: \"sub_prompt_context_unavailable\",\n message: \"subPrompt requires a full active TrailStep step run context.\",\n });\n }\n\n const parentStep = context.currentStep;\n if (options.output === undefined) {\n throw new TrailStepFailureError({\n code: \"sub_prompt_output_required\",\n message: `subPrompt in step ${parentStep.id} with a prompt requires an output shape`,\n });\n }\n\n const outputSchema = normalizeShape(options.output);\n const ordinal = parentStep.nextSubPromptIndex();\n const maxSubPrompts = resolveMaxSubPrompts(options.maxSubPrompts ?? parentStep.maxSubPrompts);\n if (ordinal > maxSubPrompts) {\n const failureError = maxSubPromptsGuardError(maxSubPrompts);\n await emitSubPromptFailed({\n context,\n parentStepId: parentStep.id,\n ordinal,\n failure: failureError.failure,\n });\n throw failureError;\n }\n\n const renderedPrompt = await resolvePromptSource(\n source,\n resolvedInput,\n context.projectCwd ?? context.cwd,\n );\n const fingerprint = fingerprintSubPrompt({ input: resolvedInput, prompt: renderedPrompt });\n const cachedEvent = findCompletedSubPromptEvent(\n context.events?.() ?? [],\n parentStep.id,\n ordinal,\n fingerprint,\n );\n if (cachedEvent) {\n return outputSchema.assert(cachedEvent.payload.output, \"subPrompt output\");\n }\n\n const artifactPaths = resolveSubPromptArtifactPaths({\n runDir: context.path,\n stepDir: parentStep.dir,\n ordinal,\n fingerprint,\n });\n\n await mkdir(artifactPaths.subPromptDir, { recursive: true });\n await writeFile(artifactPaths.promptFile, renderedPrompt, \"utf8\");\n\n const resolvedRole = resolveWorkflowAgentRole({\n agent: options.agent,\n workflowAgents: context.workflowAgents,\n workflowId: context.workflowId,\n stepId: parentStep.id,\n });\n\n await context.emit(\n createEvent({\n runId: context.id,\n workflowId: context.workflowId,\n stepId: parentStep.id,\n type: \"subPrompt.started\",\n payload: {\n parentStepId: parentStep.id,\n ordinal,\n fingerprint,\n artifactPaths: artifactPaths.runRelative,\n },\n }),\n );\n\n try {\n const agentStep = {\n kind: \"agent\" as const,\n id: `${parentStep.id}.subPrompt.${ordinal}`,\n output: outputSchema,\n prompt: renderedPrompt,\n requirements: resolvedRole.role,\n adapter: options.adapter,\n };\n\n if (!context.trailstepConfig && options.adapter === undefined) {\n throwMissingSubPromptAgentConfig({\n workflowId: context.workflowId,\n parentStepId: parentStep.id,\n subPromptId: agentStep.id,\n agent: resolvedRole.roleName,\n });\n }\n\n const rawOutput =\n context.trailstepConfig && options.adapter === undefined\n ? await runWorkingAgentCommand({\n config: context.trailstepConfig,\n workflowId: context.workflowId,\n roleName: resolvedRole.roleName,\n role: resolvedRole.role,\n step: agentStep,\n renderedPrompt,\n runDir: context.path,\n cwd: context.cwd,\n runner: context.workingAgentProcessRunner,\n providerWorkingRunner: context.providerWorkingRunner,\n stepIndex: ordinal,\n files: {\n stepDir: artifactPaths.subPromptDir,\n promptFile: artifactPaths.promptFile,\n outputFile: artifactPaths.outputFile,\n usageFile: artifactPaths.usageFile,\n workFile: join(artifactPaths.subPromptDir, \"work.txt\"),\n repairPromptFile: join(artifactPaths.subPromptDir, \"repair-prompt.md\"),\n },\n })\n : await runAgentStep({\n step: agentStep,\n input: resolvedInput,\n onToolCall: async (toolCall) => {\n await context.emit?.(\n createEvent({\n runId: context.id,\n workflowId: context.workflowId ?? \"\",\n stepId: parentStep.id,\n type: \"agent.toolCall\",\n payload: { ...toolCall },\n }),\n );\n },\n });\n\n const output = outputSchema.assert(rawOutput, \"subPrompt output\");\n await writeFile(artifactPaths.outputFile, `${JSON.stringify(output, null, 2)}\\n`, \"utf8\");\n\n await context.emit(\n createEvent({\n runId: context.id,\n workflowId: context.workflowId,\n stepId: parentStep.id,\n type: \"subPrompt.completed\",\n payload: {\n parentStepId: parentStep.id,\n ordinal,\n fingerprint,\n output,\n artifactPaths: artifactPaths.runRelative,\n },\n }),\n );\n\n return output;\n } catch (error) {\n const failureError = subPromptFailureError(error);\n await emitSubPromptFailed({\n context,\n parentStepId: parentStep.id,\n ordinal,\n fingerprint,\n artifactPaths: artifactPaths.runRelative,\n failure: failureError.failure,\n });\n throw failureError;\n }\n}\n","import type { AgentStepRequestConfig } from \"../../../authoring/step/agent-step.types.js\";\nimport type {\n AgentAdapter,\n AgentAdapterSelection,\n AgentPrompt,\n AgentTool,\n} from \"../../../contracts/agents/agent-adapter.types.js\";\nimport type { AgentModelTarget } from \"../../../contracts/agents/agent-role.types.js\";\nimport { TrailStepFailureError } from \"../../../contracts/failures/failure.js\";\nimport type { PlainObject, Schema } from \"../../../contracts/shapes/shape.types.js\";\n\nconst PROVIDER_NEUTRAL_ADAPTER_KEY = \"custom\";\nconst PROVIDER_NEUTRAL_MODEL = \"configured-agent\";\n\nexport interface AgentToolCallEvent {\n readonly name: string;\n readonly input: PlainObject;\n readonly output: PlainObject;\n}\n\nexport interface RunAgentStepOptions<\n TInput extends PlainObject = PlainObject,\n TOutput extends PlainObject = PlainObject,\n> {\n readonly step: AgentStepRequestConfig<TInput, TOutput>;\n readonly input: TInput;\n readonly onToolCall?: (event: AgentToolCallEvent) => void | Promise<void>;\n}\n\nexport async function runAgentStep<\n TInput extends PlainObject = PlainObject,\n TOutput extends PlainObject = PlainObject,\n>(options: RunAgentStepOptions<TInput, TOutput>): Promise<PlainObject> {\n const model = resolveAgentRequirements(options.step.requirements);\n const adapter = resolveAgentAdapter(options.step.adapter);\n let submittedOutput: PlainObject | undefined;\n\n const tools: AgentTool<TOutput>[] = [\n createSubmitOutputTool(options.step.output, async (output) => {\n options.step.output.assert(output, `agent step ${options.step.id} submit_output`);\n submittedOutput = output;\n await options.onToolCall?.({\n name: \"submit_output\",\n input: output,\n output: { accepted: true },\n });\n }),\n ];\n\n const prompt = renderAgentPrompt(options.step.prompt, options.input);\n\n await adapter({\n messages: [{ role: \"user\", content: prompt }],\n tools,\n requirements: options.step.requirements,\n model,\n step: options.step,\n input: options.input,\n });\n\n if (submittedOutput === undefined) {\n throw new TrailStepFailureError({\n code: \"agent_output_missing\",\n message: `Agent step ${options.step.id} did not call submit_output.`,\n });\n }\n\n return submittedOutput;\n}\n\nexport function renderAgentPrompt<TInput extends PlainObject>(\n prompt: AgentPrompt<TInput>,\n input: TInput,\n): string {\n return typeof prompt === \"function\" ? prompt({ input }) : prompt;\n}\n\nexport function resolveAgentRequirements(\n requirements: AgentStepRequestConfig[\"requirements\"],\n): AgentModelTarget {\n return {\n adapterKey: PROVIDER_NEUTRAL_ADAPTER_KEY,\n model: requirements.name ?? requirements.size ?? PROVIDER_NEUTRAL_MODEL,\n };\n}\n\nfunction resolveAgentAdapter<TInput extends PlainObject, TOutput extends PlainObject = PlainObject>(\n selection: AgentAdapterSelection<TInput, TOutput> | undefined,\n): AgentAdapter<TInput, TOutput> {\n if (typeof selection === \"function\") {\n return selection;\n }\n\n if (typeof selection === \"object\" && selection !== null) {\n return (request) => selection.runAgentStep(request);\n }\n\n throw new TrailStepFailureError({\n code: \"agent_adapter_unavailable\",\n message:\n \"Agent steps that do not use a configured command runner require a custom adapter function or adapter object.\",\n });\n}\n\nfunction createSubmitOutputTool<TOutput extends PlainObject>(\n schema: Schema<TOutput>,\n onOutput: (output: TOutput) => void | Promise<void>,\n): AgentTool<TOutput> {\n return {\n name: \"submit_output\",\n description: \"Submit the typed output for this TrailStep agent step.\",\n schema,\n async call(input) {\n await onOutput(input);\n },\n };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport type { TrailStepConfig } from \"../../agent-targeting/targeting.types.js\";\nimport type {\n ContinuationStepConfig,\n PromptTemplateSource,\n} from \"../../authoring/step/continuation.types.js\";\nimport type { AgentPrompt } from \"../../contracts/agents/agent-adapter.types.js\";\nimport type { WorkflowAgentRole } from \"../../contracts/agents/agent-role.types.js\";\nimport { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type { PlainObject, Schema } from \"../../contracts/shapes/shape.types.js\";\nimport { resolveStepArtifactPaths } from \"../../runtime/artifacts/step-artifacts.js\";\nimport { createEvent } from \"../../runtime/events/create-run-event.js\";\nimport type { Event, RunWorkflowOptions } from \"../../runtime/run-workflow/run-workflow.types.js\";\nimport {\n renderAgentPrompt,\n runAgentStep,\n} from \"../adapter-agent/run-adapter-agent-step/run-adapter-agent-step.js\";\nimport { runInteractiveAgentCommand } from \"../interactive-agent/run-interactive-agent-command.js\";\nimport { runWorkingAgentCommand } from \"../working-agent/run-working-agent-command.js\";\n\n/**\n * Runs a prompt phase's agent dispatch: resolves the workflow agent role,\n * renders the prompt, and executes it in adapter, working, or interactive\n * mode. Steps with no prompt phase are never dispatched at all; their do\n * phase receives the step input directly.\n */\nexport async function dispatchAgentStep(options: {\n readonly config: ContinuationStepConfig & {\n readonly prompt: NonNullable<ContinuationStepConfig[\"prompt\"]>;\n };\n readonly outputSchema: Schema;\n readonly interactiveOutputMode: \"session-file\" | \"json\";\n readonly runId: string;\n readonly workflowId: string;\n readonly emit: (event: Event) => Promise<void>;\n readonly workflowAgents: Readonly<Record<string, WorkflowAgentRole>>;\n readonly runDir: string;\n readonly projectCwd: string;\n readonly cwd: string;\n readonly trailstepConfig: TrailStepConfig | undefined;\n readonly workingAgentProcessRunner: RunWorkflowOptions[\"workingAgentProcessRunner\"];\n readonly providerWorkingRunner: RunWorkflowOptions[\"providerWorkingRunner\"];\n readonly processRunner: RunWorkflowOptions[\"processRunner\"];\n readonly stepIndex: number;\n readonly signal?: AbortSignal;\n}): Promise<PlainObject> {\n const { config, outputSchema } = options;\n\n const resolvedRole = resolveWorkflowAgentRole({\n agent: config.agent,\n workflowAgents: options.workflowAgents,\n workflowId: options.workflowId,\n stepId: config.id,\n });\n\n const renderedPrompt = await resolvePromptSource(config.prompt, config.input, options.projectCwd);\n const agentMode = config.mode ?? \"working\";\n\n const agentStep = {\n kind: \"agent\" as const,\n id: config.id,\n output: outputSchema,\n prompt: renderedPrompt,\n requirements: resolvedRole.role,\n adapter: config.adapter,\n };\n\n if (!options.trailstepConfig && config.adapter === undefined) {\n throwMissingAgentConfig({\n workflowId: options.workflowId,\n stepId: config.id,\n agent: resolvedRole.roleName,\n mode: agentMode,\n });\n }\n\n if (options.trailstepConfig && agentMode === \"interactive\") {\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: config.id,\n type: \"interactive.sessionStarted\",\n payload: { roleName: resolvedRole.roleName, stepIndex: options.stepIndex },\n }),\n );\n const artifactPaths = resolveStepArtifactPaths({\n runDir: options.runDir,\n stepId: config.id,\n stepIndex: options.stepIndex,\n });\n const interactiveResult = await runInteractiveAgentCommand({\n config: options.trailstepConfig,\n workflowId: options.workflowId,\n roleName: resolvedRole.roleName,\n role: resolvedRole.role,\n stepId: config.id,\n renderedPrompt,\n runDir: options.runDir,\n cwd: options.cwd,\n runner: options.processRunner,\n outputSchema,\n outputMode: options.interactiveOutputMode,\n artifactPaths,\n signal: options.signal,\n });\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: config.id,\n type: \"interactive.sessionCompleted\",\n payload: {\n exitCode: interactiveResult.exitCode,\n outputMode: options.interactiveOutputMode,\n stepDir: artifactPaths.runRelativeStepDir,\n },\n }),\n );\n return interactiveResult.output;\n }\n\n return options.trailstepConfig && agentMode === \"working\"\n ? await runWorkingAgentCommand({\n config: options.trailstepConfig,\n workflowId: options.workflowId,\n roleName: resolvedRole.roleName,\n role: resolvedRole.role,\n step: agentStep,\n renderedPrompt,\n runDir: options.runDir,\n cwd: options.cwd,\n runner: options.workingAgentProcessRunner,\n providerWorkingRunner: options.providerWorkingRunner,\n onTargetAttempt: async (target) => {\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: config.id,\n type: \"step.progress\",\n payload: {\n message: `agent ${resolvedRole.roleName} via ${target.provider}${\n target.model === undefined ? \"\" : ` ${target.model}`\n }`,\n },\n }),\n );\n },\n stepIndex: options.stepIndex,\n signal: options.signal,\n })\n : await runAgentStep({\n step: agentStep,\n input: config.input,\n onToolCall: async (toolCall) => {\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: config.id,\n type: \"agent.toolCall\",\n payload: { ...toolCall },\n }),\n );\n },\n });\n}\n\n/**\n * Resolves a step's prompt source to a rendered string. A `promptTemplate(...)`\n * source is read from disk relative to the workflow/project `cwd`; a thrown/rejected\n * read propagates up through the same try/catch that already wraps step\n * dispatch, so an unreadable file becomes a normal step failure. Any other\n * source (string or callback) renders synchronously via `renderAgentPrompt`.\n */\nexport async function resolvePromptSource<TInput extends PlainObject>(\n source: AgentPrompt<TInput> | PromptTemplateSource,\n input: TInput,\n cwd: string,\n): Promise<string> {\n if (isPromptTemplateSource(source)) {\n return await readFile(resolve(cwd, source.path), \"utf8\");\n }\n\n return renderAgentPrompt(source, input);\n}\n\nfunction isPromptTemplateSource(\n source: AgentPrompt<PlainObject> | PromptTemplateSource,\n): source is PromptTemplateSource {\n return typeof source === \"object\" && source !== null && source.kind === \"promptTemplate\";\n}\n\nfunction throwMissingAgentConfig(options: {\n readonly workflowId: string;\n readonly stepId: string;\n readonly agent: string;\n readonly mode: \"working\" | \"interactive\";\n}): never {\n throw new TrailStepFailureError({\n code: \"missing_agent_config\",\n message: `Missing .trailstep/config.json: workflow ${options.workflowId} step ${options.stepId} needs configured ${options.mode} agent '${options.agent}'.`,\n details: {\n workflowId: options.workflowId,\n stepId: options.stepId,\n agent: options.agent,\n mode: options.mode,\n },\n });\n}\n\nconst DEFAULT_AGENT_ROLE_NAME = \"default\";\n\nconst BUILTIN_DEFAULT_AGENT_ROLE: WorkflowAgentRole = { size: \"default\" };\n\n/**\n * A step's `.agent` is optional. With none given, falls back to\n * `workflow.agents.default` if the workflow declares one, else a builtin\n * `{ size: \"default\" }` role — which `resolveAgentTargets` in turn resolves\n * against `.trailstep/config.json`'s unified `agents.default` mapping. An explicit `.agent(...)` naming an undeclared\n * role is still a hard error (typo protection).\n */\nexport function resolveWorkflowAgentRole(options: {\n readonly agent: string | undefined;\n readonly workflowAgents: Readonly<Record<string, WorkflowAgentRole>>;\n readonly workflowId: string;\n readonly stepId: string;\n}): { readonly role: WorkflowAgentRole; readonly roleName: string } {\n const roleName = options.agent ?? DEFAULT_AGENT_ROLE_NAME;\n const role = options.workflowAgents[roleName];\n\n if (role) {\n return { role, roleName };\n }\n\n if (options.agent === undefined) {\n return { role: BUILTIN_DEFAULT_AGENT_ROLE, roleName: DEFAULT_AGENT_ROLE_NAME };\n }\n\n throw new TrailStepFailureError({\n code: \"agent_role_unknown\",\n message: `Step ${options.stepId} references unknown agent role '${options.agent}' in workflow ${options.workflowId}. Declare workflow.agents.${options.agent} before referencing it with step agent.`,\n details: {\n workflowId: options.workflowId,\n stepId: options.stepId,\n agent: options.agent,\n declaredAgents: Object.keys(options.workflowAgents),\n },\n });\n}\n","import { join } from \"node:path\";\n\nexport interface WaitArtifactPaths {\n readonly requestFile: string;\n readonly answerFile: string;\n}\n\nexport interface ResolvedWaitArtifactPaths {\n readonly waitDir: string;\n readonly requestFile: string;\n readonly answerFile: string;\n readonly runRelative: WaitArtifactPaths;\n}\n\nexport interface StepArtifactPaths {\n readonly artifactStepId: string;\n readonly stepDir: string;\n readonly promptFile: string;\n readonly outputFile: string;\n readonly usageFile: string;\n readonly interactiveFile: string;\n readonly sessionDescriptionFile: string;\n readonly runRelativeStepDir: string;\n readonly runRelativeSessionDescriptionFile: string;\n}\n\nexport function resolveStepArtifactPaths(options: {\n readonly runDir: string;\n readonly stepId: string;\n readonly stepIndex: number;\n}): StepArtifactPaths {\n const artifactStepId = `${String(options.stepIndex).padStart(4, \"0\")}-${sanitizeStepId(\n options.stepId,\n )}`;\n const runRelativeStepDir = `steps/${artifactStepId}`;\n const runRelativeSessionDescriptionFile = `${runRelativeStepDir}/session-description.md`;\n const stepDir = join(options.runDir, \"steps\", artifactStepId);\n\n return {\n artifactStepId,\n stepDir,\n promptFile: join(stepDir, \"prompt.txt\"),\n outputFile: join(stepDir, \"output.json\"),\n usageFile: join(stepDir, \"usage.json\"),\n interactiveFile: join(stepDir, \"interactive.json\"),\n sessionDescriptionFile: join(stepDir, \"session-description.md\"),\n runRelativeStepDir,\n runRelativeSessionDescriptionFile,\n };\n}\n\nexport function resolveWaitArtifactPaths(options: {\n readonly runDir: string;\n readonly stepArtifactId: string;\n readonly waitId: string;\n}): ResolvedWaitArtifactPaths {\n const runRelativeWaitDir = `steps/${options.stepArtifactId}/waits/${options.waitId}`;\n const waitDir = join(options.runDir, \"steps\", options.stepArtifactId, \"waits\", options.waitId);\n\n return {\n waitDir,\n requestFile: join(waitDir, \"request.json\"),\n answerFile: join(waitDir, \"answer.json\"),\n runRelative: {\n requestFile: `${runRelativeWaitDir}/request.json`,\n answerFile: `${runRelativeWaitDir}/answer.json`,\n },\n };\n}\n\nfunction sanitizeStepId(stepId: string): string {\n return (\n stepId\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"step\"\n );\n}\n","import { spawn } from \"node:child_process\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { resolveAgentTargets } from \"../../agent-targeting/resolve-agent-targets/resolve-agent-targets.js\";\nimport type {\n TrailStepAgentTarget,\n TrailStepConfig,\n} from \"../../agent-targeting/targeting.types.js\";\nimport { resolveCliCommandForSpawn } from \"../../cli-provider-runtime/process/resolve-cli-command.js\";\nimport type { WorkflowAgentRole } from \"../../contracts/agents/agent-role.types.js\";\nimport { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type { PlainObject, Schema } from \"../../contracts/shapes/shape.types.js\";\nimport type { StepArtifactPaths } from \"../../runtime/artifacts/step-artifacts.js\";\nimport {\n isInteractiveCompleted,\n readCompletedInteractiveOutput,\n waitForInteractiveCompletion,\n} from \"../../runtime/interactive-session/interactive-session-protocol.js\";\nimport type {\n InteractiveProcessResult,\n InteractiveProcessRunner,\n} from \"../../runtime/run-workflow/run-workflow.types.js\";\nimport { renderCustomProviderArgs } from \"../custom-provider/render-custom-provider-args.js\";\n\nexport async function runInteractiveAgentCommand(options: {\n readonly config: TrailStepConfig;\n readonly workflowId: string;\n readonly roleName: string;\n readonly role: WorkflowAgentRole;\n readonly stepId: string;\n readonly renderedPrompt: string;\n readonly runDir: string;\n readonly cwd?: string;\n readonly outputSchema: Schema;\n readonly artifactPaths: StepArtifactPaths;\n readonly outputMode: \"session-file\" | \"json\";\n readonly runner?: InteractiveProcessRunner;\n readonly signal?: AbortSignal;\n}): Promise<{ readonly exitCode: number; readonly output: PlainObject }> {\n const [target] = resolveAgentTargets({\n config: options.config,\n workflowId: options.workflowId,\n roleName: options.roleName,\n roleSize: options.role.size,\n });\n\n if (!target) {\n throw new TrailStepFailureError({\n code: \"agent_targets_unavailable\",\n message: `No interactive agent targets found for role ${options.roleName} with size ${options.role.size} in workflow ${options.workflowId}.`,\n });\n }\n\n return await runInteractiveAgentTarget({ ...options, target });\n}\n\nasync function runInteractiveAgentTarget(options: {\n readonly config: TrailStepConfig;\n readonly workflowId: string;\n readonly roleName: string;\n readonly role: WorkflowAgentRole;\n readonly stepId: string;\n readonly renderedPrompt: string;\n readonly runDir: string;\n readonly cwd?: string;\n readonly outputSchema: Schema;\n readonly artifactPaths: StepArtifactPaths;\n readonly outputMode: \"session-file\" | \"json\";\n readonly runner?: InteractiveProcessRunner;\n readonly target: TrailStepAgentTarget;\n readonly signal?: AbortSignal;\n}): Promise<{ readonly exitCode: number; readonly output: PlainObject }> {\n const files = options.artifactPaths;\n const thinking = options.target.thinking ?? options.role.thinking;\n await prepareInteractiveArtifacts({\n files,\n runDir: options.runDir,\n stepId: options.stepId,\n outputSchema: options.outputSchema,\n outputMode: options.outputMode,\n });\n const prompt = buildInteractivePrompt({\n renderedPrompt: options.renderedPrompt,\n files,\n outputSchema: options.outputSchema,\n outputMode: options.outputMode,\n });\n const env = { ...definedProcessEnv(), TRAILSTEP_INTERACTIVE_FILE: files.interactiveFile };\n const executionCwd = options.cwd ?? files.stepDir;\n\n const abortController = new AbortController();\n options.signal?.addEventListener(\"abort\", () => abortController.abort(), { once: true });\n\n const manifestProvider = options.config.providers?.[options.target.provider];\n if (manifestProvider !== undefined && manifestProvider.source.type !== \"legacy-custom-provider\") {\n const interactive = manifestProvider.manifest.interactive;\n if (!interactive.supported || interactive.command === undefined) {\n throw new TrailStepFailureError({\n code: \"agent_provider_interactive_unsupported\",\n message: `Provider '${options.target.provider}' cannot run interactive agent steps because its provider manifest does not declare supported interactive execution.`,\n details: { provider: options.target.provider },\n });\n }\n\n const command = interactive.command;\n const args = renderCustomProviderArgs({\n argv: options.target.args ?? [\"{{prompt}}\"],\n values: {\n prompt,\n promptFile: files.promptFile,\n ...(options.target.model === undefined ? {} : { model: options.target.model }),\n ...(thinking === undefined ? {} : { thinking }),\n },\n errorCode: \"interactive_command_invalid\",\n commandDescription: \"Manifest interactive provider command\",\n });\n\n if (args.includes(files.promptFile)) {\n await mkdir(dirname(files.promptFile), { recursive: true });\n await writeFile(files.promptFile, prompt, \"utf8\");\n }\n\n return await runProcessUntilExitOrCompletion({\n stepId: options.stepId,\n target: options.target.provider,\n interactiveFile: files.interactiveFile,\n abortController,\n readOutput: async () => await readCompletedOutput(options),\n mapSpawnError: (error) =>\n new TrailStepFailureError({\n code: \"interactive_command_spawn_error\",\n message: `Interactive agent step ${options.stepId} could not start provider '${options.target.provider}'.`,\n details: {\n provider: options.target.provider,\n ...(options.target.model === undefined ? {} : { model: options.target.model }),\n cause: error instanceof Error ? error.message : String(error),\n },\n }),\n runProcess: async () =>\n await (options.runner ?? spawnInteractiveProcess)({\n command,\n args,\n cwd: executionCwd,\n shell: false,\n stdio: \"inherit\",\n env,\n signal: abortController.signal,\n }),\n });\n }\n\n const agentConfig = options.config.customProviders[options.target.provider];\n if (!agentConfig) {\n throw new TrailStepFailureError({\n code: \"agent_provider_unavailable\",\n message: `Interactive agent target '${options.target.provider}' does not reference a configured custom agent.`,\n details: { provider: options.target.provider },\n });\n }\n\n if (!agentConfig.interactiveArgs) {\n throw new TrailStepFailureError({\n code: \"agent_provider_interactive_unsupported\",\n message: `Custom provider '${options.target.provider}' cannot run interactive agent steps because customProviders.${options.target.provider}.interactiveArgs is not declared.`,\n details: { provider: options.target.provider },\n });\n }\n\n const args = renderCustomProviderArgs({\n argv: options.target.args ?? agentConfig.interactiveArgs,\n values: {\n prompt,\n promptFile: files.promptFile,\n ...(options.target.model === undefined ? {} : { model: options.target.model }),\n ...(thinking === undefined ? {} : { thinking }),\n },\n errorCode: \"interactive_command_invalid\",\n commandDescription: \"Interactive agent command\",\n });\n\n if (args.includes(files.promptFile)) {\n await mkdir(dirname(files.promptFile), { recursive: true });\n await writeFile(files.promptFile, prompt, \"utf8\");\n }\n\n return await runProcessUntilExitOrCompletion({\n stepId: options.stepId,\n target: options.target.provider,\n interactiveFile: files.interactiveFile,\n abortController,\n readOutput: async () => await readCompletedOutput(options),\n mapSpawnError: (error) =>\n new TrailStepFailureError({\n code: \"interactive_command_spawn_error\",\n message: `Interactive agent step ${options.stepId} could not start target '${options.target.provider}'.`,\n details: {\n target: options.target.provider,\n ...(options.target.model === undefined ? {} : { model: options.target.model }),\n cause: error instanceof Error ? error.message : String(error),\n },\n }),\n runProcess: async () =>\n await (options.runner ?? spawnInteractiveProcess)({\n command: agentConfig.binary,\n args,\n cwd: executionCwd,\n shell: false,\n stdio: \"inherit\",\n env,\n signal: abortController.signal,\n }),\n });\n}\n\nfunction definedProcessEnv(): Record<string, string> {\n return Object.fromEntries(\n Object.entries(process.env).filter(\n (entry): entry is [string, string] => entry[1] !== undefined,\n ),\n );\n}\n\nasync function runProcessUntilExitOrCompletion(options: {\n readonly stepId: string;\n readonly target: string;\n readonly interactiveFile: string;\n readonly abortController: AbortController;\n readonly runProcess: () => Promise<InteractiveProcessResult>;\n readonly readOutput: () => Promise<PlainObject>;\n readonly mapSpawnError?: (error: unknown) => TrailStepFailureError;\n}): Promise<{ readonly exitCode: number; readonly output: PlainObject }> {\n const processPromise = options.runProcess();\n void processPromise.catch(() => undefined);\n const watcherAbortController = new AbortController();\n\n const winner = await Promise.race<\n | { readonly type: \"completed\" }\n | { readonly type: \"process\"; readonly result: InteractiveProcessResult }\n | { readonly type: \"processError\"; readonly error: unknown }\n >([\n processPromise.then(\n (result) => ({ type: \"process\", result }) as const,\n (error) => ({ type: \"processError\", error }) as const,\n ),\n waitForInteractiveCompletion(options.interactiveFile, watcherAbortController.signal).then(\n () => ({ type: \"completed\" }) as const,\n ),\n ]);\n\n watcherAbortController.abort();\n\n if (winner.type === \"processError\") {\n throw options.mapSpawnError?.(winner.error) ?? winner.error;\n }\n\n if (winner.type === \"process\") {\n if (await isInteractiveCompleted(options.interactiveFile)) {\n return { exitCode: 0, output: await options.readOutput() };\n }\n\n if (winner.result.exitCode !== 0) {\n throw new TrailStepFailureError({\n code: \"interactive_session_failed\",\n message: `Interactive agent step ${options.stepId} exited with code ${winner.result.exitCode}.`,\n details: { exitCode: winner.result.exitCode, target: options.target },\n });\n }\n\n return { exitCode: winner.result.exitCode, output: await options.readOutput() };\n }\n\n options.abortController.abort();\n return { exitCode: 0, output: await options.readOutput() };\n}\n\nasync function prepareInteractiveArtifacts(options: {\n readonly files: StepArtifactPaths;\n readonly runDir: string;\n readonly stepId: string;\n readonly outputSchema: Schema;\n readonly outputMode: \"session-file\" | \"json\";\n}): Promise<void> {\n await mkdir(options.files.stepDir, { recursive: true });\n await writeFile(\n options.files.interactiveFile,\n `${JSON.stringify(\n {\n status: \"active\",\n stepId: options.stepId,\n artifactStepId: options.files.artifactStepId,\n outputMode: options.outputMode,\n runDir: options.runDir,\n stepDir: options.files.stepDir,\n promptFile: options.files.promptFile,\n outputFile: options.files.outputFile,\n interactiveFile: options.files.interactiveFile,\n ...(options.outputMode === \"session-file\"\n ? {\n sessionDescriptionFile: options.files.sessionDescriptionFile,\n runRelativeSessionDescriptionFile: options.files.runRelativeSessionDescriptionFile,\n }\n : {}),\n runRelativeStepDir: options.files.runRelativeStepDir,\n outputSchema: options.outputSchema.jsonSchema,\n },\n null,\n 2,\n )}\\n`,\n \"utf8\",\n );\n}\n\nfunction buildInteractivePrompt(options: {\n readonly renderedPrompt: string;\n readonly files: StepArtifactPaths;\n readonly outputSchema: Schema;\n readonly outputMode: \"session-file\" | \"json\";\n}): string {\n const preamble =\n options.outputMode === \"session-file\"\n ? [\n \"You are running inside a TrailStep interactive step.\",\n \"Write a dense session description to session-description.md in the current directory.\",\n \"preserve as much usable context as possible.\",\n \"describe the conversation rather than aggressively summarize it.\",\n \"include decisions, rejected options, tradeoffs, constraints, side comments, terminology, open questions, assumptions, file paths, commands, APIs, package names, examples, preferences, reasoning, and abandoned options.\",\n \"The goal is context preservation, not polish.\",\n \"Do not omit low-importance details merely because they seem minor.\",\n \"When complete, run: trailstep continue --session-file session-description.md\",\n ]\n : [\n \"You are running inside a TrailStep interactive step.\",\n \"Submit a JSON object matching this schema:\",\n JSON.stringify(options.outputSchema.jsonSchema, null, 2),\n \"When complete, run one of:\",\n \" trailstep continue --json-file output.json\",\n ` trailstep continue --json '${JSON.stringify(exampleJsonObject(options.outputSchema.jsonSchema))}'`,\n \"If validation fails, update the JSON so it matches the schema and run trailstep continue again.\",\n ];\n\n return [...preamble, \"\", \"## Original prompt\", options.renderedPrompt].join(\"\\n\");\n}\n\nasync function readCompletedOutput(options: {\n readonly stepId: string;\n readonly artifactPaths: StepArtifactPaths;\n readonly outputSchema: Schema;\n}): Promise<PlainObject> {\n return await readCompletedInteractiveOutput({\n stepId: options.stepId,\n interactiveFile: options.artifactPaths.interactiveFile,\n outputSchema: options.outputSchema,\n });\n}\n\nfunction exampleJsonObject(schema: Record<string, unknown>): Record<string, unknown> {\n const properties =\n typeof schema.properties === \"object\" &&\n schema.properties !== null &&\n !Array.isArray(schema.properties)\n ? (schema.properties as Record<string, unknown>)\n : {};\n\n return Object.fromEntries(\n Object.entries(properties).map(([key, property]) => {\n const type =\n typeof property === \"object\" && property !== null && \"type\" in property\n ? (property as { readonly type?: unknown }).type\n : undefined;\n if (type === \"boolean\") {\n return [key, true];\n }\n if (type === \"number\") {\n return [key, 1];\n }\n return [key, \"string\"];\n }),\n );\n}\n\nconst spawnInteractiveProcess: InteractiveProcessRunner = async ({\n command,\n args,\n cwd,\n env,\n signal,\n}) => {\n // Match launch-interactive-agent-target: npm .cmd shims cannot spawn by bare\n // name with shell:false on Windows; resolve to the Node entrypoint (no-op\n // elsewhere). Injected test runners bypass this function entirely.\n const executable = await resolveCliCommandForSpawn({ command, args, env });\n\n return await new Promise((resolve, reject) => {\n const child = spawn(executable.command, executable.args, {\n cwd,\n env,\n signal,\n detached: process.platform !== \"win32\",\n shell: false,\n stdio: \"inherit\",\n });\n\n signal?.addEventListener(\"abort\", () => terminateChildProcessTree(child), { once: true });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => resolve({ exitCode: code ?? 1 }));\n });\n};\n\nfunction terminateChildProcessTree(child: ReturnType<typeof spawn>): void {\n if (!child.pid) {\n return;\n }\n\n if (process.platform === \"win32\") {\n spawn(\"taskkill\", [\"/PID\", String(child.pid), \"/T\", \"/F\"], { stdio: \"ignore\" }).on(\n \"error\",\n () => {\n child.kill();\n },\n );\n return;\n }\n\n try {\n process.kill(-child.pid, \"SIGTERM\");\n } catch {\n child.kill();\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { setTimeout as delay } from \"node:timers/promises\";\n\nimport { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type { PlainObject, Schema } from \"../../contracts/shapes/shape.types.js\";\n\nexport async function waitForInteractiveCompletion(\n interactiveFile: string,\n signal: AbortSignal,\n): Promise<void> {\n while (!signal.aborted) {\n if (await isInteractiveCompleted(interactiveFile)) {\n return;\n }\n\n await delay(100, undefined, { signal }).catch(() => undefined);\n }\n}\n\nexport async function isInteractiveCompleted(interactiveFile: string): Promise<boolean> {\n try {\n const protocol = await readPlainJsonFile(interactiveFile, {\n readCode: \"interactive_session_invalid\",\n invalidCode: \"interactive_session_invalid\",\n message: \"Interactive session protocol file is invalid.\",\n });\n return protocol.status === \"completed\" || protocol.status === \"cancelled\";\n } catch {\n // The process-exit path reports authoritative protocol validation errors.\n // The watcher is intentionally best-effort and only needs to notice completion.\n return false;\n }\n}\n\nexport async function readCompletedInteractiveOutput(options: {\n readonly stepId: string;\n readonly interactiveFile: string;\n readonly outputSchema: Schema;\n}): Promise<PlainObject> {\n const protocol = await readPlainJsonFile(options.interactiveFile, {\n readCode: \"interactive_session_invalid\",\n invalidCode: \"interactive_session_invalid\",\n message: `Interactive agent step ${options.stepId} has an invalid interactive.json file.`,\n });\n\n if (protocol.status === \"cancelled\") {\n throw new TrailStepFailureError({\n code: \"interactive_session_cancelled\",\n message: `Interactive agent step ${options.stepId} was cancelled.`,\n details: {\n status: protocol.status,\n ...(typeof protocol.reason === \"string\" ? { reason: protocol.reason } : {}),\n },\n });\n }\n\n if (protocol.status !== \"completed\") {\n throw new TrailStepFailureError({\n code: \"interactive_session_incomplete\",\n message: `Interactive agent step ${options.stepId} did not complete the file-based protocol.`,\n details: { status: protocol.status },\n });\n }\n\n const outputFile = requireProtocolString(protocol.outputFile, \"outputFile\", options.stepId);\n const output = await readPlainJsonFile(outputFile, {\n readCode: \"interactive_output_missing\",\n invalidCode: \"interactive_output_invalid\",\n message: `Interactive agent step ${options.stepId} completed without a valid output.json file.`,\n });\n\n const diagnostics = options.outputSchema.diagnostics(output);\n if (diagnostics.length > 0) {\n throw new TrailStepFailureError({\n code: \"interactive_output_invalid\",\n message: `Interactive agent step ${options.stepId} output.json failed schema validation: ${formatDiagnostics(diagnostics)}`,\n details: { diagnostics },\n });\n }\n\n return output;\n}\n\nasync function readPlainJsonFile(\n path: string,\n failure: {\n readonly readCode: string;\n readonly invalidCode: string;\n readonly message: string;\n },\n): Promise<PlainObject> {\n let contents: string;\n try {\n contents = await readFile(path, \"utf8\");\n } catch (error) {\n throw new TrailStepFailureError({\n code: failure.readCode,\n message: failure.message,\n details: { path, cause: error instanceof Error ? error.message : String(error) },\n });\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(contents);\n } catch (error) {\n throw new TrailStepFailureError({\n code: failure.invalidCode,\n message: failure.message,\n details: { path, cause: error instanceof Error ? error.message : String(error) },\n });\n }\n\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new TrailStepFailureError({\n code: failure.invalidCode,\n message: `${failure.message} Expected a plain JSON object.`,\n details: { path },\n });\n }\n\n return parsed as PlainObject;\n}\n\nfunction requireProtocolString(value: unknown, field: string, stepId: string): string {\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n\n throw new TrailStepFailureError({\n code: \"interactive_session_invalid\",\n message: `Interactive agent step ${stepId} interactive.json is missing ${field}.`,\n });\n}\n\nfunction formatDiagnostics(\n diagnostics: readonly { readonly path: string; readonly message: string }[],\n): string {\n return diagnostics.map((diagnostic) => `${diagnostic.path} ${diagnostic.message}`).join(\"; \");\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\n\nimport { resolveAgentTargets } from \"../../agent-targeting/resolve-agent-targets/resolve-agent-targets.js\";\nimport type {\n TrailStepAgentTarget,\n TrailStepConfig,\n} from \"../../agent-targeting/targeting.types.js\";\nimport type { AgentStepRequestConfig } from \"../../authoring/step/agent-step.types.js\";\nimport type { ProviderWorkingRunner } from \"../../cli-provider-runtime/catalog/provider-adapter.types.js\";\nimport type { WorkflowAgentRole } from \"../../contracts/agents/agent-role.types.js\";\nimport { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport type { WorkingAgentProcessRunner } from \"../../runtime/run-workflow/run-workflow.types.js\";\nimport {\n resolveStepAgentFiles,\n type WorkingAgentFiles,\n} from \"./artifacts/resolve-step-agent-files.js\";\nimport { buildWorkingAgentPrompt } from \"./prompts/build-working-agent-prompt.js\";\nimport { runWorkingAgentTargetAttempt } from \"./targets/run-working-agent-target-attempt.js\";\nimport {\n summarizeWorkingAgentAttemptFailure,\n type WorkingAgentAttemptFailure,\n} from \"./targets/target-failures.js\";\n\nexport type { WorkingAgentFiles } from \"./artifacts/resolve-step-agent-files.js\";\n\nexport async function runWorkingAgentCommand<TOutput extends PlainObject>(options: {\n readonly config: TrailStepConfig;\n readonly workflowId: string;\n readonly roleName: string;\n readonly role: WorkflowAgentRole;\n readonly step: AgentStepRequestConfig<PlainObject, TOutput>;\n readonly renderedPrompt: string;\n readonly runDir: string;\n readonly cwd: string;\n readonly runner?: WorkingAgentProcessRunner;\n readonly providerWorkingRunner?: ProviderWorkingRunner;\n /** Called with the selected target immediately before each target attempt runs. */\n readonly onTargetAttempt?: (target: TrailStepAgentTarget) => void | Promise<void>;\n readonly stepIndex: number;\n readonly files?: WorkingAgentFiles;\n readonly signal?: AbortSignal;\n}): Promise<TOutput> {\n const targets = resolveAgentTargets({\n config: options.config,\n workflowId: options.workflowId,\n roleName: options.roleName,\n roleSize: options.role.size,\n });\n\n const files =\n options.files ??\n resolveStepAgentFiles({\n runDir: options.runDir,\n stepId: options.step.id,\n stepIndex: options.stepIndex,\n });\n await mkdir(files.stepDir, { recursive: true });\n await writeFile(\n files.promptFile,\n buildWorkingAgentPrompt({\n prompt: options.renderedPrompt,\n outputFile: files.outputFile,\n outputSchema: options.step.output.jsonSchema,\n captureMode: options.step.output.captureMode,\n }),\n \"utf8\",\n );\n\n const failures: WorkingAgentAttemptFailure[] = [];\n\n for (const target of targets) {\n await options.onTargetAttempt?.(target);\n try {\n return await runWorkingAgentTargetAttempt({ ...options, target, files });\n } catch (error) {\n failures.push(summarizeWorkingAgentAttemptFailure(target, error));\n }\n }\n\n throw new TrailStepFailureError({\n code: \"agent_target_exhausted\",\n message: `Working agent step ${options.step.id} for role ${options.roleName} exhausted ${failures.length} target(s).`,\n details: {\n stepId: options.step.id,\n roleName: options.roleName,\n attempts: failures,\n },\n });\n}\n","import { join } from \"node:path\";\n\nimport { resolveStepArtifactPaths } from \"../../../runtime/artifacts/step-artifacts.js\";\n\nexport interface WorkingAgentFiles {\n readonly stepDir: string;\n readonly promptFile: string;\n readonly outputFile: string;\n readonly usageFile: string;\n readonly workFile: string;\n readonly repairPromptFile: string;\n}\n\nexport function resolveStepAgentFiles(options: {\n readonly runDir: string;\n readonly stepId: string;\n readonly stepIndex: number;\n}): WorkingAgentFiles {\n const artifactPaths = resolveStepArtifactPaths(options);\n return {\n stepDir: artifactPaths.stepDir,\n promptFile: join(artifactPaths.stepDir, \"prompt.md\"),\n outputFile: artifactPaths.outputFile,\n usageFile: artifactPaths.usageFile,\n workFile: join(artifactPaths.stepDir, \"work.txt\"),\n repairPromptFile: join(artifactPaths.stepDir, \"repair-prompt.md\"),\n };\n}\n","export function buildWorkingAgentPrompt(options: {\n readonly prompt: string;\n readonly outputFile: string;\n readonly outputSchema: Record<string, unknown>;\n readonly captureMode?: \"json\" | \"raw-text\";\n}): string {\n if (options.captureMode === \"raw-text\") {\n return [\n \"# TrailStep working-agent task\",\n \"\",\n \"Run the task described below and write the document content to the output file.\",\n \"Print the document content directly as your entire response — no JSON wrapper, no surrounding commentary, no markdown fences unless they are literally part of the document content itself.\",\n \"\",\n `Output file: ${options.outputFile}`,\n \"\",\n \"## Original prompt\",\n \"\",\n options.prompt,\n \"\",\n ].join(\"\\n\");\n }\n\n return [\n \"# TrailStep working-agent task\",\n \"\",\n \"Run the task described below and write exactly one JSON object to the output file.\",\n \"Do not write prose, markdown fences, or multiple JSON values to the output file.\",\n \"\",\n `Output file: ${options.outputFile}`,\n \"\",\n \"The JSON object must match this output schema:\",\n \"\",\n \"```json\",\n JSON.stringify(options.outputSchema, null, 2),\n \"```\",\n \"\",\n \"## Original prompt\",\n \"\",\n options.prompt,\n \"\",\n ].join(\"\\n\");\n}\n","import { rm } from \"node:fs/promises\";\n\nimport type {\n TrailStepAgentTarget,\n TrailStepConfig,\n} from \"../../../agent-targeting/targeting.types.js\";\nimport type { AgentStepRequestConfig } from \"../../../authoring/step/agent-step.types.js\";\nimport type { ProviderWorkingRunner } from \"../../../cli-provider-runtime/catalog/provider-adapter.types.js\";\nimport type { WorkflowAgentRole } from \"../../../contracts/agents/agent-role.types.js\";\nimport type { PlainObject } from \"../../../contracts/shapes/shape.types.js\";\nimport type { WorkingAgentProcessRunner } from \"../../../runtime/run-workflow/run-workflow.types.js\";\nimport type { WorkingAgentFiles } from \"../artifacts/resolve-step-agent-files.js\";\nimport { runCustomWorkingProvider } from \"./custom-provider/run-custom-working-provider.js\";\nimport { runManifestWorkingProvider } from \"./manifest-provider/run-manifest-working-provider.js\";\n\nexport async function runWorkingAgentTargetAttempt<TOutput extends PlainObject>(options: {\n readonly config: TrailStepConfig;\n readonly workflowId: string;\n readonly roleName: string;\n readonly role: WorkflowAgentRole;\n readonly step: AgentStepRequestConfig<PlainObject, TOutput>;\n readonly renderedPrompt: string;\n readonly runDir: string;\n readonly cwd: string;\n readonly runner?: WorkingAgentProcessRunner;\n readonly providerWorkingRunner?: ProviderWorkingRunner;\n readonly stepIndex: number;\n readonly target: TrailStepAgentTarget;\n readonly files: WorkingAgentFiles;\n readonly signal?: AbortSignal;\n}): Promise<TOutput> {\n await rm(options.files.outputFile, { force: true });\n await rm(options.files.usageFile, { force: true });\n\n if (\n options.config.providers?.[options.target.provider] !== undefined &&\n options.config.providers[options.target.provider]?.source.type !== \"legacy-custom-provider\"\n ) {\n return runManifestWorkingProvider({\n config: options.config,\n step: options.step,\n role: options.role,\n cwd: options.cwd,\n runner: options.runner,\n target: options.target,\n files: options.files,\n renderedPrompt: options.renderedPrompt,\n signal: options.signal,\n });\n }\n\n return runCustomWorkingProvider({\n config: options.config,\n step: options.step,\n role: options.role,\n cwd: options.cwd,\n runner: options.runner,\n target: options.target,\n files: options.files,\n signal: options.signal,\n });\n}\n","import { readFile } from \"node:fs/promises\";\n\nimport { document } from \"../../../authoring/document/document.js\";\nimport type { AgentStepRequestConfig } from \"../../../authoring/step/agent-step.types.js\";\nimport { TrailStepFailureError } from \"../../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../../contracts/shapes/shape.types.js\";\n\nexport async function readWorkingAgentOutput<TOutput extends PlainObject>(options: {\n readonly stepId: string;\n readonly outputFile: string;\n readonly step: AgentStepRequestConfig<PlainObject, TOutput>;\n}): Promise<TOutput> {\n let raw: string;\n try {\n raw = await readFile(options.outputFile, \"utf8\");\n } catch (error) {\n throw new TrailStepFailureError({\n code: \"agent_output_unreadable\",\n message: `Working agent step ${options.stepId} output.json could not be read.`,\n details:\n error instanceof Error\n ? { path: options.outputFile, cause: error.message }\n : { path: options.outputFile },\n });\n }\n\n if (options.step.output.captureMode === \"raw-text\") {\n // Delegates to the shared `document(...)` capture path (the same one\n // code-authored steps use), so agent-captured and code-captured\n // documents share one persistence implementation. `document(...)`\n // resolves its target directory and index from the ambient step\n // context (`currentStep`), which is active for the whole duration of\n // this step's dispatch (see `withStepContext` in run-continuation.ts).\n const capturedDocument = await document(raw);\n\n return options.step.output.assert(capturedDocument, `step ${options.stepId} output`);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (error) {\n throw new TrailStepFailureError({\n code: \"agent_output_invalid_json\",\n message: `Working agent step ${options.stepId} output.json must contain one JSON object.`,\n details:\n error instanceof Error\n ? { path: options.outputFile, cause: error.message }\n : { path: options.outputFile },\n });\n }\n\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new TrailStepFailureError({\n code: \"agent_output_invalid_json\",\n message: `Working agent step ${options.stepId} output.json must contain one JSON object.`,\n details: { path: options.outputFile },\n });\n }\n\n return options.step.output.assert(parsed, `step ${options.stepId} output`);\n}\n","import type { WorkflowAgentThinking } from \"../../../../contracts/agents/agent-role.types.js\";\nimport { renderCustomProviderArgs } from \"../../../custom-provider/render-custom-provider-args.js\";\n\nexport function buildWorkingAgentArgs(options: {\n readonly argv: readonly string[] | undefined;\n readonly promptFile: string;\n readonly outputFile: string;\n readonly model?: string;\n readonly thinking?: WorkflowAgentThinking;\n}): string[] {\n if (!options.argv) {\n return [\n \"--prompt-file\",\n options.promptFile,\n \"--output-file\",\n options.outputFile,\n ...(options.model ? [\"--model\", options.model] : []),\n ];\n }\n\n return renderCustomProviderArgs({\n argv: options.argv,\n values: {\n promptFile: options.promptFile,\n outputFile: options.outputFile,\n ...(options.model === undefined ? {} : { model: options.model }),\n ...(options.thinking === undefined ? {} : { thinking: options.thinking }),\n },\n errorCode: \"agent_provider_invalid\",\n commandDescription: \"Working agent command\",\n });\n}\n","import { spawn } from \"node:child_process\";\n\nimport type { WorkingAgentProcessRunner } from \"../../../../runtime/run-workflow/run-workflow.types.js\";\n\nexport const spawnWorkingAgentProcess: WorkingAgentProcessRunner = async ({\n command,\n args,\n cwd,\n stdio,\n signal,\n}) => {\n return await new Promise((resolve, reject) => {\n let stdout = \"\";\n const child = spawn(command, args, {\n cwd,\n shell: false,\n stdio: stdio === \"pipe\" ? [\"ignore\", \"pipe\", \"inherit\"] : \"inherit\",\n detached: process.platform !== \"win32\",\n });\n\n if (child.stdout !== null) {\n child.stdout.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n }\n\n signal?.addEventListener(\"abort\", () => terminateChildProcessTree(child), { once: true });\n child.on(\"error\", reject);\n child.on(\"close\", (code) =>\n resolve({ exitCode: code ?? 1, ...(stdio === \"pipe\" ? { stdout } : {}) }),\n );\n });\n};\n\nfunction terminateChildProcessTree(child: ReturnType<typeof spawn>): void {\n if (!child.pid) {\n return;\n }\n\n if (process.platform === \"win32\") {\n spawn(\"taskkill\", [\"/PID\", String(child.pid), \"/T\", \"/F\"], { stdio: \"ignore\" }).on(\n \"error\",\n () => {\n child.kill();\n },\n );\n return;\n }\n\n try {\n process.kill(-child.pid, \"SIGTERM\");\n } catch {\n child.kill();\n }\n}\n","import type {\n TrailStepAgentTarget,\n TrailStepConfig,\n} from \"../../../../agent-targeting/targeting.types.js\";\nimport type { AgentStepRequestConfig } from \"../../../../authoring/step/agent-step.types.js\";\nimport { resolveCliCommandForSpawn } from \"../../../../cli-provider-runtime/process/resolve-cli-command.js\";\nimport type { WorkflowAgentRole } from \"../../../../contracts/agents/agent-role.types.js\";\nimport { TrailStepFailureError } from \"../../../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../../../contracts/shapes/shape.types.js\";\nimport type {\n WorkingAgentProcessResult,\n WorkingAgentProcessRunner,\n} from \"../../../../runtime/run-workflow/run-workflow.types.js\";\nimport type { WorkingAgentFiles } from \"../../artifacts/resolve-step-agent-files.js\";\nimport { readWorkingAgentOutput } from \"../../output/read-working-agent-output.js\";\nimport { buildWorkingAgentArgs } from \"./build-working-agent-args.js\";\nimport { spawnWorkingAgentProcess } from \"./spawn-working-agent-process.js\";\n\nexport async function runCustomWorkingProvider<TOutput extends PlainObject>(options: {\n readonly config: TrailStepConfig;\n readonly step: AgentStepRequestConfig<PlainObject, TOutput>;\n readonly role: WorkflowAgentRole;\n readonly cwd: string;\n readonly runner?: WorkingAgentProcessRunner;\n readonly target: TrailStepAgentTarget;\n readonly files: WorkingAgentFiles;\n readonly signal?: AbortSignal;\n}): Promise<TOutput> {\n const agentConfig = options.config.customProviders[options.target.provider];\n if (!agentConfig) {\n throw new TrailStepFailureError({\n code: \"agent_provider_unavailable\",\n message: `Working agent target '${options.target.provider}' does not reference a configured custom agent.`,\n details: { provider: options.target.provider },\n });\n }\n\n const thinking = options.target.thinking ?? options.role.thinking;\n const args = buildWorkingAgentArgs({\n argv: options.target.args ?? agentConfig.args,\n promptFile: options.files.promptFile,\n outputFile: options.files.outputFile,\n model: options.target.model,\n thinking,\n });\n\n let result: WorkingAgentProcessResult;\n try {\n // Custom binaries may also be npm .cmd shims on Windows; resolve to the\n // Node entrypoint (no-op on other platforms) so shell:false keeps working.\n const executable = await resolveCliCommandForSpawn({\n command: agentConfig.binary,\n args,\n });\n result = await (options.runner ?? spawnWorkingAgentProcess)({\n command: executable.command,\n args: executable.args,\n cwd: options.cwd,\n shell: false,\n stdio: \"inherit\",\n promptFile: options.files.promptFile,\n outputFile: options.files.outputFile,\n ...(options.target.model === undefined ? {} : { model: options.target.model }),\n signal: options.signal,\n });\n } catch (error) {\n throw new TrailStepFailureError({\n code: \"agent_provider_spawn_error\",\n message: `Working agent step ${options.step.id} could not start target '${options.target.provider}'.`,\n details: {\n target: options.target.provider,\n ...(options.target.model === undefined ? {} : { model: options.target.model }),\n cause: error instanceof Error ? error.message : String(error),\n },\n });\n }\n\n if (result.exitCode !== 0) {\n throw new TrailStepFailureError({\n code: \"agent_provider_failed\",\n message: `Working agent step ${options.step.id} target '${options.target.provider}' exited with code ${result.exitCode}.`,\n details: {\n exitCode: result.exitCode,\n provider: agentConfig.binary,\n target: options.target.provider,\n ...(options.target.model === undefined ? {} : { model: options.target.model }),\n },\n });\n }\n\n return readWorkingAgentOutput({\n stepId: options.step.id,\n outputFile: options.files.outputFile,\n step: options.step,\n });\n}\n","import { randomUUID } from \"node:crypto\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport type {\n TrailStepAgentTarget,\n TrailStepConfig,\n} from \"../../../../agent-targeting/targeting.types.js\";\nimport type { AgentStepRequestConfig } from \"../../../../authoring/step/agent-step.types.js\";\nimport {\n extractEnvelopeOutput,\n extractEnvelopeText,\n} from \"../../../../cli-provider-runtime/envelopes/envelope.js\";\nimport { resolveCliCommandForSpawn } from \"../../../../cli-provider-runtime/process/resolve-cli-command.js\";\nimport type {\n WorkflowAgentRole,\n WorkflowAgentThinking,\n} from \"../../../../contracts/agents/agent-role.types.js\";\nimport { TrailStepFailureError } from \"../../../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../../../contracts/shapes/shape.types.js\";\nimport type {\n TrailStepProviderFollowUpManifest,\n TrailStepProviderManifest,\n TrailStepProviderOutputManifest,\n TrailStepProviderWorkingManifest,\n} from \"../../../../providers/provider-manifest.js\";\nimport type {\n WorkingAgentProcessResult,\n WorkingAgentProcessRunner,\n} from \"../../../../runtime/run-workflow/run-workflow.types.js\";\nimport { renderCustomProviderArgs } from \"../../../custom-provider/render-custom-provider-args.js\";\nimport type { WorkingAgentFiles } from \"../../artifacts/resolve-step-agent-files.js\";\nimport { readWorkingAgentOutput } from \"../../output/read-working-agent-output.js\";\nimport { buildFormatPrompt, buildWorkPrompt } from \"../../prompts/build-two-phase-prompts.js\";\nimport { spawnWorkingAgentProcess } from \"../custom-provider/spawn-working-agent-process.js\";\n\nexport async function runManifestWorkingProvider<TOutput extends PlainObject>(options: {\n readonly config: TrailStepConfig;\n readonly step: AgentStepRequestConfig<PlainObject, TOutput>;\n readonly role: WorkflowAgentRole;\n readonly cwd: string;\n readonly runner?: WorkingAgentProcessRunner;\n readonly target: TrailStepAgentTarget;\n readonly files: WorkingAgentFiles;\n readonly renderedPrompt: string;\n readonly signal?: AbortSignal;\n}): Promise<TOutput> {\n const registration = options.config.providers?.[options.target.provider];\n const manifest = registration?.manifest;\n const working = manifest?.working;\n\n if (\n manifest === undefined ||\n working === undefined ||\n !working.supported ||\n working.command === undefined\n ) {\n throw new TrailStepFailureError({\n code: \"agent_provider_unavailable\",\n message: `Working agent target '${options.target.provider}' does not reference a supported manifest working provider.`,\n details: { provider: options.target.provider },\n });\n }\n\n const thinking = options.target.thinking ?? options.role.thinking;\n const model = optionalNonEmptyString(options.target.model);\n\n const followUp = working.followUp;\n if (followUp?.supported === true) {\n return runTwoPhaseManifestWorking({\n options,\n manifest,\n working,\n followUp,\n extractOutputHook: registration?.manifest.hooks?.extractOutput,\n thinking,\n model,\n });\n }\n\n const args = renderCustomProviderArgs({\n argv:\n working.args ??\n defaultManifestWorkingArgs({\n manifest,\n promptFile: options.files.promptFile,\n outputFile: options.files.outputFile,\n model,\n thinking,\n }),\n values: {\n promptFile: options.files.promptFile,\n outputFile: options.files.outputFile,\n ...(model === undefined ? {} : { model }),\n ...(thinking === undefined ? {} : { thinking }),\n },\n errorCode: \"agent_provider_invalid\",\n commandDescription: \"Manifest working provider command\",\n });\n const captureStdout = working.output?.style !== \"provider-output-file\";\n\n let result: WorkingAgentProcessResult;\n try {\n // npm-installed provider CLIs (e.g. pi) are .cmd shims on Windows and cannot\n // be spawned by bare name with shell:false; resolve to the Node entrypoint\n // (no-op on other platforms) so argv is never reinterpreted by a shell.\n const executable = await resolveCliCommandForSpawn({ command: working.command, args });\n result = await (options.runner ?? spawnWorkingAgentProcess)({\n command: executable.command,\n args: executable.args,\n cwd: options.cwd,\n shell: false,\n stdio: captureStdout ? \"pipe\" : \"inherit\",\n promptFile: options.files.promptFile,\n outputFile: options.files.outputFile,\n ...(model === undefined ? {} : { model }),\n signal: options.signal,\n });\n } catch (error) {\n throw new TrailStepFailureError({\n code: \"agent_provider_spawn_error\",\n message: `Working agent step ${options.step.id} could not start target '${options.target.provider}'.`,\n details: {\n target: options.target.provider,\n ...(model === undefined ? {} : { model }),\n cause: error instanceof Error ? error.message : String(error),\n },\n });\n }\n\n if (result.exitCode !== 0) {\n throw new TrailStepFailureError({\n code: \"agent_provider_failed\",\n message: `Working agent step ${options.step.id} target '${options.target.provider}' exited with code ${result.exitCode}.`,\n details: {\n exitCode: result.exitCode,\n provider: working.command,\n target: options.target.provider,\n ...(model === undefined ? {} : { model }),\n },\n });\n }\n\n await writeCapturedStdoutOutput({\n provider: options.target.provider,\n stepId: options.step.id,\n outputFile: options.files.outputFile,\n captureMode: options.step.output.captureMode,\n stdout: (result as WorkingAgentProcessResult & { readonly stdout?: string }).stdout,\n output: working.output,\n extractOutputHook: registration?.manifest.hooks?.extractOutput,\n });\n\n return readWorkingAgentOutput({\n stepId: options.step.id,\n outputFile: options.files.outputFile,\n step: options.step,\n });\n}\n\n/**\n * Two-phase (Architecture B) execution for manifests with `followUp.supported`.\n *\n * Phase 1 runs the worker against a work-only prompt and captures its raw\n * report to `files.workFile`. Phase 2 is a pinned same-session follow-up that\n * reformats the report to the strict output schema and is the only phase that\n * writes `files.outputFile`. Format failures retry Phase 2 only — the worker\n * (Phase 1) is never re-run — up to `MAX_FORMAT_ATTEMPTS` attempts in the\n * same session before an `agent_target_failed` error is raised.\n */\nasync function runTwoPhaseManifestWorking<TOutput extends PlainObject>(context: {\n readonly options: {\n readonly step: AgentStepRequestConfig<PlainObject, TOutput>;\n readonly cwd: string;\n readonly runner?: WorkingAgentProcessRunner;\n readonly target: TrailStepAgentTarget;\n readonly files: WorkingAgentFiles;\n readonly renderedPrompt: string;\n readonly signal?: AbortSignal;\n };\n readonly manifest: TrailStepProviderManifest;\n readonly working: TrailStepProviderWorkingManifest;\n readonly followUp: TrailStepProviderFollowUpManifest;\n readonly extractOutputHook?: unknown;\n readonly thinking?: WorkflowAgentThinking;\n readonly model?: string;\n}): Promise<TOutput> {\n const { options, working, followUp } = context;\n const { files, step, target } = options;\n const sessionId = randomUUID();\n const captureStdout = working.output?.style !== \"provider-output-file\";\n\n // Fail fast on manifest misconfiguration before running the worker: a\n // supported follow-up without resume args cannot ever complete Phase 2.\n const resumeArgs = followUp.resumeArgs;\n if (resumeArgs === undefined) {\n throw new TrailStepFailureError({\n code: \"agent_provider_invalid\",\n message: `Working agent step ${step.id} target '${target.provider}' declares followUp.supported without followUp.resumeArgs for the format phase.`,\n details: { provider: target.provider },\n });\n }\n\n // Phase 1: overwrite the front-loaded prompt with the work-only prompt.\n await writeFile(files.promptFile, buildWorkPrompt({ prompt: options.renderedPrompt }), \"utf8\");\n\n const phase1Template =\n working.args ??\n defaultManifestWorkingArgs({\n manifest: context.manifest,\n promptFile: files.promptFile,\n outputFile: files.workFile,\n model: context.model,\n thinking: context.thinking,\n });\n const phase1Args = renderCustomProviderArgs({\n argv: phase1Template,\n values: {\n promptFile: files.promptFile,\n outputFile: files.workFile,\n sessionId,\n ...(context.model === undefined ? {} : { model: context.model }),\n ...(context.thinking === undefined ? {} : { thinking: context.thinking }),\n },\n errorCode: \"agent_provider_invalid\",\n commandDescription: \"Manifest working provider command\",\n });\n if (\n followUp.sessionIdFlag !== undefined &&\n !phase1Template.some((arg) => arg.includes(\"{{sessionId}}\"))\n ) {\n phase1Args.push(followUp.sessionIdFlag, sessionId);\n }\n\n const phase1Result = await spawnManifestPhase({\n phase: \"work\",\n stepId: step.id,\n provider: target.provider,\n command: working.command ?? \"\",\n args: phase1Args,\n cwd: options.cwd,\n model: context.model,\n promptFile: files.promptFile,\n outputFile: files.workFile,\n stdio: captureStdout ? \"pipe\" : \"inherit\",\n runner: options.runner,\n signal: options.signal,\n });\n\n if (phase1Result.exitCode !== 0) {\n throw new TrailStepFailureError({\n code: \"agent_provider_failed\",\n message: `Working agent step ${step.id} target '${target.provider}' exited with code ${phase1Result.exitCode}.`,\n details: {\n phase: \"work\",\n exitCode: phase1Result.exitCode,\n provider: working.command,\n target: target.provider,\n ...(context.model === undefined ? {} : { model: context.model }),\n },\n });\n }\n\n if (captureStdout) {\n // Raw work report: deliberately no JSON parsing here.\n await writeFile(files.workFile, phase1Result.stdout ?? \"\", \"utf8\");\n }\n const phase1Tail = await readPhase1Tail(files.workFile);\n await writePhaseUsageFile({\n usageFile: files.usageFile,\n sessionId,\n provider: target.provider,\n model: context.model,\n });\n\n // Phase 2: pinned same-session format follow-up.\n const phase2Args = renderCustomProviderArgs({\n argv: resumeArgs,\n values: {\n sessionId,\n promptFile: files.repairPromptFile,\n outputFile: files.outputFile,\n ...(context.model === undefined ? {} : { model: context.model }),\n ...(context.thinking === undefined ? {} : { thinking: context.thinking }),\n },\n errorCode: \"agent_provider_invalid\",\n commandDescription: \"Manifest follow-up resume command\",\n });\n\n const validationDiagnostics: string[] = [];\n let formatFailureMessage = \"\";\n\n for (let attempt = 1; attempt <= MAX_FORMAT_ATTEMPTS; attempt += 1) {\n await writeFile(\n files.repairPromptFile,\n buildFormatPrompt({\n outputSchema: step.output.jsonSchema,\n ...(attempt === 1 ? {} : { validationErrors: [formatFailureMessage] }),\n }),\n \"utf8\",\n );\n\n const phase2Result = await spawnManifestPhase({\n phase: \"format\",\n stepId: step.id,\n provider: target.provider,\n command: working.command ?? \"\",\n args: phase2Args,\n cwd: options.cwd,\n model: context.model,\n promptFile: files.repairPromptFile,\n outputFile: files.outputFile,\n stdio: captureStdout ? \"pipe\" : \"inherit\",\n runner: options.runner,\n signal: options.signal,\n });\n\n if (phase2Result.exitCode !== 0) {\n throw new TrailStepFailureError({\n code: \"agent_provider_failed\",\n message: `Working agent step ${step.id} target '${target.provider}' exited with code ${phase2Result.exitCode}.`,\n details: {\n phase: \"format\",\n attempt,\n sessionId,\n exitCode: phase2Result.exitCode,\n provider: working.command,\n target: target.provider,\n ...(context.model === undefined ? {} : { model: context.model }),\n },\n });\n }\n\n try {\n await writeCapturedStdoutOutput({\n provider: target.provider,\n stepId: step.id,\n outputFile: files.outputFile,\n captureMode: step.output.captureMode,\n stdout: phase2Result.stdout,\n output: working.output,\n extractOutputHook: context.extractOutputHook,\n });\n return await readWorkingAgentOutput({ stepId: step.id, outputFile: files.outputFile, step });\n } catch (error) {\n // Output validation/parse failure: retry Phase 2 in the SAME session.\n // The worker (Phase 1) is never re-run for format failures.\n formatFailureMessage = error instanceof Error ? error.message : String(error);\n validationDiagnostics.push(`format attempt ${attempt}: ${formatFailureMessage}`);\n }\n }\n\n throw new TrailStepFailureError({\n code: \"agent_target_failed\",\n message: `Working agent step ${step.id} target '${target.provider}' failed output validation after ${MAX_FORMAT_ATTEMPTS} format attempts in session ${sessionId}.`,\n details: {\n provider: target.provider,\n sessionId,\n attempts: MAX_FORMAT_ATTEMPTS,\n validationDiagnostics,\n phase1Tail,\n },\n });\n}\n\nconst MAX_FORMAT_ATTEMPTS = 3;\nconst PHASE_1_TAIL_LIMIT = 2000;\n\nasync function spawnManifestPhase(options: {\n readonly phase: \"work\" | \"format\";\n readonly stepId: string;\n readonly provider: string;\n readonly command: string;\n readonly args: readonly string[];\n readonly cwd: string;\n readonly model?: string;\n readonly promptFile: string;\n readonly outputFile: string;\n readonly stdio: \"pipe\" | \"inherit\";\n readonly runner?: WorkingAgentProcessRunner;\n readonly signal?: AbortSignal;\n}): Promise<WorkingAgentProcessResult> {\n // npm-installed provider CLIs (e.g. pi) are .cmd shims on Windows and cannot\n // be spawned by bare name with shell:false; resolve to the Node entrypoint\n // (no-op on other platforms) so argv is never reinterpreted by a shell.\n const executable = await resolveCliCommandForSpawn({\n command: options.command,\n args: options.args,\n });\n try {\n return await (options.runner ?? spawnWorkingAgentProcess)({\n command: executable.command,\n args: executable.args,\n cwd: options.cwd,\n shell: false,\n stdio: options.stdio,\n promptFile: options.promptFile,\n outputFile: options.outputFile,\n ...(options.model === undefined ? {} : { model: options.model }),\n signal: options.signal,\n });\n } catch (error) {\n throw new TrailStepFailureError({\n code: \"agent_provider_spawn_error\",\n message: `Working agent step ${options.stepId} could not start target '${options.provider}'.`,\n details: {\n phase: options.phase,\n target: options.provider,\n ...(options.model === undefined ? {} : { model: options.model }),\n cause: error instanceof Error ? error.message : String(error),\n },\n });\n }\n}\n\nasync function readPhase1Tail(workFile: string): Promise<string> {\n try {\n const workText = await readFile(workFile, \"utf8\");\n return workText.length > PHASE_1_TAIL_LIMIT ? workText.slice(-PHASE_1_TAIL_LIMIT) : workText;\n } catch {\n return \"\";\n }\n}\n\nasync function writePhaseUsageFile(options: {\n readonly usageFile: string;\n readonly sessionId: string;\n readonly provider: string;\n readonly model?: string;\n}): Promise<void> {\n try {\n await writeFile(\n options.usageFile,\n `${JSON.stringify(\n {\n sessionId: options.sessionId,\n provider: options.provider,\n ...(options.model === undefined ? {} : { model: options.model }),\n phases: 2,\n },\n null,\n 2,\n )}\\n`,\n \"utf8\",\n );\n } catch {\n // Best-effort only; never mask the main result.\n }\n}\n\nasync function writeCapturedStdoutOutput(options: {\n readonly provider: string;\n readonly stepId: string;\n readonly outputFile: string;\n readonly captureMode?: \"json\" | \"raw-text\";\n readonly stdout?: string;\n readonly output?: TrailStepProviderOutputManifest;\n readonly extractOutputHook?: unknown;\n}): Promise<void> {\n if (options.stdout === undefined) {\n return;\n }\n\n if (\n options.output?.style === \"stdout-json-envelope\" ||\n options.output?.style === \"stdout-jsonl-transcript\"\n ) {\n await writeEnvelopeOutput({ ...options, stdout: options.stdout });\n return;\n }\n\n if (isRecord(options.extractOutputHook)) {\n const extracted = extractJsonObject(options.stdout);\n if (extracted === undefined) {\n throw new TrailStepFailureError({\n code: \"agent_provider_output_invalid\",\n message: `Working agent step ${options.stepId} provider '${options.provider}' could not extract JSON output from stdout using declared hook metadata.`,\n details: { provider: options.provider },\n });\n }\n\n await writeFile(options.outputFile, `${JSON.stringify(extracted)}\\n`, \"utf8\");\n }\n}\n\nasync function writeEnvelopeOutput(options: {\n readonly provider: string;\n readonly stepId: string;\n readonly outputFile: string;\n readonly captureMode?: \"json\" | \"raw-text\";\n readonly stdout: string;\n readonly output?: TrailStepProviderOutputManifest;\n}): Promise<void> {\n try {\n const resultField = options.output?.parsing?.resultField ?? \"result\";\n if (options.captureMode === \"raw-text\") {\n const text = extractEnvelopeText(options.stdout, { resultField });\n await writeFile(options.outputFile, text, \"utf8\");\n return;\n }\n\n const extracted = extractEnvelopeOutput(options.stdout, { resultField });\n await writeFile(options.outputFile, `${JSON.stringify(extracted)}\\n`, \"utf8\");\n } catch (error) {\n throw new TrailStepFailureError({\n code: \"agent_provider_output_invalid\",\n message: `Working agent step ${options.stepId} provider '${options.provider}' could not parse stdout envelope output.`,\n details: {\n provider: options.provider,\n cause: error instanceof Error ? error.message : String(error),\n },\n });\n }\n}\n\nfunction defaultManifestWorkingArgs(options: {\n readonly manifest: TrailStepProviderManifest;\n readonly promptFile: string;\n readonly outputFile: string;\n readonly model?: string;\n readonly thinking?: WorkflowAgentThinking;\n}): readonly string[] {\n const args: string[] = [];\n\n if (options.model !== undefined && options.manifest.model.supported) {\n args.push(...renderFlaggedValue(options.manifest.model.flag, options.model));\n }\n\n if (options.thinking !== undefined && options.manifest.thinking.supported) {\n args.push(...renderFlaggedValue(options.manifest.thinking.flag, options.thinking));\n }\n\n if (options.manifest.working.prompt?.reference === \"at-prefixed-argument\") {\n args.push(`@${options.promptFile}`);\n } else {\n args.push(\"--prompt-file\", options.promptFile);\n }\n\n if (options.manifest.working.output?.style === \"provider-output-file\") {\n args.push(\"--output-file\", options.outputFile);\n }\n\n return args;\n}\n\nfunction renderFlaggedValue(flag: string | undefined, value: string): readonly string[] {\n if (flag === undefined) {\n return [];\n }\n\n const parts = flag.split(/\\s+/u).filter(Boolean);\n if (parts.length === 0) {\n return [];\n }\n\n if (parts.length === 2) {\n return [parts[0] as string, `${parts[1] as string}=${value}`];\n }\n\n return [...parts, value];\n}\n\nfunction optionalNonEmptyString(value: string | undefined): string | undefined {\n return value === undefined || value.length === 0 ? undefined : value;\n}\n\nfunction extractJsonObject(stdout: string): Record<string, unknown> | undefined {\n const trimmed = stdout.trim();\n const candidates = [trimmed];\n const firstBrace = trimmed.indexOf(\"{\");\n const lastBrace = trimmed.lastIndexOf(\"}\");\n if (firstBrace >= 0 && lastBrace > firstBrace) {\n candidates.push(trimmed.slice(firstBrace, lastBrace + 1));\n }\n\n for (const candidate of candidates) {\n try {\n const parsed = JSON.parse(candidate) as unknown;\n if (isRecord(parsed)) {\n return parsed;\n }\n } catch {\n // Try the next candidate.\n }\n }\n\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\n\n/**\n * Extraction logic ported from the retired `claude-rpc-trailstep-agent.mjs` mock\n * wrapper's `extractTrailStepOutput`, parameterized by which envelope field holds\n * the provider's final text (e.g. `\"result\"` for `claude --output-format json`).\n *\n * Handles four shapes of vendor CLI stdout:\n * 1. A single JSON envelope object whose `resultField` holds the final text\n * (or is itself already the final JSON object).\n * 2. Streaming JSON-lines output, where the last line containing a usable\n * `resultField`/`content` wins.\n * 3. A `resultField` value that is itself a message-shaped object with a\n * `content` array of `{type, text}` blocks (confirmed empirically for\n * `pi --mode json`, whose per-event `\"message\"` field nests the final\n * answer inside `message.content[].text` rather than a flat string like\n * Claude's `\"result\"`) — all `type: \"text\"` blocks are concatenated, in\n * order, and the joined text is parsed the same way a flat string would be.\n * 4. Plain text that itself contains (or is) the JSON object.\n */\nexport interface EnvelopeOptions {\n readonly resultField: string;\n}\n\nexport interface EnvelopeMetadataOptions {\n readonly harnessDurationMs: number;\n}\n\nexport interface ClaudeEnvelopeMetadata {\n readonly usage?: PlainObject;\n readonly costUsd?: number;\n readonly durationMs?: number;\n readonly harnessDurationMs: number;\n readonly turns?: number;\n readonly sessionId?: string;\n}\n\nexport function extractEnvelopeMetadata(\n rawStdout: string,\n options: EnvelopeMetadataOptions,\n): ClaudeEnvelopeMetadata {\n const metadata: Record<string, unknown> = { harnessDurationMs: options.harnessDurationMs };\n const envelope = parseEnvelopeObject(rawStdout);\n\n if (envelope) {\n const usage = camelCaseUsage(envelope.usage);\n if (usage) {\n metadata.usage = usage;\n }\n\n if (typeof envelope.total_cost_usd === \"number\") {\n metadata.costUsd = envelope.total_cost_usd;\n }\n\n if (typeof envelope.duration_ms === \"number\") {\n metadata.durationMs = envelope.duration_ms;\n }\n\n if (typeof envelope.num_turns === \"number\") {\n metadata.turns = envelope.num_turns;\n }\n\n if (typeof envelope.session_id === \"string\") {\n metadata.sessionId = envelope.session_id;\n }\n }\n\n return metadata as unknown as ClaudeEnvelopeMetadata;\n}\n\nexport function extractEnvelopeOutput(rawStdout: string, options: EnvelopeOptions): PlainObject {\n const text = rawStdout.trim();\n if (!text) {\n throw new Error(\"Provider process returned empty stdout.\");\n }\n\n const parsedEnvelope = parseJson(text);\n if (isPlainObject(parsedEnvelope)) {\n if (parsedEnvelope.is_error === true) {\n throw new Error(\n `Provider reported an error: ${String(parsedEnvelope[options.resultField] ?? text)}`,\n );\n }\n\n const resolved = resolveFieldValue(parsedEnvelope[options.resultField]);\n if (resolved) {\n return resolved;\n }\n\n if (typeof parsedEnvelope.content === \"string\") {\n return parseObjectFromText(parsedEnvelope.content);\n }\n }\n\n const streamResult = parseLastJsonLineResult(text, options.resultField);\n if (streamResult) {\n return streamResult;\n }\n\n return parseObjectFromText(text);\n}\n\n/**\n * Text-only counterpart to `extractEnvelopeOutput`, for steps whose\n * `captureMode` is `\"raw-text\"` (see `Document.captureMode` in\n * `authoring/document/document.ts`): the agent's final answer is a plain-text\n * document, not JSON, so the `resultField` value must be taken verbatim\n * rather than JSON-parsed. Mirrors the same four documented stdout shapes as\n * `extractEnvelopeOutput` — single JSON envelope, JSON-lines transcript,\n * message-shaped `resultField` with a `content` block array, and plain text —\n * but never throws on non-JSON text; the raw text is always the answer.\n */\nexport function extractEnvelopeText(rawStdout: string, options: EnvelopeOptions): string {\n const text = rawStdout.trim();\n if (!text) {\n throw new Error(\"Provider process returned empty stdout.\");\n }\n\n const parsedEnvelope = parseJson(text);\n if (isPlainObject(parsedEnvelope)) {\n if (parsedEnvelope.is_error === true) {\n throw new Error(\n `Provider reported an error: ${String(parsedEnvelope[options.resultField] ?? text)}`,\n );\n }\n\n const resolved = resolveFieldText(parsedEnvelope[options.resultField]);\n if (resolved !== undefined) {\n return resolved;\n }\n\n if (typeof parsedEnvelope.content === \"string\") {\n return parsedEnvelope.content;\n }\n }\n\n const streamResult = parseLastJsonLineText(text, options.resultField);\n if (streamResult !== undefined) {\n return streamResult;\n }\n\n return text;\n}\n\nfunction parseLastJsonLineText(text: string, resultField: string): string | undefined {\n const lines = text\n .split(/\\r?\\n/u)\n .map((line) => line.trim())\n .filter(Boolean);\n\n for (const line of [...lines].reverse()) {\n const parsed = parseJson(line);\n if (!isPlainObject(parsed)) {\n continue;\n }\n\n const resolved = resolveFieldText(parsed[resultField]);\n if (resolved !== undefined) {\n return resolved;\n }\n\n if (typeof parsed.content === \"string\") {\n return parsed.content;\n }\n }\n\n return undefined;\n}\n\n/**\n * Text-only counterpart to `resolveFieldValue`: resolves a raw `resultField`\n * value into the final raw text, handling a plain string (verbatim) or a\n * message-shaped object carrying a `content` array of text blocks (Pi),\n * without ever attempting to JSON-parse the resolved text.\n */\nfunction resolveFieldText(fieldValue: unknown): string | undefined {\n if (typeof fieldValue === \"string\") {\n return fieldValue;\n }\n\n if (isPlainObject(fieldValue)) {\n return extractTextFromContentBlocks(fieldValue);\n }\n\n return undefined;\n}\n\nfunction parseLastJsonLineResult(text: string, resultField: string): PlainObject | undefined {\n const lines = text\n .split(/\\r?\\n/u)\n .map((line) => line.trim())\n .filter(Boolean);\n\n for (const line of [...lines].reverse()) {\n const parsed = parseJson(line);\n if (!isPlainObject(parsed)) {\n continue;\n }\n\n const resolved = resolveFieldValue(parsed[resultField]);\n if (resolved) {\n return resolved;\n }\n\n if (typeof parsed.content === \"string\") {\n return parseObjectFromText(parsed.content);\n }\n }\n\n return undefined;\n}\n\n/**\n * Resolves a raw `resultField` value into the final output object, handling\n * the three shapes that field's value can take across vendors: a JSON-text\n * string (Claude), an object that already is the final output (also legal for\n * Claude-style envelopes), or a message-shaped object carrying a `content`\n * array of text blocks (Pi). Returns `undefined` when `fieldValue` is absent\n * or is a plain object with no extractable text, so callers can fall through\n * to their next fallback instead of misreporting an unrelated object.\n */\nfunction resolveFieldValue(fieldValue: unknown): PlainObject | undefined {\n if (typeof fieldValue === \"string\") {\n return parseObjectFromText(fieldValue);\n }\n\n if (isPlainObject(fieldValue)) {\n const blockText = extractTextFromContentBlocks(fieldValue);\n if (blockText !== undefined) {\n return parseObjectFromText(blockText);\n }\n\n return fieldValue;\n }\n\n return undefined;\n}\n\n/**\n * Extracts and concatenates `text` from every `{type: \"text\", text: string}`\n * content block in `value.content`, if `value.content` is such an array.\n * Returns `undefined` when `value` has no `content` array to extract from, so\n * the caller can fall back to treating `value` itself as the output object.\n */\nfunction extractTextFromContentBlocks(value: PlainObject): string | undefined {\n const content = value.content;\n if (!Array.isArray(content)) {\n return undefined;\n }\n\n const textParts = content\n .filter(isPlainObject)\n .filter((block) => block.type === \"text\" && typeof block.text === \"string\")\n .map((block) => block.text as string);\n\n if (textParts.length === 0) {\n return undefined;\n }\n\n return textParts.join(\"\");\n}\n\nfunction parseObjectFromText(text: string): PlainObject {\n const parsed = parseJson(text.trim());\n if (isPlainObject(parsed)) {\n return parsed;\n }\n\n const firstBrace = text.indexOf(\"{\");\n const lastBrace = text.lastIndexOf(\"}\");\n if (firstBrace === -1 || lastBrace === -1 || lastBrace <= firstBrace) {\n throw new Error(`Provider response did not contain a JSON object: ${text}`);\n }\n\n const extracted = parseJson(text.slice(firstBrace, lastBrace + 1));\n if (!isPlainObject(extracted)) {\n throw new Error(\"Provider response JSON was not an object.\");\n }\n\n return extracted;\n}\n\nfunction parseEnvelopeObject(rawStdout: string): PlainObject | undefined {\n const text = rawStdout.trim();\n const parsed = parseJson(text);\n if (isPlainObject(parsed)) {\n return parsed;\n }\n\n const lines = text\n .split(/\\r?\\n/u)\n .map((line) => line.trim())\n .filter(Boolean);\n\n for (const line of [...lines].reverse()) {\n const parsedLine = parseJson(line);\n if (isPlainObject(parsedLine)) {\n return parsedLine;\n }\n }\n\n return undefined;\n}\n\nfunction camelCaseUsage(value: unknown): PlainObject | undefined {\n if (!isPlainObject(value)) {\n return undefined;\n }\n\n const usage: Record<string, unknown> = {};\n for (const [key, fieldValue] of Object.entries(value)) {\n if (typeof fieldValue === \"number\") {\n usage[snakeToCamel(key)] = fieldValue;\n }\n }\n\n return Object.keys(usage).length > 0 ? usage : undefined;\n}\n\nfunction snakeToCamel(value: string): string {\n return value.replace(/_([a-z])/gu, (_match, letter: string) => letter.toUpperCase());\n}\n\nfunction parseJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","/**\n * Two-phase working-agent prompts (Architecture B).\n *\n * Phase 1 (work): the agent does the task and reports naturally. The prompt\n * deliberately says nothing about output files, JSON, or schemas — mentioning\n * them here is what causes long implement turns to emit domain JSON instead\n * of the wrapper envelope.\n *\n * Phase 2 (format): a pinned same-session follow-up asks the agent to\n * reformat its last answer to the strict output schema. The session already\n * contains the Phase 1 work, so the report text is not re-sent.\n */\n\nexport function buildWorkPrompt(options: { readonly prompt: string }): string {\n return [\n \"# TrailStep working-agent task\",\n \"\",\n \"Do the task described below.\",\n \"\",\n \"When you are done, report what you did as your final answer in natural prose or markdown:\",\n \"what you changed or found, the key facts a formatter would need (status intent,\",\n \"summary, files changed, results), and any question you need answered if blocked.\",\n \"\",\n \"## Original prompt\",\n \"\",\n options.prompt,\n \"\",\n ].join(\"\\n\");\n}\n\nexport function buildFormatPrompt(options: {\n readonly outputSchema: Record<string, unknown>;\n readonly validationErrors?: readonly string[];\n}): string {\n const lines = [\n \"# TrailStep format follow-up\",\n \"\",\n \"Reformat your last answer in THIS session to exactly one JSON object as your entire final answer, and nothing else.\",\n \"Do not redo the work. Do not include prose, markdown fences, or multiple JSON values - only the JSON object itself.\",\n \"\",\n \"The JSON object must match this output schema:\",\n \"\",\n \"```json\",\n JSON.stringify(options.outputSchema, null, 2),\n \"```\",\n ];\n if (options.validationErrors !== undefined && options.validationErrors.length > 0) {\n lines.push(\n \"\",\n \"Your previous reformatted answer failed validation with these errors:\",\n \"\",\n ...options.validationErrors.map((error) => `- ${error}`),\n \"\",\n \"Fix only the formatting to satisfy the schema.\",\n );\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n","import type { TrailStepAgentTarget } from \"../../../agent-targeting/targeting.types.js\";\nimport { TrailStepFailureError } from \"../../../contracts/failures/failure.js\";\n\nexport interface WorkingAgentAttemptFailure {\n readonly target: string;\n readonly model?: string;\n readonly code: string;\n readonly message: string;\n readonly details?: unknown;\n}\n\nexport function summarizeWorkingAgentAttemptFailure(\n target: TrailStepAgentTarget,\n error: unknown,\n): WorkingAgentAttemptFailure {\n if (error instanceof TrailStepFailureError) {\n return {\n target: target.provider,\n ...(target.model === undefined ? {} : { model: target.model }),\n code: error.failure.code,\n message: error.failure.message,\n ...(error.failure.details === undefined ? {} : { details: error.failure.details }),\n };\n }\n\n return {\n target: target.provider,\n ...(target.model === undefined ? {} : { model: target.model }),\n code: \"agent_target_failed\",\n message: error instanceof Error ? error.message : \"Working agent target failed.\",\n };\n}\n","import { join, relative } from \"node:path\";\n\nexport function resolveSubPromptArtifactPaths(options: {\n readonly runDir: string;\n readonly stepDir: string;\n readonly ordinal: number;\n readonly fingerprint: string;\n}): {\n readonly subPromptDir: string;\n readonly promptFile: string;\n readonly outputFile: string;\n readonly usageFile: string;\n readonly runRelative: {\n readonly subPromptDir: string;\n readonly promptFile: string;\n readonly outputFile: string;\n };\n} {\n const artifactSubPromptId = `${String(options.ordinal).padStart(4, \"0\")}-${options.fingerprint.slice(0, 12)}`;\n const subPromptDir = join(options.stepDir, \"subPrompts\", artifactSubPromptId);\n const promptFile = join(subPromptDir, \"prompt.txt\");\n const outputFile = join(subPromptDir, \"output.json\");\n const usageFile = join(subPromptDir, \"usage.json\");\n\n return {\n subPromptDir,\n promptFile,\n outputFile,\n usageFile,\n runRelative: {\n subPromptDir: toRunRelativePath(options.runDir, subPromptDir),\n promptFile: toRunRelativePath(options.runDir, promptFile),\n outputFile: toRunRelativePath(options.runDir, outputFile),\n },\n };\n}\n\nfunction toRunRelativePath(runDir: string, path: string): string {\n return relative(runDir, path).replaceAll(\"\\\\\", \"/\");\n}\n","import type { Failure } from \"../../contracts/failures/failure.js\";\n\nexport function isFailureLikeError(error: unknown): error is { readonly failure: Failure } {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"failure\" in error &&\n typeof error.failure === \"object\" &&\n error.failure !== null &&\n \"code\" in error.failure &&\n typeof error.failure.code === \"string\" &&\n \"message\" in error.failure &&\n typeof error.failure.message === \"string\"\n );\n}\n","import type { Failure } from \"../../contracts/failures/failure.js\";\nimport { TrailStepFailureError } from \"../../contracts/failures/failure.js\";\nimport type { RunContext } from \"../../contracts/run-context/run-context.types.js\";\nimport { createEvent } from \"../events/create-run-event.js\";\nimport { isFailureLikeError } from \"../failures/failure-like.js\";\n\nexport async function emitSubPromptFailed(options: {\n readonly context: RunContext;\n readonly parentStepId: string;\n readonly ordinal: number;\n readonly fingerprint?: string;\n readonly artifactPaths?: {\n readonly subPromptDir: string;\n readonly promptFile: string;\n readonly outputFile: string;\n };\n readonly failure: Failure;\n}): Promise<void> {\n await options.context.emit?.(\n createEvent({\n runId: options.context.id,\n workflowId: options.context.workflowId ?? \"\",\n stepId: options.parentStepId,\n type: \"subPrompt.failed\",\n payload: {\n parentStepId: options.parentStepId,\n ordinal: options.ordinal,\n ...(options.fingerprint === undefined ? {} : { fingerprint: options.fingerprint }),\n ...(options.artifactPaths === undefined ? {} : { artifactPaths: options.artifactPaths }),\n failure: options.failure,\n },\n }),\n );\n}\n\nexport function maxSubPromptsGuardError(maxSubPrompts: number): TrailStepFailureError {\n return new TrailStepFailureError({\n code: \"max_sub_prompts_exceeded\",\n message: `workflow exceeded maxSubPrompts guard (${maxSubPrompts})`,\n });\n}\n\nexport function throwMissingSubPromptAgentConfig(options: {\n readonly workflowId: string;\n readonly parentStepId: string;\n readonly subPromptId: string;\n readonly agent: string;\n}): never {\n throw new TrailStepFailureError({\n code: \"missing_agent_config\",\n message: `Missing .trailstep/config.json: workflow ${options.workflowId} parent step ${options.parentStepId} subPrompt ${options.subPromptId} needs configured working agent '${options.agent}'.`,\n details: {\n workflowId: options.workflowId,\n parentStepId: options.parentStepId,\n subPromptId: options.subPromptId,\n agent: options.agent,\n mode: \"working\",\n },\n });\n}\n\nexport function subPromptFailureError(error: unknown): TrailStepFailureError {\n if (error instanceof TrailStepFailureError) {\n if (error.failure.code === \"validation_failed\") {\n return new TrailStepFailureError({\n ...error.failure,\n message: normalizeSubPromptValidationMessage(error.failure.message),\n });\n }\n\n return error;\n }\n\n if (isFailureLikeError(error)) {\n return new TrailStepFailureError(error.failure);\n }\n\n return new TrailStepFailureError({\n code: \"sub_prompt_failed\",\n message: error instanceof Error ? error.message : \"subPrompt failed.\",\n ...(error instanceof Error\n ? { details: { name: error.name } }\n : error === undefined\n ? {}\n : { details: { cause: error } }),\n });\n}\n\nfunction normalizeSubPromptValidationMessage(message: string): string {\n if (message.startsWith(\"subPrompt output failed schema validation\")) {\n return message;\n }\n\n const diagnostics = message.match(/failed schema validation: (.*)$/)?.[1];\n return diagnostics === undefined\n ? `subPrompt output failed schema validation: ${message}`\n : `subPrompt output failed schema validation: ${diagnostics}`;\n}\n","import { createHash } from \"node:crypto\";\n\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\n\nexport function fingerprintSubPrompt(options: {\n readonly input: PlainObject;\n readonly prompt: string;\n}): string {\n return createHash(\"sha256\").update(stableJsonStringify(options)).digest(\"hex\");\n}\n\nexport function stableJsonStringify(value: unknown): string {\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableJsonStringify(item)).join(\",\")}]`;\n }\n\n if (isPlainObject(value)) {\n const entries = Object.entries(value).sort(([left], [right]) => left.localeCompare(right));\n return `{${entries\n .map(([key, entryValue]) => `${JSON.stringify(key)}:${stableJsonStringify(entryValue)}`)\n .join(\",\")}}`;\n }\n\n return JSON.stringify(value);\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n","import type { RunContextEvent } from \"../../contracts/run-context/run-context.types.js\";\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\n\ninterface CompletedSubPromptEventPayload extends PlainObject {\n readonly parentStepId: string;\n readonly ordinal: number;\n readonly fingerprint: string;\n readonly output: PlainObject;\n}\n\nexport function findCompletedSubPromptEvent(\n events: readonly RunContextEvent[],\n parentStepId: string,\n ordinal: number,\n fingerprint: string,\n): RunContextEvent<CompletedSubPromptEventPayload> | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (event?.type !== \"subPrompt.completed\") {\n continue;\n }\n\n const payload = event.payload;\n if (\n payload.parentStepId === parentStepId &&\n payload.ordinal === ordinal &&\n payload.fingerprint === fingerprint &&\n isPlainObject(payload.output)\n ) {\n return event as RunContextEvent<CompletedSubPromptEventPayload>;\n }\n }\n\n return undefined;\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n","import type { AgentPrompt } from \"../../contracts/agents/agent-adapter.types.js\";\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport { runSubPrompt } from \"../../runtime/sub-prompts/run-sub-prompt.js\";\nimport type {\n PromptTemplateSource,\n SubPromptFactory,\n SubPromptOptions,\n} from \"./continuation.types.js\";\n\nexport function subPrompt<\n TInput extends PlainObject = PlainObject,\n TOutput extends PlainObject = PlainObject,\n>(\n source: AgentPrompt<TInput> | PromptTemplateSource,\n options: SubPromptOptions<TOutput>,\n): SubPromptFactory<TInput, TOutput> {\n const run = (input?: TInput): Promise<TOutput> => runSubPrompt(source, options, input);\n\n return run as SubPromptFactory<TInput, TOutput>;\n}\n","import type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport type { WorkflowInvocationOptions } from \"../step/continuation.types.js\";\nimport type { DefinedWorkflow, WorkflowBuilderOptions } from \"./workflow.types.js\";\n\nexport type { DefinedWorkflow, WorkflowBuilderOptions } from \"./workflow.types.js\";\n\nexport function defineWorkflow<\n TInput extends PlainObject = PlainObject,\n TOutput extends PlainObject = PlainObject,\n>(options: WorkflowBuilderOptions<TInput, TOutput>): DefinedWorkflow<TInput, TOutput> {\n assertBuilderObject(options, \"defineWorkflow\");\n if (typeof options.start !== \"function\") {\n throw new TypeError(\"defineWorkflow requires a start function.\");\n }\n\n const workflow = ((input: TInput, invocationOptions?: WorkflowInvocationOptions) => {\n const makeInvocation = (postContinuation?: (output: TOutput) => unknown) => ({\n kind: \"workflowInvocation\" as const,\n workflow,\n input,\n ...(invocationOptions === undefined ? {} : { options: invocationOptions }),\n ...(postContinuation === undefined ? {} : { postContinuation }),\n post(continuation: (output: TOutput) => unknown) {\n return makeInvocation(continuation);\n },\n });\n\n return makeInvocation();\n }) as unknown as DefinedWorkflow<TInput, TOutput>;\n\n return Object.assign(workflow, options);\n}\n\nfunction assertBuilderObject(\n value: unknown,\n builderName: string,\n): asserts value is { readonly id: string } {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new TypeError(`${builderName} requires a single object argument.`);\n }\n if (typeof (value as { readonly id?: unknown }).id !== \"string\") {\n throw new TypeError(`${builderName} requires an id string.`);\n }\n}\n","import type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport { runContextStorage } from \"../../runtime/run-context/run-context-storage.js\";\n\nexport type DeepReadonly<T> = T extends (...args: never[]) => unknown\n ? T\n : T extends readonly (infer U)[]\n ? readonly DeepReadonly<U>[]\n : T extends object\n ? { readonly [K in keyof T]: DeepReadonly<T[K]> }\n : T;\n\nexport interface WorkflowInputApi<TInput extends PlainObject = PlainObject> {\n input(): Promise<DeepReadonly<TInput>>;\n input<TOverrideInput extends PlainObject>(): Promise<DeepReadonly<TOverrideInput>>;\n inputValue<TKey extends keyof TInput & string>(key: TKey): Promise<DeepReadonly<TInput[TKey]>>;\n inputValue<TOverrideInput extends PlainObject, TKey extends keyof TOverrideInput & string>(\n key: TKey,\n ): Promise<DeepReadonly<TOverrideInput[TKey]>>;\n withInput<TTypedInput extends PlainObject>(): WorkflowInputApi<TTypedInput>;\n}\n\nexport const workflow: WorkflowInputApi = createWorkflowInputApi<PlainObject>();\n\nfunction createWorkflowInputApi<TInput extends PlainObject>(): WorkflowInputApi<TInput> {\n return {\n async input() {\n return cloneAndFreeze(readWorkflowInput());\n },\n async inputValue(key: string) {\n const input = readWorkflowInput();\n return cloneAndFreeze(input[key]);\n },\n withInput<TTypedInput extends PlainObject>(): WorkflowInputApi<TTypedInput> {\n return createWorkflowInputApi<TTypedInput>();\n },\n } as WorkflowInputApi<TInput>;\n}\n\nfunction readWorkflowInput(): PlainObject {\n const runContext = runContextStorage.getStore();\n if (!runContext) {\n throw new Error(\"workflow.input() called outside an active TrailStep run.\");\n }\n\n const input = runContext.events?.().find((event) => event.type === \"workflow.started\")\n ?.payload.input;\n if (!isPlainObject(input)) {\n throw new Error(\"workflow input is not available in the active TrailStep run.\");\n }\n\n return input;\n}\n\nfunction cloneAndFreeze<T>(value: T): DeepReadonly<T> {\n return deepFreeze(structuredClone(value)) as DeepReadonly<T>;\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value !== \"object\" || value === null) {\n return value;\n }\n\n Object.freeze(value);\n for (const property of Object.values(value)) {\n deepFreeze(property);\n }\n\n return value;\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n","import { lte } from \"semver\";\n\nimport type {\n DeprecationEntry,\n DeprecationManifest,\n DeprecationStatus,\n DeprecationTargetPackage,\n} from \"./deprecations.types.js\";\n\n// Scaffolding only — genuinely empty. No deprecation exists yet in this codebase. Real entries get\n// appended here the day a real breaking change to @trailstep/core or @trailstep/authoring's authoring API\n// actually happens. Do not add a fake/example entry to this array.\nexport const deprecationManifest: DeprecationManifest = [];\n\nexport interface FindDeprecationsAsOfQuery {\n readonly package: DeprecationTargetPackage;\n readonly version: string;\n}\n\n/**\n * Returns every manifest entry for query.package whose deprecatedSince is at or before\n * query.version, tagged with a severity. Calling this once with version set to a target\n * version naturally captures every entry between the installed version and the target, no matter\n * how many majors are being skipped in one update.\n */\nexport function findDeprecationsAsOf(\n manifest: DeprecationManifest,\n query: FindDeprecationsAsOfQuery,\n): readonly DeprecationStatus[] {\n return manifest\n .filter((entry) => entry.package === query.package && lte(entry.deprecatedSince, query.version))\n .map((entry) => toDeprecationStatus(entry, query.version));\n}\n\nfunction toDeprecationStatus(entry: DeprecationEntry, version: string): DeprecationStatus {\n const isRemoved = entry.removedIn !== undefined && lte(entry.removedIn, version);\n return { ...entry, severity: isRemoved ? \"blocking\" : \"warning\" };\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport const CANCELLATION_MARKER_FILE = \"cancel.json\";\n\nexport interface CancellationMarker {\n readonly requestedAt?: string;\n readonly reason?: string;\n readonly source?: string;\n}\n\nexport class WorkflowCancellationError extends Error {\n readonly cancellation: CancellationMarker;\n\n constructor(cancellation: CancellationMarker = {}) {\n super(\"Workflow cancellation requested.\");\n this.name = \"WorkflowCancellationError\";\n this.cancellation = cancellation;\n }\n}\n\nexport function cancellationMarkerPath(runDir: string): string {\n return join(runDir, CANCELLATION_MARKER_FILE);\n}\n\nexport async function readCancellationMarker(\n runDir: string,\n): Promise<CancellationMarker | undefined> {\n let contents: string;\n try {\n contents = await readFile(cancellationMarkerPath(runDir), \"utf8\");\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n\n try {\n return normalizeCancellationMarker(JSON.parse(contents));\n } catch {\n return {};\n }\n}\n\nexport async function writeCancellationMarker(options: {\n readonly runDir: string;\n readonly reason?: string;\n readonly source?: string;\n readonly requestedAt?: Date;\n}): Promise<{ readonly marker: CancellationMarker; readonly alreadyExisted: boolean }> {\n const marker: CancellationMarker = {\n requestedAt: (options.requestedAt ?? new Date()).toISOString(),\n ...(options.reason === undefined ? {} : { reason: options.reason }),\n ...(options.source === undefined ? {} : { source: options.source }),\n };\n const path = cancellationMarkerPath(options.runDir);\n\n try {\n await mkdir(options.runDir, { recursive: true });\n await writeFile(path, `${JSON.stringify(marker, null, 2)}\\n`, { flag: \"wx\" });\n return { marker, alreadyExisted: false };\n } catch (error) {\n if (isNodeError(error) && error.code === \"EEXIST\") {\n return { marker: (await readCancellationMarker(options.runDir)) ?? {}, alreadyExisted: true };\n }\n throw error;\n }\n}\n\nexport function cancellationPayload(cancellation: CancellationMarker): Record<string, unknown> {\n return {\n ...(cancellation.requestedAt === undefined ? {} : { requestedAt: cancellation.requestedAt }),\n ...(cancellation.reason === undefined ? {} : { reason: cancellation.reason }),\n ...(cancellation.source === undefined ? {} : { source: cancellation.source }),\n };\n}\n\nexport function isWorkflowCancellationError(error: unknown): error is WorkflowCancellationError {\n return error instanceof WorkflowCancellationError;\n}\n\nexport function throwIfCancellationRequested(cancellation: CancellationMarker | undefined): void {\n if (cancellation !== undefined) {\n throw new WorkflowCancellationError(cancellation);\n }\n}\n\nfunction normalizeCancellationMarker(value: unknown): CancellationMarker {\n if (!isPlainObject(value)) {\n return {};\n }\n\n return {\n ...(typeof value.requestedAt === \"string\" ? { requestedAt: value.requestedAt } : {}),\n ...(typeof value.reason === \"string\" ? { reason: value.reason } : {}),\n ...(typeof value.source === \"string\" ? { source: value.source } : {}),\n };\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n","export interface RetryPolicy {\n readonly maxAttempts: number;\n}\n\nexport interface RetryPolicyInput {\n readonly maxAttempts?: unknown;\n}\n\nexport interface ResolveRetryPolicyOptions {\n readonly global?: RetryPolicyInput;\n readonly workflow?: RetryPolicyInput;\n readonly step?: RetryPolicyInput;\n}\n\nconst BUILT_IN_RETRY_POLICY: RetryPolicy = { maxAttempts: 2 };\n\nexport function resolveRetryPolicy(options: ResolveRetryPolicyOptions): RetryPolicy {\n return validateRetryPolicy(\n firstConfiguredPolicy(options.step, options.workflow, options.global) ?? BUILT_IN_RETRY_POLICY,\n );\n}\n\nexport function validateRetryPolicy(input: RetryPolicyInput): RetryPolicy {\n const maxAttempts = input.maxAttempts ?? BUILT_IN_RETRY_POLICY.maxAttempts;\n\n if (typeof maxAttempts !== \"number\" || !Number.isInteger(maxAttempts) || maxAttempts < 1) {\n throw new TypeError(\"retry.maxAttempts must be an integer greater than or equal to 1.\");\n }\n\n return { maxAttempts };\n}\n\nfunction firstConfiguredPolicy(\n ...policies: readonly (RetryPolicyInput | undefined)[]\n): RetryPolicyInput | undefined {\n return policies.find((policy) => policy?.maxAttempts !== undefined);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport { normalizeShape } from \"../../authoring/shape/json-schema.js\";\nimport type { ContinuationResult } from \"../../authoring/step/continuation.types.js\";\nimport type { Failure } from \"../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport type {\n Event,\n Result,\n RunWorkflowOptions,\n} from \"../../runtime/run-workflow/run-workflow.types.js\";\nimport { appendEvent, readRunState, writeRunState } from \"../artifacts/run-storage.js\";\nimport {\n type CancellationMarker,\n cancellationPayload,\n isWorkflowCancellationError,\n readCancellationMarker,\n} from \"../cancellation/cancellation.js\";\nimport { runContinuation } from \"../continuation/run-continuation/run-continuation.js\";\nimport { createEvent } from \"../events/create-run-event.js\";\nimport { isFailureLikeError } from \"../failures/failure-like.js\";\nimport { workflowFailure } from \"../failures/workflow-failure.js\";\nimport {\n findDanglingInteractiveSessionStart,\n reattachInProgressStep,\n} from \"../resume/reattach-in-progress-step/reattach-in-progress-step.js\";\nimport { replayToFailedStep } from \"../resume/replay-to-failed-step/replay-to-failed-step.js\";\nimport {\n type ReplayToWaitingStepResult,\n replayToWaitingStep,\n} from \"../resume/replay-to-waiting-step/replay-to-waiting-step.js\";\nimport { replayToRetryFailure } from \"../retry/replay-to-retry-failure.js\";\nimport { createRunContext } from \"../run-context/create-run-context.js\";\nimport { runContextStorage } from \"../run-context/run-context-storage.js\";\nimport { resolveAndValidateRunCwds } from \"./cwd.js\";\nimport { initializeRun } from \"./initialize-run.js\";\nimport { runRootContinuationArrayScheduler } from \"./root-continuation-array-scheduler.js\";\nimport { parseTrailStepConfigInput } from \"./trailstep-config-input.js\";\n\nexport async function runWorkflow<TInput extends PlainObject, TOutput extends PlainObject>(\n options: RunWorkflowOptions<TInput, TOutput>,\n): Promise<Result<TOutput>> {\n const maxSteps = options.maxSteps ?? 1000;\n const isResume = options.resume !== undefined;\n const isRetry = options.retry !== undefined;\n const isWaitContinue = options.continue !== undefined;\n const initialized = await initializeRun(options).catch((error) => {\n const existingRunDir =\n options.resume?.runDir ?? options.retry?.runDir ?? options.continue?.runDir;\n if (existingRunDir && isFailureLikeError(error)) {\n return {\n status: \"failure\" as const,\n runId: basename(existingRunDir),\n runName: basename(existingRunDir),\n runDir: existingRunDir,\n previousEvents: [],\n failure: workflowFailure(error),\n };\n }\n\n throw error;\n });\n\n if (\"status\" in initialized && initialized.status === \"failure\") {\n return {\n status: \"failure\",\n runId: initialized.runId,\n runDir: initialized.runDir,\n failure: initialized.failure,\n events: initialized.previousEvents,\n };\n }\n\n const { runId, runName, runDir, previousEvents } = initialized;\n const trailstepConfig =\n options.trailstepConfig === undefined\n ? undefined\n : parseTrailStepConfigInput(options.trailstepConfig);\n const { projectCwd, cwd } = await resolveAndValidateRunCwds(options);\n const events: Event[] = [...previousEvents];\n\n const emit = async (event: Event): Promise<void> => {\n events.push(event);\n await appendEvent(runDir, event);\n await options.eventSink?.(event);\n };\n\n const runContext = createRunContext({\n runId,\n runName,\n runDir,\n workflowId: options.workflow.id,\n workflowAgents: options.workflow.agents ?? {},\n projectCwd,\n cwd,\n executionCwd: cwd,\n trailstepConfig,\n workingAgentProcessRunner: options.workingAgentProcessRunner,\n providerWorkingRunner: options.providerWorkingRunner,\n emit,\n events: () => events,\n ...(isResume || isRetry ? { initialState: {} } : {}),\n });\n\n const cancelWorkflow = async (cancellation: CancellationMarker): Promise<Result<TOutput>> => {\n if (!events.some((event) => event.type === \"workflow.cancelRequested\")) {\n await emit(\n createEvent({\n runId,\n workflowId: options.workflow.id,\n type: \"workflow.cancelRequested\",\n payload: cancellationPayload(cancellation),\n }),\n );\n }\n\n if (!events.some((event) => event.type === \"workflow.cancelled\")) {\n await emit(\n createEvent({\n runId,\n workflowId: options.workflow.id,\n type: \"workflow.cancelled\",\n payload: cancellationPayload(cancellation),\n }),\n );\n }\n\n return {\n status: \"cancelled\",\n runId,\n runDir,\n cancellation,\n events,\n } as unknown as Result<TOutput>;\n };\n\n const failWorkflow = async (failure: Failure, message?: string): Promise<Result<TOutput>> => {\n await emit(\n createEvent({\n runId,\n workflowId: options.workflow.id,\n type: \"workflow.failed\",\n payload: {\n failure,\n ...(message === undefined ? {} : { message }),\n },\n }),\n );\n return {\n status: \"failure\",\n runId,\n runDir,\n failure,\n events,\n };\n };\n\n const failResumeValidation = (failure: Failure): Result<TOutput> => ({\n status: \"failure\",\n runId,\n runDir,\n failure,\n events,\n });\n\n try {\n return await runContextStorage.run(runContext, () => runWorkflowBody());\n } catch (error) {\n if (isWorkflowCancellationError(error)) {\n return await cancelWorkflow(error.cancellation);\n }\n\n return await failWorkflow(workflowFailure(error));\n }\n\n async function runWorkflowBody(): Promise<Result<TOutput>> {\n const inputSchema = options.workflow.inputShape\n ? normalizeShape(options.workflow.inputShape)\n : options.workflow.input;\n\n const previousTerminalStatus = readPreviousTerminalWorkflowStatus(previousEvents);\n const existingCancellation = readExistingCancellationEvent(previousEvents);\n const cancellation =\n previousTerminalStatus === undefined || previousTerminalStatus === \"cancelled\"\n ? (existingCancellation ?? (await readCancellationMarker(runDir)))\n : undefined;\n if (cancellation !== undefined) {\n return await cancelWorkflow(cancellation);\n }\n\n let workflowInput: TInput;\n let startNode: ContinuationResult | undefined;\n let waitResume: ReplayToWaitingStepResult | undefined;\n let isWaitContinueTrackResume = false;\n let branchResumes: Record<\n string,\n import(\"../continuation/run-continuation/run-continuation.js\").ResumeWaitOptions\n > = {};\n let isTrackRetry = false;\n\n if (isResume) {\n const danglingAnchor = findDanglingInteractiveSessionStart(previousEvents);\n const replay = await replayWithoutClobberingStateOnFailure(runDir, () =>\n danglingAnchor\n ? reattachInProgressStep({\n workflow: options.workflow,\n events: previousEvents,\n runDir,\n })\n : replayToFailedStep({\n workflow: options.workflow,\n events: previousEvents,\n runDir,\n }),\n );\n if (replay.status === \"failure\") {\n return failResumeValidation(replay.failure);\n }\n await runContext.state.hydratePersisted();\n\n workflowInput = inputSchema\n ? (inputSchema.assert(replay.input, \"workflow input\") as TInput)\n : (replay.input as TInput);\n startNode = replay.node;\n await emit(\n createEvent({\n runId,\n workflowId: options.workflow.id,\n type: \"workflow.resumed\",\n payload: {\n resumedFromRunDir: runDir,\n resumedStepId: replay.resumedStepId,\n sourceFailureEventId: replay.sourceFailureEventId,\n },\n }),\n );\n } else if (isWaitContinue) {\n const hasParallelTrack = await hasSupportedRootParallelTrackRetryMetadata(runDir);\n if (hasParallelTrack) {\n const answeredBranches = await findAnsweredParallelBranches(runDir);\n if (answeredBranches.length === 0) {\n return failResumeValidation({\n code: \"continue_parallel_track_unsupported\",\n message:\n \"Continuing a waiting parallel track is not yet supported; retry the run or restart the workflow instead.\",\n });\n }\n\n const persistedInput = readWorkflowStartedInput(previousEvents);\n if (persistedInput === undefined) {\n return failResumeValidation({\n code: \"continue_target_not_found\",\n message: \"Continue target workflow started payload missing input.\",\n });\n }\n await runContext.state.hydratePersisted();\n await runContext.globalState.hydratePersisted();\n workflowInput = inputSchema\n ? (inputSchema.assert(persistedInput, \"workflow input\") as TInput)\n : (persistedInput as TInput);\n startNode = options.workflow.start(workflowInput);\n isWaitContinueTrackResume = true;\n waitResume = undefined;\n\n branchResumes = {};\n for (const branchId of answeredBranches) {\n const replay = await replayWithoutClobberingStateOnFailure(runDir, () =>\n replayToWaitingStep({\n workflow: options.workflow,\n events: previousEvents,\n runDir,\n branchId,\n }),\n );\n if (replay.status === \"success\") {\n branchResumes[branchId] = {\n stepId: replay.resumedStepId,\n stepIndex: replay.stepIndex,\n phaseIndex: replay.phaseIndex,\n phaseValue: replay.phaseValue,\n waitOutputs: replay.waitOutputs,\n seenWaitIds: replay.seenWaitIds,\n wait: replay.wait,\n } as import(\"../continuation/run-continuation/run-continuation.js\").ResumeWaitOptions;\n }\n }\n\n const firstReplay = await replayWithoutClobberingStateOnFailure(runDir, () =>\n replayToWaitingStep({\n workflow: options.workflow,\n events: previousEvents,\n runDir,\n branchId: answeredBranches[0],\n }),\n );\n if (firstReplay.status === \"success\") {\n await emit(\n createEvent({\n runId,\n workflowId: options.workflow.id,\n type: \"workflow.resumed\",\n payload: {\n resumeKind: \"wait\",\n resumedFromRunDir: runDir,\n resumedStepId: firstReplay.resumedStepId,\n sourceWaitEventId: firstReplay.sourceWaitEventId,\n },\n }),\n );\n }\n } else {\n const replay = await replayWithoutClobberingStateOnFailure(runDir, () =>\n replayToWaitingStep({\n workflow: options.workflow,\n events: previousEvents,\n runDir,\n }),\n );\n if (replay.status === \"failure\") {\n return failResumeValidation(replay.failure);\n }\n await runContext.state.hydratePersisted();\n\n workflowInput = inputSchema\n ? (inputSchema.assert(replay.input, \"workflow input\") as TInput)\n : (replay.input as TInput);\n startNode = replay.node;\n waitResume = replay;\n await emit(\n createEvent({\n runId,\n workflowId: options.workflow.id,\n type: \"workflow.resumed\",\n payload: {\n resumeKind: \"wait\",\n resumedFromRunDir: runDir,\n resumedStepId: replay.resumedStepId,\n sourceWaitEventId: replay.sourceWaitEventId,\n },\n }),\n );\n }\n } else if (isRetry) {\n if (await hasSupportedRootParallelTrackRetryMetadata(runDir)) {\n const persistedInput = readWorkflowStartedInput(previousEvents);\n if (persistedInput === undefined) {\n return failResumeValidation({\n code: \"retry_target_not_found\",\n message: \"workflow.started payload is missing input.\",\n });\n }\n await runContext.state.hydratePersisted();\n await runContext.globalState.hydratePersisted();\n workflowInput = inputSchema\n ? (inputSchema.assert(persistedInput, \"workflow input\") as TInput)\n : (persistedInput as TInput);\n isTrackRetry = true;\n await emit(\n createEvent({\n runId,\n workflowId: options.workflow.id,\n type: \"workflow.retryStarted\",\n payload: {\n retryKind: options.retry.kind,\n retryPlanner: \"track\",\n retriedFromRunDir: runDir,\n },\n }),\n );\n } else {\n const replay = await replayWithoutClobberingStateOnFailure(runDir, () =>\n replayToRetryFailure({\n workflow: options.workflow,\n events: previousEvents,\n runDir,\n }),\n );\n if (replay.status === \"failure\") {\n return failResumeValidation(replay.failure);\n }\n await runContext.state.hydratePersisted();\n\n workflowInput = inputSchema\n ? (inputSchema.assert(replay.input, \"workflow input\") as TInput)\n : (replay.input as TInput);\n startNode = replay.node;\n await emit(\n createEvent({\n runId,\n workflowId: options.workflow.id,\n type: \"workflow.retryStarted\",\n payload: {\n retryKind: options.retry.kind,\n retriedFromRunDir: runDir,\n retriedStepId: replay.retriedStepId,\n sourceFailureEventId: replay.sourceFailureEventId,\n sourceFailureReplayPosition: replay.sourceFailureReplayPosition,\n },\n }),\n );\n }\n } else {\n workflowInput = inputSchema\n ? inputSchema.assert(options.input, \"workflow input\")\n : (options.input as TInput);\n await emit(\n createEvent({\n runId,\n workflowId: options.workflow.id,\n type: \"workflow.started\",\n payload: { input: workflowInput },\n }),\n );\n }\n\n const rootNode = startNode ?? options.workflow.start(workflowInput);\n const rootNodes = Array.isArray(rootNode) ? rootNode : [rootNode];\n const shouldUseRootArrayScheduler =\n (!isResume && !isRetry && !isWaitContinue) || isTrackRetry || isWaitContinueTrackResume;\n const continuationResult = shouldUseRootArrayScheduler\n ? await runRootContinuationArrayScheduler({\n nodes: rootNodes,\n ...(Array.isArray(rootNode) ? { rootIsArray: true } : {}),\n runId,\n workflowId: options.workflow.id,\n emit,\n maxSteps,\n initialSource: `workflow.start for workflow ${options.workflow.id}`,\n workers: options.scheduler?.workers,\n workflowAgents: options.workflow.agents ?? {},\n workflowTimeout: options.workflow.timeout,\n runDir,\n projectCwd,\n cwd,\n trailstepConfig,\n workingAgentProcessRunner: options.workingAgentProcessRunner,\n providerWorkingRunner: options.providerWorkingRunner,\n processRunner: options.processRunner,\n ...(isTrackRetry\n ? {\n retry: {\n initialExecutedSteps: previousEvents.filter(\n (event) => event.type === \"step.started\",\n ).length,\n track: options.retry?.track,\n },\n }\n : isWaitContinueTrackResume\n ? {\n retry: {\n initialExecutedSteps: previousEvents.filter(\n (event) => event.type === \"step.started\",\n ).length,\n track: {\n mode: \"wait-answered\",\n } as import(\"./run-workflow.types.js\").RunWorkflowTrackRetryOptions,\n },\n waitResumeBranches: branchResumes,\n }\n : {}),\n })\n : await runContinuation({\n node: rootNode,\n runId,\n workflowId: options.workflow.id,\n emit,\n maxSteps,\n initialSource: isRetry\n ? `retry for workflow ${options.workflow.id}`\n : isResume\n ? `resume for workflow ${options.workflow.id}`\n : `workflow.start for workflow ${options.workflow.id}`,\n // The original run already used one step-index slot per step.started\n // event ever recorded (successful or failed) -- newly-dispatched steps\n // after resume must continue that sequence, not restart at 1, or their\n // artifact directories collide with the pre-resume steps' directories.\n initialExecutedSteps:\n isResume || isRetry || isWaitContinue\n ? previousEvents.filter((event) => event.type === \"step.started\").length\n : undefined,\n ...(waitResume === undefined\n ? {}\n : {\n resumeWait: {\n stepId: waitResume.resumedStepId,\n stepIndex: waitResume.stepIndex,\n phaseIndex: waitResume.phaseIndex,\n phaseValue: waitResume.phaseValue,\n waitOutputs: waitResume.waitOutputs,\n seenWaitIds: waitResume.seenWaitIds,\n wait: waitResume.wait,\n },\n }),\n workflowAgents: options.workflow.agents ?? {},\n workflowTimeout: options.workflow.timeout,\n runDir,\n projectCwd,\n cwd,\n trailstepConfig,\n workingAgentProcessRunner: options.workingAgentProcessRunner,\n providerWorkingRunner: options.providerWorkingRunner,\n processRunner: options.processRunner,\n });\n\n if (\n continuationResult.status === \"failure\" ||\n continuationResult.status === \"absoluteFailure\"\n ) {\n return await failWorkflow(continuationResult.failure, continuationResult.message);\n }\n\n if (continuationResult.status === \"cancelled\") {\n return await cancelWorkflow(continuationResult.cancellation);\n }\n\n if (continuationResult.status === \"waiting\") {\n return {\n status: \"waiting\",\n runId,\n runDir,\n wait: continuationResult.wait,\n events,\n } as unknown as Result<TOutput>;\n }\n\n if (continuationResult.status === \"split\") {\n return await failWorkflow({\n code: \"unsupported_continuation\",\n message: \"A continuation array escaped workflow scheduling.\",\n });\n }\n\n const current = continuationResult.output;\n\n const outputSchema = options.workflow.outputShape\n ? normalizeShape(options.workflow.outputShape)\n : options.workflow.output;\n const output = (\n outputSchema ? outputSchema.assert(current, \"workflow output\") : current\n ) as TOutput;\n\n await emit(\n createEvent({\n runId,\n workflowId: options.workflow.id,\n type: \"workflow.completed\",\n payload: {\n output,\n ...(continuationResult.message === undefined\n ? {}\n : { message: continuationResult.message }),\n },\n }),\n );\n\n return {\n status: \"success\",\n runId,\n runDir,\n output,\n events,\n };\n }\n}\n\nasync function replayWithoutClobberingStateOnFailure<T extends { readonly status: string }>(\n runDir: string,\n replay: () => Promise<T>,\n): Promise<T> {\n const stateBeforeReplay = await readRunState(runDir);\n const result = await replay();\n if (result.status === \"failure\") {\n await writeRunState(runDir, stateBeforeReplay);\n }\n return result;\n}\n\nasync function hasSupportedRootParallelTrackRetryMetadata(runDir: string): Promise<boolean> {\n try {\n const track = JSON.parse(await readFile(join(runDir, \"track.json\"), \"utf8\")) as {\n readonly rootBranchId?: unknown;\n readonly splitOccurred?: unknown;\n readonly branches?: unknown;\n };\n if (\n track.splitOccurred !== true ||\n typeof track.rootBranchId !== \"string\" ||\n !Array.isArray(track.branches) ||\n !track.branches.every((branchId): branchId is string => typeof branchId === \"string\")\n ) {\n return false;\n }\n\n const branches = await Promise.all(\n track.branches.map(async (branchId) => {\n const branch = JSON.parse(\n await readFile(join(runDir, \"branches\", `${branchId}.json`), \"utf8\"),\n ) as { readonly branchId?: unknown; readonly parentBranchId?: unknown };\n return branch;\n }),\n );\n\n return branches.every((branch) =>\n branch.branchId === track.rootBranchId\n ? branch.parentBranchId === undefined\n : branch.parentBranchId === track.rootBranchId,\n );\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nexport async function findAnsweredParallelBranches(runDir: string): Promise<string[]> {\n try {\n const track = JSON.parse(await readFile(join(runDir, \"track.json\"), \"utf8\")) as {\n readonly splitOccurred?: unknown;\n readonly branches?: unknown;\n };\n if (track.splitOccurred !== true || !Array.isArray(track.branches)) {\n return [];\n }\n const answered: string[] = [];\n for (const branchId of track.branches as unknown[]) {\n if (typeof branchId !== \"string\") continue;\n let branchState: { readonly status?: unknown; readonly wait?: unknown } | undefined;\n try {\n branchState = JSON.parse(\n await readFile(join(runDir, \"branches\", `${branchId}.json`), \"utf8\"),\n ) as {\n readonly status?: unknown;\n readonly wait?: unknown;\n };\n } catch {\n continue;\n }\n if (branchState?.status !== \"waiting\") continue;\n if (\n branchState.wait === undefined ||\n typeof branchState.wait !== \"object\" ||\n branchState.wait === null\n ) {\n continue;\n }\n const wait = branchState.wait as {\n readonly artifactPaths?: { readonly answerFile?: unknown };\n };\n const answerFile = wait.artifactPaths?.answerFile;\n if (typeof answerFile !== \"string\") continue;\n try {\n await readFile(join(runDir, answerFile), \"utf8\");\n answered.push(branchId);\n } catch {\n // no recorded answer artifact\n }\n }\n return answered;\n } catch {\n return [];\n }\n}\n\nfunction readWorkflowStartedInput(events: readonly Event[]): PlainObject | undefined {\n const started = events.find((event) => event.type === \"workflow.started\");\n const input = started?.payload.input;\n return typeof input === \"object\" && input !== null && !Array.isArray(input)\n ? (input as PlainObject)\n : undefined;\n}\n\nfunction readPreviousTerminalWorkflowStatus(\n events: readonly Event[],\n): \"completed\" | \"failed\" | \"cancelled\" | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (event?.type === \"workflow.completed\") {\n return \"completed\";\n }\n if (event?.type === \"workflow.failed\") {\n return \"failed\";\n }\n if (event?.type === \"workflow.cancelled\") {\n return \"cancelled\";\n }\n }\n\n return undefined;\n}\n\nfunction readExistingCancellationEvent(events: readonly Event[]): CancellationMarker | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (event?.type !== \"workflow.cancelled\") {\n continue;\n }\n\n return cancellationFromPayload(event.payload);\n }\n\n return undefined;\n}\n\nfunction cancellationFromPayload(payload: Record<string, unknown>): CancellationMarker {\n return {\n ...(typeof payload.requestedAt === \"string\" ? { requestedAt: payload.requestedAt } : {}),\n ...(typeof payload.reason === \"string\" ? { reason: payload.reason } : {}),\n ...(typeof payload.source === \"string\" ? { source: payload.source } : {}),\n };\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { dispatchAgentStep } from \"../../../agent-execution/dispatch-agent-step/dispatch-agent-step.js\";\nimport type { TrailStepConfig } from \"../../../agent-targeting/targeting.types.js\";\nimport { jsonSchema, normalizeShape } from \"../../../authoring/shape/json-schema.js\";\nimport type {\n CheckWaitHelpers,\n ContinuationResult,\n DisplayPhase,\n ParallelOptions,\n PromptPhase,\n StepCwdInput,\n StepDisplayValue,\n StepNode,\n WaitCheckResult,\n WaitDefinition,\n WaitPhase,\n} from \"../../../authoring/step/continuation.types.js\";\nimport {\n done,\n firstPromptPhase,\n getStepPhases,\n isAbsoluteDoneNode,\n isAbsoluteFailNode,\n isDoneNode,\n isFailNode,\n isParallelNode,\n isStepNode,\n isWorkflowInvocationNode,\n} from \"../../../authoring/step/step-node.js\";\nimport type { WorkflowAgentRole } from \"../../../contracts/agents/agent-role.types.js\";\nimport type { Failure } from \"../../../contracts/failures/failure.js\";\nimport { TrailStepFailureError } from \"../../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../../contracts/shapes/shape.types.js\";\nimport type {\n Event,\n RunWorkflowOptions,\n} from \"../../../runtime/run-workflow/run-workflow.types.js\";\nimport {\n resolveStepArtifactPaths,\n resolveWaitArtifactPaths,\n type WaitArtifactPaths,\n} from \"../../artifacts/step-artifacts.js\";\nimport {\n type CancellationMarker,\n cancellationPayload,\n isWorkflowCancellationError,\n readCancellationMarker,\n throwIfCancellationRequested,\n WorkflowCancellationError,\n} from \"../../cancellation/cancellation.js\";\nimport { createEvent } from \"../../events/create-run-event.js\";\nimport { stepExecutionFailure } from \"../../failures/step-execution-failure.js\";\nimport { runContextStorage } from \"../../run-context/run-context-storage.js\";\nimport { withStepContext } from \"../../run-context/with-step-context.js\";\nimport { validateDirectoryCwd } from \"../../run-workflow/cwd.js\";\nimport type { TimeoutPolicyInput } from \"../../timeout/timeout-policy.js\";\nimport { resolveTimeoutPolicy } from \"../../timeout/timeout-policy.js\";\nimport { resolveStepOutputSchema } from \"../resolve-step-output-schema/resolve-step-output-schema.js\";\n\nexport interface RunContinuationOptions {\n readonly node: ContinuationResult;\n readonly runId: string;\n readonly workflowId: string;\n readonly emit: (event: Event) => Promise<void>;\n readonly maxSteps: number;\n readonly initialSource: string;\n readonly initialExecutedSteps?: number;\n readonly allocateStepIndex?: () => number;\n readonly workflowAgents: Readonly<Record<string, WorkflowAgentRole>>;\n readonly workflowTimeout?: TimeoutPolicyInput;\n readonly runDir: string;\n readonly projectCwd?: string;\n readonly cwd: string;\n readonly trailstepConfig?: TrailStepConfig;\n readonly workingAgentProcessRunner?: RunWorkflowOptions[\"workingAgentProcessRunner\"];\n readonly providerWorkingRunner?: RunWorkflowOptions[\"providerWorkingRunner\"];\n readonly processRunner?: RunWorkflowOptions[\"processRunner\"];\n readonly resumeWait?: ResumeWaitOptions;\n readonly returnContinuationArrays?: boolean;\n}\n\nexport interface ResumeWaitOptions {\n readonly stepId: string;\n readonly stepIndex: number;\n readonly phaseIndex: number;\n readonly phaseValue: PlainObject;\n readonly waitOutputs: Readonly<Record<string, PlainObject>>;\n readonly seenWaitIds: readonly string[];\n readonly wait: ResumedWaitDetails;\n}\n\ntype WaitKind = \"input\" | \"check\";\n\nexport interface ResumedWaitDetails {\n readonly waitId: string;\n readonly kind: WaitKind;\n readonly message: string;\n readonly artifactPaths: WaitArtifactPaths;\n readonly outputSchema: Record<string, unknown>;\n}\n\nexport interface WaitingWait {\n readonly stepId: string;\n readonly waitId: string;\n readonly kind?: WaitKind;\n readonly message: string;\n readonly retryAfterSeconds?: number;\n readonly artifactPaths: WaitArtifactPaths;\n}\n\ninterface WorkflowInvocationFrame {\n readonly workflowId: string;\n readonly workflowAgents: Readonly<Record<string, WorkflowAgentRole>>;\n readonly workflowTimeout?: TimeoutPolicyInput;\n readonly workflowOutputSchema?: ReturnType<typeof normalizeShape>;\n readonly invocationWorkflowId: string;\n readonly postContinuation?: (\n output: PlainObject,\n ) => ContinuationResult | Promise<ContinuationResult>;\n}\n\nexport type RunContinuationResult =\n | { readonly status: \"success\"; readonly output: PlainObject; readonly message?: string }\n | { readonly status: \"failure\"; readonly failure: Failure; readonly message?: string }\n | { readonly status: \"absoluteSuccess\"; readonly output: PlainObject; readonly message?: string }\n | { readonly status: \"absoluteFailure\"; readonly failure: Failure; readonly message?: string }\n | { readonly status: \"waiting\"; readonly wait: WaitingWait }\n | { readonly status: \"cancelled\"; readonly cancellation: CancellationMarker }\n | {\n readonly status: \"split\";\n readonly nodes: readonly ContinuationResult[];\n readonly source: string;\n readonly parallelOptions?: ParallelOptions;\n readonly postContinuation?: (\n output: PlainObject,\n ) => ContinuationResult | Promise<ContinuationResult>;\n readonly afterPostContinuation?: (\n output: PlainObject,\n ) => ContinuationResult | Promise<ContinuationResult>;\n };\n\nexport async function runContinuation(\n options: RunContinuationOptions,\n): Promise<RunContinuationResult> {\n let node: ContinuationResult = options.node;\n let source = options.initialSource;\n // A resumed run's newly-dispatched steps must continue the on-disk step\n // index sequence from where the original run left off (every step.started\n // ever recorded, successful or failed), not restart at 1 -- otherwise their\n // artifact directories collide with/shadow the pre-resume steps' dirs.\n let executedSteps = options.initialExecutedSteps ?? 0;\n let pendingResumeWait = options.resumeWait;\n const trailstepConfig = options.trailstepConfig;\n const invocationFrames: WorkflowInvocationFrame[] = [];\n let currentWorkflowId = options.workflowId;\n let currentWorkflowAgents = options.workflowAgents;\n let currentWorkflowTimeout = options.workflowTimeout;\n let currentWorkflowOutputSchema: ReturnType<typeof normalizeShape> | undefined;\n\n const splitPostContinuationForInvocationFrames = ():\n | ((output: PlainObject) => ContinuationResult | Promise<ContinuationResult>)\n | undefined => {\n if (invocationFrames.length === 0) {\n return undefined;\n }\n\n const frames = [...invocationFrames];\n const splitWorkflowOutputSchema = currentWorkflowOutputSchema;\n return async (aggregateOutput: PlainObject): Promise<ContinuationResult> => {\n let output: PlainObject;\n try {\n output =\n splitWorkflowOutputSchema === undefined\n ? aggregateOutput\n : splitWorkflowOutputSchema.assert(\n aggregateOutput,\n `invoked workflow ${frames[frames.length - 1]?.invocationWorkflowId ?? currentWorkflowId} output`,\n );\n } catch (error) {\n throw failureFromError(error);\n }\n\n while (frames.length > 0) {\n const frame = frames.pop();\n if (frame?.postContinuation !== undefined) {\n return await frame.postContinuation(output);\n }\n }\n\n return done(output);\n };\n };\n\n const splitPostContinuations = (\n postContinuation:\n | ((output: PlainObject) => ContinuationResult | Promise<ContinuationResult>)\n | undefined,\n ) => {\n const invocationPostContinuation = splitPostContinuationForInvocationFrames();\n if (postContinuation === undefined) {\n return invocationPostContinuation === undefined\n ? {}\n : { postContinuation: invocationPostContinuation };\n }\n return invocationPostContinuation === undefined\n ? { postContinuation }\n : { postContinuation, afterPostContinuation: invocationPostContinuation };\n };\n\n while (true) {\n const pendingCancellation = await readCancellationMarker(options.runDir);\n if (pendingCancellation !== undefined) {\n return { status: \"cancelled\", cancellation: pendingCancellation };\n }\n\n if (isDoneNode(node)) {\n const frame = invocationFrames.pop();\n if (frame !== undefined) {\n const invocationWorkflowId = frame.invocationWorkflowId;\n let output: PlainObject;\n try {\n output =\n currentWorkflowOutputSchema === undefined\n ? node.output\n : currentWorkflowOutputSchema.assert(\n node.output,\n `invoked workflow ${invocationWorkflowId} output`,\n );\n } catch (error) {\n return { status: \"failure\", failure: failureFromError(error) };\n }\n\n currentWorkflowId = frame.workflowId;\n currentWorkflowAgents = frame.workflowAgents;\n currentWorkflowTimeout = frame.workflowTimeout;\n currentWorkflowOutputSchema = frame.workflowOutputSchema;\n\n if (frame.postContinuation !== undefined) {\n try {\n node = await frame.postContinuation(output);\n } catch (error) {\n return {\n status: \"failure\",\n failure: stepExecutionFailure(\n new Error(\n `workflow invocation post failed for ${invocationWorkflowId}: ${errorMessage(error)}`,\n ),\n ),\n };\n }\n source = `post for workflow invocation ${invocationWorkflowId}`;\n continue;\n }\n\n return {\n status: \"success\",\n output,\n ...(node.message === undefined ? {} : { message: node.message }),\n };\n }\n\n return {\n status: \"success\",\n output: node.output,\n ...(node.message === undefined ? {} : { message: node.message }),\n };\n }\n\n if (isFailNode(node)) {\n return {\n status: \"failure\",\n failure: node.failure,\n ...(node.message === undefined ? {} : { message: node.message }),\n };\n }\n\n if (options.returnContinuationArrays === true && isAbsoluteDoneNode(node)) {\n return {\n status: \"absoluteSuccess\",\n output: node.output,\n ...(node.message === undefined ? {} : { message: node.message }),\n };\n }\n\n if (options.returnContinuationArrays === true && isAbsoluteFailNode(node)) {\n return {\n status: \"absoluteFailure\",\n failure: node.failure,\n ...(node.message === undefined ? {} : { message: node.message }),\n };\n }\n\n if (Array.isArray(node) && options.returnContinuationArrays === true) {\n return {\n status: \"split\",\n nodes: node,\n source,\n ...splitPostContinuations(undefined),\n };\n }\n\n if (isParallelNode(node) && options.returnContinuationArrays === true) {\n return {\n status: \"split\",\n nodes: node.nodes,\n source,\n ...(node.options === undefined ? {} : { parallelOptions: node.options }),\n ...splitPostContinuations(node.postContinuation),\n };\n }\n\n if (isWorkflowInvocationNode(node)) {\n const invocation = node;\n const inputSchema = invocation.workflow.inputShape\n ? normalizeShape(invocation.workflow.inputShape)\n : invocation.workflow.input;\n let input: PlainObject;\n try {\n input =\n inputSchema === undefined\n ? invocation.input\n : inputSchema.assert(\n invocation.input,\n `invoked workflow ${invocation.workflow.id} input`,\n );\n } catch (error) {\n return { status: \"failure\", failure: failureFromError(error) };\n }\n\n invocationFrames.push({\n workflowId: currentWorkflowId,\n workflowAgents: currentWorkflowAgents,\n ...(currentWorkflowTimeout === undefined\n ? {}\n : { workflowTimeout: currentWorkflowTimeout }),\n ...(currentWorkflowOutputSchema === undefined\n ? {}\n : { workflowOutputSchema: currentWorkflowOutputSchema }),\n invocationWorkflowId: invocation.workflow.id,\n ...(invocation.postContinuation === undefined\n ? {}\n : { postContinuation: invocation.postContinuation }),\n });\n currentWorkflowId = invocation.workflow.id;\n currentWorkflowAgents = invocation.workflow.agents ?? {};\n currentWorkflowTimeout = invocation.workflow.timeout;\n currentWorkflowOutputSchema = invocation.workflow.outputShape\n ? normalizeShape(invocation.workflow.outputShape)\n : invocation.workflow.output === undefined\n ? undefined\n : normalizeShape(invocation.workflow.output);\n node = invocation.workflow.start(input);\n source = `workflow.start for workflow ${invocation.workflow.id}`;\n continue;\n }\n\n const unsupportedFailure = unsupportedContinuationFailure(node, source);\n if (unsupportedFailure !== undefined) {\n return {\n status: \"failure\",\n failure: unsupportedFailure,\n };\n }\n\n if (!isStepNode(node)) {\n return {\n status: \"failure\",\n failure: continuationFailure(source),\n };\n }\n\n const stepNode = node;\n const { config } = stepNode;\n const resumeWait = pendingResumeWait;\n if (resumeWait !== undefined && resumeWait.stepId !== config.id) {\n return {\n status: \"failure\",\n failure: continuationFailure(`wait resume for step ${resumeWait.stepId}`),\n };\n }\n\n let stepIndex: number;\n if (resumeWait === undefined) {\n if (executedSteps >= options.maxSteps) {\n return {\n status: \"failure\",\n failure: stepExecutionFailure(\n new Error(`workflow exceeded maxSteps guard (${options.maxSteps})`),\n ),\n };\n }\n if (options.allocateStepIndex !== undefined) {\n stepIndex = options.allocateStepIndex();\n executedSteps += 1;\n } else {\n executedSteps += 1;\n stepIndex = executedSteps;\n }\n } else {\n stepIndex = resumeWait.stepIndex;\n pendingResumeWait = undefined;\n }\n const phases = getStepPhases(stepNode);\n const hasPrompt = phases.some((phase) => phase.kind === \"prompt\");\n const timeoutPolicy = resolveTimeoutPolicy({\n global: trailstepConfig?.settings?.timeout,\n workflow:\n currentWorkflowTimeout ??\n trailstepConfig?.workflows?.[currentWorkflowId]?.settings?.timeout,\n step: config.timeout,\n });\n const maxSubPrompts =\n firstPromptPhase(phases)?.maxSubPrompts ??\n config.maxSubPrompts ??\n trailstepConfig?.workflows?.[currentWorkflowId]?.settings?.maxSubPrompts;\n\n if (resumeWait === undefined) {\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: currentWorkflowId,\n stepId: config.id,\n type: \"step.started\",\n payload: {\n stepName: config.id,\n ...(config.title === undefined ? {} : { title: config.title }),\n ...(config.description === undefined ? {} : { description: config.description }),\n kind: hasPrompt ? \"agent\" : \"code\",\n },\n }),\n );\n }\n\n try {\n const stepCwd = await resolveStepExecutionCwd({\n stepId: config.id,\n workflowId: currentWorkflowId,\n defaultCwd: options.cwd,\n input: config.input,\n cwdInput: config.cwd,\n });\n const stepArtifacts = resolveStepArtifactPaths({\n runDir: options.runDir,\n stepId: config.id,\n stepIndex,\n });\n\n const stepResult = await runWithStepControl({\n stepId: config.id,\n timeoutMs: timeoutPolicy.timeoutMs,\n readCancellation: async () => await readCancellationMarker(options.runDir),\n run: async (signal) =>\n await withStepContext(\n config.id,\n stepArtifacts.stepDir,\n async () => {\n const phaseResult = await runStepPhases({\n stepNode,\n timeoutMs: timeoutPolicy.timeoutMs,\n signal,\n readCancellation: async () => await readCancellationMarker(options.runDir),\n ...(resumeWait === undefined\n ? {}\n : {\n resume: {\n startPhaseIndex: resumeWait.phaseIndex,\n phaseValue: resumeWait.phaseValue,\n waitOutputs: resumeWait.waitOutputs,\n seenWaitIds: resumeWait.seenWaitIds,\n wait: resumeWait.wait,\n },\n }),\n emitDisplay: async (phase, output, phaseIndex) => {\n const payload = await resolveDisplayPayload({\n phase,\n input: config.input,\n output,\n phaseIndex,\n stepId: config.id,\n });\n\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: currentWorkflowId,\n stepId: config.id,\n type: \"step.display\",\n payload,\n }),\n );\n },\n handleWait: async (phase, output, phaseIndex, waits, previousWaitId) => {\n return await handleWaitPhase({\n phase,\n input: config.input,\n output,\n waits,\n phaseIndex,\n previousWaitId,\n stepId: config.id,\n stepArtifactId: stepArtifacts.artifactStepId,\n runDir: options.runDir,\n runId: options.runId,\n workflowId: currentWorkflowId,\n emit: options.emit,\n });\n },\n handleResumedWait: async (wait) =>\n await handleResumedWaitPhase({\n wait,\n stepId: config.id,\n runDir: options.runDir,\n runId: options.runId,\n workflowId: currentWorkflowId,\n emit: options.emit,\n }),\n dispatchPrompt: async (phase) => {\n const outputSchema = resolveStepOutputSchema(phase);\n if (!outputSchema) {\n throw new Error(`step ${config.id} with a prompt requires an output shape`);\n }\n\n const rawOutput = await dispatchAgentStep({\n config: { ...config, ...phase },\n outputSchema,\n interactiveOutputMode:\n phase.mode === \"interactive\" && phase.output !== undefined\n ? \"json\"\n : \"session-file\",\n runId: options.runId,\n workflowId: currentWorkflowId,\n emit: options.emit,\n workflowAgents: currentWorkflowAgents,\n runDir: options.runDir,\n projectCwd: options.projectCwd ?? options.cwd,\n cwd: stepCwd,\n trailstepConfig,\n workingAgentProcessRunner: options.workingAgentProcessRunner,\n providerWorkingRunner: options.providerWorkingRunner,\n processRunner: options.processRunner,\n stepIndex,\n signal,\n });\n throwIfStepTimedOut(signal, config.id, timeoutPolicy.timeoutMs);\n const output = outputSchema.assert(rawOutput, `step ${config.id} output`);\n\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: currentWorkflowId,\n stepId: config.id,\n type: \"step.completed\",\n payload: { output },\n }),\n );\n\n return output;\n },\n });\n\n if (phaseResult.status === \"waiting\") {\n return phaseResult;\n }\n\n const nextNode = phaseResult.node;\n if (isFailNode(nextNode)) {\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: currentWorkflowId,\n stepId: config.id,\n type: \"step.failed\",\n payload: { failure: nextNode.failure },\n }),\n );\n return phaseResult;\n }\n\n if (!hasPrompt) {\n // A no-prompt step's .do(...) IS its work — only report completion once it has\n // actually run without throwing or returning fail(...), matching the with-prompt\n // case's \"step.completed means the step's own work succeeded\" meaning.\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: currentWorkflowId,\n stepId: config.id,\n type: \"step.completed\",\n payload: {},\n }),\n );\n }\n\n throwIfStepTimedOut(signal, config.id, timeoutPolicy.timeoutMs);\n return phaseResult;\n },\n { maxSubPrompts, cwd: stepCwd, executionCwd: stepCwd },\n ),\n });\n\n if (stepResult.status === \"waiting\") {\n return stepResult;\n }\n\n const nextNode = stepResult.node;\n if (Array.isArray(nextNode) && options.returnContinuationArrays === true) {\n return {\n status: \"split\",\n nodes: nextNode,\n source: `step ${config.id}`,\n ...splitPostContinuations(undefined),\n };\n }\n\n if (isParallelNode(nextNode) && options.returnContinuationArrays === true) {\n return {\n status: \"split\",\n nodes: nextNode.nodes,\n source: `step ${config.id}`,\n ...splitPostContinuations(nextNode.postContinuation),\n };\n }\n\n if (options.returnContinuationArrays === true && isAbsoluteDoneNode(nextNode)) {\n return {\n status: \"absoluteSuccess\",\n output: nextNode.output,\n ...(nextNode.message === undefined ? {} : { message: nextNode.message }),\n };\n }\n\n if (options.returnContinuationArrays === true && isAbsoluteFailNode(nextNode)) {\n return {\n status: \"absoluteFailure\",\n failure: nextNode.failure,\n ...(nextNode.message === undefined ? {} : { message: nextNode.message }),\n };\n }\n\n const unsupportedStepFailure = unsupportedContinuationFailure(nextNode, `step ${config.id}`);\n if (unsupportedStepFailure !== undefined) {\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: currentWorkflowId,\n stepId: config.id,\n type: \"step.failed\",\n payload: { failure: unsupportedStepFailure },\n }),\n );\n return { status: \"failure\", failure: unsupportedStepFailure };\n }\n\n if (\n !isStepNode(nextNode) &&\n !isWorkflowInvocationNode(nextNode) &&\n !isDoneNode(nextNode) &&\n !isFailNode(nextNode)\n ) {\n const failure = continuationFailure(`step ${config.id}`);\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: currentWorkflowId,\n stepId: config.id,\n type: \"step.failed\",\n payload: { failure },\n }),\n );\n return { status: \"failure\", failure };\n }\n\n if (isFailNode(nextNode)) {\n return {\n status: \"failure\",\n failure: nextNode.failure,\n ...(nextNode.message === undefined ? {} : { message: nextNode.message }),\n };\n }\n\n node = nextNode;\n source = `step ${config.id}`;\n } catch (error) {\n if (isWorkflowCancellationError(error)) {\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: currentWorkflowId,\n stepId: config.id,\n type: \"step.cancelled\",\n payload: cancellationPayload(error.cancellation),\n }),\n );\n return { status: \"cancelled\", cancellation: error.cancellation };\n }\n\n const failure = stepExecutionFailure(error);\n\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: currentWorkflowId,\n stepId: config.id,\n type: \"step.failed\",\n payload: { failure },\n }),\n );\n\n if (!stepNode.onError) {\n return { status: \"failure\", failure };\n }\n\n try {\n const nextNode = stepNode.onError(failure);\n const errorSource = `error continuation for step ${config.id}`;\n if (Array.isArray(nextNode) && options.returnContinuationArrays === true) {\n return {\n status: \"split\",\n nodes: nextNode,\n source: errorSource,\n ...splitPostContinuations(undefined),\n };\n }\n\n if (isParallelNode(nextNode) && options.returnContinuationArrays === true) {\n return {\n status: \"split\",\n nodes: nextNode.nodes,\n source: errorSource,\n ...splitPostContinuations(nextNode.postContinuation),\n };\n }\n\n if (options.returnContinuationArrays === true && isAbsoluteDoneNode(nextNode)) {\n return {\n status: \"absoluteSuccess\",\n output: nextNode.output,\n ...(nextNode.message === undefined ? {} : { message: nextNode.message }),\n };\n }\n\n if (options.returnContinuationArrays === true && isAbsoluteFailNode(nextNode)) {\n return {\n status: \"absoluteFailure\",\n failure: nextNode.failure,\n ...(nextNode.message === undefined ? {} : { message: nextNode.message }),\n };\n }\n\n const unsupportedErrorFailure = unsupportedContinuationFailure(nextNode, errorSource);\n if (unsupportedErrorFailure !== undefined) {\n return {\n status: \"failure\",\n failure: unsupportedErrorFailure,\n };\n }\n\n if (\n !isStepNode(nextNode) &&\n !isWorkflowInvocationNode(nextNode) &&\n !isDoneNode(nextNode) &&\n !isFailNode(nextNode)\n ) {\n return {\n status: \"failure\",\n failure: continuationFailure(errorSource),\n };\n }\n\n node = nextNode;\n source = errorSource;\n } catch (errorContinuationError) {\n return {\n status: \"failure\",\n failure: stepExecutionFailure(\n new Error(\n `error continuation for step ${config.id} failed: ${errorMessage(errorContinuationError)}`,\n ),\n ),\n };\n }\n }\n }\n}\n\ntype RunStepPhasesResult =\n | { readonly status: \"continued\"; readonly node: ContinuationResult }\n | { readonly status: \"waiting\"; readonly wait: WaitingWait };\n\ntype HandleWaitResult =\n | { readonly status: \"satisfied\"; readonly waitId: string; readonly output: PlainObject }\n | { readonly status: \"waiting\"; readonly wait: WaitingWait };\n\nasync function resolveStepExecutionCwd(options: {\n readonly stepId: string;\n readonly workflowId: string;\n readonly defaultCwd: string;\n readonly input: PlainObject;\n readonly cwdInput: StepCwdInput | undefined;\n}): Promise<string> {\n if (options.cwdInput === undefined) {\n return options.defaultCwd;\n }\n\n const cwd =\n typeof options.cwdInput === \"function\"\n ? await resolveStepCwdCallback(options.cwdInput, options)\n : options.cwdInput;\n\n if (typeof cwd !== \"string\") {\n throw new TypeError(`step ${options.stepId} cwd must resolve to a string.`);\n }\n\n await validateDirectoryCwd(cwd, `step ${options.stepId} cwd`);\n return cwd;\n}\n\nasync function resolveStepCwdCallback(\n cwdInput: Exclude<StepCwdInput, string>,\n options: {\n readonly stepId: string;\n readonly workflowId: string;\n readonly input: PlainObject;\n },\n): Promise<unknown> {\n const context = runContextStorage.getStore();\n if (!context) {\n throw new Error(`step ${options.stepId} cwd callback requires an active run context.`);\n }\n\n return await cwdInput({\n input: options.input,\n state: context.state,\n workflow: { id: options.workflowId },\n });\n}\n\nasync function runStepPhases(options: {\n readonly stepNode: StepNode;\n readonly timeoutMs?: number;\n readonly signal?: AbortSignal;\n readonly readCancellation: () => Promise<CancellationMarker | undefined>;\n readonly emitDisplay: (\n phase: DisplayPhase,\n output: PlainObject,\n phaseIndex: number,\n ) => Promise<void>;\n readonly handleWait: (\n phase: WaitPhase,\n output: PlainObject,\n phaseIndex: number,\n waits: Readonly<Record<string, PlainObject>>,\n previousWaitId?: string,\n ) => Promise<HandleWaitResult>;\n readonly handleResumedWait: (wait: ResumedWaitDetails) => Promise<HandleWaitResult>;\n readonly dispatchPrompt: (phase: PromptPhase) => Promise<PlainObject>;\n readonly resume?: {\n readonly startPhaseIndex: number;\n readonly phaseValue: PlainObject;\n readonly waitOutputs: Readonly<Record<string, PlainObject>>;\n readonly seenWaitIds: readonly string[];\n readonly wait: ResumedWaitDetails;\n };\n}): Promise<RunStepPhasesResult> {\n const { stepNode } = options;\n let phaseValue = options.resume?.phaseValue ?? stepNode.config.input;\n let nextNode: ContinuationResult | undefined;\n const waitOutputs: Record<string, PlainObject> = { ...(options.resume?.waitOutputs ?? {}) };\n const seenWaitIds = new Set<string>(options.resume?.seenWaitIds ?? []);\n const phases = getStepPhases(stepNode);\n assertNoDuplicateStaticWaitIds(phases, stepNode.config.id);\n\n for (const [phaseIndex, phase] of phases.entries()) {\n if (phaseIndex < (options.resume?.startPhaseIndex ?? 0)) {\n continue;\n }\n throwIfCancellationRequested(await options.readCancellation());\n\n if (phase.kind === \"display\") {\n await options.emitDisplay(phase, phaseValue, phaseIndex);\n throwIfCancellationRequested(await options.readCancellation());\n throwIfStepTimedOut(options.signal, stepNode.config.id, options.timeoutMs);\n continue;\n }\n\n if (phase.kind === \"wait\") {\n const waitResult =\n options.resume !== undefined && phaseIndex === options.resume.startPhaseIndex\n ? options.resume.wait.kind === \"check\"\n ? await options.handleWait(\n phase,\n phaseValue,\n phaseIndex,\n waitOutputs,\n options.resume.wait.waitId,\n )\n : await options.handleResumedWait(options.resume.wait)\n : await options.handleWait(phase, phaseValue, phaseIndex, waitOutputs);\n const waitId = waitResult.status === \"waiting\" ? waitResult.wait.waitId : waitResult.waitId;\n if (seenWaitIds.has(waitId)) {\n throw new Error(`step ${stepNode.config.id} has duplicate wait id '${waitId}'`);\n }\n seenWaitIds.add(waitId);\n\n if (waitResult.status === \"waiting\") {\n throwIfCancellationRequested(await options.readCancellation());\n return waitResult;\n }\n\n waitOutputs[waitResult.waitId] = waitResult.output;\n throwIfCancellationRequested(await options.readCancellation());\n throwIfStepTimedOut(options.signal, stepNode.config.id, options.timeoutMs);\n continue;\n }\n\n if (nextNode !== undefined) {\n throw new Error(`step ${stepNode.config.id} has executable phases after a do phase`);\n }\n\n if (phase.kind === \"prompt\") {\n phaseValue = await options.dispatchPrompt(phase);\n throwIfCancellationRequested(await options.readCancellation());\n throwIfStepTimedOut(options.signal, stepNode.config.id, options.timeoutMs);\n continue;\n }\n\n nextNode = await phase.onOutput(\n withWaitsDoContext(phaseValue, waitOutputs),\n stepNode.config.input,\n );\n throwIfCancellationRequested(await options.readCancellation());\n throwIfStepTimedOut(options.signal, stepNode.config.id, options.timeoutMs);\n }\n\n if (nextNode === undefined) {\n throw new Error(`step ${stepNode.config.id} has no do phase`);\n }\n\n return { status: \"continued\", node: nextNode };\n}\n\nfunction assertNoDuplicateStaticWaitIds(phases: readonly unknown[], stepId: string): void {\n const seenWaitIds = new Set<string>();\n for (const phase of phases) {\n if (!isPlainObject(phase) || phase.kind !== \"wait\") {\n continue;\n }\n const wait = phase.wait;\n if (typeof wait === \"function\" || !isPlainObject(wait) || typeof wait.id !== \"string\") {\n continue;\n }\n if (seenWaitIds.has(wait.id)) {\n throw new Error(`step ${stepId} has duplicate wait id '${wait.id}'`);\n }\n seenWaitIds.add(wait.id);\n }\n}\n\nasync function handleWaitPhase(options: {\n readonly phase: WaitPhase;\n readonly input: PlainObject;\n readonly output: PlainObject;\n readonly waits: Readonly<Record<string, PlainObject>>;\n readonly phaseIndex: number;\n readonly previousWaitId?: string;\n readonly stepId: string;\n readonly stepArtifactId: string;\n readonly runDir: string;\n readonly runId: string;\n readonly workflowId: string;\n readonly emit: (event: Event) => Promise<void>;\n}): Promise<HandleWaitResult> {\n if (options.phase.options !== undefined) {\n return await handleCheckWaitPhase({\n ...options,\n phase: options.phase as WaitPhase & { readonly options: NonNullable<WaitPhase[\"options\"]> },\n });\n }\n\n const wait = await resolveWaitDefinition(options.phase, {\n input: options.input,\n output: options.output,\n waits: options.waits,\n });\n validateWaitDefinition(wait, options.stepId, options.phaseIndex);\n\n const artifactPaths = resolveWaitArtifactPaths({\n runDir: options.runDir,\n stepArtifactId: options.stepArtifactId,\n waitId: wait.id,\n });\n const request = {\n stepId: options.stepId,\n waitId: wait.id,\n kind: wait.kind,\n message: wait.message,\n phaseIndex: options.phaseIndex,\n outputSchema: normalizeShape(wait.output).jsonSchema,\n };\n\n await mkdir(artifactPaths.waitDir, { recursive: true });\n await writeFile(artifactPaths.requestFile, `${JSON.stringify(request, null, 2)}\\n`, \"utf8\");\n\n const answerText = await readTextIfExists(artifactPaths.answerFile);\n if (answerText.status === \"missing\") {\n const waiting = {\n stepId: options.stepId,\n waitId: wait.id,\n message: wait.message,\n artifactPaths: artifactPaths.runRelative,\n };\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: options.stepId,\n type: \"wait.started\",\n payload: {\n waitId: wait.id,\n kind: wait.kind,\n message: wait.message,\n phaseIndex: options.phaseIndex,\n artifactPaths: artifactPaths.runRelative,\n },\n }),\n );\n return { status: \"waiting\", wait: waiting };\n }\n\n try {\n const parsedAnswer: unknown = JSON.parse(answerText.value);\n if (!isPlainObject(parsedAnswer)) {\n throw new TypeError(`step ${options.stepId} wait ${wait.id} answer must be a plain object`);\n }\n const output = normalizeShape(wait.output).assert(\n parsedAnswer,\n `step ${options.stepId} wait ${wait.id} answer`,\n );\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: options.stepId,\n type: \"wait.satisfied\",\n payload: {\n waitId: wait.id,\n kind: wait.kind,\n message: wait.message,\n phaseIndex: options.phaseIndex,\n artifactPaths: artifactPaths.runRelative,\n output,\n },\n }),\n );\n return { status: \"satisfied\", waitId: wait.id, output };\n } catch (error) {\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: options.stepId,\n type: \"wait.failed\",\n payload: {\n waitId: wait.id,\n kind: wait.kind,\n message: wait.message,\n phaseIndex: options.phaseIndex,\n artifactPaths: artifactPaths.runRelative,\n failure: stepExecutionFailure(error),\n },\n }),\n );\n throw error;\n }\n}\n\nasync function handleCheckWaitPhase(options: {\n readonly phase: WaitPhase & { readonly options: NonNullable<WaitPhase[\"options\"]> };\n readonly input: PlainObject;\n readonly output: PlainObject;\n readonly waits: Readonly<Record<string, PlainObject>>;\n readonly phaseIndex: number;\n readonly previousWaitId?: string;\n readonly stepId: string;\n readonly stepArtifactId: string;\n readonly runDir: string;\n readonly runId: string;\n readonly workflowId: string;\n readonly emit: (event: Event) => Promise<void>;\n}): Promise<HandleWaitResult> {\n const outputSchema = normalizeShape(options.phase.options.output);\n const defaultWaitId = options.previousWaitId ?? `check-${options.phaseIndex}`;\n let waitId = defaultWaitId;\n\n try {\n if (typeof options.phase.wait !== \"function\") {\n throw new TypeError(\n `step ${options.stepId} check wait phase ${options.phaseIndex} requires a callback.`,\n );\n }\n\n const check = options.phase.wait as (context: {\n readonly input: PlainObject;\n readonly output: PlainObject;\n readonly waits: Readonly<Record<string, PlainObject>>;\n readonly wait: CheckWaitHelpers<PlainObject>;\n }) => WaitCheckResult | Promise<WaitCheckResult>;\n const result = await check({\n input: options.input,\n output: options.output,\n waits: options.waits,\n wait: createCheckWaitHelpers(),\n });\n validateCheckWaitResult(result, options.stepId, options.phaseIndex);\n\n if (result.status === \"pending\") {\n validatePendingWait(result, options.stepId, options.phaseIndex);\n waitId = result.id;\n const artifactPaths = resolveWaitArtifactPaths({\n runDir: options.runDir,\n stepArtifactId: options.stepArtifactId,\n waitId,\n });\n const request = {\n stepId: options.stepId,\n waitId,\n kind: \"check\",\n message: result.message,\n phaseIndex: options.phaseIndex,\n ...(result.retryAfterSeconds === undefined\n ? {}\n : { retryAfterSeconds: result.retryAfterSeconds }),\n outputSchema: outputSchema.jsonSchema,\n };\n\n await mkdir(artifactPaths.waitDir, { recursive: true });\n await writeFile(artifactPaths.requestFile, `${JSON.stringify(request, null, 2)}\\n`, \"utf8\");\n\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: options.stepId,\n type: \"wait.started\",\n payload: {\n waitId,\n kind: \"check\",\n message: result.message,\n phaseIndex: options.phaseIndex,\n ...(result.retryAfterSeconds === undefined\n ? {}\n : { retryAfterSeconds: result.retryAfterSeconds }),\n artifactPaths: artifactPaths.runRelative,\n },\n }),\n );\n\n return {\n status: \"waiting\",\n wait: {\n stepId: options.stepId,\n waitId,\n kind: \"check\",\n message: result.message,\n ...(result.retryAfterSeconds === undefined\n ? {}\n : { retryAfterSeconds: result.retryAfterSeconds }),\n artifactPaths: artifactPaths.runRelative,\n },\n };\n }\n\n const output = outputSchema.assert(\n result.output,\n `step ${options.stepId} check wait ${waitId} output`,\n );\n const artifactPaths = resolveWaitArtifactPaths({\n runDir: options.runDir,\n stepArtifactId: options.stepArtifactId,\n waitId,\n });\n await mkdir(artifactPaths.waitDir, { recursive: true });\n await writeFile(\n artifactPaths.requestFile,\n `${JSON.stringify(\n {\n stepId: options.stepId,\n waitId,\n kind: \"check\",\n phaseIndex: options.phaseIndex,\n outputSchema: outputSchema.jsonSchema,\n },\n null,\n 2,\n )}\\n`,\n \"utf8\",\n );\n\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: options.stepId,\n type: \"wait.satisfied\",\n payload: {\n waitId,\n kind: \"check\",\n phaseIndex: options.phaseIndex,\n artifactPaths: artifactPaths.runRelative,\n output,\n },\n }),\n );\n return { status: \"satisfied\", waitId, output };\n } catch (error) {\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: options.stepId,\n type: \"wait.failed\",\n payload: {\n waitId,\n kind: \"check\",\n phaseIndex: options.phaseIndex,\n failure: stepExecutionFailure(error),\n },\n }),\n );\n throw error;\n }\n}\n\nasync function handleResumedWaitPhase(options: {\n readonly wait: ResumedWaitDetails;\n readonly stepId: string;\n readonly runDir: string;\n readonly runId: string;\n readonly workflowId: string;\n readonly emit: (event: Event) => Promise<void>;\n}): Promise<HandleWaitResult> {\n const answerFile = joinRunPath(options.runDir, options.wait.artifactPaths.answerFile);\n const answerText = await readTextIfExists(answerFile);\n if (answerText.status === \"missing\") {\n return {\n status: \"waiting\",\n wait: {\n stepId: options.stepId,\n waitId: options.wait.waitId,\n message: options.wait.message,\n artifactPaths: options.wait.artifactPaths,\n },\n };\n }\n\n try {\n const parsedAnswer: unknown = JSON.parse(answerText.value);\n if (!isPlainObject(parsedAnswer)) {\n throw new TypeError(\n `step ${options.stepId} wait ${options.wait.waitId} answer must be a plain object`,\n );\n }\n const output = jsonSchema<PlainObject>(options.wait.outputSchema).assert(\n parsedAnswer,\n `step ${options.stepId} wait ${options.wait.waitId} answer`,\n );\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: options.stepId,\n type: \"wait.satisfied\",\n payload: {\n waitId: options.wait.waitId,\n kind: options.wait.kind,\n message: options.wait.message,\n artifactPaths: options.wait.artifactPaths,\n output,\n },\n }),\n );\n return { status: \"satisfied\", waitId: options.wait.waitId, output };\n } catch (error) {\n await options.emit(\n createEvent({\n runId: options.runId,\n workflowId: options.workflowId,\n stepId: options.stepId,\n type: \"wait.failed\",\n payload: {\n waitId: options.wait.waitId,\n kind: options.wait.kind,\n message: options.wait.message,\n artifactPaths: options.wait.artifactPaths,\n failure: stepExecutionFailure(error),\n },\n }),\n );\n throw error;\n }\n}\n\nfunction joinRunPath(runDir: string, runRelativePath: string): string {\n return join(runDir, ...runRelativePath.split(\"/\"));\n}\n\nasync function resolveWaitDefinition(\n phase: WaitPhase,\n context: {\n readonly input: PlainObject;\n readonly output: PlainObject;\n readonly waits: Readonly<Record<string, PlainObject>>;\n },\n): Promise<WaitDefinition> {\n if (typeof phase.wait !== \"function\") {\n return phase.wait;\n }\n\n const resolveInputWait = phase.wait as (context: {\n readonly input: PlainObject;\n readonly output: PlainObject;\n readonly waits: Readonly<Record<string, PlainObject>>;\n }) => WaitDefinition | Promise<WaitDefinition>;\n return await resolveInputWait(context);\n}\n\nfunction createCheckWaitHelpers<TWaitOutput extends PlainObject>(): CheckWaitHelpers<TWaitOutput> {\n return {\n done(output) {\n return { status: \"done\", output };\n },\n pending(input) {\n return {\n status: \"pending\",\n id: input.id,\n message: input.message,\n ...(input.retryAfterSeconds === undefined\n ? {}\n : { retryAfterSeconds: input.retryAfterSeconds }),\n };\n },\n };\n}\n\nfunction validateCheckWaitResult(\n result: unknown,\n stepId: string,\n phaseIndex: number,\n): asserts result is WaitCheckResult {\n const label = `step ${stepId} check wait phase ${phaseIndex}`;\n if (!isPlainObject(result)) {\n throw new TypeError(`${label} must return wait.done(...) or wait.pending(...).`);\n }\n\n if (result.status !== \"done\" && result.status !== \"pending\") {\n throw new TypeError(`${label} must return wait.done(...) or wait.pending(...).`);\n }\n\n if (result.status === \"done\" && !(\"output\" in result)) {\n throw new TypeError(`${label} wait.done(...) requires output.`);\n }\n}\n\nfunction validatePendingWait(\n pending: WaitCheckResult,\n stepId: string,\n phaseIndex: number,\n): asserts pending is Extract<WaitCheckResult, { readonly status: \"pending\" }> {\n const label = `step ${stepId} check wait phase ${phaseIndex}`;\n if (pending.status !== \"pending\") {\n throw new TypeError(`${label} expected a pending result.`);\n }\n\n if (typeof pending.id !== \"string\" || pending.id.trim().length === 0) {\n throw new TypeError(`${label} pending result requires a non-empty string id.`);\n }\n\n if (\n pending.id === \".\" ||\n pending.id === \"..\" ||\n pending.id.includes(\"/\") ||\n pending.id.includes(\"\\\\\")\n ) {\n throw new TypeError(`${label} pending result id must be a single path-safe segment.`);\n }\n\n if (typeof pending.message !== \"string\" || pending.message.trim().length === 0) {\n throw new TypeError(`${label} pending result requires a non-empty string message.`);\n }\n\n if (\n pending.retryAfterSeconds !== undefined &&\n (!Number.isFinite(pending.retryAfterSeconds) || pending.retryAfterSeconds < 0)\n ) {\n throw new TypeError(`${label} pending retryAfterSeconds must be a non-negative number.`);\n }\n}\n\nfunction validateWaitDefinition(wait: WaitDefinition, stepId: string, phaseIndex: number): void {\n const label = `step ${stepId} wait phase ${phaseIndex}`;\n if (!isPlainObject(wait)) {\n throw new TypeError(`${label} must resolve to a wait object.`);\n }\n\n if (typeof wait.id !== \"string\" || wait.id.trim().length === 0) {\n throw new TypeError(`${label} requires a non-empty string id.`);\n }\n\n if (wait.id === \".\" || wait.id === \"..\" || wait.id.includes(\"/\") || wait.id.includes(\"\\\\\")) {\n throw new TypeError(`${label} id must be a single path-safe segment.`);\n }\n\n if (wait.kind !== \"input\") {\n throw new TypeError(`${label} kind must be \"input\".`);\n }\n\n if (typeof wait.message !== \"string\" || wait.message.trim().length === 0) {\n throw new TypeError(`${label} requires a non-empty string message.`);\n }\n\n if (!(\"output\" in wait) || wait.output === undefined) {\n throw new TypeError(`${label} requires an output shape.`);\n }\n\n normalizeShape(wait.output);\n}\n\nasync function readTextIfExists(\n path: string,\n): Promise<{ readonly status: \"found\"; readonly value: string } | { readonly status: \"missing\" }> {\n try {\n return { status: \"found\", value: await readFile(path, \"utf8\") };\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return { status: \"missing\" };\n }\n throw error;\n }\n}\n\nfunction withWaitsDoContext(\n output: PlainObject,\n waits: Readonly<Record<string, PlainObject>>,\n): PlainObject {\n return new Proxy(output, {\n get(target, property, receiver) {\n if (property === \"output\") {\n return target;\n }\n if (property === \"waits\") {\n return waits;\n }\n return Reflect.get(target, property, receiver);\n },\n has(target, property) {\n return property === \"output\" || property === \"waits\" || Reflect.has(target, property);\n },\n getOwnPropertyDescriptor(target, property) {\n if (property === \"output\") {\n return { configurable: true, enumerable: false, value: target };\n }\n if (property === \"waits\") {\n return { configurable: true, enumerable: false, value: waits };\n }\n return Reflect.getOwnPropertyDescriptor(target, property);\n },\n });\n}\n\nasync function resolveDisplayPayload(options: {\n readonly phase: DisplayPhase;\n readonly input: PlainObject;\n readonly output: PlainObject;\n readonly phaseIndex: number;\n readonly stepId: string;\n}): Promise<PlainObject> {\n const { phase, input, output, phaseIndex, stepId } = options;\n const rawValue =\n typeof phase.content === \"function\" ? await phase.content({ input, output }) : phase.content;\n\n const display = normalizeDisplayValue(rawValue, { stepId, phaseIndex });\n if (typeof display === \"string\") {\n return { message: display, level: \"info\", phaseIndex };\n }\n\n return {\n message: display.message,\n level: display.level ?? \"info\",\n ...(\"data\" in display ? { data: display.data } : {}),\n phaseIndex,\n };\n}\n\nfunction normalizeDisplayValue(\n value: unknown,\n context: { readonly stepId: string; readonly phaseIndex: number },\n): StepDisplayValue {\n const label = `step ${context.stepId} display phase ${context.phaseIndex}`;\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (!isPlainObject(value) || typeof value.message !== \"string\") {\n throw new TypeError(`${label} must resolve to a string or an object with a string message.`);\n }\n\n const level = value.level ?? \"info\";\n if (!isDisplayLevel(level)) {\n throw new TypeError(`${label} level must be one of: info, warning, error, debug.`);\n }\n\n return {\n message: value.message,\n level,\n ...(\"data\" in value ? { data: value.data } : {}),\n };\n}\n\nfunction isDisplayLevel(value: unknown): value is \"info\" | \"warning\" | \"error\" | \"debug\" {\n return value === \"info\" || value === \"warning\" || value === \"error\" || value === \"debug\";\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\nasync function runWithStepControl<T>(options: {\n readonly stepId: string;\n readonly timeoutMs?: number;\n readonly readCancellation: () => Promise<CancellationMarker | undefined>;\n readonly run: (signal: AbortSignal) => Promise<T>;\n}): Promise<T> {\n const initialCancellation = await options.readCancellation();\n if (initialCancellation !== undefined) {\n throw new WorkflowCancellationError(initialCancellation);\n }\n\n const abortController = new AbortController();\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let stopCancellationWatch: (() => void) | undefined;\n\n const runPromise = options.run(abortController.signal);\n void runPromise.catch(() => undefined);\n\n const cancellationPromise = new Promise<never>((_, reject) => {\n stopCancellationWatch = watchCancellation(options.readCancellation, (result) => {\n abortController.abort();\n if (\"error\" in result) {\n reject(result.error);\n return;\n }\n reject(new WorkflowCancellationError(result.cancellation));\n });\n });\n\n const raced: Array<Promise<T> | Promise<never>> = [runPromise, cancellationPromise];\n\n if (options.timeoutMs !== undefined) {\n const timeoutMs = options.timeoutMs;\n raced.push(\n new Promise<never>((_, reject) => {\n timeout = setTimeout(() => {\n abortController.abort();\n reject(stepTimeoutFailure(options.stepId, timeoutMs));\n }, timeoutMs);\n }),\n );\n }\n\n try {\n return await Promise.race(raced);\n } finally {\n stopCancellationWatch?.();\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n }\n}\n\nfunction watchCancellation(\n readCancellation: () => Promise<CancellationMarker | undefined>,\n onCancel: (\n result: { readonly cancellation: CancellationMarker } | { readonly error: unknown },\n ) => void,\n): () => void {\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const poll = async (): Promise<void> => {\n if (stopped) {\n return;\n }\n\n try {\n const cancellation = await readCancellation();\n if (cancellation !== undefined) {\n stopped = true;\n onCancel({ cancellation });\n return;\n }\n } catch (error) {\n stopped = true;\n onCancel({ error });\n return;\n }\n\n timer = setTimeout(() => void poll(), 100);\n };\n\n timer = setTimeout(() => void poll(), 0);\n\n return () => {\n stopped = true;\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n };\n}\n\nfunction throwIfStepTimedOut(\n signal: AbortSignal | undefined,\n stepId: string,\n timeoutMs: number | undefined,\n): void {\n if (signal?.aborted && timeoutMs !== undefined) {\n throw stepTimeoutFailure(stepId, timeoutMs);\n }\n}\n\nfunction stepTimeoutFailure(stepId: string, timeoutMs: number): TrailStepFailureError {\n return new TrailStepFailureError({\n code: \"step_timeout\",\n message: `Step ${stepId} timed out after ${timeoutMs}ms.`,\n details: { stepId, timeoutMs },\n });\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof TrailStepFailureError) {\n return error.message;\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n return \"Error continuation failed.\";\n}\n\nfunction continuationFailure(source: string): Failure {\n return {\n code: \"invalid_continuation\",\n message: `${source} returned an invalid continuation node.`,\n };\n}\n\nfunction failureFromError(error: unknown): Failure {\n if (error instanceof TrailStepFailureError) {\n return error.failure;\n }\n\n return stepExecutionFailure(error);\n}\n\nfunction unsupportedContinuationFailure(node: unknown, source: string): Failure | undefined {\n const form = unsupportedContinuationForm(node);\n if (form === undefined) {\n return undefined;\n }\n\n return {\n code: \"unsupported_continuation\",\n message: `${source} returned ${form}, but parallel tracks/workflow invocation execution is not implemented yet.`,\n };\n}\n\nfunction unsupportedContinuationForm(node: unknown): string | undefined {\n if (Array.isArray(node)) {\n return \"a continuation array\";\n }\n\n if (isAbsoluteDoneNode(node)) {\n return \"an absolute done continuation\";\n }\n\n if (isAbsoluteFailNode(node)) {\n return \"an absolute fail continuation\";\n }\n\n return undefined;\n}\n","import type { Failure } from \"../../contracts/failures/failure.js\";\n\nimport { isFailureLikeError } from \"./failure-like.js\";\n\nexport function stepExecutionFailure(error: unknown): Failure {\n if (isFailureLikeError(error)) {\n return error.failure;\n }\n\n return {\n code: \"step_execution_failed\",\n message: error instanceof Error ? error.message : \"Step execution failed.\",\n ...(error instanceof Error\n ? {\n details: {\n name: error.name,\n },\n }\n : error === undefined\n ? {}\n : { details: { cause: error } }),\n };\n}\n","import { runContextStorage } from \"./run-context-storage.js\";\n\n/**\n * Runs `fn` with a step-scoped ambient `RunContext.currentStep` shadowing\n * whatever run-level context is already active (set once, for the whole\n * run, by `run-workflow.ts`). This is a genuine nested `AsyncLocalStorage`\n * scope — it does not mutate or replace the outer context, only shadows it\n * for the duration of `fn`, so code outside any step (or in a sibling step)\n * is unaffected.\n *\n * `nextDocumentIndex()` hands out 1, 2, 3, ... on each call within this one\n * invocation of `withStepContext` — a fresh counter every time, including\n * across resume replay of already-completed steps and retries of a failed\n * step, since each of those call sites invokes `withStepContext` anew.\n *\n * If there is no ambient run context at all (a step-executing function\n * called directly, outside of `runWorkflow`'s `runContextStorage.run(...)`\n * scope — e.g. unit tests that exercise the resume/continuation internals\n * in isolation), this falls back to running `fn` with no ambient context,\n * matching prior behavior exactly rather than throwing.\n */\nexport async function withStepContext<T>(\n stepId: string,\n stepDir: string,\n fn: () => Promise<T>,\n options: {\n readonly maxSubPrompts?: unknown;\n readonly cwd?: string;\n readonly executionCwd?: string;\n readonly replay?: { readonly kind: \"completed-step\" };\n } = {},\n): Promise<T> {\n const parentContext = runContextStorage.getStore();\n if (!parentContext) {\n return await fn();\n }\n\n let nextDocumentIndex = 0;\n let nextSubPromptIndex = 0;\n\n const executionCwd = options.executionCwd ?? options.cwd ?? parentContext.executionCwd;\n const stepContext = {\n ...parentContext,\n cwd: executionCwd ?? parentContext.cwd,\n executionCwd: executionCwd ?? parentContext.executionCwd,\n currentStep: {\n id: stepId,\n dir: stepDir,\n maxSubPrompts: options.maxSubPrompts,\n cwd: executionCwd ?? parentContext.cwd,\n executionCwd: executionCwd ?? parentContext.executionCwd,\n replay: options.replay,\n nextDocumentIndex(): number {\n nextDocumentIndex += 1;\n return nextDocumentIndex;\n },\n nextSubPromptIndex(): number {\n nextSubPromptIndex += 1;\n return nextSubPromptIndex;\n },\n },\n };\n\n return await runContextStorage.run(stepContext, fn);\n}\n","import { stat } from \"node:fs/promises\";\n\nexport interface RunCwds {\n /** Root used for workflow/config-relative resolution and default artifact storage. */\n readonly projectCwd: string;\n /** Default execution cwd for steps and agent processes. */\n readonly cwd: string;\n}\n\nexport async function resolveAndValidateRunCwds(options: {\n readonly projectCwd?: string;\n readonly cwd?: string;\n}): Promise<RunCwds> {\n const projectCwd = options.projectCwd ?? options.cwd ?? process.cwd();\n const cwd = options.cwd ?? projectCwd;\n\n await validateDirectoryCwd(projectCwd, \"projectCwd\");\n if (cwd === projectCwd) {\n return { projectCwd, cwd };\n }\n\n await validateDirectoryCwd(cwd, \"cwd\");\n return { projectCwd, cwd };\n}\n\nexport async function validateDirectoryCwd(cwd: string, label: string): Promise<void> {\n if (cwd.trim().length === 0) {\n throw new TypeError(`${label} must be a non-empty string.`);\n }\n\n const stats = await stat(cwd).catch((error) => {\n throw new Error(`${label} must be an existing directory: ${cwd}`, { cause: error });\n });\n\n if (!stats.isDirectory()) {\n throw new Error(`${label} must be an existing directory: ${cwd}`);\n }\n}\n","export interface TimeoutPolicy {\n readonly timeoutMs?: number;\n}\n\nexport type TimeoutPolicyInput = number;\n\nexport interface ResolveTimeoutPolicyOptions {\n readonly global?: TimeoutPolicyInput;\n readonly workflow?: TimeoutPolicyInput;\n readonly step?: TimeoutPolicyInput;\n}\n\nconst BUILT_IN_TIMEOUT_POLICY: TimeoutPolicy = {};\n\nexport function resolveTimeoutPolicy(options: ResolveTimeoutPolicyOptions): TimeoutPolicy {\n const configured = firstConfiguredPolicy(options.step, options.workflow, options.global);\n return configured !== undefined ? validateTimeoutPolicy(configured) : BUILT_IN_TIMEOUT_POLICY;\n}\n\nexport function validateTimeoutPolicy(input: unknown): TimeoutPolicy {\n if (typeof input !== \"number\" || !Number.isInteger(input) || input < 1) {\n throw new TypeError(\n \"timeout must be an integer number of milliseconds greater than or equal to 1.\",\n );\n }\n\n return { timeoutMs: input };\n}\n\nfunction firstConfiguredPolicy(...policies: readonly unknown[]): unknown | undefined {\n return policies.find((policy) => policy !== undefined);\n}\n","export const DEFAULT_INTERACTIVE_OUTPUT_SHAPE = { sessionFile: \"string\" } as const;\n","import { normalizeShape } from \"../../../authoring/shape/json-schema.js\";\nimport type { PlainObject, Schema, ShapeInput } from \"../../../contracts/shapes/shape.types.js\";\nimport { DEFAULT_INTERACTIVE_OUTPUT_SHAPE } from \"../../interactive-session/default-interactive-output-shape.js\";\n\n/**\n * A prompt phase's effective output schema: its own `output`, or -- for an\n * interactive phase with none given -- the default interactive output shape.\n * Shared by dispatch (`runContinuation`) and both resume paths\n * (`reattachInProgressStep`, `replayCompletedSteps`), which must all resolve\n * the identical schema a step was originally dispatched with.\n */\nexport function resolveStepOutputSchema(config: {\n readonly output?: ShapeInput<PlainObject>;\n readonly mode?: \"working\" | \"interactive\";\n}): Schema<PlainObject> | undefined {\n const effectiveOutput =\n config.output ?? (config.mode === \"interactive\" ? DEFAULT_INTERACTIVE_OUTPUT_SHAPE : undefined);\n\n return effectiveOutput ? normalizeShape(effectiveOutput) : undefined;\n}\n","import type { Failure } from \"../../contracts/failures/failure.js\";\n\nimport { isFailureLikeError } from \"./failure-like.js\";\n\nexport function workflowFailure(error: unknown): Failure {\n if (isFailureLikeError(error)) {\n return error.failure;\n }\n\n return {\n code: \"workflow_failed\",\n message: error instanceof Error ? error.message : \"Unknown workflow failure.\",\n ...(error === undefined ? {} : { details: { cause: error } }),\n };\n}\n","import type { ContinuationResult, StepNode } from \"../../../authoring/step/continuation.types.js\";\nimport {\n firstPromptPhase,\n getStepPhases,\n hasPromptPhase,\n isStepNode,\n} from \"../../../authoring/step/step-node.js\";\nimport type { Failure } from \"../../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../../contracts/shapes/shape.types.js\";\nimport type {\n Event,\n RunWorkflowOptions,\n} from \"../../../runtime/run-workflow/run-workflow.types.js\";\nimport { resolveStepArtifactPaths } from \"../../artifacts/step-artifacts.js\";\nimport { resolveStepOutputSchema } from \"../../continuation/resolve-step-output-schema/resolve-step-output-schema.js\";\nimport { withStepContext } from \"../../run-context/with-step-context.js\";\n\n/**\n * Walks a workflow's `start(...)` continuation forward through its recorded\n * `step.completed` history — trusting each completed prompt/agent step's\n * persisted output rather than recomputing it — until it reaches\n * `targetStepId`. Shared by `replayToFailedStep` (target = the step that\n * failed) and `reattachInProgressStep` (target = a dangling interactive\n * step): both need the identical \"replay what already happened\" walk: only\n * their handling of the target step once reached differs.\n */\nexport async function replayCompletedSteps<\n TInput extends PlainObject,\n TOutput extends PlainObject,\n>(options: {\n readonly workflow: RunWorkflowOptions<TInput, TOutput>[\"workflow\"];\n readonly events: readonly Event[];\n readonly input: PlainObject;\n readonly targetStepId: string;\n readonly runDir: string;\n}): Promise<\n | { readonly status: \"success\"; readonly node: StepNode }\n | { readonly status: \"failure\"; readonly failure: Failure }\n> {\n let node: ContinuationResult = options.workflow.start(options.input as TInput);\n const completedAttempts = pairCompletedStepAttempts(options.events);\n\n for (const attempt of completedAttempts) {\n const { completedEvent, stepIndex } = attempt;\n if (!isStepNode(node)) {\n return {\n status: \"failure\",\n failure: replayFailure(\n \"resume_step_id_drift\",\n \"Completed history continues after the current workflow reaches done.\",\n ),\n };\n }\n\n if (node.config.id !== completedEvent.stepId) {\n return {\n status: \"failure\",\n failure: replayFailure(\n \"resume_step_id_drift\",\n `Expected completed step ${node.config.id} but found ${completedEvent.stepId ?? \"<missing>\"}.`,\n ),\n };\n }\n\n if (hasPromptPhase(node)) {\n const recordedOutput = readPlainPayload(completedEvent, \"output\");\n if (!recordedOutput) {\n return {\n status: \"failure\",\n failure: replayFailure(\n \"resume_missing_step_output\",\n `Completed step ${node.config.id} has no recorded output to resume from.`,\n ),\n };\n }\n\n const promptPhase = firstPromptPhase(getStepPhases(node));\n const outputSchema = promptPhase ? resolveStepOutputSchema(promptPhase) : undefined;\n if (!outputSchema) {\n return {\n status: \"failure\",\n failure: replayFailure(\n \"resume_output_schema_unresolvable\",\n `Step ${node.config.id} has no resolvable output schema to replay with.`,\n ),\n };\n }\n const validatedOutput = outputSchema.assert(recordedOutput, `step ${node.config.id} output`);\n\n const stepDir = resolveStepArtifactPaths({\n runDir: options.runDir,\n stepId: node.config.id,\n stepIndex,\n }).stepDir;\n const completedNode = node;\n const recordedWaitOutputs = readCompletedStepWaitOutputs({\n events: options.events,\n attempt,\n });\n if (recordedWaitOutputs.status === \"failure\") {\n return recordedWaitOutputs;\n }\n node = await withStepContext(\n completedNode.config.id,\n stepDir,\n async () =>\n replayStepPhases(completedNode, validatedOutput, recordedWaitOutputs.waitOutputs),\n { replay: { kind: \"completed-step\" } },\n );\n } else {\n const stepDir = resolveStepArtifactPaths({\n runDir: options.runDir,\n stepId: node.config.id,\n stepIndex,\n }).stepDir;\n const completedNode = node;\n const recordedWaitOutputs = readCompletedStepWaitOutputs({\n events: options.events,\n attempt,\n });\n if (recordedWaitOutputs.status === \"failure\") {\n return recordedWaitOutputs;\n }\n node = await withStepContext(\n completedNode.config.id,\n stepDir,\n async () => replayStepPhases(completedNode, undefined, recordedWaitOutputs.waitOutputs),\n { replay: { kind: \"completed-step\" } },\n );\n }\n }\n\n if (!isStepNode(node) || node.config.id !== options.targetStepId) {\n return {\n status: \"failure\",\n failure: replayFailure(\n \"resume_step_id_drift\",\n `Target step ${options.targetStepId} is not the next live step.`,\n ),\n };\n }\n\n return { status: \"success\", node };\n}\n\nasync function replayStepPhases(\n stepNode: StepNode,\n recordedPromptOutput?: PlainObject,\n recordedWaitOutputs: Readonly<Record<string, PlainObject>> = {},\n): Promise<ContinuationResult> {\n let phaseValue = stepNode.config.input;\n let usedRecordedPromptOutput = false;\n let nextNode: ContinuationResult | undefined;\n\n for (const phase of getStepPhases(stepNode)) {\n if (phase.kind === \"display\" || phase.kind === \"wait\") {\n continue;\n }\n\n if (nextNode !== undefined) {\n throw new Error(`step ${stepNode.config.id} has executable phases after a do phase`);\n }\n\n if (phase.kind === \"prompt\") {\n if (recordedPromptOutput === undefined || usedRecordedPromptOutput) {\n throw new Error(`step ${stepNode.config.id} has no recorded output to replay prompt phase`);\n }\n phaseValue = recordedPromptOutput;\n usedRecordedPromptOutput = true;\n continue;\n }\n\n nextNode = await phase.onOutput(\n withWaitsDoContext(phaseValue, recordedWaitOutputs),\n stepNode.config.input,\n );\n }\n\n if (nextNode === undefined) {\n throw new Error(`step ${stepNode.config.id} has no do phase`);\n }\n\n return nextNode;\n}\n\ninterface CompletedStepAttempt {\n readonly stepId: string;\n readonly stepIndex: number;\n readonly completedEvent: Event;\n readonly startedEventIndex: number;\n readonly completedEventIndex: number;\n}\n\ninterface CompletedStepAttemptStart {\n readonly event: Event;\n readonly eventIndex: number;\n readonly stepIndex: number;\n}\n\nfunction pairCompletedStepAttempts(events: readonly Event[]): readonly CompletedStepAttempt[] {\n const startedByStepId = new Map<string, CompletedStepAttemptStart[]>();\n const attempts: CompletedStepAttempt[] = [];\n let stepIndex = 0;\n\n for (const [eventIndex, event] of events.entries()) {\n if (event.type === \"step.started\" && event.stepId) {\n stepIndex += 1;\n const starts = startedByStepId.get(event.stepId) ?? [];\n starts.push({ event, eventIndex, stepIndex });\n startedByStepId.set(event.stepId, starts);\n continue;\n }\n\n if (\n (event.type === \"step.completed\" ||\n event.type === \"step.failed\" ||\n event.type === \"step.cancelled\") &&\n event.stepId\n ) {\n const starts = startedByStepId.get(event.stepId);\n const started = starts?.pop();\n if (!started || event.type !== \"step.completed\") {\n continue;\n }\n\n attempts.push({\n stepId: event.stepId,\n stepIndex: started.stepIndex,\n completedEvent: event,\n startedEventIndex: started.eventIndex,\n completedEventIndex: eventIndex,\n });\n }\n }\n\n return attempts.sort((left, right) => left.completedEventIndex - right.completedEventIndex);\n}\n\nfunction readCompletedStepWaitOutputs(options: {\n readonly events: readonly Event[];\n readonly attempt: CompletedStepAttempt;\n}):\n | { readonly status: \"success\"; readonly waitOutputs: Readonly<Record<string, PlainObject>> }\n | { readonly status: \"failure\"; readonly failure: Failure } {\n const inStepEvents = options.events.slice(\n options.attempt.startedEventIndex + 1,\n options.attempt.completedEventIndex,\n );\n const waitOutputs: Record<string, PlainObject> = {};\n\n for (const event of inStepEvents) {\n if (event.type !== \"wait.satisfied\" || event.stepId !== options.attempt.stepId) {\n continue;\n }\n\n const waitId = typeof event.payload.waitId === \"string\" ? event.payload.waitId : undefined;\n const output = readPlainPayload(event, \"output\");\n if (!waitId || !output) {\n return {\n status: \"failure\",\n failure: replayFailure(\n \"resume_missing_wait_output\",\n `Completed step ${options.attempt.stepId} has an invalid recorded satisfied wait output.`,\n ),\n };\n }\n\n if (Object.hasOwn(waitOutputs, waitId)) {\n return {\n status: \"failure\",\n failure: replayFailure(\n \"resume_duplicate_wait_id\",\n `Completed step ${options.attempt.stepId} has duplicate wait id '${waitId}'.`,\n ),\n };\n }\n waitOutputs[waitId] = output;\n }\n\n return { status: \"success\", waitOutputs };\n}\n\nfunction withWaitsDoContext(\n output: PlainObject,\n waits: Readonly<Record<string, PlainObject>>,\n): PlainObject {\n return new Proxy(output, {\n get(target, property, receiver) {\n if (property === \"output\") {\n return target;\n }\n if (property === \"waits\") {\n return waits;\n }\n return Reflect.get(target, property, receiver);\n },\n has(target, property) {\n return property === \"output\" || property === \"waits\" || Reflect.has(target, property);\n },\n getOwnPropertyDescriptor(target, property) {\n if (property === \"output\") {\n return { configurable: true, enumerable: false, value: target };\n }\n if (property === \"waits\") {\n return { configurable: true, enumerable: false, value: waits };\n }\n return Reflect.getOwnPropertyDescriptor(target, property);\n },\n });\n}\n\nfunction readPlainPayload(event: Event, key: string): PlainObject | undefined {\n const value = event.payload[key];\n return isPlainObject(value) ? value : undefined;\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\nfunction replayFailure(code: string, message: string): Failure {\n return { code, message };\n}\n","import type { ContinuationResult } from \"../../../authoring/step/continuation.types.js\";\nimport { firstPromptPhase, getStepPhases } from \"../../../authoring/step/step-node.js\";\nimport type { Failure } from \"../../../contracts/failures/failure.js\";\nimport { TrailStepFailureError } from \"../../../contracts/failures/failure.js\";\nimport type { PlainObject, Schema } from \"../../../contracts/shapes/shape.types.js\";\nimport type {\n Event,\n RunWorkflowOptions,\n} from \"../../../runtime/run-workflow/run-workflow.types.js\";\nimport { resolveStepArtifactPaths } from \"../../artifacts/step-artifacts.js\";\nimport { resolveStepOutputSchema } from \"../../continuation/resolve-step-output-schema/resolve-step-output-schema.js\";\nimport {\n readCompletedInteractiveOutput,\n waitForInteractiveCompletion,\n} from \"../../interactive-session/interactive-session-protocol.js\";\nimport { withStepContext } from \"../../run-context/with-step-context.js\";\nimport { replayCompletedSteps } from \"../replay-completed-steps/replay-completed-steps.js\";\n\n/**\n * Detects the \"process died mid-interactive-step\" resume shape: the run's\n * last event is `interactive.sessionStarted` for a step, with nothing after\n * it — no `interactive.sessionCompleted`, `step.completed`, `step.failed`,\n * `workflow.failed`, or `workflow.completed` was ever written, because the\n * process was killed before any of those could be recorded. Anything else\n * (an already-terminal `workflow.failed`/`workflow.completed` run) is not\n * this shape, even if an interactive.sessionStarted appears earlier in\n * history — `run-workflow.ts` falls back to `replayToFailedStep` for that.\n */\nexport function findDanglingInteractiveSessionStart(events: readonly Event[]): Event | undefined {\n const anchor = events.at(-1);\n if (anchor?.type !== \"interactive.sessionStarted\" || !anchor.stepId) {\n return undefined;\n }\n\n const hasTerminalWorkflowEvent = events.some(\n (event) => event.type === \"workflow.failed\" || event.type === \"workflow.completed\",\n );\n\n return hasTerminalWorkflowEvent ? undefined : anchor;\n}\n\nexport async function reattachInProgressStep<\n TInput extends PlainObject,\n TOutput extends PlainObject,\n>(options: {\n readonly workflow: RunWorkflowOptions<TInput, TOutput>[\"workflow\"];\n readonly events: readonly Event[];\n readonly runDir: string;\n}): Promise<\n | {\n readonly status: \"success\";\n readonly input: PlainObject;\n readonly node: ContinuationResult;\n readonly resumedStepId: string;\n readonly sourceFailureEventId: string;\n }\n | { readonly status: \"failure\"; readonly failure: Failure }\n> {\n const anchor = findDanglingInteractiveSessionStart(options.events);\n if (!anchor?.stepId) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_target_not_dangling\",\n \"Resume target has no dangling interactive.sessionStarted event to reattach.\",\n ),\n };\n }\n\n const stepIndex = anchor.payload.stepIndex;\n if (typeof stepIndex !== \"number\") {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_missing_step_index\",\n `Dangling interactive.sessionStarted event for step ${anchor.stepId} has no recorded stepIndex.`,\n ),\n };\n }\n\n const startedEvent = options.events.find((event) => event.type === \"workflow.started\");\n if (!startedEvent) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_target_not_found\",\n \"Resume target has no workflow.started event.\",\n ),\n };\n }\n\n if (startedEvent.workflowId !== options.workflow.id) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_workflow_mismatch\",\n `Resume target workflow ${startedEvent.workflowId} does not match ${options.workflow.id}.`,\n ),\n };\n }\n\n const input = readPlainPayload(startedEvent, \"input\");\n if (!input) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_target_not_found\",\n \"workflow.started payload is missing input.\",\n ),\n };\n }\n\n const replay = await replayCompletedSteps({\n workflow: options.workflow,\n events: options.events,\n input,\n targetStepId: anchor.stepId,\n runDir: options.runDir,\n });\n if (replay.status === \"failure\") {\n return replay;\n }\n\n const { node } = replay;\n const artifactPaths = resolveStepArtifactPaths({\n runDir: options.runDir,\n stepId: anchor.stepId,\n stepIndex,\n });\n\n const promptPhase = firstPromptPhase(getStepPhases(node));\n const outputSchema = promptPhase ? resolveStepOutputSchema(promptPhase) : undefined;\n if (!outputSchema) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_output_schema_unresolvable\",\n `Step ${node.config.id} has no resolvable output schema to reattach with.`,\n ),\n };\n }\n\n const reattached = await readReattachedInteractiveOutput({\n stepId: anchor.stepId,\n interactiveFile: artifactPaths.interactiveFile,\n outputSchema,\n });\n if (reattached.status === \"failure\") {\n return reattached;\n }\n\n const nextNode = await withStepContext(anchor.stepId, artifactPaths.stepDir, async () =>\n continueAfterPromptPhase(\n node,\n outputSchema.assert(reattached.output, `step ${node.config.id} output`),\n ),\n );\n\n return {\n status: \"success\",\n input,\n node: nextNode,\n resumedStepId: anchor.stepId,\n sourceFailureEventId: anchor.id,\n };\n}\n\n/**\n * Reads the anchor step's already-existing interactive.json protocol file —\n * never spawns a new agent process. If the session was still \"active\" when\n * the previous process died, re-enters the same file-polling wait the live\n * dispatch path uses (`waitForInteractiveCompletion`) rather than giving up.\n */\nasync function readReattachedInteractiveOutput(options: {\n readonly stepId: string;\n readonly interactiveFile: string;\n readonly outputSchema: Schema;\n}): Promise<\n | { readonly status: \"success\"; readonly output: PlainObject }\n | { readonly status: \"failure\"; readonly failure: Failure }\n> {\n const first = await tryReadCompletedInteractiveOutput(options);\n if (first.status !== \"still-active\") {\n return first;\n }\n\n const abortController = new AbortController();\n await waitForInteractiveCompletion(options.interactiveFile, abortController.signal);\n\n const second = await tryReadCompletedInteractiveOutput(options);\n if (second.status !== \"still-active\") {\n return second;\n }\n\n throw new TrailStepFailureError({\n code: \"interactive_session_incomplete\",\n message: `Interactive agent step ${options.stepId} did not complete after reattaching.`,\n });\n}\n\nasync function tryReadCompletedInteractiveOutput(options: {\n readonly stepId: string;\n readonly interactiveFile: string;\n readonly outputSchema: Schema;\n}): Promise<\n | { readonly status: \"success\"; readonly output: PlainObject }\n | { readonly status: \"failure\"; readonly failure: Failure }\n | { readonly status: \"still-active\" }\n> {\n try {\n return { status: \"success\", output: await readCompletedInteractiveOutput(options) };\n } catch (error) {\n if (error instanceof TrailStepFailureError) {\n if (error.failure.code === \"interactive_session_incomplete\") {\n return { status: \"still-active\" };\n }\n\n if (error.failure.code === \"interactive_session_cancelled\") {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_interactive_session_cancelled\",\n `Interactive agent step ${options.stepId} was cancelled and cannot be resumed.`,\n ),\n };\n }\n\n if (error.failure.code === \"interactive_session_invalid\") {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_interactive_protocol_missing\",\n `Interactive agent step ${options.stepId} has no readable interactive.json to reattach to.`,\n ),\n };\n }\n }\n\n throw error;\n }\n}\n\nasync function continueAfterPromptPhase(\n stepNode: Extract<ContinuationResult, { kind: \"step\" }>,\n promptOutput: PlainObject,\n): Promise<ContinuationResult> {\n let phaseValue = stepNode.config.input;\n let consumedPromptOutput = false;\n let nextNode: ContinuationResult | undefined;\n\n for (const phase of getStepPhases(stepNode)) {\n if (phase.kind === \"display\" || phase.kind === \"wait\") {\n continue;\n }\n\n if (nextNode !== undefined) {\n throw new Error(`step ${stepNode.config.id} has executable phases after a do phase`);\n }\n\n if (phase.kind === \"prompt\") {\n if (consumedPromptOutput) {\n throw new Error(`step ${stepNode.config.id} cannot reattach multiple prompt phases`);\n }\n phaseValue = promptOutput;\n consumedPromptOutput = true;\n continue;\n }\n\n nextNode = await phase.onOutput(phaseValue, stepNode.config.input);\n }\n\n if (nextNode === undefined) {\n throw new Error(`step ${stepNode.config.id} has no do phase`);\n }\n\n return nextNode;\n}\n\nfunction readPlainPayload(event: Event, key: string): PlainObject | undefined {\n const value = event.payload[key];\n return isPlainObject(value) ? value : undefined;\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\nfunction resumeFailure(code: string, message: string): Failure {\n return { code, message };\n}\n","import type { StepNode } from \"../../../authoring/step/continuation.types.js\";\nimport type { Failure } from \"../../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../../contracts/shapes/shape.types.js\";\nimport type {\n Event,\n RunWorkflowOptions,\n} from \"../../../runtime/run-workflow/run-workflow.types.js\";\nimport { replayCompletedSteps } from \"../replay-completed-steps/replay-completed-steps.js\";\n\nexport async function replayToFailedStep<\n TInput extends PlainObject,\n TOutput extends PlainObject,\n>(options: {\n readonly workflow: RunWorkflowOptions<TInput, TOutput>[\"workflow\"];\n readonly events: readonly Event[];\n readonly runDir: string;\n}): Promise<\n | {\n readonly status: \"success\";\n readonly input: PlainObject;\n readonly node: StepNode;\n readonly resumedStepId: string;\n readonly sourceFailureEventId: string;\n }\n | { readonly status: \"failure\"; readonly failure: Failure }\n> {\n const startedEvent = options.events.find((event) => event.type === \"workflow.started\");\n if (!startedEvent) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_target_not_found\",\n \"Resume target has no workflow.started event.\",\n ),\n };\n }\n\n if (startedEvent.workflowId !== options.workflow.id) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_workflow_mismatch\",\n `Resume target workflow ${startedEvent.workflowId} does not match ${options.workflow.id}.`,\n ),\n };\n }\n\n const terminalEvent = options.events.at(-1);\n if (terminalEvent?.type !== \"workflow.failed\") {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_target_not_failed\",\n \"Resume target must end in workflow.failed.\",\n ),\n };\n }\n\n const recoveredFailedStep = options.events.find(\n (event, index) =>\n event.type === \"step.failed\" &&\n options.events\n .slice(index + 1)\n .some(\n (laterEvent) =>\n laterEvent.type === \"step.completed\" && laterEvent.stepId === event.stepId,\n ),\n );\n if (recoveredFailedStep) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_unsupported_history\",\n `Resume does not support recovered onError history for step ${recoveredFailedStep.stepId ?? \"<missing>\"}.`,\n ),\n };\n }\n\n const failedStepEvents = options.events.filter((event) => event.type === \"step.failed\");\n if (failedStepEvents.length !== 1) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_multiple_failed_steps\",\n \"Resume target must contain exactly one failed step.\",\n ),\n };\n }\n\n const failedStepEvent = failedStepEvents[0];\n if (!failedStepEvent) {\n return {\n status: \"failure\",\n failure: resumeFailure(\"resume_target_not_failed\", \"Resume target has no failed step.\"),\n };\n }\n\n if (!failedStepEvent.stepId) {\n return {\n status: \"failure\",\n failure: resumeFailure(\"resume_target_not_failed\", \"Failed step event has no step id.\"),\n };\n }\n\n const input = readPlainPayload(startedEvent, \"input\");\n if (!input) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_target_not_found\",\n \"workflow.started payload is missing input.\",\n ),\n };\n }\n\n const replay = await replayCompletedSteps({\n workflow: options.workflow,\n events: options.events,\n input,\n targetStepId: failedStepEvent.stepId,\n runDir: options.runDir,\n });\n if (replay.status === \"failure\") {\n return replay;\n }\n\n const { node } = replay;\n if (node.onError) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"resume_unsupported_history\",\n `Resume does not support onError history for step ${node.config.id}.`,\n ),\n };\n }\n\n return {\n status: \"success\",\n input,\n node,\n resumedStepId: failedStepEvent.stepId,\n sourceFailureEventId: failedStepEvent.id,\n };\n}\n\nfunction readPlainPayload(event: Event, key: string): PlainObject | undefined {\n const value = event.payload[key];\n return isPlainObject(value) ? value : undefined;\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\nfunction resumeFailure(code: string, message: string): Failure {\n return { code, message };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { StepNode, WaitPhase } from \"../../../authoring/step/continuation.types.js\";\nimport { getStepPhases } from \"../../../authoring/step/step-node.js\";\nimport type { Failure } from \"../../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../../contracts/shapes/shape.types.js\";\nimport type {\n Event,\n RunWorkflowOptions,\n} from \"../../../runtime/run-workflow/run-workflow.types.js\";\nimport { readBranchRunState } from \"../../artifacts/run-storage.js\";\nimport { resolveStepOutputSchema } from \"../../continuation/resolve-step-output-schema/resolve-step-output-schema.js\";\nimport { withStepContext } from \"../../run-context/with-step-context.js\";\nimport { replayCompletedSteps } from \"../replay-completed-steps/replay-completed-steps.js\";\n\nexport interface ReplayToWaitingStepResult {\n readonly status: \"success\";\n readonly input: PlainObject;\n readonly node: StepNode;\n readonly resumedStepId: string;\n readonly sourceWaitEventId: string;\n readonly stepIndex: number;\n readonly phaseIndex: number;\n readonly phaseValue: PlainObject;\n readonly waitOutputs: Readonly<Record<string, PlainObject>>;\n readonly seenWaitIds: readonly string[];\n readonly branchId?: string;\n readonly wait: {\n readonly waitId: string;\n readonly kind: \"input\" | \"check\";\n readonly message: string;\n readonly artifactPaths: { readonly requestFile: string; readonly answerFile: string };\n readonly outputSchema: Record<string, unknown>;\n };\n}\n\nexport async function replayToWaitingStep<\n TInput extends PlainObject,\n TOutput extends PlainObject,\n>(options: {\n readonly workflow: RunWorkflowOptions<TInput, TOutput>[\"workflow\"];\n readonly events: readonly Event[];\n readonly runDir: string;\n /**\n * Optional parallel-track scope: branch id to resume within. When given,\n * the pending wait must belong to this branch and the branch's persisted\n * run state is read from `runDir/branches/<branchId>.state.json`.\n */\n readonly branchId?: string;\n /**\n * Optional parallel-track scope: explicit step artifact index for the\n * waiting step; overrides the index derived from the wait's artifact paths\n * or step.started history.\n */\n readonly stepIndex?: number;\n}): Promise<ReplayToWaitingStepResult | { readonly status: \"failure\"; readonly failure: Failure }> {\n const startedEvent = options.events.find((event) => event.type === \"workflow.started\");\n if (!startedEvent) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_target_not_found\",\n \"Continue target has no workflow.started event.\",\n ),\n };\n }\n\n if (startedEvent.workflowId !== options.workflow.id) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_workflow_mismatch\",\n `Continue target workflow ${startedEvent.workflowId} does not match ${options.workflow.id}.`,\n ),\n };\n }\n\n if (options.events.some((event) => event.type === \"workflow.completed\")) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_target_not_waiting\",\n \"Continue target is already completed.\",\n ),\n };\n }\n\n const scopeBranchId = options.branchId;\n if (scopeBranchId !== undefined) {\n try {\n await readBranchRunState(options.runDir, scopeBranchId);\n } catch (error) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_target_not_found\",\n `Branch ${scopeBranchId} run state is missing or unreadable: ${error instanceof Error ? error.message : String(error)}`,\n ),\n };\n }\n }\n\n const pendingWait = findLatestPendingWait(options.events, scopeBranchId);\n if (!pendingWait?.stepId) {\n return {\n status: \"failure\",\n failure: resumeFailure(\"continue_target_not_waiting\", \"Continue target has no pending wait.\"),\n };\n }\n\n const input = readPlainPayload(startedEvent, \"input\");\n if (!input) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_target_not_found\",\n \"workflow.started payload is missing input.\",\n ),\n };\n }\n\n const waitId = readWaitId(pendingWait);\n if (!waitId) {\n return {\n status: \"failure\",\n failure: resumeFailure(\"continue_wait_invalid\", \"Pending wait event has no wait id.\"),\n };\n }\n\n const stepIndex =\n options.stepIndex ??\n readStepIndex(pendingWait) ??\n stepStartedOrdinalBefore(options.events, pendingWait);\n if (stepIndex === undefined) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_wait_invalid\",\n `Pending wait ${waitId} has no resolvable step artifact index.`,\n ),\n };\n }\n\n const targetStepStartedIndex = findStepStartedIndex(options.events, pendingWait, stepIndex);\n if (targetStepStartedIndex === undefined) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_wait_invalid\",\n `Pending wait ${waitId} has no matching step.started event.`,\n ),\n };\n }\n\n const replaySourceEvents = options.events.slice(0, targetStepStartedIndex);\n const replay = await replayCompletedSteps({\n workflow: options.workflow,\n events:\n scopeBranchId === undefined\n ? replaySourceEvents\n : branchScopedReplayEvents(replaySourceEvents, scopeBranchId),\n input,\n targetStepId: pendingWait.stepId,\n runDir: options.runDir,\n });\n if (replay.status === \"failure\") {\n return replay;\n }\n\n const prefix = await withStepContext(\n pendingWait.stepId,\n stepDirForIndex(options.runDir, pendingWait, stepIndex),\n async () =>\n replayWaitingStepPrefix({\n node: replay.node,\n events: options.events,\n targetStepStartedIndex,\n pendingWait,\n branchId: scopeBranchId,\n }),\n );\n if (prefix.status === \"failure\") {\n return prefix;\n }\n\n const wait = await readResumedWaitDetails(options.runDir, pendingWait, waitId);\n if (wait.status === \"failure\") {\n return wait;\n }\n\n return {\n status: \"success\",\n input,\n node: replay.node,\n resumedStepId: pendingWait.stepId,\n sourceWaitEventId: pendingWait.id,\n stepIndex,\n phaseIndex: prefix.phaseIndex,\n phaseValue: prefix.phaseValue,\n waitOutputs: prefix.waitOutputs,\n seenWaitIds: prefix.seenWaitIds,\n ...(scopeBranchId === undefined ? {} : { branchId: scopeBranchId }),\n wait: wait.wait,\n };\n}\n\nasync function readResumedWaitDetails(\n runDir: string,\n waitEvent: Event,\n waitId: string,\n): Promise<\n | {\n readonly status: \"success\";\n readonly wait: {\n readonly waitId: string;\n readonly kind: \"input\" | \"check\";\n readonly message: string;\n readonly artifactPaths: { readonly requestFile: string; readonly answerFile: string };\n readonly outputSchema: Record<string, unknown>;\n };\n }\n | { readonly status: \"failure\"; readonly failure: Failure }\n> {\n const artifactPaths = readWaitArtifactPaths(waitEvent);\n if (!artifactPaths) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_wait_invalid\",\n `Pending wait ${waitId} has no recorded artifact paths.`,\n ),\n };\n }\n\n let request: unknown;\n try {\n request = JSON.parse(\n await readFile(join(runDir, ...artifactPaths.requestFile.split(\"/\")), \"utf8\"),\n );\n } catch {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_wait_invalid\",\n `Pending wait ${waitId} has no readable wait request artifact.`,\n ),\n };\n }\n\n if (!isPlainObject(request) || !isPlainObject(request.outputSchema)) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_wait_invalid\",\n `Pending wait ${waitId} request artifact is missing outputSchema.`,\n ),\n };\n }\n\n const kind = request.kind === \"check\" ? \"check\" : \"input\";\n const message = typeof waitEvent.payload.message === \"string\" ? waitEvent.payload.message : \"\";\n return {\n status: \"success\",\n wait: {\n waitId,\n kind,\n message,\n artifactPaths,\n outputSchema: request.outputSchema,\n },\n };\n}\n\nfunction findLatestPendingWait(events: readonly Event[], branchId?: string): Event | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (event?.type !== \"wait.started\") {\n continue;\n }\n\n if (branchId !== undefined && event.payload.branchId !== branchId) {\n continue;\n }\n\n const key = waitEventKey(event);\n if (!key) {\n continue;\n }\n\n const resolvedLater = events\n .slice(index + 1)\n .some(\n (laterEvent) =>\n (laterEvent.type === \"wait.satisfied\" || laterEvent.type === \"wait.failed\") &&\n waitEventKey(laterEvent) === key,\n );\n if (!resolvedLater) {\n return event;\n }\n }\n\n return undefined;\n}\n\nasync function replayWaitingStepPrefix(options: {\n readonly node: StepNode;\n readonly events: readonly Event[];\n readonly targetStepStartedIndex: number;\n readonly pendingWait: Event;\n readonly branchId?: string;\n}): Promise<\n | {\n readonly status: \"success\";\n readonly phaseIndex: number;\n readonly phaseValue: PlainObject;\n readonly waitOutputs: Readonly<Record<string, PlainObject>>;\n readonly seenWaitIds: readonly string[];\n }\n | { readonly status: \"failure\"; readonly failure: Failure }\n> {\n const waitId = readWaitId(options.pendingWait);\n const targetPhaseIndex =\n typeof options.pendingWait.payload.phaseIndex === \"number\"\n ? options.pendingWait.payload.phaseIndex\n : undefined;\n const pendingWaitIndex = options.events.indexOf(options.pendingWait);\n const inStepEvents = options.events.slice(options.targetStepStartedIndex + 1, pendingWaitIndex);\n const belongsToScopedBranch = (event: Event): boolean =>\n options.branchId === undefined ||\n event.payload.branchId === undefined ||\n event.payload.branchId === options.branchId;\n const promptOutputs = inStepEvents.filter(\n (event) =>\n event.type === \"step.completed\" &&\n event.stepId === options.node.config.id &&\n belongsToScopedBranch(event) &&\n isPlainObject(event.payload.output),\n );\n const satisfiedWaits = inStepEvents.filter(\n (event) =>\n event.type === \"wait.satisfied\" &&\n event.stepId === options.node.config.id &&\n belongsToScopedBranch(event) &&\n isPlainObject(event.payload.output) &&\n typeof event.payload.waitId === \"string\",\n );\n\n let phaseValue = options.node.config.input;\n let promptOutputIndex = 0;\n let satisfiedWaitIndex = 0;\n const waitOutputs: Record<string, PlainObject> = {};\n const seenWaitIds: string[] = [];\n\n for (const [phaseIndex, phase] of getStepPhases(options.node).entries()) {\n if (phase.kind === \"display\") {\n continue;\n }\n\n if (phase.kind === \"prompt\") {\n const completedEvent = promptOutputs[promptOutputIndex];\n promptOutputIndex += 1;\n if (!completedEvent || !isPlainObject(completedEvent.payload.output)) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_missing_step_output\",\n `Step ${options.node.config.id} has no recorded prompt output before wait ${waitId ?? \"<missing>\"}.`,\n ),\n };\n }\n\n const outputSchema = resolveStepOutputSchema(phase);\n if (!outputSchema) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_output_schema_unresolvable\",\n `Step ${options.node.config.id} has no resolvable output schema to continue with.`,\n ),\n };\n }\n phaseValue = outputSchema.assert(\n completedEvent.payload.output,\n `step ${options.node.config.id} output`,\n );\n continue;\n }\n\n if (phase.kind === \"wait\") {\n const isTargetPhase =\n targetPhaseIndex === undefined\n ? await waitPhaseMatches(phase, {\n phaseValue,\n waitOutputs,\n input: options.node.config.input,\n waitId,\n })\n : phaseIndex === targetPhaseIndex;\n if (isTargetPhase) {\n return {\n status: \"success\",\n phaseIndex,\n phaseValue,\n waitOutputs,\n seenWaitIds,\n };\n }\n\n const satisfiedEvent = satisfiedWaits[satisfiedWaitIndex];\n satisfiedWaitIndex += 1;\n const satisfiedWaitId =\n typeof satisfiedEvent?.payload.waitId === \"string\"\n ? satisfiedEvent.payload.waitId\n : undefined;\n if (!satisfiedWaitId || !isPlainObject(satisfiedEvent?.payload.output)) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_missing_wait_output\",\n `Step ${options.node.config.id} has no recorded satisfied wait output before wait ${waitId ?? \"<missing>\"}.`,\n ),\n };\n }\n\n if (seenWaitIds.includes(satisfiedWaitId)) {\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_duplicate_wait_id\",\n `Step ${options.node.config.id} has duplicate wait id '${satisfiedWaitId}'.`,\n ),\n };\n }\n seenWaitIds.push(satisfiedWaitId);\n waitOutputs[satisfiedWaitId] = satisfiedEvent.payload.output;\n continue;\n }\n\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_wait_after_do\",\n `Pending wait ${waitId ?? \"<missing>\"} occurs after step ${options.node.config.id}'s do phase.`,\n ),\n };\n }\n\n return {\n status: \"failure\",\n failure: resumeFailure(\n \"continue_wait_not_reachable\",\n `Pending wait ${waitId ?? \"<missing>\"} was not found in step ${options.node.config.id}.`,\n ),\n };\n}\n\nasync function waitPhaseMatches(\n phase: WaitPhase,\n context: {\n readonly phaseValue: PlainObject;\n readonly waitOutputs: Readonly<Record<string, PlainObject>>;\n readonly input: PlainObject;\n readonly waitId: string | undefined;\n },\n): Promise<boolean> {\n if (!context.waitId) {\n return false;\n }\n\n if (phase.options !== undefined) {\n return false;\n }\n\n const wait =\n typeof phase.wait === \"function\"\n ? await (\n phase.wait as (waitContext: {\n readonly input: PlainObject;\n readonly output: PlainObject;\n readonly waits: Readonly<Record<string, PlainObject>>;\n }) => unknown | Promise<unknown>\n )({\n input: context.input,\n output: context.phaseValue,\n waits: context.waitOutputs,\n })\n : phase.wait;\n return isPlainObject(wait) && wait.id === context.waitId;\n}\n\nfunction findStepStartedIndex(\n events: readonly Event[],\n pendingWait: Event,\n stepIndex: number,\n): number | undefined {\n let ordinal = 0;\n for (const [index, event] of events.entries()) {\n if (event.type !== \"step.started\") {\n continue;\n }\n ordinal += 1;\n if (ordinal === stepIndex) {\n return index;\n }\n }\n\n for (let index = events.indexOf(pendingWait); index >= 0; index -= 1) {\n const event = events[index];\n if (event?.type === \"step.started\" && event.stepId === pendingWait.stepId) {\n return index;\n }\n }\n\n return undefined;\n}\n\nfunction stepStartedOrdinalBefore(\n events: readonly Event[],\n pendingWait: Event,\n): number | undefined {\n const waitIndex = events.indexOf(pendingWait);\n if (waitIndex === -1) {\n return undefined;\n }\n const count = events.slice(0, waitIndex).filter((event) => event.type === \"step.started\").length;\n return count > 0 ? count : undefined;\n}\n\nfunction readStepIndex(event: Event): number | undefined {\n const artifactStepId = readArtifactStepId(event);\n const prefix = artifactStepId?.match(/^(\\d+)-/u)?.[1];\n if (prefix === undefined) {\n return undefined;\n }\n\n const stepIndex = Number(prefix);\n return Number.isInteger(stepIndex) && stepIndex > 0 ? stepIndex : undefined;\n}\n\nfunction stepDirForIndex(runDir: string, event: Event, stepIndex: number): string {\n const artifactStepId =\n readArtifactStepId(event) ?? `${String(stepIndex).padStart(4, \"0\")}-${event.stepId ?? \"step\"}`;\n return join(runDir, \"steps\", artifactStepId);\n}\n\nfunction readArtifactStepId(event: Event): string | undefined {\n const artifactPaths = readWaitArtifactPaths(event);\n const path = artifactPaths?.requestFile ?? artifactPaths?.answerFile;\n return path?.match(/^steps\\/([^/]+)\\/waits\\//u)?.[1];\n}\n\nfunction readWaitArtifactPaths(\n event: Event,\n): { readonly requestFile: string; readonly answerFile: string } | undefined {\n const artifactPaths = event.payload.artifactPaths;\n if (!isPlainObject(artifactPaths)) {\n return undefined;\n }\n\n const requestFile = artifactPaths.requestFile;\n const answerFile = artifactPaths.answerFile;\n if (typeof requestFile !== \"string\" || typeof answerFile !== \"string\") {\n return undefined;\n }\n\n return { requestFile, answerFile };\n}\n\n/**\n * Build the event view `replayCompletedSteps` uses for a branch-scoped\n * resume. Other branches' step/wait terminal events are dropped so they can\n * never pair into this branch's replay walk (parallel branches may reuse the\n * same step ids), while their `step.started` events are kept with synthetic\n * step ids so the global `step.started` ordinal — and therefore each replayed\n * step's true step artifact index — is unchanged. Events without a branchId\n * (run-level or pre-split events) pass through untouched.\n */\nfunction branchScopedReplayEvents(events: readonly Event[], branchId: string): readonly Event[] {\n let foreignOrdinal = 0;\n const scoped: Event[] = [];\n for (const event of events) {\n const eventBranchId =\n typeof event.payload.branchId === \"string\" ? event.payload.branchId : undefined;\n if (eventBranchId === undefined || eventBranchId === branchId) {\n scoped.push(event);\n continue;\n }\n if (event.type === \"step.started\") {\n foreignOrdinal += 1;\n scoped.push({ ...event, stepId: `__foreign_branch_${foreignOrdinal}__` } as Event);\n }\n }\n return scoped;\n}\n\nfunction waitEventKey(event: Event): string | undefined {\n const artifactPaths = event.payload.artifactPaths;\n if (isPlainObject(artifactPaths) && typeof artifactPaths.answerFile === \"string\") {\n return artifactPaths.answerFile;\n }\n\n const waitId = readWaitId(event);\n return event.stepId && waitId ? `${event.stepId}:${waitId}` : undefined;\n}\n\nfunction readWaitId(event: Event): string | undefined {\n return typeof event.payload.waitId === \"string\" ? event.payload.waitId : undefined;\n}\n\nfunction readPlainPayload(event: Event, key: string): PlainObject | undefined {\n const value = event.payload[key];\n return isPlainObject(value) ? value : undefined;\n}\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\nfunction resumeFailure(code: string, message: string): Failure {\n return { code, message };\n}\n","import type { StepNode } from \"../../authoring/step/continuation.types.js\";\nimport type { Failure } from \"../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport { replayCompletedSteps } from \"../resume/replay-completed-steps/replay-completed-steps.js\";\nimport type { Event, RunWorkflowOptions } from \"../run-workflow/run-workflow.types.js\";\nimport { selectLatestUnresolvedFailure } from \"./latest-unresolved-failure.js\";\n\nexport async function replayToRetryFailure<\n TInput extends PlainObject,\n TOutput extends PlainObject,\n>(options: {\n readonly workflow: RunWorkflowOptions<TInput, TOutput>[\"workflow\"];\n readonly events: readonly Event[];\n readonly runDir: string;\n}): Promise<\n | {\n readonly status: \"success\";\n readonly input: PlainObject;\n readonly node: StepNode;\n readonly retriedStepId: string;\n readonly sourceFailureEventId: string;\n readonly sourceFailureReplayPosition: number;\n }\n | { readonly status: \"failure\"; readonly failure: Failure }\n> {\n const failure = selectLatestUnresolvedFailure(options.events);\n if (!failure) {\n return {\n status: \"failure\",\n failure: retryFailure(\n \"retry_target_not_failed\",\n \"Retry target has no latest unresolved failure.\",\n ),\n };\n }\n\n if (failure.workflowId !== options.workflow.id) {\n return {\n status: \"failure\",\n failure: retryFailure(\n \"retry_workflow_mismatch\",\n `Retry target workflow ${failure.workflowId} does not match ${options.workflow.id}.`,\n ),\n };\n }\n\n if (!failure.workflowInput) {\n return {\n status: \"failure\",\n failure: retryFailure(\"retry_target_not_found\", \"workflow.started payload is missing input.\"),\n };\n }\n\n if (!failure.stepId) {\n return {\n status: \"failure\",\n failure: retryFailure(\n \"retry_target_not_failed\",\n failure.event.type === \"workflow.failed\"\n ? \"Workflow failure has no associated step ID. This run may use unsupported historical retry metadata.\"\n : \"Failed retry target event has no step ID.\",\n ),\n };\n }\n\n const replay = await replayCompletedSteps({\n workflow: options.workflow,\n events: eventsBeforeRetryTarget(\n options.events,\n failure.replayPosition,\n failure.stepId,\n failure.event,\n ),\n input: failure.workflowInput,\n targetStepId: failure.stepId,\n runDir: options.runDir,\n });\n if (replay.status === \"failure\") {\n return replay;\n }\n\n const { node } = replay;\n if (node.onError) {\n return {\n status: \"failure\",\n failure: retryFailure(\n \"retry_unsupported_history\",\n `Retry does not support onError history for step ${node.config.id}.`,\n ),\n };\n }\n\n return {\n status: \"success\",\n input: failure.workflowInput,\n node,\n retriedStepId: failure.stepId,\n sourceFailureEventId: failure.sourceFailureEventId ?? failure.event.id,\n sourceFailureReplayPosition: failure.replayPosition,\n };\n}\n\nfunction eventsBeforeRetryTarget(\n events: readonly Event[],\n replayPosition: number,\n targetStepId: string,\n targetEvent: Event,\n): readonly Event[] {\n const eventsBeforeFailure = events.slice(0, replayPosition);\n const excludedPositions = new Set<number>();\n\n for (const event of eventsBeforeFailure) {\n if (event.type !== \"workflow.retryStarted\") {\n continue;\n }\n\n const resolvedPosition = readSourceFailureReplayPosition(event);\n if (resolvedPosition === undefined || resolvedPosition >= replayPosition) {\n continue;\n }\n\n for (const position of resolvedAttemptPositions(events, resolvedPosition)) {\n excludedPositions.add(position);\n }\n }\n\n if (targetEvent.type === \"step.started\") {\n return eventsBeforeFailure.filter(\n (event, index) => !excludedPositions.has(index) || shouldKeepResolvedAttemptEvent(event),\n );\n }\n\n let targetAttemptStartPosition = -1;\n for (let index = eventsBeforeFailure.length - 1; index >= 0; index -= 1) {\n const event = eventsBeforeFailure[index];\n if (excludedPositions.has(index)) {\n continue;\n }\n\n if (event?.type === \"step.started\" && event.stepId === targetStepId) {\n targetAttemptStartPosition = index;\n break;\n }\n }\n\n return eventsBeforeFailure.filter((event, index) => {\n if (excludedPositions.has(index) && !shouldKeepResolvedAttemptEvent(event)) {\n return false;\n }\n\n return (\n targetAttemptStartPosition === -1 ||\n index <= targetAttemptStartPosition ||\n event.type !== \"step.completed\" ||\n event.stepId !== targetStepId\n );\n });\n}\n\nfunction shouldKeepResolvedAttemptEvent(event: Event): boolean {\n // Replay must not consume completed outputs from a previously failed attempt,\n // but it still needs the attempt's start/terminal events so step artifact\n // ordinals remain aligned with the original event stream and failed starts are\n // paired off before later retried attempts with the same step id complete.\n return (\n event.type === \"step.started\" || event.type === \"step.failed\" || event.type === \"step.cancelled\"\n );\n}\n\nfunction readSourceFailureReplayPosition(event: Event): number | undefined {\n const { sourceFailureReplayPosition } = event.payload;\n return typeof sourceFailureReplayPosition === \"number\" ? sourceFailureReplayPosition : undefined;\n}\n\nfunction resolvedAttemptPositions(\n events: readonly Event[],\n resolvedPosition: number,\n): readonly number[] {\n const resolvedEvent = events[resolvedPosition];\n if (!resolvedEvent?.stepId) {\n return [resolvedPosition];\n }\n\n const attemptStartPosition = findAttemptStartPosition(\n events,\n resolvedPosition,\n resolvedEvent.stepId,\n );\n const startPosition = attemptStartPosition === -1 ? resolvedPosition : attemptStartPosition;\n const positions: number[] = [];\n for (let position = startPosition; position <= resolvedPosition; position += 1) {\n positions.push(position);\n }\n\n return positions;\n}\n\nfunction findAttemptStartPosition(\n events: readonly Event[],\n resolvedPosition: number,\n stepId: string,\n): number {\n for (let index = resolvedPosition; index >= 0; index -= 1) {\n const event = events[index];\n if (event?.type === \"step.started\" && event.stepId === stepId) {\n return index;\n }\n }\n\n return -1;\n}\n\nfunction retryFailure(code: string, message: string): Failure {\n return { code, message };\n}\n","import type { TrailStepConfig } from \"../../agent-targeting/targeting.types.js\";\nimport type { WorkflowAgentRole } from \"../../contracts/agents/agent-role.types.js\";\nimport type {\n RunContext,\n RunContextEvent,\n RunContextGlobalState,\n RunContextProviderWorkingRunner,\n RunContextState,\n RunContextWorkingAgentProcessRunner,\n} from \"../../contracts/run-context/run-context.types.js\";\nimport {\n type RunState,\n readGlobalState,\n readRunState,\n writeGlobalState,\n writeRunState,\n} from \"../artifacts/run-storage.js\";\n\nexport function createRunContext(options: {\n readonly runId: string;\n readonly runName: string;\n readonly runDir: string;\n readonly initialState?: RunState;\n readonly workflowId?: string;\n readonly workflowAgents?: Readonly<Record<string, WorkflowAgentRole>>;\n readonly projectCwd?: string;\n readonly cwd?: string;\n readonly executionCwd?: string;\n readonly trailstepConfig?: TrailStepConfig;\n readonly workingAgentProcessRunner?: RunContextWorkingAgentProcessRunner;\n readonly providerWorkingRunner?: RunContextProviderWorkingRunner;\n readonly emit?: (event: RunContextEvent) => Promise<void>;\n readonly events?: () => readonly RunContextEvent[];\n}): RunContext {\n const state = createQueuedRunState({\n read: () => readRunState(options.runDir),\n write: (nextState) => writeRunState(options.runDir, nextState),\n ...(options.initialState === undefined ? {} : { initialState: options.initialState }),\n });\n const globalState = createQueuedGlobalState({\n read: () => readGlobalState(options.runDir),\n write: (nextState) => writeGlobalState(options.runDir, nextState),\n });\n\n return {\n id: options.runId,\n name: options.runName,\n path: options.runDir,\n workflowId: options.workflowId,\n workflowAgents: options.workflowAgents,\n projectCwd: options.projectCwd,\n cwd: options.cwd,\n executionCwd: options.executionCwd ?? options.cwd,\n trailstepConfig: options.trailstepConfig,\n workingAgentProcessRunner: options.workingAgentProcessRunner,\n providerWorkingRunner: options.providerWorkingRunner,\n emit: options.emit,\n events: options.events,\n state,\n globalState,\n };\n}\n\nexport function createQueuedRunState(options: {\n readonly read: () => Promise<RunState>;\n readonly write: (state: RunState) => Promise<void>;\n readonly initialState?: RunState;\n}): RunContextState {\n let cache: RunState | undefined;\n let loadPromise: Promise<RunState> | undefined;\n let writeQueue: Promise<unknown> = Promise.resolve();\n\n function ensureLoaded(): Promise<RunState> {\n if (cache) return Promise.resolve(cache);\n if (options.initialState !== undefined) {\n cache = { ...options.initialState };\n return Promise.resolve(cache);\n }\n loadPromise ??= options.read().then((state) => (cache = state));\n return loadPromise;\n }\n\n function enqueueWrite(): Promise<void> {\n const next = writeQueue.then(async () => {\n const state = await ensureLoaded();\n await options.write(state);\n });\n writeQueue = next.catch(() => {});\n return next;\n }\n\n return {\n async get<T = unknown>(key: string): Promise<T | undefined> {\n const state = await ensureLoaded();\n return state[key] as T | undefined;\n },\n async getPersisted<T = unknown>(key: string): Promise<T | undefined> {\n const state = await options.read();\n return state[key] as T | undefined;\n },\n async hydratePersisted(): Promise<void> {\n const persisted = await options.read();\n const state = await ensureLoaded();\n cache = { ...state, ...persisted };\n },\n async set(\n key: string,\n value: unknown,\n options: { readonly persist?: boolean } = {},\n ): Promise<void> {\n const state = await ensureLoaded();\n state[key] = value;\n if (options.persist !== false) {\n await enqueueWrite();\n }\n },\n };\n}\n\nexport function createQueuedGlobalState(options: {\n readonly read: () => Promise<RunState>;\n readonly write: (state: RunState) => Promise<void>;\n}): RunContextGlobalState {\n let cache: RunState | undefined;\n let loadPromise: Promise<RunState> | undefined;\n let mutationQueue: Promise<unknown> = Promise.resolve();\n\n function ensureLoaded(): Promise<RunState> {\n if (cache) return Promise.resolve(cache);\n loadPromise ??= options.read().then((state) => (cache = state));\n return loadPromise;\n }\n\n function enqueueMutation<T>(mutation: (state: RunState) => Promise<T>): Promise<T> {\n const next = mutationQueue.then(async () => {\n const state = await ensureLoaded();\n return await mutation(state);\n });\n mutationQueue = next.catch(() => {});\n return next;\n }\n\n return {\n async get<T = unknown>(key: string): Promise<T | undefined> {\n const state = await mutationQueue.then(() => ensureLoaded());\n return state[key] as T | undefined;\n },\n async getPersisted<T = unknown>(key: string): Promise<T | undefined> {\n const state = await mutationQueue.then(() => options.read());\n return state[key] as T | undefined;\n },\n async hydratePersisted(): Promise<void> {\n await enqueueMutation(async (state) => {\n const persisted = await options.read();\n for (const [key, value] of Object.entries(persisted)) {\n state[key] = value;\n }\n });\n },\n async set(\n key: string,\n value: unknown,\n setOptions: { readonly persist?: boolean } = {},\n ): Promise<void> {\n await enqueueMutation(async (state) => {\n state[key] = value;\n if (setOptions.persist !== false) {\n await options.write(state);\n }\n });\n },\n async update<T = unknown>(\n key: string,\n updater: (current: T | undefined) => T | Promise<T>,\n ): Promise<T> {\n return await enqueueMutation(async (state) => {\n const updated = await updater(state[key] as T | undefined);\n state[key] = updated;\n await options.write(state);\n return updated;\n });\n },\n };\n}\n","import { basename } from \"node:path\";\n\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport { createRunDirectory, readRunEvents } from \"../artifacts/run-storage.js\";\nimport { resolveAndValidateRunCwds } from \"./cwd.js\";\nimport type { Event, RunWorkflowOptions } from \"./run-workflow.types.js\";\n\nexport async function initializeRun<TInput extends PlainObject, TOutput extends PlainObject>(\n options: RunWorkflowOptions<TInput, TOutput>,\n): Promise<{\n readonly runId: string;\n readonly runName: string;\n readonly runDir: string;\n readonly previousEvents: readonly Event[];\n}> {\n const existingRunDir =\n options.resume?.runDir ?? options.retry?.runDir ?? options.continue?.runDir;\n if (existingRunDir) {\n const previousEvents = await readRunEvents(existingRunDir);\n const startedEvent = previousEvents.find((event) => event.type === \"workflow.started\");\n return {\n runId: startedEvent?.runId ?? basename(existingRunDir),\n runName: startedEvent?.runId ?? basename(existingRunDir),\n runDir: existingRunDir,\n previousEvents,\n };\n }\n\n const { projectCwd } = await resolveAndValidateRunCwds(options);\n const runName = options.runName;\n if (runName === undefined) {\n throw new Error(\"Expected runName for a new workflow run.\");\n }\n const { runId, runDir } = await createRunDirectory({\n cwd: projectCwd,\n runName,\n runsRoot: options.runsRoot,\n });\n return { runId, runName, runDir, previousEvents: [] };\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { availableParallelism } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { TrailStepConfig } from \"../../agent-targeting/targeting.types.js\";\nimport type {\n ContinuationResult,\n ParallelFailurePolicy,\n ParallelOptions,\n} from \"../../authoring/step/continuation.types.js\";\nimport {\n isParallelNode,\n isStepNode,\n isWorkflowInvocationNode,\n} from \"../../authoring/step/step-node.js\";\nimport type { WorkflowAgentRole } from \"../../contracts/agents/agent-role.types.js\";\nimport type { Failure } from \"../../contracts/failures/failure.js\";\nimport type { PlainObject } from \"../../contracts/shapes/shape.types.js\";\nimport { readBranchRunState, writeBranchRunState } from \"../artifacts/run-storage.js\";\nimport { resolveStepArtifactPaths } from \"../artifacts/step-artifacts.js\";\nimport {\n type ResumeWaitOptions,\n type RunContinuationResult,\n runContinuation,\n type WaitingWait,\n} from \"../continuation/run-continuation/run-continuation.js\";\nimport { createQueuedRunState } from \"../run-context/create-run-context.js\";\nimport { runContextStorage } from \"../run-context/run-context-storage.js\";\nimport type { TimeoutPolicyInput } from \"../timeout/timeout-policy.js\";\nimport type {\n Event,\n RunWorkflowOptions,\n RunWorkflowTrackRetryOptions,\n} from \"./run-workflow.types.js\";\n\ninterface RunRootContinuationArraySchedulerOptions {\n readonly nodes: readonly ContinuationResult[];\n readonly rootIsArray?: boolean;\n readonly runId: string;\n readonly workflowId: string;\n readonly emit: (event: Event) => Promise<void>;\n readonly maxSteps: number;\n readonly initialSource: string;\n readonly workers?: number;\n readonly workflowAgents: Readonly<Record<string, WorkflowAgentRole>>;\n readonly workflowTimeout?: TimeoutPolicyInput;\n readonly runDir: string;\n readonly projectCwd?: string;\n readonly cwd: string;\n readonly trailstepConfig?: TrailStepConfig;\n readonly workingAgentProcessRunner?: RunWorkflowOptions[\"workingAgentProcessRunner\"];\n readonly providerWorkingRunner?: RunWorkflowOptions[\"providerWorkingRunner\"];\n readonly processRunner?: RunWorkflowOptions[\"processRunner\"];\n readonly retry?: {\n readonly initialExecutedSteps: number;\n readonly track?: RunWorkflowTrackRetryOptions;\n };\n readonly waitResumeBranches?: Readonly<Record<string, ResumeWaitOptions>>;\n}\n\ntype BranchStatus = \"queued\" | \"running\" | \"done\" | \"failed\" | \"waiting\" | \"cancelled\" | \"split\";\ntype TrackTerminalKind = \"absoluteDone\" | \"absoluteFail\" | \"failure\" | \"waiting\" | \"cancelled\";\ntype AbsoluteTerminalKind = \"absoluteDone\" | \"absoluteFail\";\n\ninterface TrackStateJson {\n readonly runId: string;\n readonly status: string;\n readonly workers: number;\n readonly failurePolicy: \"fail-fast\";\n readonly rootBranchId: string;\n readonly splitOccurred: boolean;\n readonly branches: readonly string[];\n readonly terminalBranchId?: string;\n readonly terminalKind?: TrackTerminalKind;\n readonly terminalOutput?: PlainObject;\n readonly failure?: Failure;\n}\n\ninterface BranchState {\n readonly branchId: string;\n readonly parentBranchId?: string;\n readonly requestedBranchId?: string;\n readonly joinContinuation?: boolean;\n pendingPostJoin?: boolean;\n readonly workflowId: string;\n readonly createdAt: string;\n status: BranchStatus;\n output?: PlainObject;\n failure?: Failure;\n wait?: WaitingWait;\n terminalKind?: AbsoluteTerminalKind;\n message?: string;\n source: string;\n splitSource?: string;\n updatedAt: string;\n latestStepIndex: number;\n latestStepId?: string;\n}\n\ninterface PendingJoin {\n readonly parentBranchId: string;\n readonly childBranchIds: readonly string[];\n readonly source: string;\n readonly failurePolicy: ParallelFailurePolicy;\n readonly postContinuation: (\n output: PlainObject,\n ) => ContinuationResult | Promise<ContinuationResult>;\n readonly afterPostContinuation?: (\n output: PlainObject,\n ) => ContinuationResult | Promise<ContinuationResult>;\n completed: Readonly<Record<string, PlainObject>>;\n}\n\ninterface BranchStateJson {\n readonly branchId: string;\n readonly parentBranchId?: string;\n readonly requestedBranchId?: string;\n readonly joinContinuation?: boolean;\n readonly pendingPostJoin?: boolean;\n readonly status: BranchStatus;\n readonly workflowId: string;\n readonly source: string;\n readonly splitSource?: string;\n readonly output: PlainObject;\n readonly failure?: Failure;\n readonly wait?: WaitingWait;\n readonly terminalKind?: AbsoluteTerminalKind;\n readonly message?: string;\n readonly createdAt: string;\n readonly updatedAt: string;\n readonly latestStepIndex: number;\n readonly latestStepId?: string;\n}\n\ninterface QueuedBranch {\n readonly node: ContinuationResult;\n readonly branch: BranchState;\n readonly source: string;\n readonly requireRunnableBranchCandidate: boolean;\n readonly parallelGroupId?: string;\n readonly parallelConcurrency?: number;\n readonly failurePolicy: ParallelFailurePolicy;\n}\n\nexport async function runRootContinuationArrayScheduler(\n options: RunRootContinuationArraySchedulerOptions,\n): Promise<RunContinuationResult> {\n const resolvedWorkers = resolveSchedulerWorkerCount(options.workers);\n if (!resolvedWorkers.ok) {\n return resolvedWorkers.failure;\n }\n\n const workers = resolvedWorkers.workers;\n const rootBranchId = \"root\";\n const branches: BranchState[] = [];\n const queue: QueuedBranch[] = [];\n let splitOccurred = options.rootIsArray === true;\n let nextStepIndex = options.retry?.initialExecutedSteps ?? 0;\n let nextBranchId = 1;\n let terminalResult: RunContinuationResult | undefined;\n let terminalBranchId: string | undefined;\n let terminalKind: TrackTerminalKind | undefined;\n const pendingJoins: PendingJoin[] = [];\n const activeByParallelGroup = new Map<string, number>();\n\n const allocateStepIndex = (branch: BranchState): number => {\n if (nextStepIndex >= options.maxSteps) {\n throw new Error(`workflow exceeded maxSteps guard (${options.maxSteps})`);\n }\n nextStepIndex += 1;\n branch.latestStepIndex = nextStepIndex;\n branch.updatedAt = new Date().toISOString();\n return nextStepIndex;\n };\n\n const allocateBranchId = (node: ContinuationResult): string => {\n const explicitBranchId = requestedBranchMetadata(node).requestedBranchId;\n if (explicitBranchId !== undefined) {\n return explicitBranchId;\n }\n\n const baseBranchId = branchIdBaseForNode(node);\n let suffix = 1;\n while (branches.some((branch) => branch.branchId === `${baseBranchId}-${suffix}`)) {\n suffix += 1;\n }\n nextBranchId = Math.max(nextBranchId, suffix + 1);\n return `${baseBranchId}-${suffix}`;\n };\n\n const enqueue = (\n node: ContinuationResult,\n parentBranchId: string | undefined,\n source: string,\n requireRunnableBranchCandidate: boolean,\n joinContinuation = false,\n scheduling?: {\n readonly parallelGroupId?: string;\n readonly parallelConcurrency?: number;\n readonly failurePolicy?: ParallelFailurePolicy;\n },\n ): BranchState => {\n const branch = createBranchRecord({\n node,\n parentBranchId,\n source,\n workflowId: workflowIdForBranchNode(node, options.workflowId),\n branchId:\n parentBranchId === undefined && branches.length === 0\n ? rootBranchId\n : allocateBranchId(node),\n joinContinuation,\n });\n branches.push(branch);\n if (terminalResult === undefined) {\n queue.push({\n node,\n branch,\n source,\n requireRunnableBranchCandidate,\n failurePolicy: scheduling?.failurePolicy ?? \"fail-fast\",\n ...(scheduling?.parallelGroupId === undefined\n ? {}\n : { parallelGroupId: scheduling.parallelGroupId }),\n ...(scheduling?.parallelConcurrency === undefined\n ? {}\n : { parallelConcurrency: scheduling.parallelConcurrency }),\n });\n } else {\n branch.status = \"cancelled\";\n branch.updatedAt = new Date().toISOString();\n }\n return branch;\n };\n\n const cancelQueuedAndPreventableBranches = async (preservedBranchId?: string): Promise<void> => {\n queue.length = 0;\n await cancelPreventableBranches(branches, options.runDir, preservedBranchId);\n };\n\n const terminalizeTrack = async (\n result: RunContinuationResult,\n terminal?: { readonly branchId: string; readonly kind: TrackTerminalKind },\n ): Promise<void> => {\n if (terminalResult === undefined) {\n terminalResult = result;\n terminalBranchId = terminal?.branchId;\n terminalKind = terminal?.kind;\n await cancelQueuedAndPreventableBranches(terminal?.branchId);\n }\n };\n\n if (options.retry !== undefined) {\n const retryPlan = await createPersistedTrackRetryPlan({\n nodes: options.nodes,\n runDir: options.runDir,\n workflowId: options.workflowId,\n initialSource: options.initialSource,\n track: options.retry.track,\n });\n if (retryPlan.status === \"failure\") {\n return retryPlan.failure;\n }\n branches.push(...retryPlan.branches);\n queue.push(...retryPlan.queue);\n splitOccurred = retryPlan.splitOccurred;\n nextBranchId = retryPlan.nextBranchId;\n } else if (options.rootIsArray === true) {\n if (!options.nodes.every(isRunnableBranchCandidate)) {\n return invalidArrayCandidateFailure(options.initialSource);\n }\n const duplicateBranchIdFailure = explicitDuplicateBranchIdFailure(\n options.nodes,\n options.initialSource,\n branches,\n );\n if (duplicateBranchIdFailure !== undefined) {\n return duplicateBranchIdFailure;\n }\n for (const node of options.nodes) {\n enqueue(node, rootBranchId, options.initialSource, true);\n }\n } else {\n const rootNode = options.nodes[0];\n if (rootNode === undefined) {\n return {\n status: \"failure\",\n failure: {\n code: \"invalid_continuation\",\n message: `${options.initialSource} returned an invalid continuation node.`,\n },\n };\n }\n enqueue(rootNode, undefined, options.initialSource, false);\n }\n\n await persistTrack(options, workers, rootBranchId, branches, \"running\", splitOccurred);\n\n let activeWorkers = 0;\n\n await new Promise<void>((resolve, reject) => {\n const schedule = (): void => {\n if (terminalResult !== undefined || queue.length === 0) {\n if (activeWorkers === 0) {\n resolve();\n }\n return;\n }\n\n while (terminalResult === undefined && activeWorkers < workers && queue.length > 0) {\n const queued = shiftRunnableQueuedBranch(queue, activeByParallelGroup);\n if (queued === undefined) {\n if (activeWorkers === 0) {\n resolve();\n }\n return;\n }\n activeWorkers += 1;\n incrementActiveParallelGroup(queued.parallelGroupId, activeByParallelGroup);\n\n void runBranch(queued)\n .then(async (branchResult) => {\n if (branchResult.status !== \"success\") {\n await terminalizeTrack(branchResult);\n }\n })\n .then(\n () => {\n activeWorkers -= 1;\n decrementActiveParallelGroup(queued.parallelGroupId, activeByParallelGroup);\n schedule();\n },\n (error: unknown) => {\n reject(error);\n },\n );\n }\n };\n\n schedule();\n });\n\n if (terminalResult !== undefined) {\n await cancelQueuedAndPreventableBranches(terminalBranchId);\n await Promise.all(branches.map((branch) => persistBranch(options.runDir, branch)));\n await persistTrack(\n options,\n workers,\n rootBranchId,\n branches,\n trackStatusFromTerminalResult(terminalResult),\n splitOccurred,\n terminalResult.status === \"failure\" || terminalResult.status === \"absoluteFailure\"\n ? terminalResult.failure\n : undefined,\n terminalBranchId,\n terminalKind,\n terminalResult.status === \"success\" || terminalResult.status === \"absoluteSuccess\"\n ? terminalResult.output\n : undefined,\n );\n return publicTerminalResult(terminalResult);\n }\n\n await Promise.all(branches.map((branch) => persistBranch(options.runDir, branch)));\n await persistTrack(options, workers, rootBranchId, branches, \"completed\", splitOccurred);\n\n const terminalBranches = branches.filter((branch) => isBranchTerminalStatus(branch.status));\n const joinContinuationBranch = [...terminalBranches]\n .reverse()\n .find((branch) => branch.joinContinuation === true && branch.status === \"done\");\n if (joinContinuationBranch !== undefined) {\n return {\n status: \"success\",\n output: joinContinuationBranch.output ?? {},\n ...(joinContinuationBranch.message === undefined\n ? {}\n : { message: joinContinuationBranch.message }),\n };\n }\n\n if (!splitOccurred && terminalBranches.length === 1 && terminalBranches[0]?.status === \"done\") {\n return {\n status: \"success\",\n output: terminalBranches[0].output ?? {},\n ...(terminalBranches[0].message === undefined\n ? {}\n : { message: terminalBranches[0].message }),\n };\n }\n\n return {\n status: \"success\",\n output: {\n status: \"completed\",\n branches: Object.fromEntries(\n terminalBranches.map((branch) => [branch.branchId, branchSettlementForSummary(branch)]),\n ),\n },\n };\n\n async function runWithBranchState<T>(branchId: string, fn: () => Promise<T>): Promise<T> {\n const parentContext = runContextStorage.getStore();\n if (!parentContext || (!splitOccurred && branchId === rootBranchId)) {\n return await fn();\n }\n\n const branchContext = {\n ...parentContext,\n state: createQueuedRunState({\n read: () => readBranchRunState(options.runDir, branchId),\n write: (nextState) => writeBranchRunState(options.runDir, branchId, nextState),\n }),\n };\n return await runContextStorage.run(branchContext, fn);\n }\n\n async function runBranch(queued: QueuedBranch): Promise<RunContinuationResult> {\n const { node, branch, source, requireRunnableBranchCandidate, failurePolicy } = queued;\n if (requireRunnableBranchCandidate && !isRunnableBranchCandidate(node)) {\n branch.status = \"failed\";\n branch.updatedAt = new Date().toISOString();\n await persistBranch(options.runDir, branch);\n return invalidArrayCandidateFailure(source);\n }\n\n branch.status = \"running\";\n branch.updatedAt = new Date().toISOString();\n await persistBranch(options.runDir, branch);\n\n const branchResult = await runWithBranchState(branch.branchId, async () =>\n runContinuation({\n node,\n runId: options.runId,\n workflowId: options.workflowId,\n emit: async (event) => {\n if (event.type === \"step.started\" && event.stepId !== undefined) {\n branch.latestStepId = event.stepId;\n }\n if (splitOccurred && event.type === \"step.started\" && event.stepId !== undefined) {\n const stepArtifacts = resolveStepArtifactPaths({\n runDir: options.runDir,\n stepId: event.stepId,\n stepIndex: branch.latestStepIndex,\n });\n await mkdir(stepArtifacts.stepDir, { recursive: true });\n }\n await options.emit(decorateBranchEvent(event, options.runId, branch, splitOccurred));\n },\n maxSteps: options.maxSteps,\n initialSource:\n !splitOccurred && branch.branchId === rootBranchId\n ? source\n : `${source} branch ${branch.branchId}`,\n allocateStepIndex: () => allocateStepIndex(branch),\n returnContinuationArrays: true,\n workflowAgents: options.workflowAgents,\n workflowTimeout: options.workflowTimeout,\n runDir: options.runDir,\n projectCwd: options.projectCwd,\n cwd: options.cwd,\n trailstepConfig: options.trailstepConfig,\n workingAgentProcessRunner: options.workingAgentProcessRunner,\n providerWorkingRunner: options.providerWorkingRunner,\n processRunner: options.processRunner,\n ...(options.waitResumeBranches?.[branch.branchId] === undefined\n ? {}\n : { resumeWait: options.waitResumeBranches[branch.branchId] }),\n }),\n );\n\n branch.updatedAt = new Date().toISOString();\n const branchResultWasSplit = branchResult.status === \"split\";\n if (terminalResult !== undefined) {\n if (!isBranchTerminalStatus(branch.status)) {\n branch.status = \"cancelled\";\n branch.updatedAt = new Date().toISOString();\n }\n await persistBranch(options.runDir, branch);\n return { status: \"cancelled\", cancellation: { requestedAt: branch.updatedAt } };\n }\n\n if (branchResult.status === \"absoluteSuccess\") {\n branch.status = \"done\";\n branch.output = branchResult.output;\n branch.message = branchResult.message;\n branch.terminalKind = \"absoluteDone\";\n await terminalizeTrack(branchResult, { branchId: branch.branchId, kind: \"absoluteDone\" });\n await persistBranch(options.runDir, branch);\n return branchResult;\n }\n\n if (branchResult.status === \"absoluteFailure\") {\n branch.status = \"failed\";\n branch.failure = branchResult.failure;\n branch.message = branchResult.message;\n branch.terminalKind = \"absoluteFail\";\n await terminalizeTrack(branchResult, { branchId: branch.branchId, kind: \"absoluteFail\" });\n await persistBranch(options.runDir, branch);\n return branchResult;\n }\n\n if (branchResult.status === \"failure\") {\n branch.status = \"failed\";\n branch.failure = branchResult.failure;\n branch.message = branchResult.message;\n if (failurePolicy === \"all-settled\") {\n await enqueueSatisfiedJoins(branch);\n await persistBranch(options.runDir, branch);\n await persistTrack(options, workers, rootBranchId, branches, \"running\", splitOccurred);\n return { status: \"success\", output: {} };\n }\n await terminalizeTrack(branchResult, { branchId: branch.branchId, kind: \"failure\" });\n await persistBranch(options.runDir, branch);\n return branchResult;\n }\n\n if (branchResult.status === \"waiting\") {\n branch.status = \"waiting\";\n branch.wait = branchResult.wait;\n await terminalizeTrack(branchResult, { branchId: branch.branchId, kind: \"waiting\" });\n await persistBranch(options.runDir, branch);\n return branchResult;\n }\n\n if (branchResult.status === \"cancelled\") {\n branch.status = \"cancelled\";\n await terminalizeTrack(branchResult, { branchId: branch.branchId, kind: \"cancelled\" });\n await persistBranch(options.runDir, branch);\n return branchResult;\n }\n\n if (branchResult.status === \"split\") {\n if (!branchResult.nodes.every(isRunnableBranchCandidate)) {\n branch.status = \"failed\";\n branch.failure = invalidArrayCandidateFailure(branchResult.source).failure;\n await persistBranch(options.runDir, branch);\n return invalidArrayCandidateFailure(branchResult.source);\n }\n const duplicateBranchIdFailure = explicitDuplicateBranchIdFailure(\n branchResult.nodes,\n branchResult.source,\n branches,\n );\n if (duplicateBranchIdFailure !== undefined) {\n branch.status = \"failed\";\n branch.failure = duplicateBranchIdFailure.failure;\n await persistBranch(options.runDir, branch);\n return duplicateBranchIdFailure;\n }\n splitOccurred = true;\n branch.status = \"split\";\n branch.splitSource = branchResult.source;\n if (branch.latestStepId !== undefined && branch.latestStepIndex > 0) {\n const stepArtifacts = resolveStepArtifactPaths({\n runDir: options.runDir,\n stepId: branch.latestStepId,\n stepIndex: branch.latestStepIndex,\n });\n await mkdir(stepArtifacts.stepDir, { recursive: true });\n }\n if (terminalResult !== undefined) {\n branch.status = \"cancelled\";\n branch.updatedAt = new Date().toISOString();\n await persistBranch(options.runDir, branch);\n return { status: \"cancelled\", cancellation: { requestedAt: branch.updatedAt } };\n }\n const parallelOptions = normalizeParallelOptions(branchResult.parallelOptions);\n const childBranches = branchResult.nodes.map((childNode) =>\n enqueue(childNode, branch.branchId, branchResult.source, true, false, {\n parallelGroupId: branch.branchId,\n ...(parallelOptions.concurrency === undefined\n ? {}\n : { parallelConcurrency: parallelOptions.concurrency }),\n failurePolicy: parallelOptions.failurePolicy,\n }),\n );\n if (branchResult.postContinuation !== undefined) {\n branch.pendingPostJoin = true;\n pendingJoins.push({\n parentBranchId: branch.branchId,\n childBranchIds: childBranches.map((childBranch) => childBranch.branchId),\n source: branchResult.source,\n failurePolicy: parallelOptions.failurePolicy,\n postContinuation: branchResult.postContinuation,\n ...(branchResult.afterPostContinuation === undefined\n ? {}\n : { afterPostContinuation: branchResult.afterPostContinuation }),\n completed: {},\n });\n }\n await Promise.all(\n branches.map((persistedBranch) => persistBranch(options.runDir, persistedBranch)),\n );\n } else if (branchResult.status === \"success\") {\n branch.status = \"done\";\n branch.output = branchResult.output;\n branch.message = branchResult.message;\n await enqueueSatisfiedJoins(branch);\n }\n await persistBranch(options.runDir, branch);\n await persistTrack(options, workers, rootBranchId, branches, \"running\", splitOccurred);\n return branchResultWasSplit ? { status: \"success\", output: {} } : branchResult;\n }\n\n async function enqueueSatisfiedJoins(branch: BranchState): Promise<void> {\n for (const join of pendingJoins) {\n if (!join.childBranchIds.includes(branch.branchId)) {\n continue;\n }\n const settlement = branchSettlementForJoin(branch, join.failurePolicy);\n if (settlement === undefined) {\n continue;\n }\n join.completed = { ...join.completed, [branch.branchId]: settlement };\n if (Object.keys(join.completed).length !== join.childBranchIds.length) {\n continue;\n }\n\n let nextNode: ContinuationResult;\n try {\n nextNode = await join.postContinuation({ status: \"completed\", branches: join.completed });\n } catch (error) {\n await terminalizeTrack({\n status: \"failure\",\n failure: {\n code: \"step_execution_failed\",\n message: `parallel post failed for ${join.source}: ${String(error)}`,\n },\n });\n continue;\n }\n const postBranch = enqueue(\n nextNode,\n join.parentBranchId,\n `post for ${join.source}`,\n false,\n true,\n );\n if (join.afterPostContinuation !== undefined) {\n const afterPostContinuation = join.afterPostContinuation;\n pendingJoins.push({\n parentBranchId: join.parentBranchId,\n childBranchIds: [postBranch.branchId],\n source: `post for ${join.source}`,\n failurePolicy: \"fail-fast\",\n postContinuation: async (aggregateOutput) => {\n const branches = aggregateOutput.branches as Record<string, PlainObject> | undefined;\n const [output] = Object.values(branches ?? {});\n return afterPostContinuation(output ?? {});\n },\n completed: {},\n });\n }\n }\n }\n}\n\nfunction createBranchRecord(input: {\n readonly node: ContinuationResult;\n readonly parentBranchId: string | undefined;\n readonly source: string;\n readonly workflowId: string;\n readonly branchId: string;\n readonly joinContinuation: boolean;\n}): BranchState {\n const now = new Date().toISOString();\n return {\n branchId: input.branchId,\n ...(input.parentBranchId === undefined ? {} : { parentBranchId: input.parentBranchId }),\n ...(input.joinContinuation ? { joinContinuation: true } : {}),\n ...requestedBranchMetadata(input.node),\n workflowId: input.workflowId,\n createdAt: now,\n updatedAt: now,\n status: \"queued\",\n source: input.source,\n latestStepIndex: 0,\n };\n}\n\nfunction workflowIdForBranchNode(node: ContinuationResult, fallbackWorkflowId: string): string {\n if (isWorkflowInvocationNode(node)) {\n return node.workflow.id;\n }\n\n return fallbackWorkflowId;\n}\n\nfunction requestedBranchMetadata(node: ContinuationResult): {\n readonly requestedBranchId?: string;\n} {\n if (isWorkflowInvocationNode(node) && node.options?.branchId !== undefined) {\n return { requestedBranchId: node.options.branchId };\n }\n if (isStepNode(node) && node.options?.branchId !== undefined) {\n return { requestedBranchId: node.options.branchId };\n }\n\n return {};\n}\n\nfunction branchIdBaseForNode(node: ContinuationResult): string {\n const rawId = isWorkflowInvocationNode(node)\n ? node.workflow.id\n : isStepNode(node)\n ? node.config.id\n : \"branch\";\n return rawId.replaceAll(/[^A-Za-z0-9._-]/g, \"-\") || \"branch\";\n}\n\nfunction explicitDuplicateBranchIdFailure(\n nodes: readonly ContinuationResult[],\n source: string,\n existingBranches: readonly BranchState[],\n): (RunContinuationResult & { readonly status: \"failure\" }) | undefined {\n const seen = new Set<string>(existingBranches.map((branch) => branch.branchId));\n for (const node of nodes) {\n const branchId = requestedBranchMetadata(node).requestedBranchId;\n if (branchId === undefined) {\n continue;\n }\n if (seen.has(branchId)) {\n return {\n status: \"failure\",\n failure: {\n code: \"duplicate_branch_id\",\n message: `${source} scheduled multiple parallel branches with branchId ${JSON.stringify(\n branchId,\n )}; explicit branchId values must be unique within a parallel track.`,\n },\n };\n }\n seen.add(branchId);\n }\n return undefined;\n}\n\nfunction isRunnableBranchCandidate(node: ContinuationResult): boolean {\n return isStepNode(node) || isWorkflowInvocationNode(node);\n}\n\nfunction invalidArrayCandidateFailure(\n source: string,\n): RunContinuationResult & { readonly status: \"failure\" } {\n return {\n status: \"failure\",\n failure: {\n code: \"invalid_continuation\",\n message: `${source} returned a continuation array containing non-runnable branch candidates; array candidates must be runnable step or workflow invocation nodes.`,\n },\n };\n}\n\nfunction isBranchTerminalStatus(status: BranchStatus): boolean {\n return status === \"done\" || status === \"failed\" || status === \"cancelled\";\n}\n\nfunction normalizeParallelOptions(options: ParallelOptions | undefined): {\n readonly concurrency?: number;\n readonly failurePolicy: ParallelFailurePolicy;\n} {\n const concurrency = options?.concurrency;\n return {\n ...(concurrency === undefined ? {} : { concurrency }),\n failurePolicy: options?.failurePolicy ?? \"fail-fast\",\n };\n}\n\nfunction shiftRunnableQueuedBranch(\n queue: QueuedBranch[],\n activeByParallelGroup: ReadonlyMap<string, number>,\n): QueuedBranch | undefined {\n const index = queue.findIndex((candidate) => {\n if (candidate.parallelGroupId === undefined || candidate.parallelConcurrency === undefined) {\n return true;\n }\n return (\n (activeByParallelGroup.get(candidate.parallelGroupId) ?? 0) < candidate.parallelConcurrency\n );\n });\n if (index < 0) {\n return undefined;\n }\n const [queued] = queue.splice(index, 1);\n return queued;\n}\n\nfunction incrementActiveParallelGroup(\n parallelGroupId: string | undefined,\n activeByParallelGroup: Map<string, number>,\n): void {\n if (parallelGroupId === undefined) {\n return;\n }\n activeByParallelGroup.set(parallelGroupId, (activeByParallelGroup.get(parallelGroupId) ?? 0) + 1);\n}\n\nfunction decrementActiveParallelGroup(\n parallelGroupId: string | undefined,\n activeByParallelGroup: Map<string, number>,\n): void {\n if (parallelGroupId === undefined) {\n return;\n }\n const next = (activeByParallelGroup.get(parallelGroupId) ?? 1) - 1;\n if (next <= 0) {\n activeByParallelGroup.delete(parallelGroupId);\n } else {\n activeByParallelGroup.set(parallelGroupId, next);\n }\n}\n\nfunction branchSettlementForJoin(\n branch: BranchState,\n failurePolicy: ParallelFailurePolicy,\n): PlainObject | undefined {\n if (failurePolicy === \"all-settled\") {\n return branchSettlementForSummary(branch);\n }\n return branch.status === \"done\" && branch.output !== undefined ? branch.output : undefined;\n}\n\nfunction branchSettlementForSummary(branch: BranchState): PlainObject {\n if (branch.status === \"failed\") {\n return {\n status: \"failed\",\n ...(branch.failure === undefined ? {} : { failure: branch.failure }),\n ...(branch.message === undefined ? {} : { message: branch.message }),\n };\n }\n\n return {\n status: branch.status,\n output: branch.output ?? {},\n ...(branch.message === undefined ? {} : { message: branch.message }),\n };\n}\n\nfunction trackStatusFromTerminalResult(result: RunContinuationResult): string {\n if (result.status === \"failure\" || result.status === \"absoluteFailure\") {\n return \"failed\";\n }\n if (result.status === \"absoluteSuccess\") {\n return \"completed\";\n }\n return result.status;\n}\n\nfunction publicTerminalResult(result: RunContinuationResult): RunContinuationResult {\n if (result.status === \"absoluteSuccess\") {\n return {\n status: \"success\",\n output: result.output,\n ...(result.message === undefined ? {} : { message: result.message }),\n };\n }\n\n if (result.status === \"absoluteFailure\") {\n return {\n status: \"failure\",\n failure: result.failure,\n ...(result.message === undefined ? {} : { message: result.message }),\n };\n }\n\n return result;\n}\n\nasync function cancelPreventableBranches(\n branches: readonly BranchState[],\n runDir: string,\n preservedBranchId?: string,\n): Promise<void> {\n const now = new Date().toISOString();\n await Promise.all(\n branches.map((branch) => {\n if (branch.branchId !== preservedBranchId && !isBranchTerminalStatus(branch.status)) {\n branch.status = \"cancelled\";\n branch.updatedAt = now;\n }\n return persistBranch(runDir, branch);\n }),\n );\n}\n\nfunction resolveSchedulerWorkerCount(\n workers: number | undefined,\n):\n | { readonly ok: true; readonly workers: number }\n | { readonly ok: false; readonly failure: RunContinuationResult } {\n if (workers === undefined) {\n return {\n ok: true,\n workers: Math.max(1, Math.floor(availableParallelism() / 2)),\n };\n }\n\n if (!Number.isFinite(workers) || !Number.isInteger(workers) || workers < 1) {\n return {\n ok: false,\n failure: {\n status: \"failure\",\n failure: {\n code: \"invalid_scheduler_workers\",\n message: \"scheduler.workers must be an integer greater than or equal to 1.\",\n },\n },\n };\n }\n\n return { ok: true, workers };\n}\n\nfunction decorateBranchEvent(\n event: Event,\n trackId: string,\n branch: BranchState,\n decorateWaits: boolean,\n): Event {\n const isStepEvent = event.type === \"step.started\" || event.type === \"step.completed\";\n const isWaitEvent =\n event.type === \"wait.started\" ||\n event.type === \"wait.satisfied\" ||\n event.type === \"wait.failed\";\n if ((!isStepEvent && !isWaitEvent) || (isWaitEvent && !decorateWaits)) {\n return event;\n }\n\n const stepArtifactPaths =\n event.stepId === undefined || branch.latestStepIndex < 1\n ? undefined\n : resolveStepArtifactPaths({\n runDir: \"\",\n stepId: event.stepId,\n stepIndex: branch.latestStepIndex,\n });\n\n return {\n ...event,\n payload: {\n ...event.payload,\n trackId,\n branchId: branch.branchId,\n ...(branch.requestedBranchId === undefined\n ? {}\n : { requestedBranchId: branch.requestedBranchId }),\n ...(stepArtifactPaths === undefined\n ? {}\n : {\n stepIndex: branch.latestStepIndex,\n stepArtifactId: stepArtifactPaths.artifactStepId,\n stepArtifactPath: stepArtifactPaths.runRelativeStepDir,\n }),\n },\n };\n}\n\nasync function createPersistedTrackRetryPlan(input: {\n readonly nodes: readonly ContinuationResult[];\n readonly runDir: string;\n readonly workflowId: string;\n readonly initialSource: string;\n readonly track?: RunWorkflowTrackRetryOptions;\n}): Promise<\n | {\n readonly status: \"success\";\n readonly branches: readonly BranchState[];\n readonly queue: readonly QueuedBranch[];\n readonly splitOccurred: boolean;\n readonly nextBranchId: number;\n }\n | { readonly status: \"failure\"; readonly failure: RunContinuationResult }\n> {\n let track: TrackStateJson;\n try {\n track = JSON.parse(await readFile(join(input.runDir, \"track.json\"), \"utf8\")) as TrackStateJson;\n } catch (error) {\n return {\n status: \"failure\",\n failure: {\n status: \"failure\",\n failure: {\n code: \"retry_track_metadata_unreadable\",\n message: `Retry target track metadata is missing or unreadable: ${error instanceof Error ? error.message : String(error)}`,\n },\n },\n };\n }\n\n const retryRootParallelNode =\n input.nodes.length === 1 && isParallelNode(input.nodes[0]) ? input.nodes[0] : undefined;\n const retryCandidateNodes = retryRootParallelNode?.nodes ?? input.nodes;\n if (retryRootParallelNode?.postContinuation !== undefined) {\n return { status: \"failure\", failure: unsupportedPostJoinRetryFailure() };\n }\n\n if (!retryCandidateNodes.every(isRunnableBranchCandidate)) {\n return { status: \"failure\", failure: invalidArrayCandidateFailure(input.initialSource) };\n }\n\n const branches = await Promise.all(\n track.branches.map(async (branchId) =>\n branchFromJson(\n JSON.parse(\n await readFile(join(input.runDir, \"branches\", `${branchId}.json`), \"utf8\"),\n ) as BranchStateJson,\n ),\n ),\n );\n if (\n branches.some((branch) => branch.joinContinuation === true || branch.pendingPostJoin === true)\n ) {\n return { status: \"failure\", failure: unsupportedPostJoinRetryFailure() };\n }\n\n const nodesByRequestedBranchId = new Map<string, ContinuationResult>();\n for (const node of retryCandidateNodes) {\n const requestedBranchId = requestedBranchMetadata(node).requestedBranchId;\n if (requestedBranchId !== undefined) {\n nodesByRequestedBranchId.set(requestedBranchId, node);\n }\n }\n\n const selection = selectPersistedBranchesForRetry(branches, input.track);\n if (selection.status === \"failure\") {\n return selection;\n }\n\n const queue: QueuedBranch[] = [];\n for (const [index, branch] of branches.entries()) {\n if (!selection.branchIds.has(branch.branchId)) {\n continue;\n }\n if (retryRootParallelNode !== undefined && branch.branchId === track.rootBranchId) {\n continue;\n }\n\n if (branch.status === \"split\") {\n return {\n status: \"failure\",\n failure: {\n status: \"failure\",\n failure: {\n code: \"retry_track_split_branch_unsupported\",\n message: `Retrying split parent branch ${branch.branchId} is not supported; retry a failed child branch or restart the workflow instead.`,\n },\n },\n };\n }\n\n branch.status = \"queued\";\n branch.failure = undefined;\n branch.terminalKind = undefined;\n branch.message = undefined;\n branch.updatedAt = new Date().toISOString();\n if ((input.track as { mode?: unknown })?.mode !== \"wait-answered\") {\n branch.wait = undefined;\n }\n const rootParallelBranchIndex =\n retryRootParallelNode === undefined\n ? undefined\n : branches\n .filter((candidate) => candidate.parentBranchId === track.rootBranchId)\n .findIndex((candidate) => candidate.branchId === branch.branchId);\n const node =\n (branch.requestedBranchId === undefined\n ? undefined\n : nodesByRequestedBranchId.get(branch.requestedBranchId)) ??\n (rootParallelBranchIndex === undefined || rootParallelBranchIndex < 0\n ? retryCandidateNodes[index]\n : retryCandidateNodes[rootParallelBranchIndex]);\n if (node === undefined) {\n return {\n status: \"failure\",\n failure: {\n status: \"failure\",\n failure: {\n code: \"retry_track_branch_not_found\",\n message: `Retry target branch ${branch.branchId} no longer has a matching workflow branch candidate.`,\n },\n },\n };\n }\n queue.push({\n node,\n branch,\n source: branch.splitSource ?? branch.source ?? input.initialSource,\n requireRunnableBranchCandidate: true,\n failurePolicy: \"fail-fast\",\n });\n }\n\n const maxNumericBranchId = branches.reduce((max, branch) => {\n const match = /^branch-(\\d+)$/.exec(branch.branchId);\n return match ? Math.max(max, Number(match[1])) : max;\n }, 0);\n\n return {\n status: \"success\",\n branches,\n queue,\n splitOccurred: track.splitOccurred,\n nextBranchId: maxNumericBranchId + 1,\n };\n}\n\nfunction unsupportedPostJoinRetryFailure(): RunContinuationResult {\n return {\n status: \"failure\",\n failure: {\n code: \"retry_parallel_post_join_unsupported\",\n message:\n \"Retrying parallel tracks with pending or completed parallel .post joins is not yet supported; restart the workflow instead.\",\n },\n };\n}\n\nfunction selectPersistedBranchesForRetry(\n branches: readonly BranchState[],\n track: RunWorkflowTrackRetryOptions | undefined,\n):\n | { readonly status: \"success\"; readonly branchIds: ReadonlySet<string> }\n | { readonly status: \"failure\"; readonly failure: RunContinuationResult } {\n if (track === undefined) {\n return {\n status: \"success\",\n branchIds: new Set(\n branches\n .filter((branch) => [\"failed\", \"waiting\", \"cancelled\"].includes(branch.status))\n .map((branch) => branch.branchId),\n ),\n };\n }\n\n if (track.mode === \"failed-only\") {\n if ((track as { readonly branchId?: unknown }).branchId !== undefined) {\n return {\n status: \"failure\",\n failure: {\n status: \"failure\",\n failure: {\n code: \"retry_track_filter_unsupported\",\n message: \"Track failed-only retry cannot also specify a branchId.\",\n },\n },\n };\n }\n\n return {\n status: \"success\",\n branchIds: new Set(\n branches.filter((branch) => branch.status === \"failed\").map((branch) => branch.branchId),\n ),\n };\n }\n\n if (track.mode === \"wait-answered\") {\n return {\n status: \"success\",\n branchIds: new Set(\n branches\n .filter(\n (branch) =>\n branch.status === \"waiting\" &&\n branch.wait !== undefined &&\n typeof branch.wait === \"object\" &&\n typeof (branch.wait as { readonly artifactPaths?: { readonly answerFile?: unknown } })\n .artifactPaths?.answerFile === \"string\",\n )\n .map((branch) => branch.branchId),\n ),\n };\n }\n\n if (track.mode !== \"branch\") {\n return {\n status: \"failure\",\n failure: {\n status: \"failure\",\n failure: {\n code: \"retry_track_filter_unsupported\",\n message: `Unsupported track retry mode: ${String((track as { readonly mode?: unknown }).mode)}.`,\n },\n },\n };\n }\n\n if (typeof track.branchId !== \"string\" || track.branchId.length === 0) {\n return {\n status: \"failure\",\n failure: {\n status: \"failure\",\n failure: {\n code: \"retry_track_branch_required\",\n message: \"Track branch retry requires a persisted branchId.\",\n },\n },\n };\n }\n\n const branch = branches.find((candidate) => candidate.branchId === track.branchId);\n if (branch === undefined) {\n return {\n status: \"failure\",\n failure: {\n status: \"failure\",\n failure: {\n code: \"retry_track_branch_not_found\",\n message: `Retry target branch ${track.branchId} was not found in persisted track metadata.`,\n },\n },\n };\n }\n\n return { status: \"success\", branchIds: new Set([branch.branchId]) };\n}\n\nfunction branchFromJson(json: BranchStateJson): BranchState {\n return {\n branchId: json.branchId,\n ...(json.parentBranchId === undefined ? {} : { parentBranchId: json.parentBranchId }),\n ...(json.requestedBranchId === undefined ? {} : { requestedBranchId: json.requestedBranchId }),\n ...(json.joinContinuation === undefined ? {} : { joinContinuation: json.joinContinuation }),\n ...(json.pendingPostJoin === undefined ? {} : { pendingPostJoin: json.pendingPostJoin }),\n workflowId: json.workflowId,\n createdAt: json.createdAt,\n updatedAt: json.updatedAt,\n status: json.status,\n source: json.source,\n ...(json.splitSource === undefined ? {} : { splitSource: json.splitSource }),\n output: json.output,\n ...(json.failure === undefined ? {} : { failure: json.failure }),\n ...(json.wait === undefined ? {} : { wait: json.wait }),\n ...(json.terminalKind === undefined ? {} : { terminalKind: json.terminalKind }),\n ...(json.message === undefined ? {} : { message: json.message }),\n latestStepIndex: json.latestStepIndex,\n ...(json.latestStepId === undefined ? {} : { latestStepId: json.latestStepId }),\n };\n}\n\nasync function persistTrack(\n options: RunRootContinuationArraySchedulerOptions,\n workers: number,\n rootBranchId: string,\n branches: readonly BranchState[],\n status: string,\n splitOccurred: boolean,\n failure?: Failure,\n terminalBranchId?: string,\n terminalKind?: TrackTerminalKind,\n terminalOutput?: PlainObject,\n): Promise<void> {\n const trackState: TrackStateJson = {\n runId: options.runId,\n status,\n workers,\n failurePolicy: \"fail-fast\",\n rootBranchId,\n splitOccurred,\n branches: branches.map((branch) => branch.branchId),\n ...(terminalBranchId === undefined ? {} : { terminalBranchId }),\n ...(terminalKind === undefined ? {} : { terminalKind }),\n ...(terminalOutput === undefined ? {} : { terminalOutput }),\n ...(failure === undefined ? {} : { failure }),\n };\n await writeJson(join(options.runDir, \"track.json\"), trackState);\n}\n\nasync function persistBranch(runDir: string, branch: BranchState): Promise<void> {\n const branchState: BranchStateJson = {\n branchId: branch.branchId,\n ...(branch.parentBranchId === undefined ? {} : { parentBranchId: branch.parentBranchId }),\n ...(branch.requestedBranchId === undefined\n ? {}\n : { requestedBranchId: branch.requestedBranchId }),\n ...(branch.joinContinuation === undefined ? {} : { joinContinuation: branch.joinContinuation }),\n ...(branch.pendingPostJoin === undefined ? {} : { pendingPostJoin: branch.pendingPostJoin }),\n status: branch.status,\n workflowId: branch.workflowId,\n source: branch.source,\n ...(branch.splitSource === undefined ? {} : { splitSource: branch.splitSource }),\n output: branch.output ?? {},\n ...(branch.failure === undefined ? {} : { failure: branch.failure }),\n ...(branch.wait === undefined ? {} : { wait: branch.wait }),\n ...(branch.terminalKind === undefined ? {} : { terminalKind: branch.terminalKind }),\n ...(branch.message === undefined ? {} : { message: branch.message }),\n createdAt: branch.createdAt,\n updatedAt: branch.updatedAt,\n latestStepIndex: branch.latestStepIndex,\n ...(branch.latestStepId === undefined ? {} : { latestStepId: branch.latestStepId }),\n };\n await writeJson(join(runDir, \"branches\", `${branch.branchId}.json`), branchState);\n}\n\nasync function writeJson(path: string, value: unknown): Promise<void> {\n await mkdir(join(path, \"..\"), { recursive: true });\n await writeFile(path, `${JSON.stringify(value, null, 2)}\\n`, \"utf8\");\n}\n","import {\n isParsedTrailStepConfig,\n parseTrailStepConfig,\n} from \"../../agent-targeting/parse-trailstep-config/parse-trailstep-config.js\";\nimport type { TrailStepConfig } from \"../../agent-targeting/targeting.types.js\";\nimport type { RunWorkflowOptions } from \"./run-workflow.types.js\";\n\nexport function parseTrailStepConfigInput(\n value: RunWorkflowOptions[\"trailstepConfig\"],\n): TrailStepConfig {\n if (isParsedTrailStepConfig(value) || isFlattenedTrailStepConfig(value)) {\n return value;\n }\n\n return parseTrailStepConfig(value);\n}\n\nfunction isFlattenedTrailStepConfig(\n value: RunWorkflowOptions[\"trailstepConfig\"],\n): value is TrailStepConfig {\n if (!isPlainRecord(value) || value.version !== 1) {\n return false;\n }\n\n if (!isPlainRecord(value.customProviders) || !isFlattenedAgentMappings(value.agents)) {\n return false;\n }\n\n if (value.settings !== undefined && !isFlattenedSettings(value.settings)) {\n return false;\n }\n\n if (value.workflows === undefined) {\n return true;\n }\n\n if (!isPlainRecord(value.workflows)) {\n return false;\n }\n\n return Object.values(value.workflows).every(\n (workflow) =>\n isPlainRecord(workflow) &&\n (workflow.agents === undefined || isFlattenedAgentMappings(workflow.agents)) &&\n (workflow.settings === undefined || isFlattenedSettings(workflow.settings)),\n );\n}\n\nfunction isFlattenedSettings(value: unknown): value is NonNullable<TrailStepConfig[\"settings\"]> {\n return (\n isPlainRecord(value) &&\n (value.retry === undefined || isPlainRecord(value.retry)) &&\n (value.timeout === undefined || typeof value.timeout === \"number\")\n );\n}\n\nfunction isFlattenedAgentMappings(value: unknown): value is TrailStepConfig[\"agents\"] {\n return (\n isPlainRecord(value) &&\n Object.values(value).every(\n (targets) => Array.isArray(targets) && targets.every(isFlattenedAgentTarget),\n )\n );\n}\n\nfunction isFlattenedAgentTarget(\n value: unknown,\n): value is TrailStepConfig[\"agents\"][string][number] {\n if (!isPlainRecord(value) || typeof value.provider !== \"string\") {\n return false;\n }\n\n if (value.model !== undefined) {\n return typeof value.model === \"string\" && value.model.trim().length > 0;\n }\n\n return true;\n}\n\nfunction isPlainRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":["dirname","args","promptInjectionMode","dirname","result","resolve","workflow","THINKING_LEVELS","optionalNonEmptyString","THINKING_LEVELS","mkdir","readdir","readFile","writeFile","basename","dirname","join","mkdir","readFile","writeFile","dirname","join","join","mkdir","isNodeError","readFile","mkdir","join","writeFile","readFile","isNodeError","state","dirname","readFile","join","readFile","join","isPlainObject","isNodeError","isNodeError","join","readFile","join","dirname","mkdir","writeFile","readFile","readdir","isNodeError","value","basename","workflow","workflow","targets","join","isPlainObject","formatDiagnostics","isPlainObject","mkdir","writeFile","join","readFile","join","spawn","mkdir","writeFile","dirname","readFile","formatDiagnostics","readFile","definedProcessEnv","args","mkdir","dirname","writeFile","spawnInteractiveProcess","resolve","spawn","terminateChildProcessTree","mkdir","writeFile","join","join","rm","readFile","readFile","spawn","resolve","terminateChildProcessTree","randomUUID","readFile","writeFile","isPlainObject","isPlainObject","optionalNonEmptyString","step","randomUUID","writeFile","readFile","isRecord","rm","mkdir","writeFile","readFile","join","relative","isPlainObject","isPlainObject","mkdir","writeFile","join","workflow","isPlainObject","mkdir","readFile","writeFile","join","isNodeError","isPlainObject","readFile","basename","join","mkdir","readFile","writeFile","join","stat","firstConfiguredPolicy","errorMessage","nextNode","isPlainObject","mkdir","writeFile","artifactPaths","join","readFile","isNodeError","readPlainPayload","promptPhase","withWaitsDoContext","isPlainObject","readPlainPayload","promptPhase","isPlainObject","resumeFailure","readPlainPayload","isPlainObject","readFile","join","resumeFailure","readPlainPayload","readFile","join","isPlainObject","state","globalState","options","basename","basename","mkdir","readFile","writeFile","join","resolve","mkdir","join","branches","readFile","branch","writeFile","workflow","basename","readFile","join"]}