@visorcraft/idlehands 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +30 -0
- package/dist/agent.js +2604 -0
- package/dist/agent.js.map +1 -0
- package/dist/anton/controller.js +341 -0
- package/dist/anton/controller.js.map +1 -0
- package/dist/anton/lock.js +110 -0
- package/dist/anton/lock.js.map +1 -0
- package/dist/anton/parser.js +303 -0
- package/dist/anton/parser.js.map +1 -0
- package/dist/anton/prompt.js +203 -0
- package/dist/anton/prompt.js.map +1 -0
- package/dist/anton/reporter.js +119 -0
- package/dist/anton/reporter.js.map +1 -0
- package/dist/anton/session.js +51 -0
- package/dist/anton/session.js.map +1 -0
- package/dist/anton/types.js +7 -0
- package/dist/anton/types.js.map +1 -0
- package/dist/anton/verifier.js +263 -0
- package/dist/anton/verifier.js.map +1 -0
- package/dist/bench/compare.js +239 -0
- package/dist/bench/compare.js.map +1 -0
- package/dist/bench/debug_hooks.js +17 -0
- package/dist/bench/debug_hooks.js.map +1 -0
- package/dist/bench/json_extract.js +22 -0
- package/dist/bench/json_extract.js.map +1 -0
- package/dist/bench/openclaw.js +86 -0
- package/dist/bench/openclaw.js.map +1 -0
- package/dist/bench/report.js +116 -0
- package/dist/bench/report.js.map +1 -0
- package/dist/bench/runner.js +312 -0
- package/dist/bench/runner.js.map +1 -0
- package/dist/bench/types.js +2 -0
- package/dist/bench/types.js.map +1 -0
- package/dist/bot/commands.js +444 -0
- package/dist/bot/commands.js.map +1 -0
- package/dist/bot/confirm-discord.js +133 -0
- package/dist/bot/confirm-discord.js.map +1 -0
- package/dist/bot/confirm-telegram.js +290 -0
- package/dist/bot/confirm-telegram.js.map +1 -0
- package/dist/bot/discord.js +826 -0
- package/dist/bot/discord.js.map +1 -0
- package/dist/bot/format.js +210 -0
- package/dist/bot/format.js.map +1 -0
- package/dist/bot/session-manager.js +270 -0
- package/dist/bot/session-manager.js.map +1 -0
- package/dist/bot/telegram.js +678 -0
- package/dist/bot/telegram.js.map +1 -0
- package/dist/cli/agent-turn.js +45 -0
- package/dist/cli/agent-turn.js.map +1 -0
- package/dist/cli/args.js +236 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/bot.js +252 -0
- package/dist/cli/bot.js.map +1 -0
- package/dist/cli/build-repl-context.js +365 -0
- package/dist/cli/build-repl-context.js.map +1 -0
- package/dist/cli/command-registry.js +20 -0
- package/dist/cli/command-registry.js.map +1 -0
- package/dist/cli/commands/anton.js +271 -0
- package/dist/cli/commands/anton.js.map +1 -0
- package/dist/cli/commands/editing.js +328 -0
- package/dist/cli/commands/editing.js.map +1 -0
- package/dist/cli/commands/model.js +274 -0
- package/dist/cli/commands/model.js.map +1 -0
- package/dist/cli/commands/project.js +255 -0
- package/dist/cli/commands/project.js.map +1 -0
- package/dist/cli/commands/runtime.js +63 -0
- package/dist/cli/commands/runtime.js.map +1 -0
- package/dist/cli/commands/session.js +281 -0
- package/dist/cli/commands/session.js.map +1 -0
- package/dist/cli/commands/tools.js +126 -0
- package/dist/cli/commands/tools.js.map +1 -0
- package/dist/cli/commands/trifecta.js +221 -0
- package/dist/cli/commands/trifecta.js.map +1 -0
- package/dist/cli/commands/tui.js +17 -0
- package/dist/cli/commands/tui.js.map +1 -0
- package/dist/cli/init.js +222 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/input.js +360 -0
- package/dist/cli/input.js.map +1 -0
- package/dist/cli/oneshot.js +254 -0
- package/dist/cli/oneshot.js.map +1 -0
- package/dist/cli/repl-context.js +2 -0
- package/dist/cli/repl-context.js.map +1 -0
- package/dist/cli/runtime-cmds.js +811 -0
- package/dist/cli/runtime-cmds.js.map +1 -0
- package/dist/cli/service.js +145 -0
- package/dist/cli/service.js.map +1 -0
- package/dist/cli/session-state.js +130 -0
- package/dist/cli/session-state.js.map +1 -0
- package/dist/cli/setup.js +815 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/shell.js +79 -0
- package/dist/cli/shell.js.map +1 -0
- package/dist/cli/status.js +392 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/watch.js +33 -0
- package/dist/cli/watch.js.map +1 -0
- package/dist/client.js +676 -0
- package/dist/client.js.map +1 -0
- package/dist/commands.js +194 -0
- package/dist/commands.js.map +1 -0
- package/dist/config.js +507 -0
- package/dist/config.js.map +1 -0
- package/dist/confirm/auto.js +13 -0
- package/dist/confirm/auto.js.map +1 -0
- package/dist/confirm/headless.js +41 -0
- package/dist/confirm/headless.js.map +1 -0
- package/dist/confirm/terminal.js +90 -0
- package/dist/confirm/terminal.js.map +1 -0
- package/dist/context.js +49 -0
- package/dist/context.js.map +1 -0
- package/dist/git.js +136 -0
- package/dist/git.js.map +1 -0
- package/dist/harnesses.js +171 -0
- package/dist/harnesses.js.map +1 -0
- package/dist/history.js +139 -0
- package/dist/history.js.map +1 -0
- package/dist/index.js +700 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer.js +374 -0
- package/dist/indexer.js.map +1 -0
- package/dist/jsonrpc.js +76 -0
- package/dist/jsonrpc.js.map +1 -0
- package/dist/lens.js +525 -0
- package/dist/lens.js.map +1 -0
- package/dist/lsp.js +605 -0
- package/dist/lsp.js.map +1 -0
- package/dist/markdown.js +275 -0
- package/dist/markdown.js.map +1 -0
- package/dist/mcp.js +554 -0
- package/dist/mcp.js.map +1 -0
- package/dist/recovery.js +178 -0
- package/dist/recovery.js.map +1 -0
- package/dist/replay.js +132 -0
- package/dist/replay.js.map +1 -0
- package/dist/replay_cli.js +24 -0
- package/dist/replay_cli.js.map +1 -0
- package/dist/runtime/executor.js +418 -0
- package/dist/runtime/executor.js.map +1 -0
- package/dist/runtime/planner.js +197 -0
- package/dist/runtime/planner.js.map +1 -0
- package/dist/runtime/store.js +289 -0
- package/dist/runtime/store.js.map +1 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/safety.js +446 -0
- package/dist/safety.js.map +1 -0
- package/dist/spinner.js +224 -0
- package/dist/spinner.js.map +1 -0
- package/dist/sys/context.js +124 -0
- package/dist/sys/context.js.map +1 -0
- package/dist/sys/snapshot.sh +97 -0
- package/dist/term.js +61 -0
- package/dist/term.js.map +1 -0
- package/dist/themes.js +135 -0
- package/dist/themes.js.map +1 -0
- package/dist/tools.js +1114 -0
- package/dist/tools.js.map +1 -0
- package/dist/tui/branch-picker.js +65 -0
- package/dist/tui/branch-picker.js.map +1 -0
- package/dist/tui/command-handler.js +108 -0
- package/dist/tui/command-handler.js.map +1 -0
- package/dist/tui/confirm.js +90 -0
- package/dist/tui/confirm.js.map +1 -0
- package/dist/tui/controller.js +463 -0
- package/dist/tui/controller.js.map +1 -0
- package/dist/tui/event-bridge.js +44 -0
- package/dist/tui/event-bridge.js.map +1 -0
- package/dist/tui/events.js +2 -0
- package/dist/tui/events.js.map +1 -0
- package/dist/tui/keymap.js +144 -0
- package/dist/tui/keymap.js.map +1 -0
- package/dist/tui/layout.js +11 -0
- package/dist/tui/layout.js.map +1 -0
- package/dist/tui/render.js +186 -0
- package/dist/tui/render.js.map +1 -0
- package/dist/tui/screen.js +48 -0
- package/dist/tui/screen.js.map +1 -0
- package/dist/tui/state.js +167 -0
- package/dist/tui/state.js.map +1 -0
- package/dist/tui/theme.js +70 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/types.js +2 -0
- package/dist/tui/types.js.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/upgrade.js +412 -0
- package/dist/upgrade.js.map +1 -0
- package/dist/utils.js +87 -0
- package/dist/utils.js.map +1 -0
- package/dist/vault.js +520 -0
- package/dist/vault.js.map +1 -0
- package/dist/vim.js +160 -0
- package/dist/vim.js.map +1 -0
- package/package.json +67 -0
- package/src/sys/snapshot.sh +97 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TerminalConfirmProvider — interactive readline-based confirmation.
|
|
3
|
+
* Implements Phase 8c: diff preview, shell prompts, remembered decisions.
|
|
4
|
+
*/
|
|
5
|
+
export class TerminalConfirmProvider {
|
|
6
|
+
rl;
|
|
7
|
+
/**
|
|
8
|
+
* Remembered decisions: keyed by tool+identifier.
|
|
9
|
+
* If a user approves `exec:npm test` once, we auto-approve it for the rest of the session.
|
|
10
|
+
*/
|
|
11
|
+
remembered = new Map();
|
|
12
|
+
constructor(rl) {
|
|
13
|
+
this.rl = rl;
|
|
14
|
+
}
|
|
15
|
+
async confirm(opts) {
|
|
16
|
+
// Check remembered decisions
|
|
17
|
+
const memKey = this.memoryKey(opts);
|
|
18
|
+
if (memKey && this.remembered.has(memKey)) {
|
|
19
|
+
const decision = this.remembered.get(memKey);
|
|
20
|
+
const tag = decision ? '✓' : '✗';
|
|
21
|
+
console.error(`\x1b[2m[remembered ${tag}] ${opts.summary}\x1b[0m`);
|
|
22
|
+
return decision;
|
|
23
|
+
}
|
|
24
|
+
const hasDiff = Boolean(opts.diff);
|
|
25
|
+
const prompt = this.formatPrompt(opts, hasDiff);
|
|
26
|
+
const ans = (await this.rl.question(prompt)).trim().toLowerCase();
|
|
27
|
+
// Handle diff request
|
|
28
|
+
if (hasDiff && (ans === 'd' || ans === 'diff')) {
|
|
29
|
+
console.log(opts.diff);
|
|
30
|
+
// Re-prompt after showing diff
|
|
31
|
+
const ans2 = (await this.rl.question('Apply? [Y/n] ')).trim().toLowerCase();
|
|
32
|
+
const approved = ans2 === '' || ans2 === 'y' || ans2 === 'yes';
|
|
33
|
+
if (memKey)
|
|
34
|
+
this.remembered.set(memKey, approved);
|
|
35
|
+
return approved;
|
|
36
|
+
}
|
|
37
|
+
const approved = ans === '' || ans === 'y' || ans === 'yes';
|
|
38
|
+
if (memKey)
|
|
39
|
+
this.remembered.set(memKey, approved);
|
|
40
|
+
return approved;
|
|
41
|
+
}
|
|
42
|
+
async showBlocked(opts) {
|
|
43
|
+
console.error(`\x1b[31m[blocked]\x1b[0m ${opts.tool}: ${opts.reason}`);
|
|
44
|
+
}
|
|
45
|
+
/** Clear remembered decisions (e.g. on session reset). */
|
|
46
|
+
clearRemembered() {
|
|
47
|
+
this.remembered.clear();
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Generate a memory key for a tool+args combination.
|
|
51
|
+
* - exec: keyed by command string
|
|
52
|
+
* - file tools: keyed by path
|
|
53
|
+
* - other: null (don't remember)
|
|
54
|
+
*/
|
|
55
|
+
memoryKey(opts) {
|
|
56
|
+
if (opts.tool === 'exec') {
|
|
57
|
+
const cmd = typeof opts.args.command === 'string' ? opts.args.command : '';
|
|
58
|
+
return cmd ? `exec:${cmd}` : null;
|
|
59
|
+
}
|
|
60
|
+
if (opts.tool === 'edit_file' || opts.tool === 'write_file' || opts.tool === 'insert_file') {
|
|
61
|
+
const p = typeof opts.args.path === 'string' ? opts.args.path : '';
|
|
62
|
+
return p ? `${opts.tool}:${p}` : null;
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
formatPrompt(opts, hasDiff) {
|
|
67
|
+
if (opts.tool === 'exec') {
|
|
68
|
+
const cmd = typeof opts.args.command === 'string' ? opts.args.command : opts.summary;
|
|
69
|
+
return this.boxedPrompt(`Run: ${cmd}`, '[Y/n]');
|
|
70
|
+
}
|
|
71
|
+
if (hasDiff) {
|
|
72
|
+
// Show summary with diff option
|
|
73
|
+
return this.boxedPrompt(opts.summary, '[Y/n/diff]');
|
|
74
|
+
}
|
|
75
|
+
return this.boxedPrompt(opts.summary, '[Y/n]');
|
|
76
|
+
}
|
|
77
|
+
/** Format a boxed prompt: ┌─ summary ─┐ with action hints */
|
|
78
|
+
boxedPrompt(summary, suffix) {
|
|
79
|
+
const maxW = Math.min(process.stdout.columns ?? 80, 80);
|
|
80
|
+
const inner = summary.length > maxW - 6 ? summary.slice(0, maxW - 9) + '...' : summary;
|
|
81
|
+
const border = '─'.repeat(Math.max(inner.length + 2, 20));
|
|
82
|
+
const lines = [
|
|
83
|
+
`┌${border}┐`,
|
|
84
|
+
`│ ${inner.padEnd(border.length - 1)}│`,
|
|
85
|
+
`└${border}┘`
|
|
86
|
+
];
|
|
87
|
+
return `${lines.join('\n')}\n${suffix} `;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/confirm/terminal.ts"],"names":[],"mappings":"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"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { estimateTokens } from './utils.js';
|
|
4
|
+
async function readIfExists(p) {
|
|
5
|
+
try {
|
|
6
|
+
const st = await fs.stat(p);
|
|
7
|
+
if (!st.isFile())
|
|
8
|
+
return null;
|
|
9
|
+
return await fs.readFile(p, 'utf8');
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export async function loadProjectContext(cfg) {
|
|
16
|
+
if (cfg.no_context)
|
|
17
|
+
return '';
|
|
18
|
+
const maxTokens = cfg.context_max_tokens ?? 8192;
|
|
19
|
+
const cwd = cfg.dir ? path.resolve(cfg.dir) : process.cwd();
|
|
20
|
+
// Build candidate list: explicit override first, then search-order names
|
|
21
|
+
const candidates = [];
|
|
22
|
+
if (cfg.context_file && cfg.context_file.trim()) {
|
|
23
|
+
candidates.push(cfg.context_file.trim());
|
|
24
|
+
}
|
|
25
|
+
const names = cfg.context_file_names?.length ? cfg.context_file_names : [];
|
|
26
|
+
for (const n of names)
|
|
27
|
+
candidates.push(n);
|
|
28
|
+
// First match wins (plan §9b)
|
|
29
|
+
for (const f of candidates) {
|
|
30
|
+
const abs = path.isAbsolute(f) ? f : path.join(cwd, f);
|
|
31
|
+
const txt = await readIfExists(abs);
|
|
32
|
+
if (!txt)
|
|
33
|
+
continue;
|
|
34
|
+
const chunk = `[Project context from ${abs}]\n${txt.trim()}\n[End project context]`;
|
|
35
|
+
const t = estimateTokens(chunk);
|
|
36
|
+
if (t > maxTokens) {
|
|
37
|
+
throw new Error(`Project context file is ~${t} tokens (${abs}). Max is ${maxTokens}. ` +
|
|
38
|
+
`Trim it or use --no-context to skip.`);
|
|
39
|
+
}
|
|
40
|
+
if (t > 2048) {
|
|
41
|
+
// Warn but still include (plan §9b: 2049–8192 range)
|
|
42
|
+
const warn = `[note: project context is ~${t} tokens — consider trimming ${path.basename(abs)}]`;
|
|
43
|
+
return `${warn}\n${chunk}`;
|
|
44
|
+
}
|
|
45
|
+
return chunk;
|
|
46
|
+
}
|
|
47
|
+
return '';
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,KAAK,UAAU,YAAY,CAAC,CAAS;IACnC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9B,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAoB;IAC3D,IAAI,GAAG,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAE9B,MAAM,SAAS,GAAG,GAAG,CAAC,kBAAkB,IAAI,IAAI,CAAC;IACjD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAE5D,yEAAyE;IACzE,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;QAChD,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE1C,8BAA8B;IAC9B,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG;YAAE,SAAS;QAEnB,MAAM,KAAK,GAAG,yBAAyB,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,yBAAyB,CAAC;QACpF,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAEhC,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,4BAA4B,CAAC,YAAY,GAAG,aAAa,SAAS,IAAI;gBACtE,sCAAsC,CACvC,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;YACb,qDAAqD;YACrD,MAAM,IAAI,GAAG,8BAA8B,CAAC,+BAA+B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YACjG,OAAO,GAAG,IAAI,KAAK,KAAK,EAAE,CAAC;QAC7B,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
package/dist/git.js
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
2
|
+
import { BASH_PATH as BASH } from './utils.js';
|
|
3
|
+
async function sh(cmd, cwd, timeoutSec) {
|
|
4
|
+
return await new Promise((resolve) => {
|
|
5
|
+
let child;
|
|
6
|
+
try {
|
|
7
|
+
child = spawn(BASH, ['-lc', cmd], { cwd, stdio: ['ignore', 'pipe', 'ignore'] });
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
resolve({ rc: 127, out: '' });
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const out = [];
|
|
14
|
+
const t = setTimeout(() => child.kill('SIGKILL'), Math.max(1, timeoutSec) * 1000);
|
|
15
|
+
child.on('error', () => {
|
|
16
|
+
clearTimeout(t);
|
|
17
|
+
resolve({ rc: 127, out: '' });
|
|
18
|
+
});
|
|
19
|
+
child.stdout.on('data', (d) => out.push(d));
|
|
20
|
+
child.on('close', (code) => {
|
|
21
|
+
clearTimeout(t);
|
|
22
|
+
resolve({ rc: code ?? 0, out: Buffer.concat(out).toString('utf8') });
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function clipLines(s, maxLines, maxChars) {
|
|
27
|
+
const lines = s.split(/\r?\n/).filter(Boolean);
|
|
28
|
+
const clipped = lines.slice(0, maxLines);
|
|
29
|
+
let out = clipped.join('\n');
|
|
30
|
+
if (out.length > maxChars)
|
|
31
|
+
out = out.slice(0, maxChars) + '\n[truncated]';
|
|
32
|
+
if (lines.length > maxLines)
|
|
33
|
+
out += `\n[truncated: ${lines.length - maxLines} more lines]`;
|
|
34
|
+
return out;
|
|
35
|
+
}
|
|
36
|
+
export async function loadGitContext(cwd) {
|
|
37
|
+
// Avoid slow git operations; keep it short and bounded.
|
|
38
|
+
const inside = await sh('git rev-parse --is-inside-work-tree', cwd, 1);
|
|
39
|
+
if (inside.rc !== 0 || !inside.out.trim().startsWith('true'))
|
|
40
|
+
return '';
|
|
41
|
+
const branch = await sh('git rev-parse --abbrev-ref HEAD', cwd, 1);
|
|
42
|
+
const status = await sh('git status -s', cwd, 2);
|
|
43
|
+
const diffstat = await sh('git diff --stat', cwd, 2);
|
|
44
|
+
const recent = await sh('git log --oneline -5', cwd, 2);
|
|
45
|
+
const parts = [];
|
|
46
|
+
parts.push(`[git branch: ${branch.out.trim() || 'unknown'}]`);
|
|
47
|
+
const st = clipLines(status.out, 40, 2000);
|
|
48
|
+
if (st.trim()) {
|
|
49
|
+
parts.push('[git status -s]');
|
|
50
|
+
parts.push(st);
|
|
51
|
+
}
|
|
52
|
+
const ds = clipLines(diffstat.out, 40, 2000);
|
|
53
|
+
if (ds.trim()) {
|
|
54
|
+
parts.push('[git diff --stat]');
|
|
55
|
+
parts.push(ds);
|
|
56
|
+
}
|
|
57
|
+
const lg = clipLines(recent.out, 8, 1200);
|
|
58
|
+
if (lg.trim()) {
|
|
59
|
+
parts.push('[git log --oneline -5]');
|
|
60
|
+
parts.push(lg);
|
|
61
|
+
}
|
|
62
|
+
return parts.join('\n');
|
|
63
|
+
}
|
|
64
|
+
export function isGitDirty(cwd) {
|
|
65
|
+
const inside = spawnSync(BASH, ['-lc', 'git rev-parse --is-inside-work-tree'], { cwd, encoding: 'utf8', timeout: 1000 });
|
|
66
|
+
if (inside.status !== 0 || !String(inside.stdout || '').trim().startsWith('true'))
|
|
67
|
+
return false;
|
|
68
|
+
const st = spawnSync(BASH, ['-lc', 'git status --porcelain'], { cwd, encoding: 'utf8', timeout: 1500 });
|
|
69
|
+
return st.status === 0 && String(st.stdout || '').trim().length > 0;
|
|
70
|
+
}
|
|
71
|
+
export function stashWorkingTree(cwd) {
|
|
72
|
+
const stamp = new Date().toISOString();
|
|
73
|
+
const res = spawnSync(BASH, ['-lc', `git stash push -u -m "idlehands auto-stash ${stamp}"`], { cwd, encoding: 'utf8', timeout: 5000 });
|
|
74
|
+
const out = `${res.stdout || ''}${res.stderr || ''}`.trim();
|
|
75
|
+
if (res.status === 0)
|
|
76
|
+
return { ok: true, message: out || 'stashed' };
|
|
77
|
+
return { ok: false, message: out || `git stash failed (rc=${res.status ?? 1})` };
|
|
78
|
+
}
|
|
79
|
+
export async function loadGitStartupSummary(cwd) {
|
|
80
|
+
const inside = await sh('git rev-parse --is-inside-work-tree', cwd, 1);
|
|
81
|
+
if (inside.rc !== 0 || !inside.out.trim().startsWith('true'))
|
|
82
|
+
return '';
|
|
83
|
+
const branch = (await sh('git rev-parse --abbrev-ref HEAD', cwd, 1)).out.trim() || 'unknown';
|
|
84
|
+
const status = (await sh('git status --porcelain', cwd, 2)).out.split(/\r?\n/).filter(Boolean);
|
|
85
|
+
const modified = status.filter((l) => /^[ MARC][MDARC]/.test(l) || /^[MDARC][ MARC]/.test(l)).length;
|
|
86
|
+
const untracked = status.filter((l) => l.startsWith('??')).length;
|
|
87
|
+
return `${modified} modified files, ${untracked} untracked, on branch ${branch}`;
|
|
88
|
+
}
|
|
89
|
+
export function ensureCleanWorkingTree(cwd) {
|
|
90
|
+
if (isGitDirty(cwd)) {
|
|
91
|
+
throw new Error("Anton: Working tree not clean. Commit or stash first.");
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export function getWorkingDiff(cwd) {
|
|
95
|
+
const inside = spawnSync(BASH, ['-lc', 'git rev-parse --is-inside-work-tree'], { cwd, encoding: 'utf8', timeout: 1000 });
|
|
96
|
+
if (inside.status !== 0 || !String(inside.stdout || '').trim().startsWith('true'))
|
|
97
|
+
return '';
|
|
98
|
+
const res = spawnSync(BASH, ['-lc', 'git diff HEAD'], { cwd, encoding: 'utf8', timeout: 30000 });
|
|
99
|
+
return String(res.stdout || '');
|
|
100
|
+
}
|
|
101
|
+
export function commitAll(cwd, message) {
|
|
102
|
+
const res = spawnSync(BASH, ['-lc', `git add -A && git commit -m ${JSON.stringify(message)}`], { cwd, encoding: 'utf8', timeout: 30000 });
|
|
103
|
+
if (res.status !== 0) {
|
|
104
|
+
// Check if it's because there's nothing to commit
|
|
105
|
+
const status = spawnSync(BASH, ['-lc', 'git status --porcelain'], { cwd, encoding: 'utf8', timeout: 1500 });
|
|
106
|
+
if (status.status === 0 && String(status.stdout || '').trim().length === 0) {
|
|
107
|
+
return '';
|
|
108
|
+
}
|
|
109
|
+
throw new Error(`git commit failed: ${res.stderr || res.stdout || 'unknown error'}`);
|
|
110
|
+
}
|
|
111
|
+
// Get the commit hash
|
|
112
|
+
const hashRes = spawnSync(BASH, ['-lc', 'git rev-parse --short HEAD'], { cwd, encoding: 'utf8', timeout: 30000 });
|
|
113
|
+
return String(hashRes.stdout || '').trim();
|
|
114
|
+
}
|
|
115
|
+
export function commitAmend(cwd) {
|
|
116
|
+
const res = spawnSync(BASH, ['-lc', 'git add -A && git commit --amend --no-edit'], { cwd, encoding: 'utf8', timeout: 30000 });
|
|
117
|
+
if (res.status !== 0) {
|
|
118
|
+
throw new Error(`git commit --amend failed: ${res.stderr || res.stdout || 'unknown error'}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
export function restoreTrackedChanges(cwd) {
|
|
122
|
+
spawnSync(BASH, ['-lc', 'git checkout -- .'], { cwd, encoding: 'utf8', timeout: 30000 });
|
|
123
|
+
}
|
|
124
|
+
export function cleanUntracked(cwd) {
|
|
125
|
+
const res = spawnSync(BASH, ['-lc', 'git clean -fd'], { cwd, encoding: 'utf8', timeout: 30000 });
|
|
126
|
+
if (res.status !== 0) {
|
|
127
|
+
throw new Error(`git clean failed: ${res.stderr || res.stdout || 'unknown error'}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
export function createBranch(cwd, name) {
|
|
131
|
+
const res = spawnSync(BASH, ['-lc', `git checkout -b ${JSON.stringify(name)}`], { cwd, encoding: 'utf8', timeout: 30000 });
|
|
132
|
+
if (res.status !== 0) {
|
|
133
|
+
throw new Error(`git checkout -b failed: ${res.stderr || res.stdout || 'unknown error'}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=git.js.map
|
package/dist/git.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { readFileSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { configDir } from './utils.js';
|
|
4
|
+
/** Default behavioral configs used to fill gaps in user-defined harnesses and inline definitions */
|
|
5
|
+
const DEFAULT_THINKING = { format: 'xml', openTag: '<think>', closeTag: '</think>', strip: true };
|
|
6
|
+
const DEFAULT_TOOL_CALLS = { reliableToolCallsArray: false, contentFallbackLikely: true, parallelCalls: true, retryOnMalformed: 3 };
|
|
7
|
+
const DEFAULT_QUIRKS = { omitsRequiredParams: false, loopsOnToolError: false, emitsMarkdownInToolArgs: false, needsExplicitToolCallFormatReminder: false };
|
|
8
|
+
const QUIRKS_NEEDS_REMINDER = { ...DEFAULT_QUIRKS, needsExplicitToolCallFormatReminder: true };
|
|
9
|
+
const HARNESS = [
|
|
10
|
+
{
|
|
11
|
+
id: 'qwen3-coder',
|
|
12
|
+
match: [/qwen3-coder/i],
|
|
13
|
+
description: 'Qwen3-Coder family (tool-native MoE)',
|
|
14
|
+
defaults: { temperature: 0.2, top_p: 0.95, max_tokens: 32768, trifecta: { vaultMode: 'active' } },
|
|
15
|
+
thinking: { format: 'xml', openTag: '<think>', closeTag: '</think>', strip: true },
|
|
16
|
+
toolCalls: { reliableToolCallsArray: false, contentFallbackLikely: true, parallelCalls: true, retryOnMalformed: 3 },
|
|
17
|
+
quirks: DEFAULT_QUIRKS,
|
|
18
|
+
systemPromptSuffix: 'Prefer write_file over edit_file when replacing large sections or rewriting files. edit_file is only for small, surgical changes where you can reproduce the exact old_text.\nWhen answering questions about code, search first (search_files or grep), then read only the relevant files. Never scan an entire directory by reading files one by one.'
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: 'qwen3-moe',
|
|
22
|
+
match: [/qwen3/i],
|
|
23
|
+
description: 'Qwen3 MoE family (non-coder variants)',
|
|
24
|
+
defaults: { temperature: 0.2, top_p: 0.95, max_tokens: 16384, trifecta: { vaultMode: 'passive' } },
|
|
25
|
+
thinking: { format: 'xml', openTag: '<think>', closeTag: '</think>', strip: true },
|
|
26
|
+
toolCalls: { reliableToolCallsArray: true, contentFallbackLikely: true, parallelCalls: true, retryOnMalformed: 2 },
|
|
27
|
+
quirks: QUIRKS_NEEDS_REMINDER
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: 'qwen',
|
|
31
|
+
match: [/qwen/i],
|
|
32
|
+
description: 'Qwen family (generic, includes Qwen2.5)',
|
|
33
|
+
defaults: { temperature: 0.2, top_p: 0.95, max_tokens: 16384, trifecta: { vaultMode: 'passive' } },
|
|
34
|
+
thinking: { format: 'none', strip: false },
|
|
35
|
+
toolCalls: { reliableToolCallsArray: true, contentFallbackLikely: true, parallelCalls: true, retryOnMalformed: 2 },
|
|
36
|
+
quirks: QUIRKS_NEEDS_REMINDER
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: 'nemotron',
|
|
40
|
+
match: [/nemotron/i],
|
|
41
|
+
description: 'Nemotron family — loops on errors, omits params, low agent quality',
|
|
42
|
+
defaults: { temperature: 0.2, top_p: 0.95, max_tokens: 16384, trifecta: { vaultMode: 'passive' } },
|
|
43
|
+
thinking: { format: 'none', strip: false },
|
|
44
|
+
toolCalls: { reliableToolCallsArray: false, contentFallbackLikely: true, parallelCalls: false, retryOnMalformed: 1 },
|
|
45
|
+
quirks: { ...QUIRKS_NEEDS_REMINDER, omitsRequiredParams: true, loopsOnToolError: true, maxIterationsOverride: 10 }
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: 'mistral',
|
|
49
|
+
match: [/mistral/i],
|
|
50
|
+
description: 'Mistral family — no thinking tokens, may need chat-template-file',
|
|
51
|
+
defaults: { temperature: 0.2, top_p: 0.95, max_tokens: 16384, trifecta: { vaultMode: 'passive' } },
|
|
52
|
+
thinking: { format: 'none', strip: false },
|
|
53
|
+
toolCalls: { reliableToolCallsArray: true, contentFallbackLikely: false, parallelCalls: true, retryOnMalformed: 2 },
|
|
54
|
+
quirks: DEFAULT_QUIRKS
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: 'gpt-oss',
|
|
58
|
+
match: [/gpt-oss/i, /gpt_oss/i],
|
|
59
|
+
description: 'GPT-OSS — correct tool format but bad decisions, scans everything',
|
|
60
|
+
defaults: { temperature: 0.2, top_p: 0.95, max_tokens: 16384, trifecta: { vaultMode: 'passive' } },
|
|
61
|
+
thinking: { format: 'none', strip: false },
|
|
62
|
+
toolCalls: { reliableToolCallsArray: true, contentFallbackLikely: false, parallelCalls: true, retryOnMalformed: 2 },
|
|
63
|
+
quirks: { ...DEFAULT_QUIRKS, maxIterationsOverride: 10 },
|
|
64
|
+
systemPromptSuffix: 'When answering questions about code, search first (search_files or grep), then read only the relevant files. Never scan an entire directory by reading files one by one.'
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
id: 'llama',
|
|
68
|
+
match: [/llama/i],
|
|
69
|
+
description: 'Llama family (llama.cpp style)',
|
|
70
|
+
defaults: { temperature: 0.2, top_p: 0.95, max_tokens: 16384, trifecta: { vaultMode: 'passive' } },
|
|
71
|
+
thinking: { format: 'none', strip: false },
|
|
72
|
+
toolCalls: { reliableToolCallsArray: false, contentFallbackLikely: true, parallelCalls: false, retryOnMalformed: 2 },
|
|
73
|
+
quirks: QUIRKS_NEEDS_REMINDER,
|
|
74
|
+
systemPromptSuffix: 'When answering questions about code, search first (search_files or grep), then read only the relevant files. Never scan an entire directory by reading files one by one.'
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: 'generic',
|
|
78
|
+
match: [/.*/],
|
|
79
|
+
description: 'Generic fallback harness — conservative, all fallbacks enabled',
|
|
80
|
+
defaults: { temperature: 0.2, top_p: 0.95, max_tokens: 16384, trifecta: { vaultMode: 'passive' } },
|
|
81
|
+
thinking: { format: 'xml', openTag: '<think>', closeTag: '</think>', strip: true },
|
|
82
|
+
toolCalls: { reliableToolCallsArray: false, contentFallbackLikely: true, parallelCalls: true, retryOnMalformed: 3 },
|
|
83
|
+
quirks: DEFAULT_QUIRKS,
|
|
84
|
+
systemPromptSuffix: 'When answering questions about code, search first (search_files or grep), then read only the relevant files. Never scan an entire directory by reading files one by one.'
|
|
85
|
+
}
|
|
86
|
+
];
|
|
87
|
+
/**
|
|
88
|
+
* Load user-defined harnesses from ~/.config/idlehands/harnesses/*.json
|
|
89
|
+
* User harnesses with the same `id` override built-ins.
|
|
90
|
+
* Match patterns are converted from strings to RegExps (case-insensitive).
|
|
91
|
+
*/
|
|
92
|
+
function loadUserHarnesses() {
|
|
93
|
+
const dir = join(configDir(), 'harnesses');
|
|
94
|
+
let files;
|
|
95
|
+
try {
|
|
96
|
+
files = readdirSync(dir).filter(f => f.endsWith('.json'));
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
const result = [];
|
|
102
|
+
for (const f of files) {
|
|
103
|
+
try {
|
|
104
|
+
const raw = JSON.parse(readFileSync(join(dir, f), 'utf8'));
|
|
105
|
+
if (!raw.id || !raw.match)
|
|
106
|
+
continue;
|
|
107
|
+
const harness = {
|
|
108
|
+
id: String(raw.id),
|
|
109
|
+
match: (Array.isArray(raw.match) ? raw.match : [raw.match]).map((m) => new RegExp(String(m), 'i')),
|
|
110
|
+
description: String(raw.description ?? `User harness: ${raw.id}`),
|
|
111
|
+
supportsVision: typeof raw.supportsVision === 'boolean' ? raw.supportsVision : undefined,
|
|
112
|
+
defaults: {
|
|
113
|
+
temperature: raw.params?.temperature ?? raw.defaults?.temperature,
|
|
114
|
+
top_p: raw.params?.top_p ?? raw.defaults?.top_p,
|
|
115
|
+
max_tokens: raw.params?.max_tokens ?? raw.defaults?.max_tokens,
|
|
116
|
+
trifecta: raw.defaults?.trifecta
|
|
117
|
+
},
|
|
118
|
+
thinking: { ...DEFAULT_THINKING, ...(raw.thinking ?? {}) },
|
|
119
|
+
toolCalls: { ...DEFAULT_TOOL_CALLS, ...(raw.toolCalls ?? {}) },
|
|
120
|
+
quirks: { ...DEFAULT_QUIRKS, ...(raw.quirks ?? {}) },
|
|
121
|
+
systemPromptSuffix: raw.systemPromptSuffix
|
|
122
|
+
};
|
|
123
|
+
result.push(harness);
|
|
124
|
+
}
|
|
125
|
+
catch (e) {
|
|
126
|
+
console.warn(`[warn] failed to load harness ${f}: ${e instanceof Error ? e.message : String(e)}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
let _mergedHarnesses = null;
|
|
132
|
+
/** Get the merged harness list (built-in + user overrides). Cached after first call. */
|
|
133
|
+
function getMergedHarnesses() {
|
|
134
|
+
if (_mergedHarnesses)
|
|
135
|
+
return _mergedHarnesses;
|
|
136
|
+
const user = loadUserHarnesses();
|
|
137
|
+
if (!user.length) {
|
|
138
|
+
_mergedHarnesses = HARNESS;
|
|
139
|
+
return HARNESS;
|
|
140
|
+
}
|
|
141
|
+
// User harnesses override built-ins by id, then remaining built-ins follow
|
|
142
|
+
const userIds = new Set(user.map(h => h.id));
|
|
143
|
+
const merged = [
|
|
144
|
+
...user,
|
|
145
|
+
...HARNESS.filter(h => !userIds.has(h.id))
|
|
146
|
+
];
|
|
147
|
+
_mergedHarnesses = merged;
|
|
148
|
+
return merged;
|
|
149
|
+
}
|
|
150
|
+
/** Reset the cached harness list (for testing) */
|
|
151
|
+
export function _resetHarnessCache() {
|
|
152
|
+
_mergedHarnesses = null;
|
|
153
|
+
}
|
|
154
|
+
export function selectHarness(modelId, overrideId) {
|
|
155
|
+
const harnesses = getMergedHarnesses();
|
|
156
|
+
if (overrideId) {
|
|
157
|
+
const h = harnesses.find((x) => x.id === overrideId);
|
|
158
|
+
if (h)
|
|
159
|
+
return h;
|
|
160
|
+
}
|
|
161
|
+
for (const h of harnesses) {
|
|
162
|
+
for (const m of h.match) {
|
|
163
|
+
if (typeof m === 'string' && modelId.includes(m))
|
|
164
|
+
return h;
|
|
165
|
+
if (m instanceof RegExp && m.test(modelId))
|
|
166
|
+
return h;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return harnesses[harnesses.length - 1];
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=harnesses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harnesses.js","sourceRoot":"","sources":["../src/harnesses.ts"],"names":[],"mappings":"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"}
|
package/dist/history.js
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// Pre-compiled regex for think-block stripping (avoids re-creation per call)
|
|
2
|
+
const THINK_RE = /<think>([\s\S]*?)<\/think>/gi;
|
|
3
|
+
const THINKING_RE = /<thinking>([\s\S]*?)<\/thinking>/gi;
|
|
4
|
+
export function stripThinking(text) {
|
|
5
|
+
// Support <think>...</think> and <thinking>...</thinking>
|
|
6
|
+
const thinkBlocks = [];
|
|
7
|
+
let visible = text;
|
|
8
|
+
for (const re of [THINK_RE, THINKING_RE]) {
|
|
9
|
+
re.lastIndex = 0; // reset stateful global regex
|
|
10
|
+
visible = visible.replace(re, (_m, g1) => {
|
|
11
|
+
thinkBlocks.push(String(g1));
|
|
12
|
+
return '';
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
return { visible: visible.trim(), thinking: thinkBlocks.join('\n\n').trim() };
|
|
16
|
+
}
|
|
17
|
+
function messageContentChars(content) {
|
|
18
|
+
if (!content)
|
|
19
|
+
return 0;
|
|
20
|
+
if (typeof content === 'string')
|
|
21
|
+
return content.length;
|
|
22
|
+
let total = 0;
|
|
23
|
+
for (const part of content) {
|
|
24
|
+
if (part.type === 'text')
|
|
25
|
+
total += part.text.length;
|
|
26
|
+
else if (part.type === 'image_url')
|
|
27
|
+
total += (part.image_url?.url?.length ?? 0) + 16;
|
|
28
|
+
}
|
|
29
|
+
return total;
|
|
30
|
+
}
|
|
31
|
+
export function estimateTokensFromMessages(messages) {
|
|
32
|
+
// crude: chars/4 + overhead per message + tool_calls JSON estimate
|
|
33
|
+
let chars = 0;
|
|
34
|
+
for (const m of messages) {
|
|
35
|
+
chars += messageContentChars(m.content) + 20;
|
|
36
|
+
// Account for tool_calls JSON in assistant messages (function name + arguments)
|
|
37
|
+
const tc = m.tool_calls;
|
|
38
|
+
if (Array.isArray(tc)) {
|
|
39
|
+
for (const t of tc) {
|
|
40
|
+
chars += (t.function?.name?.length ?? 0) + (t.function?.arguments?.length ?? 0) + 30;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return Math.ceil(chars / 4);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Estimate tokens consumed by tool schemas (JSON.stringify / 4).
|
|
48
|
+
* Callers should pass the actual tool array so the budget reflects the real schema footprint
|
|
49
|
+
* (built-in + MCP + LSP + vault + spawn_task — which varies per session).
|
|
50
|
+
*/
|
|
51
|
+
export function estimateToolSchemaTokens(tools) {
|
|
52
|
+
if (!tools || tools.length === 0)
|
|
53
|
+
return 0;
|
|
54
|
+
// JSON.stringify is a reasonable proxy for what gets sent on the wire.
|
|
55
|
+
let chars = 0;
|
|
56
|
+
for (const t of tools)
|
|
57
|
+
chars += JSON.stringify(t).length;
|
|
58
|
+
return Math.ceil(chars / 4);
|
|
59
|
+
}
|
|
60
|
+
export function enforceContextBudget(opts) {
|
|
61
|
+
const { contextWindow, maxTokens } = opts;
|
|
62
|
+
const minTail = opts.minTailMessages ?? 10;
|
|
63
|
+
// Reserve overhead: 2048 safety margin (thinking tokens, tool-call framing)
|
|
64
|
+
// + actual tool schema tokens (caller-supplied) or 800 as a conservative fallback.
|
|
65
|
+
const toolOverhead = opts.toolSchemaTokens ?? 800;
|
|
66
|
+
const safetyMargin = 2048 + toolOverhead;
|
|
67
|
+
const budget = Math.max(1024, contextWindow - maxTokens - safetyMargin);
|
|
68
|
+
// Trigger compaction at configurable threshold (default 80%).
|
|
69
|
+
const compactAt = Number.isFinite(opts.compactAt) ? Math.min(0.95, Math.max(0.5, Number(opts.compactAt))) : 0.8;
|
|
70
|
+
const threshold = Math.floor(budget * compactAt);
|
|
71
|
+
let msgs = [...opts.messages];
|
|
72
|
+
const beforeCount = msgs.length;
|
|
73
|
+
const beforeTokens = estimateTokensFromMessages(msgs);
|
|
74
|
+
if (beforeTokens <= threshold)
|
|
75
|
+
return msgs;
|
|
76
|
+
const sysStart = msgs[0]?.role === 'system' ? 1 : 0;
|
|
77
|
+
let currentTokens = beforeTokens;
|
|
78
|
+
// Phase 1: drop oldest tool-call exchange groups first (§10 — they're bulky and stale).
|
|
79
|
+
// A "group" = assistant message with tool_calls + all its tool-result messages.
|
|
80
|
+
// Dropping tool results without their paired assistant message breaks the OpenAI
|
|
81
|
+
// protocol contract (orphaned tool_call IDs cause server errors / model confusion).
|
|
82
|
+
while (msgs.length > 2 && currentTokens > threshold) {
|
|
83
|
+
if (msgs.length - sysStart <= minTail)
|
|
84
|
+
break;
|
|
85
|
+
const groupIdx = findOldestToolCallGroup(msgs, sysStart, msgs.length - minTail);
|
|
86
|
+
if (groupIdx === -1)
|
|
87
|
+
break;
|
|
88
|
+
// Remove the group (assistant + following tool results) in one splice.
|
|
89
|
+
const groupEnd = findGroupEnd(msgs, groupIdx);
|
|
90
|
+
const dropped = msgs.splice(groupIdx, groupEnd - groupIdx);
|
|
91
|
+
for (const d of dropped)
|
|
92
|
+
currentTokens -= Math.ceil((messageContentChars(d.content) + 20) / 4);
|
|
93
|
+
}
|
|
94
|
+
// Phase 2: drop any oldest messages if still over budget.
|
|
95
|
+
while (msgs.length > 2 && currentTokens > threshold) {
|
|
96
|
+
if (msgs.length - sysStart <= minTail)
|
|
97
|
+
break;
|
|
98
|
+
const [removed] = msgs.splice(sysStart, 1);
|
|
99
|
+
currentTokens -= Math.ceil((messageContentChars(removed.content) + 20) / 4);
|
|
100
|
+
}
|
|
101
|
+
const dropped = beforeCount - msgs.length;
|
|
102
|
+
if (dropped > 0) {
|
|
103
|
+
const freed = beforeTokens - estimateTokensFromMessages(msgs);
|
|
104
|
+
const usedPct = budget > 0 ? ((beforeTokens / budget) * 100).toFixed(1) : '?';
|
|
105
|
+
console.error(`[auto-compact] Approaching context limit (${usedPct}%) - compacting ${dropped} old turns, ~${freed} tokens freed`);
|
|
106
|
+
}
|
|
107
|
+
return msgs;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Find the index of the oldest assistant message that has tool_calls in the droppable range.
|
|
111
|
+
* We drop the entire group (assistant + tool results) to keep the protocol valid.
|
|
112
|
+
* Falls back to finding the oldest tool-result message (orphaned) if no group is found.
|
|
113
|
+
*/
|
|
114
|
+
function findOldestToolCallGroup(msgs, fromIdx, toIdx) {
|
|
115
|
+
// First: look for an assistant message with tool_calls (a complete group to drop)
|
|
116
|
+
for (let i = fromIdx; i < toIdx; i++) {
|
|
117
|
+
const m = msgs[i];
|
|
118
|
+
if (m.role === 'assistant' && m.tool_calls?.length)
|
|
119
|
+
return i;
|
|
120
|
+
}
|
|
121
|
+
// Fallback: look for orphaned tool-result messages (shouldn't happen, but safe)
|
|
122
|
+
for (let i = fromIdx; i < toIdx; i++) {
|
|
123
|
+
if (msgs[i].role === 'tool')
|
|
124
|
+
return i;
|
|
125
|
+
}
|
|
126
|
+
return -1;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Given an assistant message at `startIdx` with tool_calls, find the exclusive end index
|
|
130
|
+
* of the group: the assistant + all immediately following tool-result messages.
|
|
131
|
+
*/
|
|
132
|
+
function findGroupEnd(msgs, startIdx) {
|
|
133
|
+
let i = startIdx + 1;
|
|
134
|
+
while (i < msgs.length && msgs[i].role === 'tool') {
|
|
135
|
+
i++;
|
|
136
|
+
}
|
|
137
|
+
return i;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"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"}
|