@visorcraft/idlehands 2.2.24 → 2.2.26

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.
@@ -102,4 +102,81 @@ export function readOnlyExecCacheable(content) {
102
102
  return false;
103
103
  }
104
104
  }
105
+ /**
106
+ * Normalize an exec command for signature comparison by stripping trailing
107
+ * output-filter pipes (| tail, | head, | grep, | sed, | awk, | cut, | sort, | uniq).
108
+ * This ensures commands like:
109
+ * `php artisan test --filter=X 2>&1 | tail -15`
110
+ * `php artisan test --filter=X 2>&1 | tail -50`
111
+ * produce the same normalized form for loop detection.
112
+ */
113
+ export function normalizeExecCommandForSig(command) {
114
+ let cmd = String(command || '').trim();
115
+ if (!cmd)
116
+ return cmd;
117
+ // Strip trailing stderr redirects before pipe analysis
118
+ // e.g. "command 2>&1 | tail -5" → normalize the pipe part
119
+ // We want to keep 2>&1 that precede pipes but strip the output-filter pipes themselves.
120
+ // Iteratively strip trailing output-filter pipes.
121
+ // Match: | (tail|head|grep|sed|awk|cut|sort|uniq|wc|tr) [args...]
122
+ // But only when they appear at the end of the command (i.e., the last pipe segment).
123
+ const FILTER_PIPE_RE = /\s*\|\s*(?:tail|head|grep|egrep|fgrep|sed|awk|cut|sort|uniq|wc|tr)\b[^|]*$/i;
124
+ let prev = cmd;
125
+ for (let i = 0; i < 5; i++) {
126
+ const stripped = cmd.replace(FILTER_PIPE_RE, '').trim();
127
+ if (stripped === cmd || !stripped)
128
+ break;
129
+ cmd = stripped;
130
+ if (cmd === prev)
131
+ break;
132
+ prev = cmd;
133
+ }
134
+ return cmd;
135
+ }
136
+ /**
137
+ * Detect `sed -n 'N,Mp' file` patterns used as a substitute for read_file.
138
+ * Returns a redirect message if detected, or null if not a sed-as-read pattern.
139
+ */
140
+ export function detectSedAsRead(command) {
141
+ const cmd = String(command || '').trim();
142
+ if (!cmd)
143
+ return null;
144
+ // Match: sed -n 'START,ENDp' FILE (with optional quotes around the range)
145
+ const match = cmd.match(/^\s*sed\s+-n\s+['"]?(\d+),(\d+)p['"]?\s+(.+)$/i);
146
+ if (!match)
147
+ return null;
148
+ const startLine = parseInt(match[1], 10);
149
+ const endLine = parseInt(match[2], 10);
150
+ const filePath = match[3].trim().replace(/['"]$/g, '');
151
+ const limit = endLine - startLine + 1;
152
+ return (`STOP: Do not use sed to read file sections. Use read_file instead:\n` +
153
+ ` read_file({ path: "${filePath}", offset: ${startLine}, limit: ${limit} })\n` +
154
+ `This is faster, tracked by the read budget, and avoids unnecessary exec calls.`);
155
+ }
156
+ /**
157
+ * Extract the grep/search pattern from an exec grep command.
158
+ * Returns { pattern, paths } or null if not a grep command.
159
+ */
160
+ export function extractGrepPattern(command) {
161
+ let cmd = String(command || '').trim();
162
+ if (!cmd)
163
+ return null;
164
+ // Strip leading cd && chains
165
+ cmd = cmd.replace(/^(\s*cd\s+[^;&|]+\s*(?:&&|;)\s*)+/i, '').trim();
166
+ // Match: grep [flags] "pattern" path(s)
167
+ // Common forms:
168
+ // grep -rn "pattern" path/
169
+ // grep -n "pattern" file
170
+ // grep -A5 "pattern" file
171
+ const grepMatch = cmd.match(/^\s*(?:grep|egrep|fgrep|rg)\s+(?:[-]\w+\s+)*(?:["']([^"']+)["']|(\S+))\s+(.+?)(?:\s*\|.*)?$/i);
172
+ if (!grepMatch)
173
+ return null;
174
+ const pattern = grepMatch[1] || grepMatch[2];
175
+ if (!pattern)
176
+ return null;
177
+ const pathStr = grepMatch[3].trim();
178
+ // Split paths on whitespace (simplified — doesn't handle quoted paths with spaces)
179
+ const paths = pathStr.split(/\s+/).filter((p) => !p.startsWith('-'));
180
+ return { pattern, paths };
181
+ }
105
182
  //# sourceMappingURL=exec-helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"exec-helpers.js","sourceRoot":"","sources":["../../src/agent/exec-helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"exec-helpers.js","sourceRoot":"","sources":["../../src/agent/exec-helpers.ts"],"names":[],"mappings":"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"}
@@ -30,8 +30,13 @@ export class RulesSection {
30
30
  - When running commands in a subdirectory, use exec's cwd parameter — NOT "cd /path && cmd". Each exec call is a fresh shell; cd does not persist.
31
31
  - Batch work: read all files you need, then apply all edits, then verify.
32
32
  - Be concise. Report what you changed and why.
33
- - Do NOT read every file in a directory. Use search_files or exec with grep to locate relevant code first, then read only the files that match.
34
- - If search_files returns 0 matches, try a broader pattern or use: exec grep -rn "keyword" path/
33
+ - Do NOT read every file in a directory. Use search_files to locate relevant code first, then read only the files that match.
34
+ - If search_files returns 0 matches, try a broader pattern or a different search term.
35
+ - Prefer search_files over exec grep — it produces structured results and is tracked by the read budget. Use exec grep only as a last resort.
36
+ - Never use sed or awk via exec to read file sections. Use read_file with offset/limit parameters instead.
37
+ - When searching for a string, start at the broadest reasonable scope. Do not search a single file first and then progressively widen — search the project root or relevant subtree once.
38
+ - Do not re-run a test command that already passed unless you have made code changes since the last run.
39
+ - After reading a file, remember its contents. Do not re-read the same file unless you have edited it since the last read.
35
40
  - Anton (the autonomous task runner) is ONLY activated when the user explicitly invokes /anton. Never self-activate as Anton or start processing task files on your own.`;
36
41
  }
37
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../src/agent/prompt-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../src/agent/prompt-builder.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,12 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { createToolLoopState, detectToolCallLoop, getToolCallStats, hashToolCall, recordToolCall, recordToolCallOutcome, stableStringify, } from './tool-loop-detection.js';
4
+ import { normalizeExecCommandForSig } from './exec-helpers.js';
4
5
  export class ToolLoopGuard {
5
6
  loopState = createToolLoopState();
6
7
  readCache = new Map();
8
+ /** Per-file content cache keyed by absolute path — survives non-consecutive reads. */
9
+ fileContentCache = new Map();
7
10
  config;
8
11
  recordByCallId = new Map();
9
12
  telemetry = {
@@ -45,6 +48,16 @@ export class ToolLoopGuard {
45
48
  return {};
46
49
  }
47
50
  computeSignature(toolName, args) {
51
+ // For exec calls, normalize the command by stripping trailing output-filter
52
+ // pipes so that `cmd 2>&1 | tail -15` and `cmd 2>&1 | tail -50` produce
53
+ // the same signature for loop detection purposes.
54
+ if (toolName === 'exec' && typeof args.command === 'string') {
55
+ const normalized = normalizeExecCommandForSig(args.command);
56
+ if (normalized !== args.command) {
57
+ const normalizedArgs = { ...args, command: normalized };
58
+ return hashToolCall(toolName, normalizedArgs).signature;
59
+ }
60
+ }
48
61
  return hashToolCall(toolName, args).signature;
49
62
  }
50
63
  prepareTurn(toolCalls) {
@@ -141,6 +154,70 @@ export class ToolLoopGuard {
141
154
  resetReadFileFailureCount() {
142
155
  this.telemetry.readFileFailures = 0;
143
156
  }
157
+ /**
158
+ * Check if a file has been read before and is unchanged (by mtime/size).
159
+ * Works across non-consecutive reads — unlike the signature-based readCache
160
+ * which only catches back-to-back identical calls.
161
+ * Returns cached content with a hint, or null if not cached/stale.
162
+ */
163
+ async getFileContentCache(toolName, args, cwd) {
164
+ if (toolName !== 'read_file')
165
+ return null;
166
+ const filePath = typeof args.path === 'string' ? args.path.trim() : '';
167
+ if (!filePath)
168
+ return null;
169
+ const absPath = filePath.startsWith('/') ? filePath : path.resolve(cwd, filePath);
170
+ const cached = this.fileContentCache.get(absPath);
171
+ if (!cached)
172
+ return null;
173
+ // Check if file has changed since we cached it
174
+ try {
175
+ const stat = await fs.stat(absPath);
176
+ if (stat.mtimeMs !== cached.mtime || stat.size !== cached.size) {
177
+ // File changed — invalidate cache
178
+ this.fileContentCache.delete(absPath);
179
+ return null;
180
+ }
181
+ }
182
+ catch {
183
+ this.fileContentCache.delete(absPath);
184
+ return null;
185
+ }
186
+ this.telemetry.readCacheHits += 1;
187
+ return (`[CACHE HIT] File unchanged since previous read — returning cached content. Do NOT re-read this file unless you edit it first.\n\n` +
188
+ cached.content);
189
+ }
190
+ /**
191
+ * Store file content in the per-file cache after a successful read.
192
+ */
193
+ async storeFileContentCache(toolName, args, cwd, content) {
194
+ if (toolName !== 'read_file')
195
+ return;
196
+ if (content.startsWith('ERROR:'))
197
+ return;
198
+ const filePath = typeof args.path === 'string' ? args.path.trim() : '';
199
+ if (!filePath)
200
+ return;
201
+ const absPath = filePath.startsWith('/') ? filePath : path.resolve(cwd, filePath);
202
+ try {
203
+ const stat = await fs.stat(absPath);
204
+ this.fileContentCache.set(absPath, {
205
+ content,
206
+ mtime: stat.mtimeMs,
207
+ size: stat.size,
208
+ });
209
+ }
210
+ catch {
211
+ // File doesn't exist or unreadable — don't cache
212
+ }
213
+ }
214
+ /**
215
+ * Invalidate file content cache for a path that was just edited.
216
+ * Call this after any mutation tool (edit_file, write_file, etc.) completes.
217
+ */
218
+ invalidateFileContentCache(absPath) {
219
+ this.fileContentCache.delete(absPath);
220
+ }
144
221
  async getReadCacheReplay(toolName, args, cwd) {
145
222
  if (!isReadCacheableTool(toolName))
146
223
  return null;
@@ -255,4 +332,34 @@ async function getResourceVersion(absPath) {
255
332
  export function stableToolArgsForTests(v) {
256
333
  return stableStringify(v);
257
334
  }
335
+ /**
336
+ * Generate parameter mutation hints for read-only tools caught in loops.
337
+ * Helps the model understand how to read different content instead of repeating.
338
+ */
339
+ export function getReadLoopHints(toolName, args) {
340
+ const hints = [];
341
+ if (toolName === "read_file" || toolName === "read_files") {
342
+ const hasOffset = "offset" in args && args.offset !== undefined;
343
+ const hasSearch = "search" in args && args.search !== undefined;
344
+ const limit = typeof args.limit === "number" ? args.limit : 100;
345
+ const currentOffset = typeof args.offset === "number" ? args.offset : 1;
346
+ if (!hasOffset && !hasSearch) {
347
+ hints.push(`Use offset=${limit + 1} to read the next section`);
348
+ hints.push(`Use search="keyword" to jump to specific content`);
349
+ }
350
+ else if (hasOffset && !hasSearch) {
351
+ hints.push(`Increase offset to ${currentOffset + limit} for the next section`);
352
+ hints.push(`Or use search="keyword" to find specific content`);
353
+ }
354
+ }
355
+ else if (toolName === "list_dir") {
356
+ hints.push(`Use recursive=true if you need subdirectory contents`);
357
+ hints.push(`Or filter results with grep/exec instead of re-reading`);
358
+ }
359
+ else if (toolName === "search_files") {
360
+ hints.push(`Adjust the pattern or path to find different results`);
361
+ hints.push(`Increase max_results if truncated`);
362
+ }
363
+ return hints;
364
+ }
258
365
  //# sourceMappingURL=tool-loop-guard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-loop-guard.js","sourceRoot":"","sources":["../../src/agent/tool-loop-guard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool-loop-guard.js","sourceRoot":"","sources":["../../src/agent/tool-loop-guard.ts"],"names":[],"mappings":"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"}
package/dist/agent.js CHANGED
@@ -2,7 +2,7 @@ import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { DEFAULT_SUB_AGENT_RESULT_TOKEN_CAP, DEFAULT_SUB_AGENT_SYSTEM_PROMPT, MCP_TOOLS_REQUEST_TOKEN, } from './agent/constants.js';
4
4
  import { AgentLoopBreak } from './agent/errors.js';
5
- import { execRcShouldSignalFailure, looksLikeReadOnlyExecCommand, readOnlyExecCacheable, withCachedExecObservationHint, withReplayedExecHint, } from './agent/exec-helpers.js';
5
+ import { execRcShouldSignalFailure, looksLikeReadOnlyExecCommand, detectSedAsRead, extractGrepPattern, readOnlyExecCacheable, withCachedExecObservationHint, withReplayedExecHint, } from './agent/exec-helpers.js';
6
6
  import { generateMinimalDiff, toolResultSummary, execCommandFromSig, formatDurationMs, looksLikePlanningNarration, capTextByApproxTokens, sanitizePathsInMessage, digestToolResult, } from './agent/formatting.js';
7
7
  import { autoPickModel } from './agent/model-pick.js';
8
8
  import { reviewArtifactKeys, looksLikeCodeReviewRequest, looksLikeReviewRetrievalRequest, retrievalAllowsStaleArtifact, parseReviewArtifactStalePolicy, parseReviewArtifact, reviewArtifactStaleReason, gitHead, normalizeModelsResponse, } from './agent/review-artifact.js';
@@ -15,7 +15,7 @@ import { LeakDetector } from './security/leak-detector.js';
15
15
  import { PromptGuard } from './security/prompt-guard.js';
16
16
  import { ResponseCache } from './agent/response-cache.js';
17
17
  import { resilientCall } from './agent/resilient-provider.js';
18
- import { ToolLoopGuard } from './agent/tool-loop-guard.js';
18
+ import { ToolLoopGuard, getReadLoopHints } from './agent/tool-loop-guard.js';
19
19
  import { CaptureManager } from './agent/capture.js';
20
20
  import { ClientPool } from './agent/client-pool.js';
21
21
  import { ConversationBranch } from './agent/conversation-branch.js';
@@ -1993,6 +1993,8 @@ export async function createSession(opts) {
1993
1993
  const blockedDirs = new Set();
1994
1994
  // Same-search detection: track search= params across read_file calls
1995
1995
  const searchTermFiles = new Map(); // search term → set of file paths
1996
+ // Widening grep pattern detection: track grep patterns across exec calls
1997
+ const grepPatternPaths = new Map(); // grep pattern → set of paths searched
1996
1998
  // identical tool call signature counts across this ask() run
1997
1999
  const sigCounts = new Map();
1998
2000
  const toolNameByCallId = new Map();
@@ -2857,6 +2859,7 @@ export async function createSession(opts) {
2857
2859
  lastEditedPath = absPath;
2858
2860
  mutationVersion++;
2859
2861
  suppressedTools.clear(); // file changed, re-enable all tools
2862
+ toolLoopGuard.invalidateFileContentCache(absPath);
2860
2863
  },
2861
2864
  });
2862
2865
  // Tool-call argument parsing and validation logic
@@ -3081,7 +3084,7 @@ export async function createSession(opts) {
3081
3084
  // Add helpful guidance
3082
3085
  messages.push({
3083
3086
  role: 'user',
3084
- content: `[system] Tool loop detected: ${toolName} called ${sigCount}x with identical arguments.\n` +
3087
+ content: `[system] ⛔ STOP - Tool loop detected: ${toolName} called ${sigCount}x with identical arguments.\n` +
3085
3088
  `args=${argsPreview}\n\n` +
3086
3089
  `The same edit is being attempted repeatedly. This usually means:\n` +
3087
3090
  `1. The edit already succeeded - verify by reading the file\n` +
@@ -3096,8 +3099,8 @@ export async function createSession(opts) {
3096
3099
  console.error(`[tool-loop] warning: ${toolName} repeated ${sigCount}x. Next repeat will trigger recovery.`);
3097
3100
  messages.push({
3098
3101
  role: 'user',
3099
- content: `[system] Warning: ${toolName} has been called ${sigCount} times with identical arguments. ` +
3100
- `If this edit keeps failing, read the target file to verify its current state before trying again.`,
3102
+ content: `[system] ⚠️ Warning: ${toolName} has been called ${sigCount} times with identical arguments. ` +
3103
+ `If this edit keeps failing, read the target file to verify its current state before trying again. Next identical call will trigger recovery mode.`,
3101
3104
  });
3102
3105
  }
3103
3106
  }
@@ -3110,7 +3113,7 @@ export async function createSession(opts) {
3110
3113
  toollessRecoveryUsed = true;
3111
3114
  messages.push({
3112
3115
  role: 'user',
3113
- content: '[system] Tool loop detected. Tools disabled. Use existing results for next step.',
3116
+ content: '[system] 🛑 Tool loop detected. Tools disabled for this turn. Analyze the situation using existing results and explain what went wrong before continuing.',
3114
3117
  });
3115
3118
  await emitTurnEnd({
3116
3119
  turn: turns,
@@ -3215,6 +3218,38 @@ export async function createSession(opts) {
3215
3218
  throw new Error(`exec: ${reason} — command: ${args.command}`);
3216
3219
  }
3217
3220
  }
3221
+ // ── Exec anti-pattern detection: sed-as-read and widening grep ──
3222
+ if (name === 'exec' && typeof args.command === 'string') {
3223
+ // Detect sed -n 'N,Mp' used as a substitute for read_file
3224
+ const sedRedirect = detectSedAsRead(args.command);
3225
+ if (sedRedirect) {
3226
+ await emitToolCall(callId, name, args);
3227
+ await emitToolResult({
3228
+ id: callId,
3229
+ name,
3230
+ success: false,
3231
+ summary: 'use read_file instead of sed',
3232
+ result: '',
3233
+ });
3234
+ return { id: callId, content: sedRedirect };
3235
+ }
3236
+ // Track widening grep patterns (same search string, expanding paths)
3237
+ const grepInfo = extractGrepPattern(args.command);
3238
+ if (grepInfo) {
3239
+ const key = grepInfo.pattern.toLowerCase();
3240
+ if (!grepPatternPaths.has(key))
3241
+ grepPatternPaths.set(key, new Set());
3242
+ for (const p of grepInfo.paths)
3243
+ grepPatternPaths.get(key).add(p);
3244
+ if (grepPatternPaths.get(key).size >= 3) {
3245
+ messages.push({
3246
+ role: 'user',
3247
+ content: `[system] You have searched for "${grepInfo.pattern}" across ${grepPatternPaths.get(key).size} different paths. ` +
3248
+ `Start with the broadest scope next time: search_files({ pattern: "${grepInfo.pattern}", path: "." })`,
3249
+ });
3250
+ }
3251
+ }
3252
+ }
3218
3253
  if (isMutationTool(name) && typeof args.path === 'string') {
3219
3254
  const absPath = args.path.startsWith('/')
3220
3255
  ? args.path
@@ -3253,7 +3288,7 @@ export async function createSession(opts) {
3253
3288
  });
3254
3289
  return {
3255
3290
  id: callId,
3256
- content: `STOP: Read budget exhausted (${cumulativeReadOnlyCalls}/${READ_BUDGET_HARD} calls). Do NOT read more files. Use search_files or exec: grep -rn "pattern" path/ to find what you need.`,
3291
+ content: `STOP: Read budget exhausted (${cumulativeReadOnlyCalls}/${READ_BUDGET_HARD} calls). Do NOT read more files. Use search_files(pattern, path) to find what you need.`,
3257
3292
  };
3258
3293
  }
3259
3294
  // Fix 2: Directory scan detection — counts unique files per dir (re-reads are OK)
@@ -3280,7 +3315,7 @@ export async function createSession(opts) {
3280
3315
  });
3281
3316
  return {
3282
3317
  id: callId,
3283
- content: `STOP: Directory scan detected — you've read ${uniqueCount} unique files from ${parentDir}/. Use search_files(pattern, '${parentDir}') or exec: grep -rn "pattern" ${parentDir}/ instead of reading files individually.`,
3318
+ content: `STOP: Directory scan detected — you've read ${uniqueCount} unique files from ${parentDir}/. Use search_files(pattern, '${parentDir}') instead of reading files individually.`,
3284
3319
  };
3285
3320
  }
3286
3321
  }
@@ -3301,7 +3336,7 @@ export async function createSession(opts) {
3301
3336
  });
3302
3337
  return {
3303
3338
  id: callId,
3304
- content: `STOP: You've searched ${searchTermFiles.get(key).size} files for "${searchTerm}" one at a time. This is what search_files does in one call. Use: search_files(pattern="${searchTerm}", path=".") or exec: grep -rn "${searchTerm}" .`,
3339
+ content: `STOP: You've searched ${searchTermFiles.get(key).size} files for "${searchTerm}" one at a time. This is what search_files does in one call. Use: search_files(pattern="${searchTerm}", path=".")`,
3305
3340
  };
3306
3341
  }
3307
3342
  }
@@ -3374,6 +3409,16 @@ export async function createSession(opts) {
3374
3409
  reusedCachedReadOnlyExec = true; // skip re-execution below
3375
3410
  }
3376
3411
  }
3412
+ // Per-file content cache: catches non-consecutive re-reads of unchanged files.
3413
+ // This fires even when the consecutive-repeat detector misses (interleaved calls).
3414
+ if (name === 'read_file' && !reusedCachedReadOnlyExec && !reusedCachedReadTool) {
3415
+ const fileReplay = await toolLoopGuard.getFileContentCache(name, args, ctx.cwd);
3416
+ if (fileReplay) {
3417
+ content = fileReplay;
3418
+ reusedCachedReadTool = true;
3419
+ cumulativeReadOnlyCalls++; // still counts toward budget
3420
+ }
3421
+ }
3377
3422
  if (READ_FILE_CACHE_TOOLS.has(name) && repeatedReadFileSigs.has(sig)) {
3378
3423
  const replay = await toolLoopGuard.getReadCacheReplay(name, args, ctx.cwd);
3379
3424
  if (replay) {
@@ -3485,6 +3530,11 @@ export async function createSession(opts) {
3485
3530
  const baseCwd = typeof args?.cwd === 'string' ? String(args.cwd) : ctx.cwd;
3486
3531
  await toolLoopGuard.storeReadCache(name, args, baseCwd, content);
3487
3532
  }
3533
+ // Store in per-file content cache for non-consecutive re-read detection
3534
+ if (name === 'read_file' && typeof content === 'string' && !content.startsWith('ERROR:')) {
3535
+ const baseCwd = typeof args?.cwd === 'string' ? String(args.cwd) : ctx.cwd;
3536
+ await toolLoopGuard.storeFileContentCache(name, args, baseCwd, content);
3537
+ }
3488
3538
  if (name === 'exec') {
3489
3539
  // Successful exec clears blocked-loop counters.
3490
3540
  blockedExecAttemptsBySig.clear();
@@ -3538,11 +3588,22 @@ export async function createSession(opts) {
3538
3588
  }
3539
3589
  }
3540
3590
  // Append a hint when a read-only tool is called consecutively with
3541
- // identical arguments — the model may not realize the content hasn't changed.
3591
+ // identical arguments — the model may not realize the content has not changed.
3542
3592
  if (isReadOnlyToolDynamic(name)) {
3543
3593
  const consec = consecutiveCounts.get(sig) ?? 0;
3544
3594
  if (consec >= 2) {
3545
- content += `\n\n[WARNING: You have read this exact same resource ${consec}x consecutively with identical arguments. The content has NOT changed. Do NOT read it again. Use the information above and move on to the next step.]`;
3595
+ const argsObj = toolLoopGuard.parseArgs(tc.function?.arguments ?? "{}");
3596
+ const hints = getReadLoopHints(name, argsObj);
3597
+ const hintBlock = hints.length > 0
3598
+ ? `\n\nTo read different content, try:\n${hints.map(h => `- ${h}`).join("\n")}`
3599
+ : "";
3600
+ if (consec >= 4) {
3601
+ // Critical: disable the tool temporarily
3602
+ content = `Error: This exact ${name} call has been repeated ${consec} times with identical arguments and results. The tool is temporarily disabled. Use the information you already have, or try a different approach.${hintBlock}`;
3603
+ }
3604
+ else {
3605
+ content += `\n\n[WARNING: You have read this exact same resource ${consec}x consecutively with identical arguments. The content has NOT changed. Do NOT read it again. Use the information above and move on to the next step.]${hintBlock}`;
3606
+ }
3546
3607
  }
3547
3608
  }
3548
3609
  // ── Early truncation pass ──────────────────────────────────
@@ -3814,7 +3875,7 @@ export async function createSession(opts) {
3814
3875
  const callId = resolveCallId(tc);
3815
3876
  results.push({
3816
3877
  id: callId,
3817
- content: `STOP: Per-turn read limit (${READ_ONLY_PER_TURN_CAP}). Use search_files or exec with grep instead of reading files one by one.`,
3878
+ content: `STOP: Per-turn read limit (${READ_ONLY_PER_TURN_CAP}). Use search_files(pattern, path) instead of reading files one by one.`,
3818
3879
  });
3819
3880
  }
3820
3881
  if (cfg.verbose) {