gencode-ai 0.1.0 → 0.1.2
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/.gencode/settings.local.json +7 -0
- package/README.md +20 -102
- package/dist/agent/agent.d.ts +43 -2
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +90 -17
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/types.d.ts +9 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/cli/components/AllModelsSelector.d.ts +11 -0
- package/dist/cli/components/AllModelsSelector.d.ts.map +1 -0
- package/dist/cli/components/AllModelsSelector.js +153 -0
- package/dist/cli/components/AllModelsSelector.js.map +1 -0
- package/dist/cli/components/App.d.ts +8 -1
- package/dist/cli/components/App.d.ts.map +1 -1
- package/dist/cli/components/App.js +276 -40
- package/dist/cli/components/App.js.map +1 -1
- package/dist/cli/components/CommandSuggestions.d.ts.map +1 -1
- package/dist/cli/components/CommandSuggestions.js +3 -0
- package/dist/cli/components/CommandSuggestions.js.map +1 -1
- package/dist/cli/components/Header.d.ts +1 -1
- package/dist/cli/components/Header.d.ts.map +1 -1
- package/dist/cli/components/Header.js +4 -6
- package/dist/cli/components/Header.js.map +1 -1
- package/dist/cli/components/Logo.d.ts +1 -0
- package/dist/cli/components/Logo.d.ts.map +1 -1
- package/dist/cli/components/Logo.js +16 -3
- package/dist/cli/components/Logo.js.map +1 -1
- package/dist/cli/components/Messages.d.ts +17 -3
- package/dist/cli/components/Messages.d.ts.map +1 -1
- package/dist/cli/components/Messages.js +70 -18
- package/dist/cli/components/Messages.js.map +1 -1
- package/dist/cli/components/ModelSelector.d.ts +7 -7
- package/dist/cli/components/ModelSelector.d.ts.map +1 -1
- package/dist/cli/components/ModelSelector.js +116 -33
- package/dist/cli/components/ModelSelector.js.map +1 -1
- package/dist/cli/components/PermissionPrompt.d.ts +60 -0
- package/dist/cli/components/PermissionPrompt.d.ts.map +1 -0
- package/dist/cli/components/PermissionPrompt.js +192 -0
- package/dist/cli/components/PermissionPrompt.js.map +1 -0
- package/dist/cli/components/ProviderManager.d.ts +8 -0
- package/dist/cli/components/ProviderManager.d.ts.map +1 -0
- package/dist/cli/components/ProviderManager.js +280 -0
- package/dist/cli/components/ProviderManager.js.map +1 -0
- package/dist/cli/components/Spinner.d.ts +7 -2
- package/dist/cli/components/Spinner.d.ts.map +1 -1
- package/dist/cli/components/Spinner.js +116 -25
- package/dist/cli/components/Spinner.js.map +1 -1
- package/dist/cli/components/TodoList.d.ts +7 -0
- package/dist/cli/components/TodoList.d.ts.map +1 -0
- package/dist/cli/components/TodoList.js +34 -0
- package/dist/cli/components/TodoList.js.map +1 -0
- package/dist/cli/components/index.d.ts +1 -0
- package/dist/cli/components/index.d.ts.map +1 -1
- package/dist/cli/components/index.js +1 -0
- package/dist/cli/components/index.js.map +1 -1
- package/dist/cli/components/markdown.d.ts +9 -0
- package/dist/cli/components/markdown.d.ts.map +1 -0
- package/dist/cli/components/markdown.js +129 -0
- package/dist/cli/components/markdown.js.map +1 -0
- package/dist/cli/components/theme.d.ts +5 -0
- package/dist/cli/components/theme.d.ts.map +1 -1
- package/dist/cli/components/theme.js +7 -0
- package/dist/cli/components/theme.js.map +1 -1
- package/dist/cli/index.js +66 -12
- package/dist/cli/index.js.map +1 -1
- package/dist/config/index.d.ts +14 -4
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +19 -3
- package/dist/config/index.js.map +1 -1
- package/dist/config/levels.d.ts +49 -0
- package/dist/config/levels.d.ts.map +1 -0
- package/dist/config/levels.js +222 -0
- package/dist/config/levels.js.map +1 -0
- package/dist/config/loader.d.ts +46 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +153 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/manager.d.ts +115 -15
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/config/manager.js +260 -34
- package/dist/config/manager.js.map +1 -1
- package/dist/config/manager.test.d.ts +5 -0
- package/dist/config/manager.test.d.ts.map +1 -0
- package/dist/config/manager.test.js +192 -0
- package/dist/config/manager.test.js.map +1 -0
- package/dist/config/merger.d.ts +56 -0
- package/dist/config/merger.d.ts.map +1 -0
- package/dist/config/merger.js +177 -0
- package/dist/config/merger.js.map +1 -0
- package/dist/config/providers-config.d.ts +28 -0
- package/dist/config/providers-config.d.ts.map +1 -0
- package/dist/config/providers-config.js +79 -0
- package/dist/config/providers-config.js.map +1 -0
- package/dist/config/test-utils.d.ts +24 -0
- package/dist/config/test-utils.d.ts.map +1 -0
- package/dist/config/test-utils.js +55 -0
- package/dist/config/test-utils.js.map +1 -0
- package/dist/config/types.d.ts +108 -9
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +53 -2
- package/dist/config/types.js.map +1 -1
- package/dist/memory/import-resolver.d.ts +46 -0
- package/dist/memory/import-resolver.d.ts.map +1 -0
- package/dist/memory/import-resolver.js +117 -0
- package/dist/memory/import-resolver.js.map +1 -0
- package/dist/memory/index.d.ts +7 -6
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +7 -5
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/init-prompt.d.ts +22 -0
- package/dist/memory/init-prompt.d.ts.map +1 -0
- package/dist/memory/init-prompt.js +103 -0
- package/dist/memory/init-prompt.js.map +1 -0
- package/dist/memory/memory-manager.d.ts +119 -0
- package/dist/memory/memory-manager.d.ts.map +1 -0
- package/dist/memory/memory-manager.js +587 -0
- package/dist/memory/memory-manager.js.map +1 -0
- package/dist/memory/rules-parser.d.ts +38 -0
- package/dist/memory/rules-parser.d.ts.map +1 -0
- package/dist/memory/rules-parser.js +69 -0
- package/dist/memory/rules-parser.js.map +1 -0
- package/dist/memory/test-utils.d.ts +20 -0
- package/dist/memory/test-utils.d.ts.map +1 -0
- package/dist/memory/test-utils.js +44 -0
- package/dist/memory/test-utils.js.map +1 -0
- package/dist/memory/types.d.ts +70 -63
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +42 -2
- package/dist/memory/types.js.map +1 -1
- package/dist/permissions/audit.d.ts +82 -0
- package/dist/permissions/audit.d.ts.map +1 -0
- package/dist/permissions/audit.js +229 -0
- package/dist/permissions/audit.js.map +1 -0
- package/dist/permissions/index.d.ts +11 -1
- package/dist/permissions/index.d.ts.map +1 -1
- package/dist/permissions/index.js +15 -0
- package/dist/permissions/index.js.map +1 -1
- package/dist/permissions/manager.d.ts +149 -13
- package/dist/permissions/manager.d.ts.map +1 -1
- package/dist/permissions/manager.js +480 -35
- package/dist/permissions/manager.js.map +1 -1
- package/dist/permissions/manager.test.d.ts +5 -0
- package/dist/permissions/manager.test.d.ts.map +1 -0
- package/dist/permissions/manager.test.js +213 -0
- package/dist/permissions/manager.test.js.map +1 -0
- package/dist/permissions/persistence.d.ts +74 -0
- package/dist/permissions/persistence.d.ts.map +1 -0
- package/dist/permissions/persistence.js +248 -0
- package/dist/permissions/persistence.js.map +1 -0
- package/dist/permissions/persistence.test.d.ts +5 -0
- package/dist/permissions/persistence.test.d.ts.map +1 -0
- package/dist/permissions/persistence.test.js +171 -0
- package/dist/permissions/persistence.test.js.map +1 -0
- package/dist/permissions/prompt-matcher.d.ts +64 -0
- package/dist/permissions/prompt-matcher.d.ts.map +1 -0
- package/dist/permissions/prompt-matcher.js +415 -0
- package/dist/permissions/prompt-matcher.js.map +1 -0
- package/dist/permissions/prompt-matcher.test.d.ts +5 -0
- package/dist/permissions/prompt-matcher.test.d.ts.map +1 -0
- package/dist/permissions/prompt-matcher.test.js +107 -0
- package/dist/permissions/prompt-matcher.test.js.map +1 -0
- package/dist/permissions/types.d.ts +157 -0
- package/dist/permissions/types.d.ts.map +1 -1
- package/dist/permissions/types.js +43 -8
- package/dist/permissions/types.js.map +1 -1
- package/dist/prompts/index.d.ts +92 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +241 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/providers/gemini.d.ts.map +1 -1
- package/dist/providers/gemini.js +14 -3
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/index.d.ts +5 -3
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +13 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/registry.d.ts +66 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +158 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/search/brave.d.ts +14 -0
- package/dist/providers/search/brave.d.ts.map +1 -0
- package/dist/providers/search/brave.js +87 -0
- package/dist/providers/search/brave.js.map +1 -0
- package/dist/providers/search/exa.d.ts +12 -0
- package/dist/providers/search/exa.d.ts.map +1 -0
- package/dist/providers/search/exa.js +158 -0
- package/dist/providers/search/exa.js.map +1 -0
- package/dist/providers/search/index.d.ts +31 -0
- package/dist/providers/search/index.d.ts.map +1 -0
- package/dist/providers/search/index.js +75 -0
- package/dist/providers/search/index.js.map +1 -0
- package/dist/providers/search/serper.d.ts +14 -0
- package/dist/providers/search/serper.d.ts.map +1 -0
- package/dist/providers/search/serper.js +87 -0
- package/dist/providers/search/serper.js.map +1 -0
- package/dist/providers/search/types.d.ts +21 -0
- package/dist/providers/search/types.d.ts.map +1 -0
- package/dist/providers/search/types.js +5 -0
- package/dist/providers/search/types.js.map +1 -0
- package/dist/providers/store.d.ts +104 -0
- package/dist/providers/store.d.ts.map +1 -0
- package/dist/providers/store.js +171 -0
- package/dist/providers/store.js.map +1 -0
- package/dist/providers/types.d.ts +7 -1
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/vertex-ai.d.ts +33 -0
- package/dist/providers/vertex-ai.d.ts.map +1 -0
- package/dist/providers/vertex-ai.js +407 -0
- package/dist/providers/vertex-ai.js.map +1 -0
- package/dist/tools/builtin/bash.d.ts.map +1 -1
- package/dist/tools/builtin/bash.js +2 -1
- package/dist/tools/builtin/bash.js.map +1 -1
- package/dist/tools/builtin/edit.d.ts.map +1 -1
- package/dist/tools/builtin/edit.js +2 -1
- package/dist/tools/builtin/edit.js.map +1 -1
- package/dist/tools/builtin/glob.d.ts.map +1 -1
- package/dist/tools/builtin/glob.js +2 -1
- package/dist/tools/builtin/glob.js.map +1 -1
- package/dist/tools/builtin/grep.d.ts.map +1 -1
- package/dist/tools/builtin/grep.js +2 -1
- package/dist/tools/builtin/grep.js.map +1 -1
- package/dist/tools/builtin/read.d.ts.map +1 -1
- package/dist/tools/builtin/read.js +2 -1
- package/dist/tools/builtin/read.js.map +1 -1
- package/dist/tools/builtin/todowrite.d.ts +15 -0
- package/dist/tools/builtin/todowrite.d.ts.map +1 -0
- package/dist/tools/builtin/todowrite.js +88 -0
- package/dist/tools/builtin/todowrite.js.map +1 -0
- package/dist/tools/builtin/webfetch.d.ts +20 -0
- package/dist/tools/builtin/webfetch.d.ts.map +1 -0
- package/dist/tools/builtin/webfetch.js +228 -0
- package/dist/tools/builtin/webfetch.js.map +1 -0
- package/dist/tools/builtin/websearch.d.ts +17 -0
- package/dist/tools/builtin/websearch.d.ts.map +1 -0
- package/dist/tools/builtin/websearch.js +87 -0
- package/dist/tools/builtin/websearch.js.map +1 -0
- package/dist/tools/builtin/write.d.ts.map +1 -1
- package/dist/tools/builtin/write.js +2 -1
- package/dist/tools/builtin/write.js.map +1 -1
- package/dist/tools/index.d.ts +18 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +28 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/types.d.ts +41 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +16 -0
- package/dist/tools/types.js.map +1 -1
- package/dist/tools/utils/ssrf.d.ts +18 -0
- package/dist/tools/utils/ssrf.d.ts.map +1 -0
- package/dist/tools/utils/ssrf.js +70 -0
- package/dist/tools/utils/ssrf.js.map +1 -0
- package/docs/README.md +5 -4
- package/docs/config-system-comparison.md +707 -0
- package/docs/memory-system.md +238 -0
- package/docs/permissions.md +368 -0
- package/docs/proposals/0001-web-fetch-tool.md +32 -2
- package/docs/proposals/0002-web-search-tool.md +59 -2
- package/docs/proposals/0005-todo-system.md +350 -85
- package/docs/proposals/0006-memory-system.md +11 -10
- package/docs/proposals/0012-ask-user-question.md +941 -206
- package/docs/proposals/0023-permission-enhancements.md +61 -2
- package/docs/proposals/0041-configuration-system.md +587 -0
- package/docs/proposals/0042-prompt-optimization.md +866 -0
- package/docs/proposals/README.md +8 -6
- package/docs/providers.md +220 -0
- package/jest.config.js +26 -0
- package/package.json +14 -3
- package/src/agent/agent.ts +120 -18
- package/src/agent/types.ts +9 -1
- package/src/cli/components/App.tsx +369 -47
- package/src/cli/components/CommandSuggestions.tsx +3 -0
- package/src/cli/components/Header.tsx +11 -17
- package/src/cli/components/Logo.tsx +76 -9
- package/src/cli/components/Messages.tsx +146 -38
- package/src/cli/components/ModelSelector.tsx +169 -52
- package/src/cli/components/PermissionPrompt.tsx +388 -0
- package/src/cli/components/ProviderManager.tsx +534 -0
- package/src/cli/components/Spinner.tsx +138 -25
- package/src/cli/components/TodoList.tsx +54 -0
- package/src/cli/components/index.ts +6 -0
- package/src/cli/components/markdown.ts +157 -0
- package/src/cli/components/theme.ts +7 -0
- package/src/cli/index.tsx +76 -13
- package/src/config/index.ts +79 -4
- package/src/config/levels.test.ts +163 -0
- package/src/config/levels.ts +285 -0
- package/src/config/loader.test.ts +120 -0
- package/src/config/loader.ts +178 -0
- package/src/config/manager.test.ts +215 -0
- package/src/config/manager.ts +328 -40
- package/src/config/merger.test.ts +360 -0
- package/src/config/merger.ts +221 -0
- package/src/config/providers-config.ts +85 -0
- package/src/config/test-utils.ts +79 -0
- package/src/config/types.ts +186 -9
- package/src/memory/import-resolver.test.ts +117 -0
- package/src/memory/import-resolver.ts +149 -0
- package/src/memory/index.ts +11 -0
- package/src/memory/init-prompt.ts +113 -0
- package/src/memory/memory-manager.test.ts +198 -0
- package/src/memory/memory-manager.ts +716 -0
- package/src/memory/rules-parser.test.ts +182 -0
- package/src/memory/rules-parser.ts +82 -0
- package/src/memory/test-utils.ts +60 -0
- package/src/memory/types.ts +119 -0
- package/src/permissions/audit.ts +284 -0
- package/src/permissions/index.ts +20 -1
- package/src/permissions/manager.test.ts +260 -0
- package/src/permissions/manager.ts +592 -40
- package/src/permissions/persistence.test.ts +220 -0
- package/src/permissions/persistence.ts +301 -0
- package/src/permissions/prompt-matcher.test.ts +213 -0
- package/src/permissions/prompt-matcher.ts +472 -0
- package/src/permissions/types.ts +236 -8
- package/src/prompts/index.test.ts +279 -0
- package/src/prompts/index.ts +306 -0
- package/src/prompts/system/anthropic.txt +29 -0
- package/src/prompts/system/base.txt +124 -0
- package/src/prompts/system/gemini.txt +35 -0
- package/src/prompts/system/generic.txt +128 -0
- package/src/prompts/system/openai.txt +29 -0
- package/src/prompts/tools/bash.txt +60 -0
- package/src/prompts/tools/edit.txt +29 -0
- package/src/prompts/tools/glob.txt +35 -0
- package/src/prompts/tools/grep.txt +43 -0
- package/src/prompts/tools/read.txt +22 -0
- package/src/prompts/tools/todowrite.txt +71 -0
- package/src/prompts/tools/webfetch.txt +34 -0
- package/src/prompts/tools/websearch.txt +41 -0
- package/src/prompts/tools/write.txt +23 -0
- package/src/providers/gemini.ts +20 -4
- package/src/providers/index.ts +18 -3
- package/src/providers/registry.ts +198 -0
- package/src/providers/search/brave.ts +132 -0
- package/src/providers/search/exa.ts +217 -0
- package/src/providers/search/index.ts +79 -0
- package/src/providers/search/serper.ts +133 -0
- package/src/providers/search/types.ts +24 -0
- package/src/providers/store.ts +216 -0
- package/src/providers/types.ts +9 -1
- package/src/providers/vertex-ai.ts +594 -0
- package/src/tools/builtin/bash.ts +2 -1
- package/src/tools/builtin/edit.ts +2 -1
- package/src/tools/builtin/glob.ts +2 -1
- package/src/tools/builtin/grep.ts +2 -1
- package/src/tools/builtin/read.ts +2 -1
- package/src/tools/builtin/todowrite.ts +102 -0
- package/src/tools/builtin/webfetch.ts +261 -0
- package/src/tools/builtin/websearch.ts +103 -0
- package/src/tools/builtin/write.ts +2 -1
- package/src/tools/index.ts +28 -2
- package/src/tools/types.ts +32 -0
- package/src/tools/utils/ssrf.ts +79 -0
- package/tsconfig.json +1 -1
- package/CLAUDE.md +0 -70
package/README.md
CHANGED
|
@@ -1,116 +1,34 @@
|
|
|
1
1
|
# GenCode
|
|
2
2
|
|
|
3
|
-
An open-source
|
|
3
|
+
An open-source AI assistant for your terminal.
|
|
4
4
|
|
|
5
|
-
##
|
|
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:
|
|
5
|
+
## Features
|
|
10
6
|
|
|
11
|
-
- **
|
|
12
|
-
- **
|
|
13
|
-
- **
|
|
14
|
-
- **Keep the experience** - Same intuitive CLI workflow inspired by Claude Code
|
|
7
|
+
- **Extensible** - Modular tool system and customizable prompts
|
|
8
|
+
- **Multi-provider** - OpenAI, Anthropic, Gemini, or OpenAI-compatible APIs
|
|
9
|
+
- **Minimal** - Simple, focused, easy to extend
|
|
15
10
|
|
|
16
11
|
## Quick Start
|
|
17
12
|
|
|
18
13
|
```bash
|
|
19
|
-
|
|
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
|
|
14
|
+
npm install -g gencode-ai
|
|
45
15
|
gencode
|
|
46
|
-
|
|
47
|
-
# Resume last session
|
|
48
|
-
gencode -c
|
|
49
|
-
|
|
50
|
-
# Select from recent sessions
|
|
51
|
-
gencode -r
|
|
52
16
|
```
|
|
53
17
|
|
|
54
|
-
###
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
```
|
|
18
|
+
### Details
|
|
19
|
+
|
|
20
|
+
- [**Multi-Provider Support**](./docs/providers.md) - Flexible provider configuration via `/provider` command
|
|
21
|
+
- [LLM Providers](./docs/providers.md#llm-providers) - OpenAI, Anthropic, Google Gemini, Vertex AI
|
|
22
|
+
- [Search Providers](./docs/providers.md#search-providers) - Exa AI (default), Serper.dev, Brave Search
|
|
23
|
+
- **Built-in Tools** - Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch
|
|
24
|
+
- **Agent Loop** - Multi-turn conversations with tool calls
|
|
25
|
+
- **Session Management** - Persist and resume conversations
|
|
26
|
+
- **Interactive CLI** - Fuzzy search, command suggestions, streaming output
|
|
27
|
+
- [**Permission System**](./docs/permissions.md) - Claude Code compatible permission management
|
|
28
|
+
- Pattern-based rules (`Bash(git add:*)`)
|
|
29
|
+
- Prompt-based permissions ("run tests", "install dependencies")
|
|
30
|
+
- Session/project/global scopes
|
|
31
|
+
- Persistent allowlists and audit logging
|
|
114
32
|
|
|
115
33
|
## License
|
|
116
34
|
|
package/dist/agent/agent.d.ts
CHANGED
|
@@ -2,21 +2,62 @@
|
|
|
2
2
|
* Agent - Core agent implementation with tool loop and session support
|
|
3
3
|
*/
|
|
4
4
|
import type { Message } from '../providers/types.js';
|
|
5
|
+
import { PermissionManager, type ApprovalAction, type ApprovalSuggestion, type PromptPermission, type PermissionSettings } from '../permissions/index.js';
|
|
5
6
|
import { SessionManager } from '../session/index.js';
|
|
7
|
+
import { MemoryManager, type LoadedMemory } from '../memory/index.js';
|
|
6
8
|
import type { AgentConfig, AgentEvent } from './types.js';
|
|
7
9
|
export declare class Agent {
|
|
8
10
|
private provider;
|
|
9
11
|
private registry;
|
|
10
12
|
private permissions;
|
|
11
13
|
private sessionManager;
|
|
14
|
+
private memoryManager;
|
|
12
15
|
private config;
|
|
13
16
|
private messages;
|
|
14
17
|
private sessionId;
|
|
18
|
+
private loadedMemory;
|
|
15
19
|
constructor(config: AgentConfig);
|
|
16
20
|
/**
|
|
17
|
-
*
|
|
21
|
+
* Initialize permission system (load persisted rules)
|
|
22
|
+
*/
|
|
23
|
+
initializePermissions(settings?: PermissionSettings): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Set simple permission confirmation callback (backward compatible)
|
|
18
26
|
*/
|
|
19
27
|
setConfirmCallback(callback: (tool: string, input: unknown) => Promise<boolean>): void;
|
|
28
|
+
/**
|
|
29
|
+
* Set enhanced permission confirmation callback with approval options
|
|
30
|
+
*/
|
|
31
|
+
setEnhancedConfirmCallback(callback: (tool: string, input: unknown, suggestions: ApprovalSuggestion[]) => Promise<ApprovalAction>): void;
|
|
32
|
+
/**
|
|
33
|
+
* Add prompt-based permissions (Claude Code ExitPlanMode style)
|
|
34
|
+
*/
|
|
35
|
+
addAllowedPrompts(prompts: PromptPermission[]): void;
|
|
36
|
+
/**
|
|
37
|
+
* Clear prompt-based permissions
|
|
38
|
+
*/
|
|
39
|
+
clearAllowedPrompts(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Set callback to save permission rules to settings
|
|
42
|
+
* This enables saving rules to settings.local.json instead of permissions.json
|
|
43
|
+
*/
|
|
44
|
+
setSaveRuleCallback(callback: (tool: string, pattern?: string) => Promise<void>): void;
|
|
45
|
+
/**
|
|
46
|
+
* Get permission manager for direct access
|
|
47
|
+
*/
|
|
48
|
+
getPermissionManager(): PermissionManager;
|
|
49
|
+
/**
|
|
50
|
+
* Get memory manager for direct access
|
|
51
|
+
*/
|
|
52
|
+
getMemoryManager(): MemoryManager;
|
|
53
|
+
/**
|
|
54
|
+
* Get loaded memory (null if not loaded yet)
|
|
55
|
+
*/
|
|
56
|
+
getLoadedMemory(): LoadedMemory | null;
|
|
57
|
+
/**
|
|
58
|
+
* Load memory for the current working directory
|
|
59
|
+
*/
|
|
60
|
+
loadMemory(): Promise<LoadedMemory>;
|
|
20
61
|
/**
|
|
21
62
|
* Get current session ID
|
|
22
63
|
*/
|
|
@@ -26,7 +67,7 @@ export declare class Agent {
|
|
|
26
67
|
*/
|
|
27
68
|
getSessionManager(): SessionManager;
|
|
28
69
|
/**
|
|
29
|
-
* Set the model to use
|
|
70
|
+
* Set the model to use (auto-switches provider if needed)
|
|
30
71
|
*/
|
|
31
72
|
setModel(model: string): void;
|
|
32
73
|
/**
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/agent.js
CHANGED
|
@@ -1,28 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Agent - Core agent implementation with tool loop and session support
|
|
3
3
|
*/
|
|
4
|
-
import { createProvider } from '../providers/index.js';
|
|
4
|
+
import { createProvider, inferProvider } from '../providers/index.js';
|
|
5
5
|
import { createDefaultRegistry } from '../tools/index.js';
|
|
6
|
-
import { PermissionManager } from '../permissions/index.js';
|
|
6
|
+
import { PermissionManager, } from '../permissions/index.js';
|
|
7
7
|
import { SessionManager } from '../session/index.js';
|
|
8
|
-
|
|
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.`;
|
|
8
|
+
import { MemoryManager } from '../memory/index.js';
|
|
9
|
+
import { buildSystemPromptForModel, debugPromptLoading } from '../prompts/index.js';
|
|
18
10
|
export class Agent {
|
|
19
11
|
provider;
|
|
20
12
|
registry;
|
|
21
13
|
permissions;
|
|
22
14
|
sessionManager;
|
|
15
|
+
memoryManager;
|
|
23
16
|
config;
|
|
24
17
|
messages = [];
|
|
25
18
|
sessionId = null;
|
|
19
|
+
loadedMemory = null;
|
|
26
20
|
constructor(config) {
|
|
27
21
|
this.config = {
|
|
28
22
|
maxTurns: 10,
|
|
@@ -31,15 +25,76 @@ export class Agent {
|
|
|
31
25
|
};
|
|
32
26
|
this.provider = createProvider({ provider: config.provider });
|
|
33
27
|
this.registry = createDefaultRegistry();
|
|
34
|
-
this.permissions = new PermissionManager(
|
|
28
|
+
this.permissions = new PermissionManager({
|
|
29
|
+
config: config.permissions,
|
|
30
|
+
projectPath: config.cwd,
|
|
31
|
+
});
|
|
35
32
|
this.sessionManager = new SessionManager();
|
|
33
|
+
this.memoryManager = new MemoryManager();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Initialize permission system (load persisted rules)
|
|
37
|
+
*/
|
|
38
|
+
async initializePermissions(settings) {
|
|
39
|
+
await this.permissions.initialize(settings);
|
|
36
40
|
}
|
|
37
41
|
/**
|
|
38
|
-
* Set permission confirmation callback
|
|
42
|
+
* Set simple permission confirmation callback (backward compatible)
|
|
39
43
|
*/
|
|
40
44
|
setConfirmCallback(callback) {
|
|
45
|
+
this.permissions.setSimpleConfirmCallback(callback);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Set enhanced permission confirmation callback with approval options
|
|
49
|
+
*/
|
|
50
|
+
setEnhancedConfirmCallback(callback) {
|
|
41
51
|
this.permissions.setConfirmCallback(callback);
|
|
42
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Add prompt-based permissions (Claude Code ExitPlanMode style)
|
|
55
|
+
*/
|
|
56
|
+
addAllowedPrompts(prompts) {
|
|
57
|
+
this.permissions.addAllowedPrompts(prompts);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Clear prompt-based permissions
|
|
61
|
+
*/
|
|
62
|
+
clearAllowedPrompts() {
|
|
63
|
+
this.permissions.clearAllowedPrompts();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Set callback to save permission rules to settings
|
|
67
|
+
* This enables saving rules to settings.local.json instead of permissions.json
|
|
68
|
+
*/
|
|
69
|
+
setSaveRuleCallback(callback) {
|
|
70
|
+
this.permissions.setSaveRuleCallback(callback);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get permission manager for direct access
|
|
74
|
+
*/
|
|
75
|
+
getPermissionManager() {
|
|
76
|
+
return this.permissions;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get memory manager for direct access
|
|
80
|
+
*/
|
|
81
|
+
getMemoryManager() {
|
|
82
|
+
return this.memoryManager;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get loaded memory (null if not loaded yet)
|
|
86
|
+
*/
|
|
87
|
+
getLoadedMemory() {
|
|
88
|
+
return this.loadedMemory;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Load memory for the current working directory
|
|
92
|
+
*/
|
|
93
|
+
async loadMemory() {
|
|
94
|
+
const cwd = this.config.cwd ?? process.cwd();
|
|
95
|
+
this.loadedMemory = await this.memoryManager.load({ cwd });
|
|
96
|
+
return this.loadedMemory;
|
|
97
|
+
}
|
|
43
98
|
/**
|
|
44
99
|
* Get current session ID
|
|
45
100
|
*/
|
|
@@ -53,10 +108,16 @@ export class Agent {
|
|
|
53
108
|
return this.sessionManager;
|
|
54
109
|
}
|
|
55
110
|
/**
|
|
56
|
-
* Set the model to use
|
|
111
|
+
* Set the model to use (auto-switches provider if needed)
|
|
57
112
|
*/
|
|
58
113
|
setModel(model) {
|
|
59
114
|
this.config.model = model;
|
|
115
|
+
// Auto-switch provider based on model name
|
|
116
|
+
const newProvider = inferProvider(model);
|
|
117
|
+
if (newProvider !== this.config.provider) {
|
|
118
|
+
this.config.provider = newProvider;
|
|
119
|
+
this.provider = createProvider({ provider: newProvider });
|
|
120
|
+
}
|
|
60
121
|
}
|
|
61
122
|
/**
|
|
62
123
|
* Get current model
|
|
@@ -149,6 +210,10 @@ export class Agent {
|
|
|
149
210
|
if (!this.sessionId) {
|
|
150
211
|
await this.startSession();
|
|
151
212
|
}
|
|
213
|
+
// Load memory if not already loaded
|
|
214
|
+
if (!this.loadedMemory) {
|
|
215
|
+
await this.loadMemory();
|
|
216
|
+
}
|
|
152
217
|
// Add user message
|
|
153
218
|
const userMessage = { role: 'user', content: prompt };
|
|
154
219
|
this.messages.push(userMessage);
|
|
@@ -162,11 +227,19 @@ export class Agent {
|
|
|
162
227
|
// Call LLM
|
|
163
228
|
let response;
|
|
164
229
|
try {
|
|
230
|
+
// Debug prompt loading (enabled with GENCODE_DEBUG_PROMPTS=1)
|
|
231
|
+
debugPromptLoading(this.config.model, this.config.provider);
|
|
232
|
+
// Build system prompt based on model → provider → prompt flow
|
|
233
|
+
// Looks up provider from ~/.gencode/providers.json, falls back to config.provider
|
|
234
|
+
const systemPrompt = this.config.systemPrompt ??
|
|
235
|
+
buildSystemPromptForModel(this.config.model, this.config.cwd ?? process.cwd(), true, // Assume git repo for now
|
|
236
|
+
this.loadedMemory?.context, this.config.provider // Fallback provider if model lookup fails
|
|
237
|
+
);
|
|
165
238
|
response = await this.provider.complete({
|
|
166
239
|
model: this.config.model,
|
|
167
240
|
messages: this.messages,
|
|
168
241
|
tools: toolDefs,
|
|
169
|
-
systemPrompt
|
|
242
|
+
systemPrompt,
|
|
170
243
|
maxTokens: 4096,
|
|
171
244
|
});
|
|
172
245
|
}
|
|
@@ -198,7 +271,7 @@ export class Agent {
|
|
|
198
271
|
const cwd = this.config.cwd ?? process.cwd();
|
|
199
272
|
for (const call of toolCalls) {
|
|
200
273
|
yield { type: 'tool_start', id: call.id, name: call.name, input: call.input };
|
|
201
|
-
const allowed = await this.permissions.
|
|
274
|
+
const allowed = await this.permissions.requestPermission(call.name, call.input);
|
|
202
275
|
const result = allowed
|
|
203
276
|
? await this.registry.execute(call.name, call.input, { cwd })
|
|
204
277
|
: { success: false, output: '', error: 'Permission denied by user' };
|
package/dist/agent/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/types.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import type { PermissionConfig } from '../permissions/types.js';
|
|
5
5
|
export interface AgentConfig {
|
|
6
|
-
provider: 'openai' | 'anthropic' | 'gemini';
|
|
6
|
+
provider: 'openai' | 'anthropic' | 'gemini' | 'vertex-ai';
|
|
7
7
|
model: string;
|
|
8
8
|
systemPrompt?: string;
|
|
9
9
|
tools?: string[];
|
|
@@ -29,6 +29,14 @@ export interface AgentEventToolResult {
|
|
|
29
29
|
success: boolean;
|
|
30
30
|
output: string;
|
|
31
31
|
error?: string;
|
|
32
|
+
metadata?: {
|
|
33
|
+
title?: string;
|
|
34
|
+
subtitle?: string;
|
|
35
|
+
size?: number;
|
|
36
|
+
statusCode?: number;
|
|
37
|
+
contentType?: string;
|
|
38
|
+
duration?: number;
|
|
39
|
+
};
|
|
32
40
|
};
|
|
33
41
|
}
|
|
34
42
|
export interface AgentEventThinking {
|
|
@@ -1 +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;
|
|
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,GAAG,WAAW,CAAC;IAC1D,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;QACf,QAAQ,CAAC,EAAE;YACT,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,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,11 @@
|
|
|
1
|
+
import type { ProviderModels, ProviderName } from '../../providers/index.js';
|
|
2
|
+
interface AllModelsSelectorProps {
|
|
3
|
+
currentModel: string;
|
|
4
|
+
currentProvider: ProviderName;
|
|
5
|
+
onSelect: (modelId: string, provider: ProviderName) => void;
|
|
6
|
+
onCancel: () => void;
|
|
7
|
+
listAllModels: () => Promise<ProviderModels[]>;
|
|
8
|
+
}
|
|
9
|
+
export declare function AllModelsSelector({ currentModel, currentProvider, onSelect, onCancel, listAllModels, }: AllModelsSelectorProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=AllModelsSelector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AllModelsSelector.d.ts","sourceRoot":"","sources":["../../../src/cli/components/AllModelsSelector.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAO7E,UAAU,sBAAsB;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,YAAY,CAAC;IAC9B,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAC5D,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,aAAa,EAAE,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;CAChD;AAkBD,wBAAgB,iBAAiB,CAAC,EAChC,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,aAAa,GACd,EAAE,sBAAsB,2CAmOxB"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* All Models Selector Component - Multi-provider model selection with grouping
|
|
4
|
+
*/
|
|
5
|
+
import { useState, useEffect, useMemo } from 'react';
|
|
6
|
+
import { Box, Text, useInput } from 'ink';
|
|
7
|
+
import TextInput from 'ink-text-input';
|
|
8
|
+
import { colors, icons } from './theme.js';
|
|
9
|
+
import { LoadingSpinner } from './Spinner.js';
|
|
10
|
+
// Provider display names
|
|
11
|
+
const providerDisplayNames = {
|
|
12
|
+
openai: 'OpenAI',
|
|
13
|
+
anthropic: 'Anthropic',
|
|
14
|
+
gemini: 'Gemini',
|
|
15
|
+
'vertex-ai': 'Vertex AI',
|
|
16
|
+
};
|
|
17
|
+
export function AllModelsSelector({ currentModel, currentProvider, onSelect, onCancel, listAllModels, }) {
|
|
18
|
+
const [providerData, setProviderData] = useState([]);
|
|
19
|
+
const [loading, setLoading] = useState(true);
|
|
20
|
+
const [filter, setFilter] = useState('');
|
|
21
|
+
const [selectedIndex, setSelectedIndex] = useState(0);
|
|
22
|
+
const [expanded, setExpanded] = useState(new Set([currentProvider]));
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
const fetchModels = async () => {
|
|
25
|
+
try {
|
|
26
|
+
const result = await listAllModels();
|
|
27
|
+
setProviderData(result);
|
|
28
|
+
// Expand providers that have models
|
|
29
|
+
const withModels = new Set(result
|
|
30
|
+
.filter((p) => p.models.length > 0 && !p.error)
|
|
31
|
+
.map((p) => p.provider));
|
|
32
|
+
// Always expand current provider
|
|
33
|
+
withModels.add(currentProvider);
|
|
34
|
+
setExpanded(withModels);
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
setLoading(false);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
fetchModels();
|
|
41
|
+
}, [listAllModels, currentProvider]);
|
|
42
|
+
// Build flat list for navigation
|
|
43
|
+
const listItems = useMemo(() => {
|
|
44
|
+
const items = [];
|
|
45
|
+
const filterLower = filter.toLowerCase();
|
|
46
|
+
for (const pd of providerData) {
|
|
47
|
+
const isExpanded = expanded.has(pd.provider);
|
|
48
|
+
// Filter models
|
|
49
|
+
const filteredModels = pd.models.filter((m) => !filter ||
|
|
50
|
+
m.id.toLowerCase().includes(filterLower) ||
|
|
51
|
+
m.name.toLowerCase().includes(filterLower) ||
|
|
52
|
+
providerDisplayNames[pd.provider].toLowerCase().includes(filterLower));
|
|
53
|
+
// Skip provider if no matching models and filter is active
|
|
54
|
+
if (filter && filteredModels.length === 0) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
// Add provider header
|
|
58
|
+
items.push({
|
|
59
|
+
type: 'provider',
|
|
60
|
+
provider: pd.provider,
|
|
61
|
+
expanded: isExpanded,
|
|
62
|
+
});
|
|
63
|
+
// Add models if expanded
|
|
64
|
+
if (isExpanded) {
|
|
65
|
+
for (const model of filter ? filteredModels : pd.models) {
|
|
66
|
+
items.push({
|
|
67
|
+
type: 'model',
|
|
68
|
+
provider: pd.provider,
|
|
69
|
+
model,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return items;
|
|
75
|
+
}, [providerData, expanded, filter]);
|
|
76
|
+
// Reset selection when filter changes
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
setSelectedIndex(0);
|
|
79
|
+
}, [filter]);
|
|
80
|
+
// Keep selection in bounds
|
|
81
|
+
useEffect(() => {
|
|
82
|
+
if (selectedIndex >= listItems.length && listItems.length > 0) {
|
|
83
|
+
setSelectedIndex(listItems.length - 1);
|
|
84
|
+
}
|
|
85
|
+
}, [listItems.length, selectedIndex]);
|
|
86
|
+
// Toggle provider expansion
|
|
87
|
+
const toggleProvider = (provider) => {
|
|
88
|
+
setExpanded((prev) => {
|
|
89
|
+
const next = new Set(prev);
|
|
90
|
+
if (next.has(provider)) {
|
|
91
|
+
next.delete(provider);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
next.add(provider);
|
|
95
|
+
}
|
|
96
|
+
return next;
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
// Keyboard navigation
|
|
100
|
+
useInput((input, key) => {
|
|
101
|
+
if (key.upArrow) {
|
|
102
|
+
setSelectedIndex((i) => Math.max(0, i - 1));
|
|
103
|
+
}
|
|
104
|
+
else if (key.downArrow) {
|
|
105
|
+
setSelectedIndex((i) => Math.min(listItems.length - 1, i + 1));
|
|
106
|
+
}
|
|
107
|
+
else if (key.return) {
|
|
108
|
+
const item = listItems[selectedIndex];
|
|
109
|
+
if (item) {
|
|
110
|
+
if (item.type === 'provider') {
|
|
111
|
+
toggleProvider(item.provider);
|
|
112
|
+
}
|
|
113
|
+
else if (item.model) {
|
|
114
|
+
onSelect(item.model.id, item.provider);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else if (key.tab) {
|
|
119
|
+
// Toggle expansion with Tab
|
|
120
|
+
const item = listItems[selectedIndex];
|
|
121
|
+
if (item) {
|
|
122
|
+
toggleProvider(item.provider);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else if (key.escape) {
|
|
126
|
+
onCancel();
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
if (loading) {
|
|
130
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(LoadingSpinner, {}), _jsx(Text, { color: colors.textMuted, children: " Loading models from all providers..." })] }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: ['openai', 'anthropic', 'gemini', 'vertex-ai'].map((p) => (_jsxs(Box, { children: [_jsx(LoadingSpinner, {}), _jsxs(Text, { color: colors.textMuted, children: [" ", providerDisplayNames[p]] })] }, p))) })] }));
|
|
131
|
+
}
|
|
132
|
+
const maxVisible = 12;
|
|
133
|
+
const startIndex = Math.max(0, Math.min(selectedIndex - Math.floor(maxVisible / 2), listItems.length - maxVisible));
|
|
134
|
+
const visibleItems = listItems.slice(startIndex, startIndex + maxVisible);
|
|
135
|
+
// Count total models
|
|
136
|
+
const totalModels = providerData.reduce((sum, p) => sum + p.models.length, 0);
|
|
137
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsxs(Text, { color: colors.primary, children: [icons.prompt, " "] }), _jsx(TextInput, { value: filter, onChange: setFilter, placeholder: "Filter models across all providers..." })] }), _jsx(Box, { flexDirection: "column", marginTop: 1, children: listItems.length === 0 ? (_jsxs(Text, { color: colors.textMuted, children: ["No models match \"", filter, "\""] })) : (visibleItems.map((item, i) => {
|
|
138
|
+
const actualIndex = startIndex + i;
|
|
139
|
+
const isSelected = actualIndex === selectedIndex;
|
|
140
|
+
if (item.type === 'provider') {
|
|
141
|
+
const pd = providerData.find((p) => p.provider === item.provider);
|
|
142
|
+
const modelCount = pd?.models.length ?? 0;
|
|
143
|
+
const hasError = pd?.error;
|
|
144
|
+
const isExpanded = item.expanded;
|
|
145
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: isSelected ? colors.primary : colors.textMuted, children: isSelected ? icons.arrow : ' ' }), _jsxs(Text, { color: colors.info, children: [isExpanded ? '▼' : '▶', " "] }), _jsx(Text, { color: isSelected ? colors.text : colors.textSecondary, bold: true, children: providerDisplayNames[item.provider] }), _jsxs(Text, { color: colors.textMuted, children: [' ', "(", hasError ? 'unavailable' : `${modelCount} models`, ")"] }), hasError && (_jsxs(Text, { color: colors.warning, children: [" - ", pd?.error] }))] }, `provider-${item.provider}`));
|
|
146
|
+
}
|
|
147
|
+
// Model item
|
|
148
|
+
const model = item.model;
|
|
149
|
+
const isCurrent = model.id === currentModel && item.provider === currentProvider;
|
|
150
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: isSelected ? colors.primary : colors.textMuted, children: isSelected ? icons.arrow : ' ' }), _jsx(Text, { color: colors.textMuted, children: " " }), _jsx(Text, { color: isSelected ? colors.text : colors.textSecondary, bold: isSelected, children: model.name }), isCurrent && _jsx(Text, { color: colors.success, children: " (current)" })] }, `model-${item.provider}-${model.id}`));
|
|
151
|
+
})) }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: colors.textMuted, children: [totalModels, " models \u00B7 ", providerData.filter((p) => !p.error).length, " providers \u00B7 \u2191\u2193 navigate \u00B7 Enter select/expand \u00B7 Tab fold \u00B7 Esc cancel"] }) })] }));
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=AllModelsSelector.js.map
|