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/docs/proposals/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
#
|
|
1
|
+
# gencode Enhancement Proposals
|
|
2
2
|
|
|
3
|
-
This directory contains enhancement proposals for the
|
|
3
|
+
This directory contains enhancement proposals for the gencode project. Each proposal describes a feature inspired by Claude Code that we plan to implement.
|
|
4
4
|
|
|
5
5
|
## Proposal Process
|
|
6
6
|
|
|
@@ -16,18 +16,20 @@ This directory contains enhancement proposals for the mycode project. Each propo
|
|
|
16
16
|
|
|
17
17
|
| ID | Title | Status |
|
|
18
18
|
|----|-------|--------|
|
|
19
|
-
| [0001](./0001-web-fetch-tool.md) | WebFetch Tool |
|
|
20
|
-
| [0002](./0002-web-search-tool.md) | WebSearch Tool |
|
|
19
|
+
| [0001](./0001-web-fetch-tool.md) | WebFetch Tool | Implemented |
|
|
20
|
+
| [0002](./0002-web-search-tool.md) | WebSearch Tool | Implemented |
|
|
21
21
|
| [0003](./0003-task-subagents.md) | Task Tool & Subagents | Draft |
|
|
22
22
|
| [0004](./0004-plan-mode.md) | Plan Mode | Draft |
|
|
23
|
-
| [0005](./0005-todo-system.md) | Todo System |
|
|
24
|
-
| [0006](./0006-memory-system.md) | Memory System (MYCODE.md) |
|
|
23
|
+
| [0005](./0005-todo-system.md) | Todo System | Implemented |
|
|
24
|
+
| [0006](./0006-memory-system.md) | Memory System (MYCODE.md) | Implemented |
|
|
25
25
|
| [0007](./0007-context-management.md) | Context Management | Draft |
|
|
26
26
|
| [0008](./0008-checkpointing.md) | Checkpointing | Draft |
|
|
27
27
|
| [0009](./0009-hooks-system.md) | Hooks System | Draft |
|
|
28
28
|
| [0010](./0010-mcp-integration.md) | MCP Integration | Draft |
|
|
29
29
|
| [0011](./0011-custom-commands.md) | Custom Commands | Draft |
|
|
30
30
|
| [0012](./0012-ask-user-question.md) | AskUserQuestion Tool | Draft |
|
|
31
|
+
| [0041](./0041-configuration-system.md) | Configuration System | Implemented |
|
|
32
|
+
| [0042](./0042-prompt-optimization.md) | Prompt System Optimization | Implemented |
|
|
31
33
|
|
|
32
34
|
### P2 Priority - Enhanced Features
|
|
33
35
|
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# Providers
|
|
2
|
+
|
|
3
|
+
GenCode supports multiple LLM providers and Search providers. Use the `/provider` command to manage all provider connections.
|
|
4
|
+
|
|
5
|
+
## LLM Providers
|
|
6
|
+
|
|
7
|
+
### Anthropic (Claude)
|
|
8
|
+
|
|
9
|
+
Claude models from Anthropic with multiple connection options:
|
|
10
|
+
|
|
11
|
+
| Connection Method | Environment Variables | Description |
|
|
12
|
+
|-------------------|----------------------|-------------|
|
|
13
|
+
| API Key | `ANTHROPIC_API_KEY` | Direct API access |
|
|
14
|
+
| Google Vertex AI | `ANTHROPIC_VERTEX_PROJECT_ID` or `GOOGLE_CLOUD_PROJECT` | Claude via GCP |
|
|
15
|
+
| Amazon Bedrock | `AWS_ACCESS_KEY_ID` or `AWS_PROFILE` | Claude via AWS (coming soon) |
|
|
16
|
+
|
|
17
|
+
### OpenAI
|
|
18
|
+
|
|
19
|
+
GPT models from OpenAI:
|
|
20
|
+
|
|
21
|
+
| Connection Method | Environment Variables | Description |
|
|
22
|
+
|-------------------|----------------------|-------------|
|
|
23
|
+
| API Key | `OPENAI_API_KEY` | Direct API access |
|
|
24
|
+
|
|
25
|
+
### Google Gemini
|
|
26
|
+
|
|
27
|
+
Gemini models from Google:
|
|
28
|
+
|
|
29
|
+
| Connection Method | Environment Variables | Description |
|
|
30
|
+
|-------------------|----------------------|-------------|
|
|
31
|
+
| API Key | `GOOGLE_API_KEY` or `GEMINI_API_KEY` | Direct API access |
|
|
32
|
+
|
|
33
|
+
## Search Providers
|
|
34
|
+
|
|
35
|
+
GenCode includes a WebSearch tool that can search the web for current information. Multiple search providers are supported:
|
|
36
|
+
|
|
37
|
+
### Exa AI (Default)
|
|
38
|
+
|
|
39
|
+
AI-native search engine using Exa's public MCP endpoint. Works out of the box without any configuration.
|
|
40
|
+
|
|
41
|
+
| Connection Method | Environment Variables | Description |
|
|
42
|
+
|-------------------|----------------------|-------------|
|
|
43
|
+
| Public MCP | (none required) | Uses public `mcp.exa.ai` endpoint |
|
|
44
|
+
|
|
45
|
+
**Features:**
|
|
46
|
+
- No configuration required - works immediately
|
|
47
|
+
- AI-optimized search results
|
|
48
|
+
- Live crawl support for fresh content
|
|
49
|
+
|
|
50
|
+
**Note:** Uses Exa's public MCP endpoint. For heavy usage, consider using Serper or Brave with your own API key.
|
|
51
|
+
|
|
52
|
+
### Serper.dev
|
|
53
|
+
|
|
54
|
+
Google Search results via Serper API.
|
|
55
|
+
|
|
56
|
+
| Connection Method | Environment Variables | Description |
|
|
57
|
+
|-------------------|----------------------|-------------|
|
|
58
|
+
| API Key | `SERPER_API_KEY` | Google Search via Serper |
|
|
59
|
+
|
|
60
|
+
**Features:**
|
|
61
|
+
- 2,500 free queries (no credit card required)
|
|
62
|
+
- Google Search quality results
|
|
63
|
+
- Fast response times
|
|
64
|
+
|
|
65
|
+
**Get API Key:** https://serper.dev
|
|
66
|
+
|
|
67
|
+
### Brave Search
|
|
68
|
+
|
|
69
|
+
Privacy-focused search from Brave.
|
|
70
|
+
|
|
71
|
+
| Connection Method | Environment Variables | Description |
|
|
72
|
+
|-------------------|----------------------|-------------|
|
|
73
|
+
| API Key | `BRAVE_API_KEY` | Privacy-focused search |
|
|
74
|
+
|
|
75
|
+
**Features:**
|
|
76
|
+
- 2,000 free queries per month
|
|
77
|
+
- Privacy-first approach
|
|
78
|
+
- Independent search index
|
|
79
|
+
|
|
80
|
+
**Get API Key:** https://brave.com/search/api
|
|
81
|
+
|
|
82
|
+
### Search Provider Priority
|
|
83
|
+
|
|
84
|
+
When multiple search providers are configured, the priority is:
|
|
85
|
+
|
|
86
|
+
1. **Configured in `/provider`** - Explicitly selected provider
|
|
87
|
+
2. **Environment variables** - `SERPER_API_KEY` > `BRAVE_API_KEY`
|
|
88
|
+
3. **Default** - Exa AI (no configuration needed)
|
|
89
|
+
|
|
90
|
+
## Commands
|
|
91
|
+
|
|
92
|
+
### `/provider` - Provider Management
|
|
93
|
+
|
|
94
|
+
Opens the provider management interface with two tabs:
|
|
95
|
+
|
|
96
|
+
**[L] LLM Providers Tab:**
|
|
97
|
+
- View connected and available LLM providers
|
|
98
|
+
- Connect to new providers
|
|
99
|
+
- Refresh model lists for connected providers
|
|
100
|
+
- Remove provider connections
|
|
101
|
+
|
|
102
|
+
**[S] Search Providers Tab:**
|
|
103
|
+
- View available search providers
|
|
104
|
+
- Select which search provider to use for WebSearch
|
|
105
|
+
- See configuration status (configured/not configured)
|
|
106
|
+
|
|
107
|
+
**Keyboard shortcuts:**
|
|
108
|
+
- `Tab` or `L`/`S` - Switch between tabs
|
|
109
|
+
- `↑↓` - Navigate between providers
|
|
110
|
+
- `Enter` - Connect/Select provider
|
|
111
|
+
- `r` - Remove a connected LLM provider
|
|
112
|
+
- `Esc` - Exit
|
|
113
|
+
|
|
114
|
+
### `/model` - Model Selection
|
|
115
|
+
|
|
116
|
+
Opens the model selector to switch between models from all connected providers:
|
|
117
|
+
|
|
118
|
+
- Models are grouped by provider
|
|
119
|
+
- Shows cached models (fast, no API call)
|
|
120
|
+
- Supports fuzzy search filtering
|
|
121
|
+
|
|
122
|
+
**Keyboard shortcuts:**
|
|
123
|
+
- `↑↓` - Navigate between models
|
|
124
|
+
- `Enter` - Select model
|
|
125
|
+
- `Esc` - Cancel
|
|
126
|
+
|
|
127
|
+
## Google Vertex AI Setup
|
|
128
|
+
|
|
129
|
+
To use Claude models via Google Vertex AI:
|
|
130
|
+
|
|
131
|
+
### 1. Set Environment Variables
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
# Required: Your GCP project ID
|
|
135
|
+
export ANTHROPIC_VERTEX_PROJECT_ID="your-project-id"
|
|
136
|
+
|
|
137
|
+
# Optional: Region (defaults to us-east5)
|
|
138
|
+
export ANTHROPIC_VERTEX_REGION="us-east5"
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Alternative variables also supported:
|
|
142
|
+
- `GOOGLE_CLOUD_PROJECT` - GCP project ID
|
|
143
|
+
- `CLOUD_ML_REGION` - GCP region
|
|
144
|
+
|
|
145
|
+
### 2. Authenticate with Google Cloud
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
# Login and set up Application Default Credentials
|
|
149
|
+
gcloud auth application-default login
|
|
150
|
+
|
|
151
|
+
# Verify authentication
|
|
152
|
+
gcloud auth application-default print-access-token
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### 3. Enable Vertex AI API
|
|
156
|
+
|
|
157
|
+
Ensure the Vertex AI API is enabled in your GCP project:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
gcloud services enable aiplatform.googleapis.com
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### 4. Connect in GenCode
|
|
164
|
+
|
|
165
|
+
```
|
|
166
|
+
/provider
|
|
167
|
+
# Select "Anthropic"
|
|
168
|
+
# Choose "Google Vertex AI" connection method
|
|
169
|
+
# Press Enter to connect
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Configuration Storage
|
|
173
|
+
|
|
174
|
+
Provider connections and cached models are stored in:
|
|
175
|
+
|
|
176
|
+
```
|
|
177
|
+
~/.gencode/
|
|
178
|
+
├── settings.json # Current model and provider settings
|
|
179
|
+
└── providers.json # Provider connections and model cache
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### providers.json Structure
|
|
183
|
+
|
|
184
|
+
```json
|
|
185
|
+
{
|
|
186
|
+
"connections": {
|
|
187
|
+
"anthropic": {
|
|
188
|
+
"method": "vertex",
|
|
189
|
+
"connectedAt": "2025-01-15T10:00:00Z"
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
"models": {
|
|
193
|
+
"anthropic": {
|
|
194
|
+
"cachedAt": "2025-01-15T10:00:00Z",
|
|
195
|
+
"list": [
|
|
196
|
+
{ "id": "claude-sonnet-4-5@20250929", "name": "Claude Sonnet 4.5" }
|
|
197
|
+
]
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
"searchProvider": "exa"
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
The `searchProvider` field stores the selected search provider. Valid values: `exa`, `serper`, `brave`. If not set, defaults to `exa`.
|
|
205
|
+
|
|
206
|
+
## Troubleshooting
|
|
207
|
+
|
|
208
|
+
### "Not configured" status
|
|
209
|
+
|
|
210
|
+
If a provider shows "(not configured)", set the required environment variables and restart GenCode.
|
|
211
|
+
|
|
212
|
+
### Model list is empty
|
|
213
|
+
|
|
214
|
+
Use `/provider` and press Enter on a connected provider to refresh the model cache.
|
|
215
|
+
|
|
216
|
+
### Vertex AI authentication errors
|
|
217
|
+
|
|
218
|
+
1. Verify you're logged in: `gcloud auth application-default print-access-token`
|
|
219
|
+
2. Check project ID: `echo $ANTHROPIC_VERTEX_PROJECT_ID`
|
|
220
|
+
3. Ensure Vertex AI API is enabled in your project
|
package/jest.config.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** @type {import('ts-jest').JestConfigWithTsJest} */
|
|
2
|
+
export default {
|
|
3
|
+
preset: 'ts-jest/presets/default-esm',
|
|
4
|
+
testEnvironment: 'node',
|
|
5
|
+
extensionsToTreatAsEsm: ['.ts'],
|
|
6
|
+
moduleNameMapper: {
|
|
7
|
+
'^(\\.{1,2}/.*)\\.js$': '$1',
|
|
8
|
+
},
|
|
9
|
+
transform: {
|
|
10
|
+
'^.+\\.tsx?$': [
|
|
11
|
+
'ts-jest',
|
|
12
|
+
{
|
|
13
|
+
useESM: true,
|
|
14
|
+
isolatedModules: true,
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
},
|
|
18
|
+
testMatch: ['**/*.test.ts'],
|
|
19
|
+
collectCoverageFrom: [
|
|
20
|
+
'src/**/*.ts',
|
|
21
|
+
'!src/**/*.d.ts',
|
|
22
|
+
'!src/**/*.test.ts',
|
|
23
|
+
],
|
|
24
|
+
coverageDirectory: 'coverage',
|
|
25
|
+
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
|
|
26
|
+
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gencode-ai",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "An open-source AI assistant for your terminal",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
"scripts": {
|
|
12
12
|
"build": "tsc",
|
|
13
13
|
"dev": "tsc --watch",
|
|
14
|
-
"start": "
|
|
14
|
+
"start": "node dist/cli/index.js",
|
|
15
|
+
"start:dev": "npx tsx src/cli/index.tsx",
|
|
15
16
|
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
|
|
16
17
|
"example": "npx tsx examples/basic.ts"
|
|
17
18
|
},
|
|
@@ -28,22 +29,32 @@
|
|
|
28
29
|
"dependencies": {
|
|
29
30
|
"@anthropic-ai/sdk": "^0.71.2",
|
|
30
31
|
"@google/generative-ai": "^0.24.1",
|
|
32
|
+
"@types/turndown": "^5.0.6",
|
|
31
33
|
"chalk": "^5.6.2",
|
|
32
34
|
"dotenv": "^17.2.3",
|
|
33
35
|
"fast-glob": "^3.3.3",
|
|
34
36
|
"glob": "^13.0.0",
|
|
37
|
+
"google-auth-library": "^10.5.0",
|
|
38
|
+
"gray-matter": "^4.0.3",
|
|
35
39
|
"ink": "^6.6.0",
|
|
36
40
|
"ink-spinner": "^5.0.0",
|
|
37
41
|
"ink-text-input": "^6.0.0",
|
|
42
|
+
"marked": "^17.0.1",
|
|
43
|
+
"minimatch": "^10.1.1",
|
|
38
44
|
"openai": "^6.16.0",
|
|
39
45
|
"ora": "^9.0.0",
|
|
40
46
|
"react": "^19.2.3",
|
|
47
|
+
"turndown": "^7.2.2",
|
|
41
48
|
"undici": "^7.18.2",
|
|
42
49
|
"zod": "^4.3.5"
|
|
43
50
|
},
|
|
44
51
|
"devDependencies": {
|
|
52
|
+
"@types/jest": "^30.0.0",
|
|
53
|
+
"@types/minimatch": "^5.1.2",
|
|
45
54
|
"@types/node": "^25.0.8",
|
|
46
55
|
"@types/react": "^19.2.8",
|
|
56
|
+
"jest": "^30.2.0",
|
|
57
|
+
"ts-jest": "^29.4.6",
|
|
47
58
|
"tsx": "^4.21.0",
|
|
48
59
|
"typescript": "^5.9.3"
|
|
49
60
|
}
|
package/src/agent/agent.ts
CHANGED
|
@@ -3,31 +3,30 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import type { LLMProvider, Message, ToolResultContent } from '../providers/types.js';
|
|
6
|
-
import { createProvider } from '../providers/index.js';
|
|
6
|
+
import { createProvider, inferProvider } from '../providers/index.js';
|
|
7
7
|
import { ToolRegistry, createDefaultRegistry } from '../tools/index.js';
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
PermissionManager,
|
|
10
|
+
type ApprovalAction,
|
|
11
|
+
type ApprovalSuggestion,
|
|
12
|
+
type PromptPermission,
|
|
13
|
+
type PermissionSettings,
|
|
14
|
+
} from '../permissions/index.js';
|
|
9
15
|
import { SessionManager } from '../session/index.js';
|
|
16
|
+
import { MemoryManager, type LoadedMemory } from '../memory/index.js';
|
|
10
17
|
import type { AgentConfig, AgentEvent } from './types.js';
|
|
11
|
-
|
|
12
|
-
const DEFAULT_SYSTEM_PROMPT = `You are a helpful AI assistant with access to tools for reading, writing, and executing code.
|
|
13
|
-
|
|
14
|
-
When using tools:
|
|
15
|
-
- Use Read to view file contents before editing
|
|
16
|
-
- Use Glob/Grep to find files
|
|
17
|
-
- Use Edit for precise changes (old_string must be unique)
|
|
18
|
-
- Use Write for new files or full rewrites
|
|
19
|
-
- Use Bash for commands, git operations, etc.
|
|
20
|
-
|
|
21
|
-
Be concise and focus on completing the user's task.`;
|
|
18
|
+
import { buildSystemPromptForModel, debugPromptLoading } from '../prompts/index.js';
|
|
22
19
|
|
|
23
20
|
export class Agent {
|
|
24
21
|
private provider: LLMProvider;
|
|
25
22
|
private registry: ToolRegistry;
|
|
26
23
|
private permissions: PermissionManager;
|
|
27
24
|
private sessionManager: SessionManager;
|
|
25
|
+
private memoryManager: MemoryManager;
|
|
28
26
|
private config: AgentConfig;
|
|
29
27
|
private messages: Message[] = [];
|
|
30
28
|
private sessionId: string | null = null;
|
|
29
|
+
private loadedMemory: LoadedMemory | null = null;
|
|
31
30
|
|
|
32
31
|
constructor(config: AgentConfig) {
|
|
33
32
|
this.config = {
|
|
@@ -38,17 +37,93 @@ export class Agent {
|
|
|
38
37
|
|
|
39
38
|
this.provider = createProvider({ provider: config.provider });
|
|
40
39
|
this.registry = createDefaultRegistry();
|
|
41
|
-
this.permissions = new PermissionManager(
|
|
40
|
+
this.permissions = new PermissionManager({
|
|
41
|
+
config: config.permissions,
|
|
42
|
+
projectPath: config.cwd,
|
|
43
|
+
});
|
|
42
44
|
this.sessionManager = new SessionManager();
|
|
45
|
+
this.memoryManager = new MemoryManager();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Initialize permission system (load persisted rules)
|
|
50
|
+
*/
|
|
51
|
+
async initializePermissions(settings?: PermissionSettings): Promise<void> {
|
|
52
|
+
await this.permissions.initialize(settings);
|
|
43
53
|
}
|
|
44
54
|
|
|
45
55
|
/**
|
|
46
|
-
* Set permission confirmation callback
|
|
56
|
+
* Set simple permission confirmation callback (backward compatible)
|
|
47
57
|
*/
|
|
48
58
|
setConfirmCallback(callback: (tool: string, input: unknown) => Promise<boolean>): void {
|
|
59
|
+
this.permissions.setSimpleConfirmCallback(callback);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Set enhanced permission confirmation callback with approval options
|
|
64
|
+
*/
|
|
65
|
+
setEnhancedConfirmCallback(
|
|
66
|
+
callback: (
|
|
67
|
+
tool: string,
|
|
68
|
+
input: unknown,
|
|
69
|
+
suggestions: ApprovalSuggestion[]
|
|
70
|
+
) => Promise<ApprovalAction>
|
|
71
|
+
): void {
|
|
49
72
|
this.permissions.setConfirmCallback(callback);
|
|
50
73
|
}
|
|
51
74
|
|
|
75
|
+
/**
|
|
76
|
+
* Add prompt-based permissions (Claude Code ExitPlanMode style)
|
|
77
|
+
*/
|
|
78
|
+
addAllowedPrompts(prompts: PromptPermission[]): void {
|
|
79
|
+
this.permissions.addAllowedPrompts(prompts);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Clear prompt-based permissions
|
|
84
|
+
*/
|
|
85
|
+
clearAllowedPrompts(): void {
|
|
86
|
+
this.permissions.clearAllowedPrompts();
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Set callback to save permission rules to settings
|
|
91
|
+
* This enables saving rules to settings.local.json instead of permissions.json
|
|
92
|
+
*/
|
|
93
|
+
setSaveRuleCallback(callback: (tool: string, pattern?: string) => Promise<void>): void {
|
|
94
|
+
this.permissions.setSaveRuleCallback(callback);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Get permission manager for direct access
|
|
99
|
+
*/
|
|
100
|
+
getPermissionManager(): PermissionManager {
|
|
101
|
+
return this.permissions;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Get memory manager for direct access
|
|
106
|
+
*/
|
|
107
|
+
getMemoryManager(): MemoryManager {
|
|
108
|
+
return this.memoryManager;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Get loaded memory (null if not loaded yet)
|
|
113
|
+
*/
|
|
114
|
+
getLoadedMemory(): LoadedMemory | null {
|
|
115
|
+
return this.loadedMemory;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Load memory for the current working directory
|
|
120
|
+
*/
|
|
121
|
+
async loadMemory(): Promise<LoadedMemory> {
|
|
122
|
+
const cwd = this.config.cwd ?? process.cwd();
|
|
123
|
+
this.loadedMemory = await this.memoryManager.load({ cwd });
|
|
124
|
+
return this.loadedMemory;
|
|
125
|
+
}
|
|
126
|
+
|
|
52
127
|
/**
|
|
53
128
|
* Get current session ID
|
|
54
129
|
*/
|
|
@@ -64,10 +139,17 @@ export class Agent {
|
|
|
64
139
|
}
|
|
65
140
|
|
|
66
141
|
/**
|
|
67
|
-
* Set the model to use
|
|
142
|
+
* Set the model to use (auto-switches provider if needed)
|
|
68
143
|
*/
|
|
69
144
|
setModel(model: string): void {
|
|
70
145
|
this.config.model = model;
|
|
146
|
+
|
|
147
|
+
// Auto-switch provider based on model name
|
|
148
|
+
const newProvider = inferProvider(model);
|
|
149
|
+
if (newProvider !== this.config.provider) {
|
|
150
|
+
this.config.provider = newProvider;
|
|
151
|
+
this.provider = createProvider({ provider: newProvider });
|
|
152
|
+
}
|
|
71
153
|
}
|
|
72
154
|
|
|
73
155
|
/**
|
|
@@ -179,6 +261,11 @@ export class Agent {
|
|
|
179
261
|
await this.startSession();
|
|
180
262
|
}
|
|
181
263
|
|
|
264
|
+
// Load memory if not already loaded
|
|
265
|
+
if (!this.loadedMemory) {
|
|
266
|
+
await this.loadMemory();
|
|
267
|
+
}
|
|
268
|
+
|
|
182
269
|
// Add user message
|
|
183
270
|
const userMessage: Message = { role: 'user', content: prompt };
|
|
184
271
|
this.messages.push(userMessage);
|
|
@@ -196,11 +283,26 @@ export class Agent {
|
|
|
196
283
|
// Call LLM
|
|
197
284
|
let response;
|
|
198
285
|
try {
|
|
286
|
+
// Debug prompt loading (enabled with GENCODE_DEBUG_PROMPTS=1)
|
|
287
|
+
debugPromptLoading(this.config.model, this.config.provider);
|
|
288
|
+
|
|
289
|
+
// Build system prompt based on model → provider → prompt flow
|
|
290
|
+
// Looks up provider from ~/.gencode/providers.json, falls back to config.provider
|
|
291
|
+
const systemPrompt =
|
|
292
|
+
this.config.systemPrompt ??
|
|
293
|
+
buildSystemPromptForModel(
|
|
294
|
+
this.config.model,
|
|
295
|
+
this.config.cwd ?? process.cwd(),
|
|
296
|
+
true, // Assume git repo for now
|
|
297
|
+
this.loadedMemory?.context,
|
|
298
|
+
this.config.provider // Fallback provider if model lookup fails
|
|
299
|
+
);
|
|
300
|
+
|
|
199
301
|
response = await this.provider.complete({
|
|
200
302
|
model: this.config.model,
|
|
201
303
|
messages: this.messages,
|
|
202
304
|
tools: toolDefs,
|
|
203
|
-
systemPrompt
|
|
305
|
+
systemPrompt,
|
|
204
306
|
maxTokens: 4096,
|
|
205
307
|
});
|
|
206
308
|
} catch (error) {
|
|
@@ -237,7 +339,7 @@ export class Agent {
|
|
|
237
339
|
for (const call of toolCalls) {
|
|
238
340
|
yield { type: 'tool_start', id: call.id, name: call.name, input: call.input };
|
|
239
341
|
|
|
240
|
-
const allowed = await this.permissions.
|
|
342
|
+
const allowed = await this.permissions.requestPermission(call.name, call.input);
|
|
241
343
|
const result = allowed
|
|
242
344
|
? await this.registry.execute(call.name, call.input, { cwd })
|
|
243
345
|
: { success: false, output: '', error: 'Permission denied by user' };
|
package/src/agent/types.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import type { PermissionConfig } from '../permissions/types.js';
|
|
6
6
|
|
|
7
7
|
export interface AgentConfig {
|
|
8
|
-
provider: 'openai' | 'anthropic' | 'gemini';
|
|
8
|
+
provider: 'openai' | 'anthropic' | 'gemini' | 'vertex-ai';
|
|
9
9
|
model: string;
|
|
10
10
|
systemPrompt?: string;
|
|
11
11
|
tools?: string[];
|
|
@@ -35,6 +35,14 @@ export interface AgentEventToolResult {
|
|
|
35
35
|
success: boolean;
|
|
36
36
|
output: string;
|
|
37
37
|
error?: string;
|
|
38
|
+
metadata?: {
|
|
39
|
+
title?: string;
|
|
40
|
+
subtitle?: string;
|
|
41
|
+
size?: number;
|
|
42
|
+
statusCode?: number;
|
|
43
|
+
contentType?: string;
|
|
44
|
+
duration?: number;
|
|
45
|
+
};
|
|
38
46
|
};
|
|
39
47
|
}
|
|
40
48
|
|