gencode-ai 0.1.0 → 0.1.1
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/README.md +8 -90
- package/dist/agent/agent.d.ts +1 -1
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +8 -2
- 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.map +1 -1
- package/dist/cli/components/App.js +59 -25
- 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 +1 -0
- package/dist/cli/components/CommandSuggestions.js.map +1 -1
- package/dist/cli/components/Messages.d.ts +15 -1
- package/dist/cli/components/Messages.d.ts.map +1 -1
- package/dist/cli/components/Messages.js +41 -15
- 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/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/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 +19 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/config/index.d.ts +3 -2
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +2 -1
- package/dist/config/index.js.map +1 -1
- 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/types.d.ts +31 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +1 -0
- package/dist/config/types.js.map +1 -1
- 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/webfetch.d.ts +20 -0
- package/dist/tools/builtin/webfetch.d.ts.map +1 -0
- package/dist/tools/builtin/webfetch.js +231 -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 +101 -0
- package/dist/tools/builtin/websearch.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +24 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/types.d.ts +19 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +8 -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/proposals/0001-web-fetch-tool.md +32 -2
- package/docs/proposals/0002-web-search-tool.md +59 -2
- package/docs/proposals/0041-configuration-system.md +556 -0
- package/docs/proposals/README.md +3 -2
- package/docs/providers.md +220 -0
- package/package.json +7 -2
- package/src/agent/agent.ts +9 -2
- package/src/agent/types.ts +9 -1
- package/src/cli/components/App.tsx +72 -23
- package/src/cli/components/CommandSuggestions.tsx +1 -0
- package/src/cli/components/Messages.tsx +117 -29
- package/src/cli/components/ModelSelector.tsx +169 -52
- package/src/cli/components/ProviderManager.tsx +534 -0
- package/src/cli/components/markdown.ts +157 -0
- package/src/cli/components/theme.ts +7 -0
- package/src/cli/index.tsx +22 -7
- package/src/config/index.ts +3 -2
- package/src/config/providers-config.ts +85 -0
- package/src/config/types.ts +35 -1
- 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/webfetch.ts +264 -0
- package/src/tools/builtin/websearch.ts +117 -0
- package/src/tools/index.ts +24 -2
- package/src/tools/types.ts +20 -0
- package/src/tools/utils/ssrf.ts +79 -0
- package/CLAUDE.md +0 -70
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSRF Protection Utilities
|
|
3
|
+
* Prevents Server-Side Request Forgery by blocking internal/private addresses
|
|
4
|
+
*/
|
|
5
|
+
// Private IP ranges (RFC 1918 + loopback + link-local + cloud metadata)
|
|
6
|
+
const PRIVATE_IP_PATTERNS = [
|
|
7
|
+
/^127\./, // Loopback (127.0.0.0/8)
|
|
8
|
+
/^10\./, // Class A private (10.0.0.0/8)
|
|
9
|
+
/^172\.(1[6-9]|2[0-9]|3[01])\./, // Class B private (172.16.0.0/12)
|
|
10
|
+
/^192\.168\./, // Class C private (192.168.0.0/16)
|
|
11
|
+
/^169\.254\./, // Link-local (169.254.0.0/16)
|
|
12
|
+
/^0\./, // "This" network
|
|
13
|
+
/^::1$/, // IPv6 loopback
|
|
14
|
+
/^fe80:/i, // IPv6 link-local
|
|
15
|
+
/^fc00:/i, // IPv6 unique local
|
|
16
|
+
/^fd[0-9a-f]{2}:/i, // IPv6 unique local
|
|
17
|
+
];
|
|
18
|
+
const BLOCKED_HOSTNAMES = [
|
|
19
|
+
'localhost',
|
|
20
|
+
'localhost.localdomain',
|
|
21
|
+
'metadata.google.internal', // GCP metadata
|
|
22
|
+
'169.254.169.254', // AWS/GCP/Azure metadata
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* Check if an IP address is in a private range
|
|
26
|
+
*/
|
|
27
|
+
export function isPrivateIP(ip) {
|
|
28
|
+
return PRIVATE_IP_PATTERNS.some((pattern) => pattern.test(ip));
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Check if a hostname is blocked
|
|
32
|
+
*/
|
|
33
|
+
export function isBlockedHostname(hostname) {
|
|
34
|
+
const lower = hostname.toLowerCase();
|
|
35
|
+
// Direct match
|
|
36
|
+
if (BLOCKED_HOSTNAMES.includes(lower)) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
// Check .local suffix
|
|
40
|
+
if (lower.endsWith('.local')) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Validate a URL for SSRF protection
|
|
47
|
+
* Throws an error if the URL is not allowed
|
|
48
|
+
*/
|
|
49
|
+
export function validateUrl(urlString) {
|
|
50
|
+
let parsed;
|
|
51
|
+
try {
|
|
52
|
+
parsed = new URL(urlString);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
throw new Error('Invalid URL format');
|
|
56
|
+
}
|
|
57
|
+
// Only allow http/https protocols
|
|
58
|
+
if (!['http:', 'https:'].includes(parsed.protocol)) {
|
|
59
|
+
throw new Error('Only http:// and https:// URLs are supported');
|
|
60
|
+
}
|
|
61
|
+
// Check hostname blocklist
|
|
62
|
+
if (isBlockedHostname(parsed.hostname)) {
|
|
63
|
+
throw new Error('Access to internal/local addresses is not allowed');
|
|
64
|
+
}
|
|
65
|
+
// Check if hostname is a private IP
|
|
66
|
+
if (isPrivateIP(parsed.hostname)) {
|
|
67
|
+
throw new Error('Access to private IP addresses is not allowed');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=ssrf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssrf.js","sourceRoot":"","sources":["../../../src/tools/utils/ssrf.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wEAAwE;AACxE,MAAM,mBAAmB,GAAG;IAC1B,QAAQ,EAA6B,yBAAyB;IAC9D,OAAO,EAA8B,+BAA+B;IACpE,+BAA+B,EAAK,kCAAkC;IACtE,aAAa,EAAwB,mCAAmC;IACxE,aAAa,EAAwB,8BAA8B;IACnE,MAAM,EAA+B,iBAAiB;IACtD,OAAO,EAA8B,gBAAgB;IACrD,SAAS,EAA4B,kBAAkB;IACvD,SAAS,EAA4B,oBAAoB;IACzD,kBAAkB,EAAmB,oBAAoB;CAC1D,CAAC;AAEF,MAAM,iBAAiB,GAAG;IACxB,WAAW;IACX,uBAAuB;IACvB,0BAA0B,EAAI,eAAe;IAC7C,iBAAiB,EAAa,yBAAyB;CACxD,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAErC,eAAe;IACf,IAAI,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sBAAsB;IACtB,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,kCAAkC;IAClC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,2BAA2B;IAC3B,IAAI,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,oCAAoC;IACpC,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;AACH,CAAC"}
|
package/docs/README.md
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
#
|
|
1
|
+
# GenCode Documentation
|
|
2
2
|
|
|
3
|
-
This directory contains documentation for the
|
|
3
|
+
This directory contains documentation for the GenCode project.
|
|
4
4
|
|
|
5
5
|
## Contents
|
|
6
6
|
|
|
7
|
+
- [**providers-and-models.md**](./providers-and-models.md) - Provider management and model selection
|
|
7
8
|
- [**proposals/**](./proposals/) - Enhancement proposals for new features
|
|
8
9
|
|
|
9
|
-
## About
|
|
10
|
+
## About GenCode
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
GenCode is an open-source, provider-agnostic AI coding assistant. It brings Claude Code's excellent interactive CLI experience while allowing flexible switching between different LLM providers (OpenAI, Anthropic, Google Gemini, Vertex AI).
|
|
12
13
|
|
|
13
14
|
## Quick Links
|
|
14
15
|
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
# Proposal: WebFetch Tool
|
|
2
2
|
|
|
3
3
|
- **Proposal ID**: 0001
|
|
4
|
-
- **Author**:
|
|
5
|
-
- **Status**:
|
|
4
|
+
- **Author**: Meng Yan
|
|
5
|
+
- **Status**: Implemented
|
|
6
6
|
- **Created**: 2025-01-15
|
|
7
7
|
- **Updated**: 2025-01-15
|
|
8
|
+
- **Implemented**: 2025-01-15
|
|
8
9
|
|
|
9
10
|
## Summary
|
|
10
11
|
|
|
@@ -286,6 +287,35 @@ const BLOCKED_HOSTS = [
|
|
|
286
287
|
|
|
287
288
|
No breaking changes to existing functionality.
|
|
288
289
|
|
|
290
|
+
## Implementation Notes
|
|
291
|
+
|
|
292
|
+
### Files Created/Modified
|
|
293
|
+
|
|
294
|
+
| File | Action | Description |
|
|
295
|
+
|------|--------|-------------|
|
|
296
|
+
| `src/tools/utils/ssrf.ts` | Created | SSRF protection utilities |
|
|
297
|
+
| `src/tools/builtin/webfetch.ts` | Created | WebFetch tool implementation |
|
|
298
|
+
| `src/tools/types.ts` | Modified | Added ToolResultMetadata interface |
|
|
299
|
+
| `src/tools/index.ts` | Modified | Registered webfetchTool |
|
|
300
|
+
| `src/cli/components/Messages.tsx` | Modified | Improved tool display (Claude Code style) |
|
|
301
|
+
| `src/cli/components/theme.ts` | Modified | Added fetch icon |
|
|
302
|
+
| `package.json` | Modified | Added turndown dependency |
|
|
303
|
+
|
|
304
|
+
### Key Implementation Details
|
|
305
|
+
|
|
306
|
+
1. **HTML to Markdown**: Uses `turndown` library for conversion
|
|
307
|
+
2. **SSRF Protection**: Blocks localhost, private IPs (10.x, 172.16-31.x, 192.168.x), cloud metadata (169.254.169.254)
|
|
308
|
+
3. **Size Limits**: 5MB max response size
|
|
309
|
+
4. **Timeout**: 30s default, 120s max
|
|
310
|
+
5. **Display**: Claude Code style (`● Fetch(url)` with `└ Received 540.3KB (200 OK)`)
|
|
311
|
+
|
|
312
|
+
### Display Example
|
|
313
|
+
|
|
314
|
+
```
|
|
315
|
+
● Fetch(https://example.com/docs)
|
|
316
|
+
└ Received 540.3KB (200 OK)
|
|
317
|
+
```
|
|
318
|
+
|
|
289
319
|
## References
|
|
290
320
|
|
|
291
321
|
- [Claude Code WebFetch Documentation](https://code.claude.com/docs/en/tools)
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
# Proposal: WebSearch Tool
|
|
2
2
|
|
|
3
3
|
- **Proposal ID**: 0002
|
|
4
|
-
- **Author**:
|
|
5
|
-
- **Status**:
|
|
4
|
+
- **Author**: Meng Yan
|
|
5
|
+
- **Status**: Implemented
|
|
6
6
|
- **Created**: 2025-01-15
|
|
7
7
|
- **Updated**: 2025-01-15
|
|
8
|
+
- **Implemented**: 2025-01-15
|
|
8
9
|
|
|
9
10
|
## Summary
|
|
10
11
|
|
|
@@ -304,3 +305,59 @@ Configuration required: User must provide search API key.
|
|
|
304
305
|
- [Serper API](https://serper.dev/)
|
|
305
306
|
- [Google Custom Search API](https://developers.google.com/custom-search)
|
|
306
307
|
- [Bing Web Search API](https://www.microsoft.com/en-us/bing/apis/bing-web-search-api)
|
|
308
|
+
|
|
309
|
+
## Implementation Notes
|
|
310
|
+
|
|
311
|
+
### Files Created/Modified
|
|
312
|
+
|
|
313
|
+
| File | Action | Description |
|
|
314
|
+
|------|--------|-------------|
|
|
315
|
+
| `src/providers/search/types.ts` | Created | Search provider interface and types |
|
|
316
|
+
| `src/providers/search/exa.ts` | Created | Exa AI provider (default, no API key required) |
|
|
317
|
+
| `src/providers/search/serper.ts` | Created | Serper.dev provider |
|
|
318
|
+
| `src/providers/search/brave.ts` | Created | Brave Search provider |
|
|
319
|
+
| `src/providers/search/index.ts` | Created | Factory function and exports |
|
|
320
|
+
| `src/providers/registry.ts` | Modified | Added SEARCH_PROVIDERS definitions |
|
|
321
|
+
| `src/providers/store.ts` | Modified | Added search provider selection methods |
|
|
322
|
+
| `src/tools/builtin/websearch.ts` | Created | WebSearch tool implementation |
|
|
323
|
+
| `src/tools/index.ts` | Modified | Registered websearchTool |
|
|
324
|
+
| `src/cli/components/ProviderManager.tsx` | Modified | Added Search Providers tab to `/provider` command |
|
|
325
|
+
|
|
326
|
+
### Key Implementation Details
|
|
327
|
+
|
|
328
|
+
1. **Multi-Provider Support**: Integrated into the existing provider system (`src/providers/`)
|
|
329
|
+
2. **Default Provider**: Exa AI - no API key required, works out of the box (like OpenCode)
|
|
330
|
+
3. **Optional Providers**: Serper.dev and Brave Search (require API keys)
|
|
331
|
+
4. **Provider Priority**: Configured in store > Environment variables > Default (Exa)
|
|
332
|
+
5. **Domain Filtering**: Supports `allowed_domains` and `blocked_domains` parameters
|
|
333
|
+
6. **Display**: Claude Code style with metadata (`Search("query")`, `Found N results via provider`)
|
|
334
|
+
7. **CLI Configuration**: Search providers can be configured via `/provider` command
|
|
335
|
+
|
|
336
|
+
### Configuration
|
|
337
|
+
|
|
338
|
+
**Method 1: Via `/provider` Command (Recommended)**
|
|
339
|
+
|
|
340
|
+
```
|
|
341
|
+
/provider
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
The Provider Management UI now has two tabs:
|
|
345
|
+
- `[L] LLM Providers` - Configure LLM providers (Anthropic, OpenAI, Gemini, etc.)
|
|
346
|
+
- `[S] Search Providers` - Configure search providers (Exa, Serper, Brave)
|
|
347
|
+
|
|
348
|
+
Use `Tab` or `S` to switch to Search Providers tab, then use arrow keys to select and `Enter` to confirm.
|
|
349
|
+
|
|
350
|
+
**Method 2: Via Environment Variables**
|
|
351
|
+
|
|
352
|
+
| Variable | Provider | Notes |
|
|
353
|
+
|----------|----------|-------|
|
|
354
|
+
| (none) | Exa AI | Default, no config needed |
|
|
355
|
+
| `SERPER_API_KEY` | Serper.dev | 2,500 free queries |
|
|
356
|
+
| `BRAVE_API_KEY` | Brave Search | 2,000 free/month |
|
|
357
|
+
|
|
358
|
+
### Display Example
|
|
359
|
+
|
|
360
|
+
```
|
|
361
|
+
● Search("TypeScript 5.4 features")
|
|
362
|
+
└ Found 10 results via exa
|
|
363
|
+
```
|