@humain/terminal 0.2.1 → 0.2.2
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/CHANGELOG.md +6 -0
- package/dist/bundle/chunks/{chunk-I47ZWR55.js → chunk-ADQYVZ6A.js} +8 -8
- package/dist/bundle/chunks/{chunk-EY4DWHQU.js → chunk-NMPIM7MN.js} +1 -1
- package/dist/bundle/chunks/{compat-QCV26HNS.js → compat-CN7WN6DA.js} +1 -1
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/core/model-runtime.d.ts +21 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +34 -4
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/tools/subagent-env.d.ts +2 -0
- package/dist/core/tools/subagent-env.d.ts.map +1 -1
- package/dist/core/tools/subagent-env.js +4 -0
- package/dist/core/tools/subagent-env.js.map +1 -1
- package/dist/core/tools/subagent-scheduler.d.ts +6 -1
- package/dist/core/tools/subagent-scheduler.d.ts.map +1 -1
- package/dist/core/tools/subagent-scheduler.js +12 -2
- package/dist/core/tools/subagent-scheduler.js.map +1 -1
- package/dist/core/tools/subagent.d.ts.map +1 -1
- package/dist/core/tools/subagent.js +3 -2
- package/dist/core/tools/subagent.js.map +1 -1
- package/docs/environment-variables.md +1 -0
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
|
@@ -66,7 +66,9 @@ export async function runDag(tasks, concurrency, run, isFailed, skip, onEvent, s
|
|
|
66
66
|
const graphError = validateTaskGraph(tasks);
|
|
67
67
|
if (graphError)
|
|
68
68
|
return Promise.reject(new Error(graphError));
|
|
69
|
-
const
|
|
69
|
+
const opts = typeof concurrency === "number" ? { concurrency } : concurrency;
|
|
70
|
+
const limit = Math.max(1, Math.min(opts.concurrency, tasks.length));
|
|
71
|
+
const worktreeLimit = Math.max(1, opts.worktrees ?? limit);
|
|
70
72
|
const results = new Array(tasks.length);
|
|
71
73
|
const serialAfter = implicitSerializationEdges(tasks);
|
|
72
74
|
const done = new Set();
|
|
@@ -75,6 +77,7 @@ export async function runDag(tasks, concurrency, run, isFailed, skip, onEvent, s
|
|
|
75
77
|
const waitedOnCap = new Set();
|
|
76
78
|
const serializedAnnounced = new Set();
|
|
77
79
|
let running = 0;
|
|
80
|
+
let runningIsolated = 0;
|
|
78
81
|
const failedExplicitDep = (t) => (t.dependsOn ?? []).find((d) => failed.has(d));
|
|
79
82
|
const blockedBy = (t) => [...(t.dependsOn ?? []), ...(serialAfter.get(t.id) ?? [])].filter((d) => !done.has(d));
|
|
80
83
|
return new Promise((resolve, reject) => {
|
|
@@ -159,7 +162,8 @@ export async function runDag(tasks, concurrency, run, isFailed, skip, onEvent, s
|
|
|
159
162
|
}
|
|
160
163
|
continue;
|
|
161
164
|
}
|
|
162
|
-
|
|
165
|
+
const isIsolated = t.isolation === "worktree";
|
|
166
|
+
if (running >= limit || (isIsolated && runningIsolated >= worktreeLimit)) {
|
|
163
167
|
if (!waitedOnCap.has(t.id)) {
|
|
164
168
|
waitedOnCap.add(t.id);
|
|
165
169
|
safeEvent({ type: "wait", id: t.id, reason: "concurrency" });
|
|
@@ -168,15 +172,21 @@ export async function runDag(tasks, concurrency, run, isFailed, skip, onEvent, s
|
|
|
168
172
|
}
|
|
169
173
|
started.add(t.id);
|
|
170
174
|
running++;
|
|
175
|
+
if (isIsolated)
|
|
176
|
+
runningIsolated++;
|
|
171
177
|
startedOrSettledThisPass = true;
|
|
172
178
|
progress = true;
|
|
173
179
|
safeEvent({ type: "start", id: t.id });
|
|
174
180
|
run(t, i).then((r) => {
|
|
175
181
|
running--;
|
|
182
|
+
if (isIsolated)
|
|
183
|
+
runningIsolated--;
|
|
176
184
|
settle(i, r);
|
|
177
185
|
pump();
|
|
178
186
|
}, (err) => {
|
|
179
187
|
running--;
|
|
188
|
+
if (isIsolated)
|
|
189
|
+
runningIsolated--;
|
|
180
190
|
if (!safeSettleWith(i, () => skip(t, i, err instanceof Error ? err.message : String(err))))
|
|
181
191
|
return;
|
|
182
192
|
pump();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-scheduler.js","sourceRoot":"","sources":["../../../src/core/tools/subagent-scheduler.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure scheduling for the subagent tool's parallel mode. No I/O, no spawn.\n * Explicit `dependsOn` edges gate start and propagate failure as a skip.\n * Implicit owner-path edges only order siblings; they never skip.\n */\nexport interface SchedulableTask {\n\tid: string;\n\tdependsOn?: string[];\n\townerPaths?: string[];\n}\n\nexport type DagEvent =\n\t| { type: \"wait\"; id: string; reason: \"concurrency\" }\n\t| { type: \"serialize\"; id: string; after: string[] }\n\t| { type: \"start\"; id: string }\n\t| { type: \"skip\"; id: string; failedDependency: string };\n\nexport function validateTaskGraph(tasks: SchedulableTask[]): string | null {\n\tconst ids = new Set<string>();\n\tfor (const t of tasks) {\n\t\tif (ids.has(t.id)) return `duplicate task id \"${t.id}\"`;\n\t\tids.add(t.id);\n\t}\n\tfor (const t of tasks) {\n\t\tfor (const dep of t.dependsOn ?? []) {\n\t\t\tif (dep === t.id) return `task \"${t.id}\" depends on itself`;\n\t\t\tif (!ids.has(dep)) return `task \"${t.id}\" has unknown dependency \"${dep}\"`;\n\t\t}\n\t}\n\t// Kahn's algorithm; anything left with in-degree > 0 is on a cycle.\n\tconst indegree = new Map<string, number>(tasks.map((t) => [t.id, t.dependsOn?.length ?? 0]));\n\tconst dependents = new Map<string, string[]>();\n\tfor (const t of tasks)\n\t\tfor (const dep of t.dependsOn ?? []) dependents.set(dep, [...(dependents.get(dep) ?? []), t.id]);\n\tconst queue = tasks.filter((t) => (indegree.get(t.id) ?? 0) === 0).map((t) => t.id);\n\tlet visited = 0;\n\twhile (queue.length) {\n\t\tconst id = queue.shift() as string;\n\t\tvisited++;\n\t\tfor (const next of dependents.get(id) ?? []) {\n\t\t\tconst d = (indegree.get(next) ?? 0) - 1;\n\t\t\tindegree.set(next, d);\n\t\t\tif (d === 0) queue.push(next);\n\t\t}\n\t}\n\tif (visited !== tasks.length) return \"task graph contains a dependency cycle\";\n\treturn null;\n}\n\nfunction normalizePath(p: string): string {\n\treturn p.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\").replace(/\\/+$/, \"\");\n}\n\nfunction pathCovers(a: string, b: string): boolean {\n\treturn a === b || b.startsWith(`${a}/`) || a.startsWith(`${b}/`);\n}\n\nexport function ownerPathsOverlap(a: string[] | undefined, b: string[] | undefined): boolean {\n\tif (!a?.length || !b?.length) return false;\n\tconst na = a.map(normalizePath);\n\tconst nb = b.map(normalizePath);\n\treturn na.some((x) => nb.some((y) => pathCovers(x, y)));\n}\n\nexport function implicitSerializationEdges(tasks: SchedulableTask[]): Map<string, string[]> {\n\tconst edges = new Map<string, string[]>();\n\tfor (let i = 0; i < tasks.length; i++) {\n\t\tconst after: string[] = [];\n\t\tfor (let j = 0; j < i; j++) {\n\t\t\tif (ownerPathsOverlap(tasks[i].ownerPaths, tasks[j].ownerPaths)) after.push(tasks[j].id);\n\t\t}\n\t\tedges.set(tasks[i].id, after);\n\t}\n\treturn edges;\n}\n\nexport async function runDag<TIn extends SchedulableTask, TOut>(\n\ttasks: TIn[],\n\tconcurrency: number,\n\trun: (task: TIn, index: number) => Promise<TOut>,\n\tisFailed: (result: TOut) => boolean,\n\tskip: (task: TIn, index: number, failedDependency: string) => TOut,\n\tonEvent?: (event: DagEvent) => void,\n\tsignal?: AbortSignal,\n\tonAbort?: (task: TIn, index: number) => TOut,\n): Promise<TOut[]> {\n\tif (tasks.length === 0) return [];\n\tconst graphError = validateTaskGraph(tasks);\n\tif (graphError) return Promise.reject(new Error(graphError));\n\tconst limit = Math.max(1, Math.min(concurrency, tasks.length));\n\tconst results: TOut[] = new Array(tasks.length);\n\tconst serialAfter = implicitSerializationEdges(tasks);\n\tconst done = new Set<string>();\n\tconst failed = new Set<string>();\n\tconst started = new Set<string>();\n\tconst waitedOnCap = new Set<string>();\n\tconst serializedAnnounced = new Set<string>();\n\tlet running = 0;\n\n\tconst failedExplicitDep = (t: TIn): string | undefined => (t.dependsOn ?? []).find((d) => failed.has(d));\n\tconst blockedBy = (t: TIn): string[] =>\n\t\t[...(t.dependsOn ?? []), ...(serialAfter.get(t.id) ?? [])].filter((d) => !done.has(d));\n\n\treturn new Promise<TOut[]>((resolve, reject) => {\n\t\tlet settled = false;\n\t\tconst settle = (index: number, result: TOut) => {\n\t\t\tresults[index] = result;\n\t\t\tconst id = tasks[index].id;\n\t\t\tdone.add(id);\n\t\t\tif (isFailed(result)) failed.add(id);\n\t\t};\n\t\tconst safeEvent = (event: DagEvent) => {\n\t\t\ttry {\n\t\t\t\tonEvent?.(event);\n\t\t\t} catch {\n\t\t\t\t/* observer errors never affect scheduling */\n\t\t\t}\n\t\t};\n\t\t/** Returns false when the promise was rejected and pumping must stop. */\n\t\tconst safeSettleWith = (index: number, produce: () => TOut): boolean => {\n\t\t\ttry {\n\t\t\t\tsettle(index, produce());\n\t\t\t\treturn true;\n\t\t\t} catch (err) {\n\t\t\t\tif (!settled) {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\treject(err instanceof Error ? err : new Error(String(err)));\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t};\n\n\t\tconst pump = () => {\n\t\t\tlet startedOrSettledThisPass = false;\n\t\t\tlet progress = true;\n\t\t\twhile (progress) {\n\t\t\t\tprogress = false;\n\t\t\t\t// 0. Abort short-circuits everything not yet started.\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\tfor (let i = 0; i < tasks.length; i++) {\n\t\t\t\t\t\tconst t = tasks[i];\n\t\t\t\t\t\tif (started.has(t.id) || done.has(t.id)) continue;\n\t\t\t\t\t\tstarted.add(t.id);\n\t\t\t\t\t\tif (!safeSettleWith(i, () => (onAbort ? onAbort(t, i) : skip(t, i, \"aborted\")))) return;\n\t\t\t\t\t\tstartedOrSettledThisPass = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// 1. Skip dependents of failed tasks, to a fixed point.\n\t\t\t\tlet skipped = true;\n\t\t\t\twhile (skipped) {\n\t\t\t\t\tskipped = false;\n\t\t\t\t\tfor (let i = 0; i < tasks.length; i++) {\n\t\t\t\t\t\tconst t = tasks[i];\n\t\t\t\t\t\tif (started.has(t.id) || done.has(t.id)) continue;\n\t\t\t\t\t\tconst dep = failedExplicitDep(t);\n\t\t\t\t\t\tif (dep) {\n\t\t\t\t\t\t\tsafeEvent({ type: \"skip\", id: t.id, failedDependency: dep });\n\t\t\t\t\t\t\tstarted.add(t.id);\n\t\t\t\t\t\t\tif (!safeSettleWith(i, () => skip(t, i, dep))) return;\n\t\t\t\t\t\t\tstartedOrSettledThisPass = true;\n\t\t\t\t\t\t\tprogress = true;\n\t\t\t\t\t\t\tskipped = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// 2. Start ready tasks up to the cap.\n\t\t\t\tfor (let i = 0; i < tasks.length; i++) {\n\t\t\t\t\tconst t = tasks[i];\n\t\t\t\t\tif (started.has(t.id) || done.has(t.id)) continue;\n\t\t\t\t\tconst blockers = blockedBy(t);\n\t\t\t\t\tif (blockers.length) {\n\t\t\t\t\t\tconst serial = (serialAfter.get(t.id) ?? []).filter((d) => !done.has(d));\n\t\t\t\t\t\tif (serial.length && !serializedAnnounced.has(t.id)) {\n\t\t\t\t\t\t\tserializedAnnounced.add(t.id);\n\t\t\t\t\t\t\tsafeEvent({ type: \"serialize\", id: t.id, after: serial });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (running >= limit) {\n\t\t\t\t\t\tif (!waitedOnCap.has(t.id)) {\n\t\t\t\t\t\t\twaitedOnCap.add(t.id);\n\t\t\t\t\t\t\tsafeEvent({ type: \"wait\", id: t.id, reason: \"concurrency\" });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tstarted.add(t.id);\n\t\t\t\t\trunning++;\n\t\t\t\t\tstartedOrSettledThisPass = true;\n\t\t\t\t\tprogress = true;\n\t\t\t\t\tsafeEvent({ type: \"start\", id: t.id });\n\t\t\t\t\trun(t, i).then(\n\t\t\t\t\t\t(r) => {\n\t\t\t\t\t\t\trunning--;\n\t\t\t\t\t\t\tsettle(i, r);\n\t\t\t\t\t\t\tpump();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(err) => {\n\t\t\t\t\t\t\trunning--;\n\t\t\t\t\t\t\tif (!safeSettleWith(i, () => skip(t, i, err instanceof Error ? err.message : String(err)))) return;\n\t\t\t\t\t\t\tpump();\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (done.size === tasks.length) {\n\t\t\t\tif (!settled) {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tresolve(results);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (running === 0 && !startedOrSettledThisPass) {\n\t\t\t\tif (!settled) {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\treject(new Error(\"task graph stalled: no runnable task remains\"));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tpump();\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"subagent-scheduler.js","sourceRoot":"","sources":["../../../src/core/tools/subagent-scheduler.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure scheduling for the subagent tool's parallel mode. No I/O, no spawn.\n * Explicit `dependsOn` edges gate start and propagate failure as a skip.\n * Implicit owner-path edges only order siblings; they never skip.\n */\nexport interface SchedulableTask {\n\tid: string;\n\tdependsOn?: string[];\n\townerPaths?: string[];\n\t/** Only the literal \"worktree\" consumes a worktree slot. */\n\tisolation?: string;\n}\n\nexport type DagEvent =\n\t| { type: \"wait\"; id: string; reason: \"concurrency\" }\n\t| { type: \"serialize\"; id: string; after: string[] }\n\t| { type: \"start\"; id: string }\n\t| { type: \"skip\"; id: string; failedDependency: string };\n\nexport function validateTaskGraph(tasks: SchedulableTask[]): string | null {\n\tconst ids = new Set<string>();\n\tfor (const t of tasks) {\n\t\tif (ids.has(t.id)) return `duplicate task id \"${t.id}\"`;\n\t\tids.add(t.id);\n\t}\n\tfor (const t of tasks) {\n\t\tfor (const dep of t.dependsOn ?? []) {\n\t\t\tif (dep === t.id) return `task \"${t.id}\" depends on itself`;\n\t\t\tif (!ids.has(dep)) return `task \"${t.id}\" has unknown dependency \"${dep}\"`;\n\t\t}\n\t}\n\t// Kahn's algorithm; anything left with in-degree > 0 is on a cycle.\n\tconst indegree = new Map<string, number>(tasks.map((t) => [t.id, t.dependsOn?.length ?? 0]));\n\tconst dependents = new Map<string, string[]>();\n\tfor (const t of tasks)\n\t\tfor (const dep of t.dependsOn ?? []) dependents.set(dep, [...(dependents.get(dep) ?? []), t.id]);\n\tconst queue = tasks.filter((t) => (indegree.get(t.id) ?? 0) === 0).map((t) => t.id);\n\tlet visited = 0;\n\twhile (queue.length) {\n\t\tconst id = queue.shift() as string;\n\t\tvisited++;\n\t\tfor (const next of dependents.get(id) ?? []) {\n\t\t\tconst d = (indegree.get(next) ?? 0) - 1;\n\t\t\tindegree.set(next, d);\n\t\t\tif (d === 0) queue.push(next);\n\t\t}\n\t}\n\tif (visited !== tasks.length) return \"task graph contains a dependency cycle\";\n\treturn null;\n}\n\nfunction normalizePath(p: string): string {\n\treturn p.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\").replace(/\\/+$/, \"\");\n}\n\nfunction pathCovers(a: string, b: string): boolean {\n\treturn a === b || b.startsWith(`${a}/`) || a.startsWith(`${b}/`);\n}\n\nexport function ownerPathsOverlap(a: string[] | undefined, b: string[] | undefined): boolean {\n\tif (!a?.length || !b?.length) return false;\n\tconst na = a.map(normalizePath);\n\tconst nb = b.map(normalizePath);\n\treturn na.some((x) => nb.some((y) => pathCovers(x, y)));\n}\n\nexport function implicitSerializationEdges(tasks: SchedulableTask[]): Map<string, string[]> {\n\tconst edges = new Map<string, string[]>();\n\tfor (let i = 0; i < tasks.length; i++) {\n\t\tconst after: string[] = [];\n\t\tfor (let j = 0; j < i; j++) {\n\t\t\tif (ownerPathsOverlap(tasks[i].ownerPaths, tasks[j].ownerPaths)) after.push(tasks[j].id);\n\t\t}\n\t\tedges.set(tasks[i].id, after);\n\t}\n\treturn edges;\n}\n\nexport async function runDag<TIn extends SchedulableTask, TOut>(\n\ttasks: TIn[],\n\tconcurrency: number | { concurrency: number; worktrees?: number },\n\trun: (task: TIn, index: number) => Promise<TOut>,\n\tisFailed: (result: TOut) => boolean,\n\tskip: (task: TIn, index: number, failedDependency: string) => TOut,\n\tonEvent?: (event: DagEvent) => void,\n\tsignal?: AbortSignal,\n\tonAbort?: (task: TIn, index: number) => TOut,\n): Promise<TOut[]> {\n\tif (tasks.length === 0) return [];\n\tconst graphError = validateTaskGraph(tasks);\n\tif (graphError) return Promise.reject(new Error(graphError));\n\tconst opts = typeof concurrency === \"number\" ? { concurrency } : concurrency;\n\tconst limit = Math.max(1, Math.min(opts.concurrency, tasks.length));\n\tconst worktreeLimit = Math.max(1, opts.worktrees ?? limit);\n\tconst results: TOut[] = new Array(tasks.length);\n\tconst serialAfter = implicitSerializationEdges(tasks);\n\tconst done = new Set<string>();\n\tconst failed = new Set<string>();\n\tconst started = new Set<string>();\n\tconst waitedOnCap = new Set<string>();\n\tconst serializedAnnounced = new Set<string>();\n\tlet running = 0;\n\tlet runningIsolated = 0;\n\n\tconst failedExplicitDep = (t: TIn): string | undefined => (t.dependsOn ?? []).find((d) => failed.has(d));\n\tconst blockedBy = (t: TIn): string[] =>\n\t\t[...(t.dependsOn ?? []), ...(serialAfter.get(t.id) ?? [])].filter((d) => !done.has(d));\n\n\treturn new Promise<TOut[]>((resolve, reject) => {\n\t\tlet settled = false;\n\t\tconst settle = (index: number, result: TOut) => {\n\t\t\tresults[index] = result;\n\t\t\tconst id = tasks[index].id;\n\t\t\tdone.add(id);\n\t\t\tif (isFailed(result)) failed.add(id);\n\t\t};\n\t\tconst safeEvent = (event: DagEvent) => {\n\t\t\ttry {\n\t\t\t\tonEvent?.(event);\n\t\t\t} catch {\n\t\t\t\t/* observer errors never affect scheduling */\n\t\t\t}\n\t\t};\n\t\t/** Returns false when the promise was rejected and pumping must stop. */\n\t\tconst safeSettleWith = (index: number, produce: () => TOut): boolean => {\n\t\t\ttry {\n\t\t\t\tsettle(index, produce());\n\t\t\t\treturn true;\n\t\t\t} catch (err) {\n\t\t\t\tif (!settled) {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\treject(err instanceof Error ? err : new Error(String(err)));\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t};\n\n\t\tconst pump = () => {\n\t\t\tlet startedOrSettledThisPass = false;\n\t\t\tlet progress = true;\n\t\t\twhile (progress) {\n\t\t\t\tprogress = false;\n\t\t\t\t// 0. Abort short-circuits everything not yet started.\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\tfor (let i = 0; i < tasks.length; i++) {\n\t\t\t\t\t\tconst t = tasks[i];\n\t\t\t\t\t\tif (started.has(t.id) || done.has(t.id)) continue;\n\t\t\t\t\t\tstarted.add(t.id);\n\t\t\t\t\t\tif (!safeSettleWith(i, () => (onAbort ? onAbort(t, i) : skip(t, i, \"aborted\")))) return;\n\t\t\t\t\t\tstartedOrSettledThisPass = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// 1. Skip dependents of failed tasks, to a fixed point.\n\t\t\t\tlet skipped = true;\n\t\t\t\twhile (skipped) {\n\t\t\t\t\tskipped = false;\n\t\t\t\t\tfor (let i = 0; i < tasks.length; i++) {\n\t\t\t\t\t\tconst t = tasks[i];\n\t\t\t\t\t\tif (started.has(t.id) || done.has(t.id)) continue;\n\t\t\t\t\t\tconst dep = failedExplicitDep(t);\n\t\t\t\t\t\tif (dep) {\n\t\t\t\t\t\t\tsafeEvent({ type: \"skip\", id: t.id, failedDependency: dep });\n\t\t\t\t\t\t\tstarted.add(t.id);\n\t\t\t\t\t\t\tif (!safeSettleWith(i, () => skip(t, i, dep))) return;\n\t\t\t\t\t\t\tstartedOrSettledThisPass = true;\n\t\t\t\t\t\t\tprogress = true;\n\t\t\t\t\t\t\tskipped = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// 2. Start ready tasks up to the cap.\n\t\t\t\tfor (let i = 0; i < tasks.length; i++) {\n\t\t\t\t\tconst t = tasks[i];\n\t\t\t\t\tif (started.has(t.id) || done.has(t.id)) continue;\n\t\t\t\t\tconst blockers = blockedBy(t);\n\t\t\t\t\tif (blockers.length) {\n\t\t\t\t\t\tconst serial = (serialAfter.get(t.id) ?? []).filter((d) => !done.has(d));\n\t\t\t\t\t\tif (serial.length && !serializedAnnounced.has(t.id)) {\n\t\t\t\t\t\t\tserializedAnnounced.add(t.id);\n\t\t\t\t\t\t\tsafeEvent({ type: \"serialize\", id: t.id, after: serial });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst isIsolated = t.isolation === \"worktree\";\n\t\t\t\t\tif (running >= limit || (isIsolated && runningIsolated >= worktreeLimit)) {\n\t\t\t\t\t\tif (!waitedOnCap.has(t.id)) {\n\t\t\t\t\t\t\twaitedOnCap.add(t.id);\n\t\t\t\t\t\t\tsafeEvent({ type: \"wait\", id: t.id, reason: \"concurrency\" });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tstarted.add(t.id);\n\t\t\t\t\trunning++;\n\t\t\t\t\tif (isIsolated) runningIsolated++;\n\t\t\t\t\tstartedOrSettledThisPass = true;\n\t\t\t\t\tprogress = true;\n\t\t\t\t\tsafeEvent({ type: \"start\", id: t.id });\n\t\t\t\t\trun(t, i).then(\n\t\t\t\t\t\t(r) => {\n\t\t\t\t\t\t\trunning--;\n\t\t\t\t\t\t\tif (isIsolated) runningIsolated--;\n\t\t\t\t\t\t\tsettle(i, r);\n\t\t\t\t\t\t\tpump();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(err) => {\n\t\t\t\t\t\t\trunning--;\n\t\t\t\t\t\t\tif (isIsolated) runningIsolated--;\n\t\t\t\t\t\t\tif (!safeSettleWith(i, () => skip(t, i, err instanceof Error ? err.message : String(err)))) return;\n\t\t\t\t\t\t\tpump();\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (done.size === tasks.length) {\n\t\t\t\tif (!settled) {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tresolve(results);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (running === 0 && !startedOrSettledThisPass) {\n\t\t\t\tif (!settled) {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\treject(new Error(\"task graph stalled: no runnable task remains\"));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tpump();\n\t});\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent.d.ts","sourceRoot":"","sources":["../../../src/core/tools/subagent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,KAAK,EAAO,OAAO,EAAS,MAAM,uBAAuB,CAAC;AAGjE,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAI/B,OAAO,KAAK,EAAoB,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"subagent.d.ts","sourceRoot":"","sources":["../../../src/core/tools/subagent.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,7 +23,7 @@ import { getMarkdownTheme } from "../../modes/interactive/theme/theme.js";
|
|
|
23
23
|
import { parseFrontmatter } from "../../utils/frontmatter.js";
|
|
24
24
|
import { withFileMutationQueue } from "./file-mutation-queue.js";
|
|
25
25
|
import { shortenPath } from "./render-utils.js";
|
|
26
|
-
import { currentSubagentDepth, currentTaskId, maxParallelTasks, maxSubagentConcurrency, maxSubagentDepth, PARENT_TASK_ID_ENV, SUBAGENT_DEPTH_ENV, TASK_BASE_REVISION_ENV, TASK_ID_ENV, } from "./subagent-env.js";
|
|
26
|
+
import { currentSubagentDepth, currentTaskId, maxParallelTasks, maxSubagentConcurrency, maxSubagentDepth, maxSubagentWorktrees, PARENT_TASK_ID_ENV, SUBAGENT_DEPTH_ENV, TASK_BASE_REVISION_ENV, TASK_ID_ENV, } from "./subagent-env.js";
|
|
27
27
|
import { runDag, validateTaskGraph } from "./subagent-scheduler.js";
|
|
28
28
|
export { SUBAGENT_DEPTH_ENV } from "./subagent-env.js";
|
|
29
29
|
import { createSubagentWorktree, isGitWorkTree, } from "./subagent-worktree.js";
|
|
@@ -810,6 +810,7 @@ export function createSubagentToolDefinition(cwd) {
|
|
|
810
810
|
id: t.id ?? `${toolCallId}-${i}`,
|
|
811
811
|
dependsOn: t.dependsOn ?? [],
|
|
812
812
|
ownerPaths: t.ownerPaths ?? [],
|
|
813
|
+
isolation: t.isolation,
|
|
813
814
|
}));
|
|
814
815
|
const graphError = validateTaskGraph(graph);
|
|
815
816
|
if (graphError) {
|
|
@@ -864,7 +865,7 @@ export function createSubagentToolDefinition(cwd) {
|
|
|
864
865
|
};
|
|
865
866
|
let results;
|
|
866
867
|
try {
|
|
867
|
-
results = await runDag(graph, maxSubagentConcurrency(), async (g, index) => {
|
|
868
|
+
results = await runDag(graph, { concurrency: maxSubagentConcurrency(), worktrees: maxSubagentWorktrees() }, async (g, index) => {
|
|
868
869
|
const maxAttempts = Math.min(3, Math.max(1, g.onFailure?.maxAttempts ?? 1));
|
|
869
870
|
let attempt = 1;
|
|
870
871
|
let model = g.model;
|