@zhixuan92/multi-model-agent-core 2.8.0 → 3.0.1
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/README.md +10 -6
- package/dist/batch-registry.d.ts +60 -0
- package/dist/batch-registry.d.ts.map +1 -0
- package/dist/batch-registry.js +146 -0
- package/dist/batch-registry.js.map +1 -0
- package/dist/config/load.d.ts +8 -0
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +12 -0
- package/dist/config/load.js.map +1 -1
- package/dist/config/schema.d.ts +37 -15
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +48 -29
- package/dist/config/schema.js.map +1 -1
- package/dist/context/context-block-store.d.ts +8 -0
- package/dist/context/context-block-store.d.ts.map +1 -1
- package/dist/context/context-block-store.js +23 -2
- package/dist/context/context-block-store.js.map +1 -1
- package/dist/executors/audit.d.ts +7 -0
- package/dist/executors/audit.d.ts.map +1 -0
- package/dist/executors/audit.js +140 -0
- package/dist/executors/audit.js.map +1 -0
- package/dist/executors/debug.d.ts +7 -0
- package/dist/executors/debug.d.ts.map +1 -0
- package/dist/executors/debug.js +65 -0
- package/dist/executors/debug.js.map +1 -0
- package/dist/executors/delegate.d.ts +28 -0
- package/dist/executors/delegate.d.ts.map +1 -0
- package/dist/executors/delegate.js +76 -0
- package/dist/executors/delegate.js.map +1 -0
- package/dist/executors/execute-plan.d.ts +11 -0
- package/dist/executors/execute-plan.d.ts.map +1 -0
- package/dist/executors/execute-plan.js +128 -0
- package/dist/executors/execute-plan.js.map +1 -0
- package/dist/executors/index.d.ts +9 -0
- package/dist/executors/index.d.ts.map +1 -0
- package/dist/executors/index.js +10 -0
- package/dist/executors/index.js.map +1 -0
- package/dist/executors/retry.d.ts +20 -0
- package/dist/executors/retry.d.ts.map +1 -0
- package/dist/executors/retry.js +65 -0
- package/dist/executors/retry.js.map +1 -0
- package/dist/executors/review.d.ts +7 -0
- package/dist/executors/review.d.ts.map +1 -0
- package/dist/executors/review.js +128 -0
- package/dist/executors/review.js.map +1 -0
- package/dist/executors/shared-compute.d.ts +4 -0
- package/dist/executors/shared-compute.d.ts.map +1 -0
- package/dist/executors/shared-compute.js +19 -0
- package/dist/executors/shared-compute.js.map +1 -0
- package/dist/executors/types.d.ts +65 -0
- package/dist/executors/types.d.ts.map +1 -0
- package/dist/executors/types.js +2 -0
- package/dist/executors/types.js.map +1 -0
- package/dist/executors/verify.d.ts +7 -0
- package/dist/executors/verify.d.ts.map +1 -0
- package/dist/executors/verify.js +105 -0
- package/dist/executors/verify.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/project-context.d.ts +5 -2
- package/dist/project-context.d.ts.map +1 -1
- package/dist/project-context.js +1 -1
- package/dist/project-context.js.map +1 -1
- package/dist/tool-schemas/audit.d.ts +27 -0
- package/dist/tool-schemas/audit.d.ts.map +1 -0
- package/dist/tool-schemas/audit.js +24 -0
- package/dist/tool-schemas/audit.js.map +1 -0
- package/dist/tool-schemas/debug.d.ts +17 -0
- package/dist/tool-schemas/debug.d.ts.map +1 -0
- package/dist/tool-schemas/debug.js +21 -0
- package/dist/tool-schemas/debug.js.map +1 -0
- package/dist/tool-schemas/delegate.d.ts +19 -0
- package/dist/tool-schemas/delegate.d.ts.map +1 -0
- package/dist/tool-schemas/delegate.js +23 -0
- package/dist/tool-schemas/delegate.js.map +1 -0
- package/dist/tool-schemas/execute-plan.d.ts +16 -0
- package/dist/tool-schemas/execute-plan.d.ts.map +1 -0
- package/dist/tool-schemas/execute-plan.js +23 -0
- package/dist/tool-schemas/execute-plan.js.map +1 -0
- package/dist/tool-schemas/index.d.ts +8 -0
- package/dist/tool-schemas/index.d.ts.map +1 -0
- package/dist/tool-schemas/index.js +9 -0
- package/dist/tool-schemas/index.js.map +1 -0
- package/dist/tool-schemas/retry.d.ts +14 -0
- package/dist/tool-schemas/retry.d.ts.map +1 -0
- package/dist/tool-schemas/retry.js +17 -0
- package/dist/tool-schemas/retry.js.map +1 -0
- package/dist/tool-schemas/review.d.ts +21 -0
- package/dist/tool-schemas/review.d.ts.map +1 -0
- package/dist/tool-schemas/review.js +21 -0
- package/dist/tool-schemas/review.js.map +1 -0
- package/dist/tool-schemas/verify.d.ts +16 -0
- package/dist/tool-schemas/verify.d.ts.map +1 -0
- package/dist/tool-schemas/verify.js +21 -0
- package/dist/tool-schemas/verify.js.map +1 -0
- package/dist/types.d.ts +15 -12
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +77 -1
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// packages/core/src/executors/audit.ts
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { runTasks } from '../run-tasks.js';
|
|
4
|
+
import { computeTimings, computeAggregateCost } from './shared-compute.js';
|
|
5
|
+
// --- Ported from packages/mcp/src/tools/audit-document.ts ---
|
|
6
|
+
function resolveAuditTypeText(auditType) {
|
|
7
|
+
if (auditType === 'general')
|
|
8
|
+
return 'security, performance, correctness, and style';
|
|
9
|
+
if (Array.isArray(auditType))
|
|
10
|
+
return auditType.join(', ');
|
|
11
|
+
return auditType;
|
|
12
|
+
}
|
|
13
|
+
const AUDIT_DONE_CONDITIONS = {
|
|
14
|
+
security: 'Identify all security vulnerabilities (injection, auth bypass, data exposure, OWASP top 10). Each finding has severity (critical/high/medium/low), location, and remediation.',
|
|
15
|
+
performance: 'Identify all performance issues (O(n²) loops, unnecessary allocations, missing caching, blocking I/O). Each finding has impact level, location, and fix recommendation.',
|
|
16
|
+
correctness: 'Identify all logic errors, off-by-one bugs, unhandled edge cases, type mismatches, and contract violations. Each finding has severity, location, and correct behavior.',
|
|
17
|
+
style: 'Identify all style issues (naming, formatting, dead code, inconsistent patterns). Each finding has location and recommended fix.',
|
|
18
|
+
general: 'Identify issues across security, performance, correctness, and style. Each finding has category, severity, location, and remediation.',
|
|
19
|
+
};
|
|
20
|
+
const DELTA_AUDIT_SUFFIX = ' Perform a full audit (do not reduce thoroughness). Verify each prior finding as fixed or unfixed. Omit fixed prior findings from the main report. Include unfixed prior findings and new findings. End with a summary of which prior findings were resolved.';
|
|
21
|
+
function resolveAuditDoneCondition(auditType, hasContextBlocks) {
|
|
22
|
+
let base;
|
|
23
|
+
if (auditType === 'general') {
|
|
24
|
+
base = AUDIT_DONE_CONDITIONS.general;
|
|
25
|
+
}
|
|
26
|
+
else if (Array.isArray(auditType)) {
|
|
27
|
+
base = auditType.map(t => AUDIT_DONE_CONDITIONS[t]).join(' ');
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
base = AUDIT_DONE_CONDITIONS[auditType] ?? AUDIT_DONE_CONDITIONS.general;
|
|
31
|
+
}
|
|
32
|
+
return hasContextBlocks ? base + DELTA_AUDIT_SUFFIX : base;
|
|
33
|
+
}
|
|
34
|
+
function buildFilePathsPrompt(filePaths) {
|
|
35
|
+
if (!filePaths || filePaths.length === 0)
|
|
36
|
+
return '';
|
|
37
|
+
return `Read and analyze these files:\n${filePaths.map(p => `- ${p}`).join('\n')}`;
|
|
38
|
+
}
|
|
39
|
+
function buildPerFilePrompt(filePath, promptTemplate) {
|
|
40
|
+
return `${promptTemplate}\n\nRead and analyze this file:\n- ${filePath}`;
|
|
41
|
+
}
|
|
42
|
+
function buildAuditPrompt(auditTypeText, document, filePaths, hasContextBlocks) {
|
|
43
|
+
const parts = [`Audit for ${auditTypeText} issues.`];
|
|
44
|
+
if (document)
|
|
45
|
+
parts.push(`Document:\n\n${document}`);
|
|
46
|
+
const fileSection = buildFilePathsPrompt(filePaths);
|
|
47
|
+
if (fileSection)
|
|
48
|
+
parts.push(fileSection);
|
|
49
|
+
if (hasContextBlocks) {
|
|
50
|
+
parts.push('A prior audit report is provided as context above.', 'First, verify which prior findings have been fixed. Then perform a full audit as normal — do not skip areas or reduce thoroughness.', 'In your output:', '- **Omit** prior findings that have been fixed — do not re-report them.', '- **Include** prior findings that are still present (mark as "unfixed from prior audit").', '- **Include** any new findings not in the prior report.', '- End with a **Fixed** summary listing which prior findings were resolved.');
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
parts.push('Provide a structured audit report with findings and severity.');
|
|
54
|
+
}
|
|
55
|
+
return parts.join('\n\n');
|
|
56
|
+
}
|
|
57
|
+
function hasContent(value) {
|
|
58
|
+
return value !== undefined && value.trim().length > 0;
|
|
59
|
+
}
|
|
60
|
+
function resolveDispatchMode(inlineContent, filePaths) {
|
|
61
|
+
if (hasContent(inlineContent))
|
|
62
|
+
return 'single';
|
|
63
|
+
const validPaths = (filePaths ?? []).filter(p => p.trim().length > 0);
|
|
64
|
+
if (validPaths.length >= 2)
|
|
65
|
+
return 'fan_out';
|
|
66
|
+
return 'single';
|
|
67
|
+
}
|
|
68
|
+
function autoRegisterContextBlock(results, store) {
|
|
69
|
+
if (!store)
|
|
70
|
+
return undefined;
|
|
71
|
+
const usable = results.filter(r => !r.outputIsDiagnostic && r.output.trim().length > 0);
|
|
72
|
+
if (usable.length === 0)
|
|
73
|
+
return undefined;
|
|
74
|
+
const combined = usable.map(r => r.output).join('\n\n---\n\n');
|
|
75
|
+
const { id } = store.register(combined);
|
|
76
|
+
return id;
|
|
77
|
+
}
|
|
78
|
+
export async function executeAudit(ctx, input) {
|
|
79
|
+
const { config, contextBlockStore } = ctx;
|
|
80
|
+
const hasContextBlocks = Array.isArray(input.contextBlockIds) && input.contextBlockIds.length > 0;
|
|
81
|
+
const parentModel = ctx.parentModel ?? config.defaults?.parentModel ?? undefined;
|
|
82
|
+
const baseTaskSpec = {
|
|
83
|
+
agentType: 'complex',
|
|
84
|
+
reviewPolicy: 'off',
|
|
85
|
+
briefQualityPolicy: 'off',
|
|
86
|
+
done: resolveAuditDoneCondition(input.auditType, hasContextBlocks),
|
|
87
|
+
tools: config.defaults?.tools ?? 'full',
|
|
88
|
+
timeoutMs: config.defaults?.timeoutMs ?? 1_800_000,
|
|
89
|
+
maxCostUSD: config.defaults?.maxCostUSD ?? 10,
|
|
90
|
+
sandboxPolicy: config.defaults?.sandboxPolicy ?? 'cwd-only',
|
|
91
|
+
cwd: ctx.projectContext.cwd,
|
|
92
|
+
contextBlockIds: input.contextBlockIds,
|
|
93
|
+
parentModel,
|
|
94
|
+
};
|
|
95
|
+
const runtime = contextBlockStore ? { contextBlockStore } : undefined;
|
|
96
|
+
const mode = resolveDispatchMode(input.document, input.filePaths);
|
|
97
|
+
if (mode === 'fan_out') {
|
|
98
|
+
const validPaths = input.filePaths.filter(p => p.trim().length > 0);
|
|
99
|
+
const auditTypeText = resolveAuditTypeText(input.auditType);
|
|
100
|
+
const promptTemplate = buildAuditPrompt(auditTypeText, undefined, undefined, hasContextBlocks);
|
|
101
|
+
const tasks = validPaths.map(fp => ({
|
|
102
|
+
...baseTaskSpec,
|
|
103
|
+
prompt: buildPerFilePrompt(fp, promptTemplate),
|
|
104
|
+
}));
|
|
105
|
+
const startMs = Date.now();
|
|
106
|
+
const results = await runTasks(tasks, config, { runtime });
|
|
107
|
+
const wallClockMs = Date.now() - startMs;
|
|
108
|
+
const ctxId = autoRegisterContextBlock(results, contextBlockStore);
|
|
109
|
+
const batchTimings = computeTimings(wallClockMs, results);
|
|
110
|
+
const costSummary = computeAggregateCost(results);
|
|
111
|
+
return {
|
|
112
|
+
results,
|
|
113
|
+
headline: '',
|
|
114
|
+
batchTimings,
|
|
115
|
+
costSummary,
|
|
116
|
+
batchId: randomUUID(),
|
|
117
|
+
wallClockMs,
|
|
118
|
+
parentModel,
|
|
119
|
+
...(ctxId !== undefined && { contextBlockId: ctxId }),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
// Single-task mode
|
|
123
|
+
const auditTypeText = resolveAuditTypeText(input.auditType);
|
|
124
|
+
const prompt = buildAuditPrompt(auditTypeText, input.document, input.filePaths, hasContextBlocks);
|
|
125
|
+
const results = await runTasks([{ ...baseTaskSpec, prompt }], config, { runtime });
|
|
126
|
+
const ctxId = autoRegisterContextBlock(results, contextBlockStore);
|
|
127
|
+
const batchTimings = computeTimings(0, results);
|
|
128
|
+
const costSummary = computeAggregateCost(results);
|
|
129
|
+
return {
|
|
130
|
+
results,
|
|
131
|
+
headline: '',
|
|
132
|
+
batchTimings,
|
|
133
|
+
costSummary,
|
|
134
|
+
batchId: randomUUID(),
|
|
135
|
+
wallClockMs: 0,
|
|
136
|
+
parentModel,
|
|
137
|
+
...(ctxId !== undefined && { contextBlockId: ctxId }),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/executors/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ExecutionContext, ExecutorOutput } from './types.js';
|
|
2
|
+
import type { Input } from '../tool-schemas/debug.js';
|
|
3
|
+
export interface DebugOutput extends ExecutorOutput {
|
|
4
|
+
contextBlockId?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function executeDebug(ctx: ExecutionContext, input: Input): Promise<DebugOutput>;
|
|
7
|
+
//# sourceMappingURL=debug.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/executors/debug.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAwBtD,MAAM,WAAW,WAAY,SAAQ,cAAc;IACjD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,YAAY,CAChC,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,WAAW,CAAC,CA6CtB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// packages/core/src/executors/debug.ts
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { runTasks } from '../run-tasks.js';
|
|
4
|
+
import { computeTimings, computeAggregateCost } from './shared-compute.js';
|
|
5
|
+
// --- Ported from packages/mcp/src/tools/debug-task.ts ---
|
|
6
|
+
function buildFilePathsPrompt(filePaths) {
|
|
7
|
+
if (!filePaths || filePaths.length === 0)
|
|
8
|
+
return '';
|
|
9
|
+
return `Read and analyze these files:\n${filePaths.map(p => `- ${p}`).join('\n')}`;
|
|
10
|
+
}
|
|
11
|
+
function autoRegisterContextBlock(results, store) {
|
|
12
|
+
if (!store)
|
|
13
|
+
return undefined;
|
|
14
|
+
const usable = results.filter(r => !r.outputIsDiagnostic && r.output.trim().length > 0);
|
|
15
|
+
if (usable.length === 0)
|
|
16
|
+
return undefined;
|
|
17
|
+
const combined = usable.map(r => r.output).join('\n\n---\n\n');
|
|
18
|
+
const { id } = store.register(combined);
|
|
19
|
+
return id;
|
|
20
|
+
}
|
|
21
|
+
export async function executeDebug(ctx, input) {
|
|
22
|
+
const { config, contextBlockStore } = ctx;
|
|
23
|
+
const parts = [`Debug this problem:\n\n${input.problem}`];
|
|
24
|
+
if (input.context)
|
|
25
|
+
parts.push(`Context: ${input.context}`);
|
|
26
|
+
if (input.hypothesis)
|
|
27
|
+
parts.push(`Initial hypothesis: ${input.hypothesis}`);
|
|
28
|
+
const fileSection = buildFilePathsPrompt(input.filePaths);
|
|
29
|
+
if (fileSection)
|
|
30
|
+
parts.push(fileSection);
|
|
31
|
+
parts.push('Use hypothesis-driven debugging: identify root cause, propose fix, verify.');
|
|
32
|
+
const prompt = parts.join('\n\n');
|
|
33
|
+
const parentModel = ctx.parentModel ?? config.defaults?.parentModel ?? undefined;
|
|
34
|
+
const taskSpec = {
|
|
35
|
+
agentType: 'complex',
|
|
36
|
+
reviewPolicy: 'full',
|
|
37
|
+
briefQualityPolicy: 'off',
|
|
38
|
+
done: 'Identify the root cause with evidence (file, line, mechanism). Propose a fix. Verify the fix resolves the problem.',
|
|
39
|
+
maxReviewRounds: 1,
|
|
40
|
+
tools: config.defaults?.tools ?? 'full',
|
|
41
|
+
timeoutMs: config.defaults?.timeoutMs ?? 1_800_000,
|
|
42
|
+
maxCostUSD: config.defaults?.maxCostUSD ?? 10,
|
|
43
|
+
sandboxPolicy: config.defaults?.sandboxPolicy ?? 'cwd-only',
|
|
44
|
+
cwd: ctx.projectContext.cwd,
|
|
45
|
+
contextBlockIds: input.contextBlockIds,
|
|
46
|
+
parentModel,
|
|
47
|
+
autoCommit: true,
|
|
48
|
+
};
|
|
49
|
+
const runtime = contextBlockStore ? { contextBlockStore } : undefined;
|
|
50
|
+
const results = await runTasks([{ ...taskSpec, prompt }], config, { runtime });
|
|
51
|
+
const ctxId = autoRegisterContextBlock(results, contextBlockStore);
|
|
52
|
+
const batchTimings = computeTimings(0, results);
|
|
53
|
+
const costSummary = computeAggregateCost(results);
|
|
54
|
+
return {
|
|
55
|
+
results,
|
|
56
|
+
headline: '',
|
|
57
|
+
batchTimings,
|
|
58
|
+
costSummary,
|
|
59
|
+
batchId: randomUUID(),
|
|
60
|
+
wallClockMs: 0,
|
|
61
|
+
parentModel,
|
|
62
|
+
...(ctxId !== undefined && { contextBlockId: ctxId }),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=debug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/executors/debug.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ExecutionContext, ExecutorOutput } from './types.js';
|
|
2
|
+
import type { Input } from '../tool-schemas/delegate.js';
|
|
3
|
+
import type { TaskSpec } from '../types.js';
|
|
4
|
+
import { runTasks } from '../run-tasks.js';
|
|
5
|
+
import type { RunTasksOptions } from '../run-tasks.js';
|
|
6
|
+
import type { ClarificationEntry } from '../intake/types.js';
|
|
7
|
+
export interface DelegateOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Injects harness-level defaults (tools, timeoutMs, cwd, etc.) into each TaskSpec.
|
|
10
|
+
* Provided by the MCP layer; a future REST layer will supply its own implementation.
|
|
11
|
+
*/
|
|
12
|
+
injectDefaults: (tasks: TaskSpec[]) => TaskSpec[];
|
|
13
|
+
/**
|
|
14
|
+
* Optional override for `runTasks` — used in tests to inject a mock implementation.
|
|
15
|
+
*/
|
|
16
|
+
runTasksOverride?: typeof runTasks;
|
|
17
|
+
/**
|
|
18
|
+
* Optional progress callback passed through to runTasks.
|
|
19
|
+
*/
|
|
20
|
+
onProgress?: RunTasksOptions['onProgress'];
|
|
21
|
+
}
|
|
22
|
+
export interface DelegateOutput extends ExecutorOutput {
|
|
23
|
+
clarifications?: ClarificationEntry[];
|
|
24
|
+
tasks: TaskSpec[];
|
|
25
|
+
wallClockMs: number;
|
|
26
|
+
}
|
|
27
|
+
export declare function executeDelegate(ctx: ExecutionContext, input: Input, options: DelegateOptions): Promise<DelegateOutput>;
|
|
28
|
+
//# sourceMappingURL=delegate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegate.d.ts","sourceRoot":"","sources":["../../src/executors/delegate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAa,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAIvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,cAAc,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,CAAC;IAClD;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,QAAQ,CAAC;IACnC;;OAEG;IACH,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD,cAAc,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACtC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,eAAe,CACnC,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,CAAC,CAoEzB"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// packages/core/src/executors/delegate.ts
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { runTasks } from '../run-tasks.js';
|
|
4
|
+
import { compileDelegateTasks } from '../intake/compilers/delegate.js';
|
|
5
|
+
import { runIntakePipeline } from '../intake/pipeline.js';
|
|
6
|
+
import { computeTimings, computeAggregateCost } from './shared-compute.js';
|
|
7
|
+
export async function executeDelegate(ctx, input, options) {
|
|
8
|
+
const { config, projectContext, contextBlockStore } = ctx;
|
|
9
|
+
const { injectDefaults, onProgress } = options;
|
|
10
|
+
const runTasksImpl = options.runTasksOverride ?? runTasks;
|
|
11
|
+
const { batchCache, clarifications: clarificationStore } = projectContext;
|
|
12
|
+
// Intake pipeline: compile → infer → classify → resolve
|
|
13
|
+
const requestId = randomUUID();
|
|
14
|
+
const drafts = compileDelegateTasks(input.tasks, requestId);
|
|
15
|
+
const intakeResult = runIntakePipeline(drafts, config, contextBlockStore);
|
|
16
|
+
let results = [];
|
|
17
|
+
const readySpecs = intakeResult.ready.map(r => r.task);
|
|
18
|
+
const batchId = batchCache.remember(readySpecs.length > 0 ? readySpecs : input.tasks);
|
|
19
|
+
const batchStartMs = Date.now();
|
|
20
|
+
let batchAborted = false;
|
|
21
|
+
try {
|
|
22
|
+
if (readySpecs.length > 0) {
|
|
23
|
+
const resolvedTasks = injectDefaults(readySpecs);
|
|
24
|
+
results = await runTasksImpl(resolvedTasks, config, {
|
|
25
|
+
onProgress,
|
|
26
|
+
runtime: { contextBlockStore },
|
|
27
|
+
});
|
|
28
|
+
intakeResult.intakeProgress.executedDrafts = results.length;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
batchAborted = true;
|
|
33
|
+
throw err;
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
if (batchAborted) {
|
|
37
|
+
try {
|
|
38
|
+
batchCache.abort(batchId);
|
|
39
|
+
}
|
|
40
|
+
catch { /* already terminal */ }
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
try {
|
|
44
|
+
batchCache.complete(batchId, results);
|
|
45
|
+
}
|
|
46
|
+
catch { /* already terminal */ }
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const wallClockMs = Date.now() - batchStartMs;
|
|
50
|
+
// Create clarification set if needed
|
|
51
|
+
let clarificationId;
|
|
52
|
+
if (intakeResult.clarifications.length > 0) {
|
|
53
|
+
const storedDrafts = intakeResult.clarifications.map(c => ({
|
|
54
|
+
draft: drafts.find(d => d.draftId === c.draftId),
|
|
55
|
+
taskIndex: c.taskIndex,
|
|
56
|
+
roundCount: 0,
|
|
57
|
+
}));
|
|
58
|
+
clarificationId = clarificationStore.create(storedDrafts, batchId);
|
|
59
|
+
}
|
|
60
|
+
const batchTimings = computeTimings(wallClockMs, results);
|
|
61
|
+
const costSummary = computeAggregateCost(results);
|
|
62
|
+
const parentModel = ctx.parentModel ?? config.defaults?.parentModel ?? undefined;
|
|
63
|
+
return {
|
|
64
|
+
results,
|
|
65
|
+
headline: '', // composed by the caller using composeHeadline
|
|
66
|
+
batchTimings,
|
|
67
|
+
costSummary,
|
|
68
|
+
batchId,
|
|
69
|
+
tasks: readySpecs,
|
|
70
|
+
wallClockMs,
|
|
71
|
+
parentModel,
|
|
72
|
+
...(clarificationId !== undefined && { clarificationId }),
|
|
73
|
+
...(intakeResult.clarifications.length > 0 && { clarifications: intakeResult.clarifications }),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=delegate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegate.js","sourceRoot":"","sources":["../../src/executors/delegate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ExecutionContext, ExecutorOutput } from './types.js';
|
|
2
|
+
import type { Input } from '../tool-schemas/execute-plan.js';
|
|
3
|
+
export interface ExecutePlanValidationError {
|
|
4
|
+
error: string;
|
|
5
|
+
isError: true;
|
|
6
|
+
}
|
|
7
|
+
export interface ExecutePlanOutput extends ExecutorOutput {
|
|
8
|
+
contextBlockId?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function executeExecutePlan(ctx: ExecutionContext, input: Input): Promise<ExecutePlanOutput | ExecutePlanValidationError>;
|
|
11
|
+
//# sourceMappingURL=execute-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-plan.d.ts","sourceRoot":"","sources":["../../src/executors/execute-plan.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AA4C7D,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,IAAI,CAAC;CACf;AAED,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,iBAAiB,GAAG,0BAA0B,CAAC,CAwGzD"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// packages/core/src/executors/execute-plan.ts
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { readFile } from 'node:fs/promises';
|
|
4
|
+
import { runTasks, extractPlanSection } from '../run-tasks.js';
|
|
5
|
+
import { computeTimings, computeAggregateCost } from './shared-compute.js';
|
|
6
|
+
// --- Ported from packages/mcp/src/tools/execute-plan.ts ---
|
|
7
|
+
function buildExecutePlanPrompt(fileContents, task, context) {
|
|
8
|
+
const parts = [
|
|
9
|
+
'Below are the plan and/or spec documents for this project:',
|
|
10
|
+
'',
|
|
11
|
+
'---',
|
|
12
|
+
fileContents,
|
|
13
|
+
'---',
|
|
14
|
+
'',
|
|
15
|
+
'Execute the following task from the documents above:',
|
|
16
|
+
'',
|
|
17
|
+
`Requested task: "${task}"`,
|
|
18
|
+
];
|
|
19
|
+
if (context) {
|
|
20
|
+
parts.push('', `Additional context: ${context}`);
|
|
21
|
+
}
|
|
22
|
+
parts.push('', 'Find this task in the plan/spec documents above (not in any preceding context blocks),', 'understand its requirements, and implement it fully.', 'Follow any acceptance criteria, file paths, and constraints specified in the plan.', 'If you cannot find a unique matching task, report that no match was found and do not implement anything.');
|
|
23
|
+
return parts.join('\n');
|
|
24
|
+
}
|
|
25
|
+
function autoRegisterContextBlock(results, store) {
|
|
26
|
+
if (!store)
|
|
27
|
+
return undefined;
|
|
28
|
+
const usable = results.filter(r => !r.outputIsDiagnostic && r.output.trim().length > 0);
|
|
29
|
+
if (usable.length === 0)
|
|
30
|
+
return undefined;
|
|
31
|
+
const combined = usable.map(r => r.output).join('\n\n---\n\n');
|
|
32
|
+
const { id } = store.register(combined);
|
|
33
|
+
return id;
|
|
34
|
+
}
|
|
35
|
+
export async function executeExecutePlan(ctx, input) {
|
|
36
|
+
const { config, contextBlockStore } = ctx;
|
|
37
|
+
const filePaths = input.filePaths;
|
|
38
|
+
const validPaths = (filePaths ?? []).filter(p => p.trim().length > 0);
|
|
39
|
+
if (validPaths.length === 0) {
|
|
40
|
+
return {
|
|
41
|
+
error: 'Provide filePaths with at least one plan or spec file',
|
|
42
|
+
isError: true,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// Read all plan/spec files
|
|
46
|
+
let fileContents;
|
|
47
|
+
try {
|
|
48
|
+
const contents = await Promise.all(validPaths.map(async (fp) => {
|
|
49
|
+
const content = await readFile(fp, 'utf-8');
|
|
50
|
+
return `--- ${fp} ---\n${content}`;
|
|
51
|
+
}));
|
|
52
|
+
fileContents = contents.join('\n\n');
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
return {
|
|
56
|
+
error: `Error reading plan files: ${err instanceof Error ? err.message : String(err)}`,
|
|
57
|
+
isError: true,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const parentModel = ctx.parentModel ?? config.defaults?.parentModel ?? undefined;
|
|
61
|
+
const baseTaskSpec = {
|
|
62
|
+
agentType: 'standard',
|
|
63
|
+
reviewPolicy: 'full',
|
|
64
|
+
briefQualityPolicy: 'off',
|
|
65
|
+
done: 'Implement the task fully. Report: which task heading you matched, what files were created or modified, and any issues encountered. If no unique matching task was found, report that explicitly and do not implement anything.',
|
|
66
|
+
tools: config.defaults?.tools ?? 'full',
|
|
67
|
+
timeoutMs: config.defaults?.timeoutMs ?? 1_800_000,
|
|
68
|
+
maxCostUSD: config.defaults?.maxCostUSD ?? 10,
|
|
69
|
+
sandboxPolicy: config.defaults?.sandboxPolicy ?? 'cwd-only',
|
|
70
|
+
cwd: ctx.projectContext.cwd,
|
|
71
|
+
contextBlockIds: input.contextBlockIds,
|
|
72
|
+
parentModel,
|
|
73
|
+
autoCommit: true,
|
|
74
|
+
};
|
|
75
|
+
const runtime = contextBlockStore ? { contextBlockStore } : undefined;
|
|
76
|
+
const tasks = input.tasks.map(task => ({
|
|
77
|
+
...baseTaskSpec,
|
|
78
|
+
prompt: buildExecutePlanPrompt(fileContents, task, input.context),
|
|
79
|
+
}));
|
|
80
|
+
// Inject plan section context so spec reviewer checks implementation against the plan
|
|
81
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
82
|
+
const section = await extractPlanSection(validPaths, input.tasks[i], baseTaskSpec.cwd);
|
|
83
|
+
if (section) {
|
|
84
|
+
tasks[i].planContext = section;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (tasks.length === 1) {
|
|
88
|
+
const results = await runTasks(tasks, config, { runtime });
|
|
89
|
+
const result = results[0];
|
|
90
|
+
if (!result) {
|
|
91
|
+
return {
|
|
92
|
+
error: 'task produced no result',
|
|
93
|
+
isError: true,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const ctxId = autoRegisterContextBlock(results, contextBlockStore);
|
|
97
|
+
const batchTimings = computeTimings(0, results);
|
|
98
|
+
const costSummary = computeAggregateCost(results);
|
|
99
|
+
return {
|
|
100
|
+
results,
|
|
101
|
+
headline: '',
|
|
102
|
+
batchTimings,
|
|
103
|
+
costSummary,
|
|
104
|
+
batchId: randomUUID(),
|
|
105
|
+
wallClockMs: 0,
|
|
106
|
+
parentModel,
|
|
107
|
+
...(ctxId !== undefined && { contextBlockId: ctxId }),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
// Multiple tasks = fan out (parallel)
|
|
111
|
+
const startMs = Date.now();
|
|
112
|
+
const results = await runTasks(tasks, config, { runtime });
|
|
113
|
+
const wallClockMs = Date.now() - startMs;
|
|
114
|
+
const ctxId = autoRegisterContextBlock(results, contextBlockStore);
|
|
115
|
+
const batchTimings = computeTimings(wallClockMs, results);
|
|
116
|
+
const costSummary = computeAggregateCost(results);
|
|
117
|
+
return {
|
|
118
|
+
results,
|
|
119
|
+
headline: '',
|
|
120
|
+
batchTimings,
|
|
121
|
+
costSummary,
|
|
122
|
+
batchId: randomUUID(),
|
|
123
|
+
wallClockMs,
|
|
124
|
+
parentModel,
|
|
125
|
+
...(ctxId !== undefined && { contextBlockId: ctxId }),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=execute-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-plan.js","sourceRoot":"","sources":["../../src/executors/execute-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './types.js';
|
|
2
|
+
export { executeDelegate } from './delegate.js';
|
|
3
|
+
export { executeAudit } from './audit.js';
|
|
4
|
+
export { executeReview } from './review.js';
|
|
5
|
+
export { executeVerify } from './verify.js';
|
|
6
|
+
export { executeDebug } from './debug.js';
|
|
7
|
+
export { executeExecutePlan } from './execute-plan.js';
|
|
8
|
+
export { executeRetry } from './retry.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/executors/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// packages/core/src/executors/index.ts
|
|
2
|
+
export * from './types.js';
|
|
3
|
+
export { executeDelegate } from './delegate.js';
|
|
4
|
+
export { executeAudit } from './audit.js';
|
|
5
|
+
export { executeReview } from './review.js';
|
|
6
|
+
export { executeVerify } from './verify.js';
|
|
7
|
+
export { executeDebug } from './debug.js';
|
|
8
|
+
export { executeExecutePlan } from './execute-plan.js';
|
|
9
|
+
export { executeRetry } from './retry.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/executors/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ExecutionContext, ExecutorOutput } from './types.js';
|
|
2
|
+
import type { Input } from '../tool-schemas/retry.js';
|
|
3
|
+
import type { TaskSpec } from '../types.js';
|
|
4
|
+
import { runTasks } from '../run-tasks.js';
|
|
5
|
+
export interface RetryOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Injects harness-level defaults (tools, timeoutMs, cwd, etc.) into each TaskSpec.
|
|
8
|
+
* Provided by the MCP layer.
|
|
9
|
+
*/
|
|
10
|
+
injectDefaults: (tasks: TaskSpec[]) => TaskSpec[];
|
|
11
|
+
/**
|
|
12
|
+
* Optional override for `runTasks` — used in tests to inject a mock implementation.
|
|
13
|
+
*/
|
|
14
|
+
runTasksOverride?: typeof runTasks;
|
|
15
|
+
}
|
|
16
|
+
export interface RetryOutput extends ExecutorOutput {
|
|
17
|
+
retryBatchId: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function executeRetry(ctx: ExecutionContext, input: Input, options: RetryOptions): Promise<RetryOutput>;
|
|
20
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/executors/retry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAK3C,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,cAAc,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,CAAC;IAClD;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,QAAQ,CAAC;CACpC;AAED,MAAM,WAAW,WAAY,SAAQ,cAAc;IACjD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,YAAY,CAChC,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,WAAW,CAAC,CA6DtB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { runTasks } from '../run-tasks.js';
|
|
2
|
+
import { computeTimings, computeAggregateCost } from './shared-compute.js';
|
|
3
|
+
export async function executeRetry(ctx, input, options) {
|
|
4
|
+
const { config, projectContext, contextBlockStore } = ctx;
|
|
5
|
+
const { batchCache } = projectContext;
|
|
6
|
+
const { injectDefaults } = options;
|
|
7
|
+
const runTasksImpl = options.runTasksOverride ?? runTasks;
|
|
8
|
+
const batch = batchCache.get(input.batchId);
|
|
9
|
+
if (!batch) {
|
|
10
|
+
throw new Error(`batch "${input.batchId}" is unknown or expired — re-dispatch with full task specs via delegate_tasks`);
|
|
11
|
+
}
|
|
12
|
+
// Mark this batch as recently used so the LRU eviction does not
|
|
13
|
+
// drop a hot entry when newer batches arrive. Does NOT refresh TTL.
|
|
14
|
+
batchCache.touch(input.batchId);
|
|
15
|
+
for (const i of input.taskIndices) {
|
|
16
|
+
if (i < 0 || i >= batch.tasks.length) {
|
|
17
|
+
throw new Error(`index ${i} is out of range for batch ${input.batchId} (size ${batch.tasks.length})`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const subset = input.taskIndices.map((i) => batch.tasks[i]);
|
|
21
|
+
// Create a fresh batch for the retried tasks so the original batch
|
|
22
|
+
// entry is preserved and get_batch_slice can still retrieve it.
|
|
23
|
+
const retryBatchId = batchCache.remember(subset);
|
|
24
|
+
const batchStartMs = Date.now();
|
|
25
|
+
let results = [];
|
|
26
|
+
let retryAborted = false;
|
|
27
|
+
try {
|
|
28
|
+
results = await runTasksImpl(injectDefaults(subset), config, {
|
|
29
|
+
runtime: { contextBlockStore },
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
retryAborted = true;
|
|
34
|
+
throw err;
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
if (retryAborted) {
|
|
38
|
+
try {
|
|
39
|
+
batchCache.abort(retryBatchId);
|
|
40
|
+
}
|
|
41
|
+
catch { /* already terminal */ }
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
try {
|
|
45
|
+
batchCache.complete(retryBatchId, results);
|
|
46
|
+
}
|
|
47
|
+
catch { /* already terminal */ }
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const wallClockMs = Date.now() - batchStartMs;
|
|
51
|
+
const batchTimings = computeTimings(wallClockMs, results);
|
|
52
|
+
const costSummary = computeAggregateCost(results);
|
|
53
|
+
const parentModel = ctx.parentModel ?? config.defaults?.parentModel ?? undefined;
|
|
54
|
+
return {
|
|
55
|
+
results,
|
|
56
|
+
headline: '',
|
|
57
|
+
batchTimings,
|
|
58
|
+
costSummary,
|
|
59
|
+
batchId: retryBatchId,
|
|
60
|
+
retryBatchId,
|
|
61
|
+
wallClockMs,
|
|
62
|
+
parentModel,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/executors/retry.ts"],"names":[],"mappings":"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"}
|