@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,471 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @plan PLAN-20260608-ISSUE1588.P04
|
|
3
|
+
* @requirement REQ-REG-001
|
|
4
|
+
*
|
|
5
|
+
* Behavioral TDD tests for the settings registry.
|
|
6
|
+
*
|
|
7
|
+
* These tests define the expected behavior for settings registry functions
|
|
8
|
+
* that will be migrated from core in P05. Tests fail against stubs because
|
|
9
|
+
* functions throw instead of returning values.
|
|
10
|
+
*
|
|
11
|
+
* Compression strategy values are verified by their string literals
|
|
12
|
+
* ('middle-out', 'top-down-truncation', 'one-shot', 'high-density')
|
|
13
|
+
* without importing core compression types.
|
|
14
|
+
*/
|
|
15
|
+
import { describe, it, expect } from 'vitest';
|
|
16
|
+
import { resolveAlias, getSettingSpec, normalizeSetting, separateSettings, validateSetting, parseSetting, getProfilePersistableKeys, getSettingHelp, getAllSettingKeys, getValidationHelp, getAutocompleteSuggestions, getProtectedSettingKeys, getProviderConfigKeys, getDirectSettingSpecs, } from '../settings/settingsRegistry.js';
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Compression strategy literal values — tested without importing core
|
|
19
|
+
// compression. The settings registry must contain these enum values once
|
|
20
|
+
// migrated. These are the known expected values from the current production
|
|
21
|
+
// implementation.
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
const EXPECTED_COMPRESSION_STRATEGIES = [
|
|
24
|
+
'middle-out',
|
|
25
|
+
'top-down-truncation',
|
|
26
|
+
'one-shot',
|
|
27
|
+
'high-density',
|
|
28
|
+
];
|
|
29
|
+
describe('resolveAlias — alias normalization', () => {
|
|
30
|
+
it('resolves max-tokens to max_tokens', () => {
|
|
31
|
+
expect(resolveAlias('max-tokens')).toBe('max_tokens');
|
|
32
|
+
});
|
|
33
|
+
it('resolves maxTokens to max_tokens', () => {
|
|
34
|
+
expect(resolveAlias('maxTokens')).toBe('max_tokens');
|
|
35
|
+
});
|
|
36
|
+
it('resolves response-format to response_format', () => {
|
|
37
|
+
expect(resolveAlias('response-format')).toBe('response_format');
|
|
38
|
+
});
|
|
39
|
+
it('resolves responseFormat to response_format', () => {
|
|
40
|
+
expect(resolveAlias('responseFormat')).toBe('response_format');
|
|
41
|
+
});
|
|
42
|
+
it('resolves tool-choice to tool_choice', () => {
|
|
43
|
+
expect(resolveAlias('tool-choice')).toBe('tool_choice');
|
|
44
|
+
});
|
|
45
|
+
it('resolves toolChoice to tool_choice', () => {
|
|
46
|
+
expect(resolveAlias('toolChoice')).toBe('tool_choice');
|
|
47
|
+
});
|
|
48
|
+
it('resolves disabled-tools to tools.disabled', () => {
|
|
49
|
+
expect(resolveAlias('disabled-tools')).toBe('tools.disabled');
|
|
50
|
+
});
|
|
51
|
+
it('preserves user-agent without underscore conversion', () => {
|
|
52
|
+
expect(resolveAlias('user-agent')).toBe('user-agent');
|
|
53
|
+
});
|
|
54
|
+
it('returns temperature unchanged (already canonical)', () => {
|
|
55
|
+
expect(resolveAlias('temperature')).toBe('temperature');
|
|
56
|
+
});
|
|
57
|
+
it('returns an unknown key unchanged', () => {
|
|
58
|
+
expect(resolveAlias('completely-unknown-key')).toBe('completely_unknown_key');
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe('getSettingSpec — spec lookup', () => {
|
|
62
|
+
it('returns a spec with category model-param for temperature', () => {
|
|
63
|
+
const spec = getSettingSpec('temperature');
|
|
64
|
+
expect(spec?.category).toBe('model-param');
|
|
65
|
+
});
|
|
66
|
+
it('returns a spec with category cli-behavior for shell-replacement', () => {
|
|
67
|
+
const spec = getSettingSpec('shell-replacement');
|
|
68
|
+
expect(spec?.category).toBe('cli-behavior');
|
|
69
|
+
});
|
|
70
|
+
it('resolves apiKey alias to auth-key canonical spec', () => {
|
|
71
|
+
const spec = getSettingSpec('auth-key');
|
|
72
|
+
expect(spec?.category).toBe('provider-config');
|
|
73
|
+
expect(spec?.aliases).toContain('apiKey');
|
|
74
|
+
});
|
|
75
|
+
it('resolves auth-key canonical spec directly', () => {
|
|
76
|
+
const spec = getSettingSpec('auth-key');
|
|
77
|
+
expect(spec?.category).toBe('provider-config');
|
|
78
|
+
expect(spec?.persistToProfile).toBe(true);
|
|
79
|
+
});
|
|
80
|
+
it('resolves auth-keyfile canonical spec with apiKeyfile alias', () => {
|
|
81
|
+
const spec = getSettingSpec('auth-keyfile');
|
|
82
|
+
expect(spec?.category).toBe('provider-config');
|
|
83
|
+
expect(spec?.aliases).toContain('apiKeyfile');
|
|
84
|
+
});
|
|
85
|
+
it('resolves apiKey to auth-key via resolveAlias', () => {
|
|
86
|
+
expect(resolveAlias('apiKey')).toBe('auth-key');
|
|
87
|
+
});
|
|
88
|
+
it('resolves apiKeyfile to auth-keyfile via resolveAlias', () => {
|
|
89
|
+
expect(resolveAlias('apiKeyfile')).toBe('auth-keyfile');
|
|
90
|
+
});
|
|
91
|
+
it('returns a spec with type enum for compression.strategy', () => {
|
|
92
|
+
const spec = getSettingSpec('compression.strategy');
|
|
93
|
+
expect(spec?.type).toBe('enum');
|
|
94
|
+
});
|
|
95
|
+
it('returns undefined for nonexistent key', () => {
|
|
96
|
+
const spec = getSettingSpec('nonexistent-setting-xyz');
|
|
97
|
+
expect(spec).toBeUndefined();
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
describe('normalizeSetting — normalization', () => {
|
|
101
|
+
it('returns the value unchanged when no normalizer exists', () => {
|
|
102
|
+
const result = normalizeSetting('temperature', 0.7);
|
|
103
|
+
expect(result).toBe(0.7);
|
|
104
|
+
});
|
|
105
|
+
it('normalizes a reasoning object by removing internal keys', () => {
|
|
106
|
+
const result = normalizeSetting('reasoning', {
|
|
107
|
+
enabled: true,
|
|
108
|
+
effort: 'high',
|
|
109
|
+
maxTokens: 5000,
|
|
110
|
+
includeInContext: true,
|
|
111
|
+
includeInResponse: false,
|
|
112
|
+
format: 'native',
|
|
113
|
+
stripFromContext: 'all',
|
|
114
|
+
});
|
|
115
|
+
const normalized = result;
|
|
116
|
+
// Internal keys should be stripped
|
|
117
|
+
expect(normalized.includeInContext).toBeUndefined();
|
|
118
|
+
expect(normalized.includeInResponse).toBeUndefined();
|
|
119
|
+
expect(normalized.format).toBeUndefined();
|
|
120
|
+
expect(normalized.stripFromContext).toBeUndefined();
|
|
121
|
+
// Non-internal keys preserved
|
|
122
|
+
expect(normalized.effort).toBe('high');
|
|
123
|
+
expect(normalized.maxTokens).toBe(5000);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe('separateSettings — settings categorization', () => {
|
|
127
|
+
it('places shell-replacement in cliSettings', () => {
|
|
128
|
+
const result = separateSettings({ 'shell-replacement': 'none' });
|
|
129
|
+
expect(result.cliSettings['shell-replacement']).toBe('none');
|
|
130
|
+
});
|
|
131
|
+
it('places temperature in modelParams', () => {
|
|
132
|
+
const result = separateSettings({ temperature: 0.7 });
|
|
133
|
+
expect(result.modelParams.temperature).toBe(0.7);
|
|
134
|
+
});
|
|
135
|
+
it('places reasoning.enabled in modelBehavior', () => {
|
|
136
|
+
const result = separateSettings({ 'reasoning.enabled': true });
|
|
137
|
+
expect(result.modelBehavior['reasoning.enabled']).toBe(true);
|
|
138
|
+
});
|
|
139
|
+
it('extracts headers from custom-headers into customHeaders', () => {
|
|
140
|
+
const result = separateSettings({
|
|
141
|
+
'custom-headers': { 'X-Foo': 'bar' },
|
|
142
|
+
});
|
|
143
|
+
expect(result.customHeaders['X-Foo']).toBe('bar');
|
|
144
|
+
});
|
|
145
|
+
it('does not include apiKey in cliSettings (provider-config filtered)', () => {
|
|
146
|
+
const result = separateSettings({ apiKey: 'sk-123' });
|
|
147
|
+
expect(result.cliSettings.apiKey).toBeUndefined();
|
|
148
|
+
});
|
|
149
|
+
it('does not include apiKey in modelParams', () => {
|
|
150
|
+
const result = separateSettings({ apiKey: 'sk-123' });
|
|
151
|
+
expect(result.modelParams.apiKey).toBeUndefined();
|
|
152
|
+
});
|
|
153
|
+
it('places unknown keys in modelParams as pass-through', () => {
|
|
154
|
+
const result = separateSettings({ unknownKey: 'val' });
|
|
155
|
+
expect(result.modelParams.unknownKey).toBe('val');
|
|
156
|
+
});
|
|
157
|
+
it('resolves max-tokens alias to max_tokens in modelParams', () => {
|
|
158
|
+
const result = separateSettings({ 'max-tokens': 4096 });
|
|
159
|
+
expect(result.modelParams.max_tokens).toBe(4096);
|
|
160
|
+
});
|
|
161
|
+
it('excludes seed from modelParams when provider is anthropic', () => {
|
|
162
|
+
const result = separateSettings({ seed: 42 }, 'anthropic');
|
|
163
|
+
expect(result.modelParams.seed).toBeUndefined();
|
|
164
|
+
});
|
|
165
|
+
it('includes seed in modelParams when provider is openai', () => {
|
|
166
|
+
const result = separateSettings({ seed: 42 }, 'openai');
|
|
167
|
+
expect(result.modelParams.seed).toBe(42);
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe('validateSetting — validation', () => {
|
|
171
|
+
it('returns success:true for a valid streaming mode', () => {
|
|
172
|
+
const result = validateSetting('streaming', 'enabled');
|
|
173
|
+
expect(result.success).toBe(true);
|
|
174
|
+
});
|
|
175
|
+
it('returns success:false for an invalid streaming mode', () => {
|
|
176
|
+
const result = validateSetting('streaming', 'invalid');
|
|
177
|
+
expect(result.success).toBe(false);
|
|
178
|
+
});
|
|
179
|
+
it('validates file-read-max-lines with a positive integer', () => {
|
|
180
|
+
const result = validateSetting('file-read-max-lines', 3000);
|
|
181
|
+
expect(result.success).toBe(true);
|
|
182
|
+
});
|
|
183
|
+
it('rejects negative file-read-max-lines', () => {
|
|
184
|
+
const result = validateSetting('file-read-max-lines', -100);
|
|
185
|
+
expect(result.success).toBe(false);
|
|
186
|
+
});
|
|
187
|
+
it('rejects zero file-read-max-lines', () => {
|
|
188
|
+
const result = validateSetting('file-read-max-lines', 0);
|
|
189
|
+
expect(result.success).toBe(false);
|
|
190
|
+
});
|
|
191
|
+
it('returns success:true for unknown keys (pass-through)', () => {
|
|
192
|
+
const result = validateSetting('totally-unknown-key', 'any-value');
|
|
193
|
+
expect(result.success).toBe(true);
|
|
194
|
+
});
|
|
195
|
+
it('validates boolean true for requires-auth', () => {
|
|
196
|
+
const result = validateSetting('requires-auth', true);
|
|
197
|
+
expect(result.success).toBe(true);
|
|
198
|
+
});
|
|
199
|
+
it('validates boolean false for requires-auth', () => {
|
|
200
|
+
const result = validateSetting('requires-auth', false);
|
|
201
|
+
expect(result.success).toBe(true);
|
|
202
|
+
});
|
|
203
|
+
it('rejects string for requires-auth (requires boolean)', () => {
|
|
204
|
+
const result = validateSetting('requires-auth', 'yes');
|
|
205
|
+
expect(result.success).toBe(false);
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
describe('parseSetting — string-to-value parsing', () => {
|
|
209
|
+
it('parses a number type value from string', () => {
|
|
210
|
+
const result = parseSetting('temperature', '0.7');
|
|
211
|
+
expect(result).toBe(0.7);
|
|
212
|
+
});
|
|
213
|
+
it('parses a boolean true from string', () => {
|
|
214
|
+
const result = parseSetting('reasoning.enabled', 'true');
|
|
215
|
+
expect(result).toBe(true);
|
|
216
|
+
});
|
|
217
|
+
it('parses a boolean false from string', () => {
|
|
218
|
+
const result = parseSetting('reasoning.enabled', 'false');
|
|
219
|
+
expect(result).toBe(false);
|
|
220
|
+
});
|
|
221
|
+
it('returns raw string for unknown setting', () => {
|
|
222
|
+
const result = parseSetting('unknown-setting-xyz', 'hello');
|
|
223
|
+
expect(result).toBe('hello');
|
|
224
|
+
});
|
|
225
|
+
it('parses streaming "true" to "enabled"', () => {
|
|
226
|
+
const result = parseSetting('streaming', 'true');
|
|
227
|
+
expect(result).toBe('enabled');
|
|
228
|
+
});
|
|
229
|
+
it('parses streaming "false" to "disabled"', () => {
|
|
230
|
+
const result = parseSetting('streaming', 'false');
|
|
231
|
+
expect(result).toBe('disabled');
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
describe('getProfilePersistableKeys — profile persistence', () => {
|
|
235
|
+
it('includes temperature in persistable keys', () => {
|
|
236
|
+
const keys = getProfilePersistableKeys();
|
|
237
|
+
expect(keys).toContain('temperature');
|
|
238
|
+
});
|
|
239
|
+
it('includes reasoning.enabled in persistable keys', () => {
|
|
240
|
+
const keys = getProfilePersistableKeys();
|
|
241
|
+
expect(keys).toContain('reasoning.enabled');
|
|
242
|
+
});
|
|
243
|
+
it('auth-key is persistable to profile (canonical)', () => {
|
|
244
|
+
const keys = getProfilePersistableKeys();
|
|
245
|
+
expect(keys).toContain('auth-key');
|
|
246
|
+
});
|
|
247
|
+
it('auth-keyfile is persistable to profile (canonical)', () => {
|
|
248
|
+
const keys = getProfilePersistableKeys();
|
|
249
|
+
expect(keys).toContain('auth-keyfile');
|
|
250
|
+
});
|
|
251
|
+
it('apiKey alias resolves to auth-key spec via getSettingSpec', () => {
|
|
252
|
+
const spec = getSettingSpec('apiKey');
|
|
253
|
+
expect(spec).toBeDefined();
|
|
254
|
+
expect(spec?.key).toBe('auth-key');
|
|
255
|
+
expect(spec?.category).toBe('provider-config');
|
|
256
|
+
expect(spec?.aliases).toContain('apiKey');
|
|
257
|
+
});
|
|
258
|
+
it('apiKeyfile alias resolves to auth-keyfile spec via getSettingSpec', () => {
|
|
259
|
+
const spec = getSettingSpec('apiKeyfile');
|
|
260
|
+
expect(spec).toBeDefined();
|
|
261
|
+
expect(spec?.key).toBe('auth-keyfile');
|
|
262
|
+
expect(spec?.category).toBe('provider-config');
|
|
263
|
+
expect(spec?.aliases).toContain('apiKeyfile');
|
|
264
|
+
});
|
|
265
|
+
it('api-key alias resolves to auth-key spec via getSettingSpec', () => {
|
|
266
|
+
const spec = getSettingSpec('api-key');
|
|
267
|
+
expect(spec).toBeDefined();
|
|
268
|
+
expect(spec?.key).toBe('auth-key');
|
|
269
|
+
});
|
|
270
|
+
it('api-keyfile alias resolves to auth-keyfile spec via getSettingSpec', () => {
|
|
271
|
+
const spec = getSettingSpec('api-keyfile');
|
|
272
|
+
expect(spec).toBeDefined();
|
|
273
|
+
expect(spec?.key).toBe('auth-keyfile');
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
describe('getSettingHelp — help text', () => {
|
|
277
|
+
it('returns non-empty descriptions for known settings', () => {
|
|
278
|
+
const help = getSettingHelp();
|
|
279
|
+
expect(help['shell-replacement']).toBeTruthy();
|
|
280
|
+
expect(help['shell-replacement']).not.toBe('');
|
|
281
|
+
});
|
|
282
|
+
it('includes help for temperature', () => {
|
|
283
|
+
const help = getSettingHelp();
|
|
284
|
+
expect(help['temperature']).toBeTruthy();
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
describe('getAllSettingKeys — key enumeration', () => {
|
|
288
|
+
it('returns an array that includes temperature', () => {
|
|
289
|
+
const keys = getAllSettingKeys();
|
|
290
|
+
expect(keys).toContain('temperature');
|
|
291
|
+
});
|
|
292
|
+
it('returns an array that includes shell-replacement', () => {
|
|
293
|
+
const keys = getAllSettingKeys();
|
|
294
|
+
expect(keys).toContain('shell-replacement');
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
describe('getValidationHelp — validation hint text', () => {
|
|
298
|
+
it('returns help text for a known setting', () => {
|
|
299
|
+
const help = getValidationHelp('context-limit');
|
|
300
|
+
expect(help).toBeTruthy();
|
|
301
|
+
});
|
|
302
|
+
it('returns undefined for unknown setting', () => {
|
|
303
|
+
const help = getValidationHelp('nonexistent-setting-xyz');
|
|
304
|
+
expect(help).toBeUndefined();
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
describe('getAutocompleteSuggestions — completion options', () => {
|
|
308
|
+
it('returns completion options for streaming', () => {
|
|
309
|
+
const suggestions = getAutocompleteSuggestions('streaming');
|
|
310
|
+
expect(suggestions).toBeDefined();
|
|
311
|
+
expect(suggestions?.length).toBeGreaterThan(0);
|
|
312
|
+
});
|
|
313
|
+
it('returns undefined for a setting without completions', () => {
|
|
314
|
+
const suggestions = getAutocompleteSuggestions('temperature');
|
|
315
|
+
// temperature has no enumValues or completionOptions
|
|
316
|
+
expect(suggestions).toBeUndefined();
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
describe('getProtectedSettingKeys — protected/hidden keys', () => {
|
|
320
|
+
it('includes auth-key in protected keys', () => {
|
|
321
|
+
const keys = getProtectedSettingKeys();
|
|
322
|
+
expect(keys).toContain('auth-key');
|
|
323
|
+
});
|
|
324
|
+
it('includes apiKey alias in protected keys', () => {
|
|
325
|
+
const keys = getProtectedSettingKeys();
|
|
326
|
+
expect(keys).toContain('apiKey');
|
|
327
|
+
});
|
|
328
|
+
it('includes auth-keyfile in protected keys', () => {
|
|
329
|
+
const keys = getProtectedSettingKeys();
|
|
330
|
+
expect(keys).toContain('auth-keyfile');
|
|
331
|
+
});
|
|
332
|
+
it('includes model in protected keys', () => {
|
|
333
|
+
const keys = getProtectedSettingKeys();
|
|
334
|
+
expect(keys).toContain('model');
|
|
335
|
+
});
|
|
336
|
+
it('does not include temperature (not provider-config)', () => {
|
|
337
|
+
const keys = getProtectedSettingKeys();
|
|
338
|
+
expect(keys).not.toContain('temperature');
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
describe('getProviderConfigKeys — provider config key enumeration', () => {
|
|
342
|
+
it('includes auth-key canonical', () => {
|
|
343
|
+
const keys = getProviderConfigKeys();
|
|
344
|
+
expect(keys).toContain('auth-key');
|
|
345
|
+
});
|
|
346
|
+
it('includes apiKey alias', () => {
|
|
347
|
+
const keys = getProviderConfigKeys();
|
|
348
|
+
expect(keys).toContain('apiKey');
|
|
349
|
+
});
|
|
350
|
+
it('includes auth-keyfile canonical', () => {
|
|
351
|
+
const keys = getProviderConfigKeys();
|
|
352
|
+
expect(keys).toContain('auth-keyfile');
|
|
353
|
+
});
|
|
354
|
+
it('includes apiKeyfile alias', () => {
|
|
355
|
+
const keys = getProviderConfigKeys();
|
|
356
|
+
expect(keys).toContain('apiKeyfile');
|
|
357
|
+
});
|
|
358
|
+
it('includes base-url', () => {
|
|
359
|
+
const keys = getProviderConfigKeys();
|
|
360
|
+
expect(keys).toContain('base-url');
|
|
361
|
+
});
|
|
362
|
+
it('includes model', () => {
|
|
363
|
+
const keys = getProviderConfigKeys();
|
|
364
|
+
expect(keys).toContain('model');
|
|
365
|
+
});
|
|
366
|
+
it('includes toolFormat', () => {
|
|
367
|
+
const keys = getProviderConfigKeys();
|
|
368
|
+
expect(keys).toContain('toolFormat');
|
|
369
|
+
});
|
|
370
|
+
it('does not include temperature (not provider-config)', () => {
|
|
371
|
+
const keys = getProviderConfigKeys();
|
|
372
|
+
expect(keys).not.toContain('temperature');
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
describe('getDirectSettingSpecs — direct setting specifications', () => {
|
|
376
|
+
it('returns an array', () => {
|
|
377
|
+
const specs = getDirectSettingSpecs();
|
|
378
|
+
expect(Array.isArray(specs)).toBe(true);
|
|
379
|
+
});
|
|
380
|
+
it('includes context-limit', () => {
|
|
381
|
+
const specs = getDirectSettingSpecs();
|
|
382
|
+
const found = specs.find((s) => s.value === 'context-limit');
|
|
383
|
+
expect(found?.value).toBe('context-limit');
|
|
384
|
+
expect(found?.hint).toBeTruthy();
|
|
385
|
+
});
|
|
386
|
+
it('includes streaming', () => {
|
|
387
|
+
const specs = getDirectSettingSpecs();
|
|
388
|
+
const found = specs.find((s) => s.value === 'streaming');
|
|
389
|
+
expect(found?.value).toBe('streaming');
|
|
390
|
+
expect(found?.hint).toBeTruthy();
|
|
391
|
+
});
|
|
392
|
+
it('includes reasoning.enabled', () => {
|
|
393
|
+
const specs = getDirectSettingSpecs();
|
|
394
|
+
const found = specs.find((s) => s.value === 'reasoning.enabled');
|
|
395
|
+
expect(found?.value).toBe('reasoning.enabled');
|
|
396
|
+
expect(found?.hint).toBeTruthy();
|
|
397
|
+
});
|
|
398
|
+
it('excludes temperature (model-param category)', () => {
|
|
399
|
+
const specs = getDirectSettingSpecs();
|
|
400
|
+
const found = specs.find((s) => s.value === 'temperature');
|
|
401
|
+
expect(found).toBeUndefined();
|
|
402
|
+
});
|
|
403
|
+
it('excludes custom-headers (custom-header category)', () => {
|
|
404
|
+
const specs = getDirectSettingSpecs();
|
|
405
|
+
const found = specs.find((s) => s.value === 'custom-headers');
|
|
406
|
+
expect(found).toBeUndefined();
|
|
407
|
+
});
|
|
408
|
+
it('excludes auth-key (provider-config category)', () => {
|
|
409
|
+
const specs = getDirectSettingSpecs();
|
|
410
|
+
const found = specs.find((s) => s.value === 'auth-key');
|
|
411
|
+
expect(found).toBeUndefined();
|
|
412
|
+
});
|
|
413
|
+
it('excludes apiKey alias from direct setting specs', () => {
|
|
414
|
+
const specs = getDirectSettingSpecs();
|
|
415
|
+
const found = specs.find((s) => s.value === 'apiKey');
|
|
416
|
+
expect(found).toBeUndefined();
|
|
417
|
+
});
|
|
418
|
+
it('provides a hint for each spec', () => {
|
|
419
|
+
const specs = getDirectSettingSpecs();
|
|
420
|
+
for (const spec of specs) {
|
|
421
|
+
expect(spec.hint).toBeTruthy();
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
});
|
|
425
|
+
describe('compression strategy values in registry', () => {
|
|
426
|
+
it('compression.strategy has enum type', () => {
|
|
427
|
+
const spec = getSettingSpec('compression.strategy');
|
|
428
|
+
expect(spec?.type).toBe('enum');
|
|
429
|
+
});
|
|
430
|
+
it('compression.strategy default is middle-out', () => {
|
|
431
|
+
const spec = getSettingSpec('compression.strategy');
|
|
432
|
+
expect(spec?.default).toBe('middle-out');
|
|
433
|
+
});
|
|
434
|
+
it('compression.strategy enumValues includes all expected strategies', () => {
|
|
435
|
+
const spec = getSettingSpec('compression.strategy');
|
|
436
|
+
for (const strategy of EXPECTED_COMPRESSION_STRATEGIES) {
|
|
437
|
+
expect(spec?.enumValues).toContain(strategy);
|
|
438
|
+
}
|
|
439
|
+
});
|
|
440
|
+
it('compression.strategy is persistable to profile', () => {
|
|
441
|
+
const spec = getSettingSpec('compression.strategy');
|
|
442
|
+
expect(spec?.persistToProfile).toBe(true);
|
|
443
|
+
});
|
|
444
|
+
it('compression.profile has type string', () => {
|
|
445
|
+
const spec = getSettingSpec('compression.profile');
|
|
446
|
+
expect(spec?.type).toBe('string');
|
|
447
|
+
});
|
|
448
|
+
it('compression.profile is persistable to profile', () => {
|
|
449
|
+
const spec = getSettingSpec('compression.profile');
|
|
450
|
+
expect(spec?.persistToProfile).toBe(true);
|
|
451
|
+
});
|
|
452
|
+
it('compression.strategy appears in direct setting specs', () => {
|
|
453
|
+
const specs = getDirectSettingSpecs();
|
|
454
|
+
const found = specs.find((s) => s.value === 'compression.strategy');
|
|
455
|
+
expect(found?.value).toBe('compression.strategy');
|
|
456
|
+
expect(found?.hint).toBeTruthy();
|
|
457
|
+
});
|
|
458
|
+
it('compression.profile appears in direct setting specs', () => {
|
|
459
|
+
const specs = getDirectSettingSpecs();
|
|
460
|
+
const found = specs.find((s) => s.value === 'compression.profile');
|
|
461
|
+
expect(found?.value).toBe('compression.profile');
|
|
462
|
+
expect(found?.hint).toBeTruthy();
|
|
463
|
+
});
|
|
464
|
+
it('each expected compression strategy validates successfully', () => {
|
|
465
|
+
for (const strategy of EXPECTED_COMPRESSION_STRATEGIES) {
|
|
466
|
+
const result = validateSetting('compression.strategy', strategy);
|
|
467
|
+
expect(result.success).toBe(true);
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
});
|
|
471
|
+
//# sourceMappingURL=settingsRegistry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settingsRegistry.test.js","sourceRoot":"","sources":["../../../src/__tests__/settingsRegistry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @plan PLAN-20260608-ISSUE1588.P04
|
|
3
|
+
* @requirement REQ-SVC-001
|
|
4
|
+
*
|
|
5
|
+
* Behavioral TDD tests for the settings service singleton functions.
|
|
6
|
+
*
|
|
7
|
+
* These tests verify ONLY settings-owned singleton state:
|
|
8
|
+
* getSettingsService, registerSettingsService, resetSettingsService.
|
|
9
|
+
*
|
|
10
|
+
* They MUST NOT import or reference core runtime context.
|
|
11
|
+
* Context creation/clearing assertions belong in core adapter tests (P06).
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @plan PLAN-20260608-ISSUE1588.P04
|
|
3
|
+
* @requirement REQ-SVC-001
|
|
4
|
+
*
|
|
5
|
+
* Behavioral TDD tests for the settings service singleton functions.
|
|
6
|
+
*
|
|
7
|
+
* These tests verify ONLY settings-owned singleton state:
|
|
8
|
+
* getSettingsService, registerSettingsService, resetSettingsService.
|
|
9
|
+
*
|
|
10
|
+
* They MUST NOT import or reference core runtime context.
|
|
11
|
+
* Context creation/clearing assertions belong in core adapter tests (P06).
|
|
12
|
+
*/
|
|
13
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
14
|
+
import { getSettingsService, registerSettingsService, resetSettingsService, } from '../settings/settingsServiceInstance.js';
|
|
15
|
+
import { SettingsService } from '../settings/SettingsService.js';
|
|
16
|
+
describe('getSettingsService — singleton retrieval', () => {
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
resetSettingsService();
|
|
19
|
+
});
|
|
20
|
+
it('throws when no service is registered', () => {
|
|
21
|
+
expect(() => getSettingsService()).toThrow('No SettingsService registered');
|
|
22
|
+
});
|
|
23
|
+
it('returns the registered service after registerSettingsService', () => {
|
|
24
|
+
const svc = new SettingsService();
|
|
25
|
+
registerSettingsService(svc);
|
|
26
|
+
const result = getSettingsService();
|
|
27
|
+
expect(result).toBe(svc);
|
|
28
|
+
});
|
|
29
|
+
it('returns the same instance on multiple getSettingsService calls', () => {
|
|
30
|
+
const svc = new SettingsService();
|
|
31
|
+
registerSettingsService(svc);
|
|
32
|
+
const first = getSettingsService();
|
|
33
|
+
const second = getSettingsService();
|
|
34
|
+
expect(first).toBe(second);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe('registerSettingsService — singleton registration', () => {
|
|
38
|
+
beforeEach(() => {
|
|
39
|
+
resetSettingsService();
|
|
40
|
+
});
|
|
41
|
+
it('replaces the previous singleton with a new one', () => {
|
|
42
|
+
const svc1 = new SettingsService();
|
|
43
|
+
const svc2 = new SettingsService();
|
|
44
|
+
registerSettingsService(svc1);
|
|
45
|
+
registerSettingsService(svc2);
|
|
46
|
+
expect(getSettingsService()).toBe(svc2);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe('resetSettingsService — singleton reset', () => {
|
|
50
|
+
beforeEach(() => {
|
|
51
|
+
resetSettingsService();
|
|
52
|
+
});
|
|
53
|
+
it('causes getSettingsService to throw after reset', () => {
|
|
54
|
+
const svc = new SettingsService();
|
|
55
|
+
registerSettingsService(svc);
|
|
56
|
+
resetSettingsService();
|
|
57
|
+
expect(() => getSettingsService()).toThrow('No SettingsService registered');
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=settingsServiceInstance.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settingsServiceInstance.test.js","sourceRoot":"","sources":["../../../src/__tests__/settingsServiceInstance.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACxD,UAAU,CAAC,GAAG,EAAE;QACd,oBAAoB,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,GAAG,GAAG,IAAI,eAAe,EAAE,CAAC;QAClC,uBAAuB,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,GAAG,GAAG,IAAI,eAAe,EAAE,CAAC;QAClC,uBAAuB,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAChE,UAAU,CAAC,GAAG,EAAE;QACd,oBAAoB,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;QACnC,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAC9B,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACtD,UAAU,CAAC,GAAG,EAAE;QACd,oBAAoB,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,GAAG,GAAG,IAAI,eAAe,EAAE,CAAC;QAClC,uBAAuB,CAAC,GAAG,CAAC,CAAC;QAC7B,oBAAoB,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @plan PLAN-20260608-ISSUE1588.P05
|
|
3
|
+
* @requirement REQ-SET-001
|
|
4
|
+
*
|
|
5
|
+
* Settings package public API barrel with real P05 implementations.
|
|
6
|
+
*/
|
|
7
|
+
export { SettingsService } from './settings/SettingsService.js';
|
|
8
|
+
export { resolveAlias, getSettingSpec, normalizeSetting, separateSettings, validateSetting, parseSetting, getProfilePersistableKeys, getSettingHelp, getCompletionOptions, getAllSettingKeys, getValidationHelp, getAutocompleteSuggestions, getProtectedSettingKeys, getProviderConfigKeys, getDirectSettingSpecs, SETTINGS_REGISTRY, } from './settings/settingsRegistry.js';
|
|
9
|
+
export type { ValidationResult, SettingSpec, SeparatedSettings, DirectSettingSpec, } from './settings/settingsRegistry.js';
|
|
10
|
+
export { getSettingsService, registerSettingsService, resetSettingsService, } from './settings/settingsServiceInstance.js';
|
|
11
|
+
export { ProfileManager } from './profiles/ProfileManager.js';
|
|
12
|
+
export type { Profile, StandardProfile, LoadBalancerProfile, ModelParams, EphemeralSettings, AuthConfig, } from './profiles/types.js';
|
|
13
|
+
export { AuthConfigSchema, isLoadBalancerProfile, isStandardProfile, hasAuthConfig, isOAuthProfile, } from './profiles/types.js';
|
|
14
|
+
export { Storage } from './storage/Storage.js';
|
|
15
|
+
export { LLXPRT_DIR, PROVIDER_ACCOUNTS_FILENAME, OAUTH_FILE, } from './storage/Storage.js';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @plan PLAN-20260608-ISSUE1588.P05
|
|
3
|
+
* @requirement REQ-SET-001
|
|
4
|
+
*
|
|
5
|
+
* Settings package public API barrel with real P05 implementations.
|
|
6
|
+
*/
|
|
7
|
+
export { SettingsService } from './settings/SettingsService.js';
|
|
8
|
+
export { resolveAlias, getSettingSpec, normalizeSetting, separateSettings, validateSetting, parseSetting, getProfilePersistableKeys, getSettingHelp, getCompletionOptions, getAllSettingKeys, getValidationHelp, getAutocompleteSuggestions, getProtectedSettingKeys, getProviderConfigKeys, getDirectSettingSpecs, SETTINGS_REGISTRY, } from './settings/settingsRegistry.js';
|
|
9
|
+
export { getSettingsService, registerSettingsService, resetSettingsService, } from './settings/settingsServiceInstance.js';
|
|
10
|
+
export { ProfileManager } from './profiles/ProfileManager.js';
|
|
11
|
+
export { AuthConfigSchema, isLoadBalancerProfile, isStandardProfile, hasAuthConfig, isOAuthProfile, } from './profiles/types.js';
|
|
12
|
+
export { Storage } from './storage/Storage.js';
|
|
13
|
+
export { LLXPRT_DIR, PROVIDER_ACCOUNTS_FILENAME, OAUTH_FILE, } from './storage/Storage.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,yBAAyB,EACzB,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,0BAA0B,EAC1B,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,gCAAgC,CAAC;AAQxC,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAS9D,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,cAAc,GACf,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EACL,UAAU,EACV,0BAA0B,EAC1B,UAAU,GACX,MAAM,sBAAsB,CAAC"}
|