mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-06-10 19:37:17 -07:00
be4bee5f1a
This commit transitions the Context Manager to a statically-typed, functional pipeline architecture while strictly preserving dynamic hyperparameter capabilities via JSON Sidecar configs.
Key Changes:
- **Functional Processors:** Processors are now pure closure-based HOFs returning a clean `{ id, name, process }` interface, eliminating pseudo-class Object.assign hacks.
- **Named Configurations:** The `SidecarConfig` schema now validates a dictionary of named `processorOptions`.
- **Static Pipeline Wiring:** `profiles.ts` hardcodes the execution order of pipelines in TS, injecting dynamically-loaded (and pre-validated) hyperparameter overrides by looking up their named configuration identifier.
- **Deep Validation:** `schema.ts` dynamically flattens the `SchemaRegistry` using `oneOf` blocks, allowing external JSON validators (like IDEs) to natively understand and validate context hyperparameter schemas.
85 lines
2.9 KiB
TypeScript
85 lines
2.9 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright 2026 Google LLC
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
import { describe, it, expect, beforeEach } from 'vitest';
|
|
import { SidecarLoader } from './SidecarLoader.js';
|
|
import { defaultSidecarProfile } from './profiles.js';
|
|
import { SidecarRegistry } from './registry.js';
|
|
import { InMemoryFileSystem } from '../system/InMemoryFileSystem.js';
|
|
import type { Config } from 'src/config/config.js';
|
|
|
|
describe('SidecarLoader (Fake FS)', () => {
|
|
let fileSystem: InMemoryFileSystem;
|
|
let registry: SidecarRegistry;
|
|
|
|
beforeEach(() => {
|
|
fileSystem = new InMemoryFileSystem();
|
|
registry = new SidecarRegistry();
|
|
registry.registerProcessor({ id: 'NodeTruncation', schema: { type: 'object', properties: { maxTokens: { type: 'number' } } }});
|
|
});
|
|
|
|
const mockConfig = {
|
|
getExperimentalContextSidecarConfig: () => '/path/to/sidecar.json',
|
|
} as unknown as Config;
|
|
|
|
it('returns default profile if file does not exist', () => {
|
|
const result = SidecarLoader.fromConfig(mockConfig, registry, fileSystem);
|
|
expect(result).toBe(defaultSidecarProfile);
|
|
});
|
|
|
|
it('returns default profile if file exists but is 0 bytes', () => {
|
|
fileSystem.setFile('/path/to/sidecar.json', '');
|
|
const result = SidecarLoader.fromConfig(mockConfig, registry, fileSystem);
|
|
expect(result).toBe(defaultSidecarProfile);
|
|
});
|
|
|
|
it('throws an error if file is empty whitespace', () => {
|
|
fileSystem.setFile('/path/to/sidecar.json', ' \n ');
|
|
expect(() =>
|
|
SidecarLoader.fromConfig(mockConfig, registry, fileSystem),
|
|
).toThrow('is empty');
|
|
});
|
|
|
|
it('returns parsed config if file is valid', () => {
|
|
const validConfig = {
|
|
budget: { retainedTokens: 1000, maxTokens: 2000 },
|
|
processorOptions: {
|
|
myTruncation: {
|
|
type: 'NodeTruncation',
|
|
options: { maxTokens: 500 }
|
|
}
|
|
}
|
|
};
|
|
fileSystem.setFile('/path/to/sidecar.json', JSON.stringify(validConfig));
|
|
const result = SidecarLoader.fromConfig(mockConfig, registry, fileSystem);
|
|
expect(result.config.budget?.maxTokens).toBe(2000);
|
|
expect(result.config.processorOptions?.['myTruncation']).toBeDefined();
|
|
});
|
|
|
|
it('throws validation error if processorOptions contains invalid data for the schema', () => {
|
|
const invalidConfig = {
|
|
budget: { retainedTokens: 1000, maxTokens: 2000 },
|
|
processorOptions: {
|
|
myTruncation: {
|
|
type: 'NodeTruncation',
|
|
options: { maxTokens: "this should be a number" }
|
|
}
|
|
}
|
|
};
|
|
fileSystem.setFile('/path/to/sidecar.json', JSON.stringify(invalidConfig));
|
|
expect(() =>
|
|
SidecarLoader.fromConfig(mockConfig, registry, fileSystem),
|
|
).toThrow('Validation error');
|
|
});
|
|
|
|
it('throws validation error if file is empty whitespace', () => {
|
|
fileSystem.setFile('/path/to/sidecar.json', ' \n ');
|
|
expect(() =>
|
|
SidecarLoader.fromConfig(mockConfig, registry, fileSystem),
|
|
).toThrow('is empty');
|
|
});
|
|
});
|