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.
- package/.gencode/settings.local.json +7 -0
- package/README.md +20 -102
- package/dist/agent/agent.d.ts +43 -2
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +90 -17
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/types.d.ts +9 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/cli/components/AllModelsSelector.d.ts +11 -0
- package/dist/cli/components/AllModelsSelector.d.ts.map +1 -0
- package/dist/cli/components/AllModelsSelector.js +153 -0
- package/dist/cli/components/AllModelsSelector.js.map +1 -0
- package/dist/cli/components/App.d.ts +8 -1
- package/dist/cli/components/App.d.ts.map +1 -1
- package/dist/cli/components/App.js +276 -40
- package/dist/cli/components/App.js.map +1 -1
- package/dist/cli/components/CommandSuggestions.d.ts.map +1 -1
- package/dist/cli/components/CommandSuggestions.js +3 -0
- package/dist/cli/components/CommandSuggestions.js.map +1 -1
- package/dist/cli/components/Header.d.ts +1 -1
- package/dist/cli/components/Header.d.ts.map +1 -1
- package/dist/cli/components/Header.js +4 -6
- package/dist/cli/components/Header.js.map +1 -1
- package/dist/cli/components/Logo.d.ts +1 -0
- package/dist/cli/components/Logo.d.ts.map +1 -1
- package/dist/cli/components/Logo.js +16 -3
- package/dist/cli/components/Logo.js.map +1 -1
- package/dist/cli/components/Messages.d.ts +17 -3
- package/dist/cli/components/Messages.d.ts.map +1 -1
- package/dist/cli/components/Messages.js +70 -18
- package/dist/cli/components/Messages.js.map +1 -1
- package/dist/cli/components/ModelSelector.d.ts +7 -7
- package/dist/cli/components/ModelSelector.d.ts.map +1 -1
- package/dist/cli/components/ModelSelector.js +116 -33
- package/dist/cli/components/ModelSelector.js.map +1 -1
- package/dist/cli/components/PermissionPrompt.d.ts +60 -0
- package/dist/cli/components/PermissionPrompt.d.ts.map +1 -0
- package/dist/cli/components/PermissionPrompt.js +192 -0
- package/dist/cli/components/PermissionPrompt.js.map +1 -0
- package/dist/cli/components/ProviderManager.d.ts +8 -0
- package/dist/cli/components/ProviderManager.d.ts.map +1 -0
- package/dist/cli/components/ProviderManager.js +280 -0
- package/dist/cli/components/ProviderManager.js.map +1 -0
- package/dist/cli/components/Spinner.d.ts +7 -2
- package/dist/cli/components/Spinner.d.ts.map +1 -1
- package/dist/cli/components/Spinner.js +116 -25
- package/dist/cli/components/Spinner.js.map +1 -1
- package/dist/cli/components/TodoList.d.ts +7 -0
- package/dist/cli/components/TodoList.d.ts.map +1 -0
- package/dist/cli/components/TodoList.js +34 -0
- package/dist/cli/components/TodoList.js.map +1 -0
- package/dist/cli/components/index.d.ts +1 -0
- package/dist/cli/components/index.d.ts.map +1 -1
- package/dist/cli/components/index.js +1 -0
- package/dist/cli/components/index.js.map +1 -1
- package/dist/cli/components/markdown.d.ts +9 -0
- package/dist/cli/components/markdown.d.ts.map +1 -0
- package/dist/cli/components/markdown.js +129 -0
- package/dist/cli/components/markdown.js.map +1 -0
- package/dist/cli/components/theme.d.ts +5 -0
- package/dist/cli/components/theme.d.ts.map +1 -1
- package/dist/cli/components/theme.js +7 -0
- package/dist/cli/components/theme.js.map +1 -1
- package/dist/cli/index.js +66 -12
- package/dist/cli/index.js.map +1 -1
- package/dist/config/index.d.ts +14 -4
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +19 -3
- package/dist/config/index.js.map +1 -1
- package/dist/config/levels.d.ts +49 -0
- package/dist/config/levels.d.ts.map +1 -0
- package/dist/config/levels.js +222 -0
- package/dist/config/levels.js.map +1 -0
- package/dist/config/loader.d.ts +46 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +153 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/manager.d.ts +115 -15
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/config/manager.js +260 -34
- package/dist/config/manager.js.map +1 -1
- package/dist/config/manager.test.d.ts +5 -0
- package/dist/config/manager.test.d.ts.map +1 -0
- package/dist/config/manager.test.js +192 -0
- package/dist/config/manager.test.js.map +1 -0
- package/dist/config/merger.d.ts +56 -0
- package/dist/config/merger.d.ts.map +1 -0
- package/dist/config/merger.js +177 -0
- package/dist/config/merger.js.map +1 -0
- package/dist/config/providers-config.d.ts +28 -0
- package/dist/config/providers-config.d.ts.map +1 -0
- package/dist/config/providers-config.js +79 -0
- package/dist/config/providers-config.js.map +1 -0
- package/dist/config/test-utils.d.ts +24 -0
- package/dist/config/test-utils.d.ts.map +1 -0
- package/dist/config/test-utils.js +55 -0
- package/dist/config/test-utils.js.map +1 -0
- package/dist/config/types.d.ts +108 -9
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +53 -2
- package/dist/config/types.js.map +1 -1
- package/dist/memory/import-resolver.d.ts +46 -0
- package/dist/memory/import-resolver.d.ts.map +1 -0
- package/dist/memory/import-resolver.js +117 -0
- package/dist/memory/import-resolver.js.map +1 -0
- package/dist/memory/index.d.ts +7 -6
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +7 -5
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/init-prompt.d.ts +22 -0
- package/dist/memory/init-prompt.d.ts.map +1 -0
- package/dist/memory/init-prompt.js +103 -0
- package/dist/memory/init-prompt.js.map +1 -0
- package/dist/memory/memory-manager.d.ts +119 -0
- package/dist/memory/memory-manager.d.ts.map +1 -0
- package/dist/memory/memory-manager.js +587 -0
- package/dist/memory/memory-manager.js.map +1 -0
- package/dist/memory/rules-parser.d.ts +38 -0
- package/dist/memory/rules-parser.d.ts.map +1 -0
- package/dist/memory/rules-parser.js +69 -0
- package/dist/memory/rules-parser.js.map +1 -0
- package/dist/memory/test-utils.d.ts +20 -0
- package/dist/memory/test-utils.d.ts.map +1 -0
- package/dist/memory/test-utils.js +44 -0
- package/dist/memory/test-utils.js.map +1 -0
- package/dist/memory/types.d.ts +70 -63
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +42 -2
- package/dist/memory/types.js.map +1 -1
- package/dist/permissions/audit.d.ts +82 -0
- package/dist/permissions/audit.d.ts.map +1 -0
- package/dist/permissions/audit.js +229 -0
- package/dist/permissions/audit.js.map +1 -0
- package/dist/permissions/index.d.ts +11 -1
- package/dist/permissions/index.d.ts.map +1 -1
- package/dist/permissions/index.js +15 -0
- package/dist/permissions/index.js.map +1 -1
- package/dist/permissions/manager.d.ts +149 -13
- package/dist/permissions/manager.d.ts.map +1 -1
- package/dist/permissions/manager.js +480 -35
- package/dist/permissions/manager.js.map +1 -1
- package/dist/permissions/manager.test.d.ts +5 -0
- package/dist/permissions/manager.test.d.ts.map +1 -0
- package/dist/permissions/manager.test.js +213 -0
- package/dist/permissions/manager.test.js.map +1 -0
- package/dist/permissions/persistence.d.ts +74 -0
- package/dist/permissions/persistence.d.ts.map +1 -0
- package/dist/permissions/persistence.js +248 -0
- package/dist/permissions/persistence.js.map +1 -0
- package/dist/permissions/persistence.test.d.ts +5 -0
- package/dist/permissions/persistence.test.d.ts.map +1 -0
- package/dist/permissions/persistence.test.js +171 -0
- package/dist/permissions/persistence.test.js.map +1 -0
- package/dist/permissions/prompt-matcher.d.ts +64 -0
- package/dist/permissions/prompt-matcher.d.ts.map +1 -0
- package/dist/permissions/prompt-matcher.js +415 -0
- package/dist/permissions/prompt-matcher.js.map +1 -0
- package/dist/permissions/prompt-matcher.test.d.ts +5 -0
- package/dist/permissions/prompt-matcher.test.d.ts.map +1 -0
- package/dist/permissions/prompt-matcher.test.js +107 -0
- package/dist/permissions/prompt-matcher.test.js.map +1 -0
- package/dist/permissions/types.d.ts +157 -0
- package/dist/permissions/types.d.ts.map +1 -1
- package/dist/permissions/types.js +43 -8
- package/dist/permissions/types.js.map +1 -1
- package/dist/prompts/index.d.ts +92 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +241 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/providers/gemini.d.ts.map +1 -1
- package/dist/providers/gemini.js +14 -3
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/index.d.ts +5 -3
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +13 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/registry.d.ts +66 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +158 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/search/brave.d.ts +14 -0
- package/dist/providers/search/brave.d.ts.map +1 -0
- package/dist/providers/search/brave.js +87 -0
- package/dist/providers/search/brave.js.map +1 -0
- package/dist/providers/search/exa.d.ts +12 -0
- package/dist/providers/search/exa.d.ts.map +1 -0
- package/dist/providers/search/exa.js +158 -0
- package/dist/providers/search/exa.js.map +1 -0
- package/dist/providers/search/index.d.ts +31 -0
- package/dist/providers/search/index.d.ts.map +1 -0
- package/dist/providers/search/index.js +75 -0
- package/dist/providers/search/index.js.map +1 -0
- package/dist/providers/search/serper.d.ts +14 -0
- package/dist/providers/search/serper.d.ts.map +1 -0
- package/dist/providers/search/serper.js +87 -0
- package/dist/providers/search/serper.js.map +1 -0
- package/dist/providers/search/types.d.ts +21 -0
- package/dist/providers/search/types.d.ts.map +1 -0
- package/dist/providers/search/types.js +5 -0
- package/dist/providers/search/types.js.map +1 -0
- package/dist/providers/store.d.ts +104 -0
- package/dist/providers/store.d.ts.map +1 -0
- package/dist/providers/store.js +171 -0
- package/dist/providers/store.js.map +1 -0
- package/dist/providers/types.d.ts +7 -1
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/vertex-ai.d.ts +33 -0
- package/dist/providers/vertex-ai.d.ts.map +1 -0
- package/dist/providers/vertex-ai.js +407 -0
- package/dist/providers/vertex-ai.js.map +1 -0
- package/dist/tools/builtin/bash.d.ts.map +1 -1
- package/dist/tools/builtin/bash.js +2 -1
- package/dist/tools/builtin/bash.js.map +1 -1
- package/dist/tools/builtin/edit.d.ts.map +1 -1
- package/dist/tools/builtin/edit.js +2 -1
- package/dist/tools/builtin/edit.js.map +1 -1
- package/dist/tools/builtin/glob.d.ts.map +1 -1
- package/dist/tools/builtin/glob.js +2 -1
- package/dist/tools/builtin/glob.js.map +1 -1
- package/dist/tools/builtin/grep.d.ts.map +1 -1
- package/dist/tools/builtin/grep.js +2 -1
- package/dist/tools/builtin/grep.js.map +1 -1
- package/dist/tools/builtin/read.d.ts.map +1 -1
- package/dist/tools/builtin/read.js +2 -1
- package/dist/tools/builtin/read.js.map +1 -1
- package/dist/tools/builtin/todowrite.d.ts +15 -0
- package/dist/tools/builtin/todowrite.d.ts.map +1 -0
- package/dist/tools/builtin/todowrite.js +88 -0
- package/dist/tools/builtin/todowrite.js.map +1 -0
- package/dist/tools/builtin/webfetch.d.ts +20 -0
- package/dist/tools/builtin/webfetch.d.ts.map +1 -0
- package/dist/tools/builtin/webfetch.js +228 -0
- package/dist/tools/builtin/webfetch.js.map +1 -0
- package/dist/tools/builtin/websearch.d.ts +17 -0
- package/dist/tools/builtin/websearch.d.ts.map +1 -0
- package/dist/tools/builtin/websearch.js +87 -0
- package/dist/tools/builtin/websearch.js.map +1 -0
- package/dist/tools/builtin/write.d.ts.map +1 -1
- package/dist/tools/builtin/write.js +2 -1
- package/dist/tools/builtin/write.js.map +1 -1
- package/dist/tools/index.d.ts +18 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +28 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/types.d.ts +41 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +16 -0
- package/dist/tools/types.js.map +1 -1
- package/dist/tools/utils/ssrf.d.ts +18 -0
- package/dist/tools/utils/ssrf.d.ts.map +1 -0
- package/dist/tools/utils/ssrf.js +70 -0
- package/dist/tools/utils/ssrf.js.map +1 -0
- package/docs/README.md +5 -4
- package/docs/config-system-comparison.md +707 -0
- package/docs/memory-system.md +238 -0
- package/docs/permissions.md +368 -0
- package/docs/proposals/0001-web-fetch-tool.md +32 -2
- package/docs/proposals/0002-web-search-tool.md +59 -2
- package/docs/proposals/0005-todo-system.md +350 -85
- package/docs/proposals/0006-memory-system.md +11 -10
- package/docs/proposals/0012-ask-user-question.md +941 -206
- package/docs/proposals/0023-permission-enhancements.md +61 -2
- package/docs/proposals/0041-configuration-system.md +587 -0
- package/docs/proposals/0042-prompt-optimization.md +866 -0
- package/docs/proposals/README.md +8 -6
- package/docs/providers.md +220 -0
- package/jest.config.js +26 -0
- package/package.json +14 -3
- package/src/agent/agent.ts +120 -18
- package/src/agent/types.ts +9 -1
- package/src/cli/components/App.tsx +369 -47
- package/src/cli/components/CommandSuggestions.tsx +3 -0
- package/src/cli/components/Header.tsx +11 -17
- package/src/cli/components/Logo.tsx +76 -9
- package/src/cli/components/Messages.tsx +146 -38
- package/src/cli/components/ModelSelector.tsx +169 -52
- package/src/cli/components/PermissionPrompt.tsx +388 -0
- package/src/cli/components/ProviderManager.tsx +534 -0
- package/src/cli/components/Spinner.tsx +138 -25
- package/src/cli/components/TodoList.tsx +54 -0
- package/src/cli/components/index.ts +6 -0
- package/src/cli/components/markdown.ts +157 -0
- package/src/cli/components/theme.ts +7 -0
- package/src/cli/index.tsx +76 -13
- package/src/config/index.ts +79 -4
- package/src/config/levels.test.ts +163 -0
- package/src/config/levels.ts +285 -0
- package/src/config/loader.test.ts +120 -0
- package/src/config/loader.ts +178 -0
- package/src/config/manager.test.ts +215 -0
- package/src/config/manager.ts +328 -40
- package/src/config/merger.test.ts +360 -0
- package/src/config/merger.ts +221 -0
- package/src/config/providers-config.ts +85 -0
- package/src/config/test-utils.ts +79 -0
- package/src/config/types.ts +186 -9
- package/src/memory/import-resolver.test.ts +117 -0
- package/src/memory/import-resolver.ts +149 -0
- package/src/memory/index.ts +11 -0
- package/src/memory/init-prompt.ts +113 -0
- package/src/memory/memory-manager.test.ts +198 -0
- package/src/memory/memory-manager.ts +716 -0
- package/src/memory/rules-parser.test.ts +182 -0
- package/src/memory/rules-parser.ts +82 -0
- package/src/memory/test-utils.ts +60 -0
- package/src/memory/types.ts +119 -0
- package/src/permissions/audit.ts +284 -0
- package/src/permissions/index.ts +20 -1
- package/src/permissions/manager.test.ts +260 -0
- package/src/permissions/manager.ts +592 -40
- package/src/permissions/persistence.test.ts +220 -0
- package/src/permissions/persistence.ts +301 -0
- package/src/permissions/prompt-matcher.test.ts +213 -0
- package/src/permissions/prompt-matcher.ts +472 -0
- package/src/permissions/types.ts +236 -8
- package/src/prompts/index.test.ts +279 -0
- package/src/prompts/index.ts +306 -0
- package/src/prompts/system/anthropic.txt +29 -0
- package/src/prompts/system/base.txt +124 -0
- package/src/prompts/system/gemini.txt +35 -0
- package/src/prompts/system/generic.txt +128 -0
- package/src/prompts/system/openai.txt +29 -0
- package/src/prompts/tools/bash.txt +60 -0
- package/src/prompts/tools/edit.txt +29 -0
- package/src/prompts/tools/glob.txt +35 -0
- package/src/prompts/tools/grep.txt +43 -0
- package/src/prompts/tools/read.txt +22 -0
- package/src/prompts/tools/todowrite.txt +71 -0
- package/src/prompts/tools/webfetch.txt +34 -0
- package/src/prompts/tools/websearch.txt +41 -0
- package/src/prompts/tools/write.txt +23 -0
- package/src/providers/gemini.ts +20 -4
- package/src/providers/index.ts +18 -3
- package/src/providers/registry.ts +198 -0
- package/src/providers/search/brave.ts +132 -0
- package/src/providers/search/exa.ts +217 -0
- package/src/providers/search/index.ts +79 -0
- package/src/providers/search/serper.ts +133 -0
- package/src/providers/search/types.ts +24 -0
- package/src/providers/store.ts +216 -0
- package/src/providers/types.ts +9 -1
- package/src/providers/vertex-ai.ts +594 -0
- package/src/tools/builtin/bash.ts +2 -1
- package/src/tools/builtin/edit.ts +2 -1
- package/src/tools/builtin/glob.ts +2 -1
- package/src/tools/builtin/grep.ts +2 -1
- package/src/tools/builtin/read.ts +2 -1
- package/src/tools/builtin/todowrite.ts +102 -0
- package/src/tools/builtin/webfetch.ts +261 -0
- package/src/tools/builtin/websearch.ts +103 -0
- package/src/tools/builtin/write.ts +2 -1
- package/src/tools/index.ts +28 -2
- package/src/tools/types.ts +32 -0
- package/src/tools/utils/ssrf.ts +79 -0
- package/tsconfig.json +1 -1
- package/CLAUDE.md +0 -70
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission Audit - Log permission decisions for transparency
|
|
3
|
+
*
|
|
4
|
+
* Maintains an in-memory audit log with optional file persistence.
|
|
5
|
+
* Useful for debugging, security review, and compliance.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'fs/promises';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import * as os from 'os';
|
|
10
|
+
const AUDIT_FILE = 'permission-audit.json';
|
|
11
|
+
const MAX_MEMORY_ENTRIES = 1000;
|
|
12
|
+
const MAX_FILE_ENTRIES = 10000;
|
|
13
|
+
const GLOBAL_DIR = path.join(os.homedir(), '.gencode');
|
|
14
|
+
/**
|
|
15
|
+
* Summarize tool input for audit (avoid storing sensitive data)
|
|
16
|
+
*/
|
|
17
|
+
function summarizeInput(tool, input) {
|
|
18
|
+
if (input === null || input === undefined)
|
|
19
|
+
return '';
|
|
20
|
+
if (typeof input === 'string') {
|
|
21
|
+
return input.slice(0, 100);
|
|
22
|
+
}
|
|
23
|
+
if (typeof input !== 'object') {
|
|
24
|
+
return String(input).slice(0, 100);
|
|
25
|
+
}
|
|
26
|
+
const obj = input;
|
|
27
|
+
// Tool-specific summaries
|
|
28
|
+
switch (tool) {
|
|
29
|
+
case 'Bash':
|
|
30
|
+
return obj.command?.slice(0, 100) ?? '';
|
|
31
|
+
case 'Read':
|
|
32
|
+
case 'Write':
|
|
33
|
+
case 'Edit':
|
|
34
|
+
case 'Glob':
|
|
35
|
+
return obj.file_path ?? obj.path ?? '';
|
|
36
|
+
case 'Grep':
|
|
37
|
+
return `${obj.pattern ?? ''} in ${obj.path ?? '.'}`;
|
|
38
|
+
case 'WebFetch':
|
|
39
|
+
return obj.url?.slice(0, 100) ?? '';
|
|
40
|
+
case 'WebSearch':
|
|
41
|
+
return obj.query?.slice(0, 100) ?? '';
|
|
42
|
+
default:
|
|
43
|
+
// Generic summary
|
|
44
|
+
const keys = Object.keys(obj).slice(0, 3);
|
|
45
|
+
return keys.map((k) => `${k}:${String(obj[k]).slice(0, 20)}`).join(', ');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Permission Audit Logger
|
|
50
|
+
*/
|
|
51
|
+
export class PermissionAudit {
|
|
52
|
+
entries = [];
|
|
53
|
+
persistToFile;
|
|
54
|
+
filePath;
|
|
55
|
+
constructor(options = {}) {
|
|
56
|
+
this.persistToFile = options.persistToFile ?? false;
|
|
57
|
+
const dir = options.auditDir ?? GLOBAL_DIR;
|
|
58
|
+
this.filePath = path.join(dir, AUDIT_FILE);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Log a permission decision
|
|
62
|
+
*/
|
|
63
|
+
async log(tool, input, decision, reason, options = {}) {
|
|
64
|
+
const entry = {
|
|
65
|
+
timestamp: new Date(),
|
|
66
|
+
tool,
|
|
67
|
+
inputSummary: summarizeInput(tool, input),
|
|
68
|
+
decision,
|
|
69
|
+
reason,
|
|
70
|
+
matchedRule: options.matchedRule,
|
|
71
|
+
sessionId: options.sessionId,
|
|
72
|
+
};
|
|
73
|
+
// Add to memory
|
|
74
|
+
this.entries.push(entry);
|
|
75
|
+
// Trim if too large
|
|
76
|
+
if (this.entries.length > MAX_MEMORY_ENTRIES) {
|
|
77
|
+
this.entries = this.entries.slice(-MAX_MEMORY_ENTRIES);
|
|
78
|
+
}
|
|
79
|
+
// Persist if enabled
|
|
80
|
+
if (this.persistToFile) {
|
|
81
|
+
await this.appendToFile(entry);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Append entry to file
|
|
86
|
+
*/
|
|
87
|
+
async appendToFile(entry) {
|
|
88
|
+
try {
|
|
89
|
+
// Ensure directory exists
|
|
90
|
+
const dir = path.dirname(this.filePath);
|
|
91
|
+
await fs.mkdir(dir, { recursive: true });
|
|
92
|
+
// Load existing entries
|
|
93
|
+
let fileEntries = [];
|
|
94
|
+
try {
|
|
95
|
+
const content = await fs.readFile(this.filePath, 'utf-8');
|
|
96
|
+
fileEntries = JSON.parse(content);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// File doesn't exist
|
|
100
|
+
}
|
|
101
|
+
// Add new entry
|
|
102
|
+
fileEntries.push(entry);
|
|
103
|
+
// Trim if too large
|
|
104
|
+
if (fileEntries.length > MAX_FILE_ENTRIES) {
|
|
105
|
+
fileEntries = fileEntries.slice(-MAX_FILE_ENTRIES);
|
|
106
|
+
}
|
|
107
|
+
// Write back
|
|
108
|
+
await fs.writeFile(this.filePath, JSON.stringify(fileEntries, null, 2), 'utf-8');
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// Silently fail - audit should not break the app
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get recent audit entries
|
|
116
|
+
*/
|
|
117
|
+
getRecent(count = 50) {
|
|
118
|
+
return this.entries.slice(-count);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get all entries in memory
|
|
122
|
+
*/
|
|
123
|
+
getAll() {
|
|
124
|
+
return [...this.entries];
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get entries by tool
|
|
128
|
+
*/
|
|
129
|
+
getByTool(tool) {
|
|
130
|
+
return this.entries.filter((e) => e.tool === tool);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get entries by decision
|
|
134
|
+
*/
|
|
135
|
+
getByDecision(decision) {
|
|
136
|
+
return this.entries.filter((e) => e.decision === decision);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Get entries by session
|
|
140
|
+
*/
|
|
141
|
+
getBySession(sessionId) {
|
|
142
|
+
return this.entries.filter((e) => e.sessionId === sessionId);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get statistics
|
|
146
|
+
*/
|
|
147
|
+
getStats() {
|
|
148
|
+
const stats = {
|
|
149
|
+
total: this.entries.length,
|
|
150
|
+
allowed: 0,
|
|
151
|
+
denied: 0,
|
|
152
|
+
confirmed: 0,
|
|
153
|
+
rejected: 0,
|
|
154
|
+
byTool: {},
|
|
155
|
+
};
|
|
156
|
+
for (const entry of this.entries) {
|
|
157
|
+
// Count by decision
|
|
158
|
+
switch (entry.decision) {
|
|
159
|
+
case 'allowed':
|
|
160
|
+
stats.allowed++;
|
|
161
|
+
break;
|
|
162
|
+
case 'denied':
|
|
163
|
+
stats.denied++;
|
|
164
|
+
break;
|
|
165
|
+
case 'confirmed':
|
|
166
|
+
stats.confirmed++;
|
|
167
|
+
break;
|
|
168
|
+
case 'rejected':
|
|
169
|
+
stats.rejected++;
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
// Count by tool
|
|
173
|
+
stats.byTool[entry.tool] = (stats.byTool[entry.tool] ?? 0) + 1;
|
|
174
|
+
}
|
|
175
|
+
return stats;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Clear in-memory entries
|
|
179
|
+
*/
|
|
180
|
+
clear() {
|
|
181
|
+
this.entries = [];
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Load entries from file
|
|
185
|
+
*/
|
|
186
|
+
async loadFromFile() {
|
|
187
|
+
try {
|
|
188
|
+
const content = await fs.readFile(this.filePath, 'utf-8');
|
|
189
|
+
return JSON.parse(content);
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
return [];
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Clear file entries
|
|
197
|
+
*/
|
|
198
|
+
async clearFile() {
|
|
199
|
+
try {
|
|
200
|
+
await fs.writeFile(this.filePath, '[]', 'utf-8');
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
// Silently fail
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Format entry for display
|
|
208
|
+
*/
|
|
209
|
+
formatEntry(entry) {
|
|
210
|
+
const time = entry.timestamp.toLocaleTimeString('en-US', {
|
|
211
|
+
hour: '2-digit',
|
|
212
|
+
minute: '2-digit',
|
|
213
|
+
});
|
|
214
|
+
const decision = entry.decision.toUpperCase().padEnd(9);
|
|
215
|
+
const tool = entry.tool.padEnd(10);
|
|
216
|
+
const input = entry.inputSummary.slice(0, 40).padEnd(40);
|
|
217
|
+
return `${time} ${decision} ${tool} ${input}`;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Format entries as table
|
|
221
|
+
*/
|
|
222
|
+
formatTable(entries) {
|
|
223
|
+
const header = 'Time Decision Tool Input';
|
|
224
|
+
const separator = '─'.repeat(header.length);
|
|
225
|
+
const rows = entries.map((e) => this.formatEntry(e));
|
|
226
|
+
return [header, separator, ...rows].join('\n');
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/permissions/audit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAGzB,MAAM,UAAU,GAAG,uBAAuB,CAAC;AAC3C,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAEvD;;GAEG;AACH,SAAS,cAAc,CAAC,IAAY,EAAE,KAAc;IAClD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAErD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,GAAG,GAAG,KAAgC,CAAC;IAE7C,0BAA0B;IAC1B,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAQ,GAAG,CAAC,OAAkB,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QAEtD,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACT,OAAQ,GAAG,CAAC,SAAoB,IAAK,GAAG,CAAC,IAAe,IAAI,EAAE,CAAC;QAEjE,KAAK,MAAM;YACT,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,OAAO,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;QAEtD,KAAK,UAAU;YACb,OAAQ,GAAG,CAAC,GAAc,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QAElD,KAAK,WAAW;YACd,OAAQ,GAAG,CAAC,KAAgB,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QAEpD;YACE,kBAAkB;YAClB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,eAAe;IAClB,OAAO,GAA2B,EAAE,CAAC;IACrC,aAAa,CAAU;IACvB,QAAQ,CAAS;IAEzB,YAAY,UAA0D,EAAE;QACtE,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,KAAK,CAAC;QACpD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,IAAI,UAAU,CAAC;QAC3C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CACP,IAAY,EACZ,KAAc,EACd,QAAuB,EACvB,MAAc,EACd,UAGI,EAAE;QAEN,MAAM,KAAK,GAAyB;YAClC,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,IAAI;YACJ,YAAY,EAAE,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC;YACzC,QAAQ;YACR,MAAM;YACN,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC;QAEF,gBAAgB;QAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEzB,oBAAoB;QACpB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,CAAC;QACzD,CAAC;QAED,qBAAqB;QACrB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CAAC,KAA2B;QACpD,IAAI,CAAC;YACH,0BAA0B;YAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEzC,wBAAwB;YACxB,IAAI,WAAW,GAA2B,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC1D,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC;YAAC,MAAM,CAAC;gBACP,qBAAqB;YACvB,CAAC;YAED,gBAAgB;YAChB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAExB,oBAAoB;YACpB,IAAI,WAAW,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;gBAC1C,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,gBAAgB,CAAC,CAAC;YACrD,CAAC;YAED,aAAa;YACb,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EACpC,OAAO,CACR,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,iDAAiD;QACnD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,QAAgB,EAAE;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,QAAuB;QACnC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,SAAiB;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,QAAQ;QAQN,MAAM,KAAK,GAAG;YACZ,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;YAC1B,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,CAAC;YACT,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,EAA4B;SACrC,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,oBAAoB;YACpB,QAAQ,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACvB,KAAK,SAAS;oBACZ,KAAK,CAAC,OAAO,EAAE,CAAC;oBAChB,MAAM;gBACR,KAAK,QAAQ;oBACX,KAAK,CAAC,MAAM,EAAE,CAAC;oBACf,MAAM;gBACR,KAAK,WAAW;oBACd,KAAK,CAAC,SAAS,EAAE,CAAC;oBAClB,MAAM;gBACR,KAAK,UAAU;oBACb,KAAK,CAAC,QAAQ,EAAE,CAAC;oBACjB,MAAM;YACV,CAAC;YAED,gBAAgB;YAChB,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,KAA2B;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE;YACvD,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAEzD,OAAO,GAAG,IAAI,KAAK,QAAQ,KAAK,IAAI,KAAK,KAAK,EAAE,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,OAA+B;QACzC,MAAM,MAAM,GAAG,wCAAwC,CAAC;QACxD,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAErD,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;CACF"}
|
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Permission System
|
|
3
|
+
*
|
|
4
|
+
* Enhanced permission management with:
|
|
5
|
+
* - Pattern-based rules (Claude Code style: "Bash(git add:*)")
|
|
6
|
+
* - Prompt-based permissions (ExitPlanMode style)
|
|
7
|
+
* - Session/project/global scopes
|
|
8
|
+
* - Persistent allowlists
|
|
9
|
+
* - Audit trail
|
|
3
10
|
*/
|
|
4
11
|
export * from './types.js';
|
|
5
12
|
export { PermissionManager } from './manager.js';
|
|
6
|
-
export type { ConfirmCallback } from './manager.js';
|
|
13
|
+
export type { ConfirmCallback, SimpleConfirmCallback } from './manager.js';
|
|
14
|
+
export { PromptMatcher, parsePatternString, matchesPatternString } from './prompt-matcher.js';
|
|
15
|
+
export { PermissionPersistence } from './persistence.js';
|
|
16
|
+
export { PermissionAudit } from './audit.js';
|
|
7
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/permissions/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/permissions/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,YAAY,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAG3E,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAGzD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Permission System
|
|
3
|
+
*
|
|
4
|
+
* Enhanced permission management with:
|
|
5
|
+
* - Pattern-based rules (Claude Code style: "Bash(git add:*)")
|
|
6
|
+
* - Prompt-based permissions (ExitPlanMode style)
|
|
7
|
+
* - Session/project/global scopes
|
|
8
|
+
* - Persistent allowlists
|
|
9
|
+
* - Audit trail
|
|
3
10
|
*/
|
|
11
|
+
// Types
|
|
4
12
|
export * from './types.js';
|
|
13
|
+
// Core Manager
|
|
5
14
|
export { PermissionManager } from './manager.js';
|
|
15
|
+
// Prompt Matching
|
|
16
|
+
export { PromptMatcher, parsePatternString, matchesPatternString } from './prompt-matcher.js';
|
|
17
|
+
// Persistence
|
|
18
|
+
export { PermissionPersistence } from './persistence.js';
|
|
19
|
+
// Audit
|
|
20
|
+
export { PermissionAudit } from './audit.js';
|
|
6
21
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/permissions/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/permissions/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,QAAQ;AACR,cAAc,YAAY,CAAC;AAE3B,eAAe;AACf,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGjD,kBAAkB;AAClB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE9F,cAAc;AACd,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,QAAQ;AACR,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -1,32 +1,168 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Permission Manager -
|
|
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 type { PermissionConfig, PermissionContext, PermissionDecision, PermissionMode, PermissionRule, PromptPermission, ConfirmCallback, SimpleConfirmCallback, PermissionSettings } from './types.js';
|
|
13
|
+
import { PermissionPersistence } from './persistence.js';
|
|
14
|
+
import { PermissionAudit } from './audit.js';
|
|
15
|
+
/**
|
|
16
|
+
* Enhanced Permission Manager
|
|
3
17
|
*/
|
|
4
|
-
import type { PermissionConfig, PermissionMode } from './types.js';
|
|
5
|
-
export type ConfirmCallback = (tool: string, input: unknown) => Promise<boolean>;
|
|
6
18
|
export declare class PermissionManager {
|
|
7
19
|
private config;
|
|
20
|
+
private promptMatcher;
|
|
21
|
+
private persistence;
|
|
22
|
+
private audit;
|
|
23
|
+
private sessionApprovals;
|
|
24
|
+
private sessionRejections;
|
|
8
25
|
private confirmCallback?;
|
|
9
|
-
private
|
|
10
|
-
|
|
26
|
+
private simpleConfirmCallback?;
|
|
27
|
+
private saveRuleCallback?;
|
|
28
|
+
private sessionId?;
|
|
29
|
+
private projectPath?;
|
|
30
|
+
constructor(options?: {
|
|
31
|
+
config?: Partial<PermissionConfig>;
|
|
32
|
+
projectPath?: string;
|
|
33
|
+
enableAudit?: boolean;
|
|
34
|
+
});
|
|
35
|
+
/**
|
|
36
|
+
* Initialize - load persisted rules and settings
|
|
37
|
+
*/
|
|
38
|
+
initialize(settings?: PermissionSettings): Promise<void>;
|
|
11
39
|
/**
|
|
12
|
-
* Set
|
|
40
|
+
* Set session ID for tracking
|
|
41
|
+
*/
|
|
42
|
+
setSessionId(sessionId: string): void;
|
|
43
|
+
/**
|
|
44
|
+
* Set enhanced confirmation callback
|
|
13
45
|
*/
|
|
14
46
|
setConfirmCallback(callback: ConfirmCallback): void;
|
|
15
47
|
/**
|
|
16
|
-
*
|
|
48
|
+
* Set simple yes/no confirmation callback (backward compatible)
|
|
17
49
|
*/
|
|
18
|
-
|
|
50
|
+
setSimpleConfirmCallback(callback: SimpleConfirmCallback): void;
|
|
51
|
+
/**
|
|
52
|
+
* Set callback to save permission rules to settings
|
|
53
|
+
* This allows integration with SettingsManager for settings.local.json persistence
|
|
54
|
+
*/
|
|
55
|
+
setSaveRuleCallback(callback: (tool: string, pattern?: string) => Promise<void>): void;
|
|
56
|
+
/**
|
|
57
|
+
* Add prompt-based permissions (Claude Code ExitPlanMode style)
|
|
58
|
+
*/
|
|
59
|
+
addAllowedPrompts(prompts: PromptPermission[]): void;
|
|
60
|
+
/**
|
|
61
|
+
* Clear prompt-based permissions
|
|
62
|
+
*/
|
|
63
|
+
clearAllowedPrompts(): void;
|
|
64
|
+
/**
|
|
65
|
+
* Get current allowed prompts
|
|
66
|
+
*/
|
|
67
|
+
getAllowedPrompts(): PromptPermission[];
|
|
68
|
+
/**
|
|
69
|
+
* Get all rules
|
|
70
|
+
*/
|
|
71
|
+
getRules(): PermissionRule[];
|
|
72
|
+
/**
|
|
73
|
+
* Check permission (without prompting user)
|
|
74
|
+
*
|
|
75
|
+
* Flow matches Claude Code official design:
|
|
76
|
+
* 1. DENY rules → block immediately
|
|
77
|
+
* 2. ALLOW rules → auto-approve (includes prompt-based & session cache)
|
|
78
|
+
* 3. ASK rules → force prompt
|
|
79
|
+
* 4. Default behavior (read-only → auto, write → prompt)
|
|
80
|
+
*/
|
|
81
|
+
checkPermission(context: PermissionContext): Promise<PermissionDecision>;
|
|
82
|
+
/**
|
|
83
|
+
* Request permission (prompts user if needed)
|
|
84
|
+
*/
|
|
85
|
+
requestPermission(tool: string, input: unknown): Promise<boolean>;
|
|
19
86
|
/**
|
|
20
|
-
*
|
|
87
|
+
* Backward-compatible check method
|
|
21
88
|
*/
|
|
22
|
-
|
|
89
|
+
check(tool: string, input: unknown): Promise<boolean>;
|
|
90
|
+
/**
|
|
91
|
+
* Get permission mode for a tool (for simple queries)
|
|
92
|
+
*/
|
|
93
|
+
getModeForTool(tool: string): PermissionMode;
|
|
23
94
|
/**
|
|
24
95
|
* Approve a tool for this session
|
|
25
96
|
*/
|
|
26
|
-
|
|
97
|
+
approveForSession(tool: string, pattern?: string): void;
|
|
98
|
+
/**
|
|
99
|
+
* Add a persistent allow rule
|
|
100
|
+
*/
|
|
101
|
+
addAllowRule(tool: string, pattern?: string, scope?: 'project' | 'global'): Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* Add a persistent deny rule
|
|
104
|
+
*/
|
|
105
|
+
addDenyRule(tool: string, pattern?: string, scope?: 'project' | 'global'): Promise<void>;
|
|
106
|
+
/**
|
|
107
|
+
* Clear session approvals
|
|
108
|
+
*/
|
|
109
|
+
clearSessionApprovals(): void;
|
|
110
|
+
/**
|
|
111
|
+
* Get audit log
|
|
112
|
+
*/
|
|
113
|
+
getAuditLog(count?: number): ReturnType<PermissionAudit['getRecent']>;
|
|
114
|
+
/**
|
|
115
|
+
* Get audit statistics
|
|
116
|
+
*/
|
|
117
|
+
getAuditStats(): ReturnType<PermissionAudit['getStats']>;
|
|
118
|
+
/**
|
|
119
|
+
* Get persistence manager (for direct access)
|
|
120
|
+
*/
|
|
121
|
+
getPersistence(): PermissionPersistence;
|
|
122
|
+
/**
|
|
123
|
+
* Find a matching rule for the given context and mode
|
|
124
|
+
*/
|
|
125
|
+
private findMatchingRule;
|
|
126
|
+
/**
|
|
127
|
+
* Check if tool matches rule
|
|
128
|
+
*/
|
|
129
|
+
private matchesTool;
|
|
130
|
+
/**
|
|
131
|
+
* Check if input matches pattern
|
|
132
|
+
*/
|
|
133
|
+
private matchesPattern;
|
|
134
|
+
/**
|
|
135
|
+
* Match against prompt-based permissions
|
|
136
|
+
*/
|
|
137
|
+
private matchPrompt;
|
|
138
|
+
/**
|
|
139
|
+
* Generate cache key for session approvals
|
|
140
|
+
*/
|
|
141
|
+
private getCacheKey;
|
|
142
|
+
/**
|
|
143
|
+
* Get approval suggestions for a context
|
|
144
|
+
*/
|
|
145
|
+
private getSuggestions;
|
|
146
|
+
/**
|
|
147
|
+
* Prompt user for approval
|
|
148
|
+
*/
|
|
149
|
+
private promptUser;
|
|
150
|
+
/**
|
|
151
|
+
* Handle the user's approval action
|
|
152
|
+
*/
|
|
153
|
+
private handleApprovalAction;
|
|
154
|
+
/**
|
|
155
|
+
* Extract a pattern from tool input for persistent rules
|
|
156
|
+
*/
|
|
157
|
+
private extractPattern;
|
|
158
|
+
/**
|
|
159
|
+
* Describe a rule for logging
|
|
160
|
+
*/
|
|
161
|
+
private describeRule;
|
|
27
162
|
/**
|
|
28
|
-
*
|
|
163
|
+
* Log audit entry
|
|
29
164
|
*/
|
|
30
|
-
|
|
165
|
+
private logAudit;
|
|
31
166
|
}
|
|
167
|
+
export type { ConfirmCallback, SimpleConfirmCallback };
|
|
32
168
|
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/permissions/manager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/permissions/manager.ts"],"names":[],"mappings":"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"}
|