@visorcraft/idlehands 1.1.6 → 1.1.8
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 +32 -0
- package/dist/agent/formatting.js +251 -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 +226 -0
- package/dist/agent/tool-calls.js.map +1 -0
- package/dist/agent.js +314 -695
- 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 +0 -1
- 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 +179 -0
- package/dist/bot/discord-routing.js.map +1 -0
- package/dist/bot/discord-streaming.js +171 -0
- package/dist/bot/discord-streaming.js.map +1 -0
- package/dist/bot/discord.js +25 -221
- 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/telegram.js +56 -12
- package/dist/bot/telegram.js.map +1 -1
- package/dist/cli/args.js +4 -1
- package/dist/cli/args.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 +118 -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 +7 -7
- 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 +25 -5
- 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 +51 -4
- package/dist/client.js.map +1 -1
- package/dist/config.js +79 -0
- package/dist/config.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/index.js +5 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/loader.js +58 -0
- package/dist/hooks/loader.js.map +1 -0
- package/dist/hooks/manager.js +180 -0
- package/dist/hooks/manager.js.map +1 -0
- package/dist/hooks/plugins/example-console.js +24 -0
- package/dist/hooks/plugins/example-console.js.map +1 -0
- package/dist/hooks/scaffold.js +53 -0
- package/dist/hooks/scaffold.js.map +1 -0
- package/dist/hooks/types.js +8 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.js +16 -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 +7 -0
- package/dist/progress/ir.js.map +1 -0
- package/dist/progress/progress-message-renderer.js +63 -0
- package/dist/progress/progress-message-renderer.js.map +1 -0
- package/dist/progress/serialize-discord.js +60 -0
- package/dist/progress/serialize-discord.js.map +1 -0
- package/dist/progress/serialize-telegram.js +55 -0
- package/dist/progress/serialize-telegram.js.map +1 -0
- package/dist/progress/serialize-tui.js +39 -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/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.js +422 -29
- 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 +417 -33
- package/dist/tui/controller.js.map +1 -1
- package/dist/tui/keymap.js +15 -0
- package/dist/tui/keymap.js.map +1 -1
- package/dist/tui/render.js +115 -3
- package/dist/tui/render.js.map +1 -1
- package/dist/tui/state.js +82 -1
- 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
|
|
|
@@ -186,3 +217,4 @@ Explicit per-model values always take precedence.
|
|
|
186
217
|
- [CLI Reference](https://visorcraft.github.io/IdleHands/reference/cli)
|
|
187
218
|
- [Config Reference](https://visorcraft.github.io/IdleHands/reference/config)
|
|
188
219
|
- [Safety Model](https://visorcraft.github.io/IdleHands/reference/safety)
|
|
220
|
+
- [Changelog](https://visorcraft.github.io/IdleHands/reference/changelog)
|
|
@@ -0,0 +1,251 @@
|
|
|
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
|
+
export function digestToolResult(name, args, content, success) {
|
|
10
|
+
if (!success || content.length <= MAX_DIGEST_CHARS) {
|
|
11
|
+
return content;
|
|
12
|
+
}
|
|
13
|
+
// Tool-specific digest strategies
|
|
14
|
+
switch (name) {
|
|
15
|
+
case 'read_file':
|
|
16
|
+
case 'read_files': {
|
|
17
|
+
const lines = content.split('\n');
|
|
18
|
+
const lineCount = lines.length;
|
|
19
|
+
const trailer = lines.length > 20 ? `\n# ... (${lineCount - 20} more lines)` : '';
|
|
20
|
+
return lines.slice(0, 20).join('\n') + trailer;
|
|
21
|
+
}
|
|
22
|
+
case 'exec': {
|
|
23
|
+
try {
|
|
24
|
+
const parsed = JSON.parse(content);
|
|
25
|
+
const rc = parsed.rc ?? '?';
|
|
26
|
+
const outLines = String(parsed.out || '').split('\n');
|
|
27
|
+
const errLines = String(parsed.err || '').split('\n').filter(Boolean);
|
|
28
|
+
const outPreview = outLines.slice(-15).join('\n');
|
|
29
|
+
const errPreview = errLines.slice(0, 5).join('\n');
|
|
30
|
+
const truncated = outLines.length > 15 ? `\n# ... (${outLines.length - 15} more lines)` : '';
|
|
31
|
+
const errSection = errPreview ? `\n[stderr]\n${errPreview}` : '';
|
|
32
|
+
return JSON.stringify({ rc, out: outPreview + truncated, ...(errPreview && { err: errPreview }) }) + errSection;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return content.slice(0, MAX_DIGEST_CHARS) + (content.length > MAX_DIGEST_CHARS ? '\n# [truncated]' : '');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
case 'search_files': {
|
|
39
|
+
const lines = content.split('\n');
|
|
40
|
+
const count = lines.filter(l => l.includes(':') && !l.startsWith('[')).length;
|
|
41
|
+
const top = lines.slice(0, 15).join('\n');
|
|
42
|
+
const marker = lines.find((l) => l.includes('[truncated,') && l.includes('chars total'));
|
|
43
|
+
const truncated = lines.length > 15
|
|
44
|
+
? `\n# ... (${lines.length - 15} more matches, ${count} total)`
|
|
45
|
+
: (marker ? `\n${marker}` : '');
|
|
46
|
+
return top + truncated;
|
|
47
|
+
}
|
|
48
|
+
case 'list_dir': {
|
|
49
|
+
const lines = content.split('\n');
|
|
50
|
+
const count = lines.filter(l => l.includes('\t') && !l.startsWith('[')).length;
|
|
51
|
+
const top = lines.slice(0, 20).join('\n');
|
|
52
|
+
const marker = lines.find((l) => l.includes('[truncated,') && l.includes('chars total'));
|
|
53
|
+
const truncated = lines.length > 20
|
|
54
|
+
? `\n# ... (${lines.length - 20} more entries, ${count} total)${marker ? `\n${marker}` : ''}`
|
|
55
|
+
: (marker ? `\n${marker}` : '');
|
|
56
|
+
return top + truncated;
|
|
57
|
+
}
|
|
58
|
+
case 'spawn_task': {
|
|
59
|
+
// Keep the final status line and last 20 lines of output
|
|
60
|
+
const lines = content.split('\n');
|
|
61
|
+
const statusLine = lines.find(l => l.includes('status=')) || '';
|
|
62
|
+
const tail = lines.slice(-20).join('\n');
|
|
63
|
+
const header = statusLine ? `${statusLine}\n` : '';
|
|
64
|
+
const truncated = lines.length > 20 ? `# ... (${lines.length - 20} earlier lines omitted)\n` : '';
|
|
65
|
+
return header + truncated + tail;
|
|
66
|
+
}
|
|
67
|
+
default:
|
|
68
|
+
// Generic truncation for unknown tools
|
|
69
|
+
if (content.length > MAX_DIGEST_CHARS) {
|
|
70
|
+
return content.slice(0, MAX_DIGEST_CHARS) + '\n# [truncated]';
|
|
71
|
+
}
|
|
72
|
+
return content;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/** Generate a minimal unified diff for Phase 7 rich display (max 20 lines, truncated). */
|
|
76
|
+
export function generateMinimalDiff(before, after, filePath) {
|
|
77
|
+
const bLines = before.split('\n');
|
|
78
|
+
const aLines = after.split('\n');
|
|
79
|
+
const out = [];
|
|
80
|
+
out.push(`--- a/${filePath}`);
|
|
81
|
+
out.push(`+++ b/${filePath}`);
|
|
82
|
+
// Simple line-by-line diff (find changed region)
|
|
83
|
+
let diffStart = 0;
|
|
84
|
+
while (diffStart < bLines.length && diffStart < aLines.length && bLines[diffStart] === aLines[diffStart])
|
|
85
|
+
diffStart++;
|
|
86
|
+
let bEnd = bLines.length - 1;
|
|
87
|
+
let aEnd = aLines.length - 1;
|
|
88
|
+
while (bEnd > diffStart && aEnd > diffStart && bLines[bEnd] === aLines[aEnd]) {
|
|
89
|
+
bEnd--;
|
|
90
|
+
aEnd--;
|
|
91
|
+
}
|
|
92
|
+
const contextBefore = Math.max(0, diffStart - 2);
|
|
93
|
+
const contextAfter = Math.min(Math.max(bLines.length, aLines.length) - 1, Math.max(bEnd, aEnd) + 2);
|
|
94
|
+
const bEndContext = Math.min(bLines.length - 1, contextAfter);
|
|
95
|
+
const aEndContext = Math.min(aLines.length - 1, contextAfter);
|
|
96
|
+
out.push(`@@ -${contextBefore + 1},${bEndContext - contextBefore + 1} +${contextBefore + 1},${aEndContext - contextBefore + 1} @@`);
|
|
97
|
+
let lineCount = 0;
|
|
98
|
+
const MAX_LINES = 20;
|
|
99
|
+
// Context before change
|
|
100
|
+
for (let i = contextBefore; i < diffStart && lineCount < MAX_LINES; i++) {
|
|
101
|
+
out.push(` ${bLines[i]}`);
|
|
102
|
+
lineCount++;
|
|
103
|
+
}
|
|
104
|
+
// Removed lines
|
|
105
|
+
for (let i = diffStart; i <= bEnd && i < bLines.length && lineCount < MAX_LINES; i++) {
|
|
106
|
+
out.push(`-${bLines[i]}`);
|
|
107
|
+
lineCount++;
|
|
108
|
+
}
|
|
109
|
+
// Added lines
|
|
110
|
+
for (let i = diffStart; i <= aEnd && i < aLines.length && lineCount < MAX_LINES; i++) {
|
|
111
|
+
out.push(`+${aLines[i]}`);
|
|
112
|
+
lineCount++;
|
|
113
|
+
}
|
|
114
|
+
// Context after change
|
|
115
|
+
const afterStart = Math.max(bEnd, aEnd) + 1;
|
|
116
|
+
for (let i = afterStart; i <= contextAfter && i < Math.max(bLines.length, aLines.length) && lineCount < MAX_LINES; i++) {
|
|
117
|
+
const line = i < aLines.length ? aLines[i] : bLines[i] ?? '';
|
|
118
|
+
out.push(` ${line}`);
|
|
119
|
+
lineCount++;
|
|
120
|
+
}
|
|
121
|
+
const totalChanges = (bEnd - diffStart + 1) + (aEnd - diffStart + 1);
|
|
122
|
+
if (lineCount >= MAX_LINES && totalChanges > MAX_LINES) {
|
|
123
|
+
out.push(`[+${totalChanges - MAX_LINES} more lines]`);
|
|
124
|
+
}
|
|
125
|
+
return out.join('\n');
|
|
126
|
+
}
|
|
127
|
+
/** Generate a one-line summary of a tool result for hooks/display. */
|
|
128
|
+
export function toolResultSummary(name, args, content, success) {
|
|
129
|
+
if (!success)
|
|
130
|
+
return content.slice(0, 120);
|
|
131
|
+
switch (name) {
|
|
132
|
+
case 'read_file':
|
|
133
|
+
case 'read_files': {
|
|
134
|
+
const lines = content.split('\n').length;
|
|
135
|
+
return `${lines} lines read`;
|
|
136
|
+
}
|
|
137
|
+
case 'write_file':
|
|
138
|
+
return `wrote ${args.path || 'file'}`;
|
|
139
|
+
case 'apply_patch': {
|
|
140
|
+
const n = Array.isArray(args.files) ? args.files.length : '?';
|
|
141
|
+
return content.startsWith('ERROR') ? content.slice(0, 120) : `applied patch to ${n} file(s)`;
|
|
142
|
+
}
|
|
143
|
+
case 'edit_range': {
|
|
144
|
+
const p = String(args.path ?? '?');
|
|
145
|
+
return content.startsWith('ERROR') ? content.slice(0, 120) : `edited range in ${p}`;
|
|
146
|
+
}
|
|
147
|
+
case 'edit_file':
|
|
148
|
+
return content.startsWith('ERROR') ? content.slice(0, 120) : `applied edit`;
|
|
149
|
+
case 'insert_file':
|
|
150
|
+
return `inserted at line ${args.line ?? '?'}`;
|
|
151
|
+
case 'exec': {
|
|
152
|
+
try {
|
|
153
|
+
const r = JSON.parse(content);
|
|
154
|
+
const lines = (r.out || '').split('\n').filter(Boolean).length;
|
|
155
|
+
return `rc=${r.rc}, ${lines} lines`;
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return content.slice(0, 80);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
case 'list_dir': {
|
|
162
|
+
const entries = content.split('\n').filter(Boolean).length;
|
|
163
|
+
return `${entries} entries`;
|
|
164
|
+
}
|
|
165
|
+
case 'search_files': {
|
|
166
|
+
const matches = (content.match(/^\d+:/gm) || []).length;
|
|
167
|
+
return `${matches} matches`;
|
|
168
|
+
}
|
|
169
|
+
case 'spawn_task': {
|
|
170
|
+
const line = content.split(/\r?\n/).find((l) => l.includes('status='));
|
|
171
|
+
return line ? line.trim() : 'sub-agent task finished';
|
|
172
|
+
}
|
|
173
|
+
case 'vault_search':
|
|
174
|
+
return `vault results`;
|
|
175
|
+
default:
|
|
176
|
+
return content.slice(0, 80);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
export function execCommandFromSig(sig) {
|
|
180
|
+
if (!sig.startsWith('exec:'))
|
|
181
|
+
return '';
|
|
182
|
+
const raw = sig.slice('exec:'.length);
|
|
183
|
+
try {
|
|
184
|
+
const parsed = JSON.parse(raw);
|
|
185
|
+
return typeof parsed?.command === 'string' ? parsed.command : '';
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return '';
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
export function formatDurationMs(ms) {
|
|
192
|
+
if (!Number.isFinite(ms) || ms <= 0)
|
|
193
|
+
return '0.0s';
|
|
194
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
195
|
+
}
|
|
196
|
+
export function looksLikePlanningNarration(text, finishReason) {
|
|
197
|
+
const s = String(text ?? '').trim().toLowerCase();
|
|
198
|
+
if (!s)
|
|
199
|
+
return false;
|
|
200
|
+
// Incomplete streamed answer: likely still needs another turn.
|
|
201
|
+
if (finishReason === 'length')
|
|
202
|
+
return true;
|
|
203
|
+
// Strong completion cues: treat as final answer.
|
|
204
|
+
if (/(^|\n)\s*(done|completed|finished|final answer|summary:)\b/.test(s))
|
|
205
|
+
return false;
|
|
206
|
+
// Typical "thinking out loud"/plan chatter that should continue with tools.
|
|
207
|
+
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);
|
|
208
|
+
}
|
|
209
|
+
export function approxTokenCharCap(maxTokens) {
|
|
210
|
+
const safe = Math.max(64, Math.floor(maxTokens));
|
|
211
|
+
return safe * 4;
|
|
212
|
+
}
|
|
213
|
+
export function capTextByApproxTokens(text, maxTokens) {
|
|
214
|
+
const raw = String(text ?? '');
|
|
215
|
+
const maxChars = approxTokenCharCap(maxTokens);
|
|
216
|
+
if (raw.length <= maxChars)
|
|
217
|
+
return { text: raw, truncated: false };
|
|
218
|
+
const clipped = raw.slice(0, maxChars);
|
|
219
|
+
return {
|
|
220
|
+
text: `${clipped}\n\n[sub-agent] result truncated to ~${maxTokens} tokens (${raw.length} chars original)`,
|
|
221
|
+
truncated: true,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
export function isLikelyBinaryBuffer(buf) {
|
|
225
|
+
const n = Math.min(buf.length, 512);
|
|
226
|
+
for (let i = 0; i < n; i++) {
|
|
227
|
+
if (buf[i] === 0)
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Strip absolute paths from a message to prevent cross-project leaks in vault.
|
|
234
|
+
* Paths within cwd are replaced with relative equivalents; other absolute paths
|
|
235
|
+
* are replaced with just the basename.
|
|
236
|
+
*/
|
|
237
|
+
export function sanitizePathsInMessage(message, cwd) {
|
|
238
|
+
const normCwd = cwd.replace(/\/+$/, '');
|
|
239
|
+
// Match absolute Unix paths (at least 2 segments)
|
|
240
|
+
return message.replace(/\/(?:home|tmp|var|usr|opt|etc|root)\/[^\s"',;)\]}>]+/g, (match) => {
|
|
241
|
+
const normMatch = match.replace(/\/+$/, '');
|
|
242
|
+
if (normMatch.startsWith(normCwd + '/')) {
|
|
243
|
+
// Within cwd — make relative
|
|
244
|
+
return normMatch.slice(normCwd.length + 1);
|
|
245
|
+
}
|
|
246
|
+
// Outside cwd — strip to basename
|
|
247
|
+
const base = path.basename(normMatch);
|
|
248
|
+
return base || match;
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=formatting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/agent/formatting.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,oEAAoE;AACpE,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,IAA6B,EAC7B,OAAe,EACf,OAAgB;IAEhB,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;QACnD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,kCAAkC;IAClC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,WAAW,CAAC;QACjB,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;YAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,YAAY,SAAS,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;YAClF,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;QACjD,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACnC,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,GAAG,CAAC;gBAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACtE,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClD,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,YAAY,QAAQ,CAAC,MAAM,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7F,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,UAAU,GAAG,SAAS,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC;YAClH,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3G,CAAC;QACH,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;YAC9E,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;YACzF,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE;gBACjC,CAAC,CAAC,YAAY,KAAK,CAAC,MAAM,GAAG,EAAE,kBAAkB,KAAK,SAAS;gBAC/D,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClC,OAAO,GAAG,GAAG,SAAS,CAAC;QACzB,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;YAC/E,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;YACzF,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE;gBACjC,CAAC,CAAC,YAAY,KAAK,CAAC,MAAM,GAAG,EAAE,kBAAkB,KAAK,UAAU,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC7F,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClC,OAAO,GAAG,GAAG,SAAS,CAAC;QACzB,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,yDAAyD;YACzD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;YAChE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,MAAM,GAAG,EAAE,2BAA2B,CAAC,CAAC,CAAC,EAAE,CAAC;YAClG,OAAO,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;QACnC,CAAC;QACD;YACE,uCAAuC;YACvC,IAAI,OAAO,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;gBACtC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,GAAG,iBAAiB,CAAC;YAChE,CAAC;YACD,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,KAAa,EAAE,QAAgB;IACjF,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,GAAG,CAAC,IAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC;IAC9B,GAAG,CAAC,IAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC;IAE9B,iDAAiD;IACjD,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,OAAO,SAAS,GAAG,MAAM,CAAC,MAAM,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,SAAS,CAAC;QAAE,SAAS,EAAE,CAAC;IACtH,IAAI,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7B,IAAI,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7B,OAAO,IAAI,GAAG,SAAS,IAAI,IAAI,GAAG,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAAC,IAAI,EAAE,CAAC;QAAC,IAAI,EAAE,CAAC;IAAC,CAAC;IAEjG,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACpG,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;IAE9D,GAAG,CAAC,IAAI,CAAC,OAAO,aAAa,GAAG,CAAC,IAAI,WAAW,GAAG,aAAa,GAAG,CAAC,KAAK,aAAa,GAAG,CAAC,IAAI,WAAW,GAAG,aAAa,GAAG,CAAC,KAAK,CAAC,CAAC;IAEpI,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,SAAS,GAAG,EAAE,CAAC;IAErB,wBAAwB;IACxB,KAAK,IAAI,CAAC,GAAG,aAAa,EAAE,CAAC,GAAG,SAAS,IAAI,SAAS,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACxE,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1B,SAAS,EAAE,CAAC;IACd,CAAC;IACD,gBAAgB;IAChB,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,SAAS,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACrF,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1B,SAAS,EAAE,CAAC;IACd,CAAC;IACD,cAAc;IACd,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,SAAS,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACrF,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1B,SAAS,EAAE,CAAC;IACd,CAAC;IACD,uBAAuB;IACvB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC,IAAI,YAAY,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACvH,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7D,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACrB,SAAS,EAAE,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,IAAI,GAAG,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC;IACrE,IAAI,SAAS,IAAI,SAAS,IAAI,YAAY,GAAG,SAAS,EAAE,CAAC;QACvD,GAAG,CAAC,IAAI,CAAC,KAAK,YAAY,GAAG,SAAS,cAAc,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,IAA6B,EAAE,OAAe,EAAE,OAAgB;IAC9G,IAAI,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,WAAW,CAAC;QACjB,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;YACzC,OAAO,GAAG,KAAK,aAAa,CAAC;QAC/B,CAAC;QACD,KAAK,YAAY;YACf,OAAO,SAAU,IAAI,CAAC,IAAe,IAAI,MAAM,EAAE,CAAC;QACpD,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;YAC9D,OAAO,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,UAAU,CAAC;QAC/F,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;YACnC,OAAO,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACtF,CAAC;QACD,KAAK,WAAW;YACd,OAAO,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;QAC9E,KAAK,aAAa;YAChB,OAAO,oBAAoB,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;QAChD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC9B,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;gBAC/D,OAAO,MAAM,CAAC,CAAC,EAAE,KAAK,KAAK,QAAQ,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAAC,CAAC;QAC1C,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;YAC3D,OAAO,GAAG,OAAO,UAAU,CAAC;QAC9B,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACxD,OAAO,GAAG,OAAO,UAAU,CAAC;QAC9B,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;YACvE,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,yBAAyB,CAAC;QACxD,CAAC;QACD,KAAK,cAAc;YACjB,OAAO,eAAe,CAAC;QACzB;YACE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,OAAO,MAAM,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAU;IACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IACnD,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAY,EAAE,YAAqB;IAC5E,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClD,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAErB,+DAA+D;IAC/D,IAAI,YAAY,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3C,iDAAiD;IACjD,IAAI,4DAA4D,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAEvF,4EAA4E;IAC5E,OAAO,wJAAwJ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1K,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,OAAO,IAAI,GAAG,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,SAAiB;IACnE,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,GAAG,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACnE,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACvC,OAAO;QACL,IAAI,EAAE,GAAG,OAAO,wCAAwC,SAAS,YAAY,GAAG,CAAC,MAAM,kBAAkB;QACzG,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IAChC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAe,EAAE,GAAW;IACjE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxC,kDAAkD;IAClD,OAAO,OAAO,CAAC,OAAO,CAAC,uDAAuD,EAAE,CAAC,KAAK,EAAE,EAAE;QACxF,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,SAAS,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC;YACxC,6BAA6B;YAC7B,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,kCAAkC;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACtC,OAAO,IAAI,IAAI,KAAK,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -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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"}
|