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
@@ -1,79 +1,524 @@
1
1
  /**
2
- * Permission Manager - Controls tool execution permissions
2
+ * Permission Manager - Enhanced permission control with pattern matching,
3
+ * prompt-based approvals, persistence, and audit logging.
4
+ *
5
+ * Claude Code compatible design with:
6
+ * - Pattern-based rules (e.g., "Bash(git add:*)")
7
+ * - Prompt-based permissions (e.g., { tool: "Bash", prompt: "run tests" })
8
+ * - Session/project/global scopes
9
+ * - Persistent allowlists
10
+ * - Audit trail
11
+ */
12
+ import { DEFAULT_PERMISSION_CONFIG, DEFAULT_SUGGESTIONS, } from './types.js';
13
+ import { PromptMatcher, matchesPatternString } from './prompt-matcher.js';
14
+ import { PermissionPersistence } from './persistence.js';
15
+ import { PermissionAudit } from './audit.js';
16
+ /**
17
+ * Enhanced Permission Manager
3
18
  */
4
- import { DEFAULT_PERMISSION_CONFIG } from './types.js';
5
19
  export class PermissionManager {
6
20
  config;
21
+ promptMatcher;
22
+ persistence;
23
+ audit;
24
+ // Session-scoped caches
25
+ sessionApprovals = new Map();
26
+ sessionRejections = new Set();
27
+ // Callbacks
7
28
  confirmCallback;
8
- approvedTools = new Set();
9
- constructor(config) {
29
+ simpleConfirmCallback;
30
+ saveRuleCallback;
31
+ // Current context
32
+ sessionId;
33
+ projectPath;
34
+ constructor(options = {}) {
10
35
  this.config = {
11
36
  ...DEFAULT_PERMISSION_CONFIG,
12
- ...config,
37
+ ...options.config,
38
+ rules: [
39
+ ...DEFAULT_PERMISSION_CONFIG.rules,
40
+ ...(options.config?.rules ?? []),
41
+ ],
13
42
  };
43
+ this.projectPath = options.projectPath;
44
+ this.promptMatcher = new PromptMatcher();
45
+ this.persistence = new PermissionPersistence(options.projectPath);
46
+ this.audit = new PermissionAudit({
47
+ persistToFile: options.enableAudit ?? false,
48
+ });
49
+ }
50
+ /**
51
+ * Initialize - load persisted rules and settings
52
+ */
53
+ async initialize(settings) {
54
+ // Load persisted rules
55
+ const persistedRules = await this.persistence.getAllRules();
56
+ const runtimeRules = this.persistence.persistedToRuntime(persistedRules);
57
+ this.config.rules.push(...runtimeRules);
58
+ // Parse settings permissions
59
+ if (settings) {
60
+ const settingsRules = this.persistence.parseSettingsPermissions(settings);
61
+ this.config.rules.push(...settingsRules);
62
+ }
63
+ }
64
+ /**
65
+ * Set session ID for tracking
66
+ */
67
+ setSessionId(sessionId) {
68
+ this.sessionId = sessionId;
14
69
  }
15
70
  /**
16
- * Set the confirmation callback
71
+ * Set enhanced confirmation callback
17
72
  */
18
73
  setConfirmCallback(callback) {
19
74
  this.confirmCallback = callback;
20
75
  }
21
76
  /**
22
- * Get the permission mode for a tool
77
+ * Set simple yes/no confirmation callback (backward compatible)
78
+ */
79
+ setSimpleConfirmCallback(callback) {
80
+ this.simpleConfirmCallback = callback;
81
+ }
82
+ /**
83
+ * Set callback to save permission rules to settings
84
+ * This allows integration with SettingsManager for settings.local.json persistence
85
+ */
86
+ setSaveRuleCallback(callback) {
87
+ this.saveRuleCallback = callback;
88
+ }
89
+ /**
90
+ * Add prompt-based permissions (Claude Code ExitPlanMode style)
91
+ */
92
+ addAllowedPrompts(prompts) {
93
+ this.config.allowedPrompts.push(...prompts);
94
+ }
95
+ /**
96
+ * Clear prompt-based permissions
97
+ */
98
+ clearAllowedPrompts() {
99
+ this.config.allowedPrompts = [];
100
+ }
101
+ /**
102
+ * Get current allowed prompts
103
+ */
104
+ getAllowedPrompts() {
105
+ return [...this.config.allowedPrompts];
106
+ }
107
+ /**
108
+ * Get all rules
109
+ */
110
+ getRules() {
111
+ return [...this.config.rules];
112
+ }
113
+ /**
114
+ * Check permission (without prompting user)
115
+ *
116
+ * Flow matches Claude Code official design:
117
+ * 1. DENY rules → block immediately
118
+ * 2. ALLOW rules → auto-approve (includes prompt-based & session cache)
119
+ * 3. ASK rules → force prompt
120
+ * 4. Default behavior (read-only → auto, write → prompt)
121
+ */
122
+ async checkPermission(context) {
123
+ const { tool, input } = context;
124
+ // ========================================================================
125
+ // Step 1: Check DENY rules (highest priority - block immediately)
126
+ // ========================================================================
127
+ const denyRule = this.findMatchingRule(context, 'deny');
128
+ if (denyRule) {
129
+ await this.logAudit(context, 'denied', `Denied by rule: ${this.describeRule(denyRule)}`);
130
+ return {
131
+ allowed: false,
132
+ reason: `Blocked: ${denyRule.description ?? denyRule.pattern ?? tool}`,
133
+ matchedRule: denyRule,
134
+ requiresConfirmation: false,
135
+ };
136
+ }
137
+ // ========================================================================
138
+ // Step 2: Check ALLOW rules (auto-approve if matched)
139
+ // Includes: settings.allow[], prompt-based permissions, session cache
140
+ // ========================================================================
141
+ // 2a. Check settings.allow rules
142
+ const autoRule = this.findMatchingRule(context, 'auto');
143
+ if (autoRule) {
144
+ await this.logAudit(context, 'allowed', `Auto-approved: ${this.describeRule(autoRule)}`);
145
+ return {
146
+ allowed: true,
147
+ reason: 'Auto-approved',
148
+ matchedRule: autoRule,
149
+ requiresConfirmation: false,
150
+ };
151
+ }
152
+ // 2b. Check prompt-based permissions (Plan mode allowedPrompts)
153
+ const promptMatch = this.matchPrompt(tool, input);
154
+ if (promptMatch) {
155
+ await this.logAudit(context, 'allowed', `Prompt match: ${promptMatch.prompt}`);
156
+ return {
157
+ allowed: true,
158
+ reason: `Approved: ${promptMatch.prompt}`,
159
+ matchedRule: promptMatch,
160
+ requiresConfirmation: false,
161
+ };
162
+ }
163
+ // 2c. Check session approval cache
164
+ const cacheKey = this.getCacheKey(tool, input);
165
+ if (this.sessionApprovals.has(cacheKey)) {
166
+ await this.logAudit(context, 'allowed', 'Session cache hit');
167
+ return {
168
+ allowed: true,
169
+ reason: 'Previously approved',
170
+ requiresConfirmation: false,
171
+ };
172
+ }
173
+ // ========================================================================
174
+ // Step 3: Check ASK rules (force confirmation)
175
+ // ========================================================================
176
+ const askRule = this.findMatchingRule(context, 'confirm');
177
+ if (askRule) {
178
+ await this.logAudit(context, 'confirmed', `ASK rule matched: ${this.describeRule(askRule)}`);
179
+ return {
180
+ allowed: false,
181
+ reason: `Requires confirmation: ${askRule.description ?? askRule.pattern ?? tool}`,
182
+ matchedRule: askRule,
183
+ requiresConfirmation: true,
184
+ suggestions: this.getSuggestions(context),
185
+ };
186
+ }
187
+ // ========================================================================
188
+ // Step 4: Default behavior (read-only → auto, write → prompt)
189
+ // ========================================================================
190
+ // Check session rejection cache
191
+ if (this.sessionRejections.has(cacheKey)) {
192
+ await this.logAudit(context, 'denied', 'Session rejection cache');
193
+ return {
194
+ allowed: false,
195
+ reason: 'Previously denied',
196
+ requiresConfirmation: false,
197
+ };
198
+ }
199
+ // Default: requires confirmation for write operations
200
+ return {
201
+ allowed: false,
202
+ reason: 'Requires approval',
203
+ requiresConfirmation: true,
204
+ suggestions: this.getSuggestions(context),
205
+ };
206
+ }
207
+ /**
208
+ * Request permission (prompts user if needed)
209
+ */
210
+ async requestPermission(tool, input) {
211
+ const context = {
212
+ tool,
213
+ input,
214
+ sessionId: this.sessionId,
215
+ projectPath: this.projectPath,
216
+ };
217
+ const decision = await this.checkPermission(context);
218
+ if (decision.allowed) {
219
+ return true;
220
+ }
221
+ if (!decision.requiresConfirmation) {
222
+ return false;
223
+ }
224
+ // Prompt user for confirmation
225
+ const action = await this.promptUser(tool, input, decision.suggestions);
226
+ return this.handleApprovalAction(action, context);
227
+ }
228
+ /**
229
+ * Backward-compatible check method
230
+ */
231
+ async check(tool, input) {
232
+ return this.requestPermission(tool, input);
233
+ }
234
+ /**
235
+ * Get permission mode for a tool (for simple queries)
23
236
  */
24
237
  getModeForTool(tool) {
25
238
  for (const rule of this.config.rules) {
26
239
  if (typeof rule.tool === 'string') {
27
- if (rule.tool === tool) {
240
+ if (rule.tool === tool && !rule.pattern) {
28
241
  return rule.mode;
29
242
  }
30
243
  }
31
- else if (rule.tool.test(tool)) {
244
+ else if (rule.tool.test(tool) && !rule.pattern) {
32
245
  return rule.mode;
33
246
  }
34
247
  }
35
248
  return this.config.defaultMode;
36
249
  }
37
250
  /**
38
- * Check if a tool can be executed
251
+ * Approve a tool for this session
39
252
  */
40
- async checkPermission(tool, input) {
41
- const mode = this.getModeForTool(tool);
42
- switch (mode) {
43
- case 'auto':
44
- return true;
45
- case 'deny':
46
- return false;
47
- case 'confirm':
48
- // Check if already approved this session
49
- const key = `${tool}:${JSON.stringify(input)}`;
50
- if (this.approvedTools.has(key)) {
51
- return true;
253
+ approveForSession(tool, pattern) {
254
+ const key = pattern ? `${tool}:${pattern}` : tool;
255
+ this.sessionApprovals.set(key, {
256
+ tool,
257
+ pattern,
258
+ approvedAt: new Date(),
259
+ });
260
+ }
261
+ /**
262
+ * Add a persistent allow rule
263
+ */
264
+ async addAllowRule(tool, pattern, scope = 'global') {
265
+ await this.persistence.addRule(tool, 'auto', {
266
+ pattern,
267
+ scope,
268
+ description: `User approved: ${tool}${pattern ? `(${pattern})` : ''}`,
269
+ });
270
+ // Also add to runtime config
271
+ this.config.rules.push({
272
+ tool,
273
+ mode: 'auto',
274
+ pattern,
275
+ scope,
276
+ });
277
+ }
278
+ /**
279
+ * Add a persistent deny rule
280
+ */
281
+ async addDenyRule(tool, pattern, scope = 'global') {
282
+ await this.persistence.addRule(tool, 'deny', {
283
+ pattern,
284
+ scope,
285
+ description: `User blocked: ${tool}${pattern ? `(${pattern})` : ''}`,
286
+ });
287
+ // Also add to runtime config
288
+ this.config.rules.push({
289
+ tool,
290
+ mode: 'deny',
291
+ pattern,
292
+ scope,
293
+ });
294
+ }
295
+ /**
296
+ * Clear session approvals
297
+ */
298
+ clearSessionApprovals() {
299
+ this.sessionApprovals.clear();
300
+ this.sessionRejections.clear();
301
+ }
302
+ /**
303
+ * Get audit log
304
+ */
305
+ getAuditLog(count) {
306
+ return this.audit.getRecent(count);
307
+ }
308
+ /**
309
+ * Get audit statistics
310
+ */
311
+ getAuditStats() {
312
+ return this.audit.getStats();
313
+ }
314
+ /**
315
+ * Get persistence manager (for direct access)
316
+ */
317
+ getPersistence() {
318
+ return this.persistence;
319
+ }
320
+ // ============================================================================
321
+ // Private Methods
322
+ // ============================================================================
323
+ /**
324
+ * Find a matching rule for the given context and mode
325
+ */
326
+ findMatchingRule(context, mode) {
327
+ for (const rule of this.config.rules) {
328
+ if (rule.mode !== mode)
329
+ continue;
330
+ if (!this.matchesTool(rule.tool, context.tool))
331
+ continue;
332
+ // If rule has pattern, check it (pass tool name for path matching)
333
+ if (rule.pattern) {
334
+ if (!this.matchesPattern(rule.pattern, context.input, context.tool)) {
335
+ continue;
52
336
  }
53
- if (!this.confirmCallback) {
54
- // No callback, auto-approve in non-interactive mode
55
- return true;
337
+ }
338
+ // Check expiration
339
+ if (rule.expiresAt && new Date() > rule.expiresAt) {
340
+ continue;
341
+ }
342
+ return rule;
343
+ }
344
+ return undefined;
345
+ }
346
+ /**
347
+ * Check if tool matches rule
348
+ */
349
+ matchesTool(rulePattern, tool) {
350
+ if (typeof rulePattern === 'string') {
351
+ return rulePattern === tool || rulePattern === '*';
352
+ }
353
+ return rulePattern.test(tool);
354
+ }
355
+ /**
356
+ * Check if input matches pattern
357
+ */
358
+ matchesPattern(pattern, input, tool) {
359
+ if (typeof pattern === 'string') {
360
+ return matchesPatternString(pattern, input, tool);
361
+ }
362
+ const inputStr = typeof input === 'string'
363
+ ? input
364
+ : JSON.stringify(input);
365
+ return pattern.test(inputStr);
366
+ }
367
+ /**
368
+ * Match against prompt-based permissions
369
+ */
370
+ matchPrompt(tool, input) {
371
+ for (const permission of this.config.allowedPrompts) {
372
+ if (permission.tool !== tool)
373
+ continue;
374
+ if (this.promptMatcher.matches(permission.prompt, input)) {
375
+ return permission;
376
+ }
377
+ }
378
+ return null;
379
+ }
380
+ /**
381
+ * Generate cache key for session approvals
382
+ */
383
+ getCacheKey(tool, input) {
384
+ // For Bash, use the command as the key
385
+ if (tool === 'Bash' && input && typeof input === 'object') {
386
+ const cmd = input.command;
387
+ if (cmd) {
388
+ // Use first few tokens as pattern
389
+ const tokens = cmd.split(/\s+/).slice(0, 3).join(' ');
390
+ return `${tool}:${tokens}`;
391
+ }
392
+ }
393
+ // For file operations, use the path
394
+ if (['Read', 'Write', 'Edit', 'Glob'].includes(tool)) {
395
+ if (input && typeof input === 'object') {
396
+ const path = input.file_path
397
+ ?? input.path;
398
+ if (path) {
399
+ return `${tool}:${path}`;
400
+ }
401
+ }
402
+ }
403
+ // Default: use full input JSON
404
+ return `${tool}:${JSON.stringify(input)}`;
405
+ }
406
+ /**
407
+ * Get approval suggestions for a context
408
+ */
409
+ getSuggestions(context) {
410
+ // Start with default suggestions
411
+ const suggestions = [...DEFAULT_SUGGESTIONS];
412
+ // Customize "Always allow" label based on tool/input
413
+ const alwaysIndex = suggestions.findIndex((s) => s.action === 'allow_always');
414
+ if (alwaysIndex >= 0 && context.tool === 'Bash') {
415
+ const input = context.input;
416
+ if (input?.command) {
417
+ const prefix = input.command.split(/\s+/).slice(0, 2).join(' ');
418
+ suggestions[alwaysIndex] = {
419
+ ...suggestions[alwaysIndex],
420
+ label: `Always allow "${prefix}*"`,
421
+ };
422
+ }
423
+ }
424
+ return suggestions;
425
+ }
426
+ /**
427
+ * Prompt user for approval
428
+ */
429
+ async promptUser(tool, input, suggestions) {
430
+ const effectiveSuggestions = suggestions ?? DEFAULT_SUGGESTIONS;
431
+ // Use enhanced callback if available
432
+ if (this.confirmCallback) {
433
+ return this.confirmCallback(tool, input, effectiveSuggestions);
434
+ }
435
+ // Fall back to simple callback
436
+ if (this.simpleConfirmCallback) {
437
+ const confirmed = await this.simpleConfirmCallback(tool, input);
438
+ return confirmed ? 'allow_session' : 'deny';
439
+ }
440
+ // No callback - auto-approve (non-interactive mode)
441
+ return 'allow_once';
442
+ }
443
+ /**
444
+ * Handle the user's approval action
445
+ */
446
+ async handleApprovalAction(action, context) {
447
+ const { tool, input } = context;
448
+ const cacheKey = this.getCacheKey(tool, input);
449
+ switch (action) {
450
+ case 'allow_once':
451
+ await this.logAudit(context, 'confirmed', 'User approved once');
452
+ return true;
453
+ case 'allow_session':
454
+ this.sessionApprovals.set(cacheKey, {
455
+ tool,
456
+ approvedAt: new Date(),
457
+ });
458
+ await this.logAudit(context, 'confirmed', 'User approved for session');
459
+ return true;
460
+ case 'allow_always':
461
+ // Extract pattern for persistent rule
462
+ const pattern = this.extractPattern(tool, input);
463
+ // Use saveRuleCallback if available (saves to settings.local.json)
464
+ // Otherwise fallback to addAllowRule (saves to permissions.json)
465
+ if (this.saveRuleCallback) {
466
+ await this.saveRuleCallback(tool, pattern);
56
467
  }
57
- const approved = await this.confirmCallback(tool, input);
58
- if (approved) {
59
- this.approvedTools.add(key);
468
+ else {
469
+ await this.addAllowRule(tool, pattern, 'project');
60
470
  }
61
- return approved;
471
+ // Also add to runtime config for immediate effect
472
+ this.config.rules.push({
473
+ tool,
474
+ mode: 'auto',
475
+ pattern,
476
+ scope: 'project',
477
+ });
478
+ await this.logAudit(context, 'confirmed', 'User approved for project');
479
+ return true;
480
+ case 'deny':
481
+ this.sessionRejections.add(cacheKey);
482
+ await this.logAudit(context, 'rejected', 'User denied');
483
+ return false;
62
484
  default:
63
485
  return false;
64
486
  }
65
487
  }
66
488
  /**
67
- * Approve a tool for this session
489
+ * Extract a pattern from tool input for persistent rules
68
490
  */
69
- approveToolForSession(tool) {
70
- this.approvedTools.add(tool);
491
+ extractPattern(tool, input) {
492
+ if (tool === 'Bash' && input && typeof input === 'object') {
493
+ const cmd = input.command;
494
+ if (cmd) {
495
+ // Use first two tokens + wildcard
496
+ const tokens = cmd.split(/\s+/).slice(0, 2);
497
+ return tokens.join(' ') + ':*';
498
+ }
499
+ }
500
+ return undefined;
501
+ }
502
+ /**
503
+ * Describe a rule for logging
504
+ */
505
+ describeRule(rule) {
506
+ const parts = [rule.tool.toString()];
507
+ if (rule.pattern) {
508
+ parts.push(`(${rule.pattern})`);
509
+ }
510
+ if (rule.description) {
511
+ parts.push(`- ${rule.description}`);
512
+ }
513
+ return parts.join('');
71
514
  }
72
515
  /**
73
- * Clear all session approvals
516
+ * Log audit entry
74
517
  */
75
- clearApprovals() {
76
- this.approvedTools.clear();
518
+ async logAudit(context, decision, reason) {
519
+ await this.audit.log(context.tool, context.input, decision, reason, {
520
+ sessionId: context.sessionId,
521
+ });
77
522
  }
78
523
  }
79
524
  //# sourceMappingURL=manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/permissions/manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAOvD,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAmB;IACzB,eAAe,CAAmB;IAClC,aAAa,GAAgB,IAAI,GAAG,EAAE,CAAC;IAE/C,YAAY,MAAkC;QAC5C,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG,yBAAyB;YAC5B,GAAG,MAAM;SACV,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,QAAyB;QAC1C,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,IAAY;QACzB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACrC,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAClC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;oBACvB,OAAO,IAAI,CAAC,IAAI,CAAC;gBACnB,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,OAAO,IAAI,CAAC,IAAI,CAAC;YACnB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,IAAY,EAAE,KAAc;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAEvC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC;YAEd,KAAK,MAAM;gBACT,OAAO,KAAK,CAAC;YAEf,KAAK,SAAS;gBACZ,yCAAyC;gBACzC,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/C,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBAChC,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;oBAC1B,oDAAoD;oBACpD,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACzD,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC9B,CAAC;gBACD,OAAO,QAAQ,CAAC;YAElB;gBACE,OAAO,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,IAAY;QAChC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACF"}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/permissions/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * PermissionManager Tests
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=manager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.test.d.ts","sourceRoot":"","sources":["../../src/permissions/manager.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}