gencode-ai 0.1.1 → 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 (263) hide show
  1. package/.gencode/settings.local.json +7 -0
  2. package/README.md +11 -11
  3. package/dist/agent/agent.d.ts +42 -1
  4. package/dist/agent/agent.d.ts.map +1 -1
  5. package/dist/agent/agent.js +82 -15
  6. package/dist/agent/agent.js.map +1 -1
  7. package/dist/cli/components/App.d.ts +8 -1
  8. package/dist/cli/components/App.d.ts.map +1 -1
  9. package/dist/cli/components/App.js +231 -29
  10. package/dist/cli/components/App.js.map +1 -1
  11. package/dist/cli/components/CommandSuggestions.d.ts.map +1 -1
  12. package/dist/cli/components/CommandSuggestions.js +2 -0
  13. package/dist/cli/components/CommandSuggestions.js.map +1 -1
  14. package/dist/cli/components/Header.d.ts +1 -1
  15. package/dist/cli/components/Header.d.ts.map +1 -1
  16. package/dist/cli/components/Header.js +4 -6
  17. package/dist/cli/components/Header.js.map +1 -1
  18. package/dist/cli/components/Logo.d.ts +1 -0
  19. package/dist/cli/components/Logo.d.ts.map +1 -1
  20. package/dist/cli/components/Logo.js +16 -3
  21. package/dist/cli/components/Logo.js.map +1 -1
  22. package/dist/cli/components/Messages.d.ts +4 -4
  23. package/dist/cli/components/Messages.d.ts.map +1 -1
  24. package/dist/cli/components/Messages.js +51 -25
  25. package/dist/cli/components/Messages.js.map +1 -1
  26. package/dist/cli/components/PermissionPrompt.d.ts +60 -0
  27. package/dist/cli/components/PermissionPrompt.d.ts.map +1 -0
  28. package/dist/cli/components/PermissionPrompt.js +192 -0
  29. package/dist/cli/components/PermissionPrompt.js.map +1 -0
  30. package/dist/cli/components/ProviderManager.js +3 -3
  31. package/dist/cli/components/ProviderManager.js.map +1 -1
  32. package/dist/cli/components/Spinner.d.ts +7 -2
  33. package/dist/cli/components/Spinner.d.ts.map +1 -1
  34. package/dist/cli/components/Spinner.js +116 -25
  35. package/dist/cli/components/Spinner.js.map +1 -1
  36. package/dist/cli/components/TodoList.d.ts +7 -0
  37. package/dist/cli/components/TodoList.d.ts.map +1 -0
  38. package/dist/cli/components/TodoList.js +34 -0
  39. package/dist/cli/components/TodoList.js.map +1 -0
  40. package/dist/cli/components/index.d.ts +1 -0
  41. package/dist/cli/components/index.d.ts.map +1 -1
  42. package/dist/cli/components/index.js +1 -0
  43. package/dist/cli/components/index.js.map +1 -1
  44. package/dist/cli/index.js +47 -7
  45. package/dist/cli/index.js.map +1 -1
  46. package/dist/config/index.d.ts +13 -4
  47. package/dist/config/index.d.ts.map +1 -1
  48. package/dist/config/index.js +18 -3
  49. package/dist/config/index.js.map +1 -1
  50. package/dist/config/levels.d.ts +49 -0
  51. package/dist/config/levels.d.ts.map +1 -0
  52. package/dist/config/levels.js +222 -0
  53. package/dist/config/levels.js.map +1 -0
  54. package/dist/config/loader.d.ts +46 -0
  55. package/dist/config/loader.d.ts.map +1 -0
  56. package/dist/config/loader.js +153 -0
  57. package/dist/config/loader.js.map +1 -0
  58. package/dist/config/manager.d.ts +115 -15
  59. package/dist/config/manager.d.ts.map +1 -1
  60. package/dist/config/manager.js +260 -34
  61. package/dist/config/manager.js.map +1 -1
  62. package/dist/config/manager.test.d.ts +5 -0
  63. package/dist/config/manager.test.d.ts.map +1 -0
  64. package/dist/config/manager.test.js +192 -0
  65. package/dist/config/manager.test.js.map +1 -0
  66. package/dist/config/merger.d.ts +56 -0
  67. package/dist/config/merger.d.ts.map +1 -0
  68. package/dist/config/merger.js +177 -0
  69. package/dist/config/merger.js.map +1 -0
  70. package/dist/config/test-utils.d.ts +24 -0
  71. package/dist/config/test-utils.d.ts.map +1 -0
  72. package/dist/config/test-utils.js +55 -0
  73. package/dist/config/test-utils.js.map +1 -0
  74. package/dist/config/types.d.ts +78 -9
  75. package/dist/config/types.d.ts.map +1 -1
  76. package/dist/config/types.js +52 -2
  77. package/dist/config/types.js.map +1 -1
  78. package/dist/memory/import-resolver.d.ts +46 -0
  79. package/dist/memory/import-resolver.d.ts.map +1 -0
  80. package/dist/memory/import-resolver.js +117 -0
  81. package/dist/memory/import-resolver.js.map +1 -0
  82. package/dist/memory/index.d.ts +7 -6
  83. package/dist/memory/index.d.ts.map +1 -1
  84. package/dist/memory/index.js +7 -5
  85. package/dist/memory/index.js.map +1 -1
  86. package/dist/memory/init-prompt.d.ts +22 -0
  87. package/dist/memory/init-prompt.d.ts.map +1 -0
  88. package/dist/memory/init-prompt.js +103 -0
  89. package/dist/memory/init-prompt.js.map +1 -0
  90. package/dist/memory/memory-manager.d.ts +119 -0
  91. package/dist/memory/memory-manager.d.ts.map +1 -0
  92. package/dist/memory/memory-manager.js +587 -0
  93. package/dist/memory/memory-manager.js.map +1 -0
  94. package/dist/memory/rules-parser.d.ts +38 -0
  95. package/dist/memory/rules-parser.d.ts.map +1 -0
  96. package/dist/memory/rules-parser.js +69 -0
  97. package/dist/memory/rules-parser.js.map +1 -0
  98. package/dist/memory/test-utils.d.ts +20 -0
  99. package/dist/memory/test-utils.d.ts.map +1 -0
  100. package/dist/memory/test-utils.js +44 -0
  101. package/dist/memory/test-utils.js.map +1 -0
  102. package/dist/memory/types.d.ts +70 -63
  103. package/dist/memory/types.d.ts.map +1 -1
  104. package/dist/memory/types.js +42 -2
  105. package/dist/memory/types.js.map +1 -1
  106. package/dist/permissions/audit.d.ts +82 -0
  107. package/dist/permissions/audit.d.ts.map +1 -0
  108. package/dist/permissions/audit.js +229 -0
  109. package/dist/permissions/audit.js.map +1 -0
  110. package/dist/permissions/index.d.ts +11 -1
  111. package/dist/permissions/index.d.ts.map +1 -1
  112. package/dist/permissions/index.js +15 -0
  113. package/dist/permissions/index.js.map +1 -1
  114. package/dist/permissions/manager.d.ts +149 -13
  115. package/dist/permissions/manager.d.ts.map +1 -1
  116. package/dist/permissions/manager.js +480 -35
  117. package/dist/permissions/manager.js.map +1 -1
  118. package/dist/permissions/manager.test.d.ts +5 -0
  119. package/dist/permissions/manager.test.d.ts.map +1 -0
  120. package/dist/permissions/manager.test.js +213 -0
  121. package/dist/permissions/manager.test.js.map +1 -0
  122. package/dist/permissions/persistence.d.ts +74 -0
  123. package/dist/permissions/persistence.d.ts.map +1 -0
  124. package/dist/permissions/persistence.js +248 -0
  125. package/dist/permissions/persistence.js.map +1 -0
  126. package/dist/permissions/persistence.test.d.ts +5 -0
  127. package/dist/permissions/persistence.test.d.ts.map +1 -0
  128. package/dist/permissions/persistence.test.js +171 -0
  129. package/dist/permissions/persistence.test.js.map +1 -0
  130. package/dist/permissions/prompt-matcher.d.ts +64 -0
  131. package/dist/permissions/prompt-matcher.d.ts.map +1 -0
  132. package/dist/permissions/prompt-matcher.js +415 -0
  133. package/dist/permissions/prompt-matcher.js.map +1 -0
  134. package/dist/permissions/prompt-matcher.test.d.ts +5 -0
  135. package/dist/permissions/prompt-matcher.test.d.ts.map +1 -0
  136. package/dist/permissions/prompt-matcher.test.js +107 -0
  137. package/dist/permissions/prompt-matcher.test.js.map +1 -0
  138. package/dist/permissions/types.d.ts +157 -0
  139. package/dist/permissions/types.d.ts.map +1 -1
  140. package/dist/permissions/types.js +43 -8
  141. package/dist/permissions/types.js.map +1 -1
  142. package/dist/prompts/index.d.ts +92 -0
  143. package/dist/prompts/index.d.ts.map +1 -0
  144. package/dist/prompts/index.js +241 -0
  145. package/dist/prompts/index.js.map +1 -0
  146. package/dist/tools/builtin/bash.d.ts.map +1 -1
  147. package/dist/tools/builtin/bash.js +2 -1
  148. package/dist/tools/builtin/bash.js.map +1 -1
  149. package/dist/tools/builtin/edit.d.ts.map +1 -1
  150. package/dist/tools/builtin/edit.js +2 -1
  151. package/dist/tools/builtin/edit.js.map +1 -1
  152. package/dist/tools/builtin/glob.d.ts.map +1 -1
  153. package/dist/tools/builtin/glob.js +2 -1
  154. package/dist/tools/builtin/glob.js.map +1 -1
  155. package/dist/tools/builtin/grep.d.ts.map +1 -1
  156. package/dist/tools/builtin/grep.js +2 -1
  157. package/dist/tools/builtin/grep.js.map +1 -1
  158. package/dist/tools/builtin/read.d.ts.map +1 -1
  159. package/dist/tools/builtin/read.js +2 -1
  160. package/dist/tools/builtin/read.js.map +1 -1
  161. package/dist/tools/builtin/todowrite.d.ts +15 -0
  162. package/dist/tools/builtin/todowrite.d.ts.map +1 -0
  163. package/dist/tools/builtin/todowrite.js +88 -0
  164. package/dist/tools/builtin/todowrite.js.map +1 -0
  165. package/dist/tools/builtin/webfetch.d.ts.map +1 -1
  166. package/dist/tools/builtin/webfetch.js +2 -5
  167. package/dist/tools/builtin/webfetch.js.map +1 -1
  168. package/dist/tools/builtin/websearch.d.ts.map +1 -1
  169. package/dist/tools/builtin/websearch.js +2 -16
  170. package/dist/tools/builtin/websearch.js.map +1 -1
  171. package/dist/tools/builtin/write.d.ts.map +1 -1
  172. package/dist/tools/builtin/write.js +2 -1
  173. package/dist/tools/builtin/write.js.map +1 -1
  174. package/dist/tools/index.d.ts +7 -0
  175. package/dist/tools/index.d.ts.map +1 -1
  176. package/dist/tools/index.js +4 -0
  177. package/dist/tools/index.js.map +1 -1
  178. package/dist/tools/types.d.ts +22 -0
  179. package/dist/tools/types.d.ts.map +1 -1
  180. package/dist/tools/types.js +8 -0
  181. package/dist/tools/types.js.map +1 -1
  182. package/docs/config-system-comparison.md +707 -0
  183. package/docs/memory-system.md +238 -0
  184. package/docs/permissions.md +368 -0
  185. package/docs/proposals/0005-todo-system.md +350 -85
  186. package/docs/proposals/0006-memory-system.md +11 -10
  187. package/docs/proposals/0012-ask-user-question.md +941 -206
  188. package/docs/proposals/0023-permission-enhancements.md +61 -2
  189. package/docs/proposals/0041-configuration-system.md +33 -2
  190. package/docs/proposals/0042-prompt-optimization.md +866 -0
  191. package/docs/proposals/README.md +6 -5
  192. package/jest.config.js +26 -0
  193. package/package.json +8 -2
  194. package/src/agent/agent.ts +111 -16
  195. package/src/cli/components/App.tsx +309 -36
  196. package/src/cli/components/CommandSuggestions.tsx +2 -0
  197. package/src/cli/components/Header.tsx +11 -17
  198. package/src/cli/components/Logo.tsx +76 -9
  199. package/src/cli/components/Messages.tsx +73 -53
  200. package/src/cli/components/PermissionPrompt.tsx +388 -0
  201. package/src/cli/components/ProviderManager.tsx +5 -5
  202. package/src/cli/components/Spinner.tsx +138 -25
  203. package/src/cli/components/TodoList.tsx +54 -0
  204. package/src/cli/components/index.ts +6 -0
  205. package/src/cli/index.tsx +54 -6
  206. package/src/config/index.ts +78 -4
  207. package/src/config/levels.test.ts +163 -0
  208. package/src/config/levels.ts +285 -0
  209. package/src/config/loader.test.ts +120 -0
  210. package/src/config/loader.ts +178 -0
  211. package/src/config/manager.test.ts +215 -0
  212. package/src/config/manager.ts +328 -40
  213. package/src/config/merger.test.ts +360 -0
  214. package/src/config/merger.ts +221 -0
  215. package/src/config/test-utils.ts +79 -0
  216. package/src/config/types.ts +152 -9
  217. package/src/memory/import-resolver.test.ts +117 -0
  218. package/src/memory/import-resolver.ts +149 -0
  219. package/src/memory/index.ts +11 -0
  220. package/src/memory/init-prompt.ts +113 -0
  221. package/src/memory/memory-manager.test.ts +198 -0
  222. package/src/memory/memory-manager.ts +716 -0
  223. package/src/memory/rules-parser.test.ts +182 -0
  224. package/src/memory/rules-parser.ts +82 -0
  225. package/src/memory/test-utils.ts +60 -0
  226. package/src/memory/types.ts +119 -0
  227. package/src/permissions/audit.ts +284 -0
  228. package/src/permissions/index.ts +20 -1
  229. package/src/permissions/manager.test.ts +260 -0
  230. package/src/permissions/manager.ts +592 -40
  231. package/src/permissions/persistence.test.ts +220 -0
  232. package/src/permissions/persistence.ts +301 -0
  233. package/src/permissions/prompt-matcher.test.ts +213 -0
  234. package/src/permissions/prompt-matcher.ts +472 -0
  235. package/src/permissions/types.ts +236 -8
  236. package/src/prompts/index.test.ts +279 -0
  237. package/src/prompts/index.ts +306 -0
  238. package/src/prompts/system/anthropic.txt +29 -0
  239. package/src/prompts/system/base.txt +124 -0
  240. package/src/prompts/system/gemini.txt +35 -0
  241. package/src/prompts/system/generic.txt +128 -0
  242. package/src/prompts/system/openai.txt +29 -0
  243. package/src/prompts/tools/bash.txt +60 -0
  244. package/src/prompts/tools/edit.txt +29 -0
  245. package/src/prompts/tools/glob.txt +35 -0
  246. package/src/prompts/tools/grep.txt +43 -0
  247. package/src/prompts/tools/read.txt +22 -0
  248. package/src/prompts/tools/todowrite.txt +71 -0
  249. package/src/prompts/tools/webfetch.txt +34 -0
  250. package/src/prompts/tools/websearch.txt +41 -0
  251. package/src/prompts/tools/write.txt +23 -0
  252. package/src/tools/builtin/bash.ts +2 -1
  253. package/src/tools/builtin/edit.ts +2 -1
  254. package/src/tools/builtin/glob.ts +2 -1
  255. package/src/tools/builtin/grep.ts +2 -1
  256. package/src/tools/builtin/read.ts +2 -1
  257. package/src/tools/builtin/todowrite.ts +102 -0
  258. package/src/tools/builtin/webfetch.ts +2 -5
  259. package/src/tools/builtin/websearch.ts +2 -16
  260. package/src/tools/builtin/write.ts +2 -1
  261. package/src/tools/index.ts +4 -0
  262. package/src/tools/types.ts +12 -0
  263. package/tsconfig.json +1 -1
@@ -16,19 +16,20 @@ This directory contains enhancement proposals for the gencode project. Each prop
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 | Draft |
31
+ | [0041](./0041-configuration-system.md) | Configuration System | Implemented |
32
+ | [0042](./0042-prompt-optimization.md) | Prompt System Optimization | Implemented |
32
33
 
33
34
  ### P2 Priority - Enhanced Features
34
35
 
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.1",
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",
@@ -35,10 +35,12 @@
35
35
  "fast-glob": "^3.3.3",
36
36
  "glob": "^13.0.0",
37
37
  "google-auth-library": "^10.5.0",
38
+ "gray-matter": "^4.0.3",
38
39
  "ink": "^6.6.0",
39
40
  "ink-spinner": "^5.0.0",
40
41
  "ink-text-input": "^6.0.0",
41
42
  "marked": "^17.0.1",
43
+ "minimatch": "^10.1.1",
42
44
  "openai": "^6.16.0",
43
45
  "ora": "^9.0.0",
44
46
  "react": "^19.2.3",
@@ -47,8 +49,12 @@
47
49
  "zod": "^4.3.5"
48
50
  },
49
51
  "devDependencies": {
52
+ "@types/jest": "^30.0.0",
53
+ "@types/minimatch": "^5.1.2",
50
54
  "@types/node": "^25.0.8",
51
55
  "@types/react": "^19.2.8",
56
+ "jest": "^30.2.0",
57
+ "ts-jest": "^29.4.6",
52
58
  "tsx": "^4.21.0",
53
59
  "typescript": "^5.9.3"
54
60
  }
@@ -5,29 +5,28 @@
5
5
  import type { LLMProvider, Message, ToolResultContent } from '../providers/types.js';
6
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();
43
46
  }
44
47
 
45
48
  /**
46
- * Set permission confirmation callback
49
+ * Initialize permission system (load persisted rules)
50
+ */
51
+ async initializePermissions(settings?: PermissionSettings): Promise<void> {
52
+ await this.permissions.initialize(settings);
53
+ }
54
+
55
+ /**
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
  */
@@ -186,6 +261,11 @@ export class Agent {
186
261
  await this.startSession();
187
262
  }
188
263
 
264
+ // Load memory if not already loaded
265
+ if (!this.loadedMemory) {
266
+ await this.loadMemory();
267
+ }
268
+
189
269
  // Add user message
190
270
  const userMessage: Message = { role: 'user', content: prompt };
191
271
  this.messages.push(userMessage);
@@ -203,11 +283,26 @@ export class Agent {
203
283
  // Call LLM
204
284
  let response;
205
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
+
206
301
  response = await this.provider.complete({
207
302
  model: this.config.model,
208
303
  messages: this.messages,
209
304
  tools: toolDefs,
210
- systemPrompt: this.config.systemPrompt ?? DEFAULT_SYSTEM_PROMPT,
305
+ systemPrompt,
211
306
  maxTokens: 4096,
212
307
  });
213
308
  } catch (error) {
@@ -244,7 +339,7 @@ export class Agent {
244
339
  for (const call of toolCalls) {
245
340
  yield { type: 'tool_start', id: call.id, name: call.name, input: call.input };
246
341
 
247
- const allowed = await this.permissions.checkPermission(call.name, call.input);
342
+ const allowed = await this.permissions.requestPermission(call.name, call.input);
248
343
  const result = allowed
249
344
  ? await this.registry.execute(call.name, call.input, { cwd })
250
345
  : { success: false, output: '', error: 'Permission denied by user' };