gencode-ai 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +11 -0
- package/CLAUDE.md +70 -0
- package/LICENSE +21 -0
- package/README.md +117 -0
- package/dist/agent/agent.d.ts +84 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +233 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/index.d.ts +6 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +6 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/types.d.ts +47 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +5 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/cli/components/App.d.ts +14 -0
- package/dist/cli/components/App.d.ts.map +1 -0
- package/dist/cli/components/App.js +395 -0
- package/dist/cli/components/App.js.map +1 -0
- package/dist/cli/components/CommandSuggestions.d.ts +13 -0
- package/dist/cli/components/CommandSuggestions.d.ts.map +1 -0
- package/dist/cli/components/CommandSuggestions.js +32 -0
- package/dist/cli/components/CommandSuggestions.js.map +1 -0
- package/dist/cli/components/Header.d.ts +9 -0
- package/dist/cli/components/Header.d.ts.map +1 -0
- package/dist/cli/components/Header.js +13 -0
- package/dist/cli/components/Header.js.map +1 -0
- package/dist/cli/components/Input.d.ts +13 -0
- package/dist/cli/components/Input.d.ts.map +1 -0
- package/dist/cli/components/Input.js +27 -0
- package/dist/cli/components/Input.js.map +1 -0
- package/dist/cli/components/Logo.d.ts +2 -0
- package/dist/cli/components/Logo.d.ts.map +1 -0
- package/dist/cli/components/Logo.js +8 -0
- package/dist/cli/components/Logo.js.map +1 -0
- package/dist/cli/components/Messages.d.ts +37 -0
- package/dist/cli/components/Messages.d.ts.map +1 -0
- package/dist/cli/components/Messages.js +106 -0
- package/dist/cli/components/Messages.js.map +1 -0
- package/dist/cli/components/ModelSelector.d.ts +13 -0
- package/dist/cli/components/ModelSelector.d.ts.map +1 -0
- package/dist/cli/components/ModelSelector.js +72 -0
- package/dist/cli/components/ModelSelector.js.map +1 -0
- package/dist/cli/components/Spinner.d.ts +12 -0
- package/dist/cli/components/Spinner.d.ts.map +1 -0
- package/dist/cli/components/Spinner.js +45 -0
- package/dist/cli/components/Spinner.js.map +1 -0
- package/dist/cli/components/index.d.ts +12 -0
- package/dist/cli/components/index.d.ts.map +1 -0
- package/dist/cli/components/index.js +12 -0
- package/dist/cli/components/index.js.map +1 -0
- package/dist/cli/components/theme.d.ts +31 -0
- package/dist/cli/components/theme.d.ts.map +1 -0
- package/dist/cli/components/theme.js +36 -0
- package/dist/cli/components/theme.js.map +1 -0
- package/dist/cli/index-legacy.d.ts +7 -0
- package/dist/cli/index-legacy.d.ts.map +1 -0
- package/dist/cli/index-legacy.js +431 -0
- package/dist/cli/index-legacy.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +116 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ink-cli.d.ts +7 -0
- package/dist/cli/ink-cli.d.ts.map +1 -0
- package/dist/cli/ink-cli.js +105 -0
- package/dist/cli/ink-cli.js.map +1 -0
- package/dist/cli/session-picker.d.ts +16 -0
- package/dist/cli/session-picker.d.ts.map +1 -0
- package/dist/cli/session-picker.js +280 -0
- package/dist/cli/session-picker.js.map +1 -0
- package/dist/cli/ui.d.ts +61 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +364 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/manager.d.ts +31 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +65 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/types.d.ts +22 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +6 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +10 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +9 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/init.d.ts +20 -0
- package/dist/memory/init.d.ts.map +1 -0
- package/dist/memory/init.js +332 -0
- package/dist/memory/init.js.map +1 -0
- package/dist/memory/manager.d.ts +85 -0
- package/dist/memory/manager.d.ts.map +1 -0
- package/dist/memory/manager.js +234 -0
- package/dist/memory/manager.js.map +1 -0
- package/dist/memory/types.d.ts +74 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +6 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/permissions/index.d.ts +7 -0
- package/dist/permissions/index.d.ts.map +1 -0
- package/dist/permissions/index.js +6 -0
- package/dist/permissions/index.js.map +1 -0
- package/dist/permissions/manager.d.ts +32 -0
- package/dist/permissions/manager.d.ts.map +1 -0
- package/dist/permissions/manager.js +79 -0
- package/dist/permissions/manager.js.map +1 -0
- package/dist/permissions/types.d.ts +14 -0
- package/dist/permissions/types.d.ts.map +1 -0
- package/dist/permissions/types.js +17 -0
- package/dist/permissions/types.js.map +1 -0
- package/dist/providers/anthropic.d.ts +20 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +185 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/gemini.d.ts +21 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +241 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +34 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +72 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai.d.ts +19 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +221 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/types.d.ts +125 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +6 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/session/index.d.ts +6 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +6 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/manager.d.ts +101 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +295 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/types.d.ts +39 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +10 -0
- package/dist/session/types.js.map +1 -0
- package/dist/tools/builtin/bash.d.ts +7 -0
- package/dist/tools/builtin/bash.d.ts.map +1 -0
- package/dist/tools/builtin/bash.js +80 -0
- package/dist/tools/builtin/bash.js.map +1 -0
- package/dist/tools/builtin/edit.d.ts +7 -0
- package/dist/tools/builtin/edit.d.ts.map +1 -0
- package/dist/tools/builtin/edit.js +32 -0
- package/dist/tools/builtin/edit.js.map +1 -0
- package/dist/tools/builtin/glob.d.ts +7 -0
- package/dist/tools/builtin/glob.d.ts.map +1 -0
- package/dist/tools/builtin/glob.js +36 -0
- package/dist/tools/builtin/glob.js.map +1 -0
- package/dist/tools/builtin/grep.d.ts +7 -0
- package/dist/tools/builtin/grep.d.ts.map +1 -0
- package/dist/tools/builtin/grep.js +59 -0
- package/dist/tools/builtin/grep.js.map +1 -0
- package/dist/tools/builtin/read.d.ts +7 -0
- package/dist/tools/builtin/read.d.ts.map +1 -0
- package/dist/tools/builtin/read.js +29 -0
- package/dist/tools/builtin/read.js.map +1 -0
- package/dist/tools/builtin/write.d.ts +7 -0
- package/dist/tools/builtin/write.d.ts.map +1 -0
- package/dist/tools/builtin/write.js +24 -0
- package/dist/tools/builtin/write.js.map +1 -0
- package/dist/tools/index.d.ts +38 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +32 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +22 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +71 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +62 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +126 -0
- package/dist/tools/types.js.map +1 -0
- package/docs/README.md +16 -0
- package/docs/proposals/0001-web-fetch-tool.md +293 -0
- package/docs/proposals/0002-web-search-tool.md +306 -0
- package/docs/proposals/0003-task-subagents.md +333 -0
- package/docs/proposals/0004-plan-mode.md +338 -0
- package/docs/proposals/0005-todo-system.md +299 -0
- package/docs/proposals/0006-memory-system.md +539 -0
- package/docs/proposals/0007-context-management.md +429 -0
- package/docs/proposals/0008-checkpointing.md +327 -0
- package/docs/proposals/0009-hooks-system.md +343 -0
- package/docs/proposals/0010-mcp-integration.md +382 -0
- package/docs/proposals/0011-custom-commands.md +374 -0
- package/docs/proposals/0012-ask-user-question.md +317 -0
- package/docs/proposals/0013-multi-edit-tool.md +345 -0
- package/docs/proposals/0014-lsp-tool.md +478 -0
- package/docs/proposals/0015-ls-tool.md +407 -0
- package/docs/proposals/0016-kill-shell-tool.md +455 -0
- package/docs/proposals/0017-background-tasks.md +489 -0
- package/docs/proposals/0018-parallel-tool-execution.md +415 -0
- package/docs/proposals/0019-session-enhancements.md +462 -0
- package/docs/proposals/0020-session-summarization.md +447 -0
- package/docs/proposals/0021-skills-system.md +409 -0
- package/docs/proposals/0022-plugin-system.md +467 -0
- package/docs/proposals/0023-permission-enhancements.md +470 -0
- package/docs/proposals/0024-keyboard-shortcuts.md +443 -0
- package/docs/proposals/0025-cost-tracking.md +447 -0
- package/docs/proposals/0026-git-integration.md +475 -0
- package/docs/proposals/0027-enhanced-read-tool.md +514 -0
- package/docs/proposals/0028-enhanced-bash-tool.md +511 -0
- package/docs/proposals/0029-notebook-edit-tool.md +413 -0
- package/docs/proposals/0030-plugin-marketplace.md +360 -0
- package/docs/proposals/0031-command-suggestions.md +295 -0
- package/docs/proposals/0032-ide-integrations.md +328 -0
- package/docs/proposals/0033-enterprise-deployment.md +221 -0
- package/docs/proposals/0034-sandboxing.md +273 -0
- package/docs/proposals/0035-auto-updater.md +311 -0
- package/docs/proposals/0036-enhanced-glob-tool.md +267 -0
- package/docs/proposals/0037-enhanced-grep-tool.md +360 -0
- package/docs/proposals/0038-interactive-cli-ui.md +373 -0
- package/docs/proposals/0039-streaming-enhancements.md +359 -0
- package/docs/proposals/0040-multi-provider-enhancements.md +369 -0
- package/docs/proposals/README.md +84 -0
- package/docs/proposals/TEMPLATE.md +57 -0
- package/docs/proposals/research/claude-code-research.md +307 -0
- package/examples/agent-demo.ts +115 -0
- package/examples/basic.ts +166 -0
- package/package.json +50 -0
- package/src/agent/agent.ts +276 -0
- package/src/agent/index.ts +6 -0
- package/src/agent/types.ts +62 -0
- package/src/cli/components/App.tsx +565 -0
- package/src/cli/components/CommandSuggestions.tsx +58 -0
- package/src/cli/components/Header.tsx +36 -0
- package/src/cli/components/Input.tsx +60 -0
- package/src/cli/components/Logo.tsx +16 -0
- package/src/cli/components/Messages.tsx +210 -0
- package/src/cli/components/ModelSelector.tsx +135 -0
- package/src/cli/components/Spinner.tsx +72 -0
- package/src/cli/components/index.ts +21 -0
- package/src/cli/components/theme.ts +36 -0
- package/src/cli/index.tsx +136 -0
- package/src/config/index.ts +7 -0
- package/src/config/manager.ts +77 -0
- package/src/config/types.ts +25 -0
- package/src/index.ts +86 -0
- package/src/permissions/index.ts +7 -0
- package/src/permissions/manager.ts +97 -0
- package/src/permissions/types.ts +29 -0
- package/src/providers/anthropic.ts +224 -0
- package/src/providers/gemini.ts +295 -0
- package/src/providers/index.ts +97 -0
- package/src/providers/openai.ts +261 -0
- package/src/providers/types.ts +181 -0
- package/src/session/index.ts +6 -0
- package/src/session/manager.ts +354 -0
- package/src/session/types.ts +49 -0
- package/src/tools/builtin/bash.ts +92 -0
- package/src/tools/builtin/edit.ts +37 -0
- package/src/tools/builtin/glob.ts +42 -0
- package/src/tools/builtin/grep.ts +67 -0
- package/src/tools/builtin/read.ts +34 -0
- package/src/tools/builtin/write.ts +27 -0
- package/src/tools/index.ts +36 -0
- package/src/tools/registry.ts +83 -0
- package/src/tools/types.ts +172 -0
- package/tsconfig.json +21 -0
package/.env.example
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# GenCode - Environment Variables
|
|
2
|
+
# Copy this file to .env and fill in your API keys
|
|
3
|
+
|
|
4
|
+
# OpenAI API Key (for GPT-4, GPT-4o, etc.)
|
|
5
|
+
OPENAI_API_KEY=sk-xxx
|
|
6
|
+
|
|
7
|
+
# Anthropic API Key (for Claude models)
|
|
8
|
+
ANTHROPIC_API_KEY=sk-ant-xxx
|
|
9
|
+
|
|
10
|
+
# Google Gemini API Key
|
|
11
|
+
GOOGLE_API_KEY=xxx
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## Project Overview
|
|
6
|
+
|
|
7
|
+
**GenCode** (npm: `gencode`) is an open-source, provider-agnostic AI coding assistant. It brings Claude Code's excellent interactive CLI experience while allowing flexible switching between different LLM providers (OpenAI, Anthropic, Google Gemini).
|
|
8
|
+
|
|
9
|
+
## Build & Run Commands
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install # Install dependencies
|
|
13
|
+
npm run build # Compile TypeScript to dist/
|
|
14
|
+
npm run dev # Watch mode compilation
|
|
15
|
+
npm start # Run CLI directly via tsx
|
|
16
|
+
npm run example # Run examples/basic.ts
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Architecture
|
|
20
|
+
|
|
21
|
+
### Provider Abstraction Layer (`src/providers/`)
|
|
22
|
+
|
|
23
|
+
Unified `LLMProvider` interface abstracts API differences:
|
|
24
|
+
- `complete()` - Non-streaming completion
|
|
25
|
+
- `stream()` - Streaming completion (AsyncGenerator)
|
|
26
|
+
|
|
27
|
+
Each provider (OpenAI, Anthropic, Gemini) translates the unified message format to its native API format and back. The `createProvider()` factory instantiates providers by name.
|
|
28
|
+
|
|
29
|
+
### Tool System (`src/tools/`)
|
|
30
|
+
|
|
31
|
+
Tools are defined with Zod schemas for input validation:
|
|
32
|
+
```typescript
|
|
33
|
+
interface Tool<TInput> {
|
|
34
|
+
name: string;
|
|
35
|
+
description: string;
|
|
36
|
+
parameters: z.ZodSchema<TInput>;
|
|
37
|
+
execute(input: TInput, context: ToolContext): Promise<ToolResult>;
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
`ToolRegistry` manages tools and converts Zod schemas to JSON Schema for LLM consumption via `zodToJsonSchema()`.
|
|
42
|
+
|
|
43
|
+
### Agent Loop (`src/agent/agent.ts`)
|
|
44
|
+
|
|
45
|
+
The `Agent` class implements the core conversation loop:
|
|
46
|
+
1. User message → LLM with tools
|
|
47
|
+
2. If `stopReason === 'tool_use'`: execute tools, append results, loop back
|
|
48
|
+
3. If `stopReason !== 'tool_use'`: done
|
|
49
|
+
|
|
50
|
+
Events are yielded as `AgentEvent` (text, tool_start, tool_result, done, error).
|
|
51
|
+
|
|
52
|
+
### Session Management (`src/session/`)
|
|
53
|
+
|
|
54
|
+
Sessions persist conversation history to `~/.gencode/sessions/` as JSON files. Supports resume, fork, list, and delete operations.
|
|
55
|
+
|
|
56
|
+
## Configuration
|
|
57
|
+
|
|
58
|
+
Provider/model selection priority:
|
|
59
|
+
1. `GENCODE_PROVIDER` / `GENCODE_MODEL` env vars
|
|
60
|
+
2. Auto-detect from available API keys (ANTHROPIC_API_KEY → OPENAI_API_KEY → GOOGLE_API_KEY)
|
|
61
|
+
3. Default: Gemini
|
|
62
|
+
|
|
63
|
+
Proxy: Set `HTTP_PROXY` or `HTTPS_PROXY` for network proxy support.
|
|
64
|
+
|
|
65
|
+
## Key Patterns
|
|
66
|
+
|
|
67
|
+
- All file paths in tools should be resolved relative to `ToolContext.cwd`
|
|
68
|
+
- Tool input validation uses Zod; errors returned as `ToolResult.error`
|
|
69
|
+
- Provider implementations handle message format conversion internally
|
|
70
|
+
- CLI commands start with `/` (e.g., `/sessions`, `/resume`, `/help`)
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Meng Yan
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# GenCode
|
|
2
|
+
|
|
3
|
+
An open-source, provider-agnostic AI coding assistant.
|
|
4
|
+
|
|
5
|
+
## Why GenCode?
|
|
6
|
+
|
|
7
|
+
Claude Code is excellent - its interactive CLI experience, tool integration, and agent loop design are impressive. However, it's locked to Anthropic's Claude models.
|
|
8
|
+
|
|
9
|
+
**GenCode** brings that same great experience while giving you the freedom to:
|
|
10
|
+
|
|
11
|
+
- **Switch providers freely** - Use OpenAI, Anthropic, Google Gemini, or any OpenAI-compatible API
|
|
12
|
+
- **Control your costs** - Choose models that fit your budget and use case
|
|
13
|
+
- **Stay flexible** - No vendor lock-in, use local models or any cloud provider
|
|
14
|
+
- **Keep the experience** - Same intuitive CLI workflow inspired by Claude Code
|
|
15
|
+
|
|
16
|
+
## Quick Start
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
# Install globally
|
|
20
|
+
npm install -g gencode
|
|
21
|
+
|
|
22
|
+
# Run
|
|
23
|
+
gencode
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Or run from source:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# Install dependencies
|
|
30
|
+
npm install
|
|
31
|
+
|
|
32
|
+
# Build
|
|
33
|
+
npm run build
|
|
34
|
+
|
|
35
|
+
# Run CLI
|
|
36
|
+
npm start
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Usage
|
|
40
|
+
|
|
41
|
+
### CLI Mode
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Start interactive CLI
|
|
45
|
+
gencode
|
|
46
|
+
|
|
47
|
+
# Resume last session
|
|
48
|
+
gencode -c
|
|
49
|
+
|
|
50
|
+
# Select from recent sessions
|
|
51
|
+
gencode -r
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Programmatic Usage
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
import { Agent } from 'gencode';
|
|
58
|
+
|
|
59
|
+
const agent = new Agent({
|
|
60
|
+
provider: 'gemini', // 'openai' | 'anthropic' | 'gemini'
|
|
61
|
+
model: 'gemini-2.0-flash',
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
for await (const event of agent.run('List files in current directory')) {
|
|
65
|
+
if (event.type === 'text') {
|
|
66
|
+
console.log(event.text);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Configuration
|
|
72
|
+
|
|
73
|
+
Create a `.env` file:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# Choose one or more providers
|
|
77
|
+
OPENAI_API_KEY=sk-xxx
|
|
78
|
+
ANTHROPIC_API_KEY=sk-ant-xxx
|
|
79
|
+
GOOGLE_API_KEY=xxx
|
|
80
|
+
|
|
81
|
+
# Optional: override provider/model
|
|
82
|
+
GENCODE_PROVIDER=anthropic
|
|
83
|
+
GENCODE_MODEL=claude-sonnet-4-20250514
|
|
84
|
+
|
|
85
|
+
# Optional proxy
|
|
86
|
+
HTTP_PROXY=http://proxy:3128
|
|
87
|
+
HTTPS_PROXY=http://proxy:3128
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Features
|
|
91
|
+
|
|
92
|
+
| Feature | Status |
|
|
93
|
+
|---------|--------|
|
|
94
|
+
| Multi-LLM Support (OpenAI/Anthropic/Gemini) | ✅ |
|
|
95
|
+
| Built-in Tools (Read/Write/Edit/Bash/Glob/Grep) | ✅ |
|
|
96
|
+
| Permission System (auto/confirm/deny) | ✅ |
|
|
97
|
+
| Agent Loop (multi-turn + tool calls) | ✅ |
|
|
98
|
+
| Streaming Output | ✅ |
|
|
99
|
+
| Interactive CLI | ✅ |
|
|
100
|
+
| Session Management | ✅ |
|
|
101
|
+
| Proxy Support | ✅ |
|
|
102
|
+
|
|
103
|
+
## Project Structure
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
src/
|
|
107
|
+
├── agent/ # Agent system (tool loop)
|
|
108
|
+
├── providers/ # LLM providers (OpenAI, Anthropic, Gemini)
|
|
109
|
+
├── tools/ # Built-in tools
|
|
110
|
+
├── permissions/ # Permission management
|
|
111
|
+
├── session/ # Session persistence
|
|
112
|
+
└── cli/ # Interactive CLI
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## License
|
|
116
|
+
|
|
117
|
+
MIT
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent - Core agent implementation with tool loop and session support
|
|
3
|
+
*/
|
|
4
|
+
import type { Message } from '../providers/types.js';
|
|
5
|
+
import { SessionManager } from '../session/index.js';
|
|
6
|
+
import type { AgentConfig, AgentEvent } from './types.js';
|
|
7
|
+
export declare class Agent {
|
|
8
|
+
private provider;
|
|
9
|
+
private registry;
|
|
10
|
+
private permissions;
|
|
11
|
+
private sessionManager;
|
|
12
|
+
private config;
|
|
13
|
+
private messages;
|
|
14
|
+
private sessionId;
|
|
15
|
+
constructor(config: AgentConfig);
|
|
16
|
+
/**
|
|
17
|
+
* Set permission confirmation callback
|
|
18
|
+
*/
|
|
19
|
+
setConfirmCallback(callback: (tool: string, input: unknown) => Promise<boolean>): void;
|
|
20
|
+
/**
|
|
21
|
+
* Get current session ID
|
|
22
|
+
*/
|
|
23
|
+
getSessionId(): string | null;
|
|
24
|
+
/**
|
|
25
|
+
* Get session manager for external access
|
|
26
|
+
*/
|
|
27
|
+
getSessionManager(): SessionManager;
|
|
28
|
+
/**
|
|
29
|
+
* Set the model to use
|
|
30
|
+
*/
|
|
31
|
+
setModel(model: string): void;
|
|
32
|
+
/**
|
|
33
|
+
* Get current model
|
|
34
|
+
*/
|
|
35
|
+
getModel(): string;
|
|
36
|
+
/**
|
|
37
|
+
* List available models from the provider API
|
|
38
|
+
*/
|
|
39
|
+
listModels(): Promise<{
|
|
40
|
+
id: string;
|
|
41
|
+
name: string;
|
|
42
|
+
}[]>;
|
|
43
|
+
/**
|
|
44
|
+
* Start a new session
|
|
45
|
+
*/
|
|
46
|
+
startSession(title?: string): Promise<string>;
|
|
47
|
+
/**
|
|
48
|
+
* Resume an existing session
|
|
49
|
+
*/
|
|
50
|
+
resumeSession(sessionId: string): Promise<boolean>;
|
|
51
|
+
/**
|
|
52
|
+
* Resume the most recent session
|
|
53
|
+
*/
|
|
54
|
+
resumeLatest(): Promise<boolean>;
|
|
55
|
+
/**
|
|
56
|
+
* Fork current session
|
|
57
|
+
*/
|
|
58
|
+
forkSession(title?: string): Promise<string | null>;
|
|
59
|
+
/**
|
|
60
|
+
* List all sessions
|
|
61
|
+
*/
|
|
62
|
+
listSessions(): Promise<import("../session/types.js").SessionListItem[]>;
|
|
63
|
+
/**
|
|
64
|
+
* Delete a session
|
|
65
|
+
*/
|
|
66
|
+
deleteSession(sessionId: string): Promise<boolean>;
|
|
67
|
+
/**
|
|
68
|
+
* Save current session
|
|
69
|
+
*/
|
|
70
|
+
saveSession(): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Run a single query through the agent
|
|
73
|
+
*/
|
|
74
|
+
run(prompt: string): AsyncGenerator<AgentEvent, void, unknown>;
|
|
75
|
+
/**
|
|
76
|
+
* Clear conversation history
|
|
77
|
+
*/
|
|
78
|
+
clearHistory(): void;
|
|
79
|
+
/**
|
|
80
|
+
* Get conversation history
|
|
81
|
+
*/
|
|
82
|
+
getHistory(): Message[];
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAe,OAAO,EAAqB,MAAM,uBAAuB,CAAC;AAIrF,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAa1D,qBAAa,KAAK;IAChB,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,SAAS,CAAuB;gBAE5B,MAAM,EAAE,WAAW;IAa/B;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAItF;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B;;OAEG;IACH,iBAAiB,IAAI,cAAc;IAInC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7B;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIlB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAI3D;;OAEG;IACG,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAcnD;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYxD;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAYtC;;OAEG;IACG,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAWzD;;OAEG;IACG,YAAY;IAIlB;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIxD;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAQlC;;OAEG;IACI,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC;IAsFrE;;OAEG;IACH,YAAY,IAAI,IAAI;IAKpB;;OAEG;IACH,UAAU,IAAI,OAAO,EAAE;CAGxB"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent - Core agent implementation with tool loop and session support
|
|
3
|
+
*/
|
|
4
|
+
import { createProvider } from '../providers/index.js';
|
|
5
|
+
import { createDefaultRegistry } from '../tools/index.js';
|
|
6
|
+
import { PermissionManager } from '../permissions/index.js';
|
|
7
|
+
import { SessionManager } from '../session/index.js';
|
|
8
|
+
const DEFAULT_SYSTEM_PROMPT = `You are a helpful AI assistant with access to tools for reading, writing, and executing code.
|
|
9
|
+
|
|
10
|
+
When using tools:
|
|
11
|
+
- Use Read to view file contents before editing
|
|
12
|
+
- Use Glob/Grep to find files
|
|
13
|
+
- Use Edit for precise changes (old_string must be unique)
|
|
14
|
+
- Use Write for new files or full rewrites
|
|
15
|
+
- Use Bash for commands, git operations, etc.
|
|
16
|
+
|
|
17
|
+
Be concise and focus on completing the user's task.`;
|
|
18
|
+
export class Agent {
|
|
19
|
+
provider;
|
|
20
|
+
registry;
|
|
21
|
+
permissions;
|
|
22
|
+
sessionManager;
|
|
23
|
+
config;
|
|
24
|
+
messages = [];
|
|
25
|
+
sessionId = null;
|
|
26
|
+
constructor(config) {
|
|
27
|
+
this.config = {
|
|
28
|
+
maxTurns: 10,
|
|
29
|
+
cwd: process.cwd(),
|
|
30
|
+
...config,
|
|
31
|
+
};
|
|
32
|
+
this.provider = createProvider({ provider: config.provider });
|
|
33
|
+
this.registry = createDefaultRegistry();
|
|
34
|
+
this.permissions = new PermissionManager(config.permissions);
|
|
35
|
+
this.sessionManager = new SessionManager();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Set permission confirmation callback
|
|
39
|
+
*/
|
|
40
|
+
setConfirmCallback(callback) {
|
|
41
|
+
this.permissions.setConfirmCallback(callback);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get current session ID
|
|
45
|
+
*/
|
|
46
|
+
getSessionId() {
|
|
47
|
+
return this.sessionId;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get session manager for external access
|
|
51
|
+
*/
|
|
52
|
+
getSessionManager() {
|
|
53
|
+
return this.sessionManager;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Set the model to use
|
|
57
|
+
*/
|
|
58
|
+
setModel(model) {
|
|
59
|
+
this.config.model = model;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get current model
|
|
63
|
+
*/
|
|
64
|
+
getModel() {
|
|
65
|
+
return this.config.model;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* List available models from the provider API
|
|
69
|
+
*/
|
|
70
|
+
async listModels() {
|
|
71
|
+
return this.provider.listModels();
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Start a new session
|
|
75
|
+
*/
|
|
76
|
+
async startSession(title) {
|
|
77
|
+
const session = await this.sessionManager.create({
|
|
78
|
+
provider: this.config.provider,
|
|
79
|
+
model: this.config.model,
|
|
80
|
+
cwd: this.config.cwd,
|
|
81
|
+
title,
|
|
82
|
+
});
|
|
83
|
+
this.sessionId = session.metadata.id;
|
|
84
|
+
this.messages = [];
|
|
85
|
+
return this.sessionId;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Resume an existing session
|
|
89
|
+
*/
|
|
90
|
+
async resumeSession(sessionId) {
|
|
91
|
+
const session = await this.sessionManager.load(sessionId);
|
|
92
|
+
if (!session) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
this.sessionId = session.metadata.id;
|
|
96
|
+
this.messages = session.messages;
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Resume the most recent session
|
|
101
|
+
*/
|
|
102
|
+
async resumeLatest() {
|
|
103
|
+
const session = await this.sessionManager.resumeLatest();
|
|
104
|
+
if (!session) {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
this.sessionId = session.metadata.id;
|
|
108
|
+
this.messages = session.messages;
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Fork current session
|
|
113
|
+
*/
|
|
114
|
+
async forkSession(title) {
|
|
115
|
+
if (!this.sessionId) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
const forked = await this.sessionManager.fork(this.sessionId, title);
|
|
119
|
+
this.sessionId = forked.metadata.id;
|
|
120
|
+
return this.sessionId;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* List all sessions
|
|
124
|
+
*/
|
|
125
|
+
async listSessions() {
|
|
126
|
+
return this.sessionManager.list();
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Delete a session
|
|
130
|
+
*/
|
|
131
|
+
async deleteSession(sessionId) {
|
|
132
|
+
return this.sessionManager.delete(sessionId);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Save current session
|
|
136
|
+
*/
|
|
137
|
+
async saveSession() {
|
|
138
|
+
const current = this.sessionManager.getCurrent();
|
|
139
|
+
if (current) {
|
|
140
|
+
current.messages = this.messages;
|
|
141
|
+
await this.sessionManager.save(current);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Run a single query through the agent
|
|
146
|
+
*/
|
|
147
|
+
async *run(prompt) {
|
|
148
|
+
// Auto-create session if none exists
|
|
149
|
+
if (!this.sessionId) {
|
|
150
|
+
await this.startSession();
|
|
151
|
+
}
|
|
152
|
+
// Add user message
|
|
153
|
+
const userMessage = { role: 'user', content: prompt };
|
|
154
|
+
this.messages.push(userMessage);
|
|
155
|
+
await this.sessionManager.addMessage(userMessage);
|
|
156
|
+
let turns = 0;
|
|
157
|
+
const maxTurns = this.config.maxTurns ?? 10;
|
|
158
|
+
while (turns < maxTurns) {
|
|
159
|
+
turns++;
|
|
160
|
+
// Get tool definitions
|
|
161
|
+
const toolDefs = this.registry.getDefinitions(this.config.tools);
|
|
162
|
+
// Call LLM
|
|
163
|
+
let response;
|
|
164
|
+
try {
|
|
165
|
+
response = await this.provider.complete({
|
|
166
|
+
model: this.config.model,
|
|
167
|
+
messages: this.messages,
|
|
168
|
+
tools: toolDefs,
|
|
169
|
+
systemPrompt: this.config.systemPrompt ?? DEFAULT_SYSTEM_PROMPT,
|
|
170
|
+
maxTokens: 4096,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
yield { type: 'error', error: error };
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
// Process response content
|
|
178
|
+
const toolCalls = [];
|
|
179
|
+
let textContent = '';
|
|
180
|
+
for (const content of response.content) {
|
|
181
|
+
if (content.type === 'text') {
|
|
182
|
+
textContent += content.text;
|
|
183
|
+
yield { type: 'text', text: content.text };
|
|
184
|
+
}
|
|
185
|
+
else if (content.type === 'tool_use') {
|
|
186
|
+
toolCalls.push({ id: content.id, name: content.name, input: content.input });
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Add assistant message and check if done
|
|
190
|
+
this.messages.push({ role: 'assistant', content: response.content });
|
|
191
|
+
await this.sessionManager.addMessage({ role: 'assistant', content: response.content });
|
|
192
|
+
if (response.stopReason !== 'tool_use' || toolCalls.length === 0) {
|
|
193
|
+
yield { type: 'done', text: textContent };
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
// Execute tool calls
|
|
197
|
+
const toolResults = [];
|
|
198
|
+
const cwd = this.config.cwd ?? process.cwd();
|
|
199
|
+
for (const call of toolCalls) {
|
|
200
|
+
yield { type: 'tool_start', id: call.id, name: call.name, input: call.input };
|
|
201
|
+
const allowed = await this.permissions.checkPermission(call.name, call.input);
|
|
202
|
+
const result = allowed
|
|
203
|
+
? await this.registry.execute(call.name, call.input, { cwd })
|
|
204
|
+
: { success: false, output: '', error: 'Permission denied by user' };
|
|
205
|
+
yield { type: 'tool_result', id: call.id, name: call.name, result };
|
|
206
|
+
toolResults.push({
|
|
207
|
+
type: 'tool_result',
|
|
208
|
+
toolUseId: call.id,
|
|
209
|
+
content: result.success ? result.output : (result.error ?? 'Unknown error'),
|
|
210
|
+
isError: !result.success,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
// Add tool results as user message
|
|
214
|
+
this.messages.push({ role: 'user', content: toolResults });
|
|
215
|
+
await this.sessionManager.addMessage({ role: 'user', content: toolResults });
|
|
216
|
+
}
|
|
217
|
+
yield { type: 'error', error: new Error(`Max turns (${maxTurns}) exceeded`) };
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Clear conversation history
|
|
221
|
+
*/
|
|
222
|
+
clearHistory() {
|
|
223
|
+
this.messages = [];
|
|
224
|
+
this.sessionManager.clearMessages();
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Get conversation history
|
|
228
|
+
*/
|
|
229
|
+
getHistory() {
|
|
230
|
+
return [...this.messages];
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Types
|
|
3
|
+
*/
|
|
4
|
+
import type { PermissionConfig } from '../permissions/types.js';
|
|
5
|
+
export interface AgentConfig {
|
|
6
|
+
provider: 'openai' | 'anthropic' | 'gemini';
|
|
7
|
+
model: string;
|
|
8
|
+
systemPrompt?: string;
|
|
9
|
+
tools?: string[];
|
|
10
|
+
cwd?: string;
|
|
11
|
+
maxTurns?: number;
|
|
12
|
+
permissions?: Partial<PermissionConfig>;
|
|
13
|
+
}
|
|
14
|
+
export interface AgentEventText {
|
|
15
|
+
type: 'text';
|
|
16
|
+
text: string;
|
|
17
|
+
}
|
|
18
|
+
export interface AgentEventToolStart {
|
|
19
|
+
type: 'tool_start';
|
|
20
|
+
id: string;
|
|
21
|
+
name: string;
|
|
22
|
+
input: unknown;
|
|
23
|
+
}
|
|
24
|
+
export interface AgentEventToolResult {
|
|
25
|
+
type: 'tool_result';
|
|
26
|
+
id: string;
|
|
27
|
+
name: string;
|
|
28
|
+
result: {
|
|
29
|
+
success: boolean;
|
|
30
|
+
output: string;
|
|
31
|
+
error?: string;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export interface AgentEventThinking {
|
|
35
|
+
type: 'thinking';
|
|
36
|
+
text: string;
|
|
37
|
+
}
|
|
38
|
+
export interface AgentEventError {
|
|
39
|
+
type: 'error';
|
|
40
|
+
error: Error;
|
|
41
|
+
}
|
|
42
|
+
export interface AgentEventDone {
|
|
43
|
+
type: 'done';
|
|
44
|
+
text: string;
|
|
45
|
+
}
|
|
46
|
+
export type AgentEvent = AgentEventText | AgentEventToolStart | AgentEventToolResult | AgentEventThinking | AgentEventError | AgentEventDone;
|
|
47
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACzC;AAGD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,YAAY,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,aAAa,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QACN,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,UAAU,GAClB,cAAc,GACd,mBAAmB,GACnB,oBAAoB,GACpB,kBAAkB,GAClB,eAAe,GACf,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AgentConfig } from '../../agent/types.js';
|
|
2
|
+
interface SettingsManager {
|
|
3
|
+
save: (settings: {
|
|
4
|
+
model?: string;
|
|
5
|
+
}) => Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
interface AppProps {
|
|
8
|
+
config: AgentConfig;
|
|
9
|
+
settingsManager?: SettingsManager;
|
|
10
|
+
resumeLatest?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function App({ config, settingsManager, resumeLatest }: AppProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=App.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../src/cli/components/App.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AA+BxD,UAAU,eAAe;IACvB,IAAI,EAAE,CAAC,QAAQ,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD;AAQD,UAAU,QAAQ;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAqED,wBAAgB,GAAG,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,EAAE,QAAQ,2CA2btE"}
|