From 89b90a80fbadd1a3a566e6979b3e633191f9c86e Mon Sep 17 00:00:00 2001 From: Mikhail Gorshkov Date: Fri, 18 Sep 2026 15:26:59 +0300 Subject: [PATCH] Agent harness added --- .vscodeignore | 1 + CMakeLists.txt | 2 +- README.md | 95 +++-- media/tinycoder.jpg | Bin 0 -> 92669 bytes package.json | 109 ++++- plans/tinycoder_plan.md | 3 +- src/ts/agent/agentLoop.ts | 196 +++++++++ src/ts/agent/chatTemplate.ts | 64 +++ src/ts/agent/compaction.ts | 115 +++++ src/ts/agent/config.ts | 109 +++++ src/ts/agent/inference.ts | 93 +++++ src/ts/agent/optionsPanel.ts | 402 ++++++++++++++++++ src/ts/agent/prompt.ts | 101 +++++ src/ts/agent/runner.ts | 93 +++++ src/ts/agent/tools.ts | 596 ++++++++++++++++++++++++++ src/ts/agent/types.ts | 157 +++++++ src/ts/extension.ts | 130 +++++- src/ts/panel.ts | 484 ++++++++++++++++++++- tests/agentLoop.test.js | 119 ++++++ tests/agentSmoke.test.js | 155 +++++++ www/index.html | 790 +++++++++++++++++++++++++++++++++++ www/media/icon.png | Bin 0 -> 14293 bytes www/media/icon.svg | 20 + www/media/tinycoder.jpg | Bin 0 -> 92669 bytes 24 files changed, 3768 insertions(+), 66 deletions(-) create mode 100644 media/tinycoder.jpg create mode 100644 src/ts/agent/agentLoop.ts create mode 100644 src/ts/agent/chatTemplate.ts create mode 100644 src/ts/agent/compaction.ts create mode 100644 src/ts/agent/config.ts create mode 100644 src/ts/agent/inference.ts create mode 100644 src/ts/agent/optionsPanel.ts create mode 100644 src/ts/agent/prompt.ts create mode 100644 src/ts/agent/runner.ts create mode 100644 src/ts/agent/tools.ts create mode 100644 src/ts/agent/types.ts create mode 100644 tests/agentLoop.test.js create mode 100644 tests/agentSmoke.test.js create mode 100644 www/index.html create mode 100644 www/media/icon.png create mode 100644 www/media/icon.svg create mode 100644 www/media/tinycoder.jpg diff --git a/.vscodeignore b/.vscodeignore index e4ef582..221555b 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -8,6 +8,7 @@ tsconfig.json **/*.cpp **/*.hpp **/CMakeLists.txt +tests/** build/** !build/Release/*.node !.vscode/launch.json diff --git a/CMakeLists.txt b/CMakeLists.txt index 8579ffc..76597ae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ cmake_minimum_required(VERSION 3.18.0) # (https://github.com/mgorshkov/tinycoder-inference) and is consumed here via # FetchContent as the tinycoder_core static library. This tree keeps only the # N-API bridge (src/cpp/bridge) and the TypeScript extension sources. -project(tinycoder VERSION 0.4.0 DESCRIPTION "High-Performant Local AI coding agent" LANGUAGES CXX) +project(tinycoder VERSION 0.5.0 DESCRIPTION "High-Performant Local AI coding agent" LANGUAGES CXX) enable_testing() # ---- Options ---- diff --git a/README.md b/README.md index abb3805..a97aedd 100644 --- a/README.md +++ b/README.md @@ -119,56 +119,65 @@ All weights are stored in their **native quantized format** in memory and dequan - **Generate code** — generate from comments/descriptions - **Streaming output** — see tokens as they're generated - **Status bar** — model status indicator with periodic updates +- **Autonomous coding agent** — ReAct (Reasoning + Acting) harness that reads/writes + files, runs terminal commands and searches the codebase through structured + JSON tool calls (`TinyCoder: Run Agent`) + +## Getting a Model + +TinyCoder loads **GGUF v3** files from the model families below. Every model in the +table has been load-verified and benchmarked on the project's reference hardware +(i7-4790K + RTX 2080 Ti 11 GB); "GPU mode" is what the engine automatically +selects on that card. + +| Model | Quantization | Size (approx) | GPU mode on 11 GB | Notes | +|-------|-------------|---------------|-------------------|-------| +| `Qwen2.5-Coder-1.5B` | Q2_K | ~0.7 GB | full offload | Lightweight coding, 132 tg tok/s | +| `Qwen2.5-Coder-1.5B` | IQ3_XXS (imat) | ~0.6 GB | full offload | Recommended balanced | +| `Qwen2.5-Coder-7B` | IQ2_S | ~2.4 GB | full offload | Ultra-compact 7B | +| `Qwen2.5-Coder-7B` | IQ3_XXS (imat) | ~2.9 GB | full offload | Recommended 7B | +| `Gemma 4 (26B-A4B)` | Q4_K_XL (qat-UD) | ~14 GB | full offload (fits) | Instruction-tuned MoE | +| `Qwen3.6-35B-A3B` | UD-IQ1_M | ~9.4 GB | full offload | Ultra-compact 35B MoE, 13 tg tok/s | +| `Qwen3.6-35B-A3B` | UD-IQ2_M | ~10.7 GB | hybrid (experts CPU) | Ultra-compact MoE | +| `Qwen3.6-35B-A3B` | UD-Q4_K_M | ~20.6 GB | hybrid (experts CPU) | **9.7 tg tok/s decode — recommended** | +| `Qwen3.6-27B` | UD-Q4_K_XL | ~16.7 GB | partial offload (34/65) | Dense qwen35 | +| `Qwen3.8-27B` | UD-Q4_K_M | ~15.3 GB | partial offload (37/65) | Dense qwen35 with IQ4_NL/Q8_K kernels | +| `Ornith-1.5-35B-A3B` | Q8_0 | ~34.4 GB | hybrid (experts CPU) | Full-precision MoE | +| `Ornith-1.5-35B` | Q4_K_M | ~20.2 GB | hybrid (experts CPU) | 41-layer qwen35moe variant | + +Download a `.gguf` file and point TinyCoder at it: +- **In VS Code**: set `tinycoder.modelPath` in settings, or use + *TinyCoder: Open Agent Options* → Model → Browse, then *Load Model*. +- **CLI / API**: set `TINYCODER_MODEL_PATH` or pass the path to `Model::load()`. + +> The Gemma 4 *coding* files (`gemma4-coding-*`) hit a loader gap ("missing attention +> weights for layer 5" — the file names its attention tensors differently), and the +> `gemma-2-*` files use the `gemma2` architecture, which is not yet supported; both +> print a clear load error rather than producing wrong output. ## Project Structure ``` tinycoder/ -├── include/ # C++ headers -│ ├── ModelConfig.hpp # Model & inference configuration -│ ├── GGUFLoader.hpp # GGUF v3 file format loader -│ ├── GGMLDequantize.hpp # Multi-type dequantization (Q5_K, IQ3_XXS, etc.) -│ ├── IQ3XXS.hpp # Legacy IQ3_XXS block-level dequantization -│ ├── LMHead.hpp # LM head computation (CPU OpenMP path) -│ ├── LMHeadCUDA.hpp # LM head CUDA (cublasSgemv) interface -│ ├── Model.hpp # Transformer model (forward, generate, KV cache) -│ ├── SIMDMatMulVec.hpp # SIMD-accelerated dot product & accumulate -│ └── Tokenizer.hpp # BPE tokenizer (Qwen2.5) +├── CMakeLists.txt # Builds the N-API addon; fetches tinycoder-inference ├── src/ -│ ├── cpp/ # C++ source -│ │ ├── core/ # Engine core (compiled once into tinycoder_core) -│ │ │ ├── ChatTemplateRenderer.cpp # Chat template formatting -│ │ │ ├── GGUFLoader.cpp # GGUF v3 reader (metadata + tensor data) -│ │ │ ├── GridTables.cpp # IQ2_S grid lookup table (1024 entries) -│ │ │ ├── GridTablesIQ3S.cpp # IQ3_S grid lookup table (512 entries) -│ │ │ ├── Model.cpp # Transformer model (forward, generate) -│ │ │ ├── ModelDebug.cpp # Debug helpers for the model -│ │ │ ├── ModelForward.cpp # Forward pass implementation -│ │ │ ├── ModelForwardDebug.cpp # Forward pass debug helpers -│ │ │ ├── ModelGeneration.cpp # Generation loop -│ │ │ ├── ModelInternal.cpp # Internal model helpers -│ │ │ ├── ModelLoad.cpp # Model loading & weight prep -│ │ │ ├── ModelMoE.cpp # Mixture-of-Experts layers -│ │ │ ├── ModelPrimitives.cpp # Core primitives -│ │ │ ├── ModelSampling.cpp # Token sampling -│ │ │ ├── QuantizedEmbedding.cpp # Quantized token embedding dequantization -│ │ │ ├── QuantizedMatrix.cpp # Quantized matrix-vector multiply (CUDA/CPU) -│ │ │ ├── SIMDMatMulVec.cpp # SIMD dispatch (AVX2/AVX-512/scalar) -│ │ │ ├── SIMDMatMulVecAVX2.cpp # AVX2 SIMD kernels -│ │ │ ├── SIMDMatMulVecAVX512.cpp # AVX-512 SIMD kernels -│ │ │ ├── ThreadPool.cpp # Thread pool for parallel loops -│ │ │ ├── Tokenizer.cpp # BPE tokenizer (GGUF embedded + file loading) -│ │ │ └── LMHeadCUDA.cu # CUDA LM head (cublasSgemv) -│ │ └── bridge/ # N-API native addon (load, generate, status) -│ │ └── Bridge.cpp +│ ├── cpp/bridge/ # N-API native addon (load, generate, status) +│ │ └── Bridge.cpp │ └── ts/ # TypeScript source │ ├── extension.ts # VS Code extension entry (commands, status bar) │ ├── panel.ts # WebView chat panel (standalone + sidebar) -│ └── nativeBridge.ts # Native addon wrapper (async load/generate) -├── unit_tests/ # Unit tests -│ ├── CMakeLists.txt # Test build config -│ └── ModelTest.cpp # Model loading & inference tests -├── CMakeLists.txt # CMake build (with np fetch, N-API, CUDA) +│ ├── nativeBridge.ts # Native addon wrapper (async load/generate) +│ └── agent/ # Autonomous agent harness (ReAct) +│ ├── agentLoop.ts # Core ReAct loop engine +│ ├── tools.ts # Tool JSON schemas + VS Code tool executors +│ ├── prompt.ts # System prompt + tool protocol builder +│ ├── chatTemplate.ts # Conversation → prompt renderer +│ ├── inference.ts # callAPInference abstraction (swappable backend) +│ ├── compaction.ts # Token pruning / history compaction +│ ├── config.ts # Agent config (settings loader/saver) +│ ├── runner.ts # Shared "run agent" helper (model ensure + loop) +│ └── optionsPanel.ts # Agent options webview +├── tests/ # Pure Node smoke/integration tests (test:agent) ├── package.json # VS Code extension manifest ├── tsconfig.json # TypeScript configuration ├── scripts/ @@ -177,9 +186,7 @@ tinycoder/ ├── media/ │ ├── icon.png # Extension icon │ └── icon.svg # Extension icon (vector) -└── .vscode/ - ├── launch.json # Debug configurations - └── tasks.json # Build tasks +└── plans/ # Design documents ``` ## Dependencies diff --git a/media/tinycoder.jpg b/media/tinycoder.jpg new file mode 100644 index 0000000000000000000000000000000000000000..74181498af841bdd685f938add58c0e4bbb35b44 GIT binary patch literal 92669 zcmd?QcUV(f^C-L%iPEGQqDU1*0|XF|-VsoW5SoM{J)qJA1nEQ+>7aBhbOfY@Ac9l{ z0U;nwnl$Mh1VRV7JD&49?|JY2?jPTu-}9~H+3dZt_NFF5HoP#qmon@k< zXJ%tQ%fiCS%E|y|=VU+6dG0*xc`^_P1q^l)c9QngDcbXl^o-~KU$^51fRU17mSXk< zgd2b|LQXJ3j=unGAgTcL1bF$UL7*pKCr?pOg1@qo=>UKI=QjX=Kq<&SAO8So!G0*i z2?nt5@b|w){D1BC)R2AiY(Sl#&)8~H$fZe%BQJX~agF9_;S^e9{gZB`wil7=$xY9j zUJKg_zdHHh0eJiJs;#iyRjiiab*h)8cEYxi;K2KzpEuhHr$n+u+SwqkpZsdsan9@+ zZC_-^xm!<6g`bFl&!TTXe6?ℜgX;35T2tq7`RNJ)JP-HM8;@Y<0RVivI`i=nIl( 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

Cz*txLmuf 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

D|Ajq5&J;Eb5WX=B{)dzly&s+T_s^lE>9R`{f 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[\s\S]*?<\/thinking>/gi, '') + .replace(/[\s\S]*?<\/reasoning>/gi, '') + .replace(new RegExp(fence + '\\s*json', 'gi'), '') + .split(fence).join('') + .replace(/^\s*\d+\.\s*/gm, ''); +} + +/** + * Extract a tool-call from the model's raw output. + * + * The model is instructed to emit exactly one JSON object: + * {"tool_call":{"name":"readFile","arguments":{...}}} + * We search for that shape; if absent we return null (final answer). + */ +export function parseToolCall(rawInput: string): ToolCall | null { + const raw = normalizeRawOutput(rawInput); + // Try the explicit wrapper first. + const wrapper = raw.match(TOOL_CALL_RE); + if (wrapper && wrapper[1]) { + try { + const inner = JSON.parse(wrapper[1]); + if (inner && typeof inner.name === 'string' && inner.arguments && typeof inner.arguments === 'object') { + return { + id: makeToolCallId(), + name: inner.name as ToolName, + arguments: inner.arguments as Record, + raw: wrapper[0] + }; + } + } catch { + // fall through + } + } + + // Fallback: bare JSON object with name+arguments anywhere in the output. + const bare = raw.match(/\{\s*"name"\s*:\s*"([^"]+)"\s*,\s*"arguments"\s*:\s*(\{[\s\S]*?\})\s*\}/); + if (bare) { + try { + const args = JSON.parse(bare[2]); + return { + id: makeToolCallId(), + name: bare[1] as ToolName, + arguments: args as Record, + raw: bare[0] + }; + } catch { + return null; + } + } + return null; +} + +/** + * Run the ReAct loop for a single user prompt. + * + * @param userPrompt The user's request. + * @param config Fully-resolved agent configuration. + * @param onEvent Optional observer for UI progress (iteration, text, etc.). + * @param signal Optional abort/cancel token. + * @returns The final assistant answer text (already delivered via events too). + */ +export async function runAgentLoop( + userPrompt: string, + config: AgentConfig, + onEvent?: (event: AgentEvent) => void, + signal?: LoopAbortSignal +): Promise { + const emit = (e: AgentEvent) => { + try { + onEvent?.(e); + } catch { + // observers must not break the loop + } + }; + + const systemPrompt = buildSystemPrompt(config); + let history: Message[] = [ + { role: 'user', content: userPrompt } + ]; + + let finalAnswer = ''; + + for (let iteration = 0; iteration < config.maxIterations; iteration++) { + if (signal?.aborted) { + emit({ type: 'error', message: 'Loop aborted by user' }); + return 'Loop aborted.'; + } + + emit({ type: 'iteration', iteration: iteration + 1, maxIterations: config.maxIterations }); + + // 1. Send the payload to inference. + const prompt = renderPrompt(systemPrompt, history); + let output: string; + try { + const result = await callAPInference(prompt, config); + output = result.text; + } catch (err: any) { + const msg = `Inference error: ${err?.message || err}`; + emit({ type: 'error', message: msg }); + return `Error: ${msg}`; + } + + // 2. Append the assistant message (with the raw output). + const assistantMsg: Message = { role: 'assistant', content: output }; + history.push(assistantMsg); + + // 3. Parse a tool call. + const call = parseToolCall(output); + if (!call) { + // Final answer reached. + finalAnswer = output.trim(); + assistantMsg.content = finalAnswer; + emit({ type: 'assistantText', text: finalAnswer }); + emit({ type: 'final', text: finalAnswer }); + return finalAnswer; + } + + emit({ type: 'toolCall', call }); + assistantMsg.toolCalls = [call]; + + // 4. Execute the tool. + const result: ToolCallResult = await executeTool(config, call); + emit({ type: 'toolResult', result }); + + // 5. Append the raw result back to history. + const toolMsg: Message = { + role: 'tool', + content: result.ok ? result.output : `ERROR\n${result.output}`, + toolCallId: call.id, + toolName: call.name, + toolResult: result + }; + history.push(toolMsg); + + // 6. Context management: clamp oversized outputs, compact when deep. + history = clampToolResultSize(history); + if (history.length > config.compactionThreshold) { + const { messages, removed } = compactConversation(history, config); + if (removed > 0) { + emit({ type: 'compaction', removed, remaining: messages.length }); + history = messages; + } + } + } + + // The model never produced a final answer within budget. + finalAnswer = + 'Reached maximum loop iterations without a final answer. ' + + 'The last tool results are above; please refine the request or raise maxIterations.'; + emit({ type: 'final', text: finalAnswer }); + return finalAnswer; +} diff --git a/src/ts/agent/chatTemplate.ts b/src/ts/agent/chatTemplate.ts new file mode 100644 index 0000000..24bb24d --- /dev/null +++ b/src/ts/agent/chatTemplate.ts @@ -0,0 +1,64 @@ +/* +⚡ TinyCoder AI - Agent Harness Chat Template + +Copyright (c) 2026 Mikhail Gorshkov (mikhail.gorshkov@gmail.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +/** + * Prompt assembly for the agent harness. + * + * The tinycoder-inference library accepts a raw prompt string and renders the + * chat template internally (Jinja from GGUF metadata) — it is *not* + * message-list aware. The harness therefore flattens the conversation into a + * JSON message array embedded in the prompt, and instructs the model to reply + * with either a final answer or a JSON tool-call block that the loop parses + * from the raw output. + */ + +import { Message } from './types'; + +/** + * Serialize a Message[] into the JSON `[{"role":...,"content":...}, ...]` + * payload that the model sees inside the conversation section. + */ +export function serializeMessages(messages: Message[]): string { + return JSON.stringify( + messages.map((m) => { + const obj: Record = { role: m.role, content: m.content }; + if (m.toolCallId) obj.toolCallId = m.toolCallId; + if (m.toolName) obj.toolName = m.toolName; + if (m.toolCalls) obj.toolCalls = m.toolCalls; + if (m.truncated) obj.truncated = true; + return obj; + }) + ); +} + +/** + * Join the base system prompt with the conversation history to build the + * single raw prompt string that is sent to the inference library. + */ +export function renderPrompt(systemPrompt: string, messages: Message[]): string { + if (messages.length === 0) { + return systemPrompt; + } + return `${systemPrompt}\n\n=== CONVERSATION (JSON messages array) ===\n${serializeMessages(messages)}`; +} diff --git a/src/ts/agent/compaction.ts b/src/ts/agent/compaction.ts new file mode 100644 index 0000000..7e8cffa --- /dev/null +++ b/src/ts/agent/compaction.ts @@ -0,0 +1,115 @@ +/* +⚡ TinyCoder AI - Agent Harness Compaction + +Copyright (c) 2026 Mikhail Gorshkov (mikhail.gorshkov@gmail.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +import { AgentConfig, Message } from './types'; + +/** + * Context management for the ReAct loop. + * + * Long agent runs explode the token count (each tool result is raw terminal + * or file output). Rather than truncating blindly, we keep the system prompt + * and the latest N messages verbatim, drop the *raw* tool outputs of older + * steps, and collapse old assistant tool-call turns into one-line markers so + * the original file-edit intent stays in the conversation. + */ + +const MAX_SINGLE_TOOL_OUTPUT_CHARS = 4_000; + +/** Cap the size of a single stored tool result (defense against big dumps). */ +export function clampToolResultSize(messages: Message[]): Message[] { + return messages.map((m) => { + if (m.role !== 'tool' || !m.toolResult) { + return m; + } + const out = m.toolResult.output; + if (out.length <= MAX_SINGLE_TOOL_OUTPUT_CHARS) { + return m; + } + return { + ...m, + content: `${out.slice(0, MAX_SINGLE_TOOL_OUTPUT_CHARS)}\n... [truncated ${out.length - MAX_SINGLE_TOOL_OUTPUT_CHARS} chars]`, + truncated: true, + toolResult: { + ...m.toolResult, + output: `${out.slice(0, MAX_SINGLE_TOOL_OUTPUT_CHARS)}... [truncated]` + } + }; + }); +} + +/** + * Compact the conversation once it grows past `config.compactionThreshold` + * messages. Returns the trimmed array plus the number of messages removed. + * + * The keep-alive window is `config.compactionPreserveRecent`; everything older + * has its raw tool outputs dropped and assistant tool calls collapsed into a + * one-line marker, so the array shrinks and the token count drops while the + * original edits' intent stays in the conversation. + */ +export function compactConversation( + messages: Message[], + config: AgentConfig +): { messages: Message[]; removed: number } { + const threshold = Math.max(4, config.compactionThreshold); + const preserve = Math.max(2, config.compactionPreserveRecent); + + if (messages.length <= threshold) { + return { messages, removed: 0 }; + } + + // Walk the keep-window start backward so a `tool` result message is never + // separated from the `assistant` tool-call message that requested it. + let keepStart = messages.length - preserve; + while (keepStart > 0 && messages[keepStart].role === 'tool') { + keepStart--; + } + + const older = messages.slice(0, keepStart); + const recent = messages.slice(keepStart); + + // Drop old tool output messages entirely; collapse old assistant tool-call + // turns into a single marker; keep user messages verbatim. + let removed = 0; + const collapsedOld: Message[] = []; + for (const m of older) { + if (m.role === 'tool') { + removed++; + continue; + } + if (m.role === 'assistant' && m.toolCalls && m.toolCalls.length > 0) { + collapsedOld.push({ + ...m, + toolCalls: undefined, + content: `[planned tool calls: ${m.toolCalls.map((c) => c.name).join(', ')}]` + }); + continue; + } + collapsedOld.push(m); + } + + return { + messages: [...collapsedOld, ...recent], + removed + }; +} diff --git a/src/ts/agent/config.ts b/src/ts/agent/config.ts new file mode 100644 index 0000000..05af175 --- /dev/null +++ b/src/ts/agent/config.ts @@ -0,0 +1,109 @@ +/* +⚡ TinyCoder AI - Agent Harness Config + +Copyright (c) 2026 Mikhail Gorshkov (mikhail.gorshkov@gmail.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +import * as vscode from 'vscode'; +import * as path from 'path'; +import { AgentConfig } from './types'; + +/** + * Load and normalize the agent configuration from VS Code settings. + * Falls back to the first workspace folder for the workspace root when the + * setting is empty. + */ +export function loadAgentConfig(): AgentConfig { + const cfg = vscode.workspace.getConfiguration('tinycoder'); + + // Model path + const modelPath = cfg.get('modelPath', ''); + const workspaceFolders = vscode.workspace.workspaceFolders; + const defaultRoot = workspaceFolders && workspaceFolders.length > 0 + ? workspaceFolders[0].uri.fsPath + : ''; + const workspaceRoot = cfg.get('agent.workspaceRoot', '') || defaultRoot; + + // Tool toggles + const toolToggles = { + readFile: cfg.get('agent.enableReadFile', true), + writeFile: cfg.get('agent.enableWriteFile', true), + patchFile: cfg.get('agent.enablePatchFile', true), + terminal: cfg.get('agent.enableTerminal', true), + search: cfg.get('agent.enableSearch', true) + }; + + const terminalMode = cfg.get<'vscode' | 'child' | 'auto'>('agent.terminalMode', 'auto'); + const inference = { + maxTokens: cfg.get('maxTokens', 2048), + temperature: cfg.get('temperature', 0.7), + topP: cfg.get('topP', 0.9), + topK: cfg.get('topK', 40), + repeatPenalty: cfg.get('repeatPenalty', 1.1), + repeatLastN: cfg.get('repeatLastN', 64), + maxSeqLen: cfg.get('maxSeqLen', 8192), + nThreads: cfg.get('nThreads', 0) + }; + + return { + modelPath, + workspaceRoot: path.normalize(workspaceRoot || ''), + terminalName: cfg.get('agent.terminalName', 'TinyCoder Agent'), + terminalMode, + maxIterations: cfg.get('agent.maxIterations', 8), + compactionThreshold: cfg.get('agent.compactionThreshold', 24), + compactionPreserveRecent: cfg.get('agent.compactionPreserveRecent', 8), + toolToggles, + systemPromptOverride: cfg.get('agent.systemPrompt', ''), + inference + }; +} + +/** Persist a partial config back to VS Code settings. */ +export async function saveAgentConfig(config: AgentConfig): Promise { + const cfg = vscode.workspace.getConfiguration('tinycoder'); + const updates: Array<[string, unknown]> = [ + ['modelPath', config.modelPath], + ['agent.workspaceRoot', config.workspaceRoot], + ['agent.terminalName', config.terminalName], + ['agent.terminalMode', config.terminalMode], + ['agent.maxIterations', config.maxIterations], + ['agent.compactionThreshold', config.compactionThreshold], + ['agent.compactionPreserveRecent', config.compactionPreserveRecent], + ['agent.systemPrompt', config.systemPromptOverride || ''], + ['agent.enableReadFile', config.toolToggles.readFile], + ['agent.enableWriteFile', config.toolToggles.writeFile], + ['agent.enablePatchFile', config.toolToggles.patchFile], + ['agent.enableTerminal', config.toolToggles.terminal], + ['agent.enableSearch', config.toolToggles.search], + ['maxTokens', config.inference.maxTokens], + ['temperature', config.inference.temperature], + ['topP', config.inference.topP], + ['topK', config.inference.topK], + ['repeatPenalty', config.inference.repeatPenalty], + ['repeatLastN', config.inference.repeatLastN], + ['maxSeqLen', config.inference.maxSeqLen], + ['nThreads', config.inference.nThreads] + ]; + for (const [key, value] of updates) { + await cfg.update(key, value, vscode.ConfigurationTarget.Global); + } +} diff --git a/src/ts/agent/inference.ts b/src/ts/agent/inference.ts new file mode 100644 index 0000000..5072c7a --- /dev/null +++ b/src/ts/agent/inference.ts @@ -0,0 +1,93 @@ +/* +⚡ TinyCoder AI - Agent Harness Inference Adapter + +Copyright (c) 2026 Mikhail Gorshkov (mikhail.gorshkov@gmail.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +/** + * Inference adapter. + * + * This is the only place that knows about the local C++ inference engine + * (nativeBridge's `generate`, which wraps tinycoder-inference). The ReAct + * loop calls {@link callAPInference} with a fully-rendered prompt string and + * receives plain text + token count. To swap in a different backend (HTTP, + * ollama, ...) implement the same signature and register it. + */ + +import { runInference, InferenceParams } from '../nativeBridge'; +import { AgentConfig, InferenceConfig, InferenceResult } from './types'; + +// Lazy registration slot so tests / alternate backends can replace the +// default native-bridge implementation. +let inferenceImpl: APInferenceFn | undefined; + +/** Signature every inference backend must satisfy. */ +export type APInferenceFn = ( + prompt: string, + config: AgentConfig +) => Promise; + +/** Register a custom inference implementation (e.g. HTTP endpoint). */ +export function registerAPInference(impl: APInferenceFn): void { + inferenceImpl = impl; +} + +/** Convert the agent's inference settings into nativeBridge InferenceParams. */ +export function toBridgeParams(cfg: InferenceConfig): InferenceParams { + const params: InferenceParams = { + maxTokens: cfg.maxTokens, + temperature: cfg.temperature, + topP: cfg.topP, + topK: cfg.topK, + repeatPenalty: cfg.repeatPenalty, + repeatLastN: cfg.repeatLastN + }; + if (cfg.seed !== undefined && cfg.seed > 0) { + params.seed = cfg.seed; + } + return params; +} + +/** + * Default implementation that talks to the local tinycoder-inference engine + * through nativeBridge. + */ +export async function callNativeInference( + prompt: string, + config: AgentConfig +): Promise { + const result = await runInference(prompt, toBridgeParams(config.inference)); + return { text: result.text, tokenCount: result.tokenCount }; +} + +/** + * The abstraction the ReAct loop uses. Falls back to the native bridge when + * no custom backend is registered. + */ +export async function callAPInference( + prompt: string, + config: AgentConfig +): Promise { + if (inferenceImpl) { + return inferenceImpl(prompt, config); + } + return callNativeInference(prompt, config); +} diff --git a/src/ts/agent/optionsPanel.ts b/src/ts/agent/optionsPanel.ts new file mode 100644 index 0000000..130355d --- /dev/null +++ b/src/ts/agent/optionsPanel.ts @@ -0,0 +1,402 @@ +/* +⚡ TinyCoder AI - Agent Harness Options Panel + +Copyright (c) 2026 Mikhail Gorshkov (mikhail.gorshkov@gmail.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +import * as vscode from 'vscode'; +import { AgentConfig } from './types'; +import { loadAgentConfig, saveAgentConfig } from './config'; + +/** + * Options/settings panel for the agent harness. + * + * Edits the same VS Code settings the config loader reads, so changes + * persist across sessions. Reads the current config on open and posts it + * to the webview; accepts `save` messages back. + */ +export class AgentOptionsPanel { + private readonly panel: vscode.WebviewPanel; + private readonly disposables: vscode.Disposable[] = []; + + constructor(private readonly context: vscode.ExtensionContext) { + this.panel = vscode.window.createWebviewPanel( + 'tinycoder.agentOptions', + 'TinyCoder Agent Options', + vscode.ViewColumn.Beside, + { + enableScripts: true, + retainContextWhenHidden: true + } + ); + this.panel.webview.html = this.renderHtml(); + this.panel.onDidDispose(() => this.dispose(), null, this.disposables); + this.panel.webview.onDidReceiveMessage( + (msg) => this.handleMessage(msg), + null, + this.disposables + ); + } + + /** + * Bring the panel to the front (reuse instead of creating a new one). + */ + reveal(): void { + this.panel.reveal(vscode.ViewColumn.Beside, true); + } + + public dispose(): void { + for (const d of this.disposables) { + d.dispose(); + } + this.disposables.length = 0; + } + + private async handleMessage(msg: any): Promise { + switch (msg?.type) { + case 'ready': + this.postConfig(); + break; + case 'save': + await this.handleSave(msg.config); + break; + case 'browseModel': + await this.handleBrowseModel(); + break; + case 'browseWorkspace': + await this.handleBrowseWorkspace(); + break; + } + } + + private postConfig(): void { + const config = loadAgentConfig(); + this.panel.webview.postMessage({ type: 'config', config }); + } + + private async handleSave(cfg: any): Promise { + try { + const current = loadAgentConfig(); + const next: AgentConfig = { + ...current, + modelPath: typeof cfg?.modelPath === 'string' ? cfg.modelPath : current.modelPath, + workspaceRoot: typeof cfg?.workspaceRoot === 'string' ? cfg.workspaceRoot : current.workspaceRoot, + terminalName: typeof cfg?.terminalName === 'string' ? cfg.terminalName : current.terminalName, + terminalMode: cfg?.terminalMode === 'vscode' || cfg?.terminalMode === 'child' || cfg?.terminalMode === 'auto' + ? cfg.terminalMode + : current.terminalMode, + maxIterations: typeof cfg?.maxIterations === 'number' ? cfg.maxIterations : current.maxIterations, + compactionThreshold: typeof cfg?.compactionThreshold === 'number' ? cfg.compactionThreshold : current.compactionThreshold, + compactionPreserveRecent: typeof cfg?.compactionPreserveRecent === 'number' ? cfg.compactionPreserveRecent : current.compactionPreserveRecent, + toolToggles: { + readFile: typeof cfg?.toolToggles?.readFile === 'boolean' ? cfg.toolToggles.readFile : current.toolToggles.readFile, + writeFile: typeof cfg?.toolToggles?.writeFile === 'boolean' ? cfg.toolToggles.writeFile : current.toolToggles.writeFile, + patchFile: typeof cfg?.toolToggles?.patchFile === 'boolean' ? cfg.toolToggles.patchFile : current.toolToggles.patchFile, + terminal: typeof cfg?.toolToggles?.terminal === 'boolean' ? cfg.toolToggles.terminal : current.toolToggles.terminal, + search: typeof cfg?.toolToggles?.search === 'boolean' ? cfg.toolToggles.search : current.toolToggles.search + }, + inference: { + ...current.inference, + maxTokens: typeof cfg?.inference?.maxTokens === 'number' ? cfg.inference.maxTokens : current.inference.maxTokens, + temperature: typeof cfg?.inference?.temperature === 'number' ? cfg.inference.temperature : current.inference.temperature, + topP: typeof cfg?.inference?.topP === 'number' ? cfg.inference.topP : current.inference.topP, + topK: typeof cfg?.inference?.topK === 'number' ? cfg.inference.topK : current.inference.topK, + repeatPenalty: typeof cfg?.inference?.repeatPenalty === 'number' ? cfg.inference.repeatPenalty : current.inference.repeatPenalty, + repeatLastN: typeof cfg?.inference?.repeatLastN === 'number' ? cfg.inference.repeatLastN : current.inference.repeatLastN, + maxSeqLen: typeof cfg?.inference?.maxSeqLen === 'number' ? cfg.inference.maxSeqLen : current.inference.maxSeqLen, + nThreads: typeof cfg?.inference?.nThreads === 'number' ? cfg.inference.nThreads : current.inference.nThreads + } + }; + await saveAgentConfig(next); + vscode.window.showInformationMessage('TinyCoder agent options saved.'); + } catch (err: any) { + vscode.window.showErrorMessage(`Failed to save options: ${err?.message || err}`); + } + } + + private async handleBrowseModel(): Promise { + const picked = await vscode.window.showOpenDialog({ + canSelectMany: false, + openLabel: 'Select GGUF Model', + filters: { 'GGUF Models': ['gguf'], 'All Files': ['*'] } + }); + if (picked && picked[0]) { + this.panel.webview.postMessage({ type: 'modelPicked', path: picked[0].fsPath }); + } + } + + private async handleBrowseWorkspace(): Promise { + const picked = await vscode.window.showOpenDialog({ + canSelectMany: false, + canSelectFolders: true, + openLabel: 'Select Workspace Root' + }); + if (picked && picked[0]) { + this.panel.webview.postMessage({ type: 'workspacePicked', path: picked[0].fsPath }); + } + } + + private renderHtml(): string { + return ` + + + + + + + +

TinyCoder Agent Options

+

Settings are persisted to VS Code configuration (tinycoder.*).

+ +
+
Model
+
+ + + +
+
+ +
+
Inference Config
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
Agent Config
+
+ + + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
Tools
+
+ + + +
+
+ + +
+
+ + +
+
+ +
+ +
+
+ + + +`; + } +} diff --git a/src/ts/agent/prompt.ts b/src/ts/agent/prompt.ts new file mode 100644 index 0000000..f949750 --- /dev/null +++ b/src/ts/agent/prompt.ts @@ -0,0 +1,101 @@ +/* +⚡ TinyCoder AI - Agent Harness System Prompt + +Copyright (c) 2026 Mikhail Gorshkov (mikhail.gorshkov@gmail.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +import { AgentConfig, Message } from './types'; +import { buildToolDefinitions } from './tools'; + +/** + * Render the tool protocol section of the system prompt as JSON schemas. + * The model receives the schemas inline so it can produce well-formed + * tool-call JSON without a separate tool-call API. + */ +export function renderToolProtocol(tools: ReturnType): string { + const body = tools.map((t) => ({ + name: t.name, + description: t.description, + parameters: t.parameters + })); + return JSON.stringify(body, null, 2); +} + +/** + * Build the base system prompt for the ReAct loop. + * Keeps the tool call contract explicit: + * - think inside tags + * - either answer directly, or emit a single JSON tool call: + * {"tool_call":{"name":..., "arguments":{...}}} + */ +export function buildSystemPrompt(config: AgentConfig): string { + const tools = buildToolDefinitions(config.toolToggles); + const toolNames = tools.map((t) => t.name).join(', '); + + const header = + config.systemPromptOverride && config.systemPromptOverride.trim().length > 0 + ? config.systemPromptOverride.trim() + : [ + 'You are TinyCoder, an autonomous coding agent running inside the VS Code extension.', + 'You reason about the user\'s request and take actions using the provided tools.', + 'You operate inside a workspace. All file paths are relative to the workspace root.', + 'You may only use the tools listed below. Do not invent tools.', + 'When you are done, provide a final answer to the user.' + ].join('\n'); + + return [ + header, + '', + '=== TOOLS ===', + 'You may call any of the following tools. ' + + `Available: ${toolNames}.`, + '', + 'Tool call JSON format (exactly one object, no extra text around it):', + '{"tool_call":{"name":"","arguments":{...}}}', + '', + 'Tool schemas:', + renderToolProtocol(tools), + '', + '=== PROTOCOL ===', + [ + '1. Always start your turn with a short ... block explaining your plan.', + '2. Then EITHER provide the final answer (plain text, no JSON),', + ' OR emit exactly one tool call as the JSON object shown above.', + '3. After a tool call, there will be a "tool" message with the result.', + ' Continue reasoning and either call another tool or give the final answer.', + '4. Never repeat the same exact tool call twice in a row without changing arguments.', + '5. Keep final answers concise and reference the files you changed.' + ].join('\n'), + '', + '=== CONVERSATION ===' + ].join('\n'); +} + +/** + * A message role wrapper for compaction output (paraphrase of history). + */ +export function summarizeHistory(messages: Message[]): string { + const brief = messages.map((m) => { + const head = m.content.split('\n')[0]?.slice(0, 120) ?? ''; + return `${m.role}: ${head}`; + }); + return `[compacted history]\n${brief.join('\n')}`; +} diff --git a/src/ts/agent/runner.ts b/src/ts/agent/runner.ts new file mode 100644 index 0000000..9a8bb3a --- /dev/null +++ b/src/ts/agent/runner.ts @@ -0,0 +1,93 @@ +/* +⚡ TinyCoder AI - Agent Harness Runner + +Copyright (c) 2026 Mikhail Gorshkov (mikhail.gorshkov@gmail.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +import * as vscode from 'vscode'; +import { isModelLoaded, loadModel } from '../nativeBridge'; +import { AgentConfig, AgentEvent } from './types'; +import { loadAgentConfig } from './config'; +import { runAgentLoop } from './agentLoop'; + +/** + * Ensure the configured GGUF model is loaded in the native engine, + * loading it from `tinycoder.modelPath` if necessary. + */ +export async function ensureModelLoaded(): Promise { + if (isModelLoaded()) { + return true; + } + const config = loadAgentConfig(); + if (!config.modelPath) { + vscode.window.showErrorMessage( + 'TinyCoder: no model path configured. Set "tinycoder.modelPath" or use Agent Options.' + ); + return false; + } + const result = await vscode.window.withProgress( + { + location: vscode.ProgressLocation.Notification, + title: 'TinyCoder: loading model…', + cancellable: true + }, + (progress) => + loadModel(config.modelPath, { + nThreads: config.inference.nThreads, + maxSeqLen: config.inference.maxSeqLen + }, (p, stage) => { + progress.report({ increment: p * 100, message: stage }); + }) + ); + if (result.success) { + vscode.window.showInformationMessage( + `TinyCoder: model loaded (${result.modelInfo?.numLayers} layers)` + ); + return true; + } + vscode.window.showErrorMessage(`TinyCoder: failed to load model: ${result.error}`); + return false; +} + +/** + * Run the ReAct agent for a user prompt. + * + * Loads config (workspace root required), ensures the model is loaded, then + * invokes the loop, forwarding events to `onEvent`. Returns the final answer. + */ +export async function runAgentTask( + prompt: string, + onEvent?: (event: AgentEvent) => void, + configOverride?: Partial +): Promise { + const config: AgentConfig = { ...loadAgentConfig(), ...configOverride }; + if (!config.workspaceRoot) { + vscode.window.showErrorMessage( + 'TinyCoder agent: no workspace root. Open a folder or set tinycoder.agent.workspaceRoot.' + ); + return ''; + } + const loaded = await ensureModelLoaded(); + if (!loaded) { + return ''; + } + return runAgentLoop(prompt, config, onEvent); +} diff --git a/src/ts/agent/tools.ts b/src/ts/agent/tools.ts new file mode 100644 index 0000000..5447c0a --- /dev/null +++ b/src/ts/agent/tools.ts @@ -0,0 +1,596 @@ +/* +⚡ TinyCoder AI - Agent Harness Tools + +Copyright (c) 2026 Mikhail Gorshkov (mikhail.gorshkov@gmail.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +import * as vscode from 'vscode'; +import * as path from 'path'; +import { exec } from 'child_process'; +import { promisify } from 'util'; +import { + AgentConfig, + ToolCall, + ToolCallResult, + ToolDefinition, + ToolName, + ToolToggles, +} from './types'; + +const execAsync = promisify(exec); + +// --------------------------------------------------------------------------- +// Tool JSON Schemas +// +// The model sees these as plain JSON and must produce a `tool_calls` array. +// Schemas are intentionally small and self-describing for small quantized +// models (Qwen3.6-35B-A3B) that have 8-9 tok/s on CPU: keep descriptions +// terse and required fields explicit. +// --------------------------------------------------------------------------- + +/** JSON Schema for `readFile` — read a text file (optionally a line range). */ +const readFileSchema: ToolDefinition = { + name: 'readFile', + description: + 'Read the contents of a text file from the workspace. ' + + 'Use a relative path from the workspace root. ' + + 'Optionally pass "offset" (1-based) and "limit" (line count) to read a slice.', + parameters: { + type: 'object', + properties: { + path: { + type: 'string', + description: 'Path to the file, relative to the workspace root' + }, + offset: { + type: 'integer', + description: 'Optional 1-based line number to start reading from' + }, + limit: { + type: 'integer', + description: 'Optional number of lines to read (whole file when omitted)' + } + }, + required: ['path'] + } +}; + +/** JSON Schema for `writeFile` — create or fully overwrite a file. */ +const writeFileSchema: ToolDefinition = { + name: 'writeFile', + description: + 'Create a new file or overwrite an existing file with the given content. ' + + 'The file is created including missing parent directories. ' + + 'Use patchFile instead when only specific lines must change.', + parameters: { + type: 'object', + properties: { + path: { + type: 'string', + description: 'Path to the file, relative to the workspace root' + }, + content: { + type: 'string', + description: 'Full new file content' + } + }, + required: ['path', 'content'] + } +}; + +/** JSON Schema for `patchFile` — apply a unified diff (line-based replace). */ +const patchFileSchema: ToolDefinition = { + name: 'patchFile', + description: + 'Apply a targeted, line-based edit to a file using a single SEARCH/REPLACE pair. ' + + '"oldText" and "newText" must be exact literal slices of the file (whitespace matters). ' + + 'The first exact occurrence of oldText is replaced with newText. ' + + 'Preferred over writeFile for small, surgical changes.', + parameters: { + type: 'object', + properties: { + path: { + type: 'string', + description: 'Path to the file, relative to the workspace root' + }, + oldText: { + type: 'string', + description: 'Exact existing text (including indentation) to be replaced' + }, + newText: { + type: 'string', + description: 'Replacement text' + } + }, + required: ['path', 'oldText', 'newText'] + } +}; + +/** JSON Schema for `executeTerminalCommand` — run a shell command and capture output. */ +const executeTerminalCommandSchema: ToolDefinition = { + name: 'executeTerminalCommand', + description: + 'Run a shell command in the project directory and return its stdout/stderr. ' + + 'Working directory is the configured workspace root. ' + + 'Long commands are truncated in the result. Use for builds, tests, git, etc.', + parameters: { + type: 'object', + properties: { + command: { + type: 'string', + description: 'The shell command to execute' + }, + timeoutMs: { + type: 'integer', + description: + 'Optional timeout in milliseconds (default 30000, max 120000). ' + + 'Long-running commands (dev servers) are not supported — use 0 to skip waiting.' + } + }, + required: ['command'] + } +}; + +/** JSON Schema for `searchCodebase` — ripgrep-based pattern search. */ +const searchCodebaseSchema: ToolDefinition = { + name: 'searchCodebase', + description: + 'Search the workspace for lines matching a regular expression (uses ripgrep). ' + + 'Returns matching lines with file and line numbers, up to a limit.', + parameters: { + type: 'object', + properties: { + pattern: { + type: 'string', + description: 'Regular expression to search for' + }, + glob: { + type: 'string', + description: 'Optional file glob filter, e.g. "*.ts" or "!node_modules/**"' + }, + maxResults: { + type: 'integer', + description: 'Maximum number of matches to return (default 50)' + } + }, + required: ['pattern'] + } +}; + +/** Builds the full tool list honoring per-tool toggles. */ +export function buildToolDefinitions(toggles: ToolToggles): ToolDefinition[] { + const defs: ToolDefinition[] = []; + if (toggles.readFile) defs.push(readFileSchema); + if (toggles.writeFile) defs.push(writeFileSchema); + if (toggles.patchFile) defs.push(patchFileSchema); + if (toggles.terminal) defs.push(executeTerminalCommandSchema); + if (toggles.search) defs.push(searchCodebaseSchema); + return defs; +} + +// --------------------------------------------------------------------------- +// Path safety +// --------------------------------------------------------------------------- + +/** + * Resolve a workspace-relative path safely. Rejects absolute escapes outside + * the workspace root so the model cannot read/write arbitrary host files. + */ +function resolveWithinWorkspace(root: string, relativePath: string): string { + if (!root) { + throw new Error('No workspace root is configured. Open a folder or set tinycoder.agent.workspaceRoot.'); + } + const absolute = path.resolve(root, relativePath); + const rel = path.relative(root, absolute); + if (rel.startsWith('..') || path.isAbsolute(rel)) { + throw new Error(`Path escapes workspace root: ${relativePath}`); + } + return absolute; +} + +// --------------------------------------------------------------------------- +// Tool execution helpers (VS Code side) +// --------------------------------------------------------------------------- + +const MAX_TEXT_LENGTH = 60_000; + +function truncateText(text: string, maxLength: number = MAX_TEXT_LENGTH): string { + if (text.length <= maxLength) { + return text; + } + return `${text.slice(0, maxLength)}\n\n... [truncated ${text.length - maxLength} more chars]`; +} + +function jsonStr(arg: unknown, fallback: string): string { + if (typeof arg === 'string') { + return arg; + } + if (arg === undefined || arg === null) { + return fallback; + } + return String(arg); +} + +/** Read a file (with optional line range) via vscode.workspace.fs. */ +async function readFileTool( + config: AgentConfig, + args: Record +): Promise { + const abs = resolveWithinWorkspace(config.workspaceRoot, jsonStr(args.path, '')); + const offset = typeof args.offset === 'number' ? args.offset : undefined; + const limit = typeof args.limit === 'number' ? args.limit : undefined; + + const data = await vscode.workspace.fs.readFile(vscode.Uri.file(abs)); + const text = Buffer.from(data).toString('utf8'); + if (offset === undefined && limit === undefined) { + return truncateText(text); + } + + const lines = text.split(/\r?\n/); + const start = Math.max(1, Math.floor(offset || 1)); + const count = limit !== undefined ? Math.max(1, Math.floor(limit)) : lines.length; + const slice = lines.slice(start - 1, start - 1 + count); + const shown = slice.length; + const total = lines.length; + return `# ${path.basename(abs)}:${start}-${start + shown - 1} of ${total} lines\n${slice.join('\n')}`; +} + +/** Write a file (create or overwrite) via vscode.workspace.fs. */ +async function writeFileTool( + config: AgentConfig, + args: Record +): Promise { + const abs = resolveWithinWorkspace(config.workspaceRoot, jsonStr(args.path, '')); + const content = jsonStr(args.content, ''); + + await vscode.workspace.fs.createDirectory(vscode.Uri.file(path.dirname(abs))); + await vscode.workspace.fs.writeFile(vscode.Uri.file(abs), Buffer.from(content, 'utf8')); + + // If the file is open in an editor, refresh it so the user sees the change. + const openDoc = vscode.workspace.textDocuments.find( + (doc) => doc.uri.fsPath === abs && !doc.isDirty + ); + if (openDoc) { + await vscode.languages.setTextDocumentLanguage(openDoc, path.extname(abs).slice(1) || 'plaintext'); + } + + const bytes = Buffer.byteLength(content, 'utf8'); + return `OK: wrote ${bytes} bytes (${content.split(/\r?\n/).length} lines) to ${abs}`; +} + +/** Apply a surgical oldText→newText replace to one file. */ +async function patchFileTool( + config: AgentConfig, + args: Record +): Promise { + const abs = resolveWithinWorkspace(config.workspaceRoot, jsonStr(args.path, '')); + const oldText = jsonStr(args.oldText, ''); + const newText = jsonStr(args.newText, ''); + + if (!oldText) { + return 'ERROR: oldText must not be empty'; + } + + const data = await vscode.workspace.fs.readFile(vscode.Uri.file(abs)); + const text = Buffer.from(data).toString('utf8'); + + const idx = text.indexOf(oldText); + if (idx === -1) { + return 'ERROR: oldText not found in file. The patch failed — the file may have changed. Re-read the file and retry with an exact match.'; + } + + const patched = text.slice(0, idx) + newText + text.slice(idx + oldText.length); + await vscode.workspace.fs.writeFile(vscode.Uri.file(abs), Buffer.from(patched, 'utf8')); + + const removed = oldText.split(/\r?\n/).length; + const added = newText.split(/\r?\n/).length; + return `OK: replaced ${removed} lines with ${added} lines at character ${idx} in ${abs}`; +} + +/** + * Execute a command in the VS Code integrated terminal. + * Returns a promise that resolves once the shell finishes (or times out). + * + * NOTE: `onDidEndTerminalShellExecution` requires VS Code 1.93+. On older + * hosts the event never fires and we fall back to a timeout message. The + * `child`/`auto` modes are the recommended deterministic path. + */ +async function runTerminalCommandVscode( + config: AgentConfig, + command: string, + timeoutMs: number +): Promise { + const terminalName = config.terminalName || 'TinyCoder Agent'; + let terminal: vscode.Terminal | undefined = vscode.window.terminals.find( + (t) => t.name === terminalName + ); + if (!terminal) { + terminal = vscode.window.createTerminal({ + name: terminalName, + cwd: config.workspaceRoot || undefined + }); + } + terminal.show(true); + + let finished = false; + const collected: string[] = []; + const listener = vscode.window.onDidEndTerminalShellExecution(async (e) => { + try { + const text = e.execution.read(); + for await (const chunk of text) { + collected.push(chunk); + } + } catch { + // reading shell output can fail if the terminal is closed + } + finished = true; + listener.dispose(); + }); + + terminal.sendText(command, true); + + // Resolve on shell end, or after the timeout whichever comes first. + await new Promise((resolve) => { + const timer = setTimeout(() => { + listener.dispose(); + resolve(); + }, timeoutMs); + const flush = setInterval(() => { + if (finished) { + clearInterval(flush); + clearTimeout(timer); + listener.dispose(); + resolve(); + } + }, 150); + }); + + const output = collected.join(''); + if (finished) { + return truncateText(output || '(command completed; no output captured)'); + } + return `(command may still be running in terminal "${terminalName}"; no completion event after ${timeoutMs}ms)\ncommand: ${command}\n${output ? `\n[captured so far]\n${truncateText(output)}` : ''}`.trim(); +} + +/** Execute a command in a child process for deterministic stdout/stderr capture. */ +async function runTerminalCommandChild( + config: AgentConfig, + command: string, + timeoutMs: number +): Promise { + const cwd = config.workspaceRoot || process.cwd(); + const timeout = timeoutMs > 0 ? Math.min(timeoutMs, 120_000) : 30_000; + try { + const { stdout, stderr } = await execAsync(command, { cwd, timeout, maxBuffer: 10 * 1024 * 1024 }); + const out = stdout || ''; + const err = stderr || ''; + const body = [ + out ? `[stdout]\n${out}` : '', + err ? `[stderr]\n${err}` : '' + ].filter(Boolean).join('\n'); + return truncateText(body || '(no output)'); + } catch (err: any) { + const detail = err && err.stdout ? `\n[stdout]\n${String(err.stdout)}` : ''; + const detailErr = err && err.stderr ? `\n[stderr]\n${String(err.stderr)}` : ''; + return `ERROR: ${err?.message || err}\n${detail}${detailErr}`; + } +} + +/** Execute a terminal command honoring the configured capture mode. */ +async function executeTerminalCommandTool( + config: AgentConfig, + args: Record +): Promise { + const command = jsonStr(args.command, ''); + if (!command) { + return 'ERROR: command must not be empty'; + } + const rawTimeout = typeof args.timeoutMs === 'number' && args.timeoutMs > 0 + ? Math.floor(args.timeoutMs) + : 30_000; + const timeoutMs = Math.min(Math.max(rawTimeout, 1_000), 120_000); + + const mode = config.terminalMode; + if (mode === 'child') { + return runTerminalCommandChild(config, command, timeoutMs); + } + if (mode === 'vscode') { + return runTerminalCommandVscode(config, command, timeoutMs); + } + // auto: prefer child for deterministic capture, fall back to terminal. + try { + return await runTerminalCommandChild(config, command, timeoutMs); + } catch { + return runTerminalCommandVscode(config, command, timeoutMs); + } +} + +/** Minimal glob→RegExp for the search tool (supports *, **, ? and [] classes). */ +function globToRegExp(glob: string): RegExp { + let re = ''; + for (let i = 0; i < glob.length; i++) { + const ch = glob[i]; + if (ch === '*') { + if (glob[i + 1] === '*') { + re += '.*'; + i++; + } else { + re += '[^/]*'; + } + } else if (ch === '?') { + re += '[^/]'; + } else if (ch === '[') { + const end = glob.indexOf(']', i + 1); + if (end !== -1) { + re += glob.slice(i, end + 1); + i = end; + } else { + re += '\\['; + } + } else { + re += ch.replace(/[.+^${}()|\\]/g, '\\$&'); + } + } + return new RegExp(`^${re}$`); +} + +/** Ripgrep-backed codebase search with glob filtering. */ +async function searchCodebaseTool( + config: AgentConfig, + args: Record +): Promise { + const pattern = jsonStr(args.pattern, ''); + if (!pattern) { + return 'ERROR: pattern must not be empty'; + } + const glob = typeof args.glob === 'string' ? args.glob : undefined; + const max = typeof args.maxResults === 'number' + ? Math.min(Math.max(1, Math.floor(args.maxResults)), 200) + : 50; + + let re: RegExp; + try { + re = new RegExp(pattern, 'i'); + } catch (err: any) { + return `ERROR: invalid regex: ${err?.message || err}`; + } + + const includeGlobs: string[] = []; + const excludeGlobs: string[] = []; + if (glob) { + for (const part of glob.split(',')) { + const g = part.trim().replace(/^\.\//, ''); + if (!g) continue; + if (g.startsWith('!')) { + excludeGlobs.push(g.slice(1)); + } else { + includeGlobs.push(g); + } + } + } + const excludeRes = excludeGlobs.map(globToRegExp); + + const root = vscode.Uri.file(config.workspaceRoot); + const patterns = includeGlobs.length > 0 ? includeGlobs : ['**/*']; + const files = new Set(); + + for (const pat of patterns) { + const uris = await vscode.workspace.findFiles( + new vscode.RelativePattern(root, pat), + '**/node_modules/**', + 10_000 + ); + for (const u of uris) { + files.add(u.fsPath); + } + } + + const results: string[] = []; + let matched = 0; + + for (const fsPath of files) { + if (matched >= max) break; + const rel = path.relative(config.workspaceRoot, fsPath).split(path.sep).join('/'); + if (excludeRes.some((ex) => ex.test(rel))) { + continue; + } + try { + const uri = vscode.Uri.file(fsPath); + const data = await vscode.workspace.fs.readFile(uri); + const text = Buffer.from(data).toString('utf8'); + const lines = text.split(/\r?\n/); + for (let i = 0; i < lines.length; i++) { + if (re.test(lines[i])) { + results.push(`${rel}:${i + 1}: ${lines[i].slice(0, 300)}`); + matched++; + if (matched >= max) break; + } + } + } catch { + // skip unreadable files + } + } + + if (results.length === 0) { + return 'No matches found'; + } + return results.join('\n'); +} + +// --------------------------------------------------------------------------- +// Dispatcher +// --------------------------------------------------------------------------- + +/** + * Execute one parsed tool call. + * + * This is the only surface that touches the VS Code API; the AI-side + * (`agentLoop`) stays free of any vscode import so the inference layer is + * fully swappable. + */ +export async function executeTool( + config: AgentConfig, + call: ToolCall +): Promise { + const started = Date.now(); + const done = (output: string, ok = true, error?: string): ToolCallResult => ({ + toolCallId: call.id, + name: call.name, + ok, + output, + error, + durationMs: Date.now() - started + }); + + try { + switch (call.name) { + case 'readFile': + return done(await readFileTool(config, call.arguments)); + case 'writeFile': + return done(await writeFileTool(config, call.arguments)); + case 'patchFile': + return done(await patchFileTool(config, call.arguments)); + case 'executeTerminalCommand': + return done(await executeTerminalCommandTool(config, call.arguments)); + case 'searchCodebase': + return done(await searchCodebaseTool(config, call.arguments)); + default: + return done(`ERROR: unknown tool "${call.name}"`, false, 'unknown tool'); + } + } catch (err: any) { + return done(`ERROR: ${err?.message || String(err)}`, false, err?.message || String(err)); + } +} + +/** Generate a stable, ASCII tool call id. */ +export function makeToolCallId(): string { + return `call_${Date.now().toString(36)}${Math.random().toString(36).slice(2, 8)}`; +} + +/** List of tool names currently enabled. */ +export function enabledToolNames(toggles: ToolToggles): ToolName[] { + return buildToolDefinitions(toggles).map((d) => d.name); +} + +/** Render a tool result as a compact string attached to the `tool` message. */ +export function formatToolResult(result: ToolCallResult): string { + return result.ok ? result.output : `ERROR\n${result.output}`; +} diff --git a/src/ts/agent/types.ts b/src/ts/agent/types.ts new file mode 100644 index 0000000..56fa817 --- /dev/null +++ b/src/ts/agent/types.ts @@ -0,0 +1,157 @@ +/* +⚡ TinyCoder AI - Agent Harness Types + +Copyright (c) 2026 Mikhail Gorshkov (mikhail.gorshkov@gmail.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +/** + * Core shared types for the TinyCoder agent harness. + * + * The harness follows the ReAct (Reasoning + Acting) pattern: the model + * receives a system prompt plus conversation history, returns either a final + * answer or a structured tool-call JSON block, and the harness executes the + * call and appends the raw result back to the history. Everything typed here + * is deliberately decoupled from the inference library so that a custom AP + * inference implementation can be plugged in via {@link registerAPInference}. + */ + +/** Roles understood by the harness and rendered into the model's chat template. */ +export type AgentRole = 'system' | 'user' | 'assistant' | 'tool'; + +/** The set of tools the harness can dispatch. */ +export type ToolName = + | 'readFile' + | 'writeFile' + | 'patchFile' + | 'executeTerminalCommand' + | 'searchCodebase'; + +/** JSON-Schema style parameter description (subset sufficient for small local models). */ +export interface ToolParameterSchema { + type: 'object'; + properties: Record< + string, + { + type: string; + description?: string; + default?: unknown; + enum?: string[]; + } + >; + required: string[]; +} + +/** A single tool the agent may call. */ +export interface ToolDefinition { + name: ToolName; + description: string; + parameters: ToolParameterSchema; +} + +/** Structured request emitted by the model (parsed from JSON). */ +export interface ToolCall { + id: string; + name: ToolName; + arguments: Record; + /** Raw JSON text the model produced (kept for diagnostics). */ + raw?: string; +} + +/** Result of executing one tool call. */ +export interface ToolCallResult { + toolCallId: string; + name: ToolName; + ok: boolean; + output: string; + durationMs: number; + error?: string; +} + +/** + * A conversation message maintained by the loop engine. + * + * `role: 'assistant'` messages may carry `toolCalls`; the corresponding + * tool outputs are appended as `role: 'tool'` messages keyed by + * `toolCallId`/`toolName`. + */ +export interface Message { + role: AgentRole; + content: string; + toolCallId?: string; + toolName?: ToolName; + toolCalls?: ToolCall[]; + toolResult?: ToolCallResult; + /** Set when compaction truncated the raw tool output. */ + truncated?: boolean; +} + +/** Namespace of tools the agent is allowed to execute (tool toggles). */ +export interface ToolToggles { + readFile: boolean; + writeFile: boolean; + patchFile: boolean; + terminal: boolean; + search: boolean; +} + +/** Sampling / inference parameters forwarded to the tinycoder-inference bridge. */ +export interface InferenceConfig { + maxTokens: number; + temperature: number; + topP: number; + topK: number; + repeatPenalty: number; + repeatLastN: number; + maxSeqLen: number; + nThreads: number; + seed?: number; +} + +/** Everything the loop needs to run. */ +export interface AgentConfig { + modelPath: string; + /** Root the agent may read/write/search; relative paths resolve against it. */ + workspaceRoot: string; + terminalName: string; + terminalMode: 'vscode' | 'child' | 'auto'; + maxIterations: number; + compactionThreshold: number; + compactionPreserveRecent: number; + toolToggles: ToolToggles; + systemPromptOverride?: string; + inference: InferenceConfig; +} + +/** Result of a single AP inference call. */ +export interface InferenceResult { + text: string; + tokenCount: number; +} + +/** Events emitted by the loop so UI layers can render progress. */ +export type AgentEvent = + | { type: 'iteration'; iteration: number; maxIterations: number } + | { type: 'assistantText'; text: string } + | { type: 'toolCall'; call: ToolCall } + | { type: 'toolResult'; result: ToolCallResult } + | { type: 'compaction'; removed: number; remaining: number } + | { type: 'final'; text: string } + | { type: 'error'; message: string }; diff --git a/src/ts/extension.ts b/src/ts/extension.ts index bace1e7..ba34637 100644 --- a/src/ts/extension.ts +++ b/src/ts/extension.ts @@ -26,8 +26,49 @@ import * as vscode from 'vscode'; import * as path from 'path'; import { TinyCoderPanel } from './panel'; import { getStatus, isModelLoaded, generate } from './nativeBridge'; +import { runAgentLoop } from './agent/agentLoop'; +import { loadAgentConfig } from './agent/config'; +import { AgentOptionsPanel } from './agent/optionsPanel'; +import { AgentEvent } from './agent/types'; +import { runAgentTask } from './agent/runner'; let panel: TinyCoderPanel | undefined; +let agentOptionsPanel: AgentOptionsPanel | undefined; + +/** Show agent progress events in an output channel. */ +const agentOutput = vscode.window.createOutputChannel('TinyCoder Agent'); + +function onAgentEvent(event: AgentEvent): void { + switch (event.type) { + case 'iteration': + agentOutput.appendLine(`\n[iteration ${event.iteration}/${event.maxIterations}]`); + break; + case 'assistantText': + agentOutput.appendLine(`\n[assistant]\n${event.text}`); + break; + case 'toolCall': + agentOutput.appendLine( + `\n[tool] ${event.call.name}(${JSON.stringify(event.call.arguments)})` + ); + break; + case 'toolResult': + agentOutput.appendLine( + `[result ${event.result.durationMs}ms ${event.result.ok ? 'ok' : 'ERROR'}]\n${event.result.output}` + ); + break; + case 'compaction': + agentOutput.appendLine( + `[compaction] removed ${event.removed} messages, ${event.remaining} remain` + ); + break; + case 'final': + agentOutput.appendLine(`\n[final]\n${event.text}`); + break; + case 'error': + agentOutput.appendLine(`[error] ${event.message}`); + break; + } +} /** * Provider for the TinyCoder sidebar webview view. @@ -53,7 +94,7 @@ class TinyCoderViewProvider implements vscode.WebviewViewProvider { } // Register the sidebar view so messages can be sent back to it panel.setSidebarView(webviewView); - webviewView.webview.html = panel.getHtmlContent(); + webviewView.webview.html = panel.getHtmlContent(webviewView.webview.cspSource); webviewView.webview.onDidReceiveMessage( async (message: any) => { @@ -233,6 +274,71 @@ export function activate(context: vscode.ExtensionContext) { } }); + // Register command to run the autonomous coding agent (ReAct harness). + const agentRunCommand = vscode.commands.registerCommand('tinycoder.agentRun', async () => { + // Ask for the task (allow reusing the active selection as context). + const editor = vscode.window.activeTextEditor; + const selectionText = editor && !editor.selection.isEmpty + ? editor.document.getText(editor.selection) + : ''; + const prompt = await vscode.window.showInputBox({ + prompt: 'What should the TinyCoder agent do?', + placeHolder: 'e.g. Implement a ReAct agent harness in the src/ts/agent directory', + value: selectionText + }); + if (!prompt || prompt.trim().length === 0) { + return; + } + + agentOutput.clear(); + agentOutput.appendLine('TinyCoder Agent: starting'); + agentOutput.show(true); + + const start = Date.now(); + const finalAnswer = await runAgentTask(prompt, onAgentEvent); + const elapsed = ((Date.now() - start) / 1000).toFixed(1); + + vscode.window.showInformationMessage( + finalAnswer + ? `TinyCoder agent finished in ${elapsed}s. See output.` + : 'TinyCoder agent did not run (see error above).', + 'Open Output' + ).then((choice) => { + if (choice === 'Open Output') { + agentOutput.show(true); + } + }); + }); + + // Register command to open the agent options panel. + const openAgentOptionsCommand = vscode.commands.registerCommand( + 'tinycoder.openAgentOptions', + () => { + if (agentOptionsPanel) { + try { + agentOptionsPanel.reveal(); + return; + } catch (err) { + // Panel was closed by the user; recreate below. + agentOptionsPanel = undefined; + } + } + agentOptionsPanel = new AgentOptionsPanel(context); + } + ); + + // Register command to open the tinycoder settings in the native UI + // (fallback for the "Settings" button in the chat panel). + const openSettingsCommand = vscode.commands.registerCommand( + 'tinycoder.openSettings', + async () => { + await vscode.commands.executeCommand( + 'workbench.action.openSettings', + '@ext:tinycoder.tinycoder' + ); + } + ); + // Register command to show model status const statusCommand = vscode.commands.registerCommand('tinycoder.showStatus', () => { const status = getStatus(); @@ -253,10 +359,13 @@ export function activate(context: vscode.ExtensionContext) { generateCommand, loadModelCommand, statusCommand, - inferFromTerminalCommand + inferFromTerminalCommand, + agentRunCommand, + openAgentOptionsCommand, + openSettingsCommand ); - // Add status bar item + // Add status bar item (model status; click shows status) const statusBarItem = vscode.window.createStatusBarItem( vscode.StatusBarAlignment.Right, 100 @@ -267,6 +376,17 @@ export function activate(context: vscode.ExtensionContext) { statusBarItem.show(); context.subscriptions.push(statusBarItem); + // Add a dedicated Settings gear in the status bar (always visible). + const statusBarSettingsItem = vscode.window.createStatusBarItem( + vscode.StatusBarAlignment.Right, + 101 + ); + statusBarSettingsItem.text = '$(gear) TinyCoder Settings'; + statusBarSettingsItem.command = 'tinycoder.openAgentOptions'; + statusBarSettingsItem.tooltip = 'Open TinyCoder Settings (model, inference, agent options)'; + statusBarSettingsItem.show(); + context.subscriptions.push(statusBarSettingsItem); + // Update status bar periodically setInterval(() => { const status = getStatus(); @@ -294,4 +414,8 @@ export function deactivate() { panel.dispose(); panel = undefined; } + if (agentOptionsPanel) { + agentOptionsPanel.dispose(); + agentOptionsPanel = undefined; + } } diff --git a/src/ts/panel.ts b/src/ts/panel.ts index 6f831b1..e47af45 100644 --- a/src/ts/panel.ts +++ b/src/ts/panel.ts @@ -39,6 +39,8 @@ import { getNativeAddonStatus, HardwareInfo } from './nativeBridge'; +import { runAgentTask } from './agent/runner'; +import { AgentEvent } from './agent/types'; interface PanelMessage { type: string; @@ -103,7 +105,7 @@ export class TinyCoderPanel { } ); - this.panel.webview.html = this.getHtmlContent(); + this.panel.webview.html = this.getHtmlContent(this.panel.webview.cspSource); this.panel.onDidDispose(() => this.dispose(), null, this.disposables); this.panel.webview.onDidReceiveMessage( (message: PanelMessage) => this.handleMessage(message), @@ -174,7 +176,12 @@ export class TinyCoderPanel { break; case 'chat': - await this.handleChat(message.content, message.params); + // `params.agent` is set by the webview when Agent mode is on. + await this.handleChat(message.content, message.params as any); + break; + + case 'openAgentOptions': + await vscode.commands.executeCommand('tinycoder.openAgentOptions'); break; case 'stopGeneration': @@ -197,6 +204,12 @@ export class TinyCoderPanel { case 'insertCode': this.insertCodeToEditor(message.code); break; + + case 'openExternal': + if (message.url) { + vscode.env.openExternal(vscode.Uri.parse(message.url)); + } + break; } } @@ -325,7 +338,12 @@ export class TinyCoderPanel { /** * Handle a chat message. */ - private async handleChat(content: string, params?: InferenceParams): Promise { + private async handleChat(content: string, params?: InferenceParams & { agent?: boolean }): Promise { + if (params?.agent) { + await this.handleAgentChat(content); + return; + } + if (!isModelLoaded()) { this.sendMessage({ type: 'error', @@ -384,6 +402,75 @@ export class TinyCoderPanel { } } + /** + * Route a chat message to the autonomous ReAct agent. + * Streams tool progress and the final answer as webview messages. + */ + private async handleAgentChat(content: string): Promise { + if (this.isGenerating) { + return; + } + this.isGenerating = true; + this.sendMessage({ type: 'agentStart' }); + + const onAgentEvent = (event: AgentEvent): void => { + switch (event.type) { + case 'iteration': + this.sendMessage({ + type: 'agentIteration', + iteration: event.iteration, + maxIterations: event.maxIterations + }); + break; + case 'toolCall': + this.sendMessage({ + type: 'agentTool', + name: event.call.name, + args: JSON.stringify(event.call.arguments) + }); + break; + case 'toolResult': + this.sendMessage({ + type: 'agentToolResult', + name: event.result.name, + ok: event.result.ok, + output: event.result.output.slice(0, 4000), + durationMs: event.result.durationMs + }); + break; + case 'compaction': + this.sendMessage({ + type: 'agentCompaction', + removed: event.removed, + remaining: event.remaining + }); + break; + case 'final': + this.sendMessage({ type: 'agentFinal', text: event.text }); + break; + case 'error': + this.sendMessage({ type: 'error', message: event.message }); + break; + } + }; + + try { + const finalAnswer = await runAgentTask(content, onAgentEvent); + // If no onEvent fired a final (e.g. early abort), still surface the text. + if (finalAnswer) { + this.sendMessage({ type: 'agentFinal', text: finalAnswer }); + } + } catch (err: any) { + this.sendMessage({ + type: 'error', + message: `Agent error: ${err?.message || err}` + }); + } finally { + this.isGenerating = false; + this.sendMessage({ type: 'agentDone' }); + } + } + /** * Build a chat prompt using the Qwen2.5-Coder chat template. */ @@ -427,12 +514,18 @@ ${userMessage}<|im_end|> /** * Get the HTML content for the webview. */ - public getHtmlContent(): string { + public getHtmlContent(cspSource?: string): string { + // VS Code blocks inline scripts/styles unless the webview declares its own + // Content-Security-Policy. 'unsafe-inline' is required here because the panel + // uses inline + + + diff --git a/www/media/icon.png b/www/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0706d08ae08e8af57a8e56aa5e3db7f7b4087d7e GIT binary patch literal 14293 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%0AZWcv^ZF+grtH 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

uH4#fj0vgB{iX^#iuj)& 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 + + + + + + + + + + + + + + + + + + + diff --git a/www/media/tinycoder.jpg b/www/media/tinycoder.jpg new file mode 100644 index 0000000000000000000000000000000000000000..74181498af841bdd685f938add58c0e4bbb35b44 GIT binary patch literal 92669 zcmd?QcUV(f^C-L%iPEGQqDU1*0|XF|-VsoW5SoM{J)qJA1nEQ+>7aBhbOfY@Ac9l{ z0U;nwnl$Mh1VRV7JD&49?|JY2?jPTu-}9~H+3dZt_NFF5HoP#qmon@k< zXJ%tQ%fiCS%E|y|=VU+6dG0*xc`^_P1q^l)c9QngDcbXl^o-~KU$^51fRU17mSXk< zgd2b|LQXJ3j=unGAgTcL1bF$UL7*pKCr?pOg1@qo=>UKI=QjX=Kq<&SAO8So!G0*i z2?nt5@b|w){D1BC)R2AiY(Sl#&)8~H$fZe%BQJX~agF9_;S^e9{gZB`wil7=$xY9j zUJKg_zdHHh0eJiJs;#iyRjiiab*h)8cEYxi;K2KzpEuhHr$n+u+SwqkpZsdsan9@+ zZC_-^xm!<6g`bFl&!TTXe6?ℜgX;35T2tq7`RNJ)JP-HM8;@Y<0RVivI`i=nIl( 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

Cz*txLmuf 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

D|Ajq5&J;Eb5WX=B{)dzly&s+T_s^lE>9R`{f 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