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.
Files changed (356) hide show
  1. package/.gencode/settings.local.json +7 -0
  2. package/README.md +20 -102
  3. package/dist/agent/agent.d.ts +43 -2
  4. package/dist/agent/agent.d.ts.map +1 -1
  5. package/dist/agent/agent.js +90 -17
  6. package/dist/agent/agent.js.map +1 -1
  7. package/dist/agent/types.d.ts +9 -1
  8. package/dist/agent/types.d.ts.map +1 -1
  9. package/dist/cli/components/AllModelsSelector.d.ts +11 -0
  10. package/dist/cli/components/AllModelsSelector.d.ts.map +1 -0
  11. package/dist/cli/components/AllModelsSelector.js +153 -0
  12. package/dist/cli/components/AllModelsSelector.js.map +1 -0
  13. package/dist/cli/components/App.d.ts +8 -1
  14. package/dist/cli/components/App.d.ts.map +1 -1
  15. package/dist/cli/components/App.js +276 -40
  16. package/dist/cli/components/App.js.map +1 -1
  17. package/dist/cli/components/CommandSuggestions.d.ts.map +1 -1
  18. package/dist/cli/components/CommandSuggestions.js +3 -0
  19. package/dist/cli/components/CommandSuggestions.js.map +1 -1
  20. package/dist/cli/components/Header.d.ts +1 -1
  21. package/dist/cli/components/Header.d.ts.map +1 -1
  22. package/dist/cli/components/Header.js +4 -6
  23. package/dist/cli/components/Header.js.map +1 -1
  24. package/dist/cli/components/Logo.d.ts +1 -0
  25. package/dist/cli/components/Logo.d.ts.map +1 -1
  26. package/dist/cli/components/Logo.js +16 -3
  27. package/dist/cli/components/Logo.js.map +1 -1
  28. package/dist/cli/components/Messages.d.ts +17 -3
  29. package/dist/cli/components/Messages.d.ts.map +1 -1
  30. package/dist/cli/components/Messages.js +70 -18
  31. package/dist/cli/components/Messages.js.map +1 -1
  32. package/dist/cli/components/ModelSelector.d.ts +7 -7
  33. package/dist/cli/components/ModelSelector.d.ts.map +1 -1
  34. package/dist/cli/components/ModelSelector.js +116 -33
  35. package/dist/cli/components/ModelSelector.js.map +1 -1
  36. package/dist/cli/components/PermissionPrompt.d.ts +60 -0
  37. package/dist/cli/components/PermissionPrompt.d.ts.map +1 -0
  38. package/dist/cli/components/PermissionPrompt.js +192 -0
  39. package/dist/cli/components/PermissionPrompt.js.map +1 -0
  40. package/dist/cli/components/ProviderManager.d.ts +8 -0
  41. package/dist/cli/components/ProviderManager.d.ts.map +1 -0
  42. package/dist/cli/components/ProviderManager.js +280 -0
  43. package/dist/cli/components/ProviderManager.js.map +1 -0
  44. package/dist/cli/components/Spinner.d.ts +7 -2
  45. package/dist/cli/components/Spinner.d.ts.map +1 -1
  46. package/dist/cli/components/Spinner.js +116 -25
  47. package/dist/cli/components/Spinner.js.map +1 -1
  48. package/dist/cli/components/TodoList.d.ts +7 -0
  49. package/dist/cli/components/TodoList.d.ts.map +1 -0
  50. package/dist/cli/components/TodoList.js +34 -0
  51. package/dist/cli/components/TodoList.js.map +1 -0
  52. package/dist/cli/components/index.d.ts +1 -0
  53. package/dist/cli/components/index.d.ts.map +1 -1
  54. package/dist/cli/components/index.js +1 -0
  55. package/dist/cli/components/index.js.map +1 -1
  56. package/dist/cli/components/markdown.d.ts +9 -0
  57. package/dist/cli/components/markdown.d.ts.map +1 -0
  58. package/dist/cli/components/markdown.js +129 -0
  59. package/dist/cli/components/markdown.js.map +1 -0
  60. package/dist/cli/components/theme.d.ts +5 -0
  61. package/dist/cli/components/theme.d.ts.map +1 -1
  62. package/dist/cli/components/theme.js +7 -0
  63. package/dist/cli/components/theme.js.map +1 -1
  64. package/dist/cli/index.js +66 -12
  65. package/dist/cli/index.js.map +1 -1
  66. package/dist/config/index.d.ts +14 -4
  67. package/dist/config/index.d.ts.map +1 -1
  68. package/dist/config/index.js +19 -3
  69. package/dist/config/index.js.map +1 -1
  70. package/dist/config/levels.d.ts +49 -0
  71. package/dist/config/levels.d.ts.map +1 -0
  72. package/dist/config/levels.js +222 -0
  73. package/dist/config/levels.js.map +1 -0
  74. package/dist/config/loader.d.ts +46 -0
  75. package/dist/config/loader.d.ts.map +1 -0
  76. package/dist/config/loader.js +153 -0
  77. package/dist/config/loader.js.map +1 -0
  78. package/dist/config/manager.d.ts +115 -15
  79. package/dist/config/manager.d.ts.map +1 -1
  80. package/dist/config/manager.js +260 -34
  81. package/dist/config/manager.js.map +1 -1
  82. package/dist/config/manager.test.d.ts +5 -0
  83. package/dist/config/manager.test.d.ts.map +1 -0
  84. package/dist/config/manager.test.js +192 -0
  85. package/dist/config/manager.test.js.map +1 -0
  86. package/dist/config/merger.d.ts +56 -0
  87. package/dist/config/merger.d.ts.map +1 -0
  88. package/dist/config/merger.js +177 -0
  89. package/dist/config/merger.js.map +1 -0
  90. package/dist/config/providers-config.d.ts +28 -0
  91. package/dist/config/providers-config.d.ts.map +1 -0
  92. package/dist/config/providers-config.js +79 -0
  93. package/dist/config/providers-config.js.map +1 -0
  94. package/dist/config/test-utils.d.ts +24 -0
  95. package/dist/config/test-utils.d.ts.map +1 -0
  96. package/dist/config/test-utils.js +55 -0
  97. package/dist/config/test-utils.js.map +1 -0
  98. package/dist/config/types.d.ts +108 -9
  99. package/dist/config/types.d.ts.map +1 -1
  100. package/dist/config/types.js +53 -2
  101. package/dist/config/types.js.map +1 -1
  102. package/dist/memory/import-resolver.d.ts +46 -0
  103. package/dist/memory/import-resolver.d.ts.map +1 -0
  104. package/dist/memory/import-resolver.js +117 -0
  105. package/dist/memory/import-resolver.js.map +1 -0
  106. package/dist/memory/index.d.ts +7 -6
  107. package/dist/memory/index.d.ts.map +1 -1
  108. package/dist/memory/index.js +7 -5
  109. package/dist/memory/index.js.map +1 -1
  110. package/dist/memory/init-prompt.d.ts +22 -0
  111. package/dist/memory/init-prompt.d.ts.map +1 -0
  112. package/dist/memory/init-prompt.js +103 -0
  113. package/dist/memory/init-prompt.js.map +1 -0
  114. package/dist/memory/memory-manager.d.ts +119 -0
  115. package/dist/memory/memory-manager.d.ts.map +1 -0
  116. package/dist/memory/memory-manager.js +587 -0
  117. package/dist/memory/memory-manager.js.map +1 -0
  118. package/dist/memory/rules-parser.d.ts +38 -0
  119. package/dist/memory/rules-parser.d.ts.map +1 -0
  120. package/dist/memory/rules-parser.js +69 -0
  121. package/dist/memory/rules-parser.js.map +1 -0
  122. package/dist/memory/test-utils.d.ts +20 -0
  123. package/dist/memory/test-utils.d.ts.map +1 -0
  124. package/dist/memory/test-utils.js +44 -0
  125. package/dist/memory/test-utils.js.map +1 -0
  126. package/dist/memory/types.d.ts +70 -63
  127. package/dist/memory/types.d.ts.map +1 -1
  128. package/dist/memory/types.js +42 -2
  129. package/dist/memory/types.js.map +1 -1
  130. package/dist/permissions/audit.d.ts +82 -0
  131. package/dist/permissions/audit.d.ts.map +1 -0
  132. package/dist/permissions/audit.js +229 -0
  133. package/dist/permissions/audit.js.map +1 -0
  134. package/dist/permissions/index.d.ts +11 -1
  135. package/dist/permissions/index.d.ts.map +1 -1
  136. package/dist/permissions/index.js +15 -0
  137. package/dist/permissions/index.js.map +1 -1
  138. package/dist/permissions/manager.d.ts +149 -13
  139. package/dist/permissions/manager.d.ts.map +1 -1
  140. package/dist/permissions/manager.js +480 -35
  141. package/dist/permissions/manager.js.map +1 -1
  142. package/dist/permissions/manager.test.d.ts +5 -0
  143. package/dist/permissions/manager.test.d.ts.map +1 -0
  144. package/dist/permissions/manager.test.js +213 -0
  145. package/dist/permissions/manager.test.js.map +1 -0
  146. package/dist/permissions/persistence.d.ts +74 -0
  147. package/dist/permissions/persistence.d.ts.map +1 -0
  148. package/dist/permissions/persistence.js +248 -0
  149. package/dist/permissions/persistence.js.map +1 -0
  150. package/dist/permissions/persistence.test.d.ts +5 -0
  151. package/dist/permissions/persistence.test.d.ts.map +1 -0
  152. package/dist/permissions/persistence.test.js +171 -0
  153. package/dist/permissions/persistence.test.js.map +1 -0
  154. package/dist/permissions/prompt-matcher.d.ts +64 -0
  155. package/dist/permissions/prompt-matcher.d.ts.map +1 -0
  156. package/dist/permissions/prompt-matcher.js +415 -0
  157. package/dist/permissions/prompt-matcher.js.map +1 -0
  158. package/dist/permissions/prompt-matcher.test.d.ts +5 -0
  159. package/dist/permissions/prompt-matcher.test.d.ts.map +1 -0
  160. package/dist/permissions/prompt-matcher.test.js +107 -0
  161. package/dist/permissions/prompt-matcher.test.js.map +1 -0
  162. package/dist/permissions/types.d.ts +157 -0
  163. package/dist/permissions/types.d.ts.map +1 -1
  164. package/dist/permissions/types.js +43 -8
  165. package/dist/permissions/types.js.map +1 -1
  166. package/dist/prompts/index.d.ts +92 -0
  167. package/dist/prompts/index.d.ts.map +1 -0
  168. package/dist/prompts/index.js +241 -0
  169. package/dist/prompts/index.js.map +1 -0
  170. package/dist/providers/gemini.d.ts.map +1 -1
  171. package/dist/providers/gemini.js +14 -3
  172. package/dist/providers/gemini.js.map +1 -1
  173. package/dist/providers/index.d.ts +5 -3
  174. package/dist/providers/index.d.ts.map +1 -1
  175. package/dist/providers/index.js +13 -1
  176. package/dist/providers/index.js.map +1 -1
  177. package/dist/providers/registry.d.ts +66 -0
  178. package/dist/providers/registry.d.ts.map +1 -0
  179. package/dist/providers/registry.js +158 -0
  180. package/dist/providers/registry.js.map +1 -0
  181. package/dist/providers/search/brave.d.ts +14 -0
  182. package/dist/providers/search/brave.d.ts.map +1 -0
  183. package/dist/providers/search/brave.js +87 -0
  184. package/dist/providers/search/brave.js.map +1 -0
  185. package/dist/providers/search/exa.d.ts +12 -0
  186. package/dist/providers/search/exa.d.ts.map +1 -0
  187. package/dist/providers/search/exa.js +158 -0
  188. package/dist/providers/search/exa.js.map +1 -0
  189. package/dist/providers/search/index.d.ts +31 -0
  190. package/dist/providers/search/index.d.ts.map +1 -0
  191. package/dist/providers/search/index.js +75 -0
  192. package/dist/providers/search/index.js.map +1 -0
  193. package/dist/providers/search/serper.d.ts +14 -0
  194. package/dist/providers/search/serper.d.ts.map +1 -0
  195. package/dist/providers/search/serper.js +87 -0
  196. package/dist/providers/search/serper.js.map +1 -0
  197. package/dist/providers/search/types.d.ts +21 -0
  198. package/dist/providers/search/types.d.ts.map +1 -0
  199. package/dist/providers/search/types.js +5 -0
  200. package/dist/providers/search/types.js.map +1 -0
  201. package/dist/providers/store.d.ts +104 -0
  202. package/dist/providers/store.d.ts.map +1 -0
  203. package/dist/providers/store.js +171 -0
  204. package/dist/providers/store.js.map +1 -0
  205. package/dist/providers/types.d.ts +7 -1
  206. package/dist/providers/types.d.ts.map +1 -1
  207. package/dist/providers/vertex-ai.d.ts +33 -0
  208. package/dist/providers/vertex-ai.d.ts.map +1 -0
  209. package/dist/providers/vertex-ai.js +407 -0
  210. package/dist/providers/vertex-ai.js.map +1 -0
  211. package/dist/tools/builtin/bash.d.ts.map +1 -1
  212. package/dist/tools/builtin/bash.js +2 -1
  213. package/dist/tools/builtin/bash.js.map +1 -1
  214. package/dist/tools/builtin/edit.d.ts.map +1 -1
  215. package/dist/tools/builtin/edit.js +2 -1
  216. package/dist/tools/builtin/edit.js.map +1 -1
  217. package/dist/tools/builtin/glob.d.ts.map +1 -1
  218. package/dist/tools/builtin/glob.js +2 -1
  219. package/dist/tools/builtin/glob.js.map +1 -1
  220. package/dist/tools/builtin/grep.d.ts.map +1 -1
  221. package/dist/tools/builtin/grep.js +2 -1
  222. package/dist/tools/builtin/grep.js.map +1 -1
  223. package/dist/tools/builtin/read.d.ts.map +1 -1
  224. package/dist/tools/builtin/read.js +2 -1
  225. package/dist/tools/builtin/read.js.map +1 -1
  226. package/dist/tools/builtin/todowrite.d.ts +15 -0
  227. package/dist/tools/builtin/todowrite.d.ts.map +1 -0
  228. package/dist/tools/builtin/todowrite.js +88 -0
  229. package/dist/tools/builtin/todowrite.js.map +1 -0
  230. package/dist/tools/builtin/webfetch.d.ts +20 -0
  231. package/dist/tools/builtin/webfetch.d.ts.map +1 -0
  232. package/dist/tools/builtin/webfetch.js +228 -0
  233. package/dist/tools/builtin/webfetch.js.map +1 -0
  234. package/dist/tools/builtin/websearch.d.ts +17 -0
  235. package/dist/tools/builtin/websearch.d.ts.map +1 -0
  236. package/dist/tools/builtin/websearch.js +87 -0
  237. package/dist/tools/builtin/websearch.js.map +1 -0
  238. package/dist/tools/builtin/write.d.ts.map +1 -1
  239. package/dist/tools/builtin/write.js +2 -1
  240. package/dist/tools/builtin/write.js.map +1 -1
  241. package/dist/tools/index.d.ts +18 -0
  242. package/dist/tools/index.d.ts.map +1 -1
  243. package/dist/tools/index.js +28 -2
  244. package/dist/tools/index.js.map +1 -1
  245. package/dist/tools/types.d.ts +41 -0
  246. package/dist/tools/types.d.ts.map +1 -1
  247. package/dist/tools/types.js +16 -0
  248. package/dist/tools/types.js.map +1 -1
  249. package/dist/tools/utils/ssrf.d.ts +18 -0
  250. package/dist/tools/utils/ssrf.d.ts.map +1 -0
  251. package/dist/tools/utils/ssrf.js +70 -0
  252. package/dist/tools/utils/ssrf.js.map +1 -0
  253. package/docs/README.md +5 -4
  254. package/docs/config-system-comparison.md +707 -0
  255. package/docs/memory-system.md +238 -0
  256. package/docs/permissions.md +368 -0
  257. package/docs/proposals/0001-web-fetch-tool.md +32 -2
  258. package/docs/proposals/0002-web-search-tool.md +59 -2
  259. package/docs/proposals/0005-todo-system.md +350 -85
  260. package/docs/proposals/0006-memory-system.md +11 -10
  261. package/docs/proposals/0012-ask-user-question.md +941 -206
  262. package/docs/proposals/0023-permission-enhancements.md +61 -2
  263. package/docs/proposals/0041-configuration-system.md +587 -0
  264. package/docs/proposals/0042-prompt-optimization.md +866 -0
  265. package/docs/proposals/README.md +8 -6
  266. package/docs/providers.md +220 -0
  267. package/jest.config.js +26 -0
  268. package/package.json +14 -3
  269. package/src/agent/agent.ts +120 -18
  270. package/src/agent/types.ts +9 -1
  271. package/src/cli/components/App.tsx +369 -47
  272. package/src/cli/components/CommandSuggestions.tsx +3 -0
  273. package/src/cli/components/Header.tsx +11 -17
  274. package/src/cli/components/Logo.tsx +76 -9
  275. package/src/cli/components/Messages.tsx +146 -38
  276. package/src/cli/components/ModelSelector.tsx +169 -52
  277. package/src/cli/components/PermissionPrompt.tsx +388 -0
  278. package/src/cli/components/ProviderManager.tsx +534 -0
  279. package/src/cli/components/Spinner.tsx +138 -25
  280. package/src/cli/components/TodoList.tsx +54 -0
  281. package/src/cli/components/index.ts +6 -0
  282. package/src/cli/components/markdown.ts +157 -0
  283. package/src/cli/components/theme.ts +7 -0
  284. package/src/cli/index.tsx +76 -13
  285. package/src/config/index.ts +79 -4
  286. package/src/config/levels.test.ts +163 -0
  287. package/src/config/levels.ts +285 -0
  288. package/src/config/loader.test.ts +120 -0
  289. package/src/config/loader.ts +178 -0
  290. package/src/config/manager.test.ts +215 -0
  291. package/src/config/manager.ts +328 -40
  292. package/src/config/merger.test.ts +360 -0
  293. package/src/config/merger.ts +221 -0
  294. package/src/config/providers-config.ts +85 -0
  295. package/src/config/test-utils.ts +79 -0
  296. package/src/config/types.ts +186 -9
  297. package/src/memory/import-resolver.test.ts +117 -0
  298. package/src/memory/import-resolver.ts +149 -0
  299. package/src/memory/index.ts +11 -0
  300. package/src/memory/init-prompt.ts +113 -0
  301. package/src/memory/memory-manager.test.ts +198 -0
  302. package/src/memory/memory-manager.ts +716 -0
  303. package/src/memory/rules-parser.test.ts +182 -0
  304. package/src/memory/rules-parser.ts +82 -0
  305. package/src/memory/test-utils.ts +60 -0
  306. package/src/memory/types.ts +119 -0
  307. package/src/permissions/audit.ts +284 -0
  308. package/src/permissions/index.ts +20 -1
  309. package/src/permissions/manager.test.ts +260 -0
  310. package/src/permissions/manager.ts +592 -40
  311. package/src/permissions/persistence.test.ts +220 -0
  312. package/src/permissions/persistence.ts +301 -0
  313. package/src/permissions/prompt-matcher.test.ts +213 -0
  314. package/src/permissions/prompt-matcher.ts +472 -0
  315. package/src/permissions/types.ts +236 -8
  316. package/src/prompts/index.test.ts +279 -0
  317. package/src/prompts/index.ts +306 -0
  318. package/src/prompts/system/anthropic.txt +29 -0
  319. package/src/prompts/system/base.txt +124 -0
  320. package/src/prompts/system/gemini.txt +35 -0
  321. package/src/prompts/system/generic.txt +128 -0
  322. package/src/prompts/system/openai.txt +29 -0
  323. package/src/prompts/tools/bash.txt +60 -0
  324. package/src/prompts/tools/edit.txt +29 -0
  325. package/src/prompts/tools/glob.txt +35 -0
  326. package/src/prompts/tools/grep.txt +43 -0
  327. package/src/prompts/tools/read.txt +22 -0
  328. package/src/prompts/tools/todowrite.txt +71 -0
  329. package/src/prompts/tools/webfetch.txt +34 -0
  330. package/src/prompts/tools/websearch.txt +41 -0
  331. package/src/prompts/tools/write.txt +23 -0
  332. package/src/providers/gemini.ts +20 -4
  333. package/src/providers/index.ts +18 -3
  334. package/src/providers/registry.ts +198 -0
  335. package/src/providers/search/brave.ts +132 -0
  336. package/src/providers/search/exa.ts +217 -0
  337. package/src/providers/search/index.ts +79 -0
  338. package/src/providers/search/serper.ts +133 -0
  339. package/src/providers/search/types.ts +24 -0
  340. package/src/providers/store.ts +216 -0
  341. package/src/providers/types.ts +9 -1
  342. package/src/providers/vertex-ai.ts +594 -0
  343. package/src/tools/builtin/bash.ts +2 -1
  344. package/src/tools/builtin/edit.ts +2 -1
  345. package/src/tools/builtin/glob.ts +2 -1
  346. package/src/tools/builtin/grep.ts +2 -1
  347. package/src/tools/builtin/read.ts +2 -1
  348. package/src/tools/builtin/todowrite.ts +102 -0
  349. package/src/tools/builtin/webfetch.ts +261 -0
  350. package/src/tools/builtin/websearch.ts +103 -0
  351. package/src/tools/builtin/write.ts +2 -1
  352. package/src/tools/index.ts +28 -2
  353. package/src/tools/types.ts +32 -0
  354. package/src/tools/utils/ssrf.ts +79 -0
  355. package/tsconfig.json +1 -1
  356. package/CLAUDE.md +0 -70
@@ -1,6 +1,6 @@
1
- # mycode Enhancement Proposals
1
+ # gencode Enhancement Proposals
2
2
 
3
- This directory contains enhancement proposals for the mycode project. Each proposal describes a feature inspired by Claude Code that we plan to implement.
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 | Draft |
20
- | [0002](./0002-web-search-tool.md) | WebSearch Tool | Draft |
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 | Draft |
24
- | [0006](./0006-memory-system.md) | Memory System (MYCODE.md) | Draft |
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.0",
4
- "description": "GenCode - An open-source, provider-agnostic AI coding assistant",
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": "npx tsx src/cli/index.tsx",
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
  }
@@ -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 { PermissionManager } from '../permissions/index.js';
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(config.permissions);
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: this.config.systemPrompt ?? DEFAULT_SYSTEM_PROMPT,
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.checkPermission(call.name, call.input);
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' };
@@ -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