@sunilp-org/jam-cli 0.2.0 → 0.3.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/commands/ask.d.ts.map +1 -1
- package/dist/commands/ask.js +76 -11
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/run.d.ts +2 -0
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +237 -15
- package/dist/commands/run.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +4 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +4 -4
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +1 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/agent.d.ts +80 -1
- package/dist/utils/agent.d.ts.map +1 -1
- package/dist/utils/agent.js +368 -4
- package/dist/utils/agent.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../src/commands/ask.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../src/commands/ask.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,WAAW,UAAW,SAAQ,YAAY;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;yFACqF;IACrF,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA0CD,wBAAsB,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAqVjG"}
|
package/dist/commands/ask.js
CHANGED
|
@@ -6,7 +6,7 @@ import { streamToStdout, printJsonResult, printError, renderMarkdown } from '../
|
|
|
6
6
|
import { JamError } from '../utils/errors.js';
|
|
7
7
|
import { getWorkspaceRoot } from '../utils/workspace.js';
|
|
8
8
|
import { READ_ONLY_TOOL_SCHEMAS, executeReadOnlyTool } from '../tools/context-tools.js';
|
|
9
|
-
import { ToolCallTracker, loadProjectContext, buildSystemPrompt, enrichUserPrompt, generateSearchPlan, buildSynthesisReminder, formatToolCall, formatToolResult, formatSeparator, formatDuplicateSkip, formatHintInjection, formatUsage, formatPlanBlock, formatInternalStatus, } from '../utils/agent.js';
|
|
9
|
+
import { ToolCallTracker, loadProjectContext, buildSystemPrompt, enrichUserPrompt, generateSearchPlan, generateExecutionPlan, enrichUserPromptWithPlan, formatExecutionPlanBlock, StepVerifier, buildToolResultsSummary, buildSynthesisReminder, formatToolCall, formatToolResult, formatSeparator, formatDuplicateSkip, formatHintInjection, formatUsage, formatPlanBlock, formatInternalStatus, } from '../utils/agent.js';
|
|
10
10
|
import { WorkingMemory } from '../utils/memory.js';
|
|
11
11
|
import { ToolResultCache } from '../utils/cache.js';
|
|
12
12
|
import { criticEvaluate, buildCriticCorrection } from '../utils/critic.js';
|
|
@@ -120,27 +120,79 @@ export async function runAsk(inlinePrompt, options) {
|
|
|
120
120
|
pastContext = formatPastExchanges(pastExchanges);
|
|
121
121
|
}
|
|
122
122
|
catch { /* non-fatal */ }
|
|
123
|
-
// ── Planning phase:
|
|
123
|
+
// ── Planning phase: structured plan first, text plan fallback ────────
|
|
124
124
|
stderrLog(formatSeparator('Planning', noColor));
|
|
125
125
|
const projectCtxForPlan = [jamContext ?? workspaceCtx, symbolHint, pastContext].filter(Boolean).join('\n\n');
|
|
126
|
-
|
|
126
|
+
let structuredPlan = null;
|
|
127
|
+
let enrichedPrompt;
|
|
128
|
+
// Try to produce a structured JSON execution plan
|
|
129
|
+
structuredPlan = await generateExecutionPlan(adapter, prompt, projectCtxForPlan, {
|
|
127
130
|
model: profile.model,
|
|
128
131
|
temperature: profile.temperature,
|
|
129
132
|
maxTokens: profile.maxTokens,
|
|
130
133
|
});
|
|
131
|
-
if (
|
|
132
|
-
stderrLog(
|
|
134
|
+
if (structuredPlan) {
|
|
135
|
+
stderrLog(formatExecutionPlanBlock(structuredPlan, noColor) + '\n');
|
|
136
|
+
enrichedPrompt = enrichUserPromptWithPlan(prompt, structuredPlan);
|
|
133
137
|
}
|
|
134
138
|
else {
|
|
135
|
-
|
|
139
|
+
// Fall back to free-text search plan
|
|
140
|
+
const searchPlan = await generateSearchPlan(adapter, prompt, projectCtxForPlan, {
|
|
141
|
+
model: profile.model,
|
|
142
|
+
temperature: profile.temperature,
|
|
143
|
+
maxTokens: profile.maxTokens,
|
|
144
|
+
});
|
|
145
|
+
if (searchPlan) {
|
|
146
|
+
stderrLog(formatPlanBlock(searchPlan, noColor) + '\n');
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
stderrLog(formatInternalStatus('planning skipped — using generic search strategy', noColor) + '\n');
|
|
150
|
+
}
|
|
151
|
+
enrichedPrompt = enrichUserPrompt(prompt, searchPlan);
|
|
136
152
|
}
|
|
137
|
-
// Enrich the user's prompt with the search plan
|
|
138
|
-
const enrichedPrompt = enrichUserPrompt(prompt, searchPlan);
|
|
139
153
|
let messages = [{ role: 'user', content: enrichedPrompt }];
|
|
154
|
+
// Step tracking for structured plan
|
|
155
|
+
let currentStepIdx = 0;
|
|
156
|
+
const stepVerifier = new StepVerifier();
|
|
140
157
|
const MAX_TOOL_ROUNDS = 15;
|
|
141
158
|
let synthesisInjected = false;
|
|
142
159
|
stderrLog(formatSeparator('Searching codebase', noColor));
|
|
143
160
|
for (let round = 0; round < MAX_TOOL_ROUNDS; round++) {
|
|
161
|
+
// ── Step injection: remind model of the current plan step ─────────
|
|
162
|
+
if (structuredPlan && round > 0 && round % 3 === 0 && currentStepIdx < structuredPlan.steps.length) {
|
|
163
|
+
const step = structuredPlan.steps[currentStepIdx];
|
|
164
|
+
messages.push({
|
|
165
|
+
role: 'user',
|
|
166
|
+
content: `[STEP REMINDER — Step ${step.id} of ${structuredPlan.steps.length}: ${step.action}. Use tool \`${step.tool}\` with args \`${JSON.stringify(step.args)}\`. Done when: ${step.successCriteria}]`,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
// ── Verifier: check progress every 3 rounds after ≥2 tool calls ───
|
|
170
|
+
if (round > 0 && round % 3 === 0 && tracker.totalCalls >= 2) {
|
|
171
|
+
stderrLog(formatInternalStatus('Verifying progress…', noColor) + '\n');
|
|
172
|
+
const summary = buildToolResultsSummary(messages);
|
|
173
|
+
const vResult = await stepVerifier.verify(adapter, prompt, structuredPlan, summary, { model: profile.model });
|
|
174
|
+
if (vResult.status === 'ready-to-answer') {
|
|
175
|
+
stderrLog(formatInternalStatus(`Verifier: sufficient context — synthesizing answer`, noColor) + '\n');
|
|
176
|
+
if (!synthesisInjected) {
|
|
177
|
+
synthesisInjected = true;
|
|
178
|
+
messages.push({ role: 'user', content: buildSynthesisReminder(prompt) });
|
|
179
|
+
}
|
|
180
|
+
// Skip remaining tool rounds — let model produce final answer
|
|
181
|
+
}
|
|
182
|
+
else if (vResult.status === 'stuck') {
|
|
183
|
+
stderrLog(formatInternalStatus(`Verifier: stuck — ${vResult.reason}`, noColor) + '\n');
|
|
184
|
+
const nextStep = structuredPlan?.steps.find(s => s.id === vResult.nextStepId);
|
|
185
|
+
const stuckHint = [
|
|
186
|
+
`[VERIFIER: You appear stuck. ${vResult.reason}`,
|
|
187
|
+
nextStep
|
|
188
|
+
? `Focus on Step ${nextStep.id}: use \`${nextStep.tool}\` with args \`${JSON.stringify(nextStep.args)}\`.`
|
|
189
|
+
: 'Try a completely different search term or use list_dir to explore the directory structure.',
|
|
190
|
+
']',
|
|
191
|
+
].join(' ');
|
|
192
|
+
messages.push({ role: 'user', content: stuckHint });
|
|
193
|
+
}
|
|
194
|
+
// For 'need-more': continue normally
|
|
195
|
+
}
|
|
144
196
|
// ── Context window management: compact if approaching limit ───────
|
|
145
197
|
if (memory.shouldCompact(messages)) {
|
|
146
198
|
stderrLog(formatInternalStatus('Compacting context…', noColor) + '\n');
|
|
@@ -170,10 +222,13 @@ export async function runAsk(inlinePrompt, options) {
|
|
|
170
222
|
updateContextWithUsage(workspaceRoot, log.readFiles, log.searchQueries).catch(() => { });
|
|
171
223
|
return;
|
|
172
224
|
}
|
|
173
|
-
// Critic rejected —
|
|
225
|
+
// Critic rejected — re-enter loop at the last incomplete plan step
|
|
174
226
|
stderrLog(formatInternalStatus(`Critic: ${verdict.reason}`, noColor) + '\n');
|
|
175
227
|
messages.push({ role: 'assistant', content: finalText });
|
|
176
|
-
|
|
228
|
+
const stepHint = structuredPlan && currentStepIdx < structuredPlan.steps.length
|
|
229
|
+
? `\n\nResume the execution plan from Step ${structuredPlan.steps[currentStepIdx].id}: ${structuredPlan.steps[currentStepIdx].action}. Gather more specific evidence before answering.`
|
|
230
|
+
: '';
|
|
231
|
+
messages.push({ role: 'user', content: buildCriticCorrection(verdict, prompt) + stepHint });
|
|
177
232
|
continue;
|
|
178
233
|
}
|
|
179
234
|
// No answer yet — inject synthesis reminder
|
|
@@ -188,7 +243,10 @@ export async function runAsk(inlinePrompt, options) {
|
|
|
188
243
|
if (!verdict.pass) {
|
|
189
244
|
stderrLog(formatInternalStatus(`Critic: ${verdict.reason}`, noColor) + '\n');
|
|
190
245
|
messages.push({ role: 'assistant', content: finalText });
|
|
191
|
-
|
|
246
|
+
const stepHint = structuredPlan && currentStepIdx < structuredPlan.steps.length
|
|
247
|
+
? `\n\nResume the execution plan from Step ${structuredPlan.steps[currentStepIdx].id}: ${structuredPlan.steps[currentStepIdx].action}.`
|
|
248
|
+
: '';
|
|
249
|
+
messages.push({ role: 'user', content: buildCriticCorrection(verdict, prompt) + stepHint });
|
|
192
250
|
continue;
|
|
193
251
|
}
|
|
194
252
|
}
|
|
@@ -199,6 +257,13 @@ export async function runAsk(inlinePrompt, options) {
|
|
|
199
257
|
updateContextWithUsage(workspaceRoot, log.readFiles, log.searchQueries).catch(() => { });
|
|
200
258
|
return;
|
|
201
259
|
}
|
|
260
|
+
// ── Advance plan step if executor used the planned tool ─────────────
|
|
261
|
+
if (structuredPlan && currentStepIdx < structuredPlan.steps.length && response.toolCalls?.length) {
|
|
262
|
+
const expectedTool = structuredPlan.steps[currentStepIdx].tool;
|
|
263
|
+
if (response.toolCalls.some(tc => tc.name === expectedTool)) {
|
|
264
|
+
currentStepIdx++;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
202
267
|
// ── Execute tool calls ────────────────────────────────────────────────
|
|
203
268
|
messages.push({ role: 'assistant', content: response.content ?? '' });
|
|
204
269
|
for (const tc of response.toolCalls) {
|
package/dist/commands/ask.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/commands/ask.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/commands/ask.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/run.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ import type { CliOverrides } from '../config/schema.js';
|
|
|
2
2
|
export interface RunOptions extends CliOverrides {
|
|
3
3
|
noColor?: boolean;
|
|
4
4
|
quiet?: boolean;
|
|
5
|
+
/** Auto-approve all write tool calls without prompting. */
|
|
6
|
+
yes?: boolean;
|
|
5
7
|
}
|
|
6
8
|
export declare function runRun(instruction: string | undefined, options: RunOptions): Promise<void>;
|
|
7
9
|
//# sourceMappingURL=run.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,WAAW,UAAW,SAAQ,YAAY;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2DAA2D;IAC3D,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAcD,wBAAsB,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAiehG"}
|
package/dist/commands/run.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { createInterface } from 'node:readline/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
2
3
|
import { loadConfig, getActiveProfile } from '../config/loader.js';
|
|
3
4
|
import { createProvider } from '../providers/factory.js';
|
|
4
5
|
import { printError, printWarning, renderMarkdown } from '../ui/renderer.js';
|
|
5
6
|
import { JamError } from '../utils/errors.js';
|
|
6
7
|
import { getWorkspaceRoot } from '../utils/workspace.js';
|
|
7
8
|
import { ALL_TOOL_SCHEMAS, READONLY_TOOL_NAMES, executeTool } from '../tools/all-tools.js';
|
|
8
|
-
import { ToolCallTracker, loadProjectContext, buildSystemPrompt, enrichUserPrompt, generateSearchPlan, buildSynthesisReminder, formatToolCall, formatToolResult, formatSeparator, formatDuplicateSkip, formatHintInjection, formatUsage, formatPlanBlock, formatInternalStatus, } from '../utils/agent.js';
|
|
9
|
+
import { ToolCallTracker, loadProjectContext, buildSystemPrompt, enrichUserPrompt, generateSearchPlan, generateExecutionPlan, enrichUserPromptWithPlan, formatExecutionPlanBlock, StepVerifier, buildToolResultsSummary, buildSynthesisReminder, formatToolCall, formatToolResult, formatSeparator, formatDuplicateSkip, formatHintInjection, formatUsage, formatPlanBlock, formatInternalStatus, } from '../utils/agent.js';
|
|
9
10
|
import { WorkingMemory } from '../utils/memory.js';
|
|
10
11
|
import { ToolResultCache } from '../utils/cache.js';
|
|
11
12
|
import { criticEvaluate, buildCriticCorrection } from '../utils/critic.js';
|
|
@@ -29,7 +30,8 @@ export async function runRun(instruction, options) {
|
|
|
29
30
|
const noColor = options.noColor ?? false;
|
|
30
31
|
const stderrLog = options.quiet ? (_msg) => { } : (msg) => process.stderr.write(msg);
|
|
31
32
|
const workspaceRoot = await getWorkspaceRoot();
|
|
32
|
-
const
|
|
33
|
+
const rawConfig = await loadConfig(process.cwd(), options);
|
|
34
|
+
const config = options.yes ? { ...rawConfig, toolPolicy: 'always' } : rawConfig;
|
|
33
35
|
const profile = getActiveProfile(config);
|
|
34
36
|
const adapter = await createProvider(profile);
|
|
35
37
|
stderrLog(`Starting task: ${instruction}\n`);
|
|
@@ -54,26 +56,45 @@ export async function runRun(instruction, options) {
|
|
|
54
56
|
pastContext = formatPastExchanges(pastExchanges);
|
|
55
57
|
}
|
|
56
58
|
catch { /* non-fatal */ }
|
|
57
|
-
// ── Planning phase
|
|
59
|
+
// ── Planning phase ─────────────────────────────────────────────────────
|
|
58
60
|
stderrLog(formatSeparator('Planning', noColor));
|
|
59
61
|
const projectCtxForPlan = [jamContext ?? workspaceCtx, symbolHint, pastContext].filter(Boolean).join('\n\n');
|
|
60
|
-
|
|
62
|
+
let structuredPlan = null;
|
|
63
|
+
let enrichedInstruction;
|
|
64
|
+
structuredPlan = await generateExecutionPlan(adapter, instruction, projectCtxForPlan, {
|
|
61
65
|
model: profile.model,
|
|
62
66
|
temperature: profile.temperature,
|
|
63
67
|
maxTokens: profile.maxTokens,
|
|
68
|
+
mode: 'readwrite',
|
|
64
69
|
});
|
|
65
|
-
if (
|
|
66
|
-
stderrLog(
|
|
70
|
+
if (structuredPlan) {
|
|
71
|
+
stderrLog(formatExecutionPlanBlock(structuredPlan, noColor) + '\n');
|
|
72
|
+
enrichedInstruction = enrichUserPromptWithPlan(instruction, structuredPlan);
|
|
67
73
|
}
|
|
68
74
|
else {
|
|
69
|
-
|
|
75
|
+
const searchPlan = await generateSearchPlan(adapter, instruction, projectCtxForPlan, {
|
|
76
|
+
model: profile.model,
|
|
77
|
+
temperature: profile.temperature,
|
|
78
|
+
maxTokens: profile.maxTokens,
|
|
79
|
+
});
|
|
80
|
+
if (searchPlan) {
|
|
81
|
+
stderrLog(formatPlanBlock(searchPlan, noColor) + '\n');
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
stderrLog(formatInternalStatus('planning skipped — using generic strategy', noColor) + '\n');
|
|
85
|
+
}
|
|
86
|
+
enrichedInstruction = enrichUserPrompt(instruction, searchPlan);
|
|
70
87
|
}
|
|
71
|
-
// Enrich the instruction with the search plan
|
|
72
|
-
const enrichedInstruction = enrichUserPrompt(instruction, searchPlan);
|
|
73
88
|
let messages = [
|
|
74
89
|
{ role: 'user', content: enrichedInstruction },
|
|
75
90
|
];
|
|
76
91
|
const tracker = new ToolCallTracker();
|
|
92
|
+
let currentStepIdx = 0;
|
|
93
|
+
// Track which files have been read — used to enforce read-before-write
|
|
94
|
+
const readFiles = new Set();
|
|
95
|
+
// Track original line counts of files that were auto-read before write
|
|
96
|
+
const originalLineCounts = new Map();
|
|
97
|
+
const stepVerifier = new StepVerifier();
|
|
77
98
|
if (!adapter.chatWithTools) {
|
|
78
99
|
await printError('Provider does not support tool calling. Use a provider/model that supports tools.');
|
|
79
100
|
process.exit(1);
|
|
@@ -101,7 +122,40 @@ export async function runRun(instruction, options) {
|
|
|
101
122
|
let synthesisInjected = false;
|
|
102
123
|
stderrLog(formatSeparator('Working', noColor));
|
|
103
124
|
for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {
|
|
104
|
-
//
|
|
125
|
+
// ── Step injection: remind model of current plan step every 3 rounds ──
|
|
126
|
+
if (structuredPlan && iteration > 0 && iteration % 3 === 0 && currentStepIdx < structuredPlan.steps.length) {
|
|
127
|
+
const step = structuredPlan.steps[currentStepIdx];
|
|
128
|
+
messages.push({
|
|
129
|
+
role: 'user',
|
|
130
|
+
content: `[STEP REMINDER — Step ${step.id} of ${structuredPlan.steps.length}: ${step.action}. Use tool \`${step.tool}\` with args \`${JSON.stringify(step.args)}\`. Done when: ${step.successCriteria}]`,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
// ── Verifier: check progress every 3 rounds after ≥2 tool calls ────────
|
|
134
|
+
if (iteration > 0 && iteration % 3 === 0 && tracker.totalCalls >= 2) {
|
|
135
|
+
stderrLog(formatInternalStatus('Verifying progress…', noColor) + '\n');
|
|
136
|
+
const summary = buildToolResultsSummary(messages);
|
|
137
|
+
const vResult = await stepVerifier.verify(adapter, instruction, structuredPlan, summary, { model: profile.model });
|
|
138
|
+
if (vResult.status === 'ready-to-answer') {
|
|
139
|
+
stderrLog(formatInternalStatus('Verifier: sufficient context — synthesizing result', noColor) + '\n');
|
|
140
|
+
if (!synthesisInjected) {
|
|
141
|
+
synthesisInjected = true;
|
|
142
|
+
messages.push({ role: 'user', content: buildSynthesisReminder(instruction) });
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
else if (vResult.status === 'stuck') {
|
|
146
|
+
stderrLog(formatInternalStatus(`Verifier: stuck — ${vResult.reason}`, noColor) + '\n');
|
|
147
|
+
const nextStep = structuredPlan?.steps.find(s => s.id === vResult.nextStepId);
|
|
148
|
+
const stuckHint = [
|
|
149
|
+
`[VERIFIER: You appear stuck. ${vResult.reason}`,
|
|
150
|
+
nextStep
|
|
151
|
+
? `Focus on Step ${nextStep.id}: use \`${nextStep.tool}\` with args \`${JSON.stringify(nextStep.args)}\`.`
|
|
152
|
+
: 'Try list_dir to explore directories, then read concrete files.',
|
|
153
|
+
']',
|
|
154
|
+
].join(' ');
|
|
155
|
+
messages.push({ role: 'user', content: stuckHint });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// ── Context window management ──────────────────────────────────────────
|
|
105
159
|
if (memory.shouldCompact(messages)) {
|
|
106
160
|
stderrLog(formatInternalStatus('Compacting context…', noColor) + '\n');
|
|
107
161
|
messages = await memory.compact(messages);
|
|
@@ -115,11 +169,95 @@ export async function runRun(instruction, options) {
|
|
|
115
169
|
// No tool calls → model is done
|
|
116
170
|
if (!response.toolCalls || response.toolCalls.length === 0) {
|
|
117
171
|
const finalText = response.content ?? '';
|
|
118
|
-
//
|
|
172
|
+
// ── Write-enforcement gate ────────────────────────────────────────────────
|
|
173
|
+
// If there are write steps in the plan that haven't been executed yet,
|
|
174
|
+
// the model has hallucinated Markdown instead of calling write_file.
|
|
175
|
+
// Inject a hard correction to force actual tool use.
|
|
176
|
+
const pendingWriteStep = structuredPlan?.steps
|
|
177
|
+
.slice(currentStepIdx)
|
|
178
|
+
.find(s => s.tool === 'write_file' || s.tool === 'apply_patch');
|
|
179
|
+
if (pendingWriteStep && iteration < MAX_ITERATIONS - 2) {
|
|
180
|
+
stderrLog(formatInternalStatus(`Write-enforcement: model skipped write_file — forcing retry on Step ${pendingWriteStep.id}`, noColor) + '\n');
|
|
181
|
+
messages.push({ role: 'assistant', content: finalText });
|
|
182
|
+
messages.push({
|
|
183
|
+
role: 'user',
|
|
184
|
+
content: [
|
|
185
|
+
`[WRITE ENFORCEMENT] You output Markdown code blocks but did NOT call \`write_file\`. Code blocks do nothing — they do not create files.`,
|
|
186
|
+
``,
|
|
187
|
+
`You MUST now call the \`write_file\` tool to complete Step ${pendingWriteStep.id}:`,
|
|
188
|
+
` Action: ${pendingWriteStep.action}`,
|
|
189
|
+
` Tool: \`write_file\``,
|
|
190
|
+
` Path: \`${pendingWriteStep.args['path'] ?? 'the target file'}\``,
|
|
191
|
+
``,
|
|
192
|
+
`IMPORTANT: Use the ACTUAL file content based on the files you already read. Do NOT hardcode version strings, use require() calls, or placeholder values.`,
|
|
193
|
+
`- Read the real file patterns from the files you already read in previous steps.`,
|
|
194
|
+
`- For version: import it from package.json using a standard ESM import or createRequire — do NOT hardcode it.`,
|
|
195
|
+
`- The function/export structure MUST match the pattern used in this project's existing commands.`,
|
|
196
|
+
``,
|
|
197
|
+
`Call \`write_file\` now with the COMPLETE file content. Do NOT output any more Markdown.`,
|
|
198
|
+
].join('\n'),
|
|
199
|
+
});
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
// ── Generic write-mode enforcement (no structured plan) ───────────────────
|
|
203
|
+
// If the model produced only Markdown code blocks without calling write_file,
|
|
204
|
+
// force it to use tools instead. Pivot the message based on what's been done.
|
|
205
|
+
const looksLikeHallucinatedCode = /```(?:typescript|ts|javascript|js)\n/.test(finalText);
|
|
206
|
+
if (looksLikeHallucinatedCode && !tracker.wasToolCalled('write_file') && iteration < MAX_ITERATIONS - 2) {
|
|
207
|
+
stderrLog(formatInternalStatus('Write-enforcement: Markdown-only response — forcing tool use', noColor) + '\n');
|
|
208
|
+
messages.push({ role: 'assistant', content: finalText });
|
|
209
|
+
const alreadyReadRef = tracker.wasToolCalled('read_file');
|
|
210
|
+
if (!alreadyReadRef) {
|
|
211
|
+
messages.push({
|
|
212
|
+
role: 'user',
|
|
213
|
+
content: [
|
|
214
|
+
`[WRITE ENFORCEMENT] You output Markdown code blocks but did NOT call any tools. Code blocks do nothing.`,
|
|
215
|
+
``,
|
|
216
|
+
`Step 1: Call \`read_file\` on src/commands/ask.ts to learn the export pattern.`,
|
|
217
|
+
`Step 2: Call \`read_file\` on src/index.ts to see how commands are registered.`,
|
|
218
|
+
`Step 3: Call \`write_file\` to create/modify every file needed for this task.`,
|
|
219
|
+
``,
|
|
220
|
+
`Start now: call \`read_file\` with path "src/commands/ask.ts".`,
|
|
221
|
+
].join('\n'),
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
messages.push({
|
|
226
|
+
role: 'user',
|
|
227
|
+
content: [
|
|
228
|
+
`[WRITE ENFORCEMENT] You have already read the reference files. Now you MUST call \`write_file\` to complete the task.`,
|
|
229
|
+
``,
|
|
230
|
+
`Original task: "${instruction}"`,
|
|
231
|
+
``,
|
|
232
|
+
`You must call \`write_file\` for EACH file mentioned in the task. Use the COMPLETE file content based on what you read — no placeholder stubs, no hardcoded versions.`,
|
|
233
|
+
``,
|
|
234
|
+
`Call \`write_file\` right now. Do NOT output any Markdown.`,
|
|
235
|
+
].join('\n'),
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
// ── Write-completion check (replaces critic for write tasks) ───────────────
|
|
241
|
+
// In write mode, "done" means all write steps were executed, not a text answer.
|
|
242
|
+
const hasWritePlan = structuredPlan?.steps.some(s => s.tool === 'write_file' || s.tool === 'apply_patch');
|
|
243
|
+
if (hasWritePlan) {
|
|
244
|
+
const allWritesDone = !structuredPlan?.steps
|
|
245
|
+
.slice(currentStepIdx)
|
|
246
|
+
.some(s => s.tool === 'write_file' || s.tool === 'apply_patch');
|
|
247
|
+
if (allWritesDone) {
|
|
248
|
+
await renderResult(finalText || '✓ All write steps completed.', response.usage);
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
// writes remain — write-enforcement above should handle it, but if we reach here just continue
|
|
252
|
+
messages.push({ role: 'assistant', content: finalText });
|
|
253
|
+
messages.push({ role: 'user', content: `Continue executing the remaining steps of the execution plan. Next: Step ${currentStepIdx + 1}.` });
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
// Synthesis grounding with critic (read-only tasks only)
|
|
119
257
|
if (tracker.totalCalls > 0 && !synthesisInjected && iteration < MAX_ITERATIONS - 2) {
|
|
120
258
|
synthesisInjected = true;
|
|
121
259
|
if (finalText.trim().length > 0) {
|
|
122
|
-
stderrLog(formatInternalStatus('Evaluating
|
|
260
|
+
stderrLog(formatInternalStatus('Evaluating result quality…', noColor) + '\n');
|
|
123
261
|
const verdict = await criticEvaluate(adapter, instruction, finalText, { model: profile.model });
|
|
124
262
|
if (verdict.pass) {
|
|
125
263
|
await renderResult(finalText, response.usage);
|
|
@@ -127,10 +265,13 @@ export async function runRun(instruction, options) {
|
|
|
127
265
|
}
|
|
128
266
|
stderrLog(formatInternalStatus(`Critic: ${verdict.reason}`, noColor) + '\n');
|
|
129
267
|
messages.push({ role: 'assistant', content: finalText });
|
|
130
|
-
|
|
268
|
+
const stepHint = structuredPlan && currentStepIdx < structuredPlan.steps.length
|
|
269
|
+
? `\n\nResume execution plan at Step ${structuredPlan.steps[currentStepIdx].id}: ${structuredPlan.steps[currentStepIdx].action}.`
|
|
270
|
+
: '';
|
|
271
|
+
messages.push({ role: 'user', content: buildCriticCorrection(verdict, instruction) + stepHint });
|
|
131
272
|
continue;
|
|
132
273
|
}
|
|
133
|
-
stderrLog(formatInternalStatus('Grounding answer to
|
|
274
|
+
stderrLog(formatInternalStatus('Grounding answer to instruction…', noColor) + '\n');
|
|
134
275
|
messages.push({ role: 'assistant', content: finalText });
|
|
135
276
|
messages.push({ role: 'user', content: buildSynthesisReminder(instruction) });
|
|
136
277
|
continue;
|
|
@@ -141,13 +282,29 @@ export async function runRun(instruction, options) {
|
|
|
141
282
|
if (!verdict.pass) {
|
|
142
283
|
stderrLog(formatInternalStatus(`Critic: ${verdict.reason}`, noColor) + '\n');
|
|
143
284
|
messages.push({ role: 'assistant', content: finalText });
|
|
144
|
-
|
|
285
|
+
const stepHint = structuredPlan && currentStepIdx < structuredPlan.steps.length
|
|
286
|
+
? `\n\nResume execution plan at Step ${structuredPlan.steps[currentStepIdx].id}.`
|
|
287
|
+
: '';
|
|
288
|
+
messages.push({ role: 'user', content: buildCriticCorrection(verdict, instruction) + stepHint });
|
|
145
289
|
continue;
|
|
146
290
|
}
|
|
147
291
|
}
|
|
148
292
|
await renderResult(finalText, response.usage);
|
|
149
293
|
break;
|
|
150
294
|
}
|
|
295
|
+
// Advance plan step if executor used the planned tool
|
|
296
|
+
if (structuredPlan && currentStepIdx < structuredPlan.steps.length && response.toolCalls?.length) {
|
|
297
|
+
const expectedTool = structuredPlan.steps[currentStepIdx].tool;
|
|
298
|
+
if (response.toolCalls.some(tc => tc.name === expectedTool)) {
|
|
299
|
+
currentStepIdx++;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
// Track files read this iteration (for read-before-write gate)
|
|
303
|
+
for (const tc of response.toolCalls ?? []) {
|
|
304
|
+
if (tc.name === 'read_file' && typeof tc.arguments['path'] === 'string') {
|
|
305
|
+
readFiles.add(tc.arguments['path']);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
151
308
|
// Add assistant message to conversation
|
|
152
309
|
messages.push({ role: 'assistant', content: response.content ?? '' });
|
|
153
310
|
// Print any intermediate text
|
|
@@ -179,6 +336,36 @@ export async function runRun(instruction, options) {
|
|
|
179
336
|
}
|
|
180
337
|
}
|
|
181
338
|
stderrLog(formatToolCall(tc.name, tc.arguments, noColor) + '\n');
|
|
339
|
+
// ── Read-before-write gate ─────────────────────────────────────────
|
|
340
|
+
// Block write operations if the target file hasn't been read yet.
|
|
341
|
+
// This prevents the model from overwriting files it hasn't inspected.
|
|
342
|
+
if (!isReadonly && tc.name !== 'run_command') {
|
|
343
|
+
const targetPath = typeof tc.arguments['path'] === 'string' ? tc.arguments['path'] : null;
|
|
344
|
+
if (targetPath && !readFiles.has(targetPath)) {
|
|
345
|
+
// Auto-read the file first
|
|
346
|
+
stderrLog(formatInternalStatus(`Read-before-write: reading ${targetPath} first…`, noColor) + '\n');
|
|
347
|
+
try {
|
|
348
|
+
const { executeReadOnlyTool } = await import('../tools/context-tools.js');
|
|
349
|
+
const existing = await executeReadOnlyTool('read_file', { path: targetPath }, workspaceRoot);
|
|
350
|
+
readFiles.add(targetPath);
|
|
351
|
+
const lineCount = existing.split('\n').length;
|
|
352
|
+
const capped = memory.processToolResult('read_file', { path: targetPath }, existing);
|
|
353
|
+
originalLineCounts.set(targetPath, lineCount);
|
|
354
|
+
messages.push({
|
|
355
|
+
role: 'user',
|
|
356
|
+
content: [
|
|
357
|
+
`[Auto-read before write] Current content of ${targetPath} (${lineCount} lines):`,
|
|
358
|
+
capped,
|
|
359
|
+
``,
|
|
360
|
+
`⚠️ CRITICAL WRITE RULE: The current file is ${lineCount} lines. Your \`write_file\` call MUST include ALL of the original content PLUS your additions. Do NOT write a stub or drop any existing code. The new file should be LONGER than the original.`,
|
|
361
|
+
].join('\n'),
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
catch {
|
|
365
|
+
// File doesn't exist yet (new file) — that's fine, proceed
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
182
369
|
// Confirm write tools based on policy
|
|
183
370
|
if (!isReadonly) {
|
|
184
371
|
if (config.toolPolicy === 'never') {
|
|
@@ -188,6 +375,7 @@ export async function runRun(instruction, options) {
|
|
|
188
375
|
tracker.record(tc.name, tc.arguments, true);
|
|
189
376
|
continue;
|
|
190
377
|
}
|
|
378
|
+
// 'always' — auto-approve all writes without prompting
|
|
191
379
|
if (config.toolPolicy === 'ask_every_time') {
|
|
192
380
|
const allowed = await confirmToolCall(tc.name, tc.arguments);
|
|
193
381
|
if (!allowed) {
|
|
@@ -216,6 +404,40 @@ export async function runRun(instruction, options) {
|
|
|
216
404
|
}
|
|
217
405
|
// Cap tool output before injecting into messages
|
|
218
406
|
const cappedOutput = memory.processToolResult(tc.name, tc.arguments, toolOutput);
|
|
407
|
+
// ── Post-write shrinkage guard ─────────────────────────────────
|
|
408
|
+
// If a write_file replaced an existing file with something suspiciously small,
|
|
409
|
+
// auto-restore it from git and inject an error to redirect the model.
|
|
410
|
+
if (!wasError &&
|
|
411
|
+
tc.name === 'write_file' &&
|
|
412
|
+
typeof tc.arguments['path'] === 'string') {
|
|
413
|
+
const writtenPath = tc.arguments['path'];
|
|
414
|
+
const origLines = originalLineCounts.get(writtenPath);
|
|
415
|
+
if (origLines && origLines > 10) {
|
|
416
|
+
try {
|
|
417
|
+
const { readFile: fsReadFile } = await import('node:fs/promises');
|
|
418
|
+
const newContent = await fsReadFile(join(workspaceRoot, writtenPath), 'utf8');
|
|
419
|
+
const newLines = newContent.split('\n').length;
|
|
420
|
+
// If new file is less than 40% of original, it's a stub — restore
|
|
421
|
+
if (newLines < origLines * 0.4) {
|
|
422
|
+
stderrLog(formatInternalStatus(`Write guard: ${writtenPath} shrank from ${origLines} to ${newLines} lines — restoring from git`, noColor) + '\n');
|
|
423
|
+
const { execSync } = await import('node:child_process');
|
|
424
|
+
execSync(`git checkout -- "${writtenPath}"`, { cwd: workspaceRoot });
|
|
425
|
+
messages.push({
|
|
426
|
+
role: 'user',
|
|
427
|
+
content: [
|
|
428
|
+
`[WRITE GUARD] Your write_file call for \`${writtenPath}\` dropped ${origLines - newLines} lines and was automatically reverted.`,
|
|
429
|
+
``,
|
|
430
|
+
`The original file had ${origLines} lines. You wrote only ${newLines} lines — that's a stub.`,
|
|
431
|
+
`You MUST write the COMPLETE file: all original code PLUS your additions.`,
|
|
432
|
+
`Read the auto-injected content above that was prepended before your write and use it as the base. Do NOT omit any existing code.`,
|
|
433
|
+
].join('\n'),
|
|
434
|
+
});
|
|
435
|
+
break; // exit inner tool loop; outer loop will re-run with correction
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
catch { /* non-fatal */ }
|
|
439
|
+
}
|
|
440
|
+
}
|
|
219
441
|
stderrLog(formatToolResult(cappedOutput, noColor) + '\n');
|
|
220
442
|
tracker.record(tc.name, tc.arguments, wasError);
|
|
221
443
|
messages.push({ role: 'user', content: `[Tool result: ${tc.name}]\n${cappedOutput}` });
|