@visorcraft/idlehands 1.1.7 → 1.1.9
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/README.md +46 -0
- package/dist/agent/formatting.js +273 -0
- package/dist/agent/formatting.js.map +1 -0
- package/dist/agent/review-artifact.js +147 -0
- package/dist/agent/review-artifact.js.map +1 -0
- package/dist/agent/tool-calls.js +411 -0
- package/dist/agent/tool-calls.js.map +1 -0
- package/dist/agent.js +285 -684
- package/dist/agent.js.map +1 -1
- package/dist/anton/controller.js +1 -1
- package/dist/anton/controller.js.map +1 -1
- package/dist/anton/lock.js +0 -3
- package/dist/anton/lock.js.map +1 -1
- package/dist/anton/parser.js +6 -6
- package/dist/anton/parser.js.map +1 -1
- package/dist/anton/reporter.js +1 -1
- package/dist/anton/reporter.js.map +1 -1
- package/dist/bot/commands.js +3 -2
- package/dist/bot/commands.js.map +1 -1
- package/dist/bot/confirm-telegram.js +2 -1
- package/dist/bot/confirm-telegram.js.map +1 -1
- package/dist/bot/discord-routing.js +186 -0
- package/dist/bot/discord-routing.js.map +1 -0
- package/dist/bot/discord-streaming.js +107 -0
- package/dist/bot/discord-streaming.js.map +1 -0
- package/dist/bot/discord.js +49 -237
- package/dist/bot/discord.js.map +1 -1
- package/dist/bot/format.js +2 -25
- package/dist/bot/format.js.map +1 -1
- package/dist/bot/session-manager.js +22 -11
- package/dist/bot/session-manager.js.map +1 -1
- package/dist/bot/telegram.js +83 -94
- package/dist/bot/telegram.js.map +1 -1
- package/dist/cli/build-repl-context.js.map +1 -1
- package/dist/cli/command-registry.js +2 -1
- package/dist/cli/command-registry.js.map +1 -1
- package/dist/cli/command-utils.js +27 -0
- package/dist/cli/command-utils.js.map +1 -0
- package/dist/cli/commands/anton.js +3 -2
- package/dist/cli/commands/anton.js.map +1 -1
- package/dist/cli/commands/model.js +8 -7
- package/dist/cli/commands/model.js.map +1 -1
- package/dist/cli/commands/project.js +5 -4
- package/dist/cli/commands/project.js.map +1 -1
- package/dist/cli/commands/session.js +9 -8
- package/dist/cli/commands/session.js.map +1 -1
- package/dist/cli/commands/tools.js +4 -3
- package/dist/cli/commands/tools.js.map +1 -1
- package/dist/cli/input.js +2 -1
- package/dist/cli/input.js.map +1 -1
- package/dist/cli/repl-dispatch.js +85 -0
- package/dist/cli/repl-dispatch.js.map +1 -0
- package/dist/cli/runtime-cmds.js +148 -20
- package/dist/cli/runtime-cmds.js.map +1 -1
- package/dist/cli/service.js +0 -14
- package/dist/cli/service.js.map +1 -1
- package/dist/cli/setup.js +3 -3
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/watch.js +2 -1
- package/dist/cli/watch.js.map +1 -1
- package/dist/client.js +24 -7
- package/dist/client.js.map +1 -1
- package/dist/context.js +101 -10
- package/dist/context.js.map +1 -1
- package/dist/harnesses.js +1 -1
- package/dist/harnesses.js.map +1 -1
- package/dist/hooks/manager.js +5 -0
- package/dist/hooks/manager.js.map +1 -1
- package/dist/index.js +13 -64
- package/dist/index.js.map +1 -1
- package/dist/progress/agent-hooks.js +37 -0
- package/dist/progress/agent-hooks.js.map +1 -0
- package/dist/progress/ir.js +10 -0
- package/dist/progress/ir.js.map +1 -0
- package/dist/progress/message-edit-scheduler.js +97 -0
- package/dist/progress/message-edit-scheduler.js.map +1 -0
- package/dist/progress/progress-message-renderer.js +120 -0
- package/dist/progress/progress-message-renderer.js.map +1 -0
- package/dist/progress/progress-presenter.js +137 -0
- package/dist/progress/progress-presenter.js.map +1 -0
- package/dist/progress/serialize-discord.js +72 -0
- package/dist/progress/serialize-discord.js.map +1 -0
- package/dist/progress/serialize-telegram.js +67 -0
- package/dist/progress/serialize-telegram.js.map +1 -0
- package/dist/progress/serialize-tui.js +52 -0
- package/dist/progress/serialize-tui.js.map +1 -0
- package/dist/progress/tool-summary.js +58 -0
- package/dist/progress/tool-summary.js.map +1 -0
- package/dist/progress/tool-tail.js +48 -0
- package/dist/progress/tool-tail.js.map +1 -0
- package/dist/progress/turn-progress.js +215 -0
- package/dist/progress/turn-progress.js.map +1 -0
- package/dist/replay.js +2 -5
- package/dist/replay.js.map +1 -1
- package/dist/runtime/executor.js +58 -10
- package/dist/runtime/executor.js.map +1 -1
- package/dist/runtime/planner.js +19 -6
- package/dist/runtime/planner.js.map +1 -1
- package/dist/runtime/store.js +2 -1
- package/dist/runtime/store.js.map +1 -1
- package/dist/safety.js +0 -1
- package/dist/safety.js.map +1 -1
- package/dist/spinner.js +8 -0
- package/dist/spinner.js.map +1 -1
- package/dist/tools/tool-error.js +97 -0
- package/dist/tools/tool-error.js.map +1 -0
- package/dist/tools.js +471 -41
- package/dist/tools.js.map +1 -1
- package/dist/tui/branch-picker.js.map +1 -1
- package/dist/tui/command-handler.js.map +1 -1
- package/dist/tui/controller.js +91 -28
- package/dist/tui/controller.js.map +1 -1
- package/dist/tui/render.js +15 -2
- package/dist/tui/render.js.map +1 -1
- package/dist/tui/state.js +13 -0
- package/dist/tui/state.js.map +1 -1
- package/dist/upgrade.js.map +1 -1
- package/dist/utils.js +17 -0
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -159,6 +159,37 @@ If you use a dedicated `idlehands` account, install/manage the service while log
|
|
|
159
159
|
|
|
160
160
|
---
|
|
161
161
|
|
|
162
|
+
## Token-efficient file tooling
|
|
163
|
+
|
|
164
|
+
Recent tool updates reduce context bloat and make edits cheaper:
|
|
165
|
+
|
|
166
|
+
- `read_file`
|
|
167
|
+
- bounded default when `limit` is omitted (`limit=200`)
|
|
168
|
+
- supports `format=plain|numbered|sparse`
|
|
169
|
+
- supports `max_bytes` (default `20000`, validated up to `262144`)
|
|
170
|
+
- `edit_range`
|
|
171
|
+
- replace an inclusive line range in one file
|
|
172
|
+
- preserves existing EOL style (`LF`/`CRLF`)
|
|
173
|
+
- supports clean deletions by passing empty replacement text
|
|
174
|
+
- `apply_patch`
|
|
175
|
+
- apply unified diffs across multiple files
|
|
176
|
+
- validates touched files against declared `files[]`
|
|
177
|
+
- dry-runs before apply (`git apply --check` with fallback to `patch --dry-run`)
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Shared progress rendering (v1.1.8+)
|
|
182
|
+
|
|
183
|
+
All three frontends (TUI, Telegram, Discord) now use a shared progress message renderer:
|
|
184
|
+
|
|
185
|
+
- **Platform-agnostic IR**: `ProgressMessageRenderer` produces an intermediate representation.
|
|
186
|
+
- **Consistent UX**: same banner → status → tools → tail → assistant flow everywhere.
|
|
187
|
+
- **Serializers**:
|
|
188
|
+
- Telegram: compact HTML with `<pre>` code blocks
|
|
189
|
+
- Discord: markdown with fenced code blocks
|
|
190
|
+
- TUI: plain text lines for status bar
|
|
191
|
+
|
|
192
|
+
---
|
|
162
193
|
|
|
163
194
|
## Runtime probe defaults (size-aware)
|
|
164
195
|
|
|
@@ -177,6 +208,20 @@ Default tiers used by idlehands select:
|
|
|
177
208
|
Per-model override remains available in runtimes.json under models.launch.
|
|
178
209
|
Explicit per-model values always take precedence.
|
|
179
210
|
|
|
211
|
+
## Runtime reliability updates (v1.1.9+)
|
|
212
|
+
|
|
213
|
+
- `idlehands select` now always validates reuse with live probe checks (no more silent "success" from stale active state).
|
|
214
|
+
- `idlehands select --force` and `idlehands select --restart` force restart planning instead of reuse.
|
|
215
|
+
- If reuse probes fail, select automatically retries with a forced restart.
|
|
216
|
+
- SSH runtime execution now uses `BatchMode`, connection timeout, and `bash -lc` for more predictable remote behavior.
|
|
217
|
+
- `idlehands health` now includes a **Loaded (discovered)** section that probes `/v1/models` and `/health` on discovered ports.
|
|
218
|
+
- Health discovery supports custom ranges via `--scan-ports`:
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
idlehands health --scan-ports 8000-8100
|
|
222
|
+
idlehands health --scan-ports 8080,8081,9000
|
|
223
|
+
```
|
|
224
|
+
|
|
180
225
|
## Documentation map
|
|
181
226
|
|
|
182
227
|
- [Getting Started](https://visorcraft.github.io/IdleHands/guide/getting-started)
|
|
@@ -186,3 +231,4 @@ Explicit per-model values always take precedence.
|
|
|
186
231
|
- [CLI Reference](https://visorcraft.github.io/IdleHands/reference/cli)
|
|
187
232
|
- [Config Reference](https://visorcraft.github.io/IdleHands/reference/config)
|
|
188
233
|
- [Safety Model](https://visorcraft.github.io/IdleHands/reference/safety)
|
|
234
|
+
- [Changelog](https://visorcraft.github.io/IdleHands/reference/changelog)
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
/** Maximum chars for tool result digest stored in live messages. */
|
|
3
|
+
const MAX_DIGEST_CHARS = 4000;
|
|
4
|
+
/**
|
|
5
|
+
* Generate a token-efficient digest for a tool result.
|
|
6
|
+
* This is stored in live messages[] instead of full output to reduce prompt size.
|
|
7
|
+
* Full output should be archived to vault keyed by tool_call_id for retrieval.
|
|
8
|
+
*/
|
|
9
|
+
function digestFailureContent(content, callIdHint) {
|
|
10
|
+
const lines = String(content ?? '').split('\n');
|
|
11
|
+
const head = lines.slice(0, 20);
|
|
12
|
+
const tail = lines.length > 40 ? lines.slice(-20) : lines.slice(20);
|
|
13
|
+
const middleOmitted = Math.max(0, lines.length - (head.length + tail.length));
|
|
14
|
+
const out = [];
|
|
15
|
+
out.push(...head);
|
|
16
|
+
if (middleOmitted > 0)
|
|
17
|
+
out.push(`... (${middleOmitted} lines omitted)`);
|
|
18
|
+
if (tail.length)
|
|
19
|
+
out.push(...tail);
|
|
20
|
+
if (callIdHint)
|
|
21
|
+
out.push(`[full failure output archived in vault: call_id=${callIdHint}]`);
|
|
22
|
+
const joined = out.join('\n');
|
|
23
|
+
return joined.length > MAX_DIGEST_CHARS
|
|
24
|
+
? joined.slice(0, MAX_DIGEST_CHARS) + '\n# [failure digest truncated]'
|
|
25
|
+
: joined;
|
|
26
|
+
}
|
|
27
|
+
export function digestToolResult(name, args, content, success) {
|
|
28
|
+
if (!success) {
|
|
29
|
+
const callIdHint = typeof args?._tool_call_id === 'string' ? String(args._tool_call_id) : undefined;
|
|
30
|
+
return digestFailureContent(content, callIdHint);
|
|
31
|
+
}
|
|
32
|
+
if (content.length <= MAX_DIGEST_CHARS) {
|
|
33
|
+
return content;
|
|
34
|
+
}
|
|
35
|
+
// Tool-specific digest strategies
|
|
36
|
+
switch (name) {
|
|
37
|
+
case 'read_file':
|
|
38
|
+
case 'read_files': {
|
|
39
|
+
const lines = content.split('\n');
|
|
40
|
+
const lineCount = lines.length;
|
|
41
|
+
const trailer = lines.length > 20 ? `\n# ... (${lineCount - 20} more lines)` : '';
|
|
42
|
+
return lines.slice(0, 20).join('\n') + trailer;
|
|
43
|
+
}
|
|
44
|
+
case 'exec': {
|
|
45
|
+
try {
|
|
46
|
+
const parsed = JSON.parse(content);
|
|
47
|
+
const rc = parsed.rc ?? '?';
|
|
48
|
+
const outLines = String(parsed.out || '').split('\n');
|
|
49
|
+
const errLines = String(parsed.err || '').split('\n').filter(Boolean);
|
|
50
|
+
const outPreview = outLines.slice(-15).join('\n');
|
|
51
|
+
const errPreview = errLines.slice(0, 5).join('\n');
|
|
52
|
+
const truncated = outLines.length > 15 ? `\n# ... (${outLines.length - 15} more lines)` : '';
|
|
53
|
+
const errSection = errPreview ? `\n[stderr]\n${errPreview}` : '';
|
|
54
|
+
return JSON.stringify({ rc, out: outPreview + truncated, ...(errPreview && { err: errPreview }) }) + errSection;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return content.slice(0, MAX_DIGEST_CHARS) + (content.length > MAX_DIGEST_CHARS ? '\n# [truncated]' : '');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
case 'search_files': {
|
|
61
|
+
const lines = content.split('\n');
|
|
62
|
+
const count = lines.filter(l => l.includes(':') && !l.startsWith('[')).length;
|
|
63
|
+
const top = lines.slice(0, 15).join('\n');
|
|
64
|
+
const marker = lines.find((l) => l.includes('[truncated,') && l.includes('chars total'));
|
|
65
|
+
const truncated = lines.length > 15
|
|
66
|
+
? `\n# ... (${lines.length - 15} more matches, ${count} total)`
|
|
67
|
+
: (marker ? `\n${marker}` : '');
|
|
68
|
+
return top + truncated;
|
|
69
|
+
}
|
|
70
|
+
case 'list_dir': {
|
|
71
|
+
const lines = content.split('\n');
|
|
72
|
+
const count = lines.filter(l => l.includes('\t') && !l.startsWith('[')).length;
|
|
73
|
+
const top = lines.slice(0, 20).join('\n');
|
|
74
|
+
const marker = lines.find((l) => l.includes('[truncated,') && l.includes('chars total'));
|
|
75
|
+
const truncated = lines.length > 20
|
|
76
|
+
? `\n# ... (${lines.length - 20} more entries, ${count} total)${marker ? `\n${marker}` : ''}`
|
|
77
|
+
: (marker ? `\n${marker}` : '');
|
|
78
|
+
return top + truncated;
|
|
79
|
+
}
|
|
80
|
+
case 'spawn_task': {
|
|
81
|
+
// Keep the final status line and last 20 lines of output
|
|
82
|
+
const lines = content.split('\n');
|
|
83
|
+
const statusLine = lines.find(l => l.includes('status=')) || '';
|
|
84
|
+
const tail = lines.slice(-20).join('\n');
|
|
85
|
+
const header = statusLine ? `${statusLine}\n` : '';
|
|
86
|
+
const truncated = lines.length > 20 ? `# ... (${lines.length - 20} earlier lines omitted)\n` : '';
|
|
87
|
+
return header + truncated + tail;
|
|
88
|
+
}
|
|
89
|
+
default:
|
|
90
|
+
// Generic truncation for unknown tools
|
|
91
|
+
if (content.length > MAX_DIGEST_CHARS) {
|
|
92
|
+
return content.slice(0, MAX_DIGEST_CHARS) + '\n# [truncated]';
|
|
93
|
+
}
|
|
94
|
+
return content;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** Generate a minimal unified diff for Phase 7 rich display (max 20 lines, truncated). */
|
|
98
|
+
export function generateMinimalDiff(before, after, filePath) {
|
|
99
|
+
const bLines = before.split('\n');
|
|
100
|
+
const aLines = after.split('\n');
|
|
101
|
+
const out = [];
|
|
102
|
+
out.push(`--- a/${filePath}`);
|
|
103
|
+
out.push(`+++ b/${filePath}`);
|
|
104
|
+
// Simple line-by-line diff (find changed region)
|
|
105
|
+
let diffStart = 0;
|
|
106
|
+
while (diffStart < bLines.length && diffStart < aLines.length && bLines[diffStart] === aLines[diffStart])
|
|
107
|
+
diffStart++;
|
|
108
|
+
let bEnd = bLines.length - 1;
|
|
109
|
+
let aEnd = aLines.length - 1;
|
|
110
|
+
while (bEnd > diffStart && aEnd > diffStart && bLines[bEnd] === aLines[aEnd]) {
|
|
111
|
+
bEnd--;
|
|
112
|
+
aEnd--;
|
|
113
|
+
}
|
|
114
|
+
const contextBefore = Math.max(0, diffStart - 2);
|
|
115
|
+
const contextAfter = Math.min(Math.max(bLines.length, aLines.length) - 1, Math.max(bEnd, aEnd) + 2);
|
|
116
|
+
const bEndContext = Math.min(bLines.length - 1, contextAfter);
|
|
117
|
+
const aEndContext = Math.min(aLines.length - 1, contextAfter);
|
|
118
|
+
out.push(`@@ -${contextBefore + 1},${bEndContext - contextBefore + 1} +${contextBefore + 1},${aEndContext - contextBefore + 1} @@`);
|
|
119
|
+
let lineCount = 0;
|
|
120
|
+
const MAX_LINES = 20;
|
|
121
|
+
// Context before change
|
|
122
|
+
for (let i = contextBefore; i < diffStart && lineCount < MAX_LINES; i++) {
|
|
123
|
+
out.push(` ${bLines[i]}`);
|
|
124
|
+
lineCount++;
|
|
125
|
+
}
|
|
126
|
+
// Removed lines
|
|
127
|
+
for (let i = diffStart; i <= bEnd && i < bLines.length && lineCount < MAX_LINES; i++) {
|
|
128
|
+
out.push(`-${bLines[i]}`);
|
|
129
|
+
lineCount++;
|
|
130
|
+
}
|
|
131
|
+
// Added lines
|
|
132
|
+
for (let i = diffStart; i <= aEnd && i < aLines.length && lineCount < MAX_LINES; i++) {
|
|
133
|
+
out.push(`+${aLines[i]}`);
|
|
134
|
+
lineCount++;
|
|
135
|
+
}
|
|
136
|
+
// Context after change
|
|
137
|
+
const afterStart = Math.max(bEnd, aEnd) + 1;
|
|
138
|
+
for (let i = afterStart; i <= contextAfter && i < Math.max(bLines.length, aLines.length) && lineCount < MAX_LINES; i++) {
|
|
139
|
+
const line = i < aLines.length ? aLines[i] : bLines[i] ?? '';
|
|
140
|
+
out.push(` ${line}`);
|
|
141
|
+
lineCount++;
|
|
142
|
+
}
|
|
143
|
+
const totalChanges = (bEnd - diffStart + 1) + (aEnd - diffStart + 1);
|
|
144
|
+
if (lineCount >= MAX_LINES && totalChanges > MAX_LINES) {
|
|
145
|
+
out.push(`[+${totalChanges - MAX_LINES} more lines]`);
|
|
146
|
+
}
|
|
147
|
+
return out.join('\n');
|
|
148
|
+
}
|
|
149
|
+
/** Generate a one-line summary of a tool result for hooks/display. */
|
|
150
|
+
export function toolResultSummary(name, args, content, success) {
|
|
151
|
+
if (!success)
|
|
152
|
+
return content.slice(0, 120);
|
|
153
|
+
switch (name) {
|
|
154
|
+
case 'read_file':
|
|
155
|
+
case 'read_files': {
|
|
156
|
+
const lines = content.split('\n').length;
|
|
157
|
+
return `${lines} lines read`;
|
|
158
|
+
}
|
|
159
|
+
case 'write_file':
|
|
160
|
+
return `wrote ${args.path || 'file'}`;
|
|
161
|
+
case 'apply_patch': {
|
|
162
|
+
const n = Array.isArray(args.files) ? args.files.length : '?';
|
|
163
|
+
return content.startsWith('ERROR') ? content.slice(0, 120) : `applied patch to ${n} file(s)`;
|
|
164
|
+
}
|
|
165
|
+
case 'edit_range': {
|
|
166
|
+
const p = String(args.path ?? '?');
|
|
167
|
+
return content.startsWith('ERROR') ? content.slice(0, 120) : `edited range in ${p}`;
|
|
168
|
+
}
|
|
169
|
+
case 'edit_file':
|
|
170
|
+
return content.startsWith('ERROR') ? content.slice(0, 120) : `applied edit`;
|
|
171
|
+
case 'insert_file':
|
|
172
|
+
return `inserted at line ${args.line ?? '?'}`;
|
|
173
|
+
case 'exec': {
|
|
174
|
+
try {
|
|
175
|
+
const r = JSON.parse(content);
|
|
176
|
+
const lines = (r.out || '').split('\n').filter(Boolean).length;
|
|
177
|
+
return `rc=${r.rc}, ${lines} lines`;
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return content.slice(0, 80);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
case 'list_dir': {
|
|
184
|
+
const entries = content.split('\n').filter(Boolean).length;
|
|
185
|
+
return `${entries} entries`;
|
|
186
|
+
}
|
|
187
|
+
case 'search_files': {
|
|
188
|
+
const matches = (content.match(/^\d+:/gm) || []).length;
|
|
189
|
+
return `${matches} matches`;
|
|
190
|
+
}
|
|
191
|
+
case 'spawn_task': {
|
|
192
|
+
const line = content.split(/\r?\n/).find((l) => l.includes('status='));
|
|
193
|
+
return line ? line.trim() : 'sub-agent task finished';
|
|
194
|
+
}
|
|
195
|
+
case 'vault_search':
|
|
196
|
+
return `vault results`;
|
|
197
|
+
default:
|
|
198
|
+
return content.slice(0, 80);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
export function execCommandFromSig(sig) {
|
|
202
|
+
if (!sig.startsWith('exec:'))
|
|
203
|
+
return '';
|
|
204
|
+
const raw = sig.slice('exec:'.length);
|
|
205
|
+
try {
|
|
206
|
+
const parsed = JSON.parse(raw);
|
|
207
|
+
return typeof parsed?.command === 'string' ? parsed.command : '';
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return '';
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
export function formatDurationMs(ms) {
|
|
214
|
+
if (!Number.isFinite(ms) || ms <= 0)
|
|
215
|
+
return '0.0s';
|
|
216
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
217
|
+
}
|
|
218
|
+
export function looksLikePlanningNarration(text, finishReason) {
|
|
219
|
+
const s = String(text ?? '').trim().toLowerCase();
|
|
220
|
+
if (!s)
|
|
221
|
+
return false;
|
|
222
|
+
// Incomplete streamed answer: likely still needs another turn.
|
|
223
|
+
if (finishReason === 'length')
|
|
224
|
+
return true;
|
|
225
|
+
// Strong completion cues: treat as final answer.
|
|
226
|
+
if (/(^|\n)\s*(done|completed|finished|final answer|summary:)\b/.test(s))
|
|
227
|
+
return false;
|
|
228
|
+
// Typical "thinking out loud"/plan chatter that should continue with tools.
|
|
229
|
+
return /\b(let me|i(?:'|’)ll|i will|i'm going to|i am going to|next i(?:'|’)ll|first i(?:'|’)ll|i need to|i should|checking|reviewing|exploring|starting by)\b/.test(s);
|
|
230
|
+
}
|
|
231
|
+
export function approxTokenCharCap(maxTokens) {
|
|
232
|
+
const safe = Math.max(64, Math.floor(maxTokens));
|
|
233
|
+
return safe * 4;
|
|
234
|
+
}
|
|
235
|
+
export function capTextByApproxTokens(text, maxTokens) {
|
|
236
|
+
const raw = String(text ?? '');
|
|
237
|
+
const maxChars = approxTokenCharCap(maxTokens);
|
|
238
|
+
if (raw.length <= maxChars)
|
|
239
|
+
return { text: raw, truncated: false };
|
|
240
|
+
const clipped = raw.slice(0, maxChars);
|
|
241
|
+
return {
|
|
242
|
+
text: `${clipped}\n\n[sub-agent] result truncated to ~${maxTokens} tokens (${raw.length} chars original)`,
|
|
243
|
+
truncated: true,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
export function isLikelyBinaryBuffer(buf) {
|
|
247
|
+
const n = Math.min(buf.length, 512);
|
|
248
|
+
for (let i = 0; i < n; i++) {
|
|
249
|
+
if (buf[i] === 0)
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Strip absolute paths from a message to prevent cross-project leaks in vault.
|
|
256
|
+
* Paths within cwd are replaced with relative equivalents; other absolute paths
|
|
257
|
+
* are replaced with just the basename.
|
|
258
|
+
*/
|
|
259
|
+
export function sanitizePathsInMessage(message, cwd) {
|
|
260
|
+
const normCwd = cwd.replace(/\/+$/, '');
|
|
261
|
+
// Match absolute Unix paths (at least 2 segments)
|
|
262
|
+
return message.replace(/\/(?:home|tmp|var|usr|opt|etc|root)\/[^\s"',;)\]}>]+/g, (match) => {
|
|
263
|
+
const normMatch = match.replace(/\/+$/, '');
|
|
264
|
+
if (normMatch.startsWith(normCwd + '/')) {
|
|
265
|
+
// Within cwd — make relative
|
|
266
|
+
return normMatch.slice(normCwd.length + 1);
|
|
267
|
+
}
|
|
268
|
+
// Outside cwd — strip to basename
|
|
269
|
+
const base = path.basename(normMatch);
|
|
270
|
+
return base || match;
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=formatting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/agent/formatting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { projectIndexKeys } from '../indexer.js';
|
|
3
|
+
import { isGitDirty } from '../git.js';
|
|
4
|
+
import { BASH_PATH as BASH } from '../utils.js';
|
|
5
|
+
export function reviewArtifactKeys(projectDir) {
|
|
6
|
+
const { projectId } = projectIndexKeys(projectDir);
|
|
7
|
+
return {
|
|
8
|
+
projectId,
|
|
9
|
+
latestKey: `artifact:review:latest:${projectId}`,
|
|
10
|
+
byIdPrefix: `artifact:review:item:${projectId}:`,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function looksLikeCodeReviewRequest(text) {
|
|
14
|
+
const t = text.toLowerCase();
|
|
15
|
+
if (!t.trim())
|
|
16
|
+
return false;
|
|
17
|
+
if (/^\s*\/review\b/.test(t))
|
|
18
|
+
return true;
|
|
19
|
+
if (/\b(?:code\s+review|security\s+review|review\s+the\s+(?:code|diff|changes|repo|repository|pr)|audit\s+the\s+code)\b/.test(t))
|
|
20
|
+
return true;
|
|
21
|
+
return /\breview\b/.test(t) && /\b(?:code|repo|repository|diff|changes|pull\s*request|pr)\b/.test(t);
|
|
22
|
+
}
|
|
23
|
+
export function looksLikeReviewRetrievalRequest(text) {
|
|
24
|
+
const t = text.toLowerCase();
|
|
25
|
+
if (!t.trim())
|
|
26
|
+
return false;
|
|
27
|
+
if (/^\s*\/review\s+(?:print|show|replay|latest|last|full)\b/.test(t))
|
|
28
|
+
return true;
|
|
29
|
+
if (!/\breview\b/.test(t))
|
|
30
|
+
return false;
|
|
31
|
+
if (/\bprint\s+stale\s+review\s+anyway\b/.test(t))
|
|
32
|
+
return true;
|
|
33
|
+
if (/\b(?:print|show|display|repeat|paste|send|output|give)\b[^\n.]{0,80}\breview\b[^\n.]{0,40}\b(?:again|back)\b/.test(t))
|
|
34
|
+
return true;
|
|
35
|
+
if (/\b(?:print|show|display|repeat|paste|send|output|give)\b[^\n.]{0,80}\b(?:full|entire|complete|whole)\b[^\n.]{0,80}\breview\b/.test(t))
|
|
36
|
+
return true;
|
|
37
|
+
if (/\b(?:full|entire|complete|whole)\b[^\n.]{0,30}\bcode\s+review\b/.test(t) && /\b(?:print|show|display|repeat|paste|send|output|give)\b/.test(t))
|
|
38
|
+
return true;
|
|
39
|
+
if (/\b(?:print|show|display|repeat|paste|send|output|give)\b[^\n.]{0,80}\b(?:last|latest|previous)\b[^\n.]{0,40}\breview\b/.test(t))
|
|
40
|
+
return true;
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
export function retrievalAllowsStaleArtifact(text) {
|
|
44
|
+
const t = text.toLowerCase();
|
|
45
|
+
if (!t.trim())
|
|
46
|
+
return false;
|
|
47
|
+
if (/\bprint\s+stale\s+review\s+anyway\b/.test(t))
|
|
48
|
+
return true;
|
|
49
|
+
if (/\b(?:force|override|ignore)\b[^\n.]{0,80}\b(?:stale|old|previous)\b[^\n.]{0,80}\breview\b/.test(t))
|
|
50
|
+
return true;
|
|
51
|
+
if (/\b(?:stale|old|previous)\b[^\n.]{0,80}\breview\b[^\n.]{0,80}\b(?:anyway|still|force|override|ignore)\b/.test(t))
|
|
52
|
+
return true;
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
export function parseReviewArtifactStalePolicy(raw) {
|
|
56
|
+
const v = typeof raw === 'string' ? raw.toLowerCase().trim() : '';
|
|
57
|
+
if (v === 'block')
|
|
58
|
+
return 'block';
|
|
59
|
+
return 'warn';
|
|
60
|
+
}
|
|
61
|
+
export function parseReviewArtifact(raw) {
|
|
62
|
+
try {
|
|
63
|
+
const parsed = JSON.parse(raw);
|
|
64
|
+
if (!parsed || typeof parsed !== 'object')
|
|
65
|
+
return null;
|
|
66
|
+
if (parsed.kind !== 'code_review')
|
|
67
|
+
return null;
|
|
68
|
+
if (typeof parsed.id !== 'string' || !parsed.id)
|
|
69
|
+
return null;
|
|
70
|
+
if (typeof parsed.createdAt !== 'string' || !parsed.createdAt)
|
|
71
|
+
return null;
|
|
72
|
+
if (typeof parsed.model !== 'string')
|
|
73
|
+
return null;
|
|
74
|
+
if (typeof parsed.projectId !== 'string' || !parsed.projectId)
|
|
75
|
+
return null;
|
|
76
|
+
if (typeof parsed.projectDir !== 'string' || !parsed.projectDir)
|
|
77
|
+
return null;
|
|
78
|
+
if (typeof parsed.prompt !== 'string')
|
|
79
|
+
return null;
|
|
80
|
+
if (typeof parsed.content !== 'string')
|
|
81
|
+
return null;
|
|
82
|
+
return parsed;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export function gitHead(cwd) {
|
|
89
|
+
const inside = spawnSync(BASH, ['-lc', 'git rev-parse --is-inside-work-tree'], {
|
|
90
|
+
cwd,
|
|
91
|
+
encoding: 'utf8',
|
|
92
|
+
timeout: 1000,
|
|
93
|
+
});
|
|
94
|
+
if (inside.status !== 0 || !String(inside.stdout || '').trim().startsWith('true'))
|
|
95
|
+
return undefined;
|
|
96
|
+
const head = spawnSync(BASH, ['-lc', 'git rev-parse HEAD'], {
|
|
97
|
+
cwd,
|
|
98
|
+
encoding: 'utf8',
|
|
99
|
+
timeout: 1000,
|
|
100
|
+
});
|
|
101
|
+
if (head.status !== 0)
|
|
102
|
+
return undefined;
|
|
103
|
+
const sha = String(head.stdout || '').trim();
|
|
104
|
+
return sha || undefined;
|
|
105
|
+
}
|
|
106
|
+
function shortSha(sha) {
|
|
107
|
+
if (!sha)
|
|
108
|
+
return 'unknown';
|
|
109
|
+
return sha.slice(0, 8);
|
|
110
|
+
}
|
|
111
|
+
export function reviewArtifactStaleReason(artifact, cwd) {
|
|
112
|
+
const currentHead = gitHead(cwd);
|
|
113
|
+
const currentDirty = isGitDirty(cwd);
|
|
114
|
+
if (artifact.gitHead && currentHead && artifact.gitHead !== currentHead) {
|
|
115
|
+
return `Stored review was generated at commit ${shortSha(artifact.gitHead)}; repository is now at ${shortSha(currentHead)}.`;
|
|
116
|
+
}
|
|
117
|
+
if (artifact.gitDirty === false && currentDirty) {
|
|
118
|
+
return 'Stored review was generated on a clean tree; working tree now has uncommitted changes.';
|
|
119
|
+
}
|
|
120
|
+
return '';
|
|
121
|
+
}
|
|
122
|
+
export function normalizeModelsResponse(raw) {
|
|
123
|
+
if (Array.isArray(raw)) {
|
|
124
|
+
return {
|
|
125
|
+
data: raw
|
|
126
|
+
.map((m) => {
|
|
127
|
+
if (!m)
|
|
128
|
+
return null;
|
|
129
|
+
if (typeof m === 'string')
|
|
130
|
+
return { id: m };
|
|
131
|
+
if (typeof m.id === 'string' && m.id)
|
|
132
|
+
return m;
|
|
133
|
+
return null;
|
|
134
|
+
})
|
|
135
|
+
.filter(Boolean)
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
if (raw && Array.isArray(raw.data)) {
|
|
139
|
+
return {
|
|
140
|
+
data: raw.data
|
|
141
|
+
.map((m) => (m && typeof m.id === 'string' && m.id ? m : null))
|
|
142
|
+
.filter(Boolean)
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
return { data: [] };
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=review-artifact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-artifact.js","sourceRoot":"","sources":["../../src/agent/review-artifact.ts"],"names":[],"mappings":"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"}
|