@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.
Files changed (122) hide show
  1. package/README.md +32 -0
  2. package/dist/agent/formatting.js +251 -0
  3. package/dist/agent/formatting.js.map +1 -0
  4. package/dist/agent/review-artifact.js +147 -0
  5. package/dist/agent/review-artifact.js.map +1 -0
  6. package/dist/agent/tool-calls.js +226 -0
  7. package/dist/agent/tool-calls.js.map +1 -0
  8. package/dist/agent.js +314 -695
  9. package/dist/agent.js.map +1 -1
  10. package/dist/anton/controller.js +1 -1
  11. package/dist/anton/controller.js.map +1 -1
  12. package/dist/anton/lock.js +0 -3
  13. package/dist/anton/lock.js.map +1 -1
  14. package/dist/anton/parser.js +0 -1
  15. package/dist/anton/parser.js.map +1 -1
  16. package/dist/anton/reporter.js +1 -1
  17. package/dist/anton/reporter.js.map +1 -1
  18. package/dist/bot/commands.js +3 -2
  19. package/dist/bot/commands.js.map +1 -1
  20. package/dist/bot/confirm-telegram.js +2 -1
  21. package/dist/bot/confirm-telegram.js.map +1 -1
  22. package/dist/bot/discord-routing.js +179 -0
  23. package/dist/bot/discord-routing.js.map +1 -0
  24. package/dist/bot/discord-streaming.js +171 -0
  25. package/dist/bot/discord-streaming.js.map +1 -0
  26. package/dist/bot/discord.js +25 -221
  27. package/dist/bot/discord.js.map +1 -1
  28. package/dist/bot/format.js +2 -25
  29. package/dist/bot/format.js.map +1 -1
  30. package/dist/bot/telegram.js +56 -12
  31. package/dist/bot/telegram.js.map +1 -1
  32. package/dist/cli/args.js +4 -1
  33. package/dist/cli/args.js.map +1 -1
  34. package/dist/cli/build-repl-context.js.map +1 -1
  35. package/dist/cli/command-registry.js +2 -1
  36. package/dist/cli/command-registry.js.map +1 -1
  37. package/dist/cli/command-utils.js +27 -0
  38. package/dist/cli/command-utils.js.map +1 -0
  39. package/dist/cli/commands/anton.js +3 -2
  40. package/dist/cli/commands/anton.js.map +1 -1
  41. package/dist/cli/commands/model.js +8 -7
  42. package/dist/cli/commands/model.js.map +1 -1
  43. package/dist/cli/commands/project.js +5 -4
  44. package/dist/cli/commands/project.js.map +1 -1
  45. package/dist/cli/commands/session.js +118 -8
  46. package/dist/cli/commands/session.js.map +1 -1
  47. package/dist/cli/commands/tools.js +4 -3
  48. package/dist/cli/commands/tools.js.map +1 -1
  49. package/dist/cli/input.js +2 -1
  50. package/dist/cli/input.js.map +1 -1
  51. package/dist/cli/repl-dispatch.js +85 -0
  52. package/dist/cli/repl-dispatch.js.map +1 -0
  53. package/dist/cli/runtime-cmds.js +7 -7
  54. package/dist/cli/runtime-cmds.js.map +1 -1
  55. package/dist/cli/service.js +0 -14
  56. package/dist/cli/service.js.map +1 -1
  57. package/dist/cli/setup.js +25 -5
  58. package/dist/cli/setup.js.map +1 -1
  59. package/dist/cli/watch.js +2 -1
  60. package/dist/cli/watch.js.map +1 -1
  61. package/dist/client.js +51 -4
  62. package/dist/client.js.map +1 -1
  63. package/dist/config.js +79 -0
  64. package/dist/config.js.map +1 -1
  65. package/dist/context.js +101 -10
  66. package/dist/context.js.map +1 -1
  67. package/dist/harnesses.js +1 -1
  68. package/dist/harnesses.js.map +1 -1
  69. package/dist/hooks/index.js +5 -0
  70. package/dist/hooks/index.js.map +1 -0
  71. package/dist/hooks/loader.js +58 -0
  72. package/dist/hooks/loader.js.map +1 -0
  73. package/dist/hooks/manager.js +180 -0
  74. package/dist/hooks/manager.js.map +1 -0
  75. package/dist/hooks/plugins/example-console.js +24 -0
  76. package/dist/hooks/plugins/example-console.js.map +1 -0
  77. package/dist/hooks/scaffold.js +53 -0
  78. package/dist/hooks/scaffold.js.map +1 -0
  79. package/dist/hooks/types.js +8 -0
  80. package/dist/hooks/types.js.map +1 -0
  81. package/dist/index.js +16 -64
  82. package/dist/index.js.map +1 -1
  83. package/dist/progress/agent-hooks.js +37 -0
  84. package/dist/progress/agent-hooks.js.map +1 -0
  85. package/dist/progress/ir.js +7 -0
  86. package/dist/progress/ir.js.map +1 -0
  87. package/dist/progress/progress-message-renderer.js +63 -0
  88. package/dist/progress/progress-message-renderer.js.map +1 -0
  89. package/dist/progress/serialize-discord.js +60 -0
  90. package/dist/progress/serialize-discord.js.map +1 -0
  91. package/dist/progress/serialize-telegram.js +55 -0
  92. package/dist/progress/serialize-telegram.js.map +1 -0
  93. package/dist/progress/serialize-tui.js +39 -0
  94. package/dist/progress/serialize-tui.js.map +1 -0
  95. package/dist/progress/tool-summary.js +58 -0
  96. package/dist/progress/tool-summary.js.map +1 -0
  97. package/dist/progress/tool-tail.js +48 -0
  98. package/dist/progress/tool-tail.js.map +1 -0
  99. package/dist/progress/turn-progress.js +215 -0
  100. package/dist/progress/turn-progress.js.map +1 -0
  101. package/dist/replay.js +2 -5
  102. package/dist/replay.js.map +1 -1
  103. package/dist/safety.js +0 -1
  104. package/dist/safety.js.map +1 -1
  105. package/dist/spinner.js +8 -0
  106. package/dist/spinner.js.map +1 -1
  107. package/dist/tools.js +422 -29
  108. package/dist/tools.js.map +1 -1
  109. package/dist/tui/branch-picker.js.map +1 -1
  110. package/dist/tui/command-handler.js.map +1 -1
  111. package/dist/tui/controller.js +417 -33
  112. package/dist/tui/controller.js.map +1 -1
  113. package/dist/tui/keymap.js +15 -0
  114. package/dist/tui/keymap.js.map +1 -1
  115. package/dist/tui/render.js +115 -3
  116. package/dist/tui/render.js.map +1 -1
  117. package/dist/tui/state.js +82 -1
  118. package/dist/tui/state.js.map +1 -1
  119. package/dist/upgrade.js.map +1 -1
  120. package/dist/utils.js +17 -0
  121. package/dist/utils.js.map +1 -1
  122. 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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"}