micro-models-agent 0.4.0 → 0.5.0

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.
@@ -0,0 +1,257 @@
1
+ import { LMStudioNative } from "../llm/lmstudio-native.js";
2
+ import { OpenAICompat } from "../llm/openai-compat.js";
3
+ import { logInfo, logWarn, logLLMRequest, logLLMResponse, } from "../logger.js";
4
+ import { getLLMConfig } from "../config/config.js";
5
+ export async function doChat(provider, messages, renderer, signal, retries = 1, showThinking = false, caller = "main", maxTokens) {
6
+ let lastReasoningText = "";
7
+ for (let attempt = 0; attempt <= retries; attempt++) {
8
+ const startTime = performance.now();
9
+ const fullText = [];
10
+ let started = false;
11
+ let reasoningBuf = false;
12
+ let currentReasoning = "";
13
+ let lastFinishReason = null;
14
+ let reasoningChunksCount = 0;
15
+ let contentChunksCount = 0;
16
+ if (signal?.aborted)
17
+ return { response: "", genTimeMs: 0 };
18
+ const lastMsg = messages[messages.length - 1];
19
+ logLLMRequest(provider.model, messages.length, lastMsg?.content || "", caller);
20
+ if (caller === "main") {
21
+ renderer.setStreamRole?.("assistant");
22
+ }
23
+ renderer.writeSpinner();
24
+ try {
25
+ let buf = "";
26
+ for await (const chunk of provider.chat(messages, {
27
+ temperature: 0.7,
28
+ signal,
29
+ showThinking,
30
+ enableThinking: true,
31
+ max_tokens: maxTokens,
32
+ })) {
33
+ if (!chunk.content && !chunk.reasoning && !chunk.finish_reason)
34
+ continue;
35
+ if (chunk.finish_reason) {
36
+ lastFinishReason = chunk.finish_reason;
37
+ }
38
+ if (chunk.content) {
39
+ fullText.push(chunk.content);
40
+ contentChunksCount++;
41
+ }
42
+ if (chunk.reasoning) {
43
+ reasoningChunksCount++;
44
+ currentReasoning += chunk.reasoning;
45
+ }
46
+ if (!chunk.content && !chunk.reasoning)
47
+ continue;
48
+ if (!started) {
49
+ renderer.clearSpinner();
50
+ started = true;
51
+ }
52
+ if (chunk.reasoning) {
53
+ if (showThinking) {
54
+ if (reasoningBuf === false) {
55
+ renderer.writeNewline();
56
+ renderer.writeDim("┈ reasoning ┈");
57
+ reasoningBuf = "";
58
+ }
59
+ reasoningBuf += chunk.reasoning;
60
+ }
61
+ continue;
62
+ }
63
+ if (reasoningBuf !== false && typeof reasoningBuf === "string") {
64
+ renderer.writeNewline();
65
+ renderer.writeDim(reasoningBuf);
66
+ reasoningBuf = false;
67
+ }
68
+ buf += chunk.content;
69
+ while (buf.length > 0) {
70
+ const tcStart = buf.indexOf("<tool_call>");
71
+ const tcEnd = buf.indexOf("</tool_call>");
72
+ if (tcStart === -1 && tcEnd === -1) {
73
+ const clean = buf.replace(/@grounding\[файл:\s*[^\]]*\]\n?/g, "");
74
+ if (clean)
75
+ renderer.writeMarkdownChunk(clean);
76
+ buf = "";
77
+ break;
78
+ }
79
+ if (tcStart !== -1 && (tcEnd === -1 || tcStart < tcEnd)) {
80
+ if (tcStart > 0) {
81
+ const clean = buf
82
+ .slice(0, tcStart)
83
+ .replace(/@grounding\[файл:\s*[^\]]*\]\n?/g, "");
84
+ if (clean)
85
+ renderer.writeMarkdownChunk(clean);
86
+ }
87
+ buf = buf.slice(tcStart);
88
+ const closeIdx = buf.indexOf("</tool_call>");
89
+ if (closeIdx !== -1) {
90
+ buf = buf.slice(closeIdx + "</tool_call>".length);
91
+ }
92
+ break;
93
+ }
94
+ if (tcEnd !== -1 && (tcStart === -1 || tcEnd < tcStart)) {
95
+ const clean = buf
96
+ .slice(0, tcEnd)
97
+ .replace(/@grounding\[файл:\s*[^\]]*\]\n?/g, "");
98
+ if (clean)
99
+ renderer.writeMarkdownChunk(clean);
100
+ buf = buf.slice(tcEnd + "</tool_call>".length);
101
+ }
102
+ }
103
+ }
104
+ if (reasoningBuf !== false && typeof reasoningBuf === "string") {
105
+ renderer.writeNewline();
106
+ renderer.writeDim(reasoningBuf);
107
+ }
108
+ if (currentReasoning) {
109
+ lastReasoningText = currentReasoning;
110
+ }
111
+ }
112
+ catch (e) {
113
+ if (e.name === "AbortError") {
114
+ logLLMResponse(provider.model, 0, performance.now() - startTime, "Aborted", caller);
115
+ return { response: "", genTimeMs: 0 };
116
+ }
117
+ logLLMResponse(provider.model, 0, performance.now() - startTime, e.message, caller);
118
+ renderer.writeError(`\n[LLM] ${e.message}`);
119
+ const isNetworkError = !e.message?.includes("API ") && !e.message?.includes("status");
120
+ if (isNetworkError && attempt < retries) {
121
+ const delay = Math.min(2000 * (attempt + 1), 10000);
122
+ renderer.writeWarning(`[LLM] Network error, retrying in ${delay / 1000}s... (attempt ${attempt + 1}/${retries})`);
123
+ await new Promise((r) => setTimeout(r, delay));
124
+ continue;
125
+ }
126
+ const providerHint = provider instanceof LMStudioNative
127
+ ? "Check that LM Studio is running on localhost:1234"
128
+ : provider instanceof OpenAICompat
129
+ ? "Check that your API server is running and the API key is correct"
130
+ : "Check that your LLM server is running";
131
+ renderer.writeWarning(`[LLM] ${providerHint}`);
132
+ return { response: "", genTimeMs: 0 };
133
+ }
134
+ const genTimeMs = performance.now() - startTime;
135
+ const response = fullText.join("");
136
+ renderer.commitMarkdown();
137
+ if (response.trim()) {
138
+ logLLMResponse(provider.model, response.length, genTimeMs, undefined, caller);
139
+ return { response, genTimeMs };
140
+ }
141
+ const reason = lastFinishReason ?? "unknown";
142
+ logWarn("DOCHAT", `empty response #${attempt + 1}: finish_reason=${reason}, reasoning_chunks=${reasoningChunksCount}, content_chunks=${contentChunksCount}`);
143
+ if (lastFinishReason === "length") {
144
+ renderer.writeWarning(` [empty response: model hit max_tokens during reasoning (${reasoningChunksCount} reasoning chunks, 0 content chunks)]`);
145
+ }
146
+ else if (reasoningChunksCount > 0 && contentChunksCount === 0) {
147
+ renderer.writeWarning(` [empty response: model produced ${reasoningChunksCount} reasoning chunks but no content]`);
148
+ }
149
+ if (attempt < retries) {
150
+ renderer.writeDim(`[retry ${attempt + 1}/${retries}]`);
151
+ }
152
+ }
153
+ const llmCfg = getLLMConfig();
154
+ if (llmCfg.retryWithoutThinking && lastReasoningText.trim()) {
155
+ logInfo("DOCHAT", `retrying without thinking (had ${lastReasoningText.length} reasoning chars)`);
156
+ renderer.writeDim(`[retry without thinking]`);
157
+ const retryResult = await doChatOnce(provider, messages, renderer, signal, false, showThinking, caller, maxTokens);
158
+ if (retryResult.response.trim()) {
159
+ logInfo("DOCHAT", `retry without thinking succeeded: ${retryResult.response.length} chars`);
160
+ return retryResult;
161
+ }
162
+ }
163
+ if (lastReasoningText.trim()) {
164
+ logInfo("DOCHAT", `emergency: forcing content with low temperature`);
165
+ renderer.writeDim(`[emergency: forcing content with temperature=0.1]`);
166
+ const emergencyMessages = [
167
+ ...messages,
168
+ {
169
+ role: "user",
170
+ content: "[System] You MUST produce a response now. Do NOT use thinking tags. Reply with a tool call or a direct answer. Any response is better than empty.",
171
+ },
172
+ ];
173
+ const emergencyResult = await doChatOnce(provider, emergencyMessages, renderer, signal, false, showThinking, caller, maxTokens, 0.1);
174
+ if (emergencyResult.response.trim()) {
175
+ logInfo("DOCHAT", `emergency succeeded: ${emergencyResult.response.length} chars`);
176
+ return emergencyResult;
177
+ }
178
+ }
179
+ if (llmCfg.fallbackToReasoning && lastReasoningText.trim()) {
180
+ logInfo("DOCHAT", `fallback: using reasoning as content (${lastReasoningText.length} chars)`);
181
+ renderer.writeWarning(` [fallback: using reasoning as content]`);
182
+ return { response: lastReasoningText, genTimeMs: 0 };
183
+ }
184
+ return { response: "", genTimeMs: 0 };
185
+ }
186
+ async function doChatOnce(provider, messages, renderer, signal, enableThinking = true, showThinking = false, caller = "main", maxTokens, temperature = 0.7) {
187
+ const startTime = performance.now();
188
+ const fullText = [];
189
+ let started = false;
190
+ if (signal?.aborted)
191
+ return { response: "", genTimeMs: 0 };
192
+ if (caller === "main") {
193
+ renderer.setStreamRole?.("assistant");
194
+ }
195
+ renderer.writeSpinner();
196
+ try {
197
+ let buf = "";
198
+ for await (const chunk of provider.chat(messages, {
199
+ temperature,
200
+ signal,
201
+ showThinking,
202
+ enableThinking,
203
+ max_tokens: maxTokens,
204
+ })) {
205
+ if (!chunk.content && !chunk.finish_reason)
206
+ continue;
207
+ if (chunk.content) {
208
+ fullText.push(chunk.content);
209
+ }
210
+ if (!chunk.content)
211
+ continue;
212
+ if (!started) {
213
+ renderer.clearSpinner();
214
+ started = true;
215
+ }
216
+ buf += chunk.content;
217
+ while (buf.length > 0) {
218
+ const tcStart = buf.indexOf("<tool_call>");
219
+ const tcEnd = buf.indexOf("</tool_call>");
220
+ if (tcStart === -1 && tcEnd === -1) {
221
+ if (buf)
222
+ renderer.writeMarkdownChunk(buf);
223
+ buf = "";
224
+ break;
225
+ }
226
+ if (tcStart !== -1 && (tcEnd === -1 || tcStart < tcEnd)) {
227
+ if (tcStart > 0) {
228
+ renderer.writeMarkdownChunk(buf.slice(0, tcStart));
229
+ }
230
+ buf = buf.slice(tcStart);
231
+ const closeIdx = buf.indexOf("</tool_call>");
232
+ if (closeIdx !== -1) {
233
+ buf = buf.slice(closeIdx + "</tool_call>".length);
234
+ }
235
+ break;
236
+ }
237
+ if (tcEnd !== -1 && (tcStart === -1 || tcEnd < tcStart)) {
238
+ renderer.writeMarkdownChunk(buf.slice(0, tcEnd));
239
+ buf = buf.slice(tcEnd + "</tool_call>".length);
240
+ }
241
+ }
242
+ }
243
+ }
244
+ catch (e) {
245
+ if (e.name === "AbortError") {
246
+ return { response: "", genTimeMs: 0 };
247
+ }
248
+ renderer.writeError(`\n[LLM] ${e.message}`);
249
+ return { response: "", genTimeMs: 0 };
250
+ }
251
+ const genTimeMs = performance.now() - startTime;
252
+ const response = fullText.join("");
253
+ renderer.commitMarkdown();
254
+ logLLMResponse(provider.model, response.length, genTimeMs, undefined, caller);
255
+ return { response, genTimeMs };
256
+ }
257
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/subagent/chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function buildSubagentContext(cwd: string): string;
2
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/subagent/context.ts"],"names":[],"mappings":"AAGA,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA+DxD"}
@@ -0,0 +1,64 @@
1
+ import { readdirSync, existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ export function buildSubagentContext(cwd) {
4
+ const lines = [];
5
+ try {
6
+ const entries = readdirSync(cwd, { withFileTypes: true });
7
+ for (const entry of entries) {
8
+ if (!entry.isDirectory() ||
9
+ entry.name.startsWith(".") ||
10
+ entry.name === "node_modules")
11
+ continue;
12
+ const dirPath = join(cwd, entry.name);
13
+ try {
14
+ const files = readdirSync(dirPath, { recursive: true })
15
+ .filter((f) => /\.(ts|tsx|js|jsx)$/.test(f))
16
+ .slice(0, 20);
17
+ if (files.length > 0) {
18
+ lines.push(`Files in ${entry.name}/: ${files.join(", ")}`);
19
+ }
20
+ }
21
+ catch {
22
+ /* skip unreadable dirs */
23
+ }
24
+ }
25
+ }
26
+ catch {
27
+ /* no entries */
28
+ }
29
+ try {
30
+ const rootFiles = readdirSync(cwd).filter((f) => /\.(ts|js)$/.test(f) && !f.startsWith("."));
31
+ if (rootFiles.length > 0) {
32
+ lines.push("Root files: " + rootFiles.join(", "));
33
+ }
34
+ }
35
+ catch {
36
+ /* skip */
37
+ }
38
+ try {
39
+ const pkgPath = join(cwd, "package.json");
40
+ if (existsSync(pkgPath)) {
41
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
42
+ const deps = Object.keys(pkg.dependencies || {});
43
+ const devDeps = Object.keys(pkg.devDependencies || {});
44
+ if (deps.length > 0)
45
+ lines.push("Dependencies: " + deps.join(", "));
46
+ if (devDeps.length > 0)
47
+ lines.push("DevDependencies: " + devDeps.join(", "));
48
+ lines.push("Module type: " + (pkg.type || "commonjs"));
49
+ }
50
+ }
51
+ catch {
52
+ /* no package.json */
53
+ }
54
+ try {
55
+ if (existsSync(join(cwd, "tsconfig.json"))) {
56
+ lines.push("Has tsconfig.json");
57
+ }
58
+ }
59
+ catch {
60
+ /* no tsconfig */
61
+ }
62
+ return lines.join("\n");
63
+ }
64
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/subagent/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "../tools/registry.js";
2
+ export declare const subagentDefinition: ToolDefinition;
3
+ //# sourceMappingURL=definition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/subagent/definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,eAAO,MAAM,kBAAkB,EAAE,cAuBhC,CAAC"}
@@ -0,0 +1,22 @@
1
+ export const subagentDefinition = {
2
+ type: "function",
3
+ function: {
4
+ name: "subagent",
5
+ description: "Delegate a task to an isolated agent with a FRESH context (no history of prior errors). Use for: (1) each file when creating 3+ new files, (2) any task where you are stuck or making repeated errors, (3) simple single-step operations (bash, file read/write). The subagent has all tools and starts clean — ideal when accumulated context is causing confusion.",
6
+ parameters: {
7
+ type: "object",
8
+ properties: {
9
+ task: {
10
+ type: "string",
11
+ description: "What the subagent should do — be specific and include file paths",
12
+ },
13
+ existingFiles: {
14
+ type: "string",
15
+ description: "Comma-separated files the subagent can read for context (optional)",
16
+ },
17
+ },
18
+ required: ["task"],
19
+ },
20
+ },
21
+ };
22
+ //# sourceMappingURL=definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/subagent/definition.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAmB;IAChD,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,WAAW,EACT,sWAAsW;QACxW,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,kEAAkE;iBACrE;gBACD,aAAa,EAAE;oBACb,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,oEAAoE;iBACvE;aACF;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB;KACF;CACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ /** Паттерны ошибок которые НЕ триггерят specialist (trivial) */
2
+ export declare const TRIVIAL_ERROR_PATTERNS: RegExp[];
3
+ /** Паттерны ошибок которые ВСЕГДА требуют specialist (не trivial) */
4
+ export declare const NON_TRIVIAL_ERROR_PATTERNS: RegExp[];
5
+ export declare function isTrivialError(toolName: string, errorOutput: string): boolean;
6
+ export declare function buildSpecialistTask(toolName: string, toolArgs: Record<string, unknown>, errorOutput: string, userTask: string, attemptCount: number): string;
7
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/subagent/errors.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,eAAO,MAAM,sBAAsB,UAMlC,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,0BAA0B,UAQtC,CAAC;AAEF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAiB7E;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,MAAM,CAgCR"}
@@ -0,0 +1,64 @@
1
+ /** Паттерны ошибок которые НЕ триггерят specialist (trivial) */
2
+ export const TRIVIAL_ERROR_PATTERNS = [
3
+ /no results? found/i,
4
+ /pattern .* matched 0 results/i,
5
+ /0 files? matched/i,
6
+ /command not found.*grep/i,
7
+ /not a directory/i,
8
+ ];
9
+ /** Паттерны ошибок которые ВСЕГДА требуют specialist (не trivial) */
10
+ export const NON_TRIVIAL_ERROR_PATTERNS = [
11
+ /unexpected token/i,
12
+ /syntaxerror/i,
13
+ /cannot find module/i,
14
+ /module not found/i,
15
+ /permission denied/i,
16
+ /enoent/i,
17
+ /eacces/i,
18
+ ];
19
+ export function isTrivialError(toolName, errorOutput) {
20
+ if (NON_TRIVIAL_ERROR_PATTERNS.some((p) => p.test(errorOutput))) {
21
+ return false;
22
+ }
23
+ if (toolName === "grep_search" || toolName === "glob_search") {
24
+ if (/0 results|0 files|no match/i.test(errorOutput) &&
25
+ errorOutput.length < 200) {
26
+ return true;
27
+ }
28
+ }
29
+ if (errorOutput.length < 10)
30
+ return true;
31
+ return TRIVIAL_ERROR_PATTERNS.some((p) => p.test(errorOutput));
32
+ }
33
+ export function buildSpecialistTask(toolName, toolArgs, errorOutput, userTask, attemptCount) {
34
+ const argsStr = JSON.stringify(toolArgs, null, 2);
35
+ let webHints = "";
36
+ if (toolName === "web_browse" && String(toolArgs?.action) === "evaluate") {
37
+ const code = String(toolArgs?.value ?? toolArgs?.code ?? "");
38
+ webHints = [
39
+ "",
40
+ 'web_browse evaluate: "value" is JS code executed in browser context.',
41
+ "- return statements work: return document.title",
42
+ `- Current code that failed: ${code.slice(0, 300)}`,
43
+ ].join("\n");
44
+ }
45
+ return [
46
+ `The tool "${toolName}" has failed ${attemptCount} times with the same error while working on: "${userTask.slice(0, 200)}"`,
47
+ "",
48
+ `Failed tool call:`,
49
+ ` Tool: ${toolName}`,
50
+ ` Arguments: ${argsStr}`,
51
+ "",
52
+ `Error output:`,
53
+ ` ${errorOutput.slice(0, 500)}`,
54
+ webHints,
55
+ "",
56
+ `Your task: Diagnose WHY this tool call fails and FIX the underlying problem.`,
57
+ ` - Read the relevant files to understand the actual state`,
58
+ ` - Fix the root cause (wrong path, missing file, syntax error, etc.)`,
59
+ ` - If the tool call arguments are wrong, correct them`,
60
+ ` - If the file doesn't exist, create it`,
61
+ ` - Return a clear summary of what you found and what you fixed`,
62
+ ].join("\n");
63
+ }
64
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/subagent/errors.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,oBAAoB;IACpB,+BAA+B;IAC/B,mBAAmB;IACnB,0BAA0B;IAC1B,kBAAkB;CACnB,CAAC;AAEF,qEAAqE;AACrE,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,mBAAmB;IACnB,cAAc;IACd,qBAAqB;IACrB,mBAAmB;IACnB,oBAAoB;IACpB,SAAS;IACT,SAAS;CACV,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,WAAmB;IAClE,IAAI,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,QAAQ,KAAK,aAAa,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC7D,IACE,6BAA6B,CAAC,IAAI,CAAC,WAAW,CAAC;YAC/C,WAAW,CAAC,MAAM,GAAG,GAAG,EACxB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,IAAI,CAAC;IAEzC,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,QAAgB,EAChB,QAAiC,EACjC,WAAmB,EACnB,QAAgB,EAChB,YAAoB;IAEpB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAElD,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,QAAQ,KAAK,YAAY,IAAI,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC;QACzE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,KAAK,IAAI,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAC7D,QAAQ,GAAG;YACT,EAAE;YACF,sEAAsE;YACtE,iDAAiD;YACjD,+BAA+B,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;SACpD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,OAAO;QACL,aAAa,QAAQ,gBAAgB,YAAY,iDAAiD,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG;QAC3H,EAAE;QACF,mBAAmB;QACnB,WAAW,QAAQ,EAAE;QACrB,gBAAgB,OAAO,EAAE;QACzB,EAAE;QACF,eAAe;QACf,KAAK,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;QAChC,QAAQ;QACR,EAAE;QACF,8EAA8E;QAC9E,4DAA4D;QAC5D,uEAAuE;QACvE,wDAAwD;QACxD,0CAA0C;QAC1C,iEAAiE;KAClE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** Набор валидных инструментов (единый источник истины) */
2
+ export declare const VALID_TOOLS: Set<string>;
3
+ /** Обязательные аргументы для каждого инструмента */
4
+ export declare const REQUIRED_ARGS: Record<string, string[]>;
5
+ export declare function validateToolCall(parsed: any): {
6
+ valid: boolean;
7
+ name?: string;
8
+ cmd?: string;
9
+ error?: string;
10
+ };
11
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/subagent/validation.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,eAAO,MAAM,WAAW,aA0BtB,CAAC;AAEH,qDAAqD;AACrD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAiBlD,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,GAAG;IAC7C,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAgCA"}
@@ -0,0 +1,77 @@
1
+ /** Набор валидных инструментов (единый источник истины) */
2
+ export const VALID_TOOLS = new Set([
3
+ "bash",
4
+ "plan",
5
+ "todo",
6
+ "question",
7
+ "approve",
8
+ "theme",
9
+ "user_profile",
10
+ "subagent",
11
+ "read_file",
12
+ "write_file",
13
+ "edit_file",
14
+ "list_dir",
15
+ "create_dir",
16
+ "delete_file",
17
+ "copy_file",
18
+ "move_file",
19
+ "file_info",
20
+ "glob_search",
21
+ "grep_search",
22
+ "tree",
23
+ "web_search",
24
+ "web_fetch",
25
+ "web_browse",
26
+ "scaffold",
27
+ "project_map",
28
+ ]);
29
+ /** Обязательные аргументы для каждого инструмента */
30
+ export const REQUIRED_ARGS = {
31
+ read_file: ["path"],
32
+ write_file: ["path", "content"],
33
+ edit_file: ["path", "old_string", "new_string"],
34
+ list_dir: [],
35
+ create_dir: ["path"],
36
+ delete_file: ["path"],
37
+ copy_file: ["source", "destination"],
38
+ move_file: ["source", "destination"],
39
+ file_info: ["path"],
40
+ glob_search: ["pattern"],
41
+ grep_search: ["pattern"],
42
+ tree: [],
43
+ web_search: ["query"],
44
+ web_fetch: ["url"],
45
+ user_profile: [],
46
+ question: ["question"],
47
+ };
48
+ export function validateToolCall(parsed) {
49
+ if (!parsed || typeof parsed !== "object") {
50
+ return { valid: false, error: "Not an object" };
51
+ }
52
+ if (!parsed.name || !VALID_TOOLS.has(parsed.name)) {
53
+ return { valid: false, error: `Unknown tool: ${parsed.name}` };
54
+ }
55
+ if (!parsed.arguments || typeof parsed.arguments !== "object") {
56
+ return { valid: false, error: "Missing arguments" };
57
+ }
58
+ if (parsed.name === "bash") {
59
+ const cmd = String(parsed.arguments.cmd ?? "").trim();
60
+ if (!cmd)
61
+ return { valid: false, error: "Empty command" };
62
+ return { valid: true, name: parsed.name, cmd };
63
+ }
64
+ const required = REQUIRED_ARGS[parsed.name] ?? [];
65
+ const missing = required.filter((k) => {
66
+ const v = parsed.arguments[k];
67
+ return v === undefined || v === null || v === "";
68
+ });
69
+ if (missing.length > 0) {
70
+ return {
71
+ valid: false,
72
+ error: `Missing required argument(s): ${missing.join(", ")}. Tool "${parsed.name}" requires: ${required.join(", ")}`,
73
+ };
74
+ }
75
+ return { valid: true, name: parsed.name };
76
+ }
77
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/subagent/validation.ts"],"names":[],"mappings":"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"}