v0.6.0: complete all 12 local-model upgrades + raise maxIterations to 100

Upgrade candidates (all 12 done):
- #1 parallel read-only tool execution (runToolBatch, 4 loop sites)
- #2 configurable retry policy (maxRetries + exponential backoff via SDK)
- #3 script-aware token estimation (CJK/symbol/structure-aware heuristic)
- #4 head+tail output capping (truncate.ts), auto-applies to bash/git/etc
- #5 partial-history compaction (preserve recent tail, summarize older prefix)
- #6 dynamic max_tokens (resolveMaxTokens)
- #7 richer tool descriptions with "use when" guidance
- #8 MCP reconnect retry + /mcp reconnect command + session toolset refresh
- #9 context-window cache TTL (cachedAt timestamp, default 7 days)
- #10 edit_file similar-match suggestion on old_string miss (bounded Levenshtein)
- #11 git_status output head+tail (resolved via #4)
- #12 auto-accept now approves all mutating tools; auto-edit stays edit-only

Other:
- DEFAULT_MAX_ITERATIONS 50 -> 100 (local models issue one tool call per step)
- MaxIterationsError message guides resume + config override
- plus prior known-issues work (grep -e/--, session id sanitization, MCP content
  types, 12 hook events, plugin collisions, skill references, git ops expansion,
  configurable autoCompactThreshold, bashGuard, pathGuard, FilePanel, replay)
This commit is contained in:
kim
2026-08-20 16:52:03 +09:00
parent 6677ac1e9e
commit 6fe98887d5
54 changed files with 2944 additions and 456 deletions
+21 -3
View File
@@ -114,20 +114,24 @@ configCmd
configCmd
.command("set <key> <value>")
.description("Persist a config value (backend, model, baseUrl, contextWindow, maxIterations, autoCompactThreshold, requestTimeoutMs, subagentTimeoutMs)")
.description(
"Persist a config value (backend, model, baseUrl, contextWindow, maxOutputTokens, maxIterations, autoCompactThreshold, requestTimeoutMs, subagentTimeoutMs, maxRetries)",
)
.action((key: string, value: string) => {
if (
key !== "backend" &&
key !== "model" &&
key !== "baseUrl" &&
key !== "contextWindow" &&
key !== "maxOutputTokens" &&
key !== "maxIterations" &&
key !== "autoCompactThreshold" &&
key !== "requestTimeoutMs" &&
key !== "subagentTimeoutMs"
key !== "subagentTimeoutMs" &&
key !== "maxRetries"
) {
console.error(
`Unknown config key "${key}". Valid keys: backend, model, baseUrl, contextWindow, maxIterations, autoCompactThreshold, requestTimeoutMs, subagentTimeoutMs`,
`Unknown config key "${key}". Valid keys: backend, model, baseUrl, contextWindow, maxOutputTokens, maxIterations, autoCompactThreshold, requestTimeoutMs, subagentTimeoutMs, maxRetries`,
);
process.exit(1);
}
@@ -139,6 +143,13 @@ configCmd
process.exit(1);
}
stored[key] = n;
} else if (key === "maxOutputTokens") {
const n = Number(value);
if (!Number.isFinite(n) || n < 256 || n > 1_000_000) {
console.error(`maxOutputTokens must be between 256 and 1000000, got "${value}".`);
process.exit(1);
}
stored[key] = n;
} else if (key === "autoCompactThreshold") {
const n = Number(value);
if (!Number.isFinite(n) || n < 0.1 || n > 0.95) {
@@ -160,6 +171,13 @@ configCmd
process.exit(1);
}
stored[key] = n;
} else if (key === "maxRetries") {
const n = Number(value);
if (!Number.isFinite(n) || n < 0 || n > 10) {
console.error(`maxRetries must be between 0 and 10, got "${value}".`);
process.exit(1);
}
stored[key] = n;
} else {
stored[key] = value;
}