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.
- package/.gencode/settings.local.json +7 -0
- package/README.md +11 -11
- package/dist/agent/agent.d.ts +42 -1
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +82 -15
- package/dist/agent/agent.js.map +1 -1
- 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 +231 -29
- 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 +2 -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 +4 -4
- package/dist/cli/components/Messages.d.ts.map +1 -1
- package/dist/cli/components/Messages.js +51 -25
- package/dist/cli/components/Messages.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.js +3 -3
- package/dist/cli/components/ProviderManager.js.map +1 -1
- 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/index.js +47 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/config/index.d.ts +13 -4
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +18 -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/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 +78 -9
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +52 -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/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.map +1 -1
- package/dist/tools/builtin/webfetch.js +2 -5
- package/dist/tools/builtin/webfetch.js.map +1 -1
- package/dist/tools/builtin/websearch.d.ts.map +1 -1
- package/dist/tools/builtin/websearch.js +2 -16
- package/dist/tools/builtin/websearch.js.map +1 -1
- 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 +7 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/types.d.ts +22 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +8 -0
- package/dist/tools/types.js.map +1 -1
- package/docs/config-system-comparison.md +707 -0
- package/docs/memory-system.md +238 -0
- package/docs/permissions.md +368 -0
- 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 +33 -2
- package/docs/proposals/0042-prompt-optimization.md +866 -0
- package/docs/proposals/README.md +6 -5
- package/jest.config.js +26 -0
- package/package.json +8 -2
- package/src/agent/agent.ts +111 -16
- package/src/cli/components/App.tsx +309 -36
- package/src/cli/components/CommandSuggestions.tsx +2 -0
- package/src/cli/components/Header.tsx +11 -17
- package/src/cli/components/Logo.tsx +76 -9
- package/src/cli/components/Messages.tsx +73 -53
- package/src/cli/components/PermissionPrompt.tsx +388 -0
- package/src/cli/components/ProviderManager.tsx +5 -5
- 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/index.tsx +54 -6
- package/src/config/index.ts +78 -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/test-utils.ts +79 -0
- package/src/config/types.ts +152 -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/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 +2 -5
- package/src/tools/builtin/websearch.ts +2 -16
- package/src/tools/builtin/write.ts +2 -1
- package/src/tools/index.ts +4 -0
- package/src/tools/types.ts +12 -0
- package/tsconfig.json +1 -1
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Levels - Path resolution for multi-level config
|
|
3
|
+
*
|
|
4
|
+
* Defines the configuration hierarchy and resolves paths for each level.
|
|
5
|
+
* At each level, both .gencode and .claude directories are loaded and merged,
|
|
6
|
+
* with .gencode taking higher priority.
|
|
7
|
+
*/
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import * as os from 'os';
|
|
10
|
+
import * as fs from 'fs/promises';
|
|
11
|
+
import { GENCODE_DIR, CLAUDE_DIR, SETTINGS_FILE_NAME, SETTINGS_LOCAL_FILE_NAME, MANAGED_SETTINGS_FILE_NAME, GENCODE_CONFIG_DIRS_ENV, getManagedPaths, } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Find the project root by walking up the directory tree
|
|
14
|
+
*/
|
|
15
|
+
export async function findProjectRoot(cwd) {
|
|
16
|
+
let current = path.resolve(cwd);
|
|
17
|
+
const root = path.parse(current).root;
|
|
18
|
+
while (current !== root) {
|
|
19
|
+
// Check for git directory
|
|
20
|
+
try {
|
|
21
|
+
await fs.access(path.join(current, '.git'));
|
|
22
|
+
return current;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Not a git root, continue
|
|
26
|
+
}
|
|
27
|
+
// Check for .gencode or .claude directories
|
|
28
|
+
try {
|
|
29
|
+
await fs.access(path.join(current, GENCODE_DIR));
|
|
30
|
+
return current;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// Continue
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
await fs.access(path.join(current, CLAUDE_DIR));
|
|
37
|
+
return current;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Continue
|
|
41
|
+
}
|
|
42
|
+
const parent = path.dirname(current);
|
|
43
|
+
if (parent === current)
|
|
44
|
+
break;
|
|
45
|
+
current = parent;
|
|
46
|
+
}
|
|
47
|
+
return cwd;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Check if a path exists
|
|
51
|
+
*/
|
|
52
|
+
async function pathExists(filePath) {
|
|
53
|
+
try {
|
|
54
|
+
await fs.access(filePath);
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Parse GENCODE_CONFIG_DIRS environment variable
|
|
63
|
+
*/
|
|
64
|
+
export function parseExtraConfigDirs() {
|
|
65
|
+
const value = process.env[GENCODE_CONFIG_DIRS_ENV];
|
|
66
|
+
if (!value)
|
|
67
|
+
return [];
|
|
68
|
+
return value
|
|
69
|
+
.split(':')
|
|
70
|
+
.map((dir) => dir.trim())
|
|
71
|
+
.filter((dir) => dir.length > 0)
|
|
72
|
+
.map((dir) => dir.replace(/^~/, os.homedir()));
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get all configuration levels with resolved paths
|
|
76
|
+
*/
|
|
77
|
+
export async function getConfigLevels(cwd) {
|
|
78
|
+
const projectRoot = await findProjectRoot(cwd);
|
|
79
|
+
const home = os.homedir();
|
|
80
|
+
const managedPaths = getManagedPaths();
|
|
81
|
+
const extraDirs = parseExtraConfigDirs();
|
|
82
|
+
const levels = [];
|
|
83
|
+
// Level 1: User (lowest priority for settings, loaded first)
|
|
84
|
+
const userPaths = [];
|
|
85
|
+
// Claude first (lower priority within level)
|
|
86
|
+
const userClaudeDir = path.join(home, CLAUDE_DIR);
|
|
87
|
+
userPaths.push({
|
|
88
|
+
settingsPath: path.join(userClaudeDir, SETTINGS_FILE_NAME),
|
|
89
|
+
dir: userClaudeDir,
|
|
90
|
+
namespace: 'claude',
|
|
91
|
+
exists: await pathExists(path.join(userClaudeDir, SETTINGS_FILE_NAME)),
|
|
92
|
+
});
|
|
93
|
+
// GenCode second (higher priority within level)
|
|
94
|
+
const userGencodeDir = path.join(home, GENCODE_DIR);
|
|
95
|
+
userPaths.push({
|
|
96
|
+
settingsPath: path.join(userGencodeDir, SETTINGS_FILE_NAME),
|
|
97
|
+
dir: userGencodeDir,
|
|
98
|
+
namespace: 'gencode',
|
|
99
|
+
exists: await pathExists(path.join(userGencodeDir, SETTINGS_FILE_NAME)),
|
|
100
|
+
});
|
|
101
|
+
levels.push({
|
|
102
|
+
type: 'user',
|
|
103
|
+
priority: 10,
|
|
104
|
+
paths: userPaths,
|
|
105
|
+
description: 'User global settings',
|
|
106
|
+
});
|
|
107
|
+
// Level 2: Extra config dirs from environment variable
|
|
108
|
+
if (extraDirs.length > 0) {
|
|
109
|
+
for (let i = 0; i < extraDirs.length; i++) {
|
|
110
|
+
const dir = extraDirs[i];
|
|
111
|
+
const extraPaths = [
|
|
112
|
+
{
|
|
113
|
+
settingsPath: path.join(dir, SETTINGS_FILE_NAME),
|
|
114
|
+
dir,
|
|
115
|
+
namespace: 'extra',
|
|
116
|
+
exists: await pathExists(path.join(dir, SETTINGS_FILE_NAME)),
|
|
117
|
+
},
|
|
118
|
+
];
|
|
119
|
+
levels.push({
|
|
120
|
+
type: 'extra',
|
|
121
|
+
priority: 20 + i, // Each extra dir has slightly higher priority
|
|
122
|
+
paths: extraPaths,
|
|
123
|
+
description: `Extra config from ${dir}`,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Level 3: Project (shared, committed to git)
|
|
128
|
+
const projectPaths = [];
|
|
129
|
+
// Claude first (lower priority within level)
|
|
130
|
+
const projectClaudeDir = path.join(projectRoot, CLAUDE_DIR);
|
|
131
|
+
projectPaths.push({
|
|
132
|
+
settingsPath: path.join(projectClaudeDir, SETTINGS_FILE_NAME),
|
|
133
|
+
dir: projectClaudeDir,
|
|
134
|
+
namespace: 'claude',
|
|
135
|
+
exists: await pathExists(path.join(projectClaudeDir, SETTINGS_FILE_NAME)),
|
|
136
|
+
});
|
|
137
|
+
// GenCode second (higher priority within level)
|
|
138
|
+
const projectGencodeDir = path.join(projectRoot, GENCODE_DIR);
|
|
139
|
+
projectPaths.push({
|
|
140
|
+
settingsPath: path.join(projectGencodeDir, SETTINGS_FILE_NAME),
|
|
141
|
+
dir: projectGencodeDir,
|
|
142
|
+
namespace: 'gencode',
|
|
143
|
+
exists: await pathExists(path.join(projectGencodeDir, SETTINGS_FILE_NAME)),
|
|
144
|
+
});
|
|
145
|
+
levels.push({
|
|
146
|
+
type: 'project',
|
|
147
|
+
priority: 30,
|
|
148
|
+
paths: projectPaths,
|
|
149
|
+
description: 'Project shared settings',
|
|
150
|
+
});
|
|
151
|
+
// Level 4: Local (personal, gitignored)
|
|
152
|
+
const localPaths = [];
|
|
153
|
+
// Claude first (lower priority within level)
|
|
154
|
+
localPaths.push({
|
|
155
|
+
settingsPath: path.join(projectClaudeDir, SETTINGS_LOCAL_FILE_NAME),
|
|
156
|
+
dir: projectClaudeDir,
|
|
157
|
+
namespace: 'claude',
|
|
158
|
+
exists: await pathExists(path.join(projectClaudeDir, SETTINGS_LOCAL_FILE_NAME)),
|
|
159
|
+
});
|
|
160
|
+
// GenCode second (higher priority within level)
|
|
161
|
+
localPaths.push({
|
|
162
|
+
settingsPath: path.join(projectGencodeDir, SETTINGS_LOCAL_FILE_NAME),
|
|
163
|
+
dir: projectGencodeDir,
|
|
164
|
+
namespace: 'gencode',
|
|
165
|
+
exists: await pathExists(path.join(projectGencodeDir, SETTINGS_LOCAL_FILE_NAME)),
|
|
166
|
+
});
|
|
167
|
+
levels.push({
|
|
168
|
+
type: 'local',
|
|
169
|
+
priority: 40,
|
|
170
|
+
paths: localPaths,
|
|
171
|
+
description: 'Local personal settings (gitignored)',
|
|
172
|
+
});
|
|
173
|
+
// Level 5: Managed (highest priority, enforced)
|
|
174
|
+
const managedPathsList = [];
|
|
175
|
+
// Claude first (lower priority within level)
|
|
176
|
+
managedPathsList.push({
|
|
177
|
+
settingsPath: path.join(managedPaths.claude, MANAGED_SETTINGS_FILE_NAME),
|
|
178
|
+
dir: managedPaths.claude,
|
|
179
|
+
namespace: 'claude',
|
|
180
|
+
exists: await pathExists(path.join(managedPaths.claude, MANAGED_SETTINGS_FILE_NAME)),
|
|
181
|
+
});
|
|
182
|
+
// GenCode second (higher priority within level)
|
|
183
|
+
managedPathsList.push({
|
|
184
|
+
settingsPath: path.join(managedPaths.gencode, MANAGED_SETTINGS_FILE_NAME),
|
|
185
|
+
dir: managedPaths.gencode,
|
|
186
|
+
namespace: 'gencode',
|
|
187
|
+
exists: await pathExists(path.join(managedPaths.gencode, MANAGED_SETTINGS_FILE_NAME)),
|
|
188
|
+
});
|
|
189
|
+
levels.push({
|
|
190
|
+
type: 'managed',
|
|
191
|
+
priority: 100, // Highest priority
|
|
192
|
+
paths: managedPathsList,
|
|
193
|
+
description: 'System-wide managed settings (enforced)',
|
|
194
|
+
});
|
|
195
|
+
// Sort by priority (ascending, so we merge from low to high)
|
|
196
|
+
return levels.sort((a, b) => a.priority - b.priority);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get the primary settings directory for saving
|
|
200
|
+
* Prefers .gencode if it exists, otherwise creates it
|
|
201
|
+
*/
|
|
202
|
+
export function getPrimarySettingsDir(level, projectRoot) {
|
|
203
|
+
const home = os.homedir();
|
|
204
|
+
switch (level) {
|
|
205
|
+
case 'user':
|
|
206
|
+
return path.join(home, GENCODE_DIR);
|
|
207
|
+
case 'project':
|
|
208
|
+
case 'local':
|
|
209
|
+
return path.join(projectRoot, GENCODE_DIR);
|
|
210
|
+
default:
|
|
211
|
+
return path.join(home, GENCODE_DIR);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Get the settings file path for a specific level
|
|
216
|
+
*/
|
|
217
|
+
export function getSettingsFilePath(level, projectRoot) {
|
|
218
|
+
const dir = getPrimarySettingsDir(level, projectRoot);
|
|
219
|
+
const fileName = level === 'local' ? SETTINGS_LOCAL_FILE_NAME : SETTINGS_FILE_NAME;
|
|
220
|
+
return path.join(dir, fileName);
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=levels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"levels.js","sourceRoot":"","sources":["../../src/config/levels.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Loader - Load settings from various sources
|
|
3
|
+
*
|
|
4
|
+
* Loads configuration files from all levels and namespaces.
|
|
5
|
+
* Each level loads both .gencode and .claude directories.
|
|
6
|
+
*/
|
|
7
|
+
import type { ConfigSource, ConfigLevelType } from './types.js';
|
|
8
|
+
import { type ResolvedLevel } from './levels.js';
|
|
9
|
+
/**
|
|
10
|
+
* Load all configuration sources in order
|
|
11
|
+
*
|
|
12
|
+
* Returns an array of ConfigSource in priority order (lowest first).
|
|
13
|
+
* Within each level:
|
|
14
|
+
* - .claude is loaded first (lower priority)
|
|
15
|
+
* - .gencode is loaded second (higher priority)
|
|
16
|
+
*
|
|
17
|
+
* This allows proper merging where:
|
|
18
|
+
* - Later sources override earlier ones
|
|
19
|
+
* - GenCode settings override Claude settings at the same level
|
|
20
|
+
*/
|
|
21
|
+
export declare function loadAllSources(cwd: string): Promise<ConfigSource[]>;
|
|
22
|
+
/**
|
|
23
|
+
* Load configuration sources grouped by level
|
|
24
|
+
*/
|
|
25
|
+
export declare function loadSourcesByLevel(cwd: string): Promise<Map<ConfigLevelType, ConfigSource[]>>;
|
|
26
|
+
/**
|
|
27
|
+
* Load only user-level settings
|
|
28
|
+
*/
|
|
29
|
+
export declare function loadUserSettings(cwd: string): Promise<ConfigSource[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Load only project-level settings
|
|
32
|
+
*/
|
|
33
|
+
export declare function loadProjectSettings(cwd: string): Promise<ConfigSource[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Load only managed settings
|
|
36
|
+
*/
|
|
37
|
+
export declare function loadManagedSettings(cwd: string): Promise<ConfigSource[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Get information about all configuration levels
|
|
40
|
+
*/
|
|
41
|
+
export declare function getConfigInfo(cwd: string): Promise<ResolvedLevel[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Check which config files exist
|
|
44
|
+
*/
|
|
45
|
+
export declare function getExistingConfigFiles(cwd: string): Promise<string[]>;
|
|
46
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAY,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAmB,KAAK,aAAa,EAAuB,MAAM,aAAa,CAAC;AAgCvF;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAezE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,YAAY,EAAE,CAAC,CAAC,CAoB/C;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAc3E;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAc9E;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAc9E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAEzE;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAa3E"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Loader - Load settings from various sources
|
|
3
|
+
*
|
|
4
|
+
* Loads configuration files from all levels and namespaces.
|
|
5
|
+
* Each level loads both .gencode and .claude directories.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'fs/promises';
|
|
8
|
+
import { getConfigLevels } from './levels.js';
|
|
9
|
+
/**
|
|
10
|
+
* Load a single JSON settings file
|
|
11
|
+
*/
|
|
12
|
+
async function loadJsonFile(filePath) {
|
|
13
|
+
try {
|
|
14
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
15
|
+
return JSON.parse(content);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Load settings from a specific path info
|
|
23
|
+
*/
|
|
24
|
+
async function loadFromPathInfo(pathInfo, levelType) {
|
|
25
|
+
const settings = await loadJsonFile(pathInfo.settingsPath);
|
|
26
|
+
if (!settings)
|
|
27
|
+
return null;
|
|
28
|
+
return {
|
|
29
|
+
level: levelType,
|
|
30
|
+
path: pathInfo.settingsPath,
|
|
31
|
+
namespace: pathInfo.namespace,
|
|
32
|
+
settings,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Load all configuration sources in order
|
|
37
|
+
*
|
|
38
|
+
* Returns an array of ConfigSource in priority order (lowest first).
|
|
39
|
+
* Within each level:
|
|
40
|
+
* - .claude is loaded first (lower priority)
|
|
41
|
+
* - .gencode is loaded second (higher priority)
|
|
42
|
+
*
|
|
43
|
+
* This allows proper merging where:
|
|
44
|
+
* - Later sources override earlier ones
|
|
45
|
+
* - GenCode settings override Claude settings at the same level
|
|
46
|
+
*/
|
|
47
|
+
export async function loadAllSources(cwd) {
|
|
48
|
+
const levels = await getConfigLevels(cwd);
|
|
49
|
+
const sources = [];
|
|
50
|
+
for (const level of levels) {
|
|
51
|
+
// Load from each path in the level (claude first, then gencode)
|
|
52
|
+
for (const pathInfo of level.paths) {
|
|
53
|
+
const source = await loadFromPathInfo(pathInfo, level.type);
|
|
54
|
+
if (source) {
|
|
55
|
+
sources.push(source);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return sources;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Load configuration sources grouped by level
|
|
63
|
+
*/
|
|
64
|
+
export async function loadSourcesByLevel(cwd) {
|
|
65
|
+
const levels = await getConfigLevels(cwd);
|
|
66
|
+
const sourcesByLevel = new Map();
|
|
67
|
+
for (const level of levels) {
|
|
68
|
+
const levelSources = [];
|
|
69
|
+
for (const pathInfo of level.paths) {
|
|
70
|
+
const source = await loadFromPathInfo(pathInfo, level.type);
|
|
71
|
+
if (source) {
|
|
72
|
+
levelSources.push(source);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (levelSources.length > 0) {
|
|
76
|
+
sourcesByLevel.set(level.type, levelSources);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return sourcesByLevel;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Load only user-level settings
|
|
83
|
+
*/
|
|
84
|
+
export async function loadUserSettings(cwd) {
|
|
85
|
+
const levels = await getConfigLevels(cwd);
|
|
86
|
+
const userLevel = levels.find((l) => l.type === 'user');
|
|
87
|
+
if (!userLevel)
|
|
88
|
+
return [];
|
|
89
|
+
const sources = [];
|
|
90
|
+
for (const pathInfo of userLevel.paths) {
|
|
91
|
+
const source = await loadFromPathInfo(pathInfo, 'user');
|
|
92
|
+
if (source) {
|
|
93
|
+
sources.push(source);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return sources;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Load only project-level settings
|
|
100
|
+
*/
|
|
101
|
+
export async function loadProjectSettings(cwd) {
|
|
102
|
+
const levels = await getConfigLevels(cwd);
|
|
103
|
+
const projectLevel = levels.find((l) => l.type === 'project');
|
|
104
|
+
if (!projectLevel)
|
|
105
|
+
return [];
|
|
106
|
+
const sources = [];
|
|
107
|
+
for (const pathInfo of projectLevel.paths) {
|
|
108
|
+
const source = await loadFromPathInfo(pathInfo, 'project');
|
|
109
|
+
if (source) {
|
|
110
|
+
sources.push(source);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return sources;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Load only managed settings
|
|
117
|
+
*/
|
|
118
|
+
export async function loadManagedSettings(cwd) {
|
|
119
|
+
const levels = await getConfigLevels(cwd);
|
|
120
|
+
const managedLevel = levels.find((l) => l.type === 'managed');
|
|
121
|
+
if (!managedLevel)
|
|
122
|
+
return [];
|
|
123
|
+
const sources = [];
|
|
124
|
+
for (const pathInfo of managedLevel.paths) {
|
|
125
|
+
const source = await loadFromPathInfo(pathInfo, 'managed');
|
|
126
|
+
if (source) {
|
|
127
|
+
sources.push(source);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return sources;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get information about all configuration levels
|
|
134
|
+
*/
|
|
135
|
+
export async function getConfigInfo(cwd) {
|
|
136
|
+
return getConfigLevels(cwd);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Check which config files exist
|
|
140
|
+
*/
|
|
141
|
+
export async function getExistingConfigFiles(cwd) {
|
|
142
|
+
const levels = await getConfigLevels(cwd);
|
|
143
|
+
const existingFiles = [];
|
|
144
|
+
for (const level of levels) {
|
|
145
|
+
for (const pathInfo of level.paths) {
|
|
146
|
+
if (pathInfo.exists) {
|
|
147
|
+
existingFiles.push(pathInfo.settingsPath);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return existingFiles;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
|
package/dist/config/manager.d.ts
CHANGED
|
@@ -1,31 +1,131 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Configuration Manager - Unified multi-level configuration (Claude Code compatible)
|
|
3
|
+
*
|
|
4
|
+
* Configuration hierarchy (merged in order, later overrides earlier):
|
|
5
|
+
* 1. User: ~/.claude/ + ~/.gencode/ (gencode wins within level)
|
|
6
|
+
* 2. Extra: GENCODE_CONFIG_DIRS directories
|
|
7
|
+
* 3. Project: .claude/ + .gencode/ (gencode wins within level)
|
|
8
|
+
* 4. Local: *.local.* files (gencode wins within level)
|
|
9
|
+
* 5. CLI: Command line arguments
|
|
10
|
+
* 6. Managed: System-wide enforced settings (cannot be overridden)
|
|
11
|
+
*
|
|
12
|
+
* Within each level, both .claude and .gencode directories are loaded and merged,
|
|
13
|
+
* with .gencode taking higher priority.
|
|
3
14
|
*/
|
|
4
|
-
import type { Settings, SettingsManagerOptions } from './types.js';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
15
|
+
import type { Settings, MergedConfig, ConfigSource, SettingsManagerOptions } from './types.js';
|
|
16
|
+
/**
|
|
17
|
+
* Configuration Manager
|
|
18
|
+
*
|
|
19
|
+
* Manages multi-level configuration loading, merging, and persistence.
|
|
20
|
+
* Compatible with both GenCode (.gencode/) and Claude Code (.claude/) directories.
|
|
21
|
+
*/
|
|
22
|
+
export declare class ConfigManager {
|
|
23
|
+
private cwd;
|
|
24
|
+
private projectRoot;
|
|
25
|
+
private mergedConfig;
|
|
26
|
+
private cliArgs;
|
|
27
|
+
constructor(options?: {
|
|
28
|
+
cwd?: string;
|
|
29
|
+
});
|
|
10
30
|
/**
|
|
11
|
-
*
|
|
31
|
+
* Load and merge all configuration sources
|
|
12
32
|
*/
|
|
13
|
-
|
|
33
|
+
load(): Promise<MergedConfig>;
|
|
14
34
|
/**
|
|
15
|
-
*
|
|
35
|
+
* Set CLI argument overrides
|
|
16
36
|
*/
|
|
17
|
-
|
|
37
|
+
setCliArgs(args: Partial<Settings>): void;
|
|
38
|
+
/**
|
|
39
|
+
* Get the current merged settings
|
|
40
|
+
*/
|
|
41
|
+
get(): Settings;
|
|
42
|
+
/**
|
|
43
|
+
* Get the full merged config with sources info
|
|
44
|
+
*/
|
|
45
|
+
getMergedConfig(): MergedConfig | null;
|
|
46
|
+
/**
|
|
47
|
+
* Get all loaded sources
|
|
48
|
+
*/
|
|
49
|
+
getSources(): ConfigSource[];
|
|
50
|
+
/**
|
|
51
|
+
* Get managed deny rules
|
|
52
|
+
*/
|
|
53
|
+
getManagedDeny(): string[];
|
|
54
|
+
/**
|
|
55
|
+
* Save settings to a specific level
|
|
56
|
+
*/
|
|
57
|
+
saveToLevel(updates: Partial<Settings>, level: 'user' | 'project' | 'local'): Promise<void>;
|
|
18
58
|
/**
|
|
19
|
-
* Save
|
|
59
|
+
* Save to global user settings (default)
|
|
20
60
|
*/
|
|
21
61
|
save(updates: Partial<Settings>): Promise<void>;
|
|
22
62
|
/**
|
|
23
|
-
*
|
|
63
|
+
* Add a permission rule
|
|
24
64
|
*/
|
|
25
|
-
|
|
65
|
+
addPermissionRule(pattern: string, type: 'allow' | 'deny' | 'ask', level?: 'user' | 'project' | 'local'): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Get existing config files
|
|
68
|
+
*/
|
|
69
|
+
getExistingFiles(): Promise<string[]>;
|
|
70
|
+
/**
|
|
71
|
+
* Get debug summary of configuration
|
|
72
|
+
*/
|
|
73
|
+
getDebugSummary(): string;
|
|
26
74
|
/**
|
|
27
|
-
* Get
|
|
75
|
+
* Get the project root directory
|
|
28
76
|
*/
|
|
77
|
+
getProjectRoot(): string;
|
|
78
|
+
/**
|
|
79
|
+
* Get the current working directory
|
|
80
|
+
*/
|
|
81
|
+
getCwd(): string;
|
|
82
|
+
/**
|
|
83
|
+
* Get the primary settings file path for a level
|
|
84
|
+
*/
|
|
85
|
+
getSettingsPath(level?: 'user' | 'project' | 'local'): string;
|
|
86
|
+
/**
|
|
87
|
+
* Get effective permissions (merged from all sources)
|
|
88
|
+
*/
|
|
89
|
+
getEffectivePermissions(): {
|
|
90
|
+
allow: string[];
|
|
91
|
+
ask: string[];
|
|
92
|
+
deny: string[];
|
|
93
|
+
managedDeny: string[];
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Check if a permission pattern is allowed
|
|
97
|
+
*/
|
|
98
|
+
isAllowed(pattern: string): boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Check if a permission pattern requires asking
|
|
101
|
+
*/
|
|
102
|
+
shouldAsk(pattern: string): boolean;
|
|
103
|
+
/**
|
|
104
|
+
* Simple pattern matching (supports * and :* wildcards)
|
|
105
|
+
*/
|
|
106
|
+
private matchPattern;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Legacy SettingsManager for backward compatibility
|
|
110
|
+
*
|
|
111
|
+
* @deprecated Use ConfigManager instead
|
|
112
|
+
*/
|
|
113
|
+
export declare class SettingsManager {
|
|
114
|
+
private configManager;
|
|
115
|
+
private globalDir;
|
|
116
|
+
private projectDir;
|
|
117
|
+
constructor(options?: SettingsManagerOptions & {
|
|
118
|
+
cwd?: string;
|
|
119
|
+
});
|
|
120
|
+
load(): Promise<Settings>;
|
|
121
|
+
save(updates: Partial<Settings>): Promise<void>;
|
|
122
|
+
saveToLevel(updates: Partial<Settings>, level: 'global' | 'project' | 'local'): Promise<void>;
|
|
123
|
+
addPermissionRule(pattern: string, type: 'allow' | 'deny', level?: 'global' | 'project' | 'local'): Promise<void>;
|
|
124
|
+
get(): Settings;
|
|
29
125
|
getPath(): string;
|
|
126
|
+
getProjectPath(): string;
|
|
127
|
+
getLocalPath(): string;
|
|
128
|
+
getCwd(): string;
|
|
129
|
+
getProjectDir(): string;
|
|
30
130
|
}
|
|
31
131
|
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAM/F;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,OAAO,CAAyB;gBAE5B,OAAO,GAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAO;IAI1C;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC;IAmBnC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI;IAIzC;;OAEG;IACH,GAAG,IAAI,QAAQ;IAOf;;OAEG;IACH,eAAe,IAAI,YAAY,GAAG,IAAI;IAItC;;OAEG;IACH,UAAU,IAAI,YAAY,EAAE;IAI5B;;OAEG;IACH,cAAc,IAAI,MAAM,EAAE;IAI1B;;OAEG;IACG,WAAW,CACf,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,EAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAClC,OAAO,CAAC,IAAI,CAAC;IA+BhB;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD;;OAEG;IACG,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,EAC9B,KAAK,GAAE,MAAM,GAAG,SAAS,GAAG,OAAmB,GAC9C,OAAO,CAAC,IAAI,CAAC;IAShB;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI3C;;OAEG;IACH,eAAe,IAAI,MAAM;IAOzB;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,MAAM,IAAI,MAAM;IAIhB;;OAEG;IACH,eAAe,CAAC,KAAK,GAAE,MAAM,GAAG,SAAS,GAAG,OAAgB,GAAG,MAAM;IAKrE;;OAEG;IACH,uBAAuB,IAAI;QACzB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,GAAG,EAAE,MAAM,EAAE,CAAC;QACd,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB;IAYD;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAiBnC;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IA2BnC;;OAEG;IACH,OAAO,CAAC,YAAY;CAmBrB;AAMD;;;;GAIG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,GAAE,sBAAsB,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAO;IAS7D,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC;IAKzB,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,WAAW,CACf,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,EAC1B,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,GACpC,OAAO,CAAC,IAAI,CAAC;IAKV,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,OAAO,GAAG,MAAM,EACtB,KAAK,GAAE,QAAQ,GAAG,SAAS,GAAG,OAAmB,GAChD,OAAO,CAAC,IAAI,CAAC;IAKhB,GAAG,IAAI,QAAQ;IAIf,OAAO,IAAI,MAAM;IAIjB,cAAc,IAAI,MAAM;IAIxB,YAAY,IAAI,MAAM;IAItB,MAAM,IAAI,MAAM;IAIhB,aAAa,IAAI,MAAM;CAGxB"}
|