@zhixuan92/multi-model-agent-core 5.0.3 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/events/plain-log-entry.d.ts +1 -1
- package/dist/events/plain-log-entry.d.ts.map +1 -1
- package/dist/events/plain-log-entry.js +5 -1
- package/dist/events/plain-log-entry.js.map +1 -1
- package/dist/events/wire-schema.d.ts +4 -4
- package/dist/lifecycle/derive-completion.d.ts +4 -0
- package/dist/lifecycle/derive-completion.d.ts.map +1 -1
- package/dist/lifecycle/derive-completion.js +14 -1
- package/dist/lifecycle/derive-completion.js.map +1 -1
- package/dist/lifecycle/git-exec.d.ts +62 -0
- package/dist/lifecycle/git-exec.d.ts.map +1 -0
- package/dist/lifecycle/git-exec.js +135 -0
- package/dist/lifecycle/git-exec.js.map +1 -0
- package/dist/lifecycle/goal-builder.d.ts +35 -0
- package/dist/lifecycle/goal-builder.d.ts.map +1 -0
- package/dist/lifecycle/goal-builder.js +56 -0
- package/dist/lifecycle/goal-builder.js.map +1 -0
- package/dist/lifecycle/goal-preconditions.d.ts +21 -0
- package/dist/lifecycle/goal-preconditions.d.ts.map +1 -0
- package/dist/lifecycle/goal-preconditions.js +33 -0
- package/dist/lifecycle/goal-preconditions.js.map +1 -0
- package/dist/lifecycle/goal-prompts.d.ts +27 -0
- package/dist/lifecycle/goal-prompts.d.ts.map +1 -0
- package/dist/lifecycle/goal-prompts.js +204 -0
- package/dist/lifecycle/goal-prompts.js.map +1 -0
- package/dist/lifecycle/goal-report.d.ts +42 -0
- package/dist/lifecycle/goal-report.d.ts.map +1 -0
- package/dist/lifecycle/goal-report.js +125 -0
- package/dist/lifecycle/goal-report.js.map +1 -0
- package/dist/lifecycle/handlers/annotate-stage.d.ts.map +1 -1
- package/dist/lifecycle/handlers/annotate-stage.js +27 -0
- package/dist/lifecycle/handlers/annotate-stage.js.map +1 -1
- package/dist/lifecycle/handlers/prepare-execution-context-handler.d.ts +3 -3
- package/dist/lifecycle/handlers/prepare-execution-context-handler.d.ts.map +1 -1
- package/dist/lifecycle/handlers/prepare-execution-context-handler.js +3 -25
- package/dist/lifecycle/handlers/prepare-execution-context-handler.js.map +1 -1
- package/dist/lifecycle/handlers/review-fix-stage.d.ts +9 -0
- package/dist/lifecycle/handlers/review-fix-stage.d.ts.map +1 -0
- package/dist/lifecycle/handlers/review-fix-stage.js +75 -0
- package/dist/lifecycle/handlers/review-fix-stage.js.map +1 -0
- package/dist/lifecycle/handlers/terminal-handlers.d.ts.map +1 -1
- package/dist/lifecycle/handlers/terminal-handlers.js +15 -3
- package/dist/lifecycle/handlers/terminal-handlers.js.map +1 -1
- package/dist/lifecycle/stage-io.d.ts +0 -23
- package/dist/lifecycle/stage-io.d.ts.map +1 -1
- package/dist/lifecycle/stage-io.js +0 -11
- package/dist/lifecycle/stage-io.js.map +1 -1
- package/dist/lifecycle/stage-plan-builder.d.ts.map +1 -1
- package/dist/lifecycle/stage-plan-builder.js +42 -49
- package/dist/lifecycle/stage-plan-builder.js.map +1 -1
- package/dist/lifecycle/stage-plan-types.d.ts +8 -8
- package/dist/lifecycle/stage-plan-types.d.ts.map +1 -1
- package/dist/lifecycle/stage-plan-types.js.map +1 -1
- package/dist/lifecycle/task-executor.d.ts.map +1 -1
- package/dist/lifecycle/task-executor.js +46 -1
- package/dist/lifecycle/task-executor.js.map +1 -1
- package/dist/lifecycle/task-runner.d.ts.map +1 -1
- package/dist/lifecycle/task-runner.js +3 -1
- package/dist/lifecycle/task-runner.js.map +1 -1
- package/dist/lifecycle/write-goal-lock.d.ts +29 -0
- package/dist/lifecycle/write-goal-lock.d.ts.map +1 -0
- package/dist/lifecycle/write-goal-lock.js +70 -0
- package/dist/lifecycle/write-goal-lock.js.map +1 -0
- package/dist/providers/claude-session.d.ts.map +1 -1
- package/dist/providers/claude-session.js +14 -0
- package/dist/providers/claude-session.js.map +1 -1
- package/dist/research/adapters/arxiv.d.ts.map +1 -1
- package/dist/research/adapters/arxiv.js +6 -1
- package/dist/research/adapters/arxiv.js.map +1 -1
- package/dist/tools/delegate/brief-slot.d.ts +14 -11
- package/dist/tools/delegate/brief-slot.d.ts.map +1 -1
- package/dist/tools/delegate/brief-slot.js +29 -53
- package/dist/tools/delegate/brief-slot.js.map +1 -1
- package/dist/tools/delegate/schema.d.ts +0 -4
- package/dist/tools/delegate/schema.d.ts.map +1 -1
- package/dist/tools/delegate/schema.js +3 -2
- package/dist/tools/delegate/schema.js.map +1 -1
- package/dist/tools/delegate/tool-config.d.ts.map +1 -1
- package/dist/tools/delegate/tool-config.js +20 -17
- package/dist/tools/delegate/tool-config.js.map +1 -1
- package/dist/tools/execute-plan/brief-slot.d.ts +11 -5
- package/dist/tools/execute-plan/brief-slot.d.ts.map +1 -1
- package/dist/tools/execute-plan/brief-slot.js +57 -13
- package/dist/tools/execute-plan/brief-slot.js.map +1 -1
- package/dist/tools/execute-plan/tool-config.d.ts.map +1 -1
- package/dist/tools/execute-plan/tool-config.js +18 -67
- package/dist/tools/execute-plan/tool-config.js.map +1 -1
- package/dist/tools/journal/record/brief-slot.d.ts +9 -6
- package/dist/tools/journal/record/brief-slot.d.ts.map +1 -1
- package/dist/tools/journal/record/brief-slot.js +18 -14
- package/dist/tools/journal/record/brief-slot.js.map +1 -1
- package/dist/tools/journal/record/tool-config.d.ts.map +1 -1
- package/dist/tools/journal/record/tool-config.js +18 -11
- package/dist/tools/journal/record/tool-config.js.map +1 -1
- package/dist/tools/retry/brief-slot.d.ts +1 -1
- package/dist/tools/retry/brief-slot.d.ts.map +1 -1
- package/dist/tools/retry/brief-slot.js +2 -1
- package/dist/tools/retry/brief-slot.js.map +1 -1
- package/dist/tools/retry/schema.d.ts +0 -1
- package/dist/tools/retry/schema.d.ts.map +1 -1
- package/dist/tools/retry/schema.js +6 -6
- package/dist/tools/retry/schema.js.map +1 -1
- package/dist/tools/retry/tool-config.d.ts.map +1 -1
- package/dist/tools/retry/tool-config.js +23 -28
- package/dist/tools/retry/tool-config.js.map +1 -1
- package/dist/types/goal.d.ts +47 -0
- package/dist/types/goal.d.ts.map +1 -0
- package/dist/types/goal.js +2 -0
- package/dist/types/goal.js.map +1 -0
- package/dist/types/task-spec.d.ts +11 -0
- package/dist/types/task-spec.d.ts.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/lifecycle/diff-tracker.d.ts +0 -88
- package/dist/lifecycle/diff-tracker.d.ts.map +0 -1
- package/dist/lifecycle/diff-tracker.js +0 -429
- package/dist/lifecycle/diff-tracker.js.map +0 -1
- package/dist/lifecycle/handlers/compose-commit-message.d.ts +0 -15
- package/dist/lifecycle/handlers/compose-commit-message.d.ts.map +0 -1
- package/dist/lifecycle/handlers/compose-commit-message.js +0 -227
- package/dist/lifecycle/handlers/compose-commit-message.js.map +0 -1
- package/dist/lifecycle/handlers/git-commit-handler.d.ts +0 -4
- package/dist/lifecycle/handlers/git-commit-handler.d.ts.map +0 -1
- package/dist/lifecycle/handlers/git-commit-handler.js +0 -202
- package/dist/lifecycle/handlers/git-commit-handler.js.map +0 -1
- package/dist/lifecycle/handlers/journal-review-prompt.d.ts +0 -7
- package/dist/lifecycle/handlers/journal-review-prompt.d.ts.map +0 -1
- package/dist/lifecycle/handlers/journal-review-prompt.js +0 -54
- package/dist/lifecycle/handlers/journal-review-prompt.js.map +0 -1
- package/dist/lifecycle/handlers/parse-review-report.d.ts +0 -15
- package/dist/lifecycle/handlers/parse-review-report.d.ts.map +0 -1
- package/dist/lifecycle/handlers/parse-review-report.js +0 -40
- package/dist/lifecycle/handlers/parse-review-report.js.map +0 -1
- package/dist/lifecycle/handlers/quality-review-prompt.d.ts +0 -7
- package/dist/lifecycle/handlers/quality-review-prompt.d.ts.map +0 -1
- package/dist/lifecycle/handlers/quality-review-prompt.js +0 -50
- package/dist/lifecycle/handlers/quality-review-prompt.js.map +0 -1
- package/dist/lifecycle/handlers/review-stage.d.ts +0 -4
- package/dist/lifecycle/handlers/review-stage.d.ts.map +0 -1
- package/dist/lifecycle/handlers/review-stage.js +0 -277
- package/dist/lifecycle/handlers/review-stage.js.map +0 -1
- package/dist/lifecycle/handlers/rework-prompt.d.ts +0 -6
- package/dist/lifecycle/handlers/rework-prompt.d.ts.map +0 -1
- package/dist/lifecycle/handlers/rework-prompt.js +0 -18
- package/dist/lifecycle/handlers/rework-prompt.js.map +0 -1
- package/dist/lifecycle/handlers/rework-stage.d.ts +0 -4
- package/dist/lifecycle/handlers/rework-stage.d.ts.map +0 -1
- package/dist/lifecycle/handlers/rework-stage.js +0 -191
- package/dist/lifecycle/handlers/rework-stage.js.map +0 -1
- package/dist/lifecycle/handlers/spec-review-prompt.d.ts +0 -8
- package/dist/lifecycle/handlers/spec-review-prompt.d.ts.map +0 -1
- package/dist/lifecycle/handlers/spec-review-prompt.js +0 -47
- package/dist/lifecycle/handlers/spec-review-prompt.js.map +0 -1
- package/dist/lifecycle/handlers/tier-policy.d.ts +0 -11
- package/dist/lifecycle/handlers/tier-policy.d.ts.map +0 -1
- package/dist/lifecycle/handlers/tier-policy.js +0 -12
- package/dist/lifecycle/handlers/tier-policy.js.map +0 -1
- package/dist/lifecycle/repo-commit-lock.d.ts +0 -20
- package/dist/lifecycle/repo-commit-lock.d.ts.map +0 -1
- package/dist/lifecycle/repo-commit-lock.js +0 -40
- package/dist/lifecycle/repo-commit-lock.js.map +0 -1
|
@@ -1,11 +1,51 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
2
|
import { resolve as pathResolve } from 'node:path';
|
|
3
3
|
import { extractPlanSection, SLICE_CAP_BYTES } from './plan-extractor.js';
|
|
4
|
+
const ATX = /^(#{1,6})\s+(.+?)\s*$/;
|
|
5
|
+
/**
|
|
6
|
+
* Derive a 1-based plan-phase per descriptor from the plan's heading structure.
|
|
7
|
+
* Tasks (the descriptors) live at some heading level L; their parent sections
|
|
8
|
+
* (level L-1) are the plan-phase boundaries. A new phase starts at each
|
|
9
|
+
* level-(L-1) heading. Plans with no grouping above the tasks → all phase 1.
|
|
10
|
+
*/
|
|
11
|
+
export function derivePhases(planText, descriptors) {
|
|
12
|
+
const want = new Set(descriptors.map((d) => d.trim()));
|
|
13
|
+
const headings = [];
|
|
14
|
+
for (const line of planText.split(/\r?\n/)) {
|
|
15
|
+
const m = ATX.exec(line);
|
|
16
|
+
if (m)
|
|
17
|
+
headings.push({ level: m[1].length, text: m[2].trim() });
|
|
18
|
+
}
|
|
19
|
+
const descLevels = headings.filter((h) => want.has(h.text)).map((h) => h.level);
|
|
20
|
+
if (descLevels.length === 0)
|
|
21
|
+
return descriptors.map(() => 1);
|
|
22
|
+
const taskLevel = Math.min(...descLevels);
|
|
23
|
+
const phaseLevel = taskLevel - 1;
|
|
24
|
+
const phaseOf = new Map();
|
|
25
|
+
let phase = 0;
|
|
26
|
+
for (const h of headings) {
|
|
27
|
+
if (h.level === phaseLevel)
|
|
28
|
+
phase += 1;
|
|
29
|
+
if (want.has(h.text) && !phaseOf.has(h.text))
|
|
30
|
+
phaseOf.set(h.text, Math.max(phase, 1));
|
|
31
|
+
}
|
|
32
|
+
return descriptors.map((d) => phaseOf.get(d.trim()) ?? 1);
|
|
33
|
+
}
|
|
34
|
+
function readPlanText(planPath, cwd) {
|
|
35
|
+
try {
|
|
36
|
+
const resolved = planPath.startsWith('/') ? planPath : pathResolve(cwd, planPath);
|
|
37
|
+
return readFileSync(resolved, 'utf8');
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return '';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
4
43
|
export function executePlanBriefSlot(input) {
|
|
5
44
|
const planPath = input.filePaths[0];
|
|
6
45
|
const cwd = input.cwd ?? process.cwd();
|
|
7
46
|
const rp = input.perTaskReviewPolicy ?? {};
|
|
8
|
-
|
|
47
|
+
const phases = derivePhases(readPlanText(planPath, cwd), input.taskDescriptors);
|
|
48
|
+
const tasks = input.taskDescriptors.map((descriptor, i) => {
|
|
9
49
|
let sectionBody = '';
|
|
10
50
|
let sectionTruncated = false;
|
|
11
51
|
try {
|
|
@@ -14,33 +54,37 @@ export function executePlanBriefSlot(input) {
|
|
|
14
54
|
sectionTruncated = section.truncated;
|
|
15
55
|
}
|
|
16
56
|
catch {
|
|
17
|
-
// extractPlanSection enforces sandbox — if that fails (e.g. macOS
|
|
18
|
-
// temp-dir symlinks), fall back to reading the file without sandbox.
|
|
19
57
|
const raw = readPlanSectionRaw(planPath, descriptor, cwd);
|
|
20
58
|
sectionBody = raw.body;
|
|
21
59
|
sectionTruncated = raw.truncated;
|
|
22
60
|
}
|
|
23
|
-
|
|
24
|
-
|
|
61
|
+
const body = sectionBody.trim().length > 0
|
|
62
|
+
? (sectionTruncated
|
|
63
|
+
? `${sectionBody}\n\n⚠ Section truncated at the size cap — read the full plan file (${planPath}) for the tail if needed.`
|
|
64
|
+
: sectionBody)
|
|
65
|
+
: `No unique plan section matched "${descriptor}". Read the plan file ${planPath}, find this task, and implement it. If still no unique match, report and skip this task.`;
|
|
66
|
+
return { heading: descriptor, body, phase: phases[i] ?? 1 };
|
|
67
|
+
});
|
|
68
|
+
// Collapse per-task review policy to the goal axis: review unless every task opted out.
|
|
69
|
+
const allNone = input.taskDescriptors.every((_, i) => (rp[String(i)] ?? rp[i] ?? 'full') === 'none');
|
|
70
|
+
const reviewPolicy = allNone ? 'none' : 'review-fix';
|
|
71
|
+
return [{
|
|
72
|
+
tasks,
|
|
73
|
+
reviewPolicy,
|
|
25
74
|
filePaths: input.filePaths,
|
|
26
|
-
sectionBody,
|
|
27
|
-
sectionTruncated,
|
|
28
75
|
contextBlockIds: input.contextBlockIds ?? [],
|
|
29
|
-
reviewPolicy: (rp[String(i)] ?? rp[i] ?? 'full'),
|
|
30
76
|
cwd,
|
|
31
|
-
};
|
|
32
|
-
});
|
|
77
|
+
}];
|
|
33
78
|
}
|
|
34
79
|
/**
|
|
35
80
|
* Read a plan file and extract a heading section without sandbox enforcement.
|
|
36
|
-
*
|
|
37
|
-
*
|
|
81
|
+
* Fallback when extractPlanSection's realpath check rejects the path (e.g.
|
|
82
|
+
* macOS temp directories that are symlinks).
|
|
38
83
|
*/
|
|
39
84
|
function readPlanSectionRaw(planFilePath, descriptor, cwd) {
|
|
40
85
|
const resolved = planFilePath.startsWith('/') ? planFilePath : pathResolve(cwd, planFilePath);
|
|
41
86
|
const text = readFileSync(resolved, 'utf8');
|
|
42
87
|
const lines = text.split(/\r?\n/);
|
|
43
|
-
const ATX = /^(#{1,6})\s+(.+?)\s*$/;
|
|
44
88
|
const wantTrim = descriptor.trim();
|
|
45
89
|
let startIdx = -1;
|
|
46
90
|
let level = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brief-slot.js","sourceRoot":"","sources":["../../../src/tools/execute-plan/brief-slot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"brief-slot.js","sourceRoot":"","sources":["../../../src/tools/execute-plan/brief-slot.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-config.d.ts","sourceRoot":"","sources":["../../../src/tools/execute-plan/tool-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-config.d.ts","sourceRoot":"","sources":["../../../src/tools/execute-plan/tool-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAwB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAO9E,eAAO,MAAM,sBAAsB;;;;;;;;;;;kBAMxB,CAAC;AAEZ,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE1E;mFACmF;AACnF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAA8B,CAAC;AAExD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAYvE;AAED,eAAO,MAAM,UAAU,EAAE,UAAU,CAAC,oBAAoB,EAAE,gBAAgB,CAyBzE,CAAC"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { basename } from 'node:path';
|
|
3
2
|
import { buildOutputEnvelopeSchema } from '../shared-output.js';
|
|
4
3
|
import { executePlanBriefSlot } from './brief-slot.js';
|
|
5
4
|
import { executePlanHeadlineTemplate } from '../../reporting/headline-templates/execute-plan.js';
|
|
6
5
|
import { executePlanReportSchema } from '../../reporting/report-parser-slots/execute-plan-report.js';
|
|
7
6
|
import { DEFAULT_TASK_TIMEOUT_MS } from '../../config/schema.js';
|
|
8
|
-
import {
|
|
7
|
+
import { assembleGoal, goalToTaskSpec } from '../../lifecycle/goal-builder.js';
|
|
8
|
+
import { implementGoalPrompt } from '../../lifecycle/goal-prompts.js';
|
|
9
9
|
export const executePlanInputSchema = z.object({
|
|
10
10
|
filePaths: z.array(z.string()).length(1, { message: "execute_plan requires exactly one plan filePath" }),
|
|
11
11
|
taskDescriptors: z.array(z.string()).min(1),
|
|
@@ -29,52 +29,6 @@ export function registerExecutePlan(registry) {
|
|
|
29
29
|
responseShapeName: 'BatchResponse',
|
|
30
30
|
});
|
|
31
31
|
}
|
|
32
|
-
/**
|
|
33
|
-
* Build a compact worker prompt for one plan task. Extracted from the legacy
|
|
34
|
-
* executor — just the section matched by the slot, not the full plan file.
|
|
35
|
-
*
|
|
36
|
-
* The prompt is structured top-down: orientation (why this exists) →
|
|
37
|
-
* task descriptor → matched plan section → file paths → fidelity rules
|
|
38
|
-
* (RESTORED in 4.1.0; the older `compileExecutePlan` had them, the
|
|
39
|
-
* slot-style refactor that became the canonical path dropped them) →
|
|
40
|
-
* failure-mode taxonomy → reviewer awareness. Without the orientation
|
|
41
|
-
* + fidelity blocks, workers default to "implement the goal" and treat
|
|
42
|
-
* the plan as a starting suggestion rather than the contract.
|
|
43
|
-
*/
|
|
44
|
-
function buildExecutePlanPrompt(filePaths, task, taskSection, sectionTruncated) {
|
|
45
|
-
const parts = [
|
|
46
|
-
// Orientation goes FIRST — fidelity-first framing before the
|
|
47
|
-
// task descriptor, so the worker reads the section through the
|
|
48
|
-
// execution lens instead of the "improve it" lens.
|
|
49
|
-
EXECUTE_PLAN_PURPOSE_ORIENTATION,
|
|
50
|
-
'',
|
|
51
|
-
`Execute this task from the plan: "${task}"`,
|
|
52
|
-
'',
|
|
53
|
-
];
|
|
54
|
-
if (taskSection) {
|
|
55
|
-
const sectionBytes = Buffer.byteLength(taskSection, 'utf8');
|
|
56
|
-
parts.push('Relevant plan section:', '', '---', taskSection.trim(), '---', '');
|
|
57
|
-
if (sectionTruncated) {
|
|
58
|
-
parts.push(`⚠ Section TRUNCATED — visible above is the first ~${sectionBytes} bytes; the tail was cut at the size cap. The visible portion is correct up to the cut. If you need the missing tail, read the full plan file (path below). If the visible portion is sufficient to execute the task, proceed.`, '');
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
parts.push(`✓ Section is COMPLETE (${sectionBytes} bytes, heading-to-heading). No truncation. If you find yourself thinking "this section looks truncated" or "this seems to end mid-step", you are misreading the boundary — re-read carefully before bailing. The most common misread: a closing \`\`\` code-fence near the section boundary looks like a mid-stream cut. It is not.`, '');
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
parts.push('No unique plan section matched that task heading. The full plan file is at:', ...filePaths.map((p) => ` - ${p}`), 'Read the plan file(s) yourself to find the task. If still no unique match, report that and stop — do not implement anything.', '');
|
|
66
|
-
}
|
|
67
|
-
// Only mention "plan files for reference" when section is missing or
|
|
68
|
-
// truncated — when the section is complete, the worker should rely on
|
|
69
|
-
// it as authoritative. Telling the worker to "re-read for adjacent
|
|
70
|
-
// context" when not needed encourages second-guessing and fails when
|
|
71
|
-
// the plan path is outside cwd (sandbox blocks the read).
|
|
72
|
-
if (!taskSection || sectionTruncated) {
|
|
73
|
-
parts.push('Plan files for reference (read on demand if you need adjacent context — but do not enlarge scope into other tasks):', ...filePaths.map((p) => ` - ${p}`), '');
|
|
74
|
-
}
|
|
75
|
-
parts.push('Implement the task fully. Follow acceptance criteria, file paths, and', 'constraints in the plan section above.', '', EXECUTE_PLAN_SCOPE_RULE, '', EXECUTE_PLAN_FAILURE_MODES, '', PLAN_VS_SOURCE_RECONCILIATION, '', SELF_VERIFICATION, '', TURN_BUDGET);
|
|
76
|
-
return parts.join('\n');
|
|
77
|
-
}
|
|
78
32
|
export const toolConfig = {
|
|
79
33
|
name: 'execute_plan',
|
|
80
34
|
category: 'artifact_producing',
|
|
@@ -82,25 +36,22 @@ export const toolConfig = {
|
|
|
82
36
|
dispatchModeOverridable: false,
|
|
83
37
|
agentType: 'standard',
|
|
84
38
|
briefSlot: executePlanBriefSlot,
|
|
85
|
-
buildTaskSpec: (brief, ctx) =>
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
planBasename: basename(brief.filePaths[0]),
|
|
102
|
-
...(brief.sectionBody ? { planContext: brief.sectionBody } : {}),
|
|
103
|
-
}),
|
|
39
|
+
buildTaskSpec: (brief, ctx) => {
|
|
40
|
+
const goal = assembleGoal({
|
|
41
|
+
source: 'execute-plan',
|
|
42
|
+
// ctx.cwd is the HTTP `?cwd=` query param; prefer it over the brief's
|
|
43
|
+
// (which is only set when the caller put cwd in the body).
|
|
44
|
+
cwd: ctx.cwd ?? brief.cwd,
|
|
45
|
+
tasks: brief.tasks,
|
|
46
|
+
phases: [{ tier: 'standard', mode: 'implement' }, { tier: 'complex', mode: 'review-fix' }],
|
|
47
|
+
reviewPolicy: brief.reviewPolicy,
|
|
48
|
+
tools: ctx.config.defaults?.tools ?? 'full',
|
|
49
|
+
sandboxPolicy: ctx.config.defaults?.sandboxPolicy ?? 'cwd-only',
|
|
50
|
+
...(ctx.config.defaults?.timeoutMs !== undefined && { perTaskTimeoutMs: ctx.config.defaults.timeoutMs }),
|
|
51
|
+
...(brief.contextBlockIds.length > 0 && { contextBlockIds: brief.contextBlockIds }),
|
|
52
|
+
});
|
|
53
|
+
return goalToTaskSpec(goal, implementGoalPrompt(goal), DEFAULT_TASK_TIMEOUT_MS);
|
|
54
|
+
},
|
|
104
55
|
reportSchema: executePlanReportSchema,
|
|
105
56
|
headlineTemplate: executePlanHeadlineTemplate,
|
|
106
57
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-config.js","sourceRoot":"","sources":["../../../src/tools/execute-plan/tool-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"tool-config.js","sourceRoot":"","sources":["../../../src/tools/execute-plan/tool-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import type { Input } from './schema.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { TaskInput } from '../../../lifecycle/goal-builder.js';
|
|
3
|
+
/**
|
|
4
|
+
* One goal-set per /journal-record call. Each learning becomes one GoalTask;
|
|
5
|
+
* the journal integration procedure rides as the goal preamble (prepended to
|
|
6
|
+
* both phase prompts). Both phases run on the complex tier — journal dedup /
|
|
7
|
+
* refine / supersede is nuanced enough to warrant it on the write phase too.
|
|
8
|
+
*/
|
|
3
9
|
export interface JournalRecordBrief {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
taskDescriptor: string;
|
|
7
|
-
agentType: 'standard' | 'complex';
|
|
8
|
-
reviewPolicy: ReviewPolicy;
|
|
10
|
+
tasks: TaskInput[];
|
|
11
|
+
preamble: string;
|
|
9
12
|
contextBlockIds?: string[];
|
|
10
13
|
}
|
|
11
14
|
export declare const journalRecordBriefSlot: (input: Input) => JournalRecordBrief[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brief-slot.d.ts","sourceRoot":"","sources":["../../../../src/tools/journal/record/brief-slot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"brief-slot.d.ts","sourceRoot":"","sources":["../../../../src/tools/journal/record/brief-slot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAOpE;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAgBD,eAAO,MAAM,sBAAsB,GAAI,OAAO,KAAK,KAAG,kBAAkB,EAWvE,CAAC"}
|
|
@@ -1,24 +1,28 @@
|
|
|
1
|
+
import { firstLine } from '../../../lifecycle/goal-prompts.js';
|
|
1
2
|
import { JOURNAL_RECORD_ORIENTATION, JOURNAL_RECORD_PROCEDURE, JOURNAL_RECORD_EDGE_VOCAB, JOURNAL_RECORD_REPORT, JOURNAL_RECORD_UNTRUSTED, } from './implementer-criteria.js';
|
|
2
|
-
|
|
3
|
+
/** The shared journal procedure, carried as the goal preamble. */
|
|
4
|
+
function journalPreamble(tagHints) {
|
|
3
5
|
const hints = tagHints && tagHints.length
|
|
4
6
|
? `\n\nTag hints (batch-scoped — apply across all learnings; revise/normalize per node): ${tagHints.join(', ')}.`
|
|
5
7
|
: '';
|
|
6
|
-
const numbered = learnings.map((l, i) => `LEARNING ${i + 1} (learningIndex ${i}):\n${l}`).join('\n\n');
|
|
7
8
|
return [
|
|
8
|
-
JOURNAL_RECORD_ORIENTATION,
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
JOURNAL_RECORD_ORIENTATION,
|
|
10
|
+
hints,
|
|
11
|
+
'',
|
|
11
12
|
JOURNAL_RECORD_PROCEDURE, '', JOURNAL_RECORD_EDGE_VOCAB, '',
|
|
12
13
|
JOURNAL_RECORD_UNTRUSTED, '', JOURNAL_RECORD_REPORT,
|
|
13
14
|
].join('\n');
|
|
14
15
|
}
|
|
15
|
-
export const journalRecordBriefSlot = (input) =>
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
16
|
+
export const journalRecordBriefSlot = (input) => {
|
|
17
|
+
const tasks = input.learnings.map((l, i) => ({
|
|
18
|
+
heading: `learning ${i + 1}: ${firstLine(l)}`,
|
|
19
|
+
body: l,
|
|
20
|
+
phase: 1,
|
|
21
|
+
}));
|
|
22
|
+
return [{
|
|
23
|
+
tasks,
|
|
24
|
+
preamble: journalPreamble(input.tagHints),
|
|
25
|
+
contextBlockIds: input.contextBlockIds,
|
|
26
|
+
}];
|
|
27
|
+
};
|
|
24
28
|
//# sourceMappingURL=brief-slot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brief-slot.js","sourceRoot":"","sources":["../../../../src/tools/journal/record/brief-slot.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,0BAA0B,EAAE,wBAAwB,EAAE,yBAAyB,EAC/E,qBAAqB,EAAE,wBAAwB,GAChD,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"brief-slot.js","sourceRoot":"","sources":["../../../../src/tools/journal/record/brief-slot.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,EACL,0BAA0B,EAAE,wBAAwB,EAAE,yBAAyB,EAC/E,qBAAqB,EAAE,wBAAwB,GAChD,MAAM,2BAA2B,CAAC;AAcnC,kEAAkE;AAClE,SAAS,eAAe,CAAC,QAAmB;IAC1C,MAAM,KAAK,GAAG,QAAQ,IAAI,QAAQ,CAAC,MAAM;QACvC,CAAC,CAAC,yFAAyF,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QACjH,CAAC,CAAC,EAAE,CAAC;IACP,OAAO;QACL,0BAA0B;QAC1B,KAAK;QACL,EAAE;QACF,wBAAwB,EAAE,EAAE,EAAE,yBAAyB,EAAE,EAAE;QAC3D,wBAAwB,EAAE,EAAE,EAAE,qBAAqB;KACpD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAY,EAAwB,EAAE;IAC3E,MAAM,KAAK,GAAgB,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACxD,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE;QAC7C,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;KACT,CAAC,CAAC,CAAC;IACJ,OAAO,CAAC;YACN,KAAK;YACL,QAAQ,EAAE,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC;YACzC,eAAe,EAAE,KAAK,CAAC,eAAe;SACvC,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-config.d.ts","sourceRoot":"","sources":["../../../../src/tools/journal/record/tool-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;AAErF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yCAAyC,CAAC;AAG1E,OAAO,EAA0B,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-config.d.ts","sourceRoot":"","sources":["../../../../src/tools/journal/record/tool-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;AAErF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yCAAyC,CAAC;AAG1E,OAAO,EAA0B,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAKlF,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAYzE;AAED,eAAO,MAAM,UAAU,EAAE,UAAU,CAAC,KAAK,EAAE,kBAAkB,EAAE,OAAO,CAyBrE,CAAC"}
|
|
@@ -3,6 +3,8 @@ import { journalHeadlineTemplate } from '../../../reporting/headline-templates/j
|
|
|
3
3
|
import { journalReportSchema } from '../../../reporting/report-parser-slots/journal-report.js';
|
|
4
4
|
import { journalRecordBriefSlot } from './brief-slot.js';
|
|
5
5
|
import { DEFAULT_TASK_TIMEOUT_MS } from '../../../config/schema.js';
|
|
6
|
+
import { assembleGoal, goalToTaskSpec } from '../../../lifecycle/goal-builder.js';
|
|
7
|
+
import { implementGoalPrompt } from '../../../lifecycle/goal-prompts.js';
|
|
6
8
|
export function registerJournalRecord(registry) {
|
|
7
9
|
registry.register({
|
|
8
10
|
routeName: 'journal-record',
|
|
@@ -23,17 +25,22 @@ export const toolConfig = {
|
|
|
23
25
|
dispatchModeOverridable: false,
|
|
24
26
|
agentType: 'complex',
|
|
25
27
|
briefSlot: journalRecordBriefSlot,
|
|
26
|
-
buildTaskSpec: (brief, ctx) =>
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
28
|
+
buildTaskSpec: (brief, ctx) => {
|
|
29
|
+
const goal = assembleGoal({
|
|
30
|
+
source: 'journal-record',
|
|
31
|
+
cwd: ctx.projectContext?.cwd ?? ctx.cwd,
|
|
32
|
+
tasks: brief.tasks,
|
|
33
|
+
// Journal integration is nuanced — complex on both phases.
|
|
34
|
+
phases: [{ tier: 'complex', mode: 'implement' }, { tier: 'complex', mode: 'review-fix' }],
|
|
35
|
+
reviewPolicy: 'review-fix',
|
|
36
|
+
tools: ctx.config.defaults?.tools ?? 'full',
|
|
37
|
+
sandboxPolicy: ctx.config.defaults?.sandboxPolicy ?? 'cwd-only',
|
|
38
|
+
...(ctx.config.defaults?.timeoutMs !== undefined && { perTaskTimeoutMs: ctx.config.defaults.timeoutMs }),
|
|
39
|
+
preamble: brief.preamble,
|
|
40
|
+
...(brief.contextBlockIds && brief.contextBlockIds.length > 0 && { contextBlockIds: brief.contextBlockIds }),
|
|
41
|
+
});
|
|
42
|
+
return goalToTaskSpec(goal, implementGoalPrompt(goal), DEFAULT_TASK_TIMEOUT_MS);
|
|
43
|
+
},
|
|
37
44
|
reportSchema: journalReportSchema,
|
|
38
45
|
headlineTemplate: journalHeadlineTemplate,
|
|
39
46
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-config.js","sourceRoot":"","sources":["../../../../src/tools/journal/record/tool-config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,kDAAkD,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAE,MAAM,0DAA0D,CAAC;AAC/F,OAAO,EAAE,sBAAsB,EAA2B,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-config.js","sourceRoot":"","sources":["../../../../src/tools/journal/record/tool-config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,kDAAkD,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAE,MAAM,0DAA0D,CAAC;AAC/F,OAAO,EAAE,sBAAsB,EAA2B,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEzE,MAAM,UAAU,qBAAqB,CAAC,QAA6B;IACjE,QAAQ,CAAC,QAAQ,CAAC;QAChB,SAAS,EAAE,gBAAgB;QAC3B,UAAU,EAAE,MAAM;QAClB,QAAQ,EAAE,iBAAiB;QAC3B,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,WAAW;QACnB,YAAY,EAAE,oBAAoB;QAClC,gBAAgB,EAAE,SAAS;QAC3B,oBAAoB,EAAE,KAAK;QAC3B,iBAAiB,EAAE,eAAe;KACnC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAmD;IACxE,IAAI,EAAE,gBAAgB;IACtB,QAAQ,EAAE,oBAAoB;IAC9B,YAAY,EAAE,QAAQ;IACtB,uBAAuB,EAAE,KAAK;IAC9B,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,sBAAsB;IACjC,aAAa,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,YAAY,CAAC;YACxB,MAAM,EAAE,gBAAgB;YACxB,GAAG,EAAE,GAAG,CAAC,cAAc,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG;YACvC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,2DAA2D;YAC3D,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;YACzF,YAAY,EAAE,YAAY;YAC1B,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,IAAI,MAAM;YAC3C,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,aAAa,IAAI,UAAU;YAC/D,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,KAAK,SAAS,IAAI,EAAE,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YACxG,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,GAAG,CAAC,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC;SAC7G,CAAC,CAAC;QACH,OAAO,cAAc,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC,EAAE,uBAAuB,CAAC,CAAC;IAClF,CAAC;IACD,YAAY,EAAE,mBAAmB;IACjC,gBAAgB,EAAE,uBAAuB;CAC1C,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Input } from './schema.js';
|
|
2
2
|
export interface RetryBrief {
|
|
3
3
|
batchId: string;
|
|
4
|
-
taskIndex: number;
|
|
5
4
|
}
|
|
5
|
+
/** One brief: re-fire the stored goal-set for `batchId`. */
|
|
6
6
|
export declare const retryBriefSlot: (input: Input) => RetryBrief[];
|
|
7
7
|
//# sourceMappingURL=brief-slot.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brief-slot.d.ts","sourceRoot":"","sources":["../../../src/tools/retry/brief-slot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"brief-slot.d.ts","sourceRoot":"","sources":["../../../src/tools/retry/brief-slot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,4DAA4D;AAC5D,eAAO,MAAM,cAAc,GAAI,OAAO,KAAK,KAAG,UAAU,EAAkC,CAAC"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
|
|
1
|
+
/** One brief: re-fire the stored goal-set for `batchId`. */
|
|
2
|
+
export const retryBriefSlot = (input) => [{ batchId: input.batchId }];
|
|
2
3
|
//# sourceMappingURL=brief-slot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brief-slot.js","sourceRoot":"","sources":["../../../src/tools/retry/brief-slot.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"brief-slot.js","sourceRoot":"","sources":["../../../src/tools/retry/brief-slot.ts"],"names":[],"mappings":"AAMA,4DAA4D;AAC5D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAY,EAAgB,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/tools/retry/schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/tools/retry/schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,WAAW;;iBAEtB,CAAC;AAEH,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEhD,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAA8B,CAAC;AAExD,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
// packages/core/src/
|
|
1
|
+
// packages/core/src/tools/retry/schema.ts
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
import { buildOutputEnvelopeSchema } from '../shared-output.js';
|
|
4
|
-
//
|
|
4
|
+
// Goal mode: retry re-fires a prior write goal-set against the CURRENT git
|
|
5
|
+
// HEAD (the new baseSha). Because git holds all committed progress, the re-run
|
|
6
|
+
// continues/repairs rather than redoing finished work. There is no task-index
|
|
7
|
+
// subset — a single autonomous run has no MMA-controlled task boundary.
|
|
5
8
|
export const inputSchema = z.object({
|
|
6
|
-
batchId: z.string().describe('Batch id returned from a previous
|
|
7
|
-
taskIndices: z
|
|
8
|
-
.array(z.number().int().nonnegative())
|
|
9
|
-
.describe('Zero-based indices (into the original batch) of the tasks to re-run'),
|
|
9
|
+
batchId: z.string().describe('Batch id returned from a previous delegate / execute-plan / journal-record call'),
|
|
10
10
|
});
|
|
11
11
|
export const outputSchema = buildOutputEnvelopeSchema();
|
|
12
12
|
//# sourceMappingURL=schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/tools/retry/schema.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/tools/retry/schema.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,2EAA2E;AAC3E,+EAA+E;AAC/E,8EAA8E;AAC9E,wEAAwE;AACxE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iFAAiF,CAAC;CAChH,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,YAAY,GAAG,yBAAyB,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-config.d.ts","sourceRoot":"","sources":["../../../src/tools/retry/tool-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAElF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-config.d.ts","sourceRoot":"","sources":["../../../src/tools/retry/tool-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAElF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAoBvE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAYjE;AAED,eAAO,MAAM,UAAU,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CA0C7D,CAAC"}
|
|
@@ -3,6 +3,18 @@ import { retryBriefSlot } from './brief-slot.js';
|
|
|
3
3
|
import { noStructuredReportSchema } from '../../reporting/report-parser-slots/no-structured-report.js';
|
|
4
4
|
import { makeFindingsHeadlineTemplate } from '../../reporting/findings-headline.js';
|
|
5
5
|
import { notApplicable } from '../../reporting/not-applicable.js';
|
|
6
|
+
import { implementGoalPrompt } from '../../lifecycle/goal-prompts.js';
|
|
7
|
+
const RETRY_PREAMBLE = [
|
|
8
|
+
'RETRY: the plan below was partially executed in a prior run. The commits since the run',
|
|
9
|
+
'start (see `git log`) show what is already done. Do NOT redo committed, correct work —',
|
|
10
|
+
'complete what is missing and fix what is wrong, committing with the same `[task N]` convention.',
|
|
11
|
+
'',
|
|
12
|
+
].join('\n');
|
|
13
|
+
/** Thrown when the prior batch's goal has been evicted from the cache. */
|
|
14
|
+
class GoalNotFoundError extends Error {
|
|
15
|
+
code = 'goal_not_found';
|
|
16
|
+
constructor(batchId) { super(`no stored goal for batch ${batchId}`); this.name = 'GoalNotFoundError'; }
|
|
17
|
+
}
|
|
6
18
|
export function registerRetry(registry) {
|
|
7
19
|
registry.register({
|
|
8
20
|
routeName: 'retry_tasks',
|
|
@@ -12,34 +24,27 @@ export function registerRetry(registry) {
|
|
|
12
24
|
schema: inputSchema,
|
|
13
25
|
toolCategory: 'assist',
|
|
14
26
|
agentTypeDefault: 'standard',
|
|
15
|
-
agentTypeOverridable:
|
|
27
|
+
agentTypeOverridable: false,
|
|
16
28
|
responseShapeName: 'BatchResponse',
|
|
17
29
|
});
|
|
18
30
|
}
|
|
19
31
|
export const toolConfig = {
|
|
20
32
|
name: 'retry',
|
|
21
33
|
category: 'assist',
|
|
22
|
-
dispatchMode: '
|
|
34
|
+
dispatchMode: 'serial',
|
|
23
35
|
dispatchModeOverridable: false,
|
|
24
36
|
agentType: 'standard',
|
|
25
37
|
briefSlot: retryBriefSlot,
|
|
26
38
|
buildTaskSpec: (brief, ctx) => {
|
|
27
|
-
const
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
39
|
+
const batch = ctx.projectContext?.batchCache?.get(brief.batchId);
|
|
40
|
+
const origTask = batch?.tasks[0];
|
|
41
|
+
if (!origTask?.goal)
|
|
42
|
+
throw new GoalNotFoundError(brief.batchId);
|
|
43
|
+
// Re-fire the same goal-set; the prepare stage captures a fresh baseSha
|
|
44
|
+
// (current HEAD) so the re-run continues from where the prior run left off.
|
|
31
45
|
return {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
reviewPolicy: origTask?.reviewPolicy ?? 'none',
|
|
35
|
-
briefQualityPolicy: origTask?.briefQualityPolicy ?? 'off',
|
|
36
|
-
tools: origTask?.tools ?? defaults?.tools ?? 'full',
|
|
37
|
-
timeoutMs: origTask?.timeoutMs ?? defaults?.timeoutMs ?? 1_800_000,
|
|
38
|
-
sandboxPolicy: origTask?.sandboxPolicy ?? defaults?.sandboxPolicy ?? 'cwd-only',
|
|
39
|
-
cwd: origTask?.cwd ?? ctx.projectContext?.cwd ?? ctx.cwd,
|
|
40
|
-
contextBlockIds: origTask?.contextBlockIds ?? [],
|
|
41
|
-
mainModel: origTask?.mainModel,
|
|
42
|
-
done: origTask?.done,
|
|
46
|
+
...origTask,
|
|
47
|
+
prompt: RETRY_PREAMBLE + implementGoalPrompt(origTask.goal),
|
|
43
48
|
};
|
|
44
49
|
},
|
|
45
50
|
reportSchema: noStructuredReportSchema,
|
|
@@ -47,12 +52,6 @@ export const toolConfig = {
|
|
|
47
52
|
postProcessEnvelope: (envelope, ctx) => {
|
|
48
53
|
const results = (Array.isArray(envelope.results) ? envelope.results : []);
|
|
49
54
|
const total = results.length;
|
|
50
|
-
// Tool sweep #8 fix: pre-fix this hard-coded `retry: N/N tasks complete`
|
|
51
|
-
// regardless of actual outcomes — operator could not tell if any
|
|
52
|
-
// retried task had failed. Now compute the true ok/incomplete/error
|
|
53
|
-
// breakdown from per-task `status` and emit a headline that mirrors
|
|
54
|
-
// delegate / execute-plan: '[<aggregate-status>] retry: ok/total tasks complete'
|
|
55
|
-
// with detail when not all ok.
|
|
56
55
|
let ok = 0, incomplete = 0, error = 0;
|
|
57
56
|
for (const r of results) {
|
|
58
57
|
const s = r?.status;
|
|
@@ -61,7 +60,7 @@ export const toolConfig = {
|
|
|
61
60
|
else if (s === 'error')
|
|
62
61
|
error++;
|
|
63
62
|
else
|
|
64
|
-
incomplete++;
|
|
63
|
+
incomplete++;
|
|
65
64
|
}
|
|
66
65
|
const aggregate = error > 0 ? 'error' : incomplete > 0 ? 'incomplete' : 'ok';
|
|
67
66
|
let detail = `${ok}/${total} tasks complete`;
|
|
@@ -71,10 +70,6 @@ export const toolConfig = {
|
|
|
71
70
|
detail += `, ${error} error`;
|
|
72
71
|
envelope.headline = `[${aggregate}] retry: ${detail}`;
|
|
73
72
|
envelope.structuredReport = notApplicable('no structured report emitted by this executor');
|
|
74
|
-
// Tool sweep #8: keep the underlying review verdicts on the envelope
|
|
75
|
-
// (do NOT delete) so downstream telemetry + UI can show whether the
|
|
76
|
-
// retried tasks' lifecycles passed their spec/quality chains. Pre-fix
|
|
77
|
-
// these were stripped, hiding important failure signal.
|
|
78
73
|
if (ctx?.batchId) {
|
|
79
74
|
envelope.retryBatchId = ctx.batchId;
|
|
80
75
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-config.js","sourceRoot":"","sources":["../../../src/tools/retry/tool-config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAmB,MAAM,iBAAiB,CAAC;AAGlE,OAAO,EAAE,wBAAwB,EAAE,MAAM,6DAA6D,CAAC;AACvG,OAAO,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-config.js","sourceRoot":"","sources":["../../../src/tools/retry/tool-config.ts"],"names":[],"mappings":"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"}
|