agentinit 1.22.1 → 1.24.0
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/CHANGELOG.md +28 -0
- package/README.md +62 -0
- package/dist/agents/CodexCliAgent.js +1 -1
- package/dist/agents/CodexCliAgent.js.map +1 -1
- package/dist/cli.js +1747 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/agent.d.ts +3 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +391 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +55 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/core/agentSettings/adapters/claude.d.ts +3 -0
- package/dist/core/agentSettings/adapters/claude.d.ts.map +1 -0
- package/dist/core/agentSettings/adapters/claude.js +285 -0
- package/dist/core/agentSettings/adapters/claude.js.map +1 -0
- package/dist/core/agentSettings/adapters/codex.d.ts +3 -0
- package/dist/core/agentSettings/adapters/codex.d.ts.map +1 -0
- package/dist/core/agentSettings/adapters/codex.js +121 -0
- package/dist/core/agentSettings/adapters/codex.js.map +1 -0
- package/dist/core/agentSettings/adapters/opencode.d.ts +3 -0
- package/dist/core/agentSettings/adapters/opencode.d.ts.map +1 -0
- package/dist/core/agentSettings/adapters/opencode.js +134 -0
- package/dist/core/agentSettings/adapters/opencode.js.map +1 -0
- package/dist/core/agentSettings/registry.d.ts +6 -0
- package/dist/core/agentSettings/registry.d.ts.map +1 -0
- package/dist/core/agentSettings/registry.js +24 -0
- package/dist/core/agentSettings/registry.js.map +1 -0
- package/dist/core/agentSettings/settingsManager.d.ts +14 -0
- package/dist/core/agentSettings/settingsManager.d.ts.map +1 -0
- package/dist/core/agentSettings/settingsManager.js +593 -0
- package/dist/core/agentSettings/settingsManager.js.map +1 -0
- package/dist/core/agentSettings/types.d.ts +113 -0
- package/dist/core/agentSettings/types.d.ts.map +1 -0
- package/dist/core/agentSettings/types.js +2 -0
- package/dist/core/agentSettings/types.js.map +1 -0
- package/dist/core/agentSettings/valueParser.d.ts +3 -0
- package/dist/core/agentSettings/valueParser.d.ts.map +1 -0
- package/dist/core/agentSettings/valueParser.js +80 -0
- package/dist/core/agentSettings/valueParser.js.map +1 -0
- package/dist/core/userConfig.d.ts +5 -0
- package/dist/core/userConfig.d.ts.map +1 -1
- package/dist/core/userConfig.js +33 -0
- package/dist/core/userConfig.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AgentApiKeyAction, AgentApiKeyOptions, AgentApiKeyResult, AgentHookAddOptions, AgentHookMatcher, AgentHookRemoveOptions, AgentHookWriteResult, AgentSettingReadOptions, AgentSettingsSchema, AgentSettingSetOptions, AgentSettingsWriteResult } from './types.js';
|
|
2
|
+
export declare class AgentSettingsManager {
|
|
3
|
+
getSupportedAgents(): string[];
|
|
4
|
+
getSchema(agent: string): AgentSettingsSchema;
|
|
5
|
+
get(agent: string, key?: string, options?: AgentSettingReadOptions): Promise<unknown>;
|
|
6
|
+
set(agent: string, key: string, rawValue: string, options?: AgentSettingSetOptions): Promise<AgentSettingsWriteResult>;
|
|
7
|
+
unset(agent: string, key: string, options?: AgentSettingSetOptions): Promise<AgentSettingsWriteResult>;
|
|
8
|
+
listHooks(agent: string, event?: string, options?: AgentSettingReadOptions): Promise<Record<string, AgentHookMatcher[]> | AgentHookMatcher[]>;
|
|
9
|
+
addHook(agent: string, event: string, command: string, options?: AgentHookAddOptions): Promise<AgentHookWriteResult>;
|
|
10
|
+
removeHook(agent: string, event: string, commandOrName: string, options?: AgentHookRemoveOptions): Promise<AgentHookWriteResult>;
|
|
11
|
+
getApiKeyStatus(agent: string, apiKey: string, options?: AgentApiKeyOptions): Promise<AgentApiKeyResult>;
|
|
12
|
+
updateApiKeyTrust(agent: string, action: AgentApiKeyAction, apiKey: string, options?: AgentApiKeyOptions): Promise<AgentApiKeyResult>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=settingsManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settingsManager.d.ts","sourceRoot":"","sources":["../../../src/core/agentSettings/settingsManager.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EAEjB,mBAAmB,EAInB,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EAEnB,sBAAsB,EACtB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAiWpB,qBAAa,oBAAoB;IAC/B,kBAAkB,IAAI,MAAM,EAAE;IAI9B,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB;IAcvC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,OAAO,CAAC;IA4CzF,GAAG,CACP,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,wBAAwB,CAAC;IAkC9B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAgC1G,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC;IAoCjJ,OAAO,CACX,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,oBAAoB,CAAC;IA4C1B,UAAU,CACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,oBAAoB,CAAC;IAmD1B,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAuB5G,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA4ChJ"}
|
|
@@ -0,0 +1,593 @@
|
|
|
1
|
+
import * as TOML from '@iarna/toml';
|
|
2
|
+
import { parse as parseJsonc } from 'jsonc-parser';
|
|
3
|
+
import { readFileIfExists, writeFile } from '../../utils/fs.js';
|
|
4
|
+
import { getEffectiveAgentSettingsDefaultScopeSync } from '../userConfig.js';
|
|
5
|
+
import { parseAgentSettingValue } from './valueParser.js';
|
|
6
|
+
import { getAgentSettingDefinition, getAgentSettingsAdapter, getAgentSettingsAdapters, toSchemaEntry } from './registry.js';
|
|
7
|
+
const HOOK_EVENT_ALIASES = {
|
|
8
|
+
'pre-tool-use': 'PreToolUse',
|
|
9
|
+
'before-tool-use': 'PreToolUse',
|
|
10
|
+
'post-tool-use': 'PostToolUse',
|
|
11
|
+
'after-tool-use': 'PostToolUse',
|
|
12
|
+
'post-tool-use-failure': 'PostToolUseFailure',
|
|
13
|
+
notification: 'Notification',
|
|
14
|
+
'permission-request': 'PermissionRequest',
|
|
15
|
+
stop: 'Stop',
|
|
16
|
+
'session-start': 'SessionStart',
|
|
17
|
+
'session-end': 'SessionEnd',
|
|
18
|
+
'user-prompt-submit': 'UserPromptSubmit',
|
|
19
|
+
};
|
|
20
|
+
const HOOK_EVENTS = new Set(Object.values(HOOK_EVENT_ALIASES));
|
|
21
|
+
const CLAUDE_API_KEY_RESPONSES_DEFINITION = {
|
|
22
|
+
agent: 'claude',
|
|
23
|
+
key: 'customApiKeyResponses',
|
|
24
|
+
nativePath: ['customApiKeyResponses'],
|
|
25
|
+
title: 'Custom API key responses',
|
|
26
|
+
description: 'Remembered custom API key trust responses.',
|
|
27
|
+
valueType: 'object',
|
|
28
|
+
scopes: ['global'],
|
|
29
|
+
defaultScope: 'global',
|
|
30
|
+
category: 'auth',
|
|
31
|
+
risk: 'security-sensitive',
|
|
32
|
+
store: 'globalConfig',
|
|
33
|
+
};
|
|
34
|
+
function assertObject(value, path) {
|
|
35
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
36
|
+
throw new Error(`${path} contains JSON that is not an object.`);
|
|
37
|
+
}
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
function getNestedValue(config, path) {
|
|
41
|
+
let current = config;
|
|
42
|
+
for (const segment of path) {
|
|
43
|
+
if (!current || typeof current !== 'object' || Array.isArray(current)) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
current = current[segment];
|
|
47
|
+
}
|
|
48
|
+
return current;
|
|
49
|
+
}
|
|
50
|
+
function setNestedValue(config, path, value) {
|
|
51
|
+
let current = config;
|
|
52
|
+
for (const segment of path.slice(0, -1)) {
|
|
53
|
+
const next = current[segment];
|
|
54
|
+
if (!next || typeof next !== 'object' || Array.isArray(next)) {
|
|
55
|
+
current[segment] = {};
|
|
56
|
+
}
|
|
57
|
+
current = current[segment];
|
|
58
|
+
}
|
|
59
|
+
current[path[path.length - 1]] = value;
|
|
60
|
+
}
|
|
61
|
+
function normalizeHookEvent(event) {
|
|
62
|
+
const exact = event;
|
|
63
|
+
if (HOOK_EVENTS.has(exact)) {
|
|
64
|
+
return exact;
|
|
65
|
+
}
|
|
66
|
+
const normalized = event.trim().replace(/_/g, '-').toLowerCase();
|
|
67
|
+
const mapped = HOOK_EVENT_ALIASES[normalized];
|
|
68
|
+
if (mapped) {
|
|
69
|
+
return mapped;
|
|
70
|
+
}
|
|
71
|
+
throw new Error(`Unsupported hook event: ${event}. Supported: ${[...HOOK_EVENTS].join(', ')}.`);
|
|
72
|
+
}
|
|
73
|
+
function assertHookMatchers(value) {
|
|
74
|
+
if (value === undefined) {
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
if (!Array.isArray(value)) {
|
|
78
|
+
throw new Error('Existing hooks value is not an array.');
|
|
79
|
+
}
|
|
80
|
+
return value.map((entry) => {
|
|
81
|
+
if (!entry || typeof entry !== 'object' || Array.isArray(entry)) {
|
|
82
|
+
throw new Error('Existing hook matcher is not an object.');
|
|
83
|
+
}
|
|
84
|
+
const entryObject = entry;
|
|
85
|
+
const matcher = entryObject.matcher;
|
|
86
|
+
const hooks = entryObject.hooks;
|
|
87
|
+
if (matcher !== undefined && typeof matcher !== 'string') {
|
|
88
|
+
throw new Error('Existing hook matcher must be a string.');
|
|
89
|
+
}
|
|
90
|
+
if (!Array.isArray(hooks)) {
|
|
91
|
+
throw new Error('Existing hook commands must be an array.');
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
...entryObject,
|
|
95
|
+
...(matcher !== undefined ? { matcher } : {}),
|
|
96
|
+
hooks: hooks.map((hook) => {
|
|
97
|
+
if (!hook || typeof hook !== 'object' || Array.isArray(hook)) {
|
|
98
|
+
throw new Error('Existing hook command is not an object.');
|
|
99
|
+
}
|
|
100
|
+
const hookObject = hook;
|
|
101
|
+
const type = hookObject.type;
|
|
102
|
+
const command = hookObject.command;
|
|
103
|
+
const name = hookObject.name;
|
|
104
|
+
if (type !== undefined && typeof type !== 'string') {
|
|
105
|
+
throw new Error('Existing hook command type must be a string when present.');
|
|
106
|
+
}
|
|
107
|
+
if (command !== undefined && typeof command !== 'string') {
|
|
108
|
+
throw new Error('Existing hook command must be a string when present.');
|
|
109
|
+
}
|
|
110
|
+
if (name !== undefined && typeof name !== 'string') {
|
|
111
|
+
throw new Error('Existing hook name must be a string when present.');
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
...hookObject,
|
|
115
|
+
...(typeof type === 'string' ? { type } : {}),
|
|
116
|
+
...(typeof command === 'string' ? { command } : {}),
|
|
117
|
+
...(typeof name === 'string' ? { name } : {}),
|
|
118
|
+
};
|
|
119
|
+
}),
|
|
120
|
+
};
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
function getHookMatchers(config, event) {
|
|
124
|
+
const hooks = getNestedValue(config, ['hooks']);
|
|
125
|
+
if (hooks === undefined) {
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
if (!hooks || typeof hooks !== 'object' || Array.isArray(hooks)) {
|
|
129
|
+
throw new Error('Existing hooks value is not an object.');
|
|
130
|
+
}
|
|
131
|
+
return assertHookMatchers(hooks[event]);
|
|
132
|
+
}
|
|
133
|
+
function setHookMatchers(config, event, matchers) {
|
|
134
|
+
const hooks = getNestedValue(config, ['hooks']);
|
|
135
|
+
if (hooks !== undefined && (!hooks || typeof hooks !== 'object' || Array.isArray(hooks))) {
|
|
136
|
+
throw new Error('Existing hooks value is not an object.');
|
|
137
|
+
}
|
|
138
|
+
const hooksObject = hooks;
|
|
139
|
+
const nextHooks = hooksObject ?? {};
|
|
140
|
+
if (matchers.length === 0) {
|
|
141
|
+
delete nextHooks[event];
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
nextHooks[event] = matchers;
|
|
145
|
+
}
|
|
146
|
+
if (Object.keys(nextHooks).length === 0) {
|
|
147
|
+
deleteNestedValue(config, ['hooks']);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
setNestedValue(config, ['hooks'], nextHooks);
|
|
151
|
+
}
|
|
152
|
+
function buildHookCommand(command, name) {
|
|
153
|
+
const trimmed = command.trim();
|
|
154
|
+
if (!trimmed) {
|
|
155
|
+
throw new Error('Hook command cannot be empty.');
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
type: 'command',
|
|
159
|
+
command: trimmed,
|
|
160
|
+
...(name ? { name } : {}),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
function normalizeApiKeyForConfig(apiKey) {
|
|
164
|
+
const trimmed = apiKey.trim();
|
|
165
|
+
if (!trimmed) {
|
|
166
|
+
throw new Error('API key cannot be empty.');
|
|
167
|
+
}
|
|
168
|
+
return trimmed.slice(-20);
|
|
169
|
+
}
|
|
170
|
+
function getApiKeyResponses(config) {
|
|
171
|
+
const current = config.customApiKeyResponses;
|
|
172
|
+
if (current !== undefined && (!current || typeof current !== 'object' || Array.isArray(current))) {
|
|
173
|
+
throw new Error('Existing customApiKeyResponses value is not an object.');
|
|
174
|
+
}
|
|
175
|
+
const responses = (current ?? {});
|
|
176
|
+
const approved = responses.approved ?? [];
|
|
177
|
+
const rejected = responses.rejected ?? [];
|
|
178
|
+
if (!Array.isArray(approved) || !approved.every(value => typeof value === 'string')) {
|
|
179
|
+
throw new Error('Existing customApiKeyResponses.approved value must be an array of strings.');
|
|
180
|
+
}
|
|
181
|
+
if (!Array.isArray(rejected) || !rejected.every(value => typeof value === 'string')) {
|
|
182
|
+
throw new Error('Existing customApiKeyResponses.rejected value must be an array of strings.');
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
approved,
|
|
186
|
+
rejected,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
function getApiKeyStatusFromResponses(responses, fingerprint) {
|
|
190
|
+
if (responses.approved.includes(fingerprint)) {
|
|
191
|
+
return 'approved';
|
|
192
|
+
}
|
|
193
|
+
if (responses.rejected.includes(fingerprint)) {
|
|
194
|
+
return 'rejected';
|
|
195
|
+
}
|
|
196
|
+
return 'unknown';
|
|
197
|
+
}
|
|
198
|
+
function setApiKeyResponses(config, approved, rejected) {
|
|
199
|
+
config.customApiKeyResponses = {
|
|
200
|
+
...(config.customApiKeyResponses && typeof config.customApiKeyResponses === 'object' && !Array.isArray(config.customApiKeyResponses)
|
|
201
|
+
? config.customApiKeyResponses
|
|
202
|
+
: {}),
|
|
203
|
+
approved,
|
|
204
|
+
rejected,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
function deleteNestedValue(config, path) {
|
|
208
|
+
const parents = [];
|
|
209
|
+
let current = config;
|
|
210
|
+
for (const segment of path.slice(0, -1)) {
|
|
211
|
+
if (!current || typeof current !== 'object' || Array.isArray(current)) {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
parents.push({ object: current, key: segment });
|
|
215
|
+
current = current[segment];
|
|
216
|
+
}
|
|
217
|
+
if (!current || typeof current !== 'object' || Array.isArray(current)) {
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
const finalKey = path[path.length - 1];
|
|
221
|
+
if (!(finalKey in current)) {
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
delete current[finalKey];
|
|
225
|
+
for (let i = parents.length - 1; i >= 0; i--) {
|
|
226
|
+
const { object, key } = parents[i];
|
|
227
|
+
const value = object[key];
|
|
228
|
+
if (value && typeof value === 'object' && !Array.isArray(value) && Object.keys(value).length === 0) {
|
|
229
|
+
delete object[key];
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
function resolveProjectPath(projectPath) {
|
|
238
|
+
return projectPath ?? process.cwd();
|
|
239
|
+
}
|
|
240
|
+
function resolveScope(definition, scope) {
|
|
241
|
+
const defaultScope = getEffectiveAgentSettingsDefaultScopeSync();
|
|
242
|
+
const resolvedScope = scope ?? (definition.store === 'globalConfig' && !definition.scopes.includes(defaultScope) ? definition.defaultScope : defaultScope);
|
|
243
|
+
if (!definition.scopes.includes(resolvedScope)) {
|
|
244
|
+
throw new Error(`"${definition.key}" does not support ${resolvedScope} scope. Supported scopes: ${definition.scopes.join(', ')}.`);
|
|
245
|
+
}
|
|
246
|
+
return resolvedScope;
|
|
247
|
+
}
|
|
248
|
+
function getSupportedSettingScopes(adapter) {
|
|
249
|
+
return [...new Set(adapter.definitions.flatMap(definition => definition.scopes))];
|
|
250
|
+
}
|
|
251
|
+
function resolveFullReadScope(adapter, scope) {
|
|
252
|
+
const resolvedScope = scope ?? getEffectiveAgentSettingsDefaultScopeSync();
|
|
253
|
+
const supportedScopes = getSupportedSettingScopes(adapter);
|
|
254
|
+
if (!supportedScopes.includes(resolvedScope)) {
|
|
255
|
+
throw new Error(`Agent ${adapter.agent} settings do not support ${resolvedScope} scope. Supported scopes: ${supportedScopes.join(', ')}.`);
|
|
256
|
+
}
|
|
257
|
+
return resolvedScope;
|
|
258
|
+
}
|
|
259
|
+
async function readConfigObject(adapter, path) {
|
|
260
|
+
const content = await readFileIfExists(path);
|
|
261
|
+
if (!content) {
|
|
262
|
+
return {};
|
|
263
|
+
}
|
|
264
|
+
if (adapter.format === 'toml') {
|
|
265
|
+
try {
|
|
266
|
+
return assertObject(TOML.parse(content), path);
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
if (error instanceof SyntaxError || error instanceof Error) {
|
|
270
|
+
throw new Error(`${path} contains invalid TOML.`);
|
|
271
|
+
}
|
|
272
|
+
throw error;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
try {
|
|
276
|
+
const errors = [];
|
|
277
|
+
const value = adapter.format === 'jsonc'
|
|
278
|
+
? parseJsonc(content, errors, { allowTrailingComma: true })
|
|
279
|
+
: JSON.parse(content);
|
|
280
|
+
if (errors.length > 0) {
|
|
281
|
+
throw new SyntaxError('Invalid JSONC');
|
|
282
|
+
}
|
|
283
|
+
return assertObject(value, path);
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
if (error instanceof SyntaxError) {
|
|
287
|
+
throw new Error(`${path} contains invalid ${adapter.format === 'jsonc' ? 'JSONC' : 'JSON'}.`);
|
|
288
|
+
}
|
|
289
|
+
throw error;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
function stringifyConfigObject(adapter, config) {
|
|
293
|
+
if (adapter.format === 'toml') {
|
|
294
|
+
return TOML.stringify(config);
|
|
295
|
+
}
|
|
296
|
+
return `${JSON.stringify(config, null, 2)}\n`;
|
|
297
|
+
}
|
|
298
|
+
async function writeConfigObject(adapter, path, config) {
|
|
299
|
+
await writeFile(path, stringifyConfigObject(adapter, config));
|
|
300
|
+
}
|
|
301
|
+
function assertHookEventSupported(adapter, event) {
|
|
302
|
+
if (adapter.hookEvents && !adapter.hookEvents.includes(event)) {
|
|
303
|
+
throw new Error(`Agent ${adapter.agent} does not support ${event} hooks. Supported: ${adapter.hookEvents.join(', ')}.`);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
function resolveHookScope(adapter, scope) {
|
|
307
|
+
const resolvedScope = scope ?? getEffectiveAgentSettingsDefaultScopeSync();
|
|
308
|
+
const supportedScopes = adapter.hookScopes ?? ['global', 'project', 'local'];
|
|
309
|
+
if (!supportedScopes.includes(resolvedScope)) {
|
|
310
|
+
throw new Error(`Agent ${adapter.agent} hooks do not support ${resolvedScope} scope. Supported scopes: ${supportedScopes.join(', ')}.`);
|
|
311
|
+
}
|
|
312
|
+
return resolvedScope;
|
|
313
|
+
}
|
|
314
|
+
export class AgentSettingsManager {
|
|
315
|
+
getSupportedAgents() {
|
|
316
|
+
return getAgentSettingsAdapters().map(adapter => adapter.agent);
|
|
317
|
+
}
|
|
318
|
+
getSchema(agent) {
|
|
319
|
+
const adapter = getAgentSettingsAdapter(agent);
|
|
320
|
+
if (!adapter) {
|
|
321
|
+
throw new Error(`Unsupported agent settings adapter: ${agent}. Supported: ${this.getSupportedAgents().join(', ')}`);
|
|
322
|
+
}
|
|
323
|
+
return {
|
|
324
|
+
agent: adapter.agent,
|
|
325
|
+
displayName: adapter.displayName,
|
|
326
|
+
effectiveDefaultScope: getEffectiveAgentSettingsDefaultScopeSync(),
|
|
327
|
+
settings: adapter.definitions.map(toSchemaEntry),
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
async get(agent, key, options = {}) {
|
|
331
|
+
const adapter = getAgentSettingsAdapter(agent);
|
|
332
|
+
if (!adapter) {
|
|
333
|
+
throw new Error(`Unsupported agent settings adapter: ${agent}. Supported: ${this.getSupportedAgents().join(', ')}`);
|
|
334
|
+
}
|
|
335
|
+
if (!key) {
|
|
336
|
+
const scope = resolveFullReadScope(adapter, options.scope);
|
|
337
|
+
const path = adapter.getSettingsPath(scope, resolveProjectPath(options.projectPath));
|
|
338
|
+
const config = await readConfigObject(adapter, path);
|
|
339
|
+
if (scope !== 'global') {
|
|
340
|
+
return config;
|
|
341
|
+
}
|
|
342
|
+
const globalConfigDefinitions = adapter.definitions.filter(definition => definition.store === 'globalConfig' && definition.scopes.includes('global'));
|
|
343
|
+
if (globalConfigDefinitions.length === 0) {
|
|
344
|
+
return config;
|
|
345
|
+
}
|
|
346
|
+
const globalConfigPath = adapter.getSettingsPath('global', resolveProjectPath(options.projectPath), globalConfigDefinitions[0]);
|
|
347
|
+
const globalConfig = await readConfigObject(adapter, globalConfigPath);
|
|
348
|
+
const result = { ...config };
|
|
349
|
+
for (const definition of globalConfigDefinitions) {
|
|
350
|
+
const value = getNestedValue(globalConfig, definition.nativePath);
|
|
351
|
+
if (value !== undefined) {
|
|
352
|
+
setNestedValue(result, definition.nativePath, value);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
return result;
|
|
356
|
+
}
|
|
357
|
+
const definition = getAgentSettingDefinition(agent, key);
|
|
358
|
+
if (!definition) {
|
|
359
|
+
throw new Error(`Unknown ${agent} setting: ${key}.`);
|
|
360
|
+
}
|
|
361
|
+
const scope = resolveScope(definition, options.scope);
|
|
362
|
+
const path = adapter.getSettingsPath(scope, resolveProjectPath(options.projectPath), definition);
|
|
363
|
+
const config = await readConfigObject(adapter, path);
|
|
364
|
+
return getNestedValue(config, definition.nativePath);
|
|
365
|
+
}
|
|
366
|
+
async set(agent, key, rawValue, options = {}) {
|
|
367
|
+
const adapter = getAgentSettingsAdapter(agent);
|
|
368
|
+
if (!adapter) {
|
|
369
|
+
throw new Error(`Unsupported agent settings adapter: ${agent}. Supported: ${this.getSupportedAgents().join(', ')}`);
|
|
370
|
+
}
|
|
371
|
+
const definition = getAgentSettingDefinition(agent, key);
|
|
372
|
+
if (!definition) {
|
|
373
|
+
throw new Error(`Unknown ${agent} setting: ${key}.`);
|
|
374
|
+
}
|
|
375
|
+
const scope = resolveScope(definition, options.scope);
|
|
376
|
+
const path = adapter.getSettingsPath(scope, resolveProjectPath(options.projectPath), definition);
|
|
377
|
+
const config = await readConfigObject(adapter, path);
|
|
378
|
+
const previousValue = getNestedValue(config, definition.nativePath);
|
|
379
|
+
const value = parseAgentSettingValue(definition, rawValue, options.parseJson);
|
|
380
|
+
setNestedValue(config, definition.nativePath, value);
|
|
381
|
+
if (!options.dryRun) {
|
|
382
|
+
await writeConfigObject(adapter, path, config);
|
|
383
|
+
}
|
|
384
|
+
return {
|
|
385
|
+
agent,
|
|
386
|
+
key,
|
|
387
|
+
scope,
|
|
388
|
+
path,
|
|
389
|
+
value,
|
|
390
|
+
previousValue,
|
|
391
|
+
dryRun: Boolean(options.dryRun),
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
async unset(agent, key, options = {}) {
|
|
395
|
+
const adapter = getAgentSettingsAdapter(agent);
|
|
396
|
+
if (!adapter) {
|
|
397
|
+
throw new Error(`Unsupported agent settings adapter: ${agent}. Supported: ${this.getSupportedAgents().join(', ')}`);
|
|
398
|
+
}
|
|
399
|
+
const definition = getAgentSettingDefinition(agent, key);
|
|
400
|
+
if (!definition) {
|
|
401
|
+
throw new Error(`Unknown ${agent} setting: ${key}.`);
|
|
402
|
+
}
|
|
403
|
+
const scope = resolveScope(definition, options.scope);
|
|
404
|
+
const path = adapter.getSettingsPath(scope, resolveProjectPath(options.projectPath), definition);
|
|
405
|
+
const config = await readConfigObject(adapter, path);
|
|
406
|
+
const previousValue = getNestedValue(config, definition.nativePath);
|
|
407
|
+
deleteNestedValue(config, definition.nativePath);
|
|
408
|
+
if (!options.dryRun) {
|
|
409
|
+
await writeConfigObject(adapter, path, config);
|
|
410
|
+
}
|
|
411
|
+
return {
|
|
412
|
+
agent,
|
|
413
|
+
key,
|
|
414
|
+
scope,
|
|
415
|
+
path,
|
|
416
|
+
previousValue,
|
|
417
|
+
dryRun: Boolean(options.dryRun),
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
async listHooks(agent, event, options = {}) {
|
|
421
|
+
const adapter = getAgentSettingsAdapter(agent);
|
|
422
|
+
if (!adapter) {
|
|
423
|
+
throw new Error(`Unsupported agent settings adapter: ${agent}. Supported: ${this.getSupportedAgents().join(', ')}`);
|
|
424
|
+
}
|
|
425
|
+
if (!adapter.hookEvents) {
|
|
426
|
+
throw new Error(`Agent ${agent} does not support hook management.`);
|
|
427
|
+
}
|
|
428
|
+
const hookEvent = event ? normalizeHookEvent(event) : undefined;
|
|
429
|
+
if (hookEvent) {
|
|
430
|
+
assertHookEventSupported(adapter, hookEvent);
|
|
431
|
+
}
|
|
432
|
+
const scope = resolveHookScope(adapter, options.scope);
|
|
433
|
+
const path = adapter.getSettingsPath(scope, resolveProjectPath(options.projectPath));
|
|
434
|
+
const config = await readConfigObject(adapter, path);
|
|
435
|
+
if (hookEvent) {
|
|
436
|
+
return getHookMatchers(config, hookEvent);
|
|
437
|
+
}
|
|
438
|
+
const hooks = getNestedValue(config, ['hooks']);
|
|
439
|
+
if (hooks === undefined) {
|
|
440
|
+
return {};
|
|
441
|
+
}
|
|
442
|
+
if (!hooks || typeof hooks !== 'object' || Array.isArray(hooks)) {
|
|
443
|
+
throw new Error('Existing hooks value is not an object.');
|
|
444
|
+
}
|
|
445
|
+
const result = {};
|
|
446
|
+
for (const [hookEvent, value] of Object.entries(hooks)) {
|
|
447
|
+
result[hookEvent] = assertHookMatchers(value);
|
|
448
|
+
}
|
|
449
|
+
return result;
|
|
450
|
+
}
|
|
451
|
+
async addHook(agent, event, command, options = {}) {
|
|
452
|
+
const adapter = getAgentSettingsAdapter(agent);
|
|
453
|
+
if (!adapter) {
|
|
454
|
+
throw new Error(`Unsupported agent settings adapter: ${agent}. Supported: ${this.getSupportedAgents().join(', ')}`);
|
|
455
|
+
}
|
|
456
|
+
if (!adapter.hookEvents) {
|
|
457
|
+
throw new Error(`Agent ${agent} does not support hook management.`);
|
|
458
|
+
}
|
|
459
|
+
const hookEvent = normalizeHookEvent(event);
|
|
460
|
+
assertHookEventSupported(adapter, hookEvent);
|
|
461
|
+
const scope = resolveHookScope(adapter, options.scope);
|
|
462
|
+
const path = adapter.getSettingsPath(scope, resolveProjectPath(options.projectPath));
|
|
463
|
+
const config = await readConfigObject(adapter, path);
|
|
464
|
+
const hook = buildHookCommand(command, options.name);
|
|
465
|
+
const matchers = getHookMatchers(config, hookEvent);
|
|
466
|
+
const matcher = options.matcher ?? '*';
|
|
467
|
+
const existingMatcher = matchers.find(entry => (entry.matcher ?? '*') === matcher);
|
|
468
|
+
if (existingMatcher) {
|
|
469
|
+
existingMatcher.hooks.push(hook);
|
|
470
|
+
}
|
|
471
|
+
else {
|
|
472
|
+
matchers.push({
|
|
473
|
+
...(matcher === '*' ? {} : { matcher }),
|
|
474
|
+
hooks: [hook],
|
|
475
|
+
});
|
|
476
|
+
}
|
|
477
|
+
setHookMatchers(config, hookEvent, matchers);
|
|
478
|
+
if (!options.dryRun) {
|
|
479
|
+
await writeConfigObject(adapter, path, config);
|
|
480
|
+
}
|
|
481
|
+
return {
|
|
482
|
+
agent,
|
|
483
|
+
event: hookEvent,
|
|
484
|
+
scope,
|
|
485
|
+
path,
|
|
486
|
+
hook,
|
|
487
|
+
dryRun: Boolean(options.dryRun),
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
async removeHook(agent, event, commandOrName, options = {}) {
|
|
491
|
+
const adapter = getAgentSettingsAdapter(agent);
|
|
492
|
+
if (!adapter) {
|
|
493
|
+
throw new Error(`Unsupported agent settings adapter: ${agent}. Supported: ${this.getSupportedAgents().join(', ')}`);
|
|
494
|
+
}
|
|
495
|
+
if (!adapter.hookEvents) {
|
|
496
|
+
throw new Error(`Agent ${agent} does not support hook management.`);
|
|
497
|
+
}
|
|
498
|
+
const hookEvent = normalizeHookEvent(event);
|
|
499
|
+
assertHookEventSupported(adapter, hookEvent);
|
|
500
|
+
const scope = resolveHookScope(adapter, options.scope);
|
|
501
|
+
const path = adapter.getSettingsPath(scope, resolveProjectPath(options.projectPath));
|
|
502
|
+
const config = await readConfigObject(adapter, path);
|
|
503
|
+
const matchers = getHookMatchers(config, hookEvent);
|
|
504
|
+
let removed = 0;
|
|
505
|
+
const nextMatchers = matchers
|
|
506
|
+
.map((entry) => {
|
|
507
|
+
if (options.matcher !== undefined && (entry.matcher ?? '*') !== options.matcher) {
|
|
508
|
+
return entry;
|
|
509
|
+
}
|
|
510
|
+
const hooks = entry.hooks.filter(hook => {
|
|
511
|
+
const matches = hook.name === commandOrName || hook.command === commandOrName;
|
|
512
|
+
if (matches) {
|
|
513
|
+
removed++;
|
|
514
|
+
}
|
|
515
|
+
return !matches;
|
|
516
|
+
});
|
|
517
|
+
return { ...entry, hooks };
|
|
518
|
+
})
|
|
519
|
+
.filter(entry => entry.hooks.length > 0);
|
|
520
|
+
setHookMatchers(config, hookEvent, nextMatchers);
|
|
521
|
+
if (!options.dryRun) {
|
|
522
|
+
await writeConfigObject(adapter, path, config);
|
|
523
|
+
}
|
|
524
|
+
return {
|
|
525
|
+
agent,
|
|
526
|
+
event: hookEvent,
|
|
527
|
+
scope,
|
|
528
|
+
path,
|
|
529
|
+
removed,
|
|
530
|
+
dryRun: Boolean(options.dryRun),
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
async getApiKeyStatus(agent, apiKey, options = {}) {
|
|
534
|
+
const adapter = getAgentSettingsAdapter(agent);
|
|
535
|
+
if (!adapter) {
|
|
536
|
+
throw new Error(`Unsupported agent settings adapter: ${agent}. Supported: ${this.getSupportedAgents().join(', ')}`);
|
|
537
|
+
}
|
|
538
|
+
if (agent !== 'claude') {
|
|
539
|
+
throw new Error(`Agent ${agent} does not support API key trust management.`);
|
|
540
|
+
}
|
|
541
|
+
const path = adapter.getSettingsPath('global', resolveProjectPath(options.projectPath), CLAUDE_API_KEY_RESPONSES_DEFINITION);
|
|
542
|
+
const config = await readConfigObject(adapter, path);
|
|
543
|
+
const fingerprint = normalizeApiKeyForConfig(apiKey);
|
|
544
|
+
const responses = getApiKeyResponses(config);
|
|
545
|
+
return {
|
|
546
|
+
agent,
|
|
547
|
+
path,
|
|
548
|
+
fingerprint,
|
|
549
|
+
status: getApiKeyStatusFromResponses(responses, fingerprint),
|
|
550
|
+
dryRun: false,
|
|
551
|
+
};
|
|
552
|
+
}
|
|
553
|
+
async updateApiKeyTrust(agent, action, apiKey, options = {}) {
|
|
554
|
+
const adapter = getAgentSettingsAdapter(agent);
|
|
555
|
+
if (!adapter) {
|
|
556
|
+
throw new Error(`Unsupported agent settings adapter: ${agent}. Supported: ${this.getSupportedAgents().join(', ')}`);
|
|
557
|
+
}
|
|
558
|
+
if (agent !== 'claude') {
|
|
559
|
+
throw new Error(`Agent ${agent} does not support API key trust management.`);
|
|
560
|
+
}
|
|
561
|
+
const path = adapter.getSettingsPath('global', resolveProjectPath(options.projectPath), CLAUDE_API_KEY_RESPONSES_DEFINITION);
|
|
562
|
+
const config = await readConfigObject(adapter, path);
|
|
563
|
+
const fingerprint = normalizeApiKeyForConfig(apiKey);
|
|
564
|
+
const responses = getApiKeyResponses(config);
|
|
565
|
+
const previousStatus = getApiKeyStatusFromResponses(responses, fingerprint);
|
|
566
|
+
let approved = responses.approved.filter(value => value !== fingerprint);
|
|
567
|
+
let rejected = responses.rejected.filter(value => value !== fingerprint);
|
|
568
|
+
if (action === 'approve') {
|
|
569
|
+
approved = [...approved, fingerprint];
|
|
570
|
+
}
|
|
571
|
+
else if (action === 'reject') {
|
|
572
|
+
rejected = [...rejected, fingerprint];
|
|
573
|
+
}
|
|
574
|
+
const status = action === 'approve'
|
|
575
|
+
? 'approved'
|
|
576
|
+
: action === 'reject'
|
|
577
|
+
? 'rejected'
|
|
578
|
+
: 'unknown';
|
|
579
|
+
setApiKeyResponses(config, approved, rejected);
|
|
580
|
+
if (!options.dryRun) {
|
|
581
|
+
await writeConfigObject(adapter, path, config);
|
|
582
|
+
}
|
|
583
|
+
return {
|
|
584
|
+
agent,
|
|
585
|
+
path,
|
|
586
|
+
fingerprint,
|
|
587
|
+
status,
|
|
588
|
+
previousStatus,
|
|
589
|
+
dryRun: Boolean(options.dryRun),
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
//# sourceMappingURL=settingsManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settingsManager.js","sourceRoot":"","sources":["../../../src/core/agentSettings/settingsManager.ts"],"names":[],"mappings":"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"}
|