feat(akl): implement Agent Knowledge Layer (AKL) - clean implementation

This commit is contained in:
mkorwel
2026-03-16 21:07:39 -07:00
parent 30271d64eb
commit 62e260be1d
32 changed files with 1554 additions and 45 deletions
+6
View File
@@ -90,6 +90,7 @@ export interface CliArgs {
includeDirectories: string[] | undefined;
screenReader: boolean | undefined;
useWriteTodos: boolean | undefined;
akl: boolean | undefined;
outputFormat: string | undefined;
fakeResponses: string | undefined;
recordResponses: string | undefined;
@@ -272,6 +273,10 @@ export async function parseArguments(
type: 'boolean',
description: 'Enable screen reader mode for accessibility.',
})
.option('akl', {
type: 'boolean',
description: 'Enable the Agent Knowledge Layer (AKL).',
})
.option('output-format', {
alias: 'o',
type: 'string',
@@ -835,6 +840,7 @@ export async function loadCliConfig(
truncateToolOutputThreshold: settings.tools?.truncateToolOutputThreshold,
eventEmitter: coreEvents,
useWriteTodos: argv.useWriteTodos ?? settings.useWriteTodos,
akl: argv.akl ?? settings.experimental?.akl,
output: {
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
format: (argv.outputFormat ?? settings.output?.format) as OutputFormat,
@@ -93,6 +93,11 @@ describe('ExtensionManager theme loading', () => {
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
const mockConfig = {
getAklEnabled: () => false,
getImportFormat: () => 'tree' as const,
getFileFilteringOptions: () => ({}),
getDiscoveryMaxDirs: () => 200,
getAklFilePaths: async () => [],
getEnableExtensionReloading: () => false,
getMcpClientManager: () => ({
startExtension: vi.fn().mockResolvedValue(undefined),
@@ -140,7 +145,6 @@ describe('ExtensionManager theme loading', () => {
getExtensions: () => [],
}),
isTrustedFolder: () => true,
getImportFormat: () => 'tree',
reloadSkills: vi.fn(),
} as unknown as Config;
@@ -192,13 +196,12 @@ describe('ExtensionManager theme loading', () => {
getExtensionLoader: () => ({
getExtensions: () => [],
}),
isTrustedFolder: () => true,
getImportFormat: () => 'tree',
getFileFilteringOptions: () => ({
respectGitIgnore: true,
respectGeminiIgnore: true,
}),
getAklEnabled: () => false,
getAklFilePaths: async () => [],
getImportFormat: () => 'tree' as const,
getFileFilteringOptions: () => ({}),
getDiscoveryMaxDirs: () => 200,
isTrustedFolder: () => true,
getMcpClientManager: () => ({
getMcpInstructions: () => '',
startExtension: vi.fn().mockResolvedValue(undefined),
+10
View File
@@ -1936,6 +1936,16 @@ const SETTINGS_SCHEMA = {
description: 'Enable task tracker tools.',
showInDialog: false,
},
akl: {
type: 'boolean',
label: 'Agent Knowledge Layer',
category: 'Experimental',
requiresRestart: true,
default: false,
description:
'Enable the Agent Knowledge Layer for persistent situational awareness.',
showInDialog: true,
},
modelSteering: {
type: 'boolean',
label: 'Model Steering',
+4 -2
View File
@@ -499,15 +499,17 @@ describe('gemini.tsx main function kitty protocol', () => {
allowedMcpServerNames: undefined,
allowedTools: undefined,
experimentalAcp: undefined,
acp: undefined,
extensions: undefined,
listExtensions: undefined,
resume: undefined,
includeDirectories: undefined,
screenReader: undefined,
useWriteTodos: undefined,
resume: undefined,
akl: undefined,
outputFormat: undefined,
listSessions: undefined,
deleteSession: undefined,
outputFormat: undefined,
fakeResponses: undefined,
recordResponses: undefined,
rawOutput: undefined,
+6 -3
View File
@@ -17,7 +17,6 @@ import {
* Creates a mocked Config object with default values and allows overrides.
*/
export const createMockConfig = (overrides: Partial<Config> = {}): Config =>
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
({
getSandbox: vi.fn(() => undefined),
getQuestion: vi.fn(() => ''),
@@ -170,6 +169,12 @@ export const createMockConfig = (overrides: Partial<Config> = {}): Config =>
getBlockedMcpServers: vi.fn().mockReturnValue([]),
getExperiments: vi.fn().mockReturnValue(undefined),
getHasAccessToPreviewModel: vi.fn().mockReturnValue(false),
getAklEnabled: vi.fn().mockReturnValue(false),
getAklDiscoveryService: vi.fn().mockReturnValue({}),
getActiveEpicId: vi.fn().mockReturnValue(undefined),
setActiveEpicId: vi.fn(),
getImportFormat: vi.fn().mockReturnValue('tree'),
getDiscoveryMaxDirs: vi.fn().mockReturnValue(200),
validatePathAccess: vi.fn().mockReturnValue(null),
getUseAlternateBuffer: vi.fn().mockReturnValue(false),
...overrides,
@@ -182,11 +187,9 @@ export function createMockSettings(
overrides: Record<string, unknown> = {},
): LoadedSettings {
const merged = createTestMergedSettings(
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
(overrides['merged'] as Partial<Settings>) || {},
);
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
return {
system: { settings: {} },
systemDefaults: { settings: {} },