@vybestack/llxprt-code-settings 0.10.0-nightly.260613.1adad3b34
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/dist/.last_build +0 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/src/__tests__/SettingsService.test.d.ts +12 -0
- package/dist/src/__tests__/SettingsService.test.js +231 -0
- package/dist/src/__tests__/SettingsService.test.js.map +1 -0
- package/dist/src/__tests__/settingsRegistry.test.d.ts +15 -0
- package/dist/src/__tests__/settingsRegistry.test.js +471 -0
- package/dist/src/__tests__/settingsRegistry.test.js.map +1 -0
- package/dist/src/__tests__/settingsServiceInstance.test.d.ts +13 -0
- package/dist/src/__tests__/settingsServiceInstance.test.js +60 -0
- package/dist/src/__tests__/settingsServiceInstance.test.js.map +1 -0
- package/dist/src/index.d.ts +15 -0
- package/dist/src/index.js +14 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/profiles/ProfileManager.d.ts +91 -0
- package/dist/src/profiles/ProfileManager.js +328 -0
- package/dist/src/profiles/ProfileManager.js.map +1 -0
- package/dist/src/profiles/__tests__/ProfileManager.test.d.ts +12 -0
- package/dist/src/profiles/__tests__/ProfileManager.test.js +294 -0
- package/dist/src/profiles/__tests__/ProfileManager.test.js.map +1 -0
- package/dist/src/profiles/types.d.ts +196 -0
- package/dist/src/profiles/types.js +48 -0
- package/dist/src/profiles/types.js.map +1 -0
- package/dist/src/settings/SettingsService.d.ts +59 -0
- package/dist/src/settings/SettingsService.js +289 -0
- package/dist/src/settings/SettingsService.js.map +1 -0
- package/dist/src/settings/settingsRegistry.d.ts +72 -0
- package/dist/src/settings/settingsRegistry.js +1469 -0
- package/dist/src/settings/settingsRegistry.js.map +1 -0
- package/dist/src/settings/settingsServiceInstance.d.ts +21 -0
- package/dist/src/settings/settingsServiceInstance.js +34 -0
- package/dist/src/settings/settingsServiceInstance.js.map +1 -0
- package/dist/src/storage/Storage.d.ts +8 -0
- package/dist/src/storage/Storage.js +9 -0
- package/dist/src/storage/Storage.js.map +1 -0
- package/dist/src/storage/__tests__/Storage.test.d.ts +11 -0
- package/dist/src/storage/__tests__/Storage.test.js +160 -0
- package/dist/src/storage/__tests__/Storage.test.js.map +1 -0
- package/dist/src/types.d.ts +16 -0
- package/dist/src/types.js +16 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @plan PLAN-20260608-ISSUE1588.P05
|
|
3
|
+
*
|
|
4
|
+
* SettingsService — migrated from core.
|
|
5
|
+
* Explicit temporary duplicate; core copy remains until P09.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
export class SettingsService extends EventEmitter {
|
|
9
|
+
settings;
|
|
10
|
+
eventEmitter;
|
|
11
|
+
constructor() {
|
|
12
|
+
super();
|
|
13
|
+
this.settings = {
|
|
14
|
+
providers: {},
|
|
15
|
+
global: {},
|
|
16
|
+
activeProvider: null,
|
|
17
|
+
};
|
|
18
|
+
this.eventEmitter = new EventEmitter();
|
|
19
|
+
}
|
|
20
|
+
get(key) {
|
|
21
|
+
if (key.includes('.')) {
|
|
22
|
+
return this.getNestedValue(this.settings, key);
|
|
23
|
+
}
|
|
24
|
+
return this.settings.global[key];
|
|
25
|
+
}
|
|
26
|
+
set(key, value) {
|
|
27
|
+
const oldValue = this.get(key);
|
|
28
|
+
if (key.includes('.')) {
|
|
29
|
+
const settingsRecord = this.settings;
|
|
30
|
+
this.setNestedValue(settingsRecord, key, value);
|
|
31
|
+
const [root, ...rest] = key.split('.');
|
|
32
|
+
if (root && root !== 'providers') {
|
|
33
|
+
const rootValue = settingsRecord[root];
|
|
34
|
+
if (rootValue !== undefined) {
|
|
35
|
+
this.settings.global[root] = rootValue;
|
|
36
|
+
}
|
|
37
|
+
if (rest.length === 0) {
|
|
38
|
+
this.settings.global[root] = rootValue;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
this.settings.global[key] = value;
|
|
44
|
+
}
|
|
45
|
+
this.eventEmitter.emit('change', {
|
|
46
|
+
key,
|
|
47
|
+
oldValue,
|
|
48
|
+
newValue: value,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
getProviderSettings(provider) {
|
|
52
|
+
const entry = this.settings.providers[provider];
|
|
53
|
+
if (
|
|
54
|
+
// eslint-disable-next-line sonarjs/expression-complexity -- Existing structure is intentionally preserved; refactoring this boundary is outside the lint slice.
|
|
55
|
+
entry !== null &&
|
|
56
|
+
entry !== undefined &&
|
|
57
|
+
entry !== false &&
|
|
58
|
+
entry !== 0 &&
|
|
59
|
+
entry !== '' &&
|
|
60
|
+
!(typeof entry === 'number' && Number.isNaN(entry))) {
|
|
61
|
+
return entry;
|
|
62
|
+
}
|
|
63
|
+
return {};
|
|
64
|
+
}
|
|
65
|
+
setProviderSetting(provider, key, value) {
|
|
66
|
+
const entry = this.settings.providers[provider];
|
|
67
|
+
if (
|
|
68
|
+
// eslint-disable-next-line sonarjs/expression-complexity -- Existing structure is intentionally preserved; refactoring this boundary is outside the lint slice.
|
|
69
|
+
entry === null ||
|
|
70
|
+
entry === undefined ||
|
|
71
|
+
entry === false ||
|
|
72
|
+
entry === 0 ||
|
|
73
|
+
entry === '' ||
|
|
74
|
+
(typeof entry === 'number' && Number.isNaN(entry))) {
|
|
75
|
+
this.settings.providers[provider] = {};
|
|
76
|
+
}
|
|
77
|
+
const oldValue = this.settings.providers[provider][key];
|
|
78
|
+
this.settings.providers[provider][key] = value;
|
|
79
|
+
this.eventEmitter.emit('provider-change', {
|
|
80
|
+
provider,
|
|
81
|
+
key,
|
|
82
|
+
oldValue,
|
|
83
|
+
newValue: value,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
clear() {
|
|
87
|
+
this.settings = {
|
|
88
|
+
providers: {},
|
|
89
|
+
global: {},
|
|
90
|
+
activeProvider: null,
|
|
91
|
+
};
|
|
92
|
+
this.eventEmitter.emit('cleared');
|
|
93
|
+
}
|
|
94
|
+
getAllGlobalSettings() {
|
|
95
|
+
const snapshot = {
|
|
96
|
+
...this.settings.global,
|
|
97
|
+
};
|
|
98
|
+
if (this.settings.tools) {
|
|
99
|
+
const tools = this.settings.tools;
|
|
100
|
+
snapshot.tools = { ...tools };
|
|
101
|
+
if (Array.isArray(tools.allowed)) {
|
|
102
|
+
snapshot['tools.allowed'] = [...tools.allowed];
|
|
103
|
+
}
|
|
104
|
+
if (Array.isArray(tools.disabled)) {
|
|
105
|
+
snapshot['tools.disabled'] = [...tools.disabled];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return snapshot;
|
|
109
|
+
}
|
|
110
|
+
getNestedValue(obj, key) {
|
|
111
|
+
const keys = key.split('.');
|
|
112
|
+
let current = obj;
|
|
113
|
+
for (const k of keys) {
|
|
114
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, sonarjs/different-types-comparison -- Settings values cross persisted/plugin boundaries despite declared types.
|
|
115
|
+
if (current !== null && typeof current === 'object' && k in current) {
|
|
116
|
+
current = current[k];
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return current;
|
|
123
|
+
}
|
|
124
|
+
setNestedValue(obj, key, value) {
|
|
125
|
+
const keys = key.split('.');
|
|
126
|
+
// Security: Check for dangerous keys that can pollute prototypes
|
|
127
|
+
const dangerousKeys = ['__proto__', 'constructor', 'prototype'];
|
|
128
|
+
for (const k of keys) {
|
|
129
|
+
if (dangerousKeys.includes(k)) {
|
|
130
|
+
throw new Error(`Cannot set dangerous property: ${k}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
let current = obj;
|
|
134
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
135
|
+
const k = keys[i];
|
|
136
|
+
if (current[k] === null ||
|
|
137
|
+
current[k] === undefined ||
|
|
138
|
+
typeof current[k] !== 'object') {
|
|
139
|
+
current[k] = {};
|
|
140
|
+
}
|
|
141
|
+
current = current[k];
|
|
142
|
+
}
|
|
143
|
+
current[keys[keys.length - 1]] = value;
|
|
144
|
+
}
|
|
145
|
+
on(event, listener) {
|
|
146
|
+
this.eventEmitter.on(event, listener);
|
|
147
|
+
return this;
|
|
148
|
+
}
|
|
149
|
+
off(event, listener) {
|
|
150
|
+
this.eventEmitter.off(event, listener);
|
|
151
|
+
return this;
|
|
152
|
+
}
|
|
153
|
+
getSettings(provider) {
|
|
154
|
+
if (provider === undefined) {
|
|
155
|
+
return Promise.resolve({
|
|
156
|
+
providers: this.settings.providers,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
return Promise.resolve(this.getProviderSettings(provider));
|
|
160
|
+
}
|
|
161
|
+
updateSettings(providerOrChanges, changes) {
|
|
162
|
+
const runtimeChanges = changes;
|
|
163
|
+
if (typeof providerOrChanges === 'string' &&
|
|
164
|
+
runtimeChanges !== undefined &&
|
|
165
|
+
runtimeChanges !== null) {
|
|
166
|
+
for (const [key, value] of Object.entries(runtimeChanges)) {
|
|
167
|
+
this.setProviderSetting(providerOrChanges, key, value);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
else if (
|
|
171
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, sonarjs/different-types-comparison -- Settings values cross persisted/plugin boundaries despite declared types.
|
|
172
|
+
providerOrChanges !== null &&
|
|
173
|
+
typeof providerOrChanges === 'object') {
|
|
174
|
+
for (const [key, value] of Object.entries(providerOrChanges)) {
|
|
175
|
+
this.set(key, value);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return Promise.resolve();
|
|
179
|
+
}
|
|
180
|
+
switchProvider(newProvider) {
|
|
181
|
+
this.set('activeProvider', newProvider);
|
|
182
|
+
return Promise.resolve();
|
|
183
|
+
}
|
|
184
|
+
exportForProfile() {
|
|
185
|
+
/* eslint-disable @typescript-eslint/prefer-nullish-coalescing -- intentional falsy coalescing: empty activeProvider string should fall through to default */
|
|
186
|
+
const activeProvider = this.settings.global.activeProvider ||
|
|
187
|
+
this.settings.activeProvider ||
|
|
188
|
+
'openai';
|
|
189
|
+
/* eslint-enable @typescript-eslint/prefer-nullish-coalescing */
|
|
190
|
+
const allowedValue = this.get('tools.allowed');
|
|
191
|
+
const disabledValue = this.get('tools.disabled');
|
|
192
|
+
const legacyDisabled = this.get('disabled-tools');
|
|
193
|
+
const allowedTools = Array.isArray(allowedValue)
|
|
194
|
+
? allowedValue.slice()
|
|
195
|
+
: [];
|
|
196
|
+
const disabledTools = Array.isArray(disabledValue)
|
|
197
|
+
? disabledValue.slice()
|
|
198
|
+
: // eslint-disable-next-line sonarjs/no-nested-conditional -- Existing structure is intentionally preserved; refactoring this boundary is outside the lint slice.
|
|
199
|
+
Array.isArray(legacyDisabled)
|
|
200
|
+
? legacyDisabled.slice()
|
|
201
|
+
: [];
|
|
202
|
+
return Promise.resolve({
|
|
203
|
+
defaultProvider: activeProvider,
|
|
204
|
+
providers: { ...this.settings.providers },
|
|
205
|
+
tools: {
|
|
206
|
+
allowed: allowedTools,
|
|
207
|
+
disabled: disabledTools,
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
importFromProfile(profileData) {
|
|
212
|
+
this.settings.providers = {};
|
|
213
|
+
if (profileData !== null &&
|
|
214
|
+
profileData !== undefined &&
|
|
215
|
+
typeof profileData === 'object') {
|
|
216
|
+
const data = profileData;
|
|
217
|
+
if (data.defaultProvider) {
|
|
218
|
+
this.set('activeProvider', data.defaultProvider);
|
|
219
|
+
this.settings.activeProvider = data.defaultProvider;
|
|
220
|
+
}
|
|
221
|
+
if (data.providers) {
|
|
222
|
+
for (const [provider, settings] of Object.entries(data.providers)) {
|
|
223
|
+
// eslint-disable-next-line sonarjs/nested-control-flow, @typescript-eslint/no-unnecessary-condition, sonarjs/different-types-comparison -- Existing nested import path handles persisted/plugin settings across declared types.
|
|
224
|
+
if (settings !== null && typeof settings === 'object') {
|
|
225
|
+
for (const [key, value] of Object.entries(settings)) {
|
|
226
|
+
this.setProviderSetting(provider, key, value);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
const toolsAllowed = Array.isArray(data.tools?.allowed)
|
|
232
|
+
? // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Settings values cross persisted/plugin boundaries despite declared types.
|
|
233
|
+
(data.tools?.allowed).map((name) => String(name))
|
|
234
|
+
: [];
|
|
235
|
+
const toolsDisabled = Array.isArray(data.tools?.disabled)
|
|
236
|
+
? // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Settings values cross persisted/plugin boundaries despite declared types.
|
|
237
|
+
(data.tools?.disabled).map((name) => String(name))
|
|
238
|
+
: [];
|
|
239
|
+
this.settings.tools = this.settings.tools ?? {};
|
|
240
|
+
this.settings.tools['allowed'] =
|
|
241
|
+
toolsAllowed;
|
|
242
|
+
this.settings.tools['disabled'] =
|
|
243
|
+
toolsDisabled;
|
|
244
|
+
this.settings.global['tools'] = {
|
|
245
|
+
allowed: toolsAllowed,
|
|
246
|
+
disabled: toolsDisabled,
|
|
247
|
+
};
|
|
248
|
+
this.settings.global['disabled-tools'] = toolsDisabled;
|
|
249
|
+
}
|
|
250
|
+
return Promise.resolve();
|
|
251
|
+
}
|
|
252
|
+
setCurrentProfileName(profileName) {
|
|
253
|
+
this.set('currentProfile', profileName);
|
|
254
|
+
}
|
|
255
|
+
getCurrentProfileName() {
|
|
256
|
+
const value = this.get('currentProfile');
|
|
257
|
+
return typeof value === 'string' ? value : null;
|
|
258
|
+
}
|
|
259
|
+
getDiagnosticsData() {
|
|
260
|
+
const globalActiveProvider = this.settings.global.activeProvider;
|
|
261
|
+
const activeProvider = typeof globalActiveProvider === 'string' && globalActiveProvider !== ''
|
|
262
|
+
? globalActiveProvider
|
|
263
|
+
: (this.settings.activeProvider ?? 'openai');
|
|
264
|
+
const providerSettings = this.getProviderSettings(activeProvider);
|
|
265
|
+
const model = providerSettings.model || 'unknown';
|
|
266
|
+
const modelParams = {};
|
|
267
|
+
for (const [key, value] of Object.entries(providerSettings)) {
|
|
268
|
+
if (key !== 'model' && value !== undefined) {
|
|
269
|
+
modelParams[key] = value;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return Promise.resolve({
|
|
273
|
+
provider: activeProvider,
|
|
274
|
+
model,
|
|
275
|
+
profile: this.getCurrentProfileName(),
|
|
276
|
+
providerSettings,
|
|
277
|
+
ephemeralSettings: this.settings.global,
|
|
278
|
+
modelParams,
|
|
279
|
+
allSettings: {
|
|
280
|
+
providers: this.settings.providers,
|
|
281
|
+
},
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
onSettingsChanged(listener) {
|
|
285
|
+
this.eventEmitter.on('settings_changed', listener);
|
|
286
|
+
return () => this.eventEmitter.removeListener('settings_changed', listener);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=SettingsService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettingsService.js","sourceRoot":"","sources":["../../../src/settings/SettingsService.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAkCtC,MAAM,OAAO,eAAgB,SAAQ,YAAY;IACvC,QAAQ,CAAoB;IAC5B,YAAY,CAAe;IAEnC;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG;YACd,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,EAAE;YACV,cAAc,EAAE,IAAI;SACrB,CAAC;QACF,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IACzC,CAAC;IAED,GAAG,CAAC,GAAW;QACb,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAc;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAE/B,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,cAAc,GAAG,IAAI,CAAC,QAG3B,CAAC;YAEF,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAEhD,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,IAAI,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;gBACjC,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;gBACvC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;oBAC5B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;gBACzC,CAAC;gBAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;gBACzC,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpC,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC/B,GAAG;YACH,QAAQ;YACR,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB,CAAC,QAAgB;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAY,CAAC;QAC3D;QACE,gKAAgK;QAChK,KAAK,KAAK,IAAI;YACd,KAAK,KAAK,SAAS;YACnB,KAAK,KAAK,KAAK;YACf,KAAK,KAAK,CAAC;YACX,KAAK,KAAK,EAAE;YACZ,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EACnD,CAAC;YACD,OAAO,KAAgC,CAAC;QAC1C,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,kBAAkB,CAAC,QAAgB,EAAE,GAAW,EAAE,KAAc;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAY,CAAC;QAC3D;QACE,gKAAgK;QAChK,KAAK,KAAK,IAAI;YACd,KAAK,KAAK,SAAS;YACnB,KAAK,KAAK,KAAK;YACf,KAAK,KAAK,CAAC;YACX,KAAK,KAAK,EAAE;YACZ,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAClD,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QACzC,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAE/C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACxC,QAAQ;YACR,GAAG;YACH,QAAQ;YACR,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;IACL,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,GAAG;YACd,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,EAAE;YACV,cAAc,EAAE,IAAI;SACrB,CAAC;QACF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAED,oBAAoB;QAClB,MAAM,QAAQ,GAA4B;YACxC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM;SACxB,CAAC;QAEF,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAClC,QAAQ,CAAC,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;YAE9B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjC,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;YACjD,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,cAAc,CAAC,GAAY,EAAE,GAAW;QAC9C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,OAAO,GAAG,GAA8B,CAAC;QAE7C,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,wLAAwL;YACxL,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;gBACpE,OAAO,GAAG,OAAO,CAAC,CAAC,CAA4B,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,cAAc,CACpB,GAA4B,EAC5B,GAAW,EACX,KAAc;QAEd,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE5B,iEAAiE;QACjE,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;QAChE,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAED,IAAI,OAAO,GAAG,GAAG,CAAC;QAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,IACE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI;gBACnB,OAAO,CAAC,CAAC,CAAC,KAAK,SAAS;gBACxB,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,EAC9B,CAAC;gBACD,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YAClB,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,CAAC,CAA4B,CAAC;QAClD,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IACzC,CAAC;IAgBQ,EAAE,CAAC,KAAsB,EAAE,QAA+B;QACjE,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAaQ,GAAG,CAAC,KAAa,EAAE,QAA+B;QACzD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAID,WAAW,CAAC,QAAiB;QAC3B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC,OAAO,CAAC;gBACrB,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS;aACnC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7D,CAAC;IAOD,cAAc,CACZ,iBAAoD,EACpD,OAAiC;QAEjC,MAAM,cAAc,GAAG,OAGV,CAAC;QACd,IACE,OAAO,iBAAiB,KAAK,QAAQ;YACrC,cAAc,KAAK,SAAS;YAC5B,cAAc,KAAK,IAAI,EACvB,CAAC;YACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC1D,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;aAAM;QACL,wLAAwL;QACxL,iBAAiB,KAAK,IAAI;YAC1B,OAAO,iBAAiB,KAAK,QAAQ,EACrC,CAAC;YACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC7D,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,cAAc,CAAC,WAAmB;QAChC,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;QACxC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,gBAAgB;QACd,6JAA6J;QAC7J,MAAM,cAAc,GACjB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAyB;YAC/C,IAAI,CAAC,QAAQ,CAAC,cAAc;YAC5B,QAAQ,CAAC;QACX,gEAAgE;QAEhE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC/C,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACjD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAElD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;YAC9C,CAAC,CAAE,YAAyB,CAAC,KAAK,EAAE;YACpC,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;YAChD,CAAC,CAAE,aAA0B,CAAC,KAAK,EAAE;YACrC,CAAC,CAAC,gKAAgK;gBAChK,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC;oBAC7B,CAAC,CAAE,cAA2B,CAAC,KAAK,EAAE;oBACtC,CAAC,CAAC,EAAE,CAAC;QAET,OAAO,OAAO,CAAC,OAAO,CAAC;YACrB,eAAe,EAAE,cAAc;YAC/B,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE;YACzC,KAAK,EAAE;gBACL,OAAO,EAAE,YAAY;gBACrB,QAAQ,EAAE,aAAa;aACxB;SACF,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB,CAAC,WAAoB;QACpC,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,EAAE,CAAC;QAE7B,IACE,WAAW,KAAK,IAAI;YACpB,WAAW,KAAK,SAAS;YACzB,OAAO,WAAW,KAAK,QAAQ,EAC/B,CAAC;YACD,MAAM,IAAI,GAAG,WAOZ,CAAC;YAEF,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;gBACjD,IAAI,CAAC,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC;YACtD,CAAC;YAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;oBAClE,gOAAgO;oBAChO,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;wBACtD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;4BACpD,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;wBAChD,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC;gBACrD,CAAC,CAAC,oJAAoJ;oBACpJ,CAAC,IAAI,CAAC,KAAK,EAAE,OAAqB,CAAA,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAChE,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC;gBACvD,CAAC,CAAC,oJAAoJ;oBACpJ,CAAC,IAAI,CAAC,KAAK,EAAE,QAAsB,CAAA,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACjE,CAAC,CAAC,EAAE,CAAC;YAEP,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/C,IAAI,CAAC,QAAQ,CAAC,KAAiC,CAAC,SAAS,CAAC;gBACzD,YAAY,CAAC;YACd,IAAI,CAAC,QAAQ,CAAC,KAAiC,CAAC,UAAU,CAAC;gBAC1D,aAAa,CAAC;YAChB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG;gBAC9B,OAAO,EAAE,YAAY;gBACrB,QAAQ,EAAE,aAAa;aACxB,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,aAAa,CAAC;QACzD,CAAC;QAED,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,qBAAqB,CAAC,WAA0B;QAC9C,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;IAC1C,CAAC;IAED,qBAAqB;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACzC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAClD,CAAC;IAED,kBAAkB;QAChB,MAAM,oBAAoB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC;QACjE,MAAM,cAAc,GAClB,OAAO,oBAAoB,KAAK,QAAQ,IAAI,oBAAoB,KAAK,EAAE;YACrE,CAAC,CAAC,oBAAoB;YACtB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,IAAI,QAAQ,CAAC,CAAC;QACjD,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;QAElE,MAAM,KAAK,GAAI,gBAAgB,CAAC,KAAgB,IAAI,SAAS,CAAC;QAE9D,MAAM,WAAW,GAA4B,EAAE,CAAC;QAChD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC5D,IAAI,GAAG,KAAK,OAAO,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC3C,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC,OAAO,CAAC;YACrB,QAAQ,EAAE,cAAc;YACxB,KAAK;YACL,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE;YACrC,gBAAgB;YAChB,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;YACvC,WAAW;YACX,WAAW,EAAE;gBACX,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS;aACnC;SACF,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB,CACf,QAAkD;QAElD,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QACnD,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;IAC9E,CAAC;CACF"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @plan PLAN-20260608-ISSUE1588.P05
|
|
3
|
+
*
|
|
4
|
+
* Settings registry — migrated from core.
|
|
5
|
+
* Explicit temporary duplicate; core copy remains until P09.
|
|
6
|
+
* Settings-owned: does NOT import core compression types.
|
|
7
|
+
*/
|
|
8
|
+
export type SettingCategory = 'model-behavior' | 'provider-config' | 'cli-behavior' | 'model-param' | 'custom-header';
|
|
9
|
+
export interface ValidationResult {
|
|
10
|
+
success: boolean;
|
|
11
|
+
value?: unknown;
|
|
12
|
+
message?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface SettingSpec {
|
|
15
|
+
key: string;
|
|
16
|
+
aliases?: readonly string[];
|
|
17
|
+
category: SettingCategory;
|
|
18
|
+
providers?: readonly string[];
|
|
19
|
+
description: string;
|
|
20
|
+
hint?: string;
|
|
21
|
+
type: 'boolean' | 'number' | 'string' | 'enum' | 'json' | 'string-array';
|
|
22
|
+
enumValues?: readonly string[];
|
|
23
|
+
validate?: (value: unknown) => ValidationResult;
|
|
24
|
+
parse?: (raw: string) => unknown;
|
|
25
|
+
normalize?: (value: unknown) => unknown;
|
|
26
|
+
default?: unknown;
|
|
27
|
+
persistToProfile: boolean;
|
|
28
|
+
completionOptions?: ReadonlyArray<{
|
|
29
|
+
value: string;
|
|
30
|
+
description?: string;
|
|
31
|
+
}>;
|
|
32
|
+
}
|
|
33
|
+
export interface SeparatedSettings {
|
|
34
|
+
cliSettings: Record<string, unknown>;
|
|
35
|
+
modelBehavior: Record<string, unknown>;
|
|
36
|
+
modelParams: Record<string, unknown>;
|
|
37
|
+
customHeaders: Record<string, string>;
|
|
38
|
+
}
|
|
39
|
+
export declare const SETTINGS_REGISTRY: readonly SettingSpec[];
|
|
40
|
+
export declare function resolveAlias(key: string): string;
|
|
41
|
+
export declare function getSettingSpec(key: string): SettingSpec | undefined;
|
|
42
|
+
export declare function normalizeSetting(key: string, value: unknown): unknown;
|
|
43
|
+
export declare function separateSettings(mixed: Record<string, unknown>, providerName?: string): SeparatedSettings;
|
|
44
|
+
export declare function validateSetting(key: string, value: unknown): ValidationResult;
|
|
45
|
+
export declare function parseSetting(key: string, raw: string): unknown;
|
|
46
|
+
export declare function getProfilePersistableKeys(): string[];
|
|
47
|
+
export declare function getSettingHelp(): Record<string, string>;
|
|
48
|
+
export declare function getCompletionOptions(): ReadonlyArray<{
|
|
49
|
+
key: string;
|
|
50
|
+
options?: ReadonlyArray<{
|
|
51
|
+
value: string;
|
|
52
|
+
description?: string;
|
|
53
|
+
}>;
|
|
54
|
+
}>;
|
|
55
|
+
export declare function getAllSettingKeys(): string[];
|
|
56
|
+
export declare function getValidationHelp(key: string): string | undefined;
|
|
57
|
+
export declare function getAutocompleteSuggestions(key: string): ReadonlyArray<{
|
|
58
|
+
value: string;
|
|
59
|
+
description?: string;
|
|
60
|
+
}> | undefined;
|
|
61
|
+
export declare function getProtectedSettingKeys(): string[];
|
|
62
|
+
export declare function getProviderConfigKeys(): string[];
|
|
63
|
+
export interface DirectSettingSpec {
|
|
64
|
+
value: string;
|
|
65
|
+
hint: string;
|
|
66
|
+
description?: string;
|
|
67
|
+
options?: ReadonlyArray<{
|
|
68
|
+
value: string;
|
|
69
|
+
description?: string;
|
|
70
|
+
}>;
|
|
71
|
+
}
|
|
72
|
+
export declare function getDirectSettingSpecs(): DirectSettingSpec[];
|