tubeless 0.3.1 → 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/agent/node-environment.d.ts +10 -2
- package/dist/agent/node-environment.js +9 -4
- package/dist/agent/node-environment.js.map +1 -1
- package/dist/core/child-execution.js +11 -7
- 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 -132
- 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/project/project-registry.js +4 -0
- package/dist/project/project-registry.js.map +1 -1
- 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/run-store/run-history.d.ts +11 -0
- package/dist/run-store/run-history.js +62 -5
- package/dist/run-store/run-history.js.map +1 -1
- package/dist/run-store/run-projection.js +9 -0
- package/dist/run-store/run-projection.js.map +1 -1
- package/dist/run-store/run-store-schema.js +11 -1
- package/dist/run-store/run-store-schema.js.map +1 -1
- package/dist/run-store/run-store.d.ts +11 -1
- package/dist/run-store/run-store.js.map +1 -1
- package/dist/studio/run-store-ui-client-browser.js +4 -2
- package/dist/studio/run-store-ui-client.d.ts +0 -54
- package/dist/studio/run-store-ui-client.js +5 -446
- 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-data-controller.d.ts +1 -0
- package/dist/studio/run-store-ui-data-controller.js +1 -1
- package/dist/studio/run-store-ui-data-controller.js.map +1 -1
- package/dist/studio/run-store-ui-graph-layout.d.ts +32 -0
- package/dist/studio/run-store-ui-graph-layout.js +77 -0
- package/dist/studio/run-store-ui-graph-layout.js.map +1 -0
- package/dist/studio/run-store-ui-graph.d.ts +10 -0
- package/dist/studio/run-store-ui-graph.js +546 -0
- package/dist/studio/run-store-ui-graph.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-page.js +117 -0
- package/dist/studio/run-store-ui-page.js.map +1 -1
- 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/studio/run-store-ui-steps.d.ts +19 -0
- package/dist/studio/run-store-ui-steps.js +58 -0
- package/dist/studio/run-store-ui-steps.js.map +1 -0
- package/dist/tracing/tracing-contracts.d.ts +8 -0
- package/dist/tracing/tracing-contracts.js.map +1 -1
- package/dist/tracing/tracing-internal.js +3 -0
- package/dist/tracing/tracing-internal.js.map +1 -1
- package/dist/tracing/tracing-schema.d.ts +3 -0
- package/dist/tracing/tracing-schema.js +7 -1
- package/dist/tracing/tracing-schema.js.map +1 -1
- package/dist/utilities/abort.d.ts +6 -0
- package/dist/utilities/abort.js +9 -2
- package/dist/utilities/abort.js.map +1 -1
- package/dist/utilities/cache-key.js +2 -14
- package/dist/utilities/cache-key.js.map +1 -1
- package/dist/utilities/retry.d.ts +5 -0
- package/dist/utilities/retry.js +6 -3
- package/dist/utilities/retry.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 +193 -142
- package/docs/agents.md +10 -5
- package/docs/api-reference.md +26 -26
- package/docs/api-report.json +10 -10
- package/docs/child-pipeline-composition.md +7 -3
- package/docs/cli.md +28 -2
- package/docs/concepts.md +3 -1
- package/docs/declarative-pipelines.md +3 -1
- package/docs/recipes.md +2 -1
- package/docs/studio.md +30 -2
- package/package.json +10 -9
- package/skills/tubeless/SKILL.md +6 -2
- package/dist/studio/run-store-ui-client-browser.d.ts +0 -1
|
@@ -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"]}
|
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
import type { AgentEnvironment } from "./environment.js";
|
|
2
|
-
/**
|
|
3
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Local workspace capabilities with bounded reads, atomic writes and cancellable bash.
|
|
4
|
+
*
|
|
5
|
+
* The default `id` names this process's local filesystem authority rather than its
|
|
6
|
+
* host, so durable checkpoints still resume in a recreated container or pod. Pass
|
|
7
|
+
* `id` to name a distinct authority, for example one store shared by several hosts.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createNodeAgentEnvironment(options?: {
|
|
10
|
+
readonly id?: string;
|
|
11
|
+
}): AgentEnvironment;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { lstat, realpath } from "node:fs/promises";
|
|
2
|
-
import { hostname } from "node:os";
|
|
3
2
|
import { dirname, join } from "node:path";
|
|
4
3
|
import { throwIfAborted } from "../utilities/abort.js";
|
|
5
4
|
import { bashTool } from "./default-tool-bash.js";
|
|
@@ -44,10 +43,16 @@ async function projectInstructions(context) {
|
|
|
44
43
|
}
|
|
45
44
|
return instructions;
|
|
46
45
|
}
|
|
47
|
-
/**
|
|
48
|
-
|
|
46
|
+
/**
|
|
47
|
+
* Local workspace capabilities with bounded reads, atomic writes and cancellable bash.
|
|
48
|
+
*
|
|
49
|
+
* The default `id` names this process's local filesystem authority rather than its
|
|
50
|
+
* host, so durable checkpoints still resume in a recreated container or pod. Pass
|
|
51
|
+
* `id` to name a distinct authority, for example one store shared by several hosts.
|
|
52
|
+
*/
|
|
53
|
+
export function createNodeAgentEnvironment(options = {}) {
|
|
49
54
|
return Object.freeze({
|
|
50
|
-
id:
|
|
55
|
+
id: options.id ?? "node:local",
|
|
51
56
|
resolveCwd: async ({ cwd, signal }) => {
|
|
52
57
|
throwIfAborted(signal, "Resolve agent workspace");
|
|
53
58
|
const directory = await realpath(cwd);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-environment.js","sourceRoot":"","sources":["../../src/agent/node-environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"node-environment.js","sourceRoot":"","sources":["../../src/agent/node-environment.ts"],"names":[],"mappings":"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","sourcesContent":["import { lstat, realpath } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { throwIfAborted } from \"../utilities/abort.js\";\nimport { bashTool } from \"./default-tool-bash.js\";\nimport { readTool, writeTool, editTool, listTool, searchTool } from \"./default-tool-files.js\";\nimport type {\n AgentEnvironment,\n AgentEnvironmentContext,\n AgentProjectInstruction,\n} from \"./environment.js\";\n\nfunction missing(error: unknown) {\n return error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n}\n\nasync function projectInstructions(\n context: AgentEnvironmentContext\n): Promise<readonly AgentProjectInstruction[]> {\n const { cwd, signal } = context;\n const workspace = await realpath(cwd);\n const ancestors: string[] = [];\n let directory = workspace;\n while (true) {\n throwIfAborted(signal, \"Load project instructions\");\n ancestors.push(directory);\n const git = await lstat(join(directory, \".git\")).catch((error: unknown) => {\n if (!missing(error)) throw error;\n return undefined;\n });\n if (git) break;\n const parent = dirname(directory);\n if (parent === directory) {\n ancestors.splice(1);\n break;\n }\n directory = parent;\n }\n const instructions: AgentProjectInstruction[] = [];\n for (const path of ancestors.reverse().map((ancestor) => join(ancestor, \"AGENTS.md\"))) {\n try {\n const file = await readTool({ path, maxLines: 2000 }, { cwd: workspace, signal });\n if (file.truncated) throw new Error(`Project instructions exceed read limits: ${path}`);\n instructions.push({ path, content: file.content });\n } catch (error) {\n if (!missing(error)) throw error;\n }\n }\n return instructions;\n}\n\n/**\n * Local workspace capabilities with bounded reads, atomic writes and cancellable bash.\n *\n * The default `id` names this process's local filesystem authority rather than its\n * host, so durable checkpoints still resume in a recreated container or pod. Pass\n * `id` to name a distinct authority, for example one store shared by several hosts.\n */\nexport function createNodeAgentEnvironment(\n options: { readonly id?: string } = {}\n): AgentEnvironment {\n return Object.freeze({\n id: options.id ?? \"node:local\",\n resolveCwd: async ({ cwd, signal }: AgentEnvironmentContext) => {\n throwIfAborted(signal, \"Resolve agent workspace\");\n const directory = await realpath(cwd);\n throwIfAborted(signal, \"Resolve agent workspace\");\n return directory;\n },\n projectInstructions,\n read: readTool,\n write: writeTool,\n edit: editTool,\n bash: bashTool,\n list: listTool,\n search: searchTool,\n });\n}\n"]}
|
|
@@ -71,7 +71,7 @@ async function rejectedChildPlanResult(pipeline, plan, domainOptions, controls,
|
|
|
71
71
|
}
|
|
72
72
|
return execute(plan, domainOptions, controls, context);
|
|
73
73
|
}
|
|
74
|
-
function childTracingOptions(context, itemKey = context.trace?.itemKey) {
|
|
74
|
+
function childTracingOptions(context, stepId, itemKey = context.trace?.itemKey) {
|
|
75
75
|
const tracing = context.tracing;
|
|
76
76
|
if (!tracing)
|
|
77
77
|
return undefined;
|
|
@@ -80,6 +80,7 @@ function childTracingOptions(context, itemKey = context.trace?.itemKey) {
|
|
|
80
80
|
itemKey,
|
|
81
81
|
// A relation injected by this wrapper belongs to its next child, not descendants.
|
|
82
82
|
iteration: tracing.iteration?.runId === context.runId ? tracing.iteration : undefined,
|
|
83
|
+
parentStep: { runId: context.runId, stepId },
|
|
83
84
|
};
|
|
84
85
|
}
|
|
85
86
|
/** Internal full-report boundary for dispatchers that classify failed child runs. */
|
|
@@ -93,7 +94,7 @@ export function invokeChildPipeline(pipeline, options, context, invocation) {
|
|
|
93
94
|
parentRunId: context.runId,
|
|
94
95
|
signal: context.signal,
|
|
95
96
|
sleep: context.sleep,
|
|
96
|
-
tracing: childTracingOptions(context, invocation.itemKey),
|
|
97
|
+
tracing: childTracingOptions(context, invocation.stepId, invocation.itemKey),
|
|
97
98
|
hooks: invocation.hooks,
|
|
98
99
|
};
|
|
99
100
|
return executeCompiledChild(pipeline, invocation.plan, options, controls, childExecutionScope(context, runtime, {
|
|
@@ -171,7 +172,7 @@ export function createSingleChildRunner(config) {
|
|
|
171
172
|
parentRunId: context.runId,
|
|
172
173
|
signal: context.signal,
|
|
173
174
|
sleep: context.sleep,
|
|
174
|
-
tracing: childTracingOptions(context),
|
|
175
|
+
tracing: childTracingOptions(context, config.stepId),
|
|
175
176
|
};
|
|
176
177
|
// Plan once for progress totals and execution. Invalid plans fail before child.run.
|
|
177
178
|
const childPlan = config.pipeline.plan(controls);
|
|
@@ -196,9 +197,12 @@ export function createMappedChildRunner(config) {
|
|
|
196
197
|
if (duplicateKeys.length > 0) {
|
|
197
198
|
throw new PipelineChildError(`Mapped child pipeline ${config.pipeline.id} received duplicate item keys: ${duplicateKeys.join(", ")}`);
|
|
198
199
|
}
|
|
199
|
-
const concurrency =
|
|
200
|
+
const concurrency = isConcurrencyFunction(config.concurrency)
|
|
200
201
|
? config.concurrency(inputs, context)
|
|
201
|
-
: (config.concurrency ?? 1)
|
|
202
|
+
: (config.concurrency ?? 1);
|
|
203
|
+
if (!Number.isInteger(concurrency) || concurrency < 1) {
|
|
204
|
+
throw new PipelineChildError(`Mapped child pipeline ${config.pipeline.id} concurrency must be a positive finite integer, got ${concurrency}`);
|
|
205
|
+
}
|
|
202
206
|
const progress = hasProgressObserver(context)
|
|
203
207
|
? createMappedChildProgress(keys, concurrency, config.progress, context.reportProgress)
|
|
204
208
|
: undefined;
|
|
@@ -226,7 +230,7 @@ export function createMappedChildRunner(config) {
|
|
|
226
230
|
parentRunId: context.runId,
|
|
227
231
|
signal: context.signal,
|
|
228
232
|
sleep: context.sleep,
|
|
229
|
-
tracing: childTracingOptions(context, key),
|
|
233
|
+
tracing: childTracingOptions(context, config.stepId, key),
|
|
230
234
|
}, {
|
|
231
235
|
pipelineId: config.pipeline.id,
|
|
232
236
|
stepId: config.stepId,
|
|
@@ -234,7 +238,7 @@ export function createMappedChildRunner(config) {
|
|
|
234
238
|
}), childHooks, "", childPlan);
|
|
235
239
|
progress?.childCompleted(key);
|
|
236
240
|
const value = config.mapResult
|
|
237
|
-
? config.mapResult(childResult.value, childResult, item, itemIndex, context)
|
|
241
|
+
? await config.mapResult(childResult.value, childResult, item, itemIndex, context)
|
|
238
242
|
: childResult.value;
|
|
239
243
|
progress?.complete(key);
|
|
240
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 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 };\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.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),\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 = Math.max(\n 1,\n isConcurrencyFunction(config.concurrency)\n ? config.concurrency(inputs, context)\n : (config.concurrency ?? 1)\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, 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) {
|