mirror of
https://github.com/google-gemini/gemini-cli
synced 2026-04-21 13:37:17 +00:00
feat(config): split memoryManager flag into autoMemory (#25601)
Some checks failed
Testing: E2E (Chained) / Merge Queue Skipper (push) Has been cancelled
Testing: E2E (Chained) / download_repo_name (push) Has been cancelled
Testing: E2E (Chained) / Parse run context (push) Has been cancelled
Testing: E2E (Chained) / set_pending_status (push) Has been cancelled
Testing: E2E (Chained) / E2E Test (Linux) - sandbox:docker (push) Has been cancelled
Testing: E2E (Chained) / E2E Test (Linux) - sandbox:none (push) Has been cancelled
Testing: E2E (Chained) / E2E Test (macOS) (push) Has been cancelled
Testing: E2E (Chained) / Slow E2E - Win (push) Has been cancelled
Testing: E2E (Chained) / Evals (ALWAYS_PASSING) (push) Has been cancelled
Testing: E2E (Chained) / E2E (push) Has been cancelled
Testing: E2E (Chained) / set_workflow_status (push) Has been cancelled
Testing: CI / Merge Queue Skipper (push) Has been cancelled
Testing: CI / Lint (push) Has been cancelled
Testing: CI / Link Checker (push) Has been cancelled
Testing: CI / Test (Linux) - 20.x, cli (push) Has been cancelled
Testing: CI / Test (Linux) - 20.x, others (push) Has been cancelled
Testing: CI / Test (Linux) - 22.x, cli (push) Has been cancelled
Testing: CI / Test (Linux) - 22.x, others (push) Has been cancelled
Testing: CI / Test (Linux) - 24.x, cli (push) Has been cancelled
Testing: CI / Test (Linux) - 24.x, others (push) Has been cancelled
Testing: CI / Test (Mac) - 20.x, cli (push) Has been cancelled
Testing: CI / Test (Mac) - 20.x, others (push) Has been cancelled
Testing: CI / Test (Mac) - 22.x, cli (push) Has been cancelled
Testing: CI / Test (Mac) - 22.x, others (push) Has been cancelled
Testing: CI / Test (Mac) - 24.x, cli (push) Has been cancelled
Testing: CI / Test (Mac) - 24.x, others (push) Has been cancelled
Testing: CI / CodeQL (push) Has been cancelled
Testing: CI / Check Bundle Size (push) Has been cancelled
Testing: CI / Slow Test - Win - cli (push) Has been cancelled
Testing: CI / Slow Test - Win - others (push) Has been cancelled
Testing: CI / CI (push) Has been cancelled
Trigger Docs Rebuild / trigger-rebuild (push) Has been cancelled
Links / linkChecker (push) Has been cancelled
On Merge Smoke Test / smoke-test (push) Has been cancelled
Some checks failed
Testing: E2E (Chained) / Merge Queue Skipper (push) Has been cancelled
Testing: E2E (Chained) / download_repo_name (push) Has been cancelled
Testing: E2E (Chained) / Parse run context (push) Has been cancelled
Testing: E2E (Chained) / set_pending_status (push) Has been cancelled
Testing: E2E (Chained) / E2E Test (Linux) - sandbox:docker (push) Has been cancelled
Testing: E2E (Chained) / E2E Test (Linux) - sandbox:none (push) Has been cancelled
Testing: E2E (Chained) / E2E Test (macOS) (push) Has been cancelled
Testing: E2E (Chained) / Slow E2E - Win (push) Has been cancelled
Testing: E2E (Chained) / Evals (ALWAYS_PASSING) (push) Has been cancelled
Testing: E2E (Chained) / E2E (push) Has been cancelled
Testing: E2E (Chained) / set_workflow_status (push) Has been cancelled
Testing: CI / Merge Queue Skipper (push) Has been cancelled
Testing: CI / Lint (push) Has been cancelled
Testing: CI / Link Checker (push) Has been cancelled
Testing: CI / Test (Linux) - 20.x, cli (push) Has been cancelled
Testing: CI / Test (Linux) - 20.x, others (push) Has been cancelled
Testing: CI / Test (Linux) - 22.x, cli (push) Has been cancelled
Testing: CI / Test (Linux) - 22.x, others (push) Has been cancelled
Testing: CI / Test (Linux) - 24.x, cli (push) Has been cancelled
Testing: CI / Test (Linux) - 24.x, others (push) Has been cancelled
Testing: CI / Test (Mac) - 20.x, cli (push) Has been cancelled
Testing: CI / Test (Mac) - 20.x, others (push) Has been cancelled
Testing: CI / Test (Mac) - 22.x, cli (push) Has been cancelled
Testing: CI / Test (Mac) - 22.x, others (push) Has been cancelled
Testing: CI / Test (Mac) - 24.x, cli (push) Has been cancelled
Testing: CI / Test (Mac) - 24.x, others (push) Has been cancelled
Testing: CI / CodeQL (push) Has been cancelled
Testing: CI / Check Bundle Size (push) Has been cancelled
Testing: CI / Slow Test - Win - cli (push) Has been cancelled
Testing: CI / Slow Test - Win - others (push) Has been cancelled
Testing: CI / CI (push) Has been cancelled
Trigger Docs Rebuild / trigger-rebuild (push) Has been cancelled
Links / linkChecker (push) Has been cancelled
On Merge Smoke Test / smoke-test (push) Has been cancelled
This commit is contained in:
parent
220888ac2d
commit
8573650253
16 changed files with 239 additions and 12 deletions
143
docs/cli/auto-memory.md
Normal file
143
docs/cli/auto-memory.md
Normal file
|
|
@ -0,0 +1,143 @@
|
||||||
|
# Auto Memory
|
||||||
|
|
||||||
|
Auto Memory is an experimental feature that mines your past Gemini CLI sessions
|
||||||
|
in the background and turns recurring workflows into reusable
|
||||||
|
[Agent Skills](./skills.md). You review, accept, or discard each extracted skill
|
||||||
|
before it becomes available to future sessions.
|
||||||
|
|
||||||
|
<!-- prettier-ignore -->
|
||||||
|
> [!NOTE]
|
||||||
|
> This is an experimental feature currently under active development.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Every session you run with Gemini CLI is recorded locally as a transcript. Auto
|
||||||
|
Memory scans those transcripts for procedural patterns that recur across
|
||||||
|
sessions, then drafts each pattern as a `SKILL.md` file in a project-local
|
||||||
|
inbox. You inspect the draft, decide whether it captures real expertise, and
|
||||||
|
promote it to your global or workspace skills directory if you want it.
|
||||||
|
|
||||||
|
You'll use Auto Memory when you want to:
|
||||||
|
|
||||||
|
- **Capture team workflows** that you find yourself walking the agent through
|
||||||
|
more than once.
|
||||||
|
- **Codify hard-won fixes** for project-specific landmines so future sessions
|
||||||
|
avoid them.
|
||||||
|
- **Bootstrap a skills library** without writing every `SKILL.md` by hand.
|
||||||
|
|
||||||
|
Auto Memory complements—but does not replace—the
|
||||||
|
[`save_memory` tool](../tools/memory.md), which captures single facts into
|
||||||
|
`GEMINI.md`. Auto Memory captures multi-step procedures into skills.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- Gemini CLI installed and authenticated.
|
||||||
|
- At least 10 user messages across recent, idle sessions in the project. Auto
|
||||||
|
Memory ignores active or trivial sessions.
|
||||||
|
|
||||||
|
## How to enable Auto Memory
|
||||||
|
|
||||||
|
Auto Memory is off by default. Enable it in your settings file:
|
||||||
|
|
||||||
|
1. Open your global settings file at `~/.gemini/settings.json`. If you only
|
||||||
|
want Auto Memory in one project, edit `.gemini/settings.json` in that
|
||||||
|
project instead.
|
||||||
|
|
||||||
|
2. Add the experimental flag:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"experimental": {
|
||||||
|
"autoMemory": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Restart Gemini CLI. The flag requires a restart because the extraction
|
||||||
|
service starts during session boot.
|
||||||
|
|
||||||
|
## How Auto Memory works
|
||||||
|
|
||||||
|
Auto Memory runs as a background task on session startup. It does not block the
|
||||||
|
UI, consume your interactive turns, or surface tool prompts.
|
||||||
|
|
||||||
|
1. **Eligibility scan.** The service indexes recent sessions from
|
||||||
|
`~/.gemini/tmp/<project>/chats/`. Sessions are eligible only if they have
|
||||||
|
been idle for at least three hours and contain at least 10 user messages.
|
||||||
|
2. **Lock acquisition.** A lock file in the project's memory directory
|
||||||
|
coordinates across multiple CLI instances so extraction runs at most once at
|
||||||
|
a time.
|
||||||
|
3. **Sub-agent extraction.** A specialized sub-agent (named `confucius`)
|
||||||
|
reviews the session index, reads any sessions that look like they contain
|
||||||
|
repeated procedural workflows, and drafts new `SKILL.md` files. Its
|
||||||
|
instructions tell it to default to creating zero skills unless the evidence
|
||||||
|
is strong, so most runs produce no inbox items.
|
||||||
|
4. **Patch validation.** If the sub-agent proposes edits to skills outside the
|
||||||
|
inbox (for example, an existing global skill), it writes a unified diff
|
||||||
|
`.patch` file. Auto Memory dry-runs each patch and discards any that do not
|
||||||
|
apply cleanly.
|
||||||
|
5. **Notification.** When a run produces new skills or patches, Gemini CLI
|
||||||
|
surfaces an inline message telling you how many items are waiting.
|
||||||
|
|
||||||
|
## How to review extracted skills
|
||||||
|
|
||||||
|
Use the `/memory inbox` slash command to open the inbox dialog at any time:
|
||||||
|
|
||||||
|
**Command:** `/memory inbox`
|
||||||
|
|
||||||
|
The dialog lists each draft skill with its name, description, and source
|
||||||
|
sessions. From there you can:
|
||||||
|
|
||||||
|
- **Read** the full `SKILL.md` body before deciding.
|
||||||
|
- **Promote** a skill to your user (`~/.gemini/skills/`) or workspace
|
||||||
|
(`.gemini/skills/`) directory.
|
||||||
|
- **Discard** a skill you do not want.
|
||||||
|
- **Apply** or reject a `.patch` proposal against an existing skill.
|
||||||
|
|
||||||
|
Promoted skills become discoverable in the next session and follow the standard
|
||||||
|
[skill discovery precedence](./skills.md#skill-discovery-tiers).
|
||||||
|
|
||||||
|
## How to disable Auto Memory
|
||||||
|
|
||||||
|
To turn off background extraction, set the flag back to `false` in your settings
|
||||||
|
file and restart Gemini CLI:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"experimental": {
|
||||||
|
"autoMemory": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Disabling the flag stops the background service immediately on the next session
|
||||||
|
start. Existing inbox items remain on disk; you can either drain them with
|
||||||
|
`/memory inbox` first or remove the project memory directory manually.
|
||||||
|
|
||||||
|
## Data and privacy
|
||||||
|
|
||||||
|
- Auto Memory only reads session files that already exist locally on your
|
||||||
|
machine. Nothing is uploaded to Gemini outside the normal API calls the
|
||||||
|
extraction sub-agent makes during its run.
|
||||||
|
- The sub-agent is instructed to redact secrets, tokens, and credentials it
|
||||||
|
encounters and to never copy large tool outputs verbatim.
|
||||||
|
- Drafted skills live in your project's memory directory until you promote or
|
||||||
|
discard them. They are not automatically loaded into any session.
|
||||||
|
|
||||||
|
## Limitations
|
||||||
|
|
||||||
|
- The sub-agent runs on a preview Gemini Flash model. Extraction quality depends
|
||||||
|
on the model's ability to recognize durable patterns versus one-off incidents.
|
||||||
|
- Auto Memory does not extract skills from the current session. It only
|
||||||
|
considers sessions that have been idle for three hours or more.
|
||||||
|
- Inbox items are stored per project. Skills extracted in one workspace are not
|
||||||
|
visible from another until you promote them to the user-scope skills
|
||||||
|
directory.
|
||||||
|
|
||||||
|
## Next steps
|
||||||
|
|
||||||
|
- Learn how skills are discovered and activated in [Agent Skills](./skills.md).
|
||||||
|
- Explore the [memory management tutorial](./tutorials/memory-management.md) for
|
||||||
|
the complementary `save_memory` and `GEMINI.md` workflows.
|
||||||
|
- Review the experimental settings catalog in
|
||||||
|
[Settings](./settings.md#experimental).
|
||||||
|
|
@ -169,6 +169,7 @@ they appear in the UI.
|
||||||
| Model Steering | `experimental.modelSteering` | Enable model steering (user hints) to guide the model during tool execution. | `false` |
|
| Model Steering | `experimental.modelSteering` | Enable model steering (user hints) to guide the model during tool execution. | `false` |
|
||||||
| Direct Web Fetch | `experimental.directWebFetch` | Enable web fetch behavior that bypasses LLM summarization. | `false` |
|
| Direct Web Fetch | `experimental.directWebFetch` | Enable web fetch behavior that bypasses LLM summarization. | `false` |
|
||||||
| Memory Manager Agent | `experimental.memoryManager` | Replace the built-in save_memory tool with a memory manager subagent that supports adding, removing, de-duplicating, and organizing memories. | `false` |
|
| Memory Manager Agent | `experimental.memoryManager` | Replace the built-in save_memory tool with a memory manager subagent that supports adding, removing, de-duplicating, and organizing memories. | `false` |
|
||||||
|
| Auto Memory | `experimental.autoMemory` | Automatically extract reusable skills from past sessions in the background. Review results with /memory inbox. | `false` |
|
||||||
| Use the generalist profile to manage agent contexts. | `experimental.generalistProfile` | Suitable for general coding and software development tasks. | `false` |
|
| Use the generalist profile to manage agent contexts. | `experimental.generalistProfile` | Suitable for general coding and software development tasks. | `false` |
|
||||||
| Enable Context Management | `experimental.contextManagement` | Enable logic for context management. | `false` |
|
| Enable Context Management | `experimental.contextManagement` | Enable logic for context management. | `false` |
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -124,3 +124,5 @@ immediately. Force a reload with:
|
||||||
- Explore the [Command reference](../../reference/commands.md) for more
|
- Explore the [Command reference](../../reference/commands.md) for more
|
||||||
`/memory` options.
|
`/memory` options.
|
||||||
- Read the technical spec for [Project context](../../cli/gemini-md.md).
|
- Read the technical spec for [Project context](../../cli/gemini-md.md).
|
||||||
|
- Try the experimental [Auto Memory](../auto-memory.md) feature to extract
|
||||||
|
reusable skills from your past sessions automatically.
|
||||||
|
|
|
||||||
|
|
@ -1729,6 +1729,12 @@ their corresponding top-level category object in your `settings.json` file.
|
||||||
- **Default:** `false`
|
- **Default:** `false`
|
||||||
- **Requires restart:** Yes
|
- **Requires restart:** Yes
|
||||||
|
|
||||||
|
- **`experimental.autoMemory`** (boolean):
|
||||||
|
- **Description:** Automatically extract reusable skills from past sessions in
|
||||||
|
the background. Review results with /memory inbox.
|
||||||
|
- **Default:** `false`
|
||||||
|
- **Requires restart:** Yes
|
||||||
|
|
||||||
- **`experimental.generalistProfile`** (boolean):
|
- **`experimental.generalistProfile`** (boolean):
|
||||||
- **Description:** Suitable for general coding and software development tasks.
|
- **Description:** Suitable for general coding and software development tasks.
|
||||||
- **Default:** `false`
|
- **Default:** `false`
|
||||||
|
|
|
||||||
|
|
@ -96,6 +96,11 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{ "label": "Agent Skills", "slug": "docs/cli/skills" },
|
{ "label": "Agent Skills", "slug": "docs/cli/skills" },
|
||||||
|
{
|
||||||
|
"label": "Auto Memory",
|
||||||
|
"badge": "🔬",
|
||||||
|
"slug": "docs/cli/auto-memory"
|
||||||
|
},
|
||||||
{ "label": "Checkpointing", "slug": "docs/cli/checkpointing" },
|
{ "label": "Checkpointing", "slug": "docs/cli/checkpointing" },
|
||||||
{ "label": "Headless mode", "slug": "docs/cli/headless" },
|
{ "label": "Headless mode", "slug": "docs/cli/headless" },
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -149,12 +149,12 @@ async function readSkillBodies(skillsDir: string): Promise<string[]> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shared configOverrides for all skill extraction component evals.
|
* Shared configOverrides for all skill extraction component evals.
|
||||||
* - experimentalMemoryManager: enables the memory extraction pipeline.
|
* - experimentalAutoMemory: enables the Auto Memory skill extraction pipeline.
|
||||||
* - approvalMode: YOLO auto-approves tool calls (write_file, read_file) so the
|
* - approvalMode: YOLO auto-approves tool calls (write_file, read_file) so the
|
||||||
* background agent can execute without interactive confirmation.
|
* background agent can execute without interactive confirmation.
|
||||||
*/
|
*/
|
||||||
const EXTRACTION_CONFIG_OVERRIDES = {
|
const EXTRACTION_CONFIG_OVERRIDES = {
|
||||||
experimentalMemoryManager: true,
|
experimentalAutoMemory: true,
|
||||||
approvalMode: ApprovalMode.YOLO,
|
approvalMode: ApprovalMode.YOLO,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -135,10 +135,10 @@ export class InboxMemoryCommand implements Command {
|
||||||
context: CommandContext,
|
context: CommandContext,
|
||||||
_: string[],
|
_: string[],
|
||||||
): Promise<CommandExecutionResponse> {
|
): Promise<CommandExecutionResponse> {
|
||||||
if (!context.agentContext.config.isMemoryManagerEnabled()) {
|
if (!context.agentContext.config.isAutoMemoryEnabled()) {
|
||||||
return {
|
return {
|
||||||
name: this.name,
|
name: this.name,
|
||||||
data: 'The memory inbox requires the experimental memory manager. Enable it with: experimental.memoryManager = true in settings.',
|
data: 'The memory inbox requires Auto Memory. Enable it with: experimental.autoMemory = true in settings.',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -990,6 +990,7 @@ export async function loadCliConfig(
|
||||||
disabledSkills: settings.skills?.disabled,
|
disabledSkills: settings.skills?.disabled,
|
||||||
experimentalJitContext: settings.experimental?.jitContext,
|
experimentalJitContext: settings.experimental?.jitContext,
|
||||||
experimentalMemoryManager: settings.experimental?.memoryManager,
|
experimentalMemoryManager: settings.experimental?.memoryManager,
|
||||||
|
experimentalAutoMemory: settings.experimental?.autoMemory,
|
||||||
contextManagement,
|
contextManagement,
|
||||||
modelSteering: settings.experimental?.modelSteering,
|
modelSteering: settings.experimental?.modelSteering,
|
||||||
topicUpdateNarration:
|
topicUpdateNarration:
|
||||||
|
|
|
||||||
|
|
@ -2213,6 +2213,16 @@ const SETTINGS_SCHEMA = {
|
||||||
'Replace the built-in save_memory tool with a memory manager subagent that supports adding, removing, de-duplicating, and organizing memories.',
|
'Replace the built-in save_memory tool with a memory manager subagent that supports adding, removing, de-duplicating, and organizing memories.',
|
||||||
showInDialog: true,
|
showInDialog: true,
|
||||||
},
|
},
|
||||||
|
autoMemory: {
|
||||||
|
type: 'boolean',
|
||||||
|
label: 'Auto Memory',
|
||||||
|
category: 'Experimental',
|
||||||
|
requiresRestart: true,
|
||||||
|
default: false,
|
||||||
|
description:
|
||||||
|
'Automatically extract reusable skills from past sessions in the background. Review results with /memory inbox.',
|
||||||
|
showInDialog: true,
|
||||||
|
},
|
||||||
generalistProfile: {
|
generalistProfile: {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
label: 'Use the generalist profile to manage agent contexts.',
|
label: 'Use the generalist profile to manage agent contexts.',
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@ export const createMockConfig = (overrides: Partial<Config> = {}): Config =>
|
||||||
fireSessionStartEvent: vi.fn().mockResolvedValue(undefined),
|
fireSessionStartEvent: vi.fn().mockResolvedValue(undefined),
|
||||||
})),
|
})),
|
||||||
isMemoryManagerEnabled: vi.fn(() => false),
|
isMemoryManagerEnabled: vi.fn(() => false),
|
||||||
|
isAutoMemoryEnabled: vi.fn(() => false),
|
||||||
getListExtensions: vi.fn(() => false),
|
getListExtensions: vi.fn(() => false),
|
||||||
getExtensions: vi.fn(() => []),
|
getExtensions: vi.fn(() => []),
|
||||||
getListSessions: vi.fn(() => false),
|
getListSessions: vi.fn(() => false),
|
||||||
|
|
|
||||||
|
|
@ -486,8 +486,8 @@ export const AppContainer = (props: AppContainerProps) => {
|
||||||
setConfigInitialized(true);
|
setConfigInitialized(true);
|
||||||
startupProfiler.flush(config);
|
startupProfiler.flush(config);
|
||||||
|
|
||||||
// Fire-and-forget memory service (skill extraction from past sessions)
|
// Fire-and-forget Auto Memory service (skill extraction from past sessions)
|
||||||
if (config.isMemoryManagerEnabled()) {
|
if (config.isAutoMemoryEnabled()) {
|
||||||
startMemoryService(config).catch((e) => {
|
startMemoryService(config).catch((e) => {
|
||||||
debugLogger.error('Failed to start memory service:', e);
|
debugLogger.error('Failed to start memory service:', e);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -473,7 +473,7 @@ describe('memoryCommand', () => {
|
||||||
|
|
||||||
const mockConfig = {
|
const mockConfig = {
|
||||||
reloadSkills: vi.fn(),
|
reloadSkills: vi.fn(),
|
||||||
isMemoryManagerEnabled: vi.fn().mockReturnValue(true),
|
isAutoMemoryEnabled: vi.fn().mockReturnValue(true),
|
||||||
};
|
};
|
||||||
const context = createMockCommandContext({
|
const context = createMockCommandContext({
|
||||||
services: {
|
services: {
|
||||||
|
|
@ -491,11 +491,11 @@ describe('memoryCommand', () => {
|
||||||
expect(result).toHaveProperty('component');
|
expect(result).toHaveProperty('component');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return info message when memory manager is disabled', () => {
|
it('should return info message when auto memory is disabled', () => {
|
||||||
if (!inboxCommand.action) throw new Error('Command has no action');
|
if (!inboxCommand.action) throw new Error('Command has no action');
|
||||||
|
|
||||||
const mockConfig = {
|
const mockConfig = {
|
||||||
isMemoryManagerEnabled: vi.fn().mockReturnValue(false),
|
isAutoMemoryEnabled: vi.fn().mockReturnValue(false),
|
||||||
};
|
};
|
||||||
const context = createMockCommandContext({
|
const context = createMockCommandContext({
|
||||||
services: {
|
services: {
|
||||||
|
|
@ -509,7 +509,7 @@ describe('memoryCommand', () => {
|
||||||
type: 'message',
|
type: 'message',
|
||||||
messageType: 'info',
|
messageType: 'info',
|
||||||
content:
|
content:
|
||||||
'The memory inbox requires the experimental memory manager. Enable it with: experimental.memoryManager = true in settings.',
|
'The memory inbox requires Auto Memory. Enable it with: experimental.autoMemory = true in settings.',
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -145,12 +145,12 @@ export const memoryCommand: SlashCommand = {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!config.isMemoryManagerEnabled()) {
|
if (!config.isAutoMemoryEnabled()) {
|
||||||
return {
|
return {
|
||||||
type: 'message',
|
type: 'message',
|
||||||
messageType: 'info',
|
messageType: 'info',
|
||||||
content:
|
content:
|
||||||
'The memory inbox requires the experimental memory manager. Enable it with: experimental.memoryManager = true in settings.',
|
'The memory inbox requires Auto Memory. Enable it with: experimental.autoMemory = true in settings.',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3443,6 +3443,50 @@ describe('Config JIT Initialization', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('isAutoMemoryEnabled', () => {
|
||||||
|
it('should default to false', () => {
|
||||||
|
const params: ConfigParameters = {
|
||||||
|
sessionId: 'test-session',
|
||||||
|
targetDir: '/tmp/test',
|
||||||
|
debugMode: false,
|
||||||
|
model: 'test-model',
|
||||||
|
cwd: '/tmp/test',
|
||||||
|
};
|
||||||
|
|
||||||
|
config = new Config(params);
|
||||||
|
expect(config.isAutoMemoryEnabled()).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return true when experimentalAutoMemory is true', () => {
|
||||||
|
const params: ConfigParameters = {
|
||||||
|
sessionId: 'test-session',
|
||||||
|
targetDir: '/tmp/test',
|
||||||
|
debugMode: false,
|
||||||
|
model: 'test-model',
|
||||||
|
cwd: '/tmp/test',
|
||||||
|
experimentalAutoMemory: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
config = new Config(params);
|
||||||
|
expect(config.isAutoMemoryEnabled()).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be independent of experimentalMemoryManager', () => {
|
||||||
|
const params: ConfigParameters = {
|
||||||
|
sessionId: 'test-session',
|
||||||
|
targetDir: '/tmp/test',
|
||||||
|
debugMode: false,
|
||||||
|
model: 'test-model',
|
||||||
|
cwd: '/tmp/test',
|
||||||
|
experimentalMemoryManager: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
config = new Config(params);
|
||||||
|
expect(config.isMemoryManagerEnabled()).toBe(true);
|
||||||
|
expect(config.isAutoMemoryEnabled()).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('reloadSkills', () => {
|
describe('reloadSkills', () => {
|
||||||
it('should refresh disabledSkills and re-register ActivateSkillTool when skills exist', async () => {
|
it('should refresh disabledSkills and re-register ActivateSkillTool when skills exist', async () => {
|
||||||
const mockOnReload = vi.fn().mockResolvedValue({
|
const mockOnReload = vi.fn().mockResolvedValue({
|
||||||
|
|
|
||||||
|
|
@ -701,6 +701,7 @@ export interface ConfigParameters {
|
||||||
experimentalJitContext?: boolean;
|
experimentalJitContext?: boolean;
|
||||||
autoDistillation?: boolean;
|
autoDistillation?: boolean;
|
||||||
experimentalMemoryManager?: boolean;
|
experimentalMemoryManager?: boolean;
|
||||||
|
experimentalAutoMemory?: boolean;
|
||||||
experimentalContextManagementConfig?: string;
|
experimentalContextManagementConfig?: string;
|
||||||
experimentalAgentHistoryTruncation?: boolean;
|
experimentalAgentHistoryTruncation?: boolean;
|
||||||
experimentalAgentHistoryTruncationThreshold?: number;
|
experimentalAgentHistoryTruncationThreshold?: number;
|
||||||
|
|
@ -942,6 +943,7 @@ export class Config implements McpContext, AgentLoopContext {
|
||||||
private readonly adminSkillsEnabled: boolean;
|
private readonly adminSkillsEnabled: boolean;
|
||||||
private readonly experimentalJitContext: boolean;
|
private readonly experimentalJitContext: boolean;
|
||||||
private readonly experimentalMemoryManager: boolean;
|
private readonly experimentalMemoryManager: boolean;
|
||||||
|
private readonly experimentalAutoMemory: boolean;
|
||||||
private readonly experimentalContextManagementConfig?: string;
|
private readonly experimentalContextManagementConfig?: string;
|
||||||
private readonly memoryBoundaryMarkers: readonly string[];
|
private readonly memoryBoundaryMarkers: readonly string[];
|
||||||
private readonly topicUpdateNarration: boolean;
|
private readonly topicUpdateNarration: boolean;
|
||||||
|
|
@ -1154,6 +1156,7 @@ export class Config implements McpContext, AgentLoopContext {
|
||||||
|
|
||||||
this.experimentalJitContext = params.experimentalJitContext ?? false;
|
this.experimentalJitContext = params.experimentalJitContext ?? false;
|
||||||
this.experimentalMemoryManager = params.experimentalMemoryManager ?? false;
|
this.experimentalMemoryManager = params.experimentalMemoryManager ?? false;
|
||||||
|
this.experimentalAutoMemory = params.experimentalAutoMemory ?? false;
|
||||||
this.experimentalContextManagementConfig =
|
this.experimentalContextManagementConfig =
|
||||||
params.experimentalContextManagementConfig;
|
params.experimentalContextManagementConfig;
|
||||||
this.memoryBoundaryMarkers = params.memoryBoundaryMarkers ?? ['.git'];
|
this.memoryBoundaryMarkers = params.memoryBoundaryMarkers ?? ['.git'];
|
||||||
|
|
@ -2486,6 +2489,10 @@ export class Config implements McpContext, AgentLoopContext {
|
||||||
return this.experimentalMemoryManager;
|
return this.experimentalMemoryManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isAutoMemoryEnabled(): boolean {
|
||||||
|
return this.experimentalAutoMemory;
|
||||||
|
}
|
||||||
|
|
||||||
getExperimentalContextManagementConfig(): string | undefined {
|
getExperimentalContextManagementConfig(): string | undefined {
|
||||||
return this.experimentalContextManagementConfig;
|
return this.experimentalContextManagementConfig;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2954,6 +2954,13 @@
|
||||||
"default": false,
|
"default": false,
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
},
|
},
|
||||||
|
"autoMemory": {
|
||||||
|
"title": "Auto Memory",
|
||||||
|
"description": "Automatically extract reusable skills from past sessions in the background. Review results with /memory inbox.",
|
||||||
|
"markdownDescription": "Automatically extract reusable skills from past sessions in the background. Review results with /memory inbox.\n\n- Category: `Experimental`\n- Requires restart: `yes`\n- Default: `false`",
|
||||||
|
"default": false,
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
"generalistProfile": {
|
"generalistProfile": {
|
||||||
"title": "Use the generalist profile to manage agent contexts.",
|
"title": "Use the generalist profile to manage agent contexts.",
|
||||||
"description": "Suitable for general coding and software development tasks.",
|
"description": "Suitable for general coding and software development tasks.",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue