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
|
@@ -0,0 +1,594 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Vertex AI Provider Implementation
|
|
3
|
+
* Supports Claude models deployed on Google Cloud Vertex AI
|
|
4
|
+
*
|
|
5
|
+
* Authentication uses Google Cloud's default credential chain:
|
|
6
|
+
* 1. GOOGLE_APPLICATION_CREDENTIALS (service account JSON)
|
|
7
|
+
* 2. gcloud auth application-default login (ADC)
|
|
8
|
+
* 3. GCE/GKE metadata service (when running on GCP)
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { GoogleAuth } from 'google-auth-library';
|
|
12
|
+
import type {
|
|
13
|
+
LLMProvider,
|
|
14
|
+
CompletionOptions,
|
|
15
|
+
CompletionResponse,
|
|
16
|
+
StreamChunk,
|
|
17
|
+
Message,
|
|
18
|
+
MessageContent,
|
|
19
|
+
ToolDefinition,
|
|
20
|
+
StopReason,
|
|
21
|
+
VertexAIConfig,
|
|
22
|
+
ModelInfo,
|
|
23
|
+
} from './types.js';
|
|
24
|
+
|
|
25
|
+
// Vertex AI API types (compatible with Anthropic format)
|
|
26
|
+
interface VertexAIMessage {
|
|
27
|
+
role: 'user' | 'assistant';
|
|
28
|
+
content: string | VertexAIContent[];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface VertexAIContent {
|
|
32
|
+
type: 'text' | 'tool_use' | 'tool_result';
|
|
33
|
+
text?: string;
|
|
34
|
+
id?: string;
|
|
35
|
+
name?: string;
|
|
36
|
+
input?: Record<string, unknown>;
|
|
37
|
+
tool_use_id?: string;
|
|
38
|
+
content?: string;
|
|
39
|
+
is_error?: boolean;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
interface VertexAITool {
|
|
43
|
+
name: string;
|
|
44
|
+
description: string;
|
|
45
|
+
input_schema: {
|
|
46
|
+
type: string;
|
|
47
|
+
properties?: Record<string, unknown>;
|
|
48
|
+
required?: string[];
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
interface VertexAIRequest {
|
|
53
|
+
anthropic_version: string;
|
|
54
|
+
max_tokens: number;
|
|
55
|
+
messages: VertexAIMessage[];
|
|
56
|
+
system?: string;
|
|
57
|
+
tools?: VertexAITool[];
|
|
58
|
+
temperature?: number;
|
|
59
|
+
stream?: boolean;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
interface VertexAIResponse {
|
|
63
|
+
id: string;
|
|
64
|
+
type: string;
|
|
65
|
+
role: string;
|
|
66
|
+
content: Array<{
|
|
67
|
+
type: 'text' | 'tool_use';
|
|
68
|
+
text?: string;
|
|
69
|
+
id?: string;
|
|
70
|
+
name?: string;
|
|
71
|
+
input?: Record<string, unknown>;
|
|
72
|
+
}>;
|
|
73
|
+
stop_reason: 'end_turn' | 'tool_use' | 'max_tokens' | 'stop_sequence';
|
|
74
|
+
usage: {
|
|
75
|
+
input_tokens: number;
|
|
76
|
+
output_tokens: number;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// SSE stream event types
|
|
81
|
+
interface StreamEventContentBlockStart {
|
|
82
|
+
type: 'content_block_start';
|
|
83
|
+
index: number;
|
|
84
|
+
content_block: {
|
|
85
|
+
type: 'text' | 'tool_use';
|
|
86
|
+
text?: string;
|
|
87
|
+
id?: string;
|
|
88
|
+
name?: string;
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
interface StreamEventContentBlockDelta {
|
|
93
|
+
type: 'content_block_delta';
|
|
94
|
+
index: number;
|
|
95
|
+
delta: {
|
|
96
|
+
type: 'text_delta' | 'input_json_delta';
|
|
97
|
+
text?: string;
|
|
98
|
+
partial_json?: string;
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
interface StreamEventMessageDelta {
|
|
103
|
+
type: 'message_delta';
|
|
104
|
+
delta: {
|
|
105
|
+
stop_reason: string;
|
|
106
|
+
};
|
|
107
|
+
usage: {
|
|
108
|
+
output_tokens: number;
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
interface StreamEventMessageStart {
|
|
113
|
+
type: 'message_start';
|
|
114
|
+
message: {
|
|
115
|
+
id: string;
|
|
116
|
+
usage: {
|
|
117
|
+
input_tokens: number;
|
|
118
|
+
};
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
type StreamEvent =
|
|
123
|
+
| StreamEventContentBlockStart
|
|
124
|
+
| StreamEventContentBlockDelta
|
|
125
|
+
| StreamEventMessageDelta
|
|
126
|
+
| StreamEventMessageStart
|
|
127
|
+
| { type: 'content_block_stop' }
|
|
128
|
+
| { type: 'message_stop' }
|
|
129
|
+
| { type: 'ping' };
|
|
130
|
+
|
|
131
|
+
export class VertexAIProvider implements LLMProvider {
|
|
132
|
+
readonly name = 'vertex-ai';
|
|
133
|
+
private projectId: string;
|
|
134
|
+
private region: string;
|
|
135
|
+
private auth: GoogleAuth;
|
|
136
|
+
private accessToken?: string;
|
|
137
|
+
|
|
138
|
+
constructor(config: VertexAIConfig = {}) {
|
|
139
|
+
this.projectId =
|
|
140
|
+
config.projectId ??
|
|
141
|
+
process.env.ANTHROPIC_VERTEX_PROJECT_ID ??
|
|
142
|
+
process.env.GOOGLE_CLOUD_PROJECT ??
|
|
143
|
+
'';
|
|
144
|
+
|
|
145
|
+
this.region =
|
|
146
|
+
config.region ??
|
|
147
|
+
process.env.ANTHROPIC_VERTEX_REGION ??
|
|
148
|
+
process.env.CLOUD_ML_REGION ??
|
|
149
|
+
'us-east5';
|
|
150
|
+
|
|
151
|
+
this.accessToken = config.accessToken;
|
|
152
|
+
|
|
153
|
+
if (!this.projectId) {
|
|
154
|
+
throw new Error(
|
|
155
|
+
'Vertex AI requires a project ID. Set ANTHROPIC_VERTEX_PROJECT_ID environment variable.'
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
this.auth = new GoogleAuth({
|
|
160
|
+
scopes: ['https://www.googleapis.com/auth/cloud-platform'],
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
private async getAccessToken(): Promise<string> {
|
|
165
|
+
if (this.accessToken) {
|
|
166
|
+
return this.accessToken;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const client = await this.auth.getClient();
|
|
170
|
+
const tokenResponse = await client.getAccessToken();
|
|
171
|
+
if (!tokenResponse.token) {
|
|
172
|
+
throw new Error('Failed to get access token from Google Cloud');
|
|
173
|
+
}
|
|
174
|
+
return tokenResponse.token;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
private getEndpoint(model: string, stream: boolean = false): string {
|
|
178
|
+
const method = stream ? 'streamRawPredict' : 'rawPredict';
|
|
179
|
+
return `https://${this.region}-aiplatform.googleapis.com/v1/projects/${this.projectId}/locations/${this.region}/publishers/anthropic/models/${model}:${method}`;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
async complete(options: CompletionOptions): Promise<CompletionResponse> {
|
|
183
|
+
const messages = this.convertMessages(options.messages);
|
|
184
|
+
const tools = options.tools ? this.convertTools(options.tools) : undefined;
|
|
185
|
+
|
|
186
|
+
const requestBody: VertexAIRequest = {
|
|
187
|
+
anthropic_version: 'vertex-2023-10-16',
|
|
188
|
+
max_tokens: options.maxTokens ?? 4096,
|
|
189
|
+
messages,
|
|
190
|
+
system: options.systemPrompt,
|
|
191
|
+
tools,
|
|
192
|
+
temperature: options.temperature,
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
const accessToken = await this.getAccessToken();
|
|
196
|
+
const endpoint = this.getEndpoint(options.model, false);
|
|
197
|
+
|
|
198
|
+
const response = await fetch(endpoint, {
|
|
199
|
+
method: 'POST',
|
|
200
|
+
headers: {
|
|
201
|
+
Authorization: `Bearer ${accessToken}`,
|
|
202
|
+
'Content-Type': 'application/json',
|
|
203
|
+
},
|
|
204
|
+
body: JSON.stringify(requestBody),
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
if (!response.ok) {
|
|
208
|
+
const errorText = await response.text();
|
|
209
|
+
throw new Error(`Vertex AI API error: ${response.status} ${errorText}`);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
const data = (await response.json()) as VertexAIResponse;
|
|
213
|
+
return this.convertResponse(data);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
async *stream(options: CompletionOptions): AsyncGenerator<StreamChunk, void, unknown> {
|
|
217
|
+
const messages = this.convertMessages(options.messages);
|
|
218
|
+
const tools = options.tools ? this.convertTools(options.tools) : undefined;
|
|
219
|
+
|
|
220
|
+
const requestBody: VertexAIRequest = {
|
|
221
|
+
anthropic_version: 'vertex-2023-10-16',
|
|
222
|
+
max_tokens: options.maxTokens ?? 4096,
|
|
223
|
+
messages,
|
|
224
|
+
system: options.systemPrompt,
|
|
225
|
+
tools,
|
|
226
|
+
temperature: options.temperature,
|
|
227
|
+
stream: true,
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
const accessToken = await this.getAccessToken();
|
|
231
|
+
const endpoint = this.getEndpoint(options.model, true);
|
|
232
|
+
|
|
233
|
+
const response = await fetch(endpoint, {
|
|
234
|
+
method: 'POST',
|
|
235
|
+
headers: {
|
|
236
|
+
Authorization: `Bearer ${accessToken}`,
|
|
237
|
+
'Content-Type': 'application/json',
|
|
238
|
+
},
|
|
239
|
+
body: JSON.stringify(requestBody),
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
if (!response.ok) {
|
|
243
|
+
const errorText = await response.text();
|
|
244
|
+
throw new Error(`Vertex AI API error: ${response.status} ${errorText}`);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
if (!response.body) {
|
|
248
|
+
throw new Error('No response body from Vertex AI');
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const toolInputBuffers: Map<number, { id: string; name: string; input: string }> = new Map();
|
|
252
|
+
const contentBlocks: Map<
|
|
253
|
+
number,
|
|
254
|
+
{ type: 'text' | 'tool_use'; text?: string; id?: string; name?: string; input?: string }
|
|
255
|
+
> = new Map();
|
|
256
|
+
let inputTokens = 0;
|
|
257
|
+
let outputTokens = 0;
|
|
258
|
+
let stopReason: StopReason = 'end_turn';
|
|
259
|
+
|
|
260
|
+
// Parse SSE stream
|
|
261
|
+
const reader = response.body.getReader();
|
|
262
|
+
const decoder = new TextDecoder();
|
|
263
|
+
let buffer = '';
|
|
264
|
+
|
|
265
|
+
try {
|
|
266
|
+
while (true) {
|
|
267
|
+
const { done, value } = await reader.read();
|
|
268
|
+
if (done) break;
|
|
269
|
+
|
|
270
|
+
buffer += decoder.decode(value, { stream: true });
|
|
271
|
+
|
|
272
|
+
// Process complete SSE events
|
|
273
|
+
const lines = buffer.split('\n');
|
|
274
|
+
buffer = lines.pop() ?? '';
|
|
275
|
+
|
|
276
|
+
for (const line of lines) {
|
|
277
|
+
if (line.startsWith('data: ')) {
|
|
278
|
+
const jsonStr = line.slice(6).trim();
|
|
279
|
+
if (!jsonStr || jsonStr === '[DONE]') continue;
|
|
280
|
+
|
|
281
|
+
try {
|
|
282
|
+
const event = JSON.parse(jsonStr) as StreamEvent;
|
|
283
|
+
|
|
284
|
+
if (event.type === 'message_start') {
|
|
285
|
+
inputTokens = event.message.usage.input_tokens;
|
|
286
|
+
} else if (event.type === 'content_block_start') {
|
|
287
|
+
const block = event.content_block;
|
|
288
|
+
if (block.type === 'tool_use' && block.id && block.name) {
|
|
289
|
+
toolInputBuffers.set(event.index, {
|
|
290
|
+
id: block.id,
|
|
291
|
+
name: block.name,
|
|
292
|
+
input: '',
|
|
293
|
+
});
|
|
294
|
+
contentBlocks.set(event.index, {
|
|
295
|
+
type: 'tool_use',
|
|
296
|
+
id: block.id,
|
|
297
|
+
name: block.name,
|
|
298
|
+
input: '',
|
|
299
|
+
});
|
|
300
|
+
yield { type: 'tool_start', id: block.id, name: block.name };
|
|
301
|
+
} else if (block.type === 'text') {
|
|
302
|
+
contentBlocks.set(event.index, { type: 'text', text: '' });
|
|
303
|
+
}
|
|
304
|
+
} else if (event.type === 'content_block_delta') {
|
|
305
|
+
const delta = event.delta;
|
|
306
|
+
if (delta.type === 'text_delta' && delta.text) {
|
|
307
|
+
const block = contentBlocks.get(event.index);
|
|
308
|
+
if (block && block.type === 'text') {
|
|
309
|
+
block.text = (block.text ?? '') + delta.text;
|
|
310
|
+
}
|
|
311
|
+
yield { type: 'text', text: delta.text };
|
|
312
|
+
} else if (delta.type === 'input_json_delta' && delta.partial_json) {
|
|
313
|
+
const toolBuffer = toolInputBuffers.get(event.index);
|
|
314
|
+
if (toolBuffer) {
|
|
315
|
+
toolBuffer.input += delta.partial_json;
|
|
316
|
+
const block = contentBlocks.get(event.index);
|
|
317
|
+
if (block && block.type === 'tool_use') {
|
|
318
|
+
block.input = toolBuffer.input;
|
|
319
|
+
}
|
|
320
|
+
yield { type: 'tool_input', id: toolBuffer.id, input: delta.partial_json };
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
} else if (event.type === 'message_delta') {
|
|
324
|
+
stopReason = this.convertStopReason(event.delta.stop_reason);
|
|
325
|
+
outputTokens = event.usage.output_tokens;
|
|
326
|
+
}
|
|
327
|
+
} catch {
|
|
328
|
+
// Skip malformed JSON
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
} finally {
|
|
334
|
+
reader.releaseLock();
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// Build final response
|
|
338
|
+
const content = this.buildFinalContent(contentBlocks, toolInputBuffers);
|
|
339
|
+
|
|
340
|
+
yield {
|
|
341
|
+
type: 'done',
|
|
342
|
+
response: {
|
|
343
|
+
content,
|
|
344
|
+
stopReason,
|
|
345
|
+
usage: {
|
|
346
|
+
inputTokens,
|
|
347
|
+
outputTokens,
|
|
348
|
+
},
|
|
349
|
+
},
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
private buildFinalContent(
|
|
354
|
+
contentBlocks: Map<
|
|
355
|
+
number,
|
|
356
|
+
{ type: 'text' | 'tool_use'; text?: string; id?: string; name?: string; input?: string }
|
|
357
|
+
>,
|
|
358
|
+
toolInputBuffers: Map<number, { id: string; name: string; input: string }>
|
|
359
|
+
): MessageContent[] {
|
|
360
|
+
const result: MessageContent[] = [];
|
|
361
|
+
|
|
362
|
+
const sortedIndices = Array.from(contentBlocks.keys()).sort((a, b) => a - b);
|
|
363
|
+
|
|
364
|
+
for (const index of sortedIndices) {
|
|
365
|
+
const block = contentBlocks.get(index);
|
|
366
|
+
if (!block) continue;
|
|
367
|
+
|
|
368
|
+
if (block.type === 'text' && block.text) {
|
|
369
|
+
result.push({ type: 'text', text: block.text });
|
|
370
|
+
} else if (block.type === 'tool_use' && block.id && block.name) {
|
|
371
|
+
const toolBuffer = toolInputBuffers.get(index);
|
|
372
|
+
let input: Record<string, unknown> = {};
|
|
373
|
+
try {
|
|
374
|
+
input = JSON.parse(toolBuffer?.input ?? '{}');
|
|
375
|
+
} catch {
|
|
376
|
+
// Use empty object if parsing fails
|
|
377
|
+
}
|
|
378
|
+
result.push({
|
|
379
|
+
type: 'tool_use',
|
|
380
|
+
id: block.id,
|
|
381
|
+
name: block.name,
|
|
382
|
+
input,
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
return result;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
private convertMessages(messages: Message[]): VertexAIMessage[] {
|
|
391
|
+
const result: VertexAIMessage[] = [];
|
|
392
|
+
|
|
393
|
+
for (const msg of messages) {
|
|
394
|
+
// Skip system messages - handled separately
|
|
395
|
+
if (msg.role === 'system') {
|
|
396
|
+
continue;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
if (msg.role === 'user') {
|
|
400
|
+
const content = this.convertToVertexContent(msg.content, 'user');
|
|
401
|
+
result.push({ role: 'user', content });
|
|
402
|
+
} else if (msg.role === 'assistant') {
|
|
403
|
+
const content = this.convertToVertexContent(msg.content, 'assistant');
|
|
404
|
+
result.push({ role: 'assistant', content });
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
return result;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
private convertToVertexContent(
|
|
412
|
+
content: string | MessageContent[],
|
|
413
|
+
role: 'user' | 'assistant'
|
|
414
|
+
): VertexAIContent[] | string {
|
|
415
|
+
if (typeof content === 'string') {
|
|
416
|
+
return content;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
const result: VertexAIContent[] = [];
|
|
420
|
+
|
|
421
|
+
for (const item of content) {
|
|
422
|
+
if (item.type === 'text') {
|
|
423
|
+
result.push({ type: 'text', text: item.text });
|
|
424
|
+
} else if (item.type === 'tool_use' && role === 'assistant') {
|
|
425
|
+
result.push({
|
|
426
|
+
type: 'tool_use',
|
|
427
|
+
id: item.id,
|
|
428
|
+
name: item.name,
|
|
429
|
+
input: item.input,
|
|
430
|
+
});
|
|
431
|
+
} else if (item.type === 'tool_result' && role === 'user') {
|
|
432
|
+
result.push({
|
|
433
|
+
type: 'tool_result',
|
|
434
|
+
tool_use_id: item.toolUseId,
|
|
435
|
+
content: item.content,
|
|
436
|
+
is_error: item.isError,
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
return result.length > 0 ? result : '';
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
private convertTools(tools: ToolDefinition[]): VertexAITool[] {
|
|
445
|
+
return tools.map((tool) => ({
|
|
446
|
+
name: tool.name,
|
|
447
|
+
description: tool.description,
|
|
448
|
+
input_schema: tool.parameters as VertexAITool['input_schema'],
|
|
449
|
+
}));
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
private convertResponse(response: VertexAIResponse): CompletionResponse {
|
|
453
|
+
return {
|
|
454
|
+
content: this.convertContent(response.content),
|
|
455
|
+
stopReason: this.convertStopReason(response.stop_reason),
|
|
456
|
+
usage: {
|
|
457
|
+
inputTokens: response.usage.input_tokens,
|
|
458
|
+
outputTokens: response.usage.output_tokens,
|
|
459
|
+
},
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
private convertContent(
|
|
464
|
+
content: Array<{
|
|
465
|
+
type: 'text' | 'tool_use';
|
|
466
|
+
text?: string;
|
|
467
|
+
id?: string;
|
|
468
|
+
name?: string;
|
|
469
|
+
input?: Record<string, unknown>;
|
|
470
|
+
}>
|
|
471
|
+
): MessageContent[] {
|
|
472
|
+
return content.map((block) => {
|
|
473
|
+
if (block.type === 'text') {
|
|
474
|
+
return { type: 'text' as const, text: block.text ?? '' };
|
|
475
|
+
} else if (block.type === 'tool_use') {
|
|
476
|
+
return {
|
|
477
|
+
type: 'tool_use' as const,
|
|
478
|
+
id: block.id ?? '',
|
|
479
|
+
name: block.name ?? '',
|
|
480
|
+
input: block.input ?? {},
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
// Fallback for unknown types
|
|
484
|
+
return { type: 'text' as const, text: '' };
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
private convertStopReason(reason: string): StopReason {
|
|
489
|
+
switch (reason) {
|
|
490
|
+
case 'tool_use':
|
|
491
|
+
return 'tool_use';
|
|
492
|
+
case 'max_tokens':
|
|
493
|
+
return 'max_tokens';
|
|
494
|
+
case 'stop_sequence':
|
|
495
|
+
return 'stop_sequence';
|
|
496
|
+
case 'end_turn':
|
|
497
|
+
default:
|
|
498
|
+
return 'end_turn';
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
async listModels(): Promise<ModelInfo[]> {
|
|
503
|
+
// Use Vertex AI Model Garden API to list Anthropic publisher models
|
|
504
|
+
// API: GET https://{region}-aiplatform.googleapis.com/v1beta1/publishers/anthropic/models
|
|
505
|
+
const accessToken = await this.getAccessToken();
|
|
506
|
+
const endpoint = `https://${this.region}-aiplatform.googleapis.com/v1beta1/publishers/anthropic/models`;
|
|
507
|
+
|
|
508
|
+
try {
|
|
509
|
+
const response = await fetch(endpoint, {
|
|
510
|
+
method: 'GET',
|
|
511
|
+
headers: {
|
|
512
|
+
Authorization: `Bearer ${accessToken}`,
|
|
513
|
+
'Content-Type': 'application/json',
|
|
514
|
+
},
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
if (!response.ok) {
|
|
518
|
+
// Fall back to known models if API fails
|
|
519
|
+
return this.getKnownModels();
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
const data = (await response.json()) as {
|
|
523
|
+
publisherModels?: Array<{
|
|
524
|
+
name?: string;
|
|
525
|
+
versionId?: string;
|
|
526
|
+
openSourceCategory?: string;
|
|
527
|
+
supportedActions?: Record<string, unknown>;
|
|
528
|
+
publisherModelTemplate?: string;
|
|
529
|
+
}>;
|
|
530
|
+
};
|
|
531
|
+
|
|
532
|
+
if (!data.publisherModels || data.publisherModels.length === 0) {
|
|
533
|
+
return this.getKnownModels();
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
const models: ModelInfo[] = [];
|
|
537
|
+
for (const model of data.publisherModels) {
|
|
538
|
+
// Extract model ID from name (e.g., "publishers/anthropic/models/claude-3-5-sonnet")
|
|
539
|
+
const modelName = model.name ?? '';
|
|
540
|
+
const modelId = modelName.split('/').pop() ?? '';
|
|
541
|
+
|
|
542
|
+
if (modelId && modelId.includes('claude')) {
|
|
543
|
+
// Add version suffix if available
|
|
544
|
+
const versionedId = model.versionId ? `${modelId}@${model.versionId}` : modelId;
|
|
545
|
+
models.push({
|
|
546
|
+
id: versionedId,
|
|
547
|
+
name: this.formatModelName(modelId),
|
|
548
|
+
description: `Claude model on Vertex AI`,
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
return models.length > 0 ? models : this.getKnownModels();
|
|
554
|
+
} catch {
|
|
555
|
+
// Fall back to known models on error
|
|
556
|
+
return this.getKnownModels();
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
private formatModelName(modelId: string): string {
|
|
561
|
+
// Convert model ID to human-readable name
|
|
562
|
+
// e.g., "claude-3-5-sonnet" -> "Claude 3.5 Sonnet"
|
|
563
|
+
return modelId
|
|
564
|
+
.split('-')
|
|
565
|
+
.map((part) => {
|
|
566
|
+
if (part === 'claude') return 'Claude';
|
|
567
|
+
if (/^\d+$/.test(part)) return part;
|
|
568
|
+
return part.charAt(0).toUpperCase() + part.slice(1);
|
|
569
|
+
})
|
|
570
|
+
.join(' ')
|
|
571
|
+
.replace(/(\d) (\d)/g, '$1.$2'); // "3 5" -> "3.5"
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
private getKnownModels(): ModelInfo[] {
|
|
575
|
+
// Fallback known models when API is unavailable
|
|
576
|
+
return [
|
|
577
|
+
{
|
|
578
|
+
id: 'claude-sonnet-4-5@20250929',
|
|
579
|
+
name: 'Claude Sonnet 4.5',
|
|
580
|
+
description: 'Latest Claude Sonnet model on Vertex AI',
|
|
581
|
+
},
|
|
582
|
+
{
|
|
583
|
+
id: 'claude-haiku-4-5@20251001',
|
|
584
|
+
name: 'Claude Haiku 4.5',
|
|
585
|
+
description: 'Fast and efficient Claude model',
|
|
586
|
+
},
|
|
587
|
+
{
|
|
588
|
+
id: 'claude-opus-4-1@20250805',
|
|
589
|
+
name: 'Claude Opus 4.1',
|
|
590
|
+
description: 'Most capable Claude model',
|
|
591
|
+
},
|
|
592
|
+
];
|
|
593
|
+
}
|
|
594
|
+
}
|
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
import { spawn } from 'child_process';
|
|
6
6
|
import type { Tool, ToolContext, ToolResult } from '../types.js';
|
|
7
7
|
import { BashInputSchema, type BashInput } from '../types.js';
|
|
8
|
+
import { loadToolDescription } from '../../prompts/index.js';
|
|
8
9
|
|
|
9
10
|
export const bashTool: Tool<BashInput> = {
|
|
10
11
|
name: 'Bash',
|
|
11
|
-
description: '
|
|
12
|
+
description: loadToolDescription('bash'),
|
|
12
13
|
parameters: BashInputSchema,
|
|
13
14
|
|
|
14
15
|
async execute(input: BashInput, context: ToolContext): Promise<ToolResult> {
|
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
import * as fs from 'fs/promises';
|
|
6
6
|
import type { Tool, ToolResult } from '../types.js';
|
|
7
7
|
import { EditInputSchema, type EditInput, resolvePath, getErrorMessage } from '../types.js';
|
|
8
|
+
import { loadToolDescription } from '../../prompts/index.js';
|
|
8
9
|
|
|
9
10
|
export const editTool: Tool<EditInput> = {
|
|
10
11
|
name: 'Edit',
|
|
11
|
-
description: '
|
|
12
|
+
description: loadToolDescription('edit'),
|
|
12
13
|
parameters: EditInputSchema,
|
|
13
14
|
|
|
14
15
|
async execute(input, context): Promise<ToolResult> {
|
|
@@ -5,12 +5,13 @@
|
|
|
5
5
|
import fastGlob from 'fast-glob';
|
|
6
6
|
import type { Tool, ToolResult } from '../types.js';
|
|
7
7
|
import { GlobInputSchema, type GlobInput, resolvePath, getErrorMessage } from '../types.js';
|
|
8
|
+
import { loadToolDescription } from '../../prompts/index.js';
|
|
8
9
|
|
|
9
10
|
const MAX_RESULTS = 100;
|
|
10
11
|
|
|
11
12
|
export const globTool: Tool<GlobInput> = {
|
|
12
13
|
name: 'Glob',
|
|
13
|
-
description: '
|
|
14
|
+
description: loadToolDescription('glob'),
|
|
14
15
|
parameters: GlobInputSchema,
|
|
15
16
|
|
|
16
17
|
async execute(input, context): Promise<ToolResult> {
|
|
@@ -7,12 +7,13 @@ import * as path from 'path';
|
|
|
7
7
|
import fastGlob from 'fast-glob';
|
|
8
8
|
import type { Tool, ToolResult } from '../types.js';
|
|
9
9
|
import { GrepInputSchema, type GrepInput, resolvePath, getErrorMessage } from '../types.js';
|
|
10
|
+
import { loadToolDescription } from '../../prompts/index.js';
|
|
10
11
|
|
|
11
12
|
const MAX_MATCHES = 50;
|
|
12
13
|
|
|
13
14
|
export const grepTool: Tool<GrepInput> = {
|
|
14
15
|
name: 'Grep',
|
|
15
|
-
description: '
|
|
16
|
+
description: loadToolDescription('grep'),
|
|
16
17
|
parameters: GrepInputSchema,
|
|
17
18
|
|
|
18
19
|
async execute(input, context): Promise<ToolResult> {
|
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
import * as fs from 'fs/promises';
|
|
6
6
|
import type { Tool, ToolResult } from '../types.js';
|
|
7
7
|
import { ReadInputSchema, type ReadInput, resolvePath, getErrorMessage } from '../types.js';
|
|
8
|
+
import { loadToolDescription } from '../../prompts/index.js';
|
|
8
9
|
|
|
9
10
|
export const readTool: Tool<ReadInput> = {
|
|
10
11
|
name: 'Read',
|
|
11
|
-
description: '
|
|
12
|
+
description: loadToolDescription('read'),
|
|
12
13
|
parameters: ReadInputSchema,
|
|
13
14
|
|
|
14
15
|
async execute(input, context): Promise<ToolResult> {
|