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.
Files changed (149) hide show
  1. package/README.md +8 -90
  2. package/dist/agent/agent.d.ts +1 -1
  3. package/dist/agent/agent.d.ts.map +1 -1
  4. package/dist/agent/agent.js +8 -2
  5. package/dist/agent/agent.js.map +1 -1
  6. package/dist/agent/types.d.ts +9 -1
  7. package/dist/agent/types.d.ts.map +1 -1
  8. package/dist/cli/components/AllModelsSelector.d.ts +11 -0
  9. package/dist/cli/components/AllModelsSelector.d.ts.map +1 -0
  10. package/dist/cli/components/AllModelsSelector.js +153 -0
  11. package/dist/cli/components/AllModelsSelector.js.map +1 -0
  12. package/dist/cli/components/App.d.ts.map +1 -1
  13. package/dist/cli/components/App.js +59 -25
  14. package/dist/cli/components/App.js.map +1 -1
  15. package/dist/cli/components/CommandSuggestions.d.ts.map +1 -1
  16. package/dist/cli/components/CommandSuggestions.js +1 -0
  17. package/dist/cli/components/CommandSuggestions.js.map +1 -1
  18. package/dist/cli/components/Messages.d.ts +15 -1
  19. package/dist/cli/components/Messages.d.ts.map +1 -1
  20. package/dist/cli/components/Messages.js +41 -15
  21. package/dist/cli/components/Messages.js.map +1 -1
  22. package/dist/cli/components/ModelSelector.d.ts +7 -7
  23. package/dist/cli/components/ModelSelector.d.ts.map +1 -1
  24. package/dist/cli/components/ModelSelector.js +116 -33
  25. package/dist/cli/components/ModelSelector.js.map +1 -1
  26. package/dist/cli/components/ProviderManager.d.ts +8 -0
  27. package/dist/cli/components/ProviderManager.d.ts.map +1 -0
  28. package/dist/cli/components/ProviderManager.js +280 -0
  29. package/dist/cli/components/ProviderManager.js.map +1 -0
  30. package/dist/cli/components/markdown.d.ts +9 -0
  31. package/dist/cli/components/markdown.d.ts.map +1 -0
  32. package/dist/cli/components/markdown.js +129 -0
  33. package/dist/cli/components/markdown.js.map +1 -0
  34. package/dist/cli/components/theme.d.ts +5 -0
  35. package/dist/cli/components/theme.d.ts.map +1 -1
  36. package/dist/cli/components/theme.js +7 -0
  37. package/dist/cli/components/theme.js.map +1 -1
  38. package/dist/cli/index.js +19 -5
  39. package/dist/cli/index.js.map +1 -1
  40. package/dist/config/index.d.ts +3 -2
  41. package/dist/config/index.d.ts.map +1 -1
  42. package/dist/config/index.js +2 -1
  43. package/dist/config/index.js.map +1 -1
  44. package/dist/config/providers-config.d.ts +28 -0
  45. package/dist/config/providers-config.d.ts.map +1 -0
  46. package/dist/config/providers-config.js +79 -0
  47. package/dist/config/providers-config.js.map +1 -0
  48. package/dist/config/types.d.ts +31 -1
  49. package/dist/config/types.d.ts.map +1 -1
  50. package/dist/config/types.js +1 -0
  51. package/dist/config/types.js.map +1 -1
  52. package/dist/providers/gemini.d.ts.map +1 -1
  53. package/dist/providers/gemini.js +14 -3
  54. package/dist/providers/gemini.js.map +1 -1
  55. package/dist/providers/index.d.ts +5 -3
  56. package/dist/providers/index.d.ts.map +1 -1
  57. package/dist/providers/index.js +13 -1
  58. package/dist/providers/index.js.map +1 -1
  59. package/dist/providers/registry.d.ts +66 -0
  60. package/dist/providers/registry.d.ts.map +1 -0
  61. package/dist/providers/registry.js +158 -0
  62. package/dist/providers/registry.js.map +1 -0
  63. package/dist/providers/search/brave.d.ts +14 -0
  64. package/dist/providers/search/brave.d.ts.map +1 -0
  65. package/dist/providers/search/brave.js +87 -0
  66. package/dist/providers/search/brave.js.map +1 -0
  67. package/dist/providers/search/exa.d.ts +12 -0
  68. package/dist/providers/search/exa.d.ts.map +1 -0
  69. package/dist/providers/search/exa.js +158 -0
  70. package/dist/providers/search/exa.js.map +1 -0
  71. package/dist/providers/search/index.d.ts +31 -0
  72. package/dist/providers/search/index.d.ts.map +1 -0
  73. package/dist/providers/search/index.js +75 -0
  74. package/dist/providers/search/index.js.map +1 -0
  75. package/dist/providers/search/serper.d.ts +14 -0
  76. package/dist/providers/search/serper.d.ts.map +1 -0
  77. package/dist/providers/search/serper.js +87 -0
  78. package/dist/providers/search/serper.js.map +1 -0
  79. package/dist/providers/search/types.d.ts +21 -0
  80. package/dist/providers/search/types.d.ts.map +1 -0
  81. package/dist/providers/search/types.js +5 -0
  82. package/dist/providers/search/types.js.map +1 -0
  83. package/dist/providers/store.d.ts +104 -0
  84. package/dist/providers/store.d.ts.map +1 -0
  85. package/dist/providers/store.js +171 -0
  86. package/dist/providers/store.js.map +1 -0
  87. package/dist/providers/types.d.ts +7 -1
  88. package/dist/providers/types.d.ts.map +1 -1
  89. package/dist/providers/vertex-ai.d.ts +33 -0
  90. package/dist/providers/vertex-ai.d.ts.map +1 -0
  91. package/dist/providers/vertex-ai.js +407 -0
  92. package/dist/providers/vertex-ai.js.map +1 -0
  93. package/dist/tools/builtin/webfetch.d.ts +20 -0
  94. package/dist/tools/builtin/webfetch.d.ts.map +1 -0
  95. package/dist/tools/builtin/webfetch.js +231 -0
  96. package/dist/tools/builtin/webfetch.js.map +1 -0
  97. package/dist/tools/builtin/websearch.d.ts +17 -0
  98. package/dist/tools/builtin/websearch.d.ts.map +1 -0
  99. package/dist/tools/builtin/websearch.js +101 -0
  100. package/dist/tools/builtin/websearch.js.map +1 -0
  101. package/dist/tools/index.d.ts +11 -0
  102. package/dist/tools/index.d.ts.map +1 -1
  103. package/dist/tools/index.js +24 -2
  104. package/dist/tools/index.js.map +1 -1
  105. package/dist/tools/types.d.ts +19 -0
  106. package/dist/tools/types.d.ts.map +1 -1
  107. package/dist/tools/types.js +8 -0
  108. package/dist/tools/types.js.map +1 -1
  109. package/dist/tools/utils/ssrf.d.ts +18 -0
  110. package/dist/tools/utils/ssrf.d.ts.map +1 -0
  111. package/dist/tools/utils/ssrf.js +70 -0
  112. package/dist/tools/utils/ssrf.js.map +1 -0
  113. package/docs/README.md +5 -4
  114. package/docs/proposals/0001-web-fetch-tool.md +32 -2
  115. package/docs/proposals/0002-web-search-tool.md +59 -2
  116. package/docs/proposals/0041-configuration-system.md +556 -0
  117. package/docs/proposals/README.md +3 -2
  118. package/docs/providers.md +220 -0
  119. package/package.json +7 -2
  120. package/src/agent/agent.ts +9 -2
  121. package/src/agent/types.ts +9 -1
  122. package/src/cli/components/App.tsx +72 -23
  123. package/src/cli/components/CommandSuggestions.tsx +1 -0
  124. package/src/cli/components/Messages.tsx +117 -29
  125. package/src/cli/components/ModelSelector.tsx +169 -52
  126. package/src/cli/components/ProviderManager.tsx +534 -0
  127. package/src/cli/components/markdown.ts +157 -0
  128. package/src/cli/components/theme.ts +7 -0
  129. package/src/cli/index.tsx +22 -7
  130. package/src/config/index.ts +3 -2
  131. package/src/config/providers-config.ts +85 -0
  132. package/src/config/types.ts +35 -1
  133. package/src/providers/gemini.ts +20 -4
  134. package/src/providers/index.ts +18 -3
  135. package/src/providers/registry.ts +198 -0
  136. package/src/providers/search/brave.ts +132 -0
  137. package/src/providers/search/exa.ts +217 -0
  138. package/src/providers/search/index.ts +79 -0
  139. package/src/providers/search/serper.ts +133 -0
  140. package/src/providers/search/types.ts +24 -0
  141. package/src/providers/store.ts +216 -0
  142. package/src/providers/types.ts +9 -1
  143. package/src/providers/vertex-ai.ts +594 -0
  144. package/src/tools/builtin/webfetch.ts +264 -0
  145. package/src/tools/builtin/websearch.ts +117 -0
  146. package/src/tools/index.ts +24 -2
  147. package/src/tools/types.ts +20 -0
  148. package/src/tools/utils/ssrf.ts +79 -0
  149. 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
- # mycode Documentation
1
+ # GenCode Documentation
2
2
 
3
- This directory contains documentation for the mycode project.
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 mycode
10
+ ## About GenCode
10
11
 
11
- mycode is an open-source, provider-agnostic alternative to Claude Code. It brings Claude Code's excellent interactive CLI experience while allowing flexible switching between different LLM providers (OpenAI, Anthropic, Google Gemini).
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**: mycode team
5
- - **Status**: Draft
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**: mycode team
5
- - **Status**: Draft
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
+ ```