tubeless 0.3.2 → 0.3.3
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/agent/default-tool-files.js +58 -38
- package/dist/agent/default-tool-files.js.map +1 -1
- package/dist/core/child-execution.js +1 -1
- package/dist/core/child-execution.js.map +1 -1
- package/dist/core/lifecycle.js +19 -7
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/pipeline-diagnostics.d.ts +14 -1
- package/dist/core/pipeline-diagnostics.js +39 -0
- package/dist/core/pipeline-diagnostics.js.map +1 -1
- package/dist/core/pipeline-finalizer.js +2 -1
- package/dist/core/pipeline-finalizer.js.map +1 -1
- package/dist/core/pipeline-step-builders.d.ts +63 -0
- package/dist/core/pipeline-step-builders.js +140 -0
- package/dist/core/pipeline-step-builders.js.map +1 -0
- package/dist/core/pipeline-step-types.d.ts +160 -0
- package/dist/core/pipeline-step-types.js +2 -0
- package/dist/core/pipeline-step-types.js.map +1 -0
- package/dist/core/pipeline-steps.d.ts +9 -164
- package/dist/core/pipeline-steps.js +8 -137
- package/dist/core/pipeline-steps.js.map +1 -1
- package/dist/core/step-log-scope.d.ts +12 -0
- package/dist/core/step-log-scope.js +14 -0
- package/dist/core/step-log-scope.js.map +1 -0
- package/dist/reporter/interactive-reporter.js +126 -18
- package/dist/reporter/interactive-reporter.js.map +1 -1
- package/dist/reporter/live-ticker-frame.d.ts +10 -2
- package/dist/reporter/live-ticker-frame.js +49 -28
- package/dist/reporter/live-ticker-frame.js.map +1 -1
- package/dist/reporter/live-ticker-worker.js +3 -5
- package/dist/reporter/live-ticker-worker.js.map +1 -1
- package/dist/reporter/live-ticker.js +3 -4
- package/dist/reporter/live-ticker.js.map +1 -1
- package/dist/studio/run-store-ui-client-browser.js +4 -4
- package/dist/studio/run-store-ui-client.d.ts +0 -53
- package/dist/studio/run-store-ui-client.js +5 -393
- package/dist/studio/run-store-ui-client.js.map +1 -1
- package/dist/studio/run-store-ui-common.d.ts +7 -0
- package/dist/studio/run-store-ui-common.js +11 -0
- package/dist/studio/run-store-ui-common.js.map +1 -0
- package/dist/studio/run-store-ui-launch.d.ts +27 -0
- package/dist/studio/run-store-ui-launch.js +230 -0
- package/dist/studio/run-store-ui-launch.js.map +1 -0
- package/dist/studio/run-store-ui-pipelines.d.ts +9 -0
- package/dist/studio/run-store-ui-pipelines.js +93 -0
- package/dist/studio/run-store-ui-pipelines.js.map +1 -0
- package/dist/studio/run-store-ui-runs.d.ts +29 -0
- package/dist/studio/run-store-ui-runs.js +74 -0
- package/dist/studio/run-store-ui-runs.js.map +1 -0
- package/dist/utilities/cache-key.js +2 -14
- package/dist/utilities/cache-key.js.map +1 -1
- package/dist/workbench/workbench-command-execution.js +2 -1
- package/dist/workbench/workbench-command-execution.js.map +1 -1
- package/dist/workbench/workbench-commands.js +7 -28
- package/dist/workbench/workbench-commands.js.map +1 -1
- package/dist/workbench/workbench-history.js +8 -16
- package/dist/workbench/workbench-history.js.map +1 -1
- package/dist/workbench/workbench-run.js +27 -39
- package/dist/workbench/workbench-run.js.map +1 -1
- package/dist/workbench/workbench-subcommand.d.ts +67 -0
- package/dist/workbench/workbench-subcommand.js +28 -0
- package/dist/workbench/workbench-subcommand.js.map +1 -1
- package/dist/workbench/workbench-ui.js +13 -17
- package/dist/workbench/workbench-ui.js.map +1 -1
- package/docs/agent-guide.md +188 -143
- package/docs/agents.md +3 -1
- package/docs/api-reference.md +12 -12
- package/docs/api-report.json +5 -5
- package/docs/child-pipeline-composition.md +2 -1
- package/docs/cli.md +28 -2
- package/docs/studio.md +3 -1
- package/package.json +4 -4
|
@@ -116,54 +116,74 @@ async function writeDestination(path, signal) {
|
|
|
116
116
|
path = isAbsolute(target) ? target : `${dirname(path)}${sep}${target}`;
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
119
|
+
// Serialize writes per file within this process so concurrent edits in one tool batch
|
|
120
|
+
// cannot read the same original text and silently overwrite each other.
|
|
121
|
+
const pathLocks = new Map();
|
|
122
|
+
async function withPathLock(path, work) {
|
|
123
|
+
const key = await realpath(path).catch(() => path);
|
|
124
|
+
const previous = pathLocks.get(key) ?? Promise.resolve();
|
|
125
|
+
const current = previous.then(work);
|
|
126
|
+
const settled = current.then(() => undefined, () => undefined);
|
|
127
|
+
pathLocks.set(key, settled);
|
|
128
|
+
try {
|
|
129
|
+
return await current;
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
if (pathLocks.get(key) === settled)
|
|
133
|
+
pathLocks.delete(key);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async function writeContent(path, content, context) {
|
|
137
|
+
const bytes = Buffer.byteLength(content);
|
|
138
|
+
if (bytes > MAX_FILE_BYTES)
|
|
139
|
+
throw new ToolError("FILE_TOO_LARGE", "Content exceeds 1 MiB");
|
|
140
|
+
const { destination, info } = await writeDestination(path, context.signal);
|
|
141
|
+
if (info && !info.isFile())
|
|
142
|
+
throw new ToolError("NOT_FILE", "Expected a regular file");
|
|
143
|
+
if (info)
|
|
144
|
+
await access(destination, constants.W_OK);
|
|
145
|
+
const staging = await mkdtemp(join(dirname(destination), ".tubeless-write-"));
|
|
146
|
+
try {
|
|
147
|
+
const temporary = join(staging, "content");
|
|
148
|
+
const file = await open(temporary, "wx", info ? info.mode & 0o7777 : 0o666);
|
|
131
149
|
try {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
await file.chown(info.uid, info.gid);
|
|
138
|
-
// Creation and ownership changes can alter mode bits; restore them last.
|
|
139
|
-
await file.chmod(info.mode & 0o7777);
|
|
140
|
-
}
|
|
150
|
+
await file.writeFile(content, { encoding: "utf8", signal: context.signal });
|
|
151
|
+
if (info) {
|
|
152
|
+
await file.chown(info.uid, info.gid);
|
|
153
|
+
// Creation and ownership changes can alter mode bits; restore them last.
|
|
154
|
+
await file.chmod(info.mode & 0o7777);
|
|
141
155
|
}
|
|
142
|
-
finally {
|
|
143
|
-
await file.close();
|
|
144
|
-
}
|
|
145
|
-
throwIfAborted(context.signal, "Write file");
|
|
146
|
-
await rename(temporary, destination);
|
|
147
156
|
}
|
|
148
157
|
finally {
|
|
149
|
-
await
|
|
158
|
+
await file.close();
|
|
150
159
|
}
|
|
151
|
-
|
|
160
|
+
throwIfAborted(context.signal, "Write file");
|
|
161
|
+
await rename(temporary, destination);
|
|
162
|
+
}
|
|
163
|
+
finally {
|
|
164
|
+
await rm(staging, { recursive: true, force: true });
|
|
165
|
+
}
|
|
166
|
+
return { path, bytes };
|
|
167
|
+
}
|
|
168
|
+
export async function writeTool(input, context) {
|
|
169
|
+
return fileOperation(context, async () => {
|
|
170
|
+
const path = resolve(context.cwd, input.path);
|
|
171
|
+
return withPathLock(path, () => writeContent(path, input.content, context));
|
|
152
172
|
});
|
|
153
173
|
}
|
|
154
174
|
export async function editTool(input, context) {
|
|
155
175
|
return fileOperation(context, async () => {
|
|
156
176
|
const path = resolve(context.cwd, input.path);
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
}
|
|
177
|
+
return withPathLock(path, async () => {
|
|
178
|
+
const text = await readText(path, context.signal);
|
|
179
|
+
const index = text.indexOf(input.oldText);
|
|
180
|
+
if (index < 0)
|
|
181
|
+
throw new ToolError("EDIT_NOT_FOUND", "oldText does not occur in the file");
|
|
182
|
+
if (text.indexOf(input.oldText, index + 1) >= 0)
|
|
183
|
+
throw new ToolError("EDIT_AMBIGUOUS", "oldText occurs more than once; include more context");
|
|
184
|
+
const content = text.slice(0, index) + input.newText + text.slice(index + input.oldText.length);
|
|
185
|
+
return writeContent(path, content, context);
|
|
186
|
+
});
|
|
167
187
|
});
|
|
168
188
|
}
|
|
169
189
|
export async function listTool(input, context) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-tool-files.js","sourceRoot":"","sources":["../../src/agent/default-tool-files.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n access,\n lstat,\n mkdir,\n mkdtemp,\n open,\n readdir,\n readlink,\n realpath,\n rename,\n rm,\n stat,\n} from \"node:fs/promises\";\nimport { constants } from \"node:fs\";\nimport { basename, dirname, isAbsolute, join, resolve, sep } from \"node:path\";\nimport type { PipelineStepContext } from \"../core/pipeline-types.js\";\nimport { throwIfAborted } from \"../utilities/abort.js\";\nimport { ToolError } from \"./tools.js\";\nimport {\n MAX_FILE_BYTES,\n MAX_OUTPUT_BYTES,\n MAX_SEARCH_SNIPPET_BYTES,\n} from \"./default-tool-limits.js\";\n\ntype Context = Pick<PipelineStepContext<object>, \"cwd\" | \"signal\">;\n\nexport function clippedText(text: string, maxBytes = MAX_OUTPUT_BYTES) {\n const bytes = Buffer.from(text);\n return {\n text: new TextDecoder(\"utf-8\", { ignoreBOM: true }).decode(bytes.subarray(0, maxBytes), {\n stream: bytes.length > maxBytes,\n }),\n truncated: bytes.length > maxBytes,\n };\n}\n\nasync function sortedEntries(path: string, signal?: AbortSignal) {\n throwIfAborted(signal, \"List files\");\n const entries = await readdir(path, { withFileTypes: true });\n throwIfAborted(signal, \"List files\");\n return entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));\n}\n\nfunction unavailableEntry(error: unknown) {\n return (\n error instanceof Error &&\n \"code\" in error &&\n typeof error.code === \"string\" &&\n [\"EACCES\", \"EPERM\", \"ENOENT\", \"ENOTDIR\"].includes(error.code)\n );\n}\n\nasync function fileOperation<T>(context: Context, work: () => Promise<T>): Promise<T> {\n throwIfAborted(context.signal, \"Agent tool\");\n try {\n const result = await work();\n throwIfAborted(context.signal, \"Agent tool\");\n return result;\n } catch (error) {\n throwIfAborted(context.signal, \"Agent tool\");\n if (error instanceof Error && \"code\" in error && typeof error.code === \"string\")\n throw new ToolError(error.code, clippedText(error.message, 4096).text);\n throw error;\n }\n}\n\nasync function readText(path: string, signal?: AbortSignal): Promise<string> {\n throwIfAborted(signal, \"Read file\");\n const file = await open(path, constants.O_RDONLY | constants.O_NONBLOCK);\n try {\n const info = await file.stat();\n if (!info.isFile()) throw new ToolError(\"NOT_FILE\", \"Expected a regular file\");\n if (info.size > MAX_FILE_BYTES) throw new ToolError(\"FILE_TOO_LARGE\", \"File exceeds 1 MiB\");\n const buffer = Buffer.alloc(MAX_FILE_BYTES + 1);\n let length = 0;\n while (length < buffer.length) {\n throwIfAborted(signal, \"Read file\");\n const { bytesRead } = await file.read(buffer, length, buffer.length - length, null);\n if (bytesRead === 0) break;\n length += bytesRead;\n }\n if (length > MAX_FILE_BYTES) throw new ToolError(\"FILE_TOO_LARGE\", \"File exceeds 1 MiB\");\n const bytes = buffer.subarray(0, length);\n if (bytes.includes(0)) throw new ToolError(\"NOT_TEXT\", \"Expected a UTF-8 text file\");\n try {\n return new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: true }).decode(bytes);\n } catch {\n throw new ToolError(\"NOT_TEXT\", \"Expected a UTF-8 text file\");\n }\n } finally {\n await file.close();\n }\n}\n\nexport async function readTool(\n input: { path: string; startLine?: number | null; maxLines?: number | null },\n context: Context\n) {\n return fileOperation(context, async () => {\n const path = resolve(context.cwd, input.path);\n const text = await readText(path, context.signal);\n // Retain separators so each selected window is an exact substring of the file.\n const parts = text.length === 0 ? [] : text.split(/(\\r?\\n)/);\n const totalLines = Math.ceil(parts.length / 2);\n const startLine = input.startLine ?? 1;\n const selected = parts.slice(\n (startLine - 1) * 2,\n (startLine - 1 + (input.maxLines ?? 200)) * 2 - 1\n );\n const content = clippedText(selected.join(\"\"));\n let endLine =\n selected.length === 0 ? startLine - 1 : startLine + content.text.split(\"\\n\").length - 1;\n if (content.truncated && content.text.endsWith(\"\\n\")) endLine--;\n return {\n path,\n content: content.text,\n startLine,\n endLine,\n totalLines,\n truncated: content.truncated || endLine < totalLines,\n };\n });\n}\n\nasync function writeDestination(path: string, signal?: AbortSignal) {\n for (let links = 0; ; links++) {\n throwIfAborted(signal, \"Write file\");\n await mkdir(dirname(path), { recursive: true });\n const trailingSeparator = path.endsWith(sep) || path.endsWith(\"/\") ? sep : \"\";\n path = join(await realpath(dirname(path)), basename(path)) + trailingSeparator;\n const info = await lstat(path).catch((error: unknown) => {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") return undefined;\n throw error;\n });\n if (!info?.isSymbolicLink()) return { destination: path, info };\n if (links === 40) throw new ToolError(\"ELOOP\", \"Too many symbolic links\");\n const target = await readlink(path);\n // Let the filesystem resolve directory symlinks before interpreting any '..'.\n path = isAbsolute(target) ? target : `${dirname(path)}${sep}${target}`;\n }\n}\n\nexport async function writeTool(input: { path: string; content: string }, context: Context) {\n return fileOperation(context, async () => {\n const path = resolve(context.cwd, input.path);\n const bytes = Buffer.byteLength(input.content);\n if (bytes > MAX_FILE_BYTES) throw new ToolError(\"FILE_TOO_LARGE\", \"Content exceeds 1 MiB\");\n const { destination, info } = await writeDestination(path, context.signal);\n if (info && !info.isFile()) throw new ToolError(\"NOT_FILE\", \"Expected a regular file\");\n if (info) await access(destination, constants.W_OK);\n const staging = await mkdtemp(join(dirname(destination), \".tubeless-write-\"));\n try {\n const temporary = join(staging, \"content\");\n const file = await open(temporary, \"wx\", info ? info.mode & 0o7777 : 0o666);\n try {\n await file.writeFile(input.content, { encoding: \"utf8\", signal: context.signal });\n if (info) {\n await file.chown(info.uid, info.gid);\n // Creation and ownership changes can alter mode bits; restore them last.\n await file.chmod(info.mode & 0o7777);\n }\n } finally {\n await file.close();\n }\n throwIfAborted(context.signal, \"Write file\");\n await rename(temporary, destination);\n } finally {\n await rm(staging, { recursive: true, force: true });\n }\n return { path, bytes };\n });\n}\n\nexport async function editTool(\n input: { path: string; oldText: string; newText: string },\n context: Context\n) {\n return fileOperation(context, async () => {\n const path = resolve(context.cwd, input.path);\n const text = await readText(path, context.signal);\n const index = text.indexOf(input.oldText);\n if (index < 0) throw new ToolError(\"EDIT_NOT_FOUND\", \"oldText does not occur in the file\");\n if (text.indexOf(input.oldText, index + 1) >= 0)\n throw new ToolError(\"EDIT_AMBIGUOUS\", \"oldText occurs more than once; include more context\");\n return writeTool(\n {\n path,\n content: text.slice(0, index) + input.newText + text.slice(index + input.oldText.length),\n },\n context\n );\n });\n}\n\nexport async function listTool(input: { path?: string | null }, context: Context) {\n return fileOperation(context, async () => {\n const path = resolve(context.cwd, input.path ?? \".\");\n const entries: { name: string; kind: \"file\" | \"directory\" | \"symlink\" | \"other\" }[] = [];\n let truncated = false;\n let bytes = 0;\n for (const entry of await sortedEntries(path, context.signal)) {\n throwIfAborted(context.signal, \"List files\");\n bytes += Buffer.byteLength(entry.name);\n if (entries.length === 200 || bytes > MAX_OUTPUT_BYTES) {\n truncated = true;\n break;\n }\n entries.push({\n name: entry.name,\n kind: entry.isSymbolicLink()\n ? \"symlink\"\n : entry.isDirectory()\n ? \"directory\"\n : entry.isFile()\n ? \"file\"\n : \"other\",\n });\n }\n return { path, entries, truncated };\n });\n}\n\nexport async function searchTool(input: { query: string; path?: string | null }, context: Context) {\n return fileOperation(context, async () => {\n const root = resolve(context.cwd, input.path ?? \".\");\n const matches: { path: string; line: number; text: string }[] = [];\n let entries = 0;\n let bytes = 0;\n let truncated = false;\n let skippedFiles = 0;\n async function searchFile(path: string) {\n let text: string;\n try {\n text = await readText(path, context.signal);\n } catch (error) {\n throwIfAborted(context.signal, \"Search files\");\n if (\n error instanceof ToolError &&\n [\"FILE_TOO_LARGE\", \"NOT_TEXT\", \"NOT_FILE\"].includes(error.code)\n ) {\n skippedFiles++;\n return;\n }\n throw error;\n }\n const lines = text.split(/\\r?\\n/);\n for (let index = 0; index < lines.length; index++) {\n const source = lines[index]!;\n const match = source.indexOf(input.query);\n if (match < 0) continue;\n const line = clippedText(source, MAX_SEARCH_SNIPPET_BYTES);\n if (line.truncated && !line.text.includes(input.query))\n line.text = clippedText(source.slice(match), MAX_SEARCH_SNIPPET_BYTES).text;\n bytes += Buffer.byteLength(path) + Buffer.byteLength(line.text);\n if (matches.length === 50 || bytes > MAX_OUTPUT_BYTES) {\n truncated = true;\n return;\n }\n matches.push({ path, line: index + 1, text: line.text });\n if (line.truncated) truncated = true;\n }\n }\n async function walk(path: string, depth: number): Promise<void> {\n if (depth > 32) {\n truncated = true;\n return;\n }\n for (const entry of await sortedEntries(path, context.signal)) {\n throwIfAborted(context.signal, \"Search files\");\n if (++entries > 2000 || matches.length >= 50 || bytes > MAX_OUTPUT_BYTES) {\n truncated = true;\n return;\n }\n try {\n if (entry.isDirectory() && entry.name !== \".git\" && entry.name !== \"node_modules\")\n await walk(join(path, entry.name), depth + 1);\n else if (entry.isFile()) await searchFile(join(path, entry.name));\n else if (!entry.isDirectory() && !entry.isSymbolicLink()) skippedFiles++;\n } catch (error) {\n throwIfAborted(context.signal, \"Search files\");\n if (!unavailableEntry(error)) throw error;\n skippedFiles++;\n }\n }\n }\n if ((await stat(root)).isFile()) await searchFile(root);\n else await walk(root, 0);\n return { matches, truncated, skippedFiles };\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"default-tool-files.js","sourceRoot":"","sources":["../../src/agent/default-tool-files.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n access,\n lstat,\n mkdir,\n mkdtemp,\n open,\n readdir,\n readlink,\n realpath,\n rename,\n rm,\n stat,\n} from \"node:fs/promises\";\nimport { constants } from \"node:fs\";\nimport { basename, dirname, isAbsolute, join, resolve, sep } from \"node:path\";\nimport type { PipelineStepContext } from \"../core/pipeline-types.js\";\nimport { throwIfAborted } from \"../utilities/abort.js\";\nimport { ToolError } from \"./tools.js\";\nimport {\n MAX_FILE_BYTES,\n MAX_OUTPUT_BYTES,\n MAX_SEARCH_SNIPPET_BYTES,\n} from \"./default-tool-limits.js\";\n\ntype Context = Pick<PipelineStepContext<object>, \"cwd\" | \"signal\">;\n\nexport function clippedText(text: string, maxBytes = MAX_OUTPUT_BYTES) {\n const bytes = Buffer.from(text);\n return {\n text: new TextDecoder(\"utf-8\", { ignoreBOM: true }).decode(bytes.subarray(0, maxBytes), {\n stream: bytes.length > maxBytes,\n }),\n truncated: bytes.length > maxBytes,\n };\n}\n\nasync function sortedEntries(path: string, signal?: AbortSignal) {\n throwIfAborted(signal, \"List files\");\n const entries = await readdir(path, { withFileTypes: true });\n throwIfAborted(signal, \"List files\");\n return entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));\n}\n\nfunction unavailableEntry(error: unknown) {\n return (\n error instanceof Error &&\n \"code\" in error &&\n typeof error.code === \"string\" &&\n [\"EACCES\", \"EPERM\", \"ENOENT\", \"ENOTDIR\"].includes(error.code)\n );\n}\n\nasync function fileOperation<T>(context: Context, work: () => Promise<T>): Promise<T> {\n throwIfAborted(context.signal, \"Agent tool\");\n try {\n const result = await work();\n throwIfAborted(context.signal, \"Agent tool\");\n return result;\n } catch (error) {\n throwIfAborted(context.signal, \"Agent tool\");\n if (error instanceof Error && \"code\" in error && typeof error.code === \"string\")\n throw new ToolError(error.code, clippedText(error.message, 4096).text);\n throw error;\n }\n}\n\nasync function readText(path: string, signal?: AbortSignal): Promise<string> {\n throwIfAborted(signal, \"Read file\");\n const file = await open(path, constants.O_RDONLY | constants.O_NONBLOCK);\n try {\n const info = await file.stat();\n if (!info.isFile()) throw new ToolError(\"NOT_FILE\", \"Expected a regular file\");\n if (info.size > MAX_FILE_BYTES) throw new ToolError(\"FILE_TOO_LARGE\", \"File exceeds 1 MiB\");\n const buffer = Buffer.alloc(MAX_FILE_BYTES + 1);\n let length = 0;\n while (length < buffer.length) {\n throwIfAborted(signal, \"Read file\");\n const { bytesRead } = await file.read(buffer, length, buffer.length - length, null);\n if (bytesRead === 0) break;\n length += bytesRead;\n }\n if (length > MAX_FILE_BYTES) throw new ToolError(\"FILE_TOO_LARGE\", \"File exceeds 1 MiB\");\n const bytes = buffer.subarray(0, length);\n if (bytes.includes(0)) throw new ToolError(\"NOT_TEXT\", \"Expected a UTF-8 text file\");\n try {\n return new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: true }).decode(bytes);\n } catch {\n throw new ToolError(\"NOT_TEXT\", \"Expected a UTF-8 text file\");\n }\n } finally {\n await file.close();\n }\n}\n\nexport async function readTool(\n input: { path: string; startLine?: number | null; maxLines?: number | null },\n context: Context\n) {\n return fileOperation(context, async () => {\n const path = resolve(context.cwd, input.path);\n const text = await readText(path, context.signal);\n // Retain separators so each selected window is an exact substring of the file.\n const parts = text.length === 0 ? [] : text.split(/(\\r?\\n)/);\n const totalLines = Math.ceil(parts.length / 2);\n const startLine = input.startLine ?? 1;\n const selected = parts.slice(\n (startLine - 1) * 2,\n (startLine - 1 + (input.maxLines ?? 200)) * 2 - 1\n );\n const content = clippedText(selected.join(\"\"));\n let endLine =\n selected.length === 0 ? startLine - 1 : startLine + content.text.split(\"\\n\").length - 1;\n if (content.truncated && content.text.endsWith(\"\\n\")) endLine--;\n return {\n path,\n content: content.text,\n startLine,\n endLine,\n totalLines,\n truncated: content.truncated || endLine < totalLines,\n };\n });\n}\n\nasync function writeDestination(path: string, signal?: AbortSignal) {\n for (let links = 0; ; links++) {\n throwIfAborted(signal, \"Write file\");\n await mkdir(dirname(path), { recursive: true });\n const trailingSeparator = path.endsWith(sep) || path.endsWith(\"/\") ? sep : \"\";\n path = join(await realpath(dirname(path)), basename(path)) + trailingSeparator;\n const info = await lstat(path).catch((error: unknown) => {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") return undefined;\n throw error;\n });\n if (!info?.isSymbolicLink()) return { destination: path, info };\n if (links === 40) throw new ToolError(\"ELOOP\", \"Too many symbolic links\");\n const target = await readlink(path);\n // Let the filesystem resolve directory symlinks before interpreting any '..'.\n path = isAbsolute(target) ? target : `${dirname(path)}${sep}${target}`;\n }\n}\n\n// Serialize writes per file within this process so concurrent edits in one tool batch\n// cannot read the same original text and silently overwrite each other.\nconst pathLocks = new Map<string, Promise<void>>();\n\nasync function withPathLock<T>(path: string, work: () => Promise<T>): Promise<T> {\n const key = await realpath(path).catch(() => path);\n const previous = pathLocks.get(key) ?? Promise.resolve();\n const current = previous.then(work);\n const settled = current.then(\n () => undefined,\n () => undefined\n );\n pathLocks.set(key, settled);\n try {\n return await current;\n } finally {\n if (pathLocks.get(key) === settled) pathLocks.delete(key);\n }\n}\n\nasync function writeContent(path: string, content: string, context: Context) {\n const bytes = Buffer.byteLength(content);\n if (bytes > MAX_FILE_BYTES) throw new ToolError(\"FILE_TOO_LARGE\", \"Content exceeds 1 MiB\");\n const { destination, info } = await writeDestination(path, context.signal);\n if (info && !info.isFile()) throw new ToolError(\"NOT_FILE\", \"Expected a regular file\");\n if (info) await access(destination, constants.W_OK);\n const staging = await mkdtemp(join(dirname(destination), \".tubeless-write-\"));\n try {\n const temporary = join(staging, \"content\");\n const file = await open(temporary, \"wx\", info ? info.mode & 0o7777 : 0o666);\n try {\n await file.writeFile(content, { encoding: \"utf8\", signal: context.signal });\n if (info) {\n await file.chown(info.uid, info.gid);\n // Creation and ownership changes can alter mode bits; restore them last.\n await file.chmod(info.mode & 0o7777);\n }\n } finally {\n await file.close();\n }\n throwIfAborted(context.signal, \"Write file\");\n await rename(temporary, destination);\n } finally {\n await rm(staging, { recursive: true, force: true });\n }\n return { path, bytes };\n}\n\nexport async function writeTool(input: { path: string; content: string }, context: Context) {\n return fileOperation(context, async () => {\n const path = resolve(context.cwd, input.path);\n return withPathLock(path, () => writeContent(path, input.content, context));\n });\n}\n\nexport async function editTool(\n input: { path: string; oldText: string; newText: string },\n context: Context\n) {\n return fileOperation(context, async () => {\n const path = resolve(context.cwd, input.path);\n return withPathLock(path, async () => {\n const text = await readText(path, context.signal);\n const index = text.indexOf(input.oldText);\n if (index < 0) throw new ToolError(\"EDIT_NOT_FOUND\", \"oldText does not occur in the file\");\n if (text.indexOf(input.oldText, index + 1) >= 0)\n throw new ToolError(\n \"EDIT_AMBIGUOUS\",\n \"oldText occurs more than once; include more context\"\n );\n const content =\n text.slice(0, index) + input.newText + text.slice(index + input.oldText.length);\n return writeContent(path, content, context);\n });\n });\n}\n\nexport async function listTool(input: { path?: string | null }, context: Context) {\n return fileOperation(context, async () => {\n const path = resolve(context.cwd, input.path ?? \".\");\n const entries: { name: string; kind: \"file\" | \"directory\" | \"symlink\" | \"other\" }[] = [];\n let truncated = false;\n let bytes = 0;\n for (const entry of await sortedEntries(path, context.signal)) {\n throwIfAborted(context.signal, \"List files\");\n bytes += Buffer.byteLength(entry.name);\n if (entries.length === 200 || bytes > MAX_OUTPUT_BYTES) {\n truncated = true;\n break;\n }\n entries.push({\n name: entry.name,\n kind: entry.isSymbolicLink()\n ? \"symlink\"\n : entry.isDirectory()\n ? \"directory\"\n : entry.isFile()\n ? \"file\"\n : \"other\",\n });\n }\n return { path, entries, truncated };\n });\n}\n\nexport async function searchTool(input: { query: string; path?: string | null }, context: Context) {\n return fileOperation(context, async () => {\n const root = resolve(context.cwd, input.path ?? \".\");\n const matches: { path: string; line: number; text: string }[] = [];\n let entries = 0;\n let bytes = 0;\n let truncated = false;\n let skippedFiles = 0;\n async function searchFile(path: string) {\n let text: string;\n try {\n text = await readText(path, context.signal);\n } catch (error) {\n throwIfAborted(context.signal, \"Search files\");\n if (\n error instanceof ToolError &&\n [\"FILE_TOO_LARGE\", \"NOT_TEXT\", \"NOT_FILE\"].includes(error.code)\n ) {\n skippedFiles++;\n return;\n }\n throw error;\n }\n const lines = text.split(/\\r?\\n/);\n for (let index = 0; index < lines.length; index++) {\n const source = lines[index]!;\n const match = source.indexOf(input.query);\n if (match < 0) continue;\n const line = clippedText(source, MAX_SEARCH_SNIPPET_BYTES);\n if (line.truncated && !line.text.includes(input.query))\n line.text = clippedText(source.slice(match), MAX_SEARCH_SNIPPET_BYTES).text;\n bytes += Buffer.byteLength(path) + Buffer.byteLength(line.text);\n if (matches.length === 50 || bytes > MAX_OUTPUT_BYTES) {\n truncated = true;\n return;\n }\n matches.push({ path, line: index + 1, text: line.text });\n if (line.truncated) truncated = true;\n }\n }\n async function walk(path: string, depth: number): Promise<void> {\n if (depth > 32) {\n truncated = true;\n return;\n }\n for (const entry of await sortedEntries(path, context.signal)) {\n throwIfAborted(context.signal, \"Search files\");\n if (++entries > 2000 || matches.length >= 50 || bytes > MAX_OUTPUT_BYTES) {\n truncated = true;\n return;\n }\n try {\n if (entry.isDirectory() && entry.name !== \".git\" && entry.name !== \"node_modules\")\n await walk(join(path, entry.name), depth + 1);\n else if (entry.isFile()) await searchFile(join(path, entry.name));\n else if (!entry.isDirectory() && !entry.isSymbolicLink()) skippedFiles++;\n } catch (error) {\n throwIfAborted(context.signal, \"Search files\");\n if (!unavailableEntry(error)) throw error;\n skippedFiles++;\n }\n }\n }\n if ((await stat(root)).isFile()) await searchFile(root);\n else await walk(root, 0);\n return { matches, truncated, skippedFiles };\n });\n}\n"]}
|
|
@@ -238,7 +238,7 @@ export function createMappedChildRunner(config) {
|
|
|
238
238
|
}), childHooks, "", childPlan);
|
|
239
239
|
progress?.childCompleted(key);
|
|
240
240
|
const value = config.mapResult
|
|
241
|
-
? config.mapResult(childResult.value, childResult, item, itemIndex, context)
|
|
241
|
+
? await config.mapResult(childResult.value, childResult, item, itemIndex, context)
|
|
242
242
|
: childResult.value;
|
|
243
243
|
progress?.complete(key);
|
|
244
244
|
return { key, ok: true, value };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"child-execution.js","sourceRoot":"","sources":["../../src/core/child-execution.ts"],"names":[],"mappings":"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","sourcesContent":["import { childExecutionScope } from \"./execution-scope.js\";\nimport type { PreparedOptions } from \"./prepared-options.js\";\nimport { throwIfAborted } from \"../utilities/abort.js\";\nimport { emitRejectedPlanLifecycle } from \"./lifecycle.js\";\nimport { runConcurrentPartial } from \"../utilities/batch.js\";\nimport {\n isPipelineCancellation,\n PipelineChildError,\n PipelineExecutionError,\n} from \"./pipeline-execution-error.js\";\nimport type { ToMappedChildStepProgressOptions } from \"./mapped-child-progress.js\";\nimport { createRunId, RUN_MODEL_VERSION } from \"./pipeline-ids.js\";\nimport { duplicateValues } from \"../utilities/collections.js\";\nimport { EXECUTE_COMPILED_RUN, isCompiledPipeline } from \"./pipeline-identity.js\";\nimport { createMappedChildProgress, createSingleChildProgress } from \"./child-progress.js\";\nimport type {\n Pipeline,\n PipelineContext,\n PipelineExecutionContext,\n PipelineHooks,\n PipelinePlan,\n PipelineRun,\n PipelineRunControls,\n PipelineRuntime,\n PipelineStepContext,\n} from \"./pipeline-types.js\";\nimport type { PipelineTracingOptions } from \"../tracing/tracing-contracts.js\";\n\ntype ChildPipeline = Pipeline<object, unknown, string, string>;\n\ntype CompiledChildExecute = (\n plan: PipelinePlan,\n options: object,\n controls: PipelineRunControls,\n context?: Partial<PipelineContext>,\n overrides?: undefined,\n preparedOptions?: PreparedOptions\n) => Promise<PipelineRun<unknown>>;\n\ntype ExecutableChild = ChildPipeline & {\n [EXECUTE_COMPILED_RUN]?: CompiledChildExecute;\n};\n\nfunction compiledChildExecute(pipeline: ChildPipeline): CompiledChildExecute | undefined {\n if (!isCompiledPipeline(pipeline)) return undefined;\n // SAFETY: branded pipelines are the `definePipeline` object, which always\n // stamps `EXECUTE_COMPILED_RUN`. Wrappers that inherit the symbol are rejected\n // by the identity check above.\n return (pipeline as ExecutableChild)[EXECUTE_COMPILED_RUN];\n}\n\nfunction executeCompiledChild(\n pipeline: ChildPipeline,\n plan: PipelinePlan,\n domainOptions: object,\n controls: PipelineRunControls,\n context: PipelineContext,\n preparedOptions?: PreparedOptions\n): Promise<PipelineRun<unknown>> {\n const execute = compiledChildExecute(pipeline);\n if (execute === undefined) {\n return pipeline.run(domainOptions, controls, context);\n }\n return execute(plan, domainOptions, controls, context, undefined, preparedOptions);\n}\n\nfunction publicChildRuntime(context: PipelineContext): PipelineRuntime {\n const runtime: PipelineRuntime = {\n cwd: context.cwd,\n log: context.log,\n now: context.now ?? Date.now,\n sleep: context.sleep ?? (async () => undefined),\n };\n if (context.correlationId !== undefined) runtime.correlationId = context.correlationId;\n if (context.hooks) runtime.hooks = context.hooks;\n if (context.parentRunId) runtime.parentRunId = context.parentRunId;\n if (context.signal) runtime.signal = context.signal;\n if (context.tracing) runtime.tracing = context.tracing;\n return runtime;\n}\n\nasync function failedPublicChildPlanRun(\n pipeline: ChildPipeline,\n plan: PipelinePlan,\n controls: PipelineRunControls,\n context: PipelineContext\n): Promise<PipelineRun<unknown>> {\n const runtime = publicChildRuntime(context);\n const startedAtMs = runtime.now();\n const result: PipelineRun<unknown> = {\n pipelineId: pipeline.id,\n dryRun: controls.dryRun === true,\n errors: [...plan.errors],\n finalized: false,\n finishedAtMs: runtime.now(),\n runId: createRunId(pipeline.id),\n startedAtMs,\n status: \"failed\",\n steps: [],\n version: RUN_MODEL_VERSION,\n };\n const correlationId = context.correlationId;\n if (correlationId !== undefined) result.correlationId = correlationId;\n if (context.parentRunId) result.parentRunId = context.parentRunId;\n await emitRejectedPlanLifecycle(pipeline.id, pipeline.targetIds, plan, runtime, result);\n return result;\n}\n\nasync function rejectedChildPlanResult(\n pipeline: ChildPipeline,\n plan: PipelinePlan,\n domainOptions: object,\n controls: PipelineRunControls,\n context: PipelineContext\n): Promise<PipelineRun<unknown>> {\n const execute = compiledChildExecute(pipeline);\n if (execute === undefined) {\n return failedPublicChildPlanRun(pipeline, plan, controls, context);\n }\n return execute(plan, domainOptions, controls, context);\n}\n\ntype ChildInputs = Record<string, unknown>;\n\nexport interface SingleChildExecutionConfig<TParentOptions extends object> {\n stepId: string;\n itemKey?: string;\n pipeline: ChildPipeline;\n controls?:\n | PipelineRunControls\n | ((\n inputs: ChildInputs,\n context: PipelineExecutionContext<TParentOptions>\n ) => PipelineRunControls);\n mapOptions?(inputs: ChildInputs, context: PipelineExecutionContext<TParentOptions>): object;\n mapResult?(\n value: unknown,\n result: PipelineRun<unknown>,\n context: PipelineStepContext<TParentOptions>\n ): unknown;\n}\n\nexport interface MappedChildExecutionConfig<TParentOptions extends object> {\n stepId: string;\n pipeline: ChildPipeline;\n items(\n inputs: ChildInputs,\n context: PipelineExecutionContext<TParentOptions>\n ): readonly unknown[] | Promise<readonly unknown[]>;\n key(item: unknown, index: number): string;\n concurrency?:\n | number\n | ((inputs: ChildInputs, context: PipelineExecutionContext<TParentOptions>) => number);\n progress?: ToMappedChildStepProgressOptions;\n controls?:\n | PipelineRunControls\n | ((\n item: unknown,\n index: number,\n inputs: ChildInputs,\n context: PipelineExecutionContext<TParentOptions>\n ) => PipelineRunControls);\n mapOptions(\n item: unknown,\n index: number,\n inputs: ChildInputs,\n context: PipelineExecutionContext<TParentOptions>\n ): object;\n mapResult?(\n value: unknown,\n result: PipelineRun<unknown>,\n item: unknown,\n index: number,\n context: PipelineStepContext<TParentOptions>\n ): unknown;\n}\n\nfunction childTracingOptions(\n context: PipelineExecutionContext<object>,\n stepId: string,\n itemKey = context.trace?.itemKey\n): PipelineTracingOptions | undefined {\n const tracing = context.tracing;\n if (!tracing) return undefined;\n return {\n ...tracing,\n itemKey,\n // A relation injected by this wrapper belongs to its next child, not descendants.\n iteration: tracing.iteration?.runId === context.runId ? tracing.iteration : undefined,\n parentStep: { runId: context.runId, stepId },\n };\n}\n\n/** Internal full-report boundary for dispatchers that classify failed child runs. */\nexport function invokeChildPipeline(\n pipeline: ChildPipeline,\n options: object,\n context: PipelineStepContext<object>,\n invocation: {\n stepId: string;\n plan: PipelinePlan;\n hooks: PipelineHooks;\n itemKey: string;\n preparedOptions?: PreparedOptions;\n }\n): Promise<PipelineRun<unknown>> {\n const controls = childRunControls(undefined, context.dryRun, context.cachePolicy);\n const runtime: PipelineContext = {\n correlationId: context.correlationId,\n cwd: context.cwd,\n log: context.log,\n now: context.now,\n parentRunId: context.runId,\n signal: context.signal,\n sleep: context.sleep,\n tracing: childTracingOptions(context, invocation.stepId, invocation.itemKey),\n hooks: invocation.hooks,\n };\n return executeCompiledChild(\n pipeline,\n invocation.plan,\n options,\n controls,\n childExecutionScope(context, runtime, {\n pipelineId: pipeline.id,\n stepId: invocation.stepId,\n itemKey: invocation.itemKey,\n }),\n invocation.preparedOptions\n );\n}\n\nfunction childRunControls(\n controls: PipelineRunControls | undefined,\n parentDryRun: boolean,\n cachePolicy: PipelineRunControls[\"cache\"]\n): PipelineRunControls {\n const resolved: PipelineRunControls = {};\n if (cachePolicy !== undefined || controls?.cache !== undefined)\n resolved.cache = cachePolicy ?? controls?.cache;\n if (controls?.continueOnError !== undefined) {\n resolved.continueOnError = controls.continueOnError;\n }\n if (controls?.maxConcurrency !== undefined) {\n resolved.maxConcurrency = controls.maxConcurrency;\n }\n if (controls?.stepIds !== undefined) resolved.stepIds = [...controls.stepIds];\n if (controls?.targets !== undefined) resolved.targets = [...controls.targets];\n if (parentDryRun || controls?.dryRun === true) {\n resolved.dryRun = true;\n } else if (controls?.dryRun !== undefined) {\n resolved.dryRun = false;\n }\n return resolved;\n}\n\nfunction isConcurrencyFunction<TOptions extends object>(\n concurrency:\n | number\n | ((inputs: ChildInputs, context: PipelineExecutionContext<TOptions>) => number)\n | undefined\n): concurrency is (inputs: ChildInputs, context: PipelineExecutionContext<TOptions>) => number {\n return typeof concurrency === \"function\";\n}\n\nfunction firstChildFailure(result: PipelineRun<unknown>) {\n const firstFailedStep = result.steps.find(\n ({ status }) => status === \"failed\" || status === \"cancelled\"\n );\n const firstError =\n firstFailedStep && \"error\" in firstFailedStep ? firstFailedStep.error : result.errors[0];\n return {\n failureLocation: firstFailedStep?.id ?? firstError?.stepId ?? \"unknown step\",\n message: firstError?.message ?? \"unknown error\",\n };\n}\n\nasync function runChildPipeline(\n pipeline: ChildPipeline,\n domainOptions: object,\n controls: PipelineRunControls,\n context: PipelineContext,\n hooks: PipelineHooks,\n messagePrefix = \"\",\n plan: PipelinePlan\n): Promise<PipelineRun<unknown>> {\n if (!plan.ok) {\n const firstError = plan.errors[0];\n const result = await rejectedChildPlanResult(pipeline, plan, domainOptions, controls, {\n ...context,\n hooks,\n });\n throw new PipelineExecutionError(\n result,\n `${messagePrefix}could not start: ${firstError?.message ?? \"invalid plan\"}`\n );\n }\n\n const result = await executeCompiledChild(pipeline, plan, domainOptions, controls, {\n ...context,\n hooks,\n });\n if (result.status !== \"completed\") {\n const { failureLocation, message } = firstChildFailure(result);\n throw new PipelineExecutionError(\n result,\n `${messagePrefix}failed at ${failureLocation}: ${message}`\n );\n }\n return result;\n}\n\nfunction hasProgressObserver(context: PipelineContext): boolean {\n const hooks = Array.isArray(context.hooks) ? context.hooks : [context.hooks];\n return (\n Boolean(context.tracing) || hooks.some((hook) => hook?.onStepProgress || hook?.onStepStatus)\n );\n}\n\nexport function createSingleChildRunner<TParentOptions extends object>(\n config: SingleChildExecutionConfig<TParentOptions>\n): (inputs: ChildInputs, context: PipelineStepContext<TParentOptions>) => Promise<unknown> {\n return async (inputs, context) => {\n const domainOptions = config.mapOptions ? config.mapOptions(inputs, context) : context.options;\n const configuredControls =\n typeof config.controls === \"function\" ? config.controls(inputs, context) : config.controls;\n const controls = childRunControls(configuredControls, context.dryRun, context.cachePolicy);\n const baseChildContext: PipelineContext = {\n correlationId: context.correlationId,\n cwd: context.cwd,\n log: context.log,\n now: context.now,\n parentRunId: context.runId,\n signal: context.signal,\n sleep: context.sleep,\n tracing: childTracingOptions(context, config.stepId),\n };\n // Plan once for progress totals and execution. Invalid plans fail before child.run.\n const childPlan = config.pipeline.plan(controls);\n const childHooks = hasProgressObserver(context)\n ? createSingleChildProgress(childPlan, context.reportProgress)\n : {};\n const childResult = await runChildPipeline(\n config.pipeline,\n domainOptions,\n controls,\n childExecutionScope(context, baseChildContext, {\n pipelineId: config.pipeline.id,\n stepId: config.stepId,\n itemKey: config.itemKey,\n }),\n childHooks,\n `Child pipeline ${config.pipeline.id} `,\n childPlan\n );\n\n return config.mapResult\n ? config.mapResult(childResult.value, childResult, context)\n : childResult.value;\n };\n}\n\nexport function createMappedChildRunner<TParentOptions extends object>(\n config: MappedChildExecutionConfig<TParentOptions>\n): (inputs: ChildInputs, context: PipelineStepContext<TParentOptions>) => Promise<unknown[]> {\n return async (inputs, context) => {\n const items = [...(await config.items(inputs, context))];\n const keys = items.map((item, index) => config.key(item, index));\n const duplicateKeys = duplicateValues(keys);\n if (duplicateKeys.length > 0) {\n throw new PipelineChildError(\n `Mapped child pipeline ${config.pipeline.id} received duplicate item keys: ${duplicateKeys.join(\", \")}`\n );\n }\n const concurrency = isConcurrencyFunction(config.concurrency)\n ? config.concurrency(inputs, context)\n : (config.concurrency ?? 1);\n if (!Number.isInteger(concurrency) || concurrency < 1) {\n throw new PipelineChildError(\n `Mapped child pipeline ${config.pipeline.id} concurrency must be a positive finite integer, got ${concurrency}`\n );\n }\n type Outcome =\n | { key: string; ok: true; value: unknown }\n | { error: Error; key: string; index: number; ok: false };\n\n const progress = hasProgressObserver(context)\n ? createMappedChildProgress(keys, concurrency, config.progress, context.reportProgress)\n : undefined;\n progress?.publish();\n if (items.length === 0) return [];\n\n const partial = await runConcurrentPartial(\n items,\n { concurrency, signal: context.signal },\n async (item, itemIndex): Promise<Outcome> => {\n const key = keys[itemIndex]!;\n progress?.start(key);\n try {\n throwIfAborted(context.signal, `Mapped child pipeline ${config.pipeline.id}`);\n const domainOptions = config.mapOptions(item, itemIndex, inputs, context);\n const configuredControls =\n typeof config.controls === \"function\"\n ? config.controls(item, itemIndex, inputs, context)\n : config.controls;\n const controls = childRunControls(\n configuredControls,\n context.dryRun,\n context.cachePolicy\n );\n // Plan once per mapped-options bag for progress and execution.\n const childPlan = config.pipeline.plan(controls);\n const childHooks = progress?.plan(key, childPlan) ?? {};\n const childResult = await runChildPipeline(\n config.pipeline,\n domainOptions,\n controls,\n childExecutionScope(\n context,\n {\n correlationId: context.correlationId,\n cwd: context.cwd,\n log: context.log,\n now: context.now,\n parentRunId: context.runId,\n signal: context.signal,\n sleep: context.sleep,\n tracing: childTracingOptions(context, config.stepId, key),\n },\n {\n pipelineId: config.pipeline.id,\n stepId: config.stepId,\n itemKey: key,\n }\n ),\n childHooks,\n \"\",\n childPlan\n );\n\n progress?.childCompleted(key);\n\n const value = config.mapResult\n ? config.mapResult(childResult.value, childResult, item, itemIndex, context)\n : childResult.value;\n progress?.complete(key);\n return { key, ok: true, value };\n } catch (error) {\n const cause = error instanceof Error ? error : new Error(String(error));\n progress?.fail(key, cause, isPipelineCancellation(cause, context));\n return { error: cause, key, index: itemIndex, ok: false };\n }\n }\n );\n\n progress?.finish();\n const outcomes = partial.ok\n ? partial.results\n : partial.results.filter((outcome): outcome is Outcome => outcome !== undefined);\n const schedulerFailure = partial.ok\n ? undefined\n : partial.failure instanceof Error\n ? partial.failure\n : new Error(String(partial.failure));\n\n const failures = outcomes.filter(\n (outcome): outcome is Extract<Outcome, { ok: false }> => !outcome.ok\n );\n if (failures.length > 0 || schedulerFailure !== undefined) {\n const details = failures.map(({ error, key }) => `${key}: ${error.message}`).join(\"; \");\n const cancelled =\n failures.every(({ error }) => isPipelineCancellation(error, context)) &&\n (schedulerFailure === undefined || isPipelineCancellation(schedulerFailure, context));\n const primaryError = cancelled\n ? (failures[0]?.error ?? schedulerFailure)\n : (failures.find(({ error }) => !isPipelineCancellation(error, context))?.error ??\n failures[0]?.error ??\n schedulerFailure);\n const message =\n failures.length > 0\n ? `Mapped child pipeline ${config.pipeline.id} failed for ${failures.length} item(s): ${details}`\n : `Mapped child pipeline ${config.pipeline.id} failed: ${primaryError?.message ?? \"aborted\"}`;\n throw new PipelineChildError(message, cancelled, primaryError, {\n failures: failures.map(({ error, key, index }) => ({\n error,\n key,\n index,\n cancelled: isPipelineCancellation(error, context),\n })),\n failureCount: failures.length,\n schedulerError: schedulerFailure,\n });\n }\n // SAFETY: when failures.length === 0 every outcome was produced by the\n // success branch (return { key, ok: true, value }), so each outcome is\n // necessarily `{ ok: true }`; the assertion narrows the union accordingly.\n return outcomes.map((outcome) => (outcome as Extract<Outcome, { ok: true }>).value);\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"child-execution.js","sourceRoot":"","sources":["../../src/core/child-execution.ts"],"names":[],"mappings":"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","sourcesContent":["import { childExecutionScope } from \"./execution-scope.js\";\nimport type { PreparedOptions } from \"./prepared-options.js\";\nimport { throwIfAborted } from \"../utilities/abort.js\";\nimport { emitRejectedPlanLifecycle } from \"./lifecycle.js\";\nimport { runConcurrentPartial } from \"../utilities/batch.js\";\nimport {\n isPipelineCancellation,\n PipelineChildError,\n PipelineExecutionError,\n} from \"./pipeline-execution-error.js\";\nimport type { ToMappedChildStepProgressOptions } from \"./mapped-child-progress.js\";\nimport { createRunId, RUN_MODEL_VERSION } from \"./pipeline-ids.js\";\nimport { duplicateValues } from \"../utilities/collections.js\";\nimport { EXECUTE_COMPILED_RUN, isCompiledPipeline } from \"./pipeline-identity.js\";\nimport { createMappedChildProgress, createSingleChildProgress } from \"./child-progress.js\";\nimport type {\n Pipeline,\n PipelineContext,\n PipelineExecutionContext,\n PipelineHooks,\n PipelinePlan,\n PipelineRun,\n PipelineRunControls,\n PipelineRuntime,\n PipelineStepContext,\n} from \"./pipeline-types.js\";\nimport type { PipelineTracingOptions } from \"../tracing/tracing-contracts.js\";\n\ntype ChildPipeline = Pipeline<object, unknown, string, string>;\n\ntype CompiledChildExecute = (\n plan: PipelinePlan,\n options: object,\n controls: PipelineRunControls,\n context?: Partial<PipelineContext>,\n overrides?: undefined,\n preparedOptions?: PreparedOptions\n) => Promise<PipelineRun<unknown>>;\n\ntype ExecutableChild = ChildPipeline & {\n [EXECUTE_COMPILED_RUN]?: CompiledChildExecute;\n};\n\nfunction compiledChildExecute(pipeline: ChildPipeline): CompiledChildExecute | undefined {\n if (!isCompiledPipeline(pipeline)) return undefined;\n // SAFETY: branded pipelines are the `definePipeline` object, which always\n // stamps `EXECUTE_COMPILED_RUN`. Wrappers that inherit the symbol are rejected\n // by the identity check above.\n return (pipeline as ExecutableChild)[EXECUTE_COMPILED_RUN];\n}\n\nfunction executeCompiledChild(\n pipeline: ChildPipeline,\n plan: PipelinePlan,\n domainOptions: object,\n controls: PipelineRunControls,\n context: PipelineContext,\n preparedOptions?: PreparedOptions\n): Promise<PipelineRun<unknown>> {\n const execute = compiledChildExecute(pipeline);\n if (execute === undefined) {\n return pipeline.run(domainOptions, controls, context);\n }\n return execute(plan, domainOptions, controls, context, undefined, preparedOptions);\n}\n\nfunction publicChildRuntime(context: PipelineContext): PipelineRuntime {\n const runtime: PipelineRuntime = {\n cwd: context.cwd,\n log: context.log,\n now: context.now ?? Date.now,\n sleep: context.sleep ?? (async () => undefined),\n };\n if (context.correlationId !== undefined) runtime.correlationId = context.correlationId;\n if (context.hooks) runtime.hooks = context.hooks;\n if (context.parentRunId) runtime.parentRunId = context.parentRunId;\n if (context.signal) runtime.signal = context.signal;\n if (context.tracing) runtime.tracing = context.tracing;\n return runtime;\n}\n\nasync function failedPublicChildPlanRun(\n pipeline: ChildPipeline,\n plan: PipelinePlan,\n controls: PipelineRunControls,\n context: PipelineContext\n): Promise<PipelineRun<unknown>> {\n const runtime = publicChildRuntime(context);\n const startedAtMs = runtime.now();\n const result: PipelineRun<unknown> = {\n pipelineId: pipeline.id,\n dryRun: controls.dryRun === true,\n errors: [...plan.errors],\n finalized: false,\n finishedAtMs: runtime.now(),\n runId: createRunId(pipeline.id),\n startedAtMs,\n status: \"failed\",\n steps: [],\n version: RUN_MODEL_VERSION,\n };\n const correlationId = context.correlationId;\n if (correlationId !== undefined) result.correlationId = correlationId;\n if (context.parentRunId) result.parentRunId = context.parentRunId;\n await emitRejectedPlanLifecycle(pipeline.id, pipeline.targetIds, plan, runtime, result);\n return result;\n}\n\nasync function rejectedChildPlanResult(\n pipeline: ChildPipeline,\n plan: PipelinePlan,\n domainOptions: object,\n controls: PipelineRunControls,\n context: PipelineContext\n): Promise<PipelineRun<unknown>> {\n const execute = compiledChildExecute(pipeline);\n if (execute === undefined) {\n return failedPublicChildPlanRun(pipeline, plan, controls, context);\n }\n return execute(plan, domainOptions, controls, context);\n}\n\ntype ChildInputs = Record<string, unknown>;\n\nexport interface SingleChildExecutionConfig<TParentOptions extends object> {\n stepId: string;\n itemKey?: string;\n pipeline: ChildPipeline;\n controls?:\n | PipelineRunControls\n | ((\n inputs: ChildInputs,\n context: PipelineExecutionContext<TParentOptions>\n ) => PipelineRunControls);\n mapOptions?(inputs: ChildInputs, context: PipelineExecutionContext<TParentOptions>): object;\n mapResult?(\n value: unknown,\n result: PipelineRun<unknown>,\n context: PipelineStepContext<TParentOptions>\n ): unknown;\n}\n\nexport interface MappedChildExecutionConfig<TParentOptions extends object> {\n stepId: string;\n pipeline: ChildPipeline;\n items(\n inputs: ChildInputs,\n context: PipelineExecutionContext<TParentOptions>\n ): readonly unknown[] | Promise<readonly unknown[]>;\n key(item: unknown, index: number): string;\n concurrency?:\n | number\n | ((inputs: ChildInputs, context: PipelineExecutionContext<TParentOptions>) => number);\n progress?: ToMappedChildStepProgressOptions;\n controls?:\n | PipelineRunControls\n | ((\n item: unknown,\n index: number,\n inputs: ChildInputs,\n context: PipelineExecutionContext<TParentOptions>\n ) => PipelineRunControls);\n mapOptions(\n item: unknown,\n index: number,\n inputs: ChildInputs,\n context: PipelineExecutionContext<TParentOptions>\n ): object;\n mapResult?(\n value: unknown,\n result: PipelineRun<unknown>,\n item: unknown,\n index: number,\n context: PipelineStepContext<TParentOptions>\n ): unknown;\n}\n\nfunction childTracingOptions(\n context: PipelineExecutionContext<object>,\n stepId: string,\n itemKey = context.trace?.itemKey\n): PipelineTracingOptions | undefined {\n const tracing = context.tracing;\n if (!tracing) return undefined;\n return {\n ...tracing,\n itemKey,\n // A relation injected by this wrapper belongs to its next child, not descendants.\n iteration: tracing.iteration?.runId === context.runId ? tracing.iteration : undefined,\n parentStep: { runId: context.runId, stepId },\n };\n}\n\n/** Internal full-report boundary for dispatchers that classify failed child runs. */\nexport function invokeChildPipeline(\n pipeline: ChildPipeline,\n options: object,\n context: PipelineStepContext<object>,\n invocation: {\n stepId: string;\n plan: PipelinePlan;\n hooks: PipelineHooks;\n itemKey: string;\n preparedOptions?: PreparedOptions;\n }\n): Promise<PipelineRun<unknown>> {\n const controls = childRunControls(undefined, context.dryRun, context.cachePolicy);\n const runtime: PipelineContext = {\n correlationId: context.correlationId,\n cwd: context.cwd,\n log: context.log,\n now: context.now,\n parentRunId: context.runId,\n signal: context.signal,\n sleep: context.sleep,\n tracing: childTracingOptions(context, invocation.stepId, invocation.itemKey),\n hooks: invocation.hooks,\n };\n return executeCompiledChild(\n pipeline,\n invocation.plan,\n options,\n controls,\n childExecutionScope(context, runtime, {\n pipelineId: pipeline.id,\n stepId: invocation.stepId,\n itemKey: invocation.itemKey,\n }),\n invocation.preparedOptions\n );\n}\n\nfunction childRunControls(\n controls: PipelineRunControls | undefined,\n parentDryRun: boolean,\n cachePolicy: PipelineRunControls[\"cache\"]\n): PipelineRunControls {\n const resolved: PipelineRunControls = {};\n if (cachePolicy !== undefined || controls?.cache !== undefined)\n resolved.cache = cachePolicy ?? controls?.cache;\n if (controls?.continueOnError !== undefined) {\n resolved.continueOnError = controls.continueOnError;\n }\n if (controls?.maxConcurrency !== undefined) {\n resolved.maxConcurrency = controls.maxConcurrency;\n }\n if (controls?.stepIds !== undefined) resolved.stepIds = [...controls.stepIds];\n if (controls?.targets !== undefined) resolved.targets = [...controls.targets];\n if (parentDryRun || controls?.dryRun === true) {\n resolved.dryRun = true;\n } else if (controls?.dryRun !== undefined) {\n resolved.dryRun = false;\n }\n return resolved;\n}\n\nfunction isConcurrencyFunction<TOptions extends object>(\n concurrency:\n | number\n | ((inputs: ChildInputs, context: PipelineExecutionContext<TOptions>) => number)\n | undefined\n): concurrency is (inputs: ChildInputs, context: PipelineExecutionContext<TOptions>) => number {\n return typeof concurrency === \"function\";\n}\n\nfunction firstChildFailure(result: PipelineRun<unknown>) {\n const firstFailedStep = result.steps.find(\n ({ status }) => status === \"failed\" || status === \"cancelled\"\n );\n const firstError =\n firstFailedStep && \"error\" in firstFailedStep ? firstFailedStep.error : result.errors[0];\n return {\n failureLocation: firstFailedStep?.id ?? firstError?.stepId ?? \"unknown step\",\n message: firstError?.message ?? \"unknown error\",\n };\n}\n\nasync function runChildPipeline(\n pipeline: ChildPipeline,\n domainOptions: object,\n controls: PipelineRunControls,\n context: PipelineContext,\n hooks: PipelineHooks,\n messagePrefix = \"\",\n plan: PipelinePlan\n): Promise<PipelineRun<unknown>> {\n if (!plan.ok) {\n const firstError = plan.errors[0];\n const result = await rejectedChildPlanResult(pipeline, plan, domainOptions, controls, {\n ...context,\n hooks,\n });\n throw new PipelineExecutionError(\n result,\n `${messagePrefix}could not start: ${firstError?.message ?? \"invalid plan\"}`\n );\n }\n\n const result = await executeCompiledChild(pipeline, plan, domainOptions, controls, {\n ...context,\n hooks,\n });\n if (result.status !== \"completed\") {\n const { failureLocation, message } = firstChildFailure(result);\n throw new PipelineExecutionError(\n result,\n `${messagePrefix}failed at ${failureLocation}: ${message}`\n );\n }\n return result;\n}\n\nfunction hasProgressObserver(context: PipelineContext): boolean {\n const hooks = Array.isArray(context.hooks) ? context.hooks : [context.hooks];\n return (\n Boolean(context.tracing) || hooks.some((hook) => hook?.onStepProgress || hook?.onStepStatus)\n );\n}\n\nexport function createSingleChildRunner<TParentOptions extends object>(\n config: SingleChildExecutionConfig<TParentOptions>\n): (inputs: ChildInputs, context: PipelineStepContext<TParentOptions>) => Promise<unknown> {\n return async (inputs, context) => {\n const domainOptions = config.mapOptions ? config.mapOptions(inputs, context) : context.options;\n const configuredControls =\n typeof config.controls === \"function\" ? config.controls(inputs, context) : config.controls;\n const controls = childRunControls(configuredControls, context.dryRun, context.cachePolicy);\n const baseChildContext: PipelineContext = {\n correlationId: context.correlationId,\n cwd: context.cwd,\n log: context.log,\n now: context.now,\n parentRunId: context.runId,\n signal: context.signal,\n sleep: context.sleep,\n tracing: childTracingOptions(context, config.stepId),\n };\n // Plan once for progress totals and execution. Invalid plans fail before child.run.\n const childPlan = config.pipeline.plan(controls);\n const childHooks = hasProgressObserver(context)\n ? createSingleChildProgress(childPlan, context.reportProgress)\n : {};\n const childResult = await runChildPipeline(\n config.pipeline,\n domainOptions,\n controls,\n childExecutionScope(context, baseChildContext, {\n pipelineId: config.pipeline.id,\n stepId: config.stepId,\n itemKey: config.itemKey,\n }),\n childHooks,\n `Child pipeline ${config.pipeline.id} `,\n childPlan\n );\n\n return config.mapResult\n ? config.mapResult(childResult.value, childResult, context)\n : childResult.value;\n };\n}\n\nexport function createMappedChildRunner<TParentOptions extends object>(\n config: MappedChildExecutionConfig<TParentOptions>\n): (inputs: ChildInputs, context: PipelineStepContext<TParentOptions>) => Promise<unknown[]> {\n return async (inputs, context) => {\n const items = [...(await config.items(inputs, context))];\n const keys = items.map((item, index) => config.key(item, index));\n const duplicateKeys = duplicateValues(keys);\n if (duplicateKeys.length > 0) {\n throw new PipelineChildError(\n `Mapped child pipeline ${config.pipeline.id} received duplicate item keys: ${duplicateKeys.join(\", \")}`\n );\n }\n const concurrency = isConcurrencyFunction(config.concurrency)\n ? config.concurrency(inputs, context)\n : (config.concurrency ?? 1);\n if (!Number.isInteger(concurrency) || concurrency < 1) {\n throw new PipelineChildError(\n `Mapped child pipeline ${config.pipeline.id} concurrency must be a positive finite integer, got ${concurrency}`\n );\n }\n type Outcome =\n | { key: string; ok: true; value: unknown }\n | { error: Error; key: string; index: number; ok: false };\n\n const progress = hasProgressObserver(context)\n ? createMappedChildProgress(keys, concurrency, config.progress, context.reportProgress)\n : undefined;\n progress?.publish();\n if (items.length === 0) return [];\n\n const partial = await runConcurrentPartial(\n items,\n { concurrency, signal: context.signal },\n async (item, itemIndex): Promise<Outcome> => {\n const key = keys[itemIndex]!;\n progress?.start(key);\n try {\n throwIfAborted(context.signal, `Mapped child pipeline ${config.pipeline.id}`);\n const domainOptions = config.mapOptions(item, itemIndex, inputs, context);\n const configuredControls =\n typeof config.controls === \"function\"\n ? config.controls(item, itemIndex, inputs, context)\n : config.controls;\n const controls = childRunControls(\n configuredControls,\n context.dryRun,\n context.cachePolicy\n );\n // Plan once per mapped-options bag for progress and execution.\n const childPlan = config.pipeline.plan(controls);\n const childHooks = progress?.plan(key, childPlan) ?? {};\n const childResult = await runChildPipeline(\n config.pipeline,\n domainOptions,\n controls,\n childExecutionScope(\n context,\n {\n correlationId: context.correlationId,\n cwd: context.cwd,\n log: context.log,\n now: context.now,\n parentRunId: context.runId,\n signal: context.signal,\n sleep: context.sleep,\n tracing: childTracingOptions(context, config.stepId, key),\n },\n {\n pipelineId: config.pipeline.id,\n stepId: config.stepId,\n itemKey: key,\n }\n ),\n childHooks,\n \"\",\n childPlan\n );\n\n progress?.childCompleted(key);\n\n const value = config.mapResult\n ? await config.mapResult(childResult.value, childResult, item, itemIndex, context)\n : childResult.value;\n progress?.complete(key);\n return { key, ok: true, value };\n } catch (error) {\n const cause = error instanceof Error ? error : new Error(String(error));\n progress?.fail(key, cause, isPipelineCancellation(cause, context));\n return { error: cause, key, index: itemIndex, ok: false };\n }\n }\n );\n\n progress?.finish();\n const outcomes = partial.ok\n ? partial.results\n : partial.results.filter((outcome): outcome is Outcome => outcome !== undefined);\n const schedulerFailure = partial.ok\n ? undefined\n : partial.failure instanceof Error\n ? partial.failure\n : new Error(String(partial.failure));\n\n const failures = outcomes.filter(\n (outcome): outcome is Extract<Outcome, { ok: false }> => !outcome.ok\n );\n if (failures.length > 0 || schedulerFailure !== undefined) {\n const details = failures.map(({ error, key }) => `${key}: ${error.message}`).join(\"; \");\n const cancelled =\n failures.every(({ error }) => isPipelineCancellation(error, context)) &&\n (schedulerFailure === undefined || isPipelineCancellation(schedulerFailure, context));\n const primaryError = cancelled\n ? (failures[0]?.error ?? schedulerFailure)\n : (failures.find(({ error }) => !isPipelineCancellation(error, context))?.error ??\n failures[0]?.error ??\n schedulerFailure);\n const message =\n failures.length > 0\n ? `Mapped child pipeline ${config.pipeline.id} failed for ${failures.length} item(s): ${details}`\n : `Mapped child pipeline ${config.pipeline.id} failed: ${primaryError?.message ?? \"aborted\"}`;\n throw new PipelineChildError(message, cancelled, primaryError, {\n failures: failures.map(({ error, key, index }) => ({\n error,\n key,\n index,\n cancelled: isPipelineCancellation(error, context),\n })),\n failureCount: failures.length,\n schedulerError: schedulerFailure,\n });\n }\n // SAFETY: when failures.length === 0 every outcome was produced by the\n // success branch (return { key, ok: true, value }), so each outcome is\n // necessarily `{ ok: true }`; the assertion narrows the union accordingly.\n return outcomes.map((outcome) => (outcome as Extract<Outcome, { ok: true }>).value);\n };\n}\n"]}
|
package/dist/core/lifecycle.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createPipelineTraceEmitter } from "../tracing/tracing-internal.js";
|
|
2
|
+
import { scopeStepLogger } from "./step-log-scope.js";
|
|
2
3
|
const PIPELINE_LOGGER_BASE = Symbol("pipelineLoggerBase");
|
|
3
4
|
function basePipelineLogger(log) {
|
|
4
5
|
// SAFETY: the optional symbol exists only on loggers created by this module.
|
|
@@ -8,15 +9,25 @@ function emitHook(runtime, emit) {
|
|
|
8
9
|
if (!runtime.hooks)
|
|
9
10
|
return;
|
|
10
11
|
const hookSets = Array.isArray(runtime.hooks) ? runtime.hooks : [runtime.hooks];
|
|
12
|
+
const warn = (error) => runtime.log.warn(`Pipeline hook failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
11
13
|
for (const hooks of hookSets) {
|
|
12
14
|
try {
|
|
13
|
-
emit(hooks);
|
|
15
|
+
const result = emit(hooks);
|
|
16
|
+
// Void-typed hooks may still be async; report their rejections instead of leaking them.
|
|
17
|
+
if (isPromiseLike(result))
|
|
18
|
+
result.then(undefined, warn);
|
|
14
19
|
}
|
|
15
20
|
catch (error) {
|
|
16
|
-
|
|
21
|
+
warn(error);
|
|
17
22
|
}
|
|
18
23
|
}
|
|
19
24
|
}
|
|
25
|
+
function isPromiseLike(value) {
|
|
26
|
+
return ((typeof value === "object" || typeof value === "function") &&
|
|
27
|
+
value !== null &&
|
|
28
|
+
"then" in value &&
|
|
29
|
+
typeof value.then === "function");
|
|
30
|
+
}
|
|
20
31
|
function snapshotRun(result) {
|
|
21
32
|
if (!result.finalized)
|
|
22
33
|
return structuredClone(result);
|
|
@@ -32,23 +43,24 @@ export function createPipelineLifecycleObserver(pipelineId, runtime, identity) {
|
|
|
32
43
|
traceContext: trace?.context,
|
|
33
44
|
logger(stepId, attemptId) {
|
|
34
45
|
if (!trace)
|
|
35
|
-
return runtime.log;
|
|
46
|
+
return scopeStepLogger(runtime.log, stepId);
|
|
47
|
+
const sink = scopeStepLogger(base, stepId);
|
|
36
48
|
// A child run inherits its parent's logger, but owns its own trace events.
|
|
37
49
|
const log = {
|
|
38
50
|
error: (message, ...params) => {
|
|
39
51
|
trace.log("error", message, params, stepId, attemptId);
|
|
40
|
-
|
|
52
|
+
sink.error(message, ...params);
|
|
41
53
|
},
|
|
42
54
|
log: (message, ...params) => {
|
|
43
55
|
trace.log("log", message, params, stepId, attemptId);
|
|
44
|
-
|
|
56
|
+
sink.log(message, ...params);
|
|
45
57
|
},
|
|
46
58
|
warn: (message, ...params) => {
|
|
47
59
|
trace.log("warn", message, params, stepId, attemptId);
|
|
48
|
-
|
|
60
|
+
sink.warn(message, ...params);
|
|
49
61
|
},
|
|
50
62
|
};
|
|
51
|
-
log[PIPELINE_LOGGER_BASE] =
|
|
63
|
+
log[PIPELINE_LOGGER_BASE] = sink;
|
|
52
64
|
return log;
|
|
53
65
|
},
|
|
54
66
|
pipelineStart(plan, targetIds) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ArtifactRecord } from \"../tracing/artifact-metadata.js\";\nimport type {\n PipelineError,\n PipelineHooks,\n PipelineLogger,\n PipelinePlan,\n PipelineRun,\n PipelineRuntime,\n PipelineStepStatus,\n} from \"./pipeline-types.js\";\nimport { createPipelineTraceEmitter } from \"../tracing/tracing-internal.js\";\nimport type {\n PipelineTraceAttributes,\n PipelineTraceContext,\n} from \"../tracing/tracing-contracts.js\";\n\n/** Internal canonical lifecycle stream. Hooks and tracing are projections of it. */\nexport interface PipelineLifecycleObserver {\n readonly traceContext: PipelineTraceContext | undefined;\n finalizeComplete(durationMs: number, value: unknown): void;\n finalizeError(error: PipelineError, durationMs: number): void;\n finalizeStart(): void;\n flush(): Promise<void>;\n logger(stepId?: string, attemptId?: string): PipelineLogger;\n pipelineComplete(result: PipelineRun<unknown>): void;\n pipelineStart(plan: PipelinePlan, targetIds: readonly string[]): void;\n recordArtifact(stepId: string, attemptId: string, record: ArtifactRecord, preview: boolean): void;\n reportAttempt(\n stepId: string,\n attempt: number,\n attributes?: PipelineTraceAttributes,\n attemptId?: string\n ): void;\n stepStatus(event: PipelineStepStatus, trace?: boolean): void;\n}\n\nconst PIPELINE_LOGGER_BASE = Symbol(\"pipelineLoggerBase\");\n\ntype TracedPipelineLogger = PipelineLogger & { [PIPELINE_LOGGER_BASE]?: PipelineLogger };\n\nfunction basePipelineLogger(log: PipelineLogger): PipelineLogger {\n // SAFETY: the optional symbol exists only on loggers created by this module.\n return (log as TracedPipelineLogger)[PIPELINE_LOGGER_BASE] ?? log;\n}\n\nfunction emitHook(runtime: PipelineRuntime, emit: (hooks: PipelineHooks) => void): void {\n if (!runtime.hooks) return;\n const hookSets = Array.isArray(runtime.hooks) ? runtime.hooks : [runtime.hooks];\n for (const hooks of hookSets) {\n try {\n emit(hooks);\n } catch (error) {\n runtime.log.warn(\n `Pipeline hook failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n}\n\nfunction snapshotRun(result: PipelineRun<unknown>): PipelineRun<unknown> {\n if (!result.finalized) return structuredClone(result);\n // Domain results may contain functions or class instances. Only lifecycle\n // metadata belongs to Tubeless; preserve the domain value's identity.\n const { value, ...metadata } = result;\n return { ...structuredClone(metadata), value };\n}\n\nexport function createPipelineLifecycleObserver(\n pipelineId: string,\n runtime: PipelineRuntime,\n identity: PipelineTraceContext\n): PipelineLifecycleObserver {\n const base = basePipelineLogger(runtime.log);\n const trace = createPipelineTraceEmitter(\n pipelineId,\n runtime.tracing,\n base,\n identity,\n runtime.now\n );\n return {\n traceContext: trace?.context,\n logger(stepId, attemptId) {\n if (!trace) return runtime.log;\n // A child run inherits its parent's logger, but owns its own trace events.\n const log: TracedPipelineLogger = {\n error: (message, ...params) => {\n trace.log(\"error\", message, params, stepId, attemptId);\n base.error(message, ...params);\n },\n log: (message, ...params) => {\n trace.log(\"log\", message, params, stepId, attemptId);\n base.log(message, ...params);\n },\n warn: (message, ...params) => {\n trace.log(\"warn\", message, params, stepId, attemptId);\n base.warn(message, ...params);\n },\n };\n log[PIPELINE_LOGGER_BASE] = base;\n return log;\n },\n pipelineStart(plan, targetIds) {\n emitHook(runtime, (hooks) => hooks.onPipelineStart?.(structuredClone(plan)));\n trace?.pipelineStart(plan, targetIds);\n },\n stepStatus(event, traceStatus = true) {\n emitHook(runtime, (hooks) => hooks.onStepStatus?.(structuredClone(event)));\n switch (event.status) {\n case \"planned\":\n emitHook(runtime, (hooks) => hooks.onStepPlan?.(structuredClone(event)));\n break;\n case \"running\":\n if (event.progress) {\n const progress = event.progress;\n emitHook(runtime, (hooks) =>\n hooks.onStepProgress?.(structuredClone({ ...event, progress }))\n );\n } else {\n emitHook(runtime, (hooks) =>\n hooks.onStepStart?.({\n attemptId: event.attemptId,\n ...(event.outputSource ? { outputSource: event.outputSource } : {}),\n pipelineId: event.pipelineId,\n status: \"running\",\n step: structuredClone(event.step),\n })\n );\n }\n break;\n case \"cancelled\":\n emitHook(runtime, (hooks) => hooks.onStepCancel?.(structuredClone(event)));\n break;\n case \"failed\":\n emitHook(runtime, (hooks) => hooks.onStepFail?.(structuredClone(event)));\n break;\n case \"skipped\":\n emitHook(runtime, (hooks) => hooks.onStepSkip?.(structuredClone(event)));\n break;\n case \"completed\":\n emitHook(runtime, (hooks) => hooks.onStepComplete?.(structuredClone(event)));\n break;\n }\n if (traceStatus) trace?.stepStatus(event);\n },\n recordArtifact: (stepId, attemptId, record, preview) =>\n trace?.artifact(stepId, attemptId, record, preview),\n reportAttempt: (stepId, attempt, attributes, attemptId) =>\n trace?.reportAttempt(stepId, attempt, attributes, attemptId),\n finalizeStart() {\n emitHook(runtime, (hooks) => hooks.onFinalizeStart?.({ pipelineId }));\n trace?.finalizeStart();\n },\n finalizeComplete(durationMs, value) {\n emitHook(runtime, (hooks) => hooks.onFinalizeComplete?.({ durationMs, pipelineId, value }));\n trace?.finalizeComplete(durationMs);\n },\n finalizeError(error, durationMs) {\n emitHook(runtime, (hooks) =>\n hooks.onFinalizeError?.({ durationMs, error: structuredClone(error), pipelineId })\n );\n trace?.finalizeError(error, durationMs);\n },\n pipelineComplete(result) {\n emitHook(runtime, (hooks) => hooks.onPipelineComplete?.(snapshotRun(result)));\n trace?.pipelineComplete(result);\n },\n flush: () => trace?.flush() ?? Promise.resolve(),\n };\n}\n\n/** Same start/complete projection executePlannedRun uses for an invalid plan. */\nexport async function emitRejectedPlanLifecycle(\n pipelineId: string,\n targetIds: readonly string[],\n plan: PipelinePlan,\n runtime: PipelineRuntime,\n result: PipelineRun<unknown>\n): Promise<void> {\n const identity: PipelineTraceContext = { runId: result.runId };\n if (result.correlationId !== undefined) identity.correlationId = result.correlationId;\n if (result.parentRunId) identity.parentRunId = result.parentRunId;\n if (runtime.tracing?.itemKey) identity.itemKey = runtime.tracing.itemKey;\n if (runtime.tracing?.iteration) identity.iteration = runtime.tracing.iteration;\n const lifecycle = createPipelineLifecycleObserver(pipelineId, runtime, identity);\n lifecycle.pipelineStart(plan, targetIds);\n lifecycle.pipelineComplete(result);\n await lifecycle.flush();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ArtifactRecord } from \"../tracing/artifact-metadata.js\";\nimport type {\n PipelineError,\n PipelineHooks,\n PipelineLogger,\n PipelinePlan,\n PipelineRun,\n PipelineRuntime,\n PipelineStepStatus,\n} from \"./pipeline-types.js\";\nimport { createPipelineTraceEmitter } from \"../tracing/tracing-internal.js\";\nimport type {\n PipelineTraceAttributes,\n PipelineTraceContext,\n} from \"../tracing/tracing-contracts.js\";\nimport { scopeStepLogger } from \"./step-log-scope.js\";\n\n/** Internal canonical lifecycle stream. Hooks and tracing are projections of it. */\nexport interface PipelineLifecycleObserver {\n readonly traceContext: PipelineTraceContext | undefined;\n finalizeComplete(durationMs: number, value: unknown): void;\n finalizeError(error: PipelineError, durationMs: number): void;\n finalizeStart(): void;\n flush(): Promise<void>;\n logger(stepId?: string, attemptId?: string): PipelineLogger;\n pipelineComplete(result: PipelineRun<unknown>): void;\n pipelineStart(plan: PipelinePlan, targetIds: readonly string[]): void;\n recordArtifact(stepId: string, attemptId: string, record: ArtifactRecord, preview: boolean): void;\n reportAttempt(\n stepId: string,\n attempt: number,\n attributes?: PipelineTraceAttributes,\n attemptId?: string\n ): void;\n stepStatus(event: PipelineStepStatus, trace?: boolean): void;\n}\n\nconst PIPELINE_LOGGER_BASE = Symbol(\"pipelineLoggerBase\");\n\ntype TracedPipelineLogger = PipelineLogger & { [PIPELINE_LOGGER_BASE]?: PipelineLogger };\n\nfunction basePipelineLogger(log: PipelineLogger): PipelineLogger {\n // SAFETY: the optional symbol exists only on loggers created by this module.\n return (log as TracedPipelineLogger)[PIPELINE_LOGGER_BASE] ?? log;\n}\n\nfunction emitHook(runtime: PipelineRuntime, emit: (hooks: PipelineHooks) => unknown): void {\n if (!runtime.hooks) return;\n const hookSets = Array.isArray(runtime.hooks) ? runtime.hooks : [runtime.hooks];\n const warn = (error: unknown) =>\n runtime.log.warn(\n `Pipeline hook failed: ${error instanceof Error ? error.message : String(error)}`\n );\n for (const hooks of hookSets) {\n try {\n const result = emit(hooks);\n // Void-typed hooks may still be async; report their rejections instead of leaking them.\n if (isPromiseLike(result)) result.then(undefined, warn);\n } catch (error) {\n warn(error);\n }\n }\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n (typeof value === \"object\" || typeof value === \"function\") &&\n value !== null &&\n \"then\" in value &&\n typeof value.then === \"function\"\n );\n}\n\nfunction snapshotRun(result: PipelineRun<unknown>): PipelineRun<unknown> {\n if (!result.finalized) return structuredClone(result);\n // Domain results may contain functions or class instances. Only lifecycle\n // metadata belongs to Tubeless; preserve the domain value's identity.\n const { value, ...metadata } = result;\n return { ...structuredClone(metadata), value };\n}\n\nexport function createPipelineLifecycleObserver(\n pipelineId: string,\n runtime: PipelineRuntime,\n identity: PipelineTraceContext\n): PipelineLifecycleObserver {\n const base = basePipelineLogger(runtime.log);\n const trace = createPipelineTraceEmitter(\n pipelineId,\n runtime.tracing,\n base,\n identity,\n runtime.now\n );\n return {\n traceContext: trace?.context,\n logger(stepId, attemptId) {\n if (!trace) return scopeStepLogger(runtime.log, stepId);\n const sink = scopeStepLogger(base, stepId);\n // A child run inherits its parent's logger, but owns its own trace events.\n const log: TracedPipelineLogger = {\n error: (message, ...params) => {\n trace.log(\"error\", message, params, stepId, attemptId);\n sink.error(message, ...params);\n },\n log: (message, ...params) => {\n trace.log(\"log\", message, params, stepId, attemptId);\n sink.log(message, ...params);\n },\n warn: (message, ...params) => {\n trace.log(\"warn\", message, params, stepId, attemptId);\n sink.warn(message, ...params);\n },\n };\n log[PIPELINE_LOGGER_BASE] = sink;\n return log;\n },\n pipelineStart(plan, targetIds) {\n emitHook(runtime, (hooks) => hooks.onPipelineStart?.(structuredClone(plan)));\n trace?.pipelineStart(plan, targetIds);\n },\n stepStatus(event, traceStatus = true) {\n emitHook(runtime, (hooks) => hooks.onStepStatus?.(structuredClone(event)));\n switch (event.status) {\n case \"planned\":\n emitHook(runtime, (hooks) => hooks.onStepPlan?.(structuredClone(event)));\n break;\n case \"running\":\n if (event.progress) {\n const progress = event.progress;\n emitHook(runtime, (hooks) =>\n hooks.onStepProgress?.(structuredClone({ ...event, progress }))\n );\n } else {\n emitHook(runtime, (hooks) =>\n hooks.onStepStart?.({\n attemptId: event.attemptId,\n ...(event.outputSource ? { outputSource: event.outputSource } : {}),\n pipelineId: event.pipelineId,\n status: \"running\",\n step: structuredClone(event.step),\n })\n );\n }\n break;\n case \"cancelled\":\n emitHook(runtime, (hooks) => hooks.onStepCancel?.(structuredClone(event)));\n break;\n case \"failed\":\n emitHook(runtime, (hooks) => hooks.onStepFail?.(structuredClone(event)));\n break;\n case \"skipped\":\n emitHook(runtime, (hooks) => hooks.onStepSkip?.(structuredClone(event)));\n break;\n case \"completed\":\n emitHook(runtime, (hooks) => hooks.onStepComplete?.(structuredClone(event)));\n break;\n }\n if (traceStatus) trace?.stepStatus(event);\n },\n recordArtifact: (stepId, attemptId, record, preview) =>\n trace?.artifact(stepId, attemptId, record, preview),\n reportAttempt: (stepId, attempt, attributes, attemptId) =>\n trace?.reportAttempt(stepId, attempt, attributes, attemptId),\n finalizeStart() {\n emitHook(runtime, (hooks) => hooks.onFinalizeStart?.({ pipelineId }));\n trace?.finalizeStart();\n },\n finalizeComplete(durationMs, value) {\n emitHook(runtime, (hooks) => hooks.onFinalizeComplete?.({ durationMs, pipelineId, value }));\n trace?.finalizeComplete(durationMs);\n },\n finalizeError(error, durationMs) {\n emitHook(runtime, (hooks) =>\n hooks.onFinalizeError?.({ durationMs, error: structuredClone(error), pipelineId })\n );\n trace?.finalizeError(error, durationMs);\n },\n pipelineComplete(result) {\n emitHook(runtime, (hooks) => hooks.onPipelineComplete?.(snapshotRun(result)));\n trace?.pipelineComplete(result);\n },\n flush: () => trace?.flush() ?? Promise.resolve(),\n };\n}\n\n/** Same start/complete projection executePlannedRun uses for an invalid plan. */\nexport async function emitRejectedPlanLifecycle(\n pipelineId: string,\n targetIds: readonly string[],\n plan: PipelinePlan,\n runtime: PipelineRuntime,\n result: PipelineRun<unknown>\n): Promise<void> {\n const identity: PipelineTraceContext = { runId: result.runId };\n if (result.correlationId !== undefined) identity.correlationId = result.correlationId;\n if (result.parentRunId) identity.parentRunId = result.parentRunId;\n if (runtime.tracing?.itemKey) identity.itemKey = runtime.tracing.itemKey;\n if (runtime.tracing?.iteration) identity.iteration = runtime.tracing.iteration;\n const lifecycle = createPipelineLifecycleObserver(pipelineId, runtime, identity);\n lifecycle.pipelineStart(plan, targetIds);\n lifecycle.pipelineComplete(result);\n await lifecycle.flush();\n}\n"]}
|
|
@@ -1,3 +1,16 @@
|
|
|
1
|
-
import type { PipelineError } from "./pipeline-types.js";
|
|
1
|
+
import type { PipelineError, PipelineStepReport } from "./pipeline-types.js";
|
|
2
2
|
/** One-line human format used by kernel exceptions and shared renderers. */
|
|
3
3
|
export declare function formatPipelineError(error: PipelineError): string;
|
|
4
|
+
/** `sourceCode` of a `requireOutputs` finalizer whose listed outputs were not published. */
|
|
5
|
+
export declare const REQUIRED_OUTPUTS_MISSING_CODE = "TUBELESS_REQUIRED_OUTPUTS_MISSING";
|
|
6
|
+
/**
|
|
7
|
+
* Errors worth showing a person. A missing-output finalizer failure is dropped
|
|
8
|
+
* only when another error is present and every step that left no output failed,
|
|
9
|
+
* was cancelled, or was skipped because of a failure. Any independently
|
|
10
|
+
* unpublished step might be the missing one, and without step reports the
|
|
11
|
+
* cause is unknown, so the failure is kept in both cases.
|
|
12
|
+
*/
|
|
13
|
+
export declare function causalPipelineErrors(run: {
|
|
14
|
+
readonly errors: readonly PipelineError[];
|
|
15
|
+
readonly steps?: readonly PipelineStepReport[];
|
|
16
|
+
}): readonly PipelineError[];
|
|
@@ -14,4 +14,43 @@ export function formatPipelineError(error) {
|
|
|
14
14
|
: "";
|
|
15
15
|
return `${error.phase}${step} [${error.code}]${sourceCode}: ${error.message}${cause}`;
|
|
16
16
|
}
|
|
17
|
+
/** `sourceCode` of a `requireOutputs` finalizer whose listed outputs were not published. */
|
|
18
|
+
export const REQUIRED_OUTPUTS_MISSING_CODE = "TUBELESS_REQUIRED_OUTPUTS_MISSING";
|
|
19
|
+
/**
|
|
20
|
+
* True when a step left no output because of a run failure: it failed, was
|
|
21
|
+
* cancelled, or was skipped after a failure. An unmet-dependency skip follows
|
|
22
|
+
* its blocking dependency, which may itself have been filtered or dry-run skipped.
|
|
23
|
+
*/
|
|
24
|
+
function unpublishedByFailure(report, reports) {
|
|
25
|
+
if (report === undefined || report.status === "completed")
|
|
26
|
+
return false;
|
|
27
|
+
if (report.status !== "skipped")
|
|
28
|
+
return true;
|
|
29
|
+
if (report.reason === "failed-dependency" || report.reason === "fail-fast")
|
|
30
|
+
return true;
|
|
31
|
+
// Dependencies are acyclic, so this walk terminates.
|
|
32
|
+
if (report.reason === "unmet-dependency" && report.dependencyId !== undefined) {
|
|
33
|
+
return unpublishedByFailure(reports.get(report.dependencyId), reports);
|
|
34
|
+
}
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
/** Policy skips publish their value; other skips leave no output. */
|
|
38
|
+
function unpublished(report) {
|
|
39
|
+
return (report.status !== "completed" && !(report.status === "skipped" && report.reason === "policy"));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Errors worth showing a person. A missing-output finalizer failure is dropped
|
|
43
|
+
* only when another error is present and every step that left no output failed,
|
|
44
|
+
* was cancelled, or was skipped because of a failure. Any independently
|
|
45
|
+
* unpublished step might be the missing one, and without step reports the
|
|
46
|
+
* cause is unknown, so the failure is kept in both cases.
|
|
47
|
+
*/
|
|
48
|
+
export function causalPipelineErrors(run) {
|
|
49
|
+
const causal = run.errors.filter((error) => error.sourceCode !== REQUIRED_OUTPUTS_MISSING_CODE);
|
|
50
|
+
if (causal.length === 0 || !run.steps)
|
|
51
|
+
return run.errors;
|
|
52
|
+
const reports = new Map(run.steps.map((report) => [report.id, report]));
|
|
53
|
+
const derived = run.steps.every((report) => !unpublished(report) || unpublishedByFailure(report, reports));
|
|
54
|
+
return derived ? causal : run.errors;
|
|
55
|
+
}
|
|
17
56
|
//# sourceMappingURL=pipeline-diagnostics.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-diagnostics.js","sourceRoot":"","sources":["../../src/core/pipeline-diagnostics.ts"],"names":[],"mappings":"AAEA,SAAS,oBAAoB,CAC3B,KAAqC;IAErC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,OAAO,OAAO,EAAE,KAAK;QAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;IAC/C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,mBAAmB,CAAC,KAAoB;IACtD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,MAAM,YAAY,GAAG,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,YAAY;QACxB,CAAC,CAAC,cAAc,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,YAAY,CAAC,OAAO,EAAE;QACvG,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,GAAG,KAAK,CAAC,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,UAAU,KAAK,KAAK,CAAC,OAAO,GAAG,KAAK,EAAE,CAAC;AACxF,CAAC","sourcesContent":["import type { PipelineError, PipelineErrorCause } from \"./pipeline-types.js\";\n\nfunction deepestPipelineCause(\n cause: PipelineErrorCause | undefined\n): PipelineErrorCause | undefined {\n let current = cause;\n while (current?.cause) current = current.cause;\n return current;\n}\n\n/** One-line human format used by kernel exceptions and shared renderers. */\nexport function formatPipelineError(error: PipelineError): string {\n const step = error.stepId ? ` at step ${error.stepId}` : \"\";\n const sourceCode = error.sourceCode ? ` (${error.sourceCode})` : \"\";\n const deepestCause = deepestPipelineCause(error.cause);\n const cause = deepestCause\n ? `; caused by${deepestCause.sourceCode ? ` ${deepestCause.sourceCode}` : \"\"}: ${deepestCause.message}`\n : \"\";\n return `${error.phase}${step} [${error.code}]${sourceCode}: ${error.message}${cause}`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"pipeline-diagnostics.js","sourceRoot":"","sources":["../../src/core/pipeline-diagnostics.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PipelineError, PipelineErrorCause, PipelineStepReport } from \"./pipeline-types.js\";\n\nfunction deepestPipelineCause(\n cause: PipelineErrorCause | undefined\n): PipelineErrorCause | undefined {\n let current = cause;\n while (current?.cause) current = current.cause;\n return current;\n}\n\n/** One-line human format used by kernel exceptions and shared renderers. */\nexport function formatPipelineError(error: PipelineError): string {\n const step = error.stepId ? ` at step ${error.stepId}` : \"\";\n const sourceCode = error.sourceCode ? ` (${error.sourceCode})` : \"\";\n const deepestCause = deepestPipelineCause(error.cause);\n const cause = deepestCause\n ? `; caused by${deepestCause.sourceCode ? ` ${deepestCause.sourceCode}` : \"\"}: ${deepestCause.message}`\n : \"\";\n return `${error.phase}${step} [${error.code}]${sourceCode}: ${error.message}${cause}`;\n}\n\n/** `sourceCode` of a `requireOutputs` finalizer whose listed outputs were not published. */\nexport const REQUIRED_OUTPUTS_MISSING_CODE = \"TUBELESS_REQUIRED_OUTPUTS_MISSING\";\n\n/**\n * True when a step left no output because of a run failure: it failed, was\n * cancelled, or was skipped after a failure. An unmet-dependency skip follows\n * its blocking dependency, which may itself have been filtered or dry-run skipped.\n */\nfunction unpublishedByFailure(\n report: PipelineStepReport | undefined,\n reports: ReadonlyMap<string, PipelineStepReport>\n): boolean {\n if (report === undefined || report.status === \"completed\") return false;\n if (report.status !== \"skipped\") return true;\n if (report.reason === \"failed-dependency\" || report.reason === \"fail-fast\") return true;\n // Dependencies are acyclic, so this walk terminates.\n if (report.reason === \"unmet-dependency\" && report.dependencyId !== undefined) {\n return unpublishedByFailure(reports.get(report.dependencyId), reports);\n }\n return false;\n}\n\n/** Policy skips publish their value; other skips leave no output. */\nfunction unpublished(report: PipelineStepReport): boolean {\n return (\n report.status !== \"completed\" && !(report.status === \"skipped\" && report.reason === \"policy\")\n );\n}\n\n/**\n * Errors worth showing a person. A missing-output finalizer failure is dropped\n * only when another error is present and every step that left no output failed,\n * was cancelled, or was skipped because of a failure. Any independently\n * unpublished step might be the missing one, and without step reports the\n * cause is unknown, so the failure is kept in both cases.\n */\nexport function causalPipelineErrors(run: {\n readonly errors: readonly PipelineError[];\n readonly steps?: readonly PipelineStepReport[];\n}): readonly PipelineError[] {\n const causal = run.errors.filter((error) => error.sourceCode !== REQUIRED_OUTPUTS_MISSING_CODE);\n if (causal.length === 0 || !run.steps) return run.errors;\n const reports = new Map(run.steps.map((report) => [report.id, report]));\n const derived = run.steps.every(\n (report) => !unpublished(report) || unpublishedByFailure(report, reports)\n );\n return derived ? causal : run.errors;\n}\n"]}
|