activo 0.4.2 → 0.4.4

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/dist/cli/index.js CHANGED
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAsC,UAAU,EAAQ,MAAM,kBAAkB,CAAC;AAExF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,KAAK,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,EAAE,UAAU,CAAC;KACpB,CAAC,CAAC;CACJ;AAmED,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EACrC,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,WAAW,CAAC,CA2EtB;AAED,wBAAuB,oBAAoB,CACzC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,WAAW,EACzB,cAAc,CAAC,EAAE,MAAM,GACtB,cAAc,CAAC,UAAU,CAAC,CAkG5B"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAmD,UAAU,EAAQ,MAAM,kBAAkB,CAAC;AAErG,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,KAAK,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,EAAE,UAAU,CAAC;KACpB,CAAC,CAAC;CACJ;AAgaD,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EACrC,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,WAAW,CAAC,CAqGtB;AAED,wBAAuB,oBAAoB,CACzC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,WAAW,EACzB,cAAc,CAAC,EAAE,MAAM,GACtB,cAAc,CAAC,UAAU,CAAC,CA2J5B"}
@@ -1,52 +1,12 @@
1
- import { getAllTools, executeTool } from "./tools/index.js";
1
+ import * as fs from "fs";
2
+ import { selectTools, executeTool } from "./tools/index.js";
2
3
  const BASE_SYSTEM_PROMPT = `You are ACTIVO, a code quality analyzer. You MUST call tools to perform tasks.
3
4
 
4
- ## CRITICAL RULES
5
+ ## RULES
5
6
  1. Call tool IMMEDIATELY when user requests an action
6
- 2. NEVER output text before calling a tool
7
- 3. NEVER fabricate results - only report actual tool output
8
- 4. After tool returns, summarize in user's language (Korean if user speaks Korean)
9
-
10
- ## TOOLS BY CATEGORY
11
-
12
- ### Document Conversion & RAG
13
- - import_hwp_standards(hwpPath, outputDir): Convert HWP to markdown
14
- - import_pdf_standards(pdfPath, outputDir): Convert PDF to markdown
15
- - index_standards(directory?): Index standards for RAG search (run after import)
16
- - search_standards(query, topK?): Search standards by semantic query
17
- - check_quality_rag(filepath, topK?): Check code using RAG to find relevant standards
18
-
19
- ### Code Analysis (Recommended: use analyze_all)
20
- - analyze_all(path, include?): Analyze all code (Java/JS/TS/Python)
21
- - java_analyze(path): Java code analysis
22
- - java_complexity(path): Java complexity metrics
23
- - spring_check(path): Spring pattern check
24
- - ast_analyze(path): JS/TS AST analysis
25
- - react_check(path): React pattern check
26
- - vue_check(path): Vue pattern check
27
- - python_check(path): Python code analysis
28
-
29
- ### SQL/DB Analysis
30
- - sql_check(path): SQL query analysis
31
- - mybatis_check(path): MyBatis mapper analysis
32
-
33
- ### Web Analysis
34
- - css_check(path): CSS analysis
35
- - html_check(path): HTML analysis
36
- - dependency_check(path): package.json dependency analysis
37
- - openapi_check(path): OpenAPI spec analysis
38
-
39
- ### File Operations
40
- - read_file(path): Read file content
41
- - write_file(path, content): Write file
42
- - list_directory(path): List directory contents
43
- - grep_search(pattern, path): Search pattern in files
44
- - glob_search(pattern): Search files by pattern
45
-
46
- ## EXAMPLE
47
- User: "Analyze src folder"
48
- → Call analyze_all(path="src") immediately
49
- → After result: Summarize findings`;
7
+ 2. NEVER fabricate results - only report actual tool output
8
+ 3. After tool returns, summarize in user's language (Korean if user speaks Korean)
9
+ 4. Use analyze_all for broad code analysis`;
50
10
  // Build system prompt with optional context
51
11
  function buildSystemPrompt(contextSummary) {
52
12
  if (!contextSummary) {
@@ -61,8 +21,376 @@ ${contextSummary}
61
21
  ---
62
22
  위 내용은 이전 세션에서의 대화 요약입니다. 필요시 참고하세요.`;
63
23
  }
24
+ // Intent patterns: keyword groups → tool + args builder
25
+ const INTENT_PATTERNS = [
26
+ // Single file analysis (must come before directory patterns)
27
+ {
28
+ keywords: ["분석", "analyze", "검사", "check"],
29
+ tool: "_single_file", // special marker - resolved at match time
30
+ buildArgs: (path) => ({ filepath: path }),
31
+ },
32
+ // analyze_all with Java filter
33
+ {
34
+ keywords: ["자바", "java"],
35
+ tool: "analyze_all",
36
+ buildArgs: (path) => ({ path, include: ["java"] }),
37
+ },
38
+ // Spring patterns
39
+ {
40
+ keywords: ["spring", "스프링"],
41
+ tool: "analyze_all",
42
+ buildArgs: (path) => ({ path, include: ["java"] }),
43
+ },
44
+ // Dependency analysis
45
+ {
46
+ keywords: ["의존성", "dependency", "dependencies", "취약점"],
47
+ tool: "dependency_check",
48
+ buildArgs: (path) => ({ path }),
49
+ },
50
+ // Complexity
51
+ {
52
+ keywords: ["복잡도", "complexity"],
53
+ tool: "analyze_all",
54
+ buildArgs: (path) => ({ path }),
55
+ },
56
+ // Python
57
+ {
58
+ keywords: ["python", "파이썬", ".py"],
59
+ tool: "analyze_all",
60
+ buildArgs: (path) => ({ path, include: ["py"] }),
61
+ },
62
+ // Frontend
63
+ {
64
+ keywords: ["react", "리액트", "vue", "뷰", "프론트엔드", "frontend"],
65
+ tool: "analyze_all",
66
+ buildArgs: (path) => ({ path, include: ["js", "ts", "jsx", "tsx", "vue"] }),
67
+ },
68
+ // CSS
69
+ {
70
+ keywords: ["css", "scss", "less", "스타일"],
71
+ tool: "analyze_all",
72
+ buildArgs: (path) => ({ path, include: ["css"] }),
73
+ },
74
+ // HTML
75
+ {
76
+ keywords: ["html", "jsp", "접근성", "a11y", "seo"],
77
+ tool: "analyze_all",
78
+ buildArgs: (path) => ({ path, include: ["html"] }),
79
+ },
80
+ // SQL / MyBatis
81
+ {
82
+ keywords: ["sql", "mybatis", "마이바티스", "쿼리"],
83
+ tool: "analyze_all",
84
+ buildArgs: (path) => ({ path, include: ["java", "xml"] }),
85
+ },
86
+ // Broad analysis (catch-all, must be last)
87
+ {
88
+ keywords: ["전체분석", "전체 분석", "분석해", "코드품질", "코드 품질", "analyze", "분석", "검사", "check"],
89
+ tool: "analyze_all",
90
+ buildArgs: (path) => ({ path }),
91
+ },
92
+ ];
93
+ // File extension → single-file tool mapping
94
+ const FILE_TOOL_MAP = {
95
+ ".java": "java_analyze",
96
+ ".js": "ast_analyze",
97
+ ".ts": "ast_analyze",
98
+ ".jsx": "react_check",
99
+ ".tsx": "react_check",
100
+ ".vue": "vue_check",
101
+ ".py": "python_check",
102
+ ".css": "css_check",
103
+ ".scss": "css_check",
104
+ ".less": "css_check",
105
+ ".html": "html_check",
106
+ ".htm": "html_check",
107
+ ".jsp": "html_check",
108
+ };
109
+ /**
110
+ * Extract filesystem paths from user message.
111
+ * Handles quoted paths (with spaces), simple paths, and greedy path expansion.
112
+ */
113
+ function extractPaths(message) {
114
+ const paths = [];
115
+ // 1. Quoted paths: '...' or "..."
116
+ const quotedMatches = message.match(/['"]([/\\][^'"]+)['"]/g);
117
+ if (quotedMatches) {
118
+ for (const m of quotedMatches) {
119
+ paths.push(m.slice(1, -1)); // strip quotes
120
+ }
121
+ }
122
+ // 2. Simple paths (no spaces) - Unix & Windows
123
+ const unixMatches = message.match(/(?:^|\s)(\/[^\s,;:'"]+)/g);
124
+ if (unixMatches) {
125
+ for (const m of unixMatches) {
126
+ paths.push(m.trim());
127
+ }
128
+ }
129
+ const winMatches = message.match(/(?:^|\s)([A-Z]:\\[^\s,;:'"]+)/gi);
130
+ if (winMatches) {
131
+ for (const m of winMatches) {
132
+ paths.push(m.trim());
133
+ }
134
+ }
135
+ // 3. Greedy path expansion: if simple match doesn't exist,
136
+ // try extending with subsequent words until path is valid
137
+ if (paths.length === 0 || !paths.some((p) => { try {
138
+ return fs.existsSync(p);
139
+ }
140
+ catch {
141
+ return false;
142
+ } })) {
143
+ const words = message.split(/\s+/);
144
+ for (let i = 0; i < words.length; i++) {
145
+ if (words[i].startsWith("/") || /^[A-Z]:\\/i.test(words[i])) {
146
+ // Found a path start, try extending
147
+ let candidate = words[i];
148
+ let bestPath = "";
149
+ // Check initial segment
150
+ try {
151
+ if (fs.existsSync(candidate))
152
+ bestPath = candidate;
153
+ }
154
+ catch { /* */ }
155
+ // Extend with subsequent words
156
+ for (let j = i + 1; j < words.length; j++) {
157
+ const extended = candidate + " " + words[j];
158
+ try {
159
+ if (fs.existsSync(extended)) {
160
+ bestPath = extended;
161
+ candidate = extended;
162
+ }
163
+ else {
164
+ // No more valid extensions - stop
165
+ break;
166
+ }
167
+ }
168
+ catch {
169
+ break;
170
+ }
171
+ }
172
+ if (bestPath) {
173
+ paths.push(bestPath);
174
+ }
175
+ }
176
+ }
177
+ }
178
+ // Filter to actually existing paths, deduplicate
179
+ const seen = new Set();
180
+ return paths.filter((p) => {
181
+ if (seen.has(p))
182
+ return false;
183
+ seen.add(p);
184
+ try {
185
+ return fs.existsSync(p);
186
+ }
187
+ catch {
188
+ return false;
189
+ }
190
+ });
191
+ }
192
+ /**
193
+ * Determine if a path is a single file (not a directory).
194
+ */
195
+ function isSingleFile(p) {
196
+ try {
197
+ return fs.statSync(p).isFile();
198
+ }
199
+ catch {
200
+ return false;
201
+ }
202
+ }
203
+ /**
204
+ * Resolve the correct tool for a single file based on extension.
205
+ */
206
+ function resolveFileAnalysisTool(filepath) {
207
+ const ext = filepath.substring(filepath.lastIndexOf(".")).toLowerCase();
208
+ const toolName = FILE_TOOL_MAP[ext];
209
+ if (!toolName)
210
+ return null;
211
+ // Some tools use 'filepath', others use 'path'
212
+ const argKey = ["python_check", "css_check", "html_check"].includes(toolName) ? "path" : "filepath";
213
+ return { tool: toolName, args: { [argKey]: filepath } };
214
+ }
215
+ /**
216
+ * Detect user intent from the message and automatically execute the appropriate tool.
217
+ * Returns IntentResult with handled=true if a tool was executed, false otherwise.
218
+ */
219
+ async function detectAndExecuteIntent(userMessage, onEvent) {
220
+ const msg = userMessage.toLowerCase();
221
+ const paths = extractPaths(userMessage);
222
+ // No path found → can't auto-route
223
+ if (paths.length === 0) {
224
+ return { handled: false };
225
+ }
226
+ const targetPath = paths[0];
227
+ // Check if path is a single file
228
+ if (isSingleFile(targetPath)) {
229
+ const fileInfo = resolveFileAnalysisTool(targetPath);
230
+ if (fileInfo) {
231
+ return await executeIntentTool(fileInfo.tool, fileInfo.args, onEvent);
232
+ }
233
+ // Unknown file type → fall back to LLM
234
+ return { handled: false };
235
+ }
236
+ // Path is a directory → match intent patterns
237
+ for (const pattern of INTENT_PATTERNS) {
238
+ // Skip the single-file marker for directories
239
+ if (pattern.tool === "_single_file")
240
+ continue;
241
+ if (pattern.keywords.some((kw) => msg.includes(kw))) {
242
+ const args = pattern.buildArgs(targetPath, userMessage);
243
+ return await executeIntentTool(pattern.tool, args, onEvent);
244
+ }
245
+ }
246
+ // Has a directory path but no matching keyword → default to analyze_all
247
+ // (user likely wants some kind of analysis if they provided a path)
248
+ const hasAnalysisHint = /분석|검사|확인|체크|check|analyze|review|scan|report/i.test(msg);
249
+ if (hasAnalysisHint) {
250
+ return await executeIntentTool("analyze_all", { path: targetPath }, onEvent);
251
+ }
252
+ return { handled: false };
253
+ }
254
+ /**
255
+ * Execute a tool by name and return an IntentResult with the summary prompt.
256
+ */
257
+ async function executeIntentTool(toolName, toolArgs, onEvent) {
258
+ const toolCall = {
259
+ id: `intent_${Date.now()}_${Math.random().toString(36).slice(2)}`,
260
+ name: toolName,
261
+ arguments: toolArgs,
262
+ };
263
+ // Emit tool_use start event
264
+ onEvent?.({
265
+ type: "tool_use",
266
+ tool: toolName,
267
+ status: "start",
268
+ args: toolArgs,
269
+ });
270
+ const result = await executeTool(toolCall);
271
+ // Emit tool_result event
272
+ onEvent?.({
273
+ type: "tool_result",
274
+ tool: toolName,
275
+ status: result.success ? "complete" : "error",
276
+ result,
277
+ });
278
+ if (!result.success) {
279
+ return {
280
+ handled: true,
281
+ toolName,
282
+ toolArgs,
283
+ toolResult: result,
284
+ summaryPrompt: `도구 "${toolName}" 실행 중 오류가 발생했습니다: ${result.error}\n사용자에게 오류 내용을 설명해주세요.`,
285
+ };
286
+ }
287
+ // Compress result to fit in context window
288
+ const compressed = compressAnalysisResult(result.content);
289
+ return {
290
+ handled: true,
291
+ toolName,
292
+ toolArgs,
293
+ toolResult: result,
294
+ summaryPrompt: `아래는 "${toolName}" 도구의 실행 결과입니다. 사용자에게 한국어로 핵심 내용을 요약해주세요.\n\n${compressed}`,
295
+ };
296
+ }
297
+ /**
298
+ * Compress analysis result JSON to fit within LLM context window.
299
+ * Extracts only key metrics, removing verbose raw data.
300
+ */
301
+ function compressAnalysisResult(resultContent, maxChars = 2000) {
302
+ try {
303
+ const parsed = JSON.parse(resultContent);
304
+ // analyze_all result
305
+ if (parsed.path && parsed.fileStats) {
306
+ const compact = {
307
+ path: parsed.path,
308
+ totalFiles: parsed.totalFiles,
309
+ fileStats: parsed.fileStats,
310
+ analysesRun: parsed.analysesRun,
311
+ successful: parsed.successful,
312
+ failed: parsed.failed,
313
+ };
314
+ // Extract issue summaries (compact)
315
+ if (parsed.issuesSummary?.length > 0) {
316
+ compact.issues = parsed.issuesSummary.map((is) => ({
317
+ tool: is.tool,
318
+ issues: is.issues.slice(0, 5),
319
+ }));
320
+ }
321
+ // Extract per-tool summaries (key metrics only)
322
+ if (parsed.details?.length > 0) {
323
+ compact.analyses = parsed.details.map((d) => {
324
+ const s = d.summary;
325
+ const brief = { tool: d.tool };
326
+ // Extract numeric/small fields only
327
+ for (const [k, v] of Object.entries(s)) {
328
+ if (typeof v === "number" || typeof v === "boolean") {
329
+ brief[k] = v;
330
+ }
331
+ else if (typeof v === "string" && v.length < 100) {
332
+ brief[k] = v;
333
+ }
334
+ // Skip arrays/objects (raw data) to save space
335
+ }
336
+ // Include issues from samples (java_analyze etc.)
337
+ if (Array.isArray(s.samples)) {
338
+ const allIssues = [];
339
+ for (const sample of s.samples) {
340
+ if (Array.isArray(sample.result?.issues)) {
341
+ allIssues.push(...sample.result.issues.slice(0, 3));
342
+ }
343
+ }
344
+ if (allIssues.length > 0) {
345
+ brief.issues = allIssues.slice(0, 10);
346
+ }
347
+ }
348
+ return brief;
349
+ });
350
+ }
351
+ if (parsed.errors?.length > 0) {
352
+ compact.errors = parsed.errors;
353
+ }
354
+ const result = JSON.stringify(compact, null, 1);
355
+ return result.length > maxChars ? result.slice(0, maxChars) + "..." : result;
356
+ }
357
+ // java_analyze or other single-file results
358
+ if (parsed.file || parsed.filepath || parsed.classes || parsed.functions) {
359
+ const result = JSON.stringify(parsed, null, 1);
360
+ return result.length > maxChars ? result.slice(0, maxChars) + "..." : result;
361
+ }
362
+ // Generic: just truncate
363
+ const result = JSON.stringify(parsed, null, 1);
364
+ return result.length > maxChars ? result.slice(0, maxChars) + "..." : result;
365
+ }
366
+ catch {
367
+ // Not valid JSON, return truncated raw text
368
+ return resultContent.length > maxChars ? resultContent.slice(0, maxChars) + "..." : resultContent;
369
+ }
370
+ }
371
+ // ─── Main processing functions ───
64
372
  export async function processMessage(userMessage, history, client, config, onEvent, contextSummary) {
65
- const tools = getAllTools();
373
+ // Try intent router first
374
+ const intent = await detectAndExecuteIntent(userMessage, onEvent);
375
+ if (intent.handled && intent.summaryPrompt) {
376
+ // Tool already executed → ask LLM to summarize only (no tools = VRAM savings)
377
+ onEvent?.({ type: "thinking" });
378
+ const summaryMessages = [
379
+ { role: "system", content: BASE_SYSTEM_PROMPT },
380
+ { role: "user", content: intent.summaryPrompt },
381
+ ];
382
+ const response = await client.chat(summaryMessages); // No tools!
383
+ onEvent?.({ type: "content", content: response.content });
384
+ onEvent?.({ type: "done" });
385
+ return {
386
+ content: response.content,
387
+ toolCalls: intent.toolResult
388
+ ? [{ tool: intent.toolName, args: intent.toolArgs, result: intent.toolResult }]
389
+ : [],
390
+ };
391
+ }
392
+ // Fallback: existing LLM-driven tool selection
393
+ const tools = selectTools(userMessage);
66
394
  const systemPrompt = buildSystemPrompt(contextSummary);
67
395
  const messages = [
68
396
  { role: "system", content: systemPrompt },
@@ -123,7 +451,57 @@ export async function processMessage(userMessage, history, client, config, onEve
123
451
  };
124
452
  }
125
453
  export async function* streamProcessMessage(userMessage, history, client, config, abortSignal, contextSummary) {
126
- const tools = getAllTools();
454
+ // Try intent router first
455
+ const intent = await detectAndExecuteIntent(userMessage, (event) => {
456
+ // Events are yielded by the caller, we collect them via callback
457
+ // But generators can't yield from callbacks, so we handle this differently
458
+ });
459
+ if (intent.handled) {
460
+ // Emit the tool events that happened during intent detection
461
+ if (intent.toolName) {
462
+ yield {
463
+ type: "tool_use",
464
+ tool: intent.toolName,
465
+ status: "start",
466
+ args: intent.toolArgs,
467
+ };
468
+ yield {
469
+ type: "tool_result",
470
+ tool: intent.toolName,
471
+ status: intent.toolResult?.success ? "complete" : "error",
472
+ result: intent.toolResult,
473
+ };
474
+ }
475
+ if (intent.summaryPrompt) {
476
+ if (abortSignal?.aborted) {
477
+ yield { type: "error", error: "Operation cancelled" };
478
+ return;
479
+ }
480
+ yield { type: "thinking" };
481
+ // Stream the LLM summary (no tools = streaming mode in ollama client)
482
+ const summaryMessages = [
483
+ { role: "system", content: BASE_SYSTEM_PROMPT },
484
+ { role: "user", content: intent.summaryPrompt },
485
+ ];
486
+ for await (const event of client.streamChat(summaryMessages, undefined, abortSignal)) {
487
+ if (abortSignal?.aborted) {
488
+ yield { type: "error", error: "Operation cancelled" };
489
+ return;
490
+ }
491
+ if (event.type === "content" && event.content) {
492
+ yield { type: "content", content: event.content };
493
+ }
494
+ else if (event.type === "error") {
495
+ yield { type: "error", error: event.error };
496
+ return;
497
+ }
498
+ }
499
+ }
500
+ yield { type: "done" };
501
+ return;
502
+ }
503
+ // Fallback: existing LLM-driven tool selection
504
+ const tools = selectTools(userMessage);
127
505
  const systemPrompt = buildSystemPrompt(contextSummary);
128
506
  const messages = [
129
507
  { role: "system", content: systemPrompt },
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAGzB,OAAO,EAAe,WAAW,EAAE,WAAW,EAA8B,MAAM,kBAAkB,CAAC;AAqBrG,MAAM,kBAAkB,GAAG;;;;;;2CAMgB,CAAC;AAE5C,4CAA4C;AAC5C,SAAS,iBAAiB,CAAC,cAAuB;IAChD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,OAAO,GAAG,kBAAkB;;;;EAI5B,cAAc;;;oCAGoB,CAAC;AACrC,CAAC;AAkBD,wDAAwD;AACxD,MAAM,eAAe,GAAoB;IACvC,6DAA6D;IAC7D;QACE,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC;QAC1C,IAAI,EAAE,cAAc,EAAG,0CAA0C;QACjE,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KAClD;IACD,+BAA+B;IAC/B;QACE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC;QACxB,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;KAC3D;IACD,kBAAkB;IAClB;QACE,QAAQ,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;QAC3B,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;KAC3D;IACD,sBAAsB;IACtB;QACE,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,CAAC;QACtD,IAAI,EAAE,kBAAkB;QACxB,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;KACxC;IACD,aAAa;IACb;QACE,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC;QAC/B,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;KACxC;IACD,SAAS;IACT;QACE,QAAQ,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC;QAClC,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;KACzD;IACD,WAAW;IACX;QACE,QAAQ,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC;QAC3D,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;KACpF;IACD,MAAM;IACN;QACE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;QACxC,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;KAC1D;IACD,OAAO;IACP;QACE,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;QAC/C,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;KAC3D;IACD,gBAAgB;IAChB;QACE,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;QAC3C,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;KAClE;IACD,2CAA2C;IAC3C;QACE,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC;QACnF,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;KACxC;CACF,CAAC;AAEF,4CAA4C;AAC5C,MAAM,aAAa,GAA2B;IAC5C,OAAO,EAAE,cAAc;IACvB,KAAK,EAAE,aAAa;IACpB,KAAK,EAAE,aAAa;IACpB,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,WAAW;IACnB,KAAK,EAAE,cAAc;IACrB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,WAAW;IACpB,OAAO,EAAE,WAAW;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;CACrB,CAAC;AAEF;;;GAGG;AACH,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,kCAAkC;IAClC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC9D,IAAI,aAAa,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe;QAC7C,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9D,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACpE,IAAI,UAAU,EAAE,CAAC;QACf,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,6DAA6D;IAC7D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3G,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5D,oCAAoC;gBACpC,IAAI,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACzB,IAAI,QAAQ,GAAG,EAAE,CAAC;gBAClB,wBAAwB;gBACxB,IAAI,CAAC;oBAAC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;wBAAE,QAAQ,GAAG,SAAS,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;gBAC3E,+BAA+B;gBAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC1C,MAAM,QAAQ,GAAG,SAAS,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBAC5C,IAAI,CAAC;wBACH,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;4BAC5B,QAAQ,GAAG,QAAQ,CAAC;4BACpB,SAAS,GAAG,QAAQ,CAAC;wBACvB,CAAC;6BAAM,CAAC;4BACN,kCAAkC;4BAClC,MAAM;wBACR,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,IAAI,QAAQ,EAAE,CAAC;oBACb,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACxB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,CAAS;IAC7B,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,QAAgB;IAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACxE,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,+CAA+C;IAC/C,MAAM,MAAM,GAAG,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;IACpG,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC;AAC1D,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,sBAAsB,CACnC,WAAmB,EACnB,OAAqC;IAErC,MAAM,GAAG,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAExC,mCAAmC;IACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAE5B,iCAAiC;IACjC,IAAI,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,MAAM,iBAAiB,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxE,CAAC;QACD,uCAAuC;QACvC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,8CAA8C;IAC9C,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,8CAA8C;QAC9C,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc;YAAE,SAAS;QAE9C,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YACxD,OAAO,MAAM,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,oEAAoE;IACpE,MAAM,eAAe,GAAG,+CAA+C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClF,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,MAAM,iBAAiB,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAC9B,QAAgB,EAChB,QAAiC,EACjC,OAAqC;IAErC,MAAM,QAAQ,GAAa;QACzB,EAAE,EAAE,UAAU,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QACjE,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,QAAQ;KACpB,CAAC;IAEF,4BAA4B;IAC5B,OAAO,EAAE,CAAC;QACR,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,QAAQ;KACf,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE3C,yBAAyB;IACzB,OAAO,EAAE,CAAC;QACR,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO;QAC7C,MAAM;KACP,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,QAAQ;YACR,QAAQ;YACR,UAAU,EAAE,MAAM;YAClB,aAAa,EAAE,OAAO,QAAQ,sBAAsB,MAAM,CAAC,KAAK,wBAAwB;SACzF,CAAC;IACJ,CAAC;IAED,2CAA2C;IAC3C,MAAM,UAAU,GAAG,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE1D,OAAO;QACL,OAAO,EAAE,IAAI;QACb,QAAQ;QACR,QAAQ;QACR,UAAU,EAAE,MAAM;QAClB,aAAa,EAAE,QAAQ,QAAQ,gDAAgD,UAAU,EAAE;KAC5F,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,sBAAsB,CAAC,aAAqB,EAAE,WAAmB,IAAI;IAC5E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAEzC,qBAAqB;QACrB,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACpC,MAAM,OAAO,GAA4B;gBACvC,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB,CAAC;YAEF,oCAAoC;YACpC,IAAI,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAsC,EAAE,EAAE,CAAC,CAAC;oBACrF,IAAI,EAAE,EAAE,CAAC,IAAI;oBACb,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;iBAC9B,CAAC,CAAC,CAAC;YACN,CAAC;YAED,gDAAgD;YAChD,IAAI,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAqD,EAAE,EAAE;oBAC9F,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;oBACpB,MAAM,KAAK,GAA4B,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;oBAExD,oCAAoC;oBACpC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;wBACvC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;4BACpD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;wBACf,CAAC;6BAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;4BACnD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;wBACf,CAAC;wBACD,+CAA+C;oBACjD,CAAC;oBAED,kDAAkD;oBAClD,IAAI,KAAK,CAAC,OAAO,CAAE,CAAS,CAAC,OAAO,CAAC,EAAE,CAAC;wBACtC,MAAM,SAAS,GAAc,EAAE,CAAC;wBAChC,KAAK,MAAM,MAAM,IAAK,CAAS,CAAC,OAAO,EAAE,CAAC;4BACxC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;gCACzC,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;4BACtD,CAAC;wBACH,CAAC;wBACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACzB,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACxC,CAAC;oBACH,CAAC;oBAED,OAAO,KAAK,CAAC;gBACf,CAAC,CAAC,CAAC;YACL,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACjC,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAChD,OAAO,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAC/E,CAAC;QAED,4CAA4C;QAC5C,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACzE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/C,OAAO,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAC/E,CAAC;QAED,yBAAyB;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/E,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;QAC5C,OAAO,aAAa,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC;IACpG,CAAC;AACH,CAAC;AAED,oCAAoC;AAEpC,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAAmB,EACnB,OAAsB,EACtB,MAAoB,EACpB,MAAc,EACd,OAAqC,EACrC,cAAuB;IAEvB,0BAA0B;IAC1B,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAElE,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QAC3C,8EAA8E;QAC9E,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAEhC,MAAM,eAAe,GAAkB;YACrC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE;YAC/C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,aAAa,EAAE;SAChD,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY;QAEjE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1D,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAE5B,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,SAAS,EAAE,MAAM,CAAC,UAAU;gBAC1B,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,QAAS,EAAE,IAAI,EAAE,MAAM,CAAC,QAAS,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;gBACjF,CAAC,CAAC,EAAE;SACP,CAAC;IACJ,CAAC;IAED,+CAA+C;IAC/C,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,iBAAiB,CAAC,cAAc,CAAC,CAAC;IAEvD,MAAM,QAAQ,GAAkB;QAC9B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;QACzC,GAAG,OAAO;QACV,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE;KACvC,CAAC;IAEF,MAAM,eAAe,GAA6B,EAAE,CAAC;IACrD,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,aAAa,GAAG,EAAE,CAAC;IAEzB,OAAO,UAAU,GAAG,aAAa,EAAE,CAAC;QAClC,UAAU,EAAE,CAAC;QAEb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAEhC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAe,CAAC,CAAC;QAC9D,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAExB,+BAA+B;QAC/B,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;YAChC,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC;YAChC,MAAM;QACR,CAAC;QAED,qBAAqB;QACrB,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC1C,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,MAAM,EAAE,OAAO;gBACf,IAAI,EAAE,QAAQ,CAAC,SAAS;aACzB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;YAE3C,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO;gBAC7C,MAAM;aACP,CAAC,CAAC;YAEH,eAAe,CAAC,IAAI,CAAC;gBACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,IAAI,EAAE,QAAQ,CAAC,SAAS;gBACxB,MAAM;aACP,CAAC,CAAC;YAEH,8BAA8B;YAC9B,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE;gBACnE,UAAU,EAAE,QAAQ,CAAC,EAAE;aACxB,CAAC,CAAC;QACL,CAAC;QAED,8CAA8C;QAC9C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,UAAU,IAAI,aAAa,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAE5B,OAAO;QACL,OAAO,EAAE,YAAY;QACrB,SAAS,EAAE,eAAe;KAC3B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,oBAAoB,CACzC,WAAmB,EACnB,OAAsB,EACtB,MAAoB,EACpB,MAAc,EACd,WAAyB,EACzB,cAAuB;IAEvB,0BAA0B;IAC1B,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;QACjE,iEAAiE;QACjE,2EAA2E;IAC7E,CAAC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,6DAA6D;QAC7D,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM;gBACJ,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,MAAM,CAAC,QAAQ;gBACrB,MAAM,EAAE,OAAO;gBACf,IAAI,EAAE,MAAM,CAAC,QAAQ;aACtB,CAAC;YAEF,MAAM;gBACJ,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,MAAM,CAAC,QAAQ;gBACrB,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO;gBACzD,MAAM,EAAE,MAAM,CAAC,UAAU;aAC1B,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;gBACzB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;gBACtD,OAAO;YACT,CAAC;YAED,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;YAE3B,sEAAsE;YACtE,MAAM,eAAe,GAAkB;gBACrC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE;gBAC/C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,aAAa,EAAE;aAChD,CAAC;YAEF,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC,eAAe,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC;gBACrF,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;oBACzB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;oBACtD,OAAO;gBACT,CAAC;gBACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oBAC9C,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;gBACpD,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAClC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;oBAC5C,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,+CAA+C;IAC/C,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,iBAAiB,CAAC,cAAc,CAAC,CAAC;IAEvD,MAAM,QAAQ,GAAkB;QAC9B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;QACzC,GAAG,OAAO;QACV,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE;KACvC,CAAC;IAEF,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,aAAa,GAAG,EAAE,CAAC;IAEzB,OAAO,UAAU,GAAG,aAAa,EAAE,CAAC;QAClC,mBAAmB;QACnB,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;YACzB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;YACtD,OAAO;QACT,CAAC;QAED,UAAU,EAAE,CAAC;QAEb,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QAE3B,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,MAAM,gBAAgB,GAAe,EAAE,CAAC;QAExC,0DAA0D;QAC1D,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAe,EAAE,WAAW,CAAC,EAAE,CAAC;YACpF,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;gBACzB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;gBACtD,OAAO;YACT,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC9C,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC;gBAC7B,gEAAgE;YAClE,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACxD,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxC,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAClC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC5C,OAAO;YACT,CAAC;QACH,CAAC;QAED,yEAAyE;QACzE,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC;YACjD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QAClD,CAAC;aAAM,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,sCAAsC;YACtC,WAAW,GAAG,EAAE,CAAC;QACnB,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAElI,+BAA+B;QAC/B,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM;QACR,CAAC;QAED,qBAAqB;QACrB,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;YACxC,yCAAyC;YACzC,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;gBACzB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;gBACtD,OAAO;YACT,CAAC;YAED,MAAM;gBACJ,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,MAAM,EAAE,OAAO;gBACf,IAAI,EAAE,QAAQ,CAAC,SAAS;aACzB,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;YAE3C,wCAAwC;YACxC,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;gBACzB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;gBACtD,OAAO;YACT,CAAC;YAED,MAAM;gBACJ,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO;gBAC7C,MAAM;aACP,CAAC;YAEF,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE;gBACnE,UAAU,EAAE,QAAQ,CAAC,EAAE;aACxB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACzB,CAAC"}
@@ -5,7 +5,7 @@ const DEFAULT_CONFIG = {
5
5
  ollama: {
6
6
  baseUrl: "http://localhost:11434",
7
7
  model: "mistral:latest",
8
- contextLength: 8192,
8
+ contextLength: 4096,
9
9
  keepAlive: 1800, // 30 minutes
10
10
  },
11
11
  standards: {
@@ -1,5 +1,5 @@
1
1
  import { OllamaConfig } from "../config.js";
2
- import { Tool, ToolCall } from "../tools/types.js";
2
+ import type { Tool, ToolCall } from "../tools/types.js";
3
3
  export interface ChatMessage {
4
4
  role: "system" | "user" | "assistant" | "tool";
5
5
  content: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../src/core/llm/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAiBD,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,YAAY;IAO1B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS/B,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAO/B,IAAI,CACR,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,CAAC,EAAE,IAAI,EAAE,GACb,OAAO,CAAC,WAAW,CAAC;IAwChB,UAAU,CACf,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,CAAC,EAAE,IAAI,EAAE,EACd,WAAW,CAAC,EAAE,WAAW,GACxB,cAAc,CAAC,WAAW,CAAC;IAuG9B,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,aAAa;IAiBrB,QAAQ,IAAI,MAAM;IAIlB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKvB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAoBtD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAQvE"}
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../src/core/llm/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA4ED,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,YAAY;IAO1B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS/B,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAO/B,IAAI,CACR,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,CAAC,EAAE,IAAI,EAAE,GACb,OAAO,CAAC,WAAW,CAAC;IA4ChB,UAAU,CACf,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,CAAC,EAAE,IAAI,EAAE,EACd,WAAW,CAAC,EAAE,WAAW,GACxB,cAAc,CAAC,WAAW,CAAC;IA2G9B,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,aAAa;IAiBrB,QAAQ,IAAI,MAAM;IAIlB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKvB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAoBtD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAQvE"}
@@ -1,3 +1,52 @@
1
+ // Estimate token count for a string (rough: ~3 chars per token for mixed Korean/English)
2
+ function estimateTokens(text) {
3
+ if (!text)
4
+ return 0;
5
+ return Math.ceil(text.length / 3);
6
+ }
7
+ // Estimate tokens for tool definitions sent to Ollama
8
+ function estimateToolTokens(tools) {
9
+ let total = 0;
10
+ for (const tool of tools) {
11
+ // name + description + JSON schema overhead
12
+ total += estimateTokens(tool.name) + estimateTokens(tool.description) + 20;
13
+ if (tool.parameters?.properties) {
14
+ for (const [key, prop] of Object.entries(tool.parameters.properties)) {
15
+ total += estimateTokens(key) + estimateTokens(prop.description || "") + 10;
16
+ }
17
+ }
18
+ }
19
+ return total;
20
+ }
21
+ // Prune messages to fit within context window
22
+ function pruneMessages(messages, maxContextTokens, toolTokens) {
23
+ if (messages.length <= 2)
24
+ return messages;
25
+ const responseReserve = 1000; // reserve tokens for model response
26
+ const safetyBuffer = 200;
27
+ const budget = maxContextTokens - toolTokens - responseReserve - safetyBuffer;
28
+ // Always preserve: first message (system) and last message (user)
29
+ const systemMsg = messages[0];
30
+ const lastMsg = messages[messages.length - 1];
31
+ const history = messages.slice(1, -1);
32
+ let usedTokens = estimateTokens(systemMsg.content) + estimateTokens(lastMsg.content);
33
+ // If even system + last message exceeds budget, truncate system prompt
34
+ if (usedTokens > budget) {
35
+ const maxSystemChars = Math.max(200, (budget - estimateTokens(lastMsg.content)) * 3);
36
+ systemMsg.content = systemMsg.content.slice(0, maxSystemChars);
37
+ return [systemMsg, lastMsg];
38
+ }
39
+ // Add messages from newest to oldest
40
+ const kept = [];
41
+ for (let i = history.length - 1; i >= 0; i--) {
42
+ const msgTokens = estimateTokens(history[i].content) + 4; // 4 tokens overhead per message
43
+ if (usedTokens + msgTokens > budget)
44
+ break;
45
+ kept.unshift(history[i]);
46
+ usedTokens += msgTokens;
47
+ }
48
+ return [systemMsg, ...kept, lastMsg];
49
+ }
1
50
  export class OllamaClient {
2
51
  baseUrl;
3
52
  model;
@@ -26,7 +75,10 @@ export class OllamaClient {
26
75
  return data.models.map((m) => m.name);
27
76
  }
28
77
  async chat(messages, tools) {
29
- const ollamaMessages = this.convertMessages(messages);
78
+ let ollamaMessages = this.convertMessages(messages);
79
+ // Prune messages to fit within context window
80
+ const toolTokens = tools?.length ? estimateToolTokens(tools) : 0;
81
+ ollamaMessages = pruneMessages(ollamaMessages, this.contextLength, toolTokens);
30
82
  const body = {
31
83
  model: this.model,
32
84
  messages: ollamaMessages,
@@ -60,7 +112,10 @@ export class OllamaClient {
60
112
  return this.parseResponse(data);
61
113
  }
62
114
  async *streamChat(messages, tools, abortSignal) {
63
- const ollamaMessages = this.convertMessages(messages);
115
+ let ollamaMessages = this.convertMessages(messages);
116
+ // Prune messages to fit within context window
117
+ const toolTokens = tools?.length ? estimateToolTokens(tools) : 0;
118
+ ollamaMessages = pruneMessages(ollamaMessages, this.contextLength, toolTokens);
64
119
  // Use non-streaming mode when tools are provided to avoid hallucination
65
120
  // (LLM often outputs fake results before tool calls in streaming mode)
66
121
  const useStreaming = !tools?.length;