@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
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/** @internal Exported for testing. Parses tool calls from model content when tool_calls array is empty. */
|
|
2
|
+
export function parseToolCallsFromContent(content) {
|
|
3
|
+
// Fallback parser: if model printed JSON tool_calls in content.
|
|
4
|
+
const trimmed = content.trim();
|
|
5
|
+
const tryParse = (s) => {
|
|
6
|
+
try {
|
|
7
|
+
return JSON.parse(s);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
// Case 1: whole content is JSON
|
|
14
|
+
const whole = tryParse(trimmed);
|
|
15
|
+
if (whole?.tool_calls && Array.isArray(whole.tool_calls))
|
|
16
|
+
return whole.tool_calls;
|
|
17
|
+
if (whole?.name && whole?.arguments) {
|
|
18
|
+
return [
|
|
19
|
+
{
|
|
20
|
+
id: 'call_0',
|
|
21
|
+
type: 'function',
|
|
22
|
+
function: { name: String(whole.name), arguments: JSON.stringify(whole.arguments) }
|
|
23
|
+
}
|
|
24
|
+
];
|
|
25
|
+
}
|
|
26
|
+
// Case 2: raw JSON array of tool calls (model writes [{name, arguments}, ...])
|
|
27
|
+
const arrStart = trimmed.indexOf('[');
|
|
28
|
+
const arrEnd = trimmed.lastIndexOf(']');
|
|
29
|
+
if (arrStart !== -1 && arrEnd !== -1 && arrEnd > arrStart) {
|
|
30
|
+
const arrSub = tryParse(trimmed.slice(arrStart, arrEnd + 1));
|
|
31
|
+
if (Array.isArray(arrSub) && arrSub.length > 0 && arrSub[0]?.name) {
|
|
32
|
+
return arrSub.map((item, i) => ({
|
|
33
|
+
id: `call_${i}`,
|
|
34
|
+
type: 'function',
|
|
35
|
+
function: {
|
|
36
|
+
name: String(item.name),
|
|
37
|
+
arguments: typeof item.arguments === 'string' ? item.arguments : JSON.stringify(item.arguments ?? {})
|
|
38
|
+
}
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Case 3: find a JSON object substring (handles tool_calls wrapper OR single tool-call)
|
|
43
|
+
const start = trimmed.indexOf('{');
|
|
44
|
+
const end = trimmed.lastIndexOf('}');
|
|
45
|
+
if (start !== -1 && end !== -1 && end > start) {
|
|
46
|
+
const sub = tryParse(trimmed.slice(start, end + 1));
|
|
47
|
+
if (sub?.tool_calls && Array.isArray(sub.tool_calls))
|
|
48
|
+
return sub.tool_calls;
|
|
49
|
+
if (sub?.name && sub?.arguments) {
|
|
50
|
+
return [
|
|
51
|
+
{
|
|
52
|
+
id: 'call_0',
|
|
53
|
+
type: 'function',
|
|
54
|
+
function: { name: String(sub.name), arguments: typeof sub.arguments === 'string' ? sub.arguments : JSON.stringify(sub.arguments) }
|
|
55
|
+
}
|
|
56
|
+
];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Case 4: XML tool calls — used by Qwen, Hermes, and other models whose chat
|
|
60
|
+
// templates emit <tool_call><function=name><parameter=key>value</parameter></function></tool_call>.
|
|
61
|
+
// When llama-server's XML→JSON conversion fails (common with large write_file content),
|
|
62
|
+
// the raw XML leaks into the content field. This recovers it.
|
|
63
|
+
const xmlCalls = parseXmlToolCalls(trimmed);
|
|
64
|
+
if (xmlCalls?.length)
|
|
65
|
+
return xmlCalls;
|
|
66
|
+
// Case 5: Lightweight function-tag calls (seen in some Qwen content-mode outputs):
|
|
67
|
+
// <function=tool_name>
|
|
68
|
+
// {...json args...}
|
|
69
|
+
// </function>
|
|
70
|
+
// or single-line <function=tool_name>{...}</function>
|
|
71
|
+
const fnTagCalls = parseFunctionTagToolCalls(trimmed);
|
|
72
|
+
if (fnTagCalls?.length)
|
|
73
|
+
return fnTagCalls;
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Parse XML-style tool calls from content.
|
|
78
|
+
* Format: <tool_call><function=name><parameter=key>value</parameter>...</function></tool_call>
|
|
79
|
+
* Handles multiple tool call blocks and arbitrary parameter names/values.
|
|
80
|
+
*/
|
|
81
|
+
function parseXmlToolCalls(content) {
|
|
82
|
+
// Quick bailout: no point parsing if there's no <tool_call> marker
|
|
83
|
+
if (!content.includes('<tool_call>'))
|
|
84
|
+
return null;
|
|
85
|
+
const calls = [];
|
|
86
|
+
// Match each <tool_call>...</tool_call> block.
|
|
87
|
+
// Using a manual scan instead of a single greedy regex to handle nested angle brackets
|
|
88
|
+
// in parameter values (e.g. TypeScript generics, JSX, comparison operators).
|
|
89
|
+
let searchFrom = 0;
|
|
90
|
+
while (searchFrom < content.length) {
|
|
91
|
+
const blockStart = content.indexOf('<tool_call>', searchFrom);
|
|
92
|
+
if (blockStart === -1)
|
|
93
|
+
break;
|
|
94
|
+
const blockEnd = content.indexOf('</tool_call>', blockStart);
|
|
95
|
+
if (blockEnd === -1)
|
|
96
|
+
break; // Truncated — can't recover partial tool calls
|
|
97
|
+
const block = content.slice(blockStart + '<tool_call>'.length, blockEnd);
|
|
98
|
+
searchFrom = blockEnd + '</tool_call>'.length;
|
|
99
|
+
// Extract function name: <function=name>...</function>
|
|
100
|
+
const fnMatch = block.match(/<function=(\w[\w.-]*)>/);
|
|
101
|
+
if (!fnMatch)
|
|
102
|
+
continue;
|
|
103
|
+
const fnName = fnMatch[1];
|
|
104
|
+
const fnStart = block.indexOf(fnMatch[0]) + fnMatch[0].length;
|
|
105
|
+
const fnEnd = block.lastIndexOf('</function>');
|
|
106
|
+
const fnBody = fnEnd !== -1 ? block.slice(fnStart, fnEnd) : block.slice(fnStart);
|
|
107
|
+
// Extract parameters: <parameter=key>value</parameter>
|
|
108
|
+
// Uses bracket-matching (depth counting) so that parameter values containing
|
|
109
|
+
// literal <parameter=...>...</parameter> (e.g. writing XML files) are handled
|
|
110
|
+
// correctly instead of being truncated at the inner close tag.
|
|
111
|
+
const args = {};
|
|
112
|
+
const openRe = /<parameter=(\w[\w.-]*)>/g;
|
|
113
|
+
const closeTag = '</parameter>';
|
|
114
|
+
let paramMatch;
|
|
115
|
+
while ((paramMatch = openRe.exec(fnBody)) !== null) {
|
|
116
|
+
const paramName = paramMatch[1];
|
|
117
|
+
const valueStart = paramMatch.index + paramMatch[0].length;
|
|
118
|
+
// Bracket-match: find the </parameter> that balances this open tag.
|
|
119
|
+
// Depth starts at 1; nested <parameter=...> increments, </parameter> decrements.
|
|
120
|
+
let depth = 1;
|
|
121
|
+
let scanPos = valueStart;
|
|
122
|
+
let closeIdx = -1;
|
|
123
|
+
while (scanPos < fnBody.length && depth > 0) {
|
|
124
|
+
const nextOpen = fnBody.indexOf('<parameter=', scanPos);
|
|
125
|
+
const nextClose = fnBody.indexOf(closeTag, scanPos);
|
|
126
|
+
if (nextClose === -1)
|
|
127
|
+
break; // No more close tags — truncated
|
|
128
|
+
if (nextOpen !== -1 && nextOpen < nextClose) {
|
|
129
|
+
// An open tag comes before the next close — increase depth
|
|
130
|
+
depth++;
|
|
131
|
+
scanPos = nextOpen + 1; // advance past '<' to avoid re-matching
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
// Close tag comes first — decrease depth
|
|
135
|
+
depth--;
|
|
136
|
+
if (depth === 0) {
|
|
137
|
+
closeIdx = nextClose;
|
|
138
|
+
}
|
|
139
|
+
scanPos = nextClose + closeTag.length;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (closeIdx === -1) {
|
|
143
|
+
// No matching close tag — take rest of body as value (truncated output)
|
|
144
|
+
args[paramName] = fnBody.slice(valueStart).trim();
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
// Trim exactly the template-added leading/trailing newline, preserve internal whitespace
|
|
148
|
+
let value = fnBody.slice(valueStart, closeIdx);
|
|
149
|
+
if (value.startsWith('\n'))
|
|
150
|
+
value = value.slice(1);
|
|
151
|
+
if (value.endsWith('\n'))
|
|
152
|
+
value = value.slice(0, -1);
|
|
153
|
+
args[paramName] = value;
|
|
154
|
+
// Advance the regex past the close tag so the next openRe.exec starts after it
|
|
155
|
+
openRe.lastIndex = closeIdx + closeTag.length;
|
|
156
|
+
}
|
|
157
|
+
if (fnName && Object.keys(args).length > 0) {
|
|
158
|
+
calls.push({
|
|
159
|
+
id: `call_xml_${calls.length}`,
|
|
160
|
+
type: 'function',
|
|
161
|
+
function: {
|
|
162
|
+
name: fnName,
|
|
163
|
+
arguments: JSON.stringify(args)
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return calls.length > 0 ? calls : null;
|
|
169
|
+
}
|
|
170
|
+
/** Check for missing required params by tool name — universal pre-dispatch validation */
|
|
171
|
+
export function getMissingRequiredParams(toolName, args) {
|
|
172
|
+
const required = {
|
|
173
|
+
read_file: ['path'],
|
|
174
|
+
read_files: ['requests'],
|
|
175
|
+
write_file: ['path', 'content'],
|
|
176
|
+
apply_patch: ['patch', 'files'],
|
|
177
|
+
edit_range: ['path', 'start_line', 'end_line', 'replacement'],
|
|
178
|
+
edit_file: ['path', 'old_text', 'new_text'],
|
|
179
|
+
insert_file: ['path', 'line', 'text'],
|
|
180
|
+
list_dir: ['path'],
|
|
181
|
+
search_files: ['pattern', 'path'],
|
|
182
|
+
exec: ['command'],
|
|
183
|
+
spawn_task: ['task'],
|
|
184
|
+
sys_context: [],
|
|
185
|
+
vault_search: ['query'],
|
|
186
|
+
vault_note: ['key', 'value']
|
|
187
|
+
};
|
|
188
|
+
const req = required[toolName];
|
|
189
|
+
if (!req)
|
|
190
|
+
return [];
|
|
191
|
+
return req.filter(p => args[p] === undefined || args[p] === null);
|
|
192
|
+
}
|
|
193
|
+
/** Strip markdown code fences (```json ... ```) from tool argument strings */
|
|
194
|
+
export function stripMarkdownFences(s) {
|
|
195
|
+
const trimmed = s.trim();
|
|
196
|
+
// Match ```json\n...\n``` or ```\n...\n```
|
|
197
|
+
const m = /^```(?:json)?\s*\n?([\s\S]*?)\n?```\s*$/.exec(trimmed);
|
|
198
|
+
return m ? m[1] : s;
|
|
199
|
+
}
|
|
200
|
+
function parseFunctionTagToolCalls(content) {
|
|
201
|
+
const m = content.match(/<function=([\w.-]+)>([\s\S]*?)<\/function>/i);
|
|
202
|
+
if (!m)
|
|
203
|
+
return null;
|
|
204
|
+
const name = m[1];
|
|
205
|
+
const body = (m[2] ?? '').trim();
|
|
206
|
+
// If body contains JSON object, use it as arguments; else empty object.
|
|
207
|
+
let args = '{}';
|
|
208
|
+
const jsonStart = body.indexOf('{');
|
|
209
|
+
const jsonEnd = body.lastIndexOf('}');
|
|
210
|
+
if (jsonStart !== -1 && jsonEnd > jsonStart) {
|
|
211
|
+
const sub = body.slice(jsonStart, jsonEnd + 1);
|
|
212
|
+
try {
|
|
213
|
+
JSON.parse(sub);
|
|
214
|
+
args = sub;
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
// keep {}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return [{
|
|
221
|
+
id: 'call_0',
|
|
222
|
+
type: 'function',
|
|
223
|
+
function: { name, arguments: args }
|
|
224
|
+
}];
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=tool-calls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-calls.js","sourceRoot":"","sources":["../../src/agent/tool-calls.ts"],"names":[],"mappings":"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"}
|