Skip to content

Commit 5306f2f

Browse files
committed
refactored memory agent
1 parent 35f070a commit 5306f2f

23 files changed

+1636
-86
lines changed

front_end/panels/ai_chat/BUILD.gn

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ devtools_module("ai_chat") {
6262
"ui/settings/advanced/VectorDBSettings.ts",
6363
"ui/settings/advanced/TracingSettings.ts",
6464
"ui/settings/advanced/EvaluationSettings.ts",
65+
"ui/settings/advanced/MemorySettings.ts",
6566
"ui/PromptEditDialog.ts",
6667
"ui/EvaluationDialog.ts",
6768
"ui/WebAppCodeViewer.ts",
@@ -77,6 +78,11 @@ devtools_module("ai_chat") {
7778
"persistence/ConversationTypes.ts",
7879
"persistence/ConversationStorageManager.ts",
7980
"persistence/ConversationManager.ts",
81+
"memory/types.ts",
82+
"memory/MemoryModule.ts",
83+
"memory/MemoryBlockManager.ts",
84+
"memory/MemoryAgentConfig.ts",
85+
"memory/index.ts",
8086
"core/Graph.ts",
8187
"core/State.ts",
8288
"core/Types.ts",
@@ -138,6 +144,9 @@ devtools_module("ai_chat") {
138144
"tools/DeleteFileTool.ts",
139145
"tools/ReadFileTool.ts",
140146
"tools/ListFilesTool.ts",
147+
"memory/SearchMemoryTool.ts",
148+
"memory/UpdateMemoryTool.ts",
149+
"memory/ListMemoryBlocksTool.ts",
141150
"tools/UpdateTodoTool.ts",
142151
"tools/ExecuteCodeTool.ts",
143152
"tools/SequentialThinkingTool.ts",
@@ -281,6 +290,11 @@ _ai_chat_sources = [
281290
"ui/mcp/MCPConnectorsCatalogDialog.ts",
282291
"ai_chat_impl.ts",
283292
"models/ChatTypes.ts",
293+
"memory/types.ts",
294+
"memory/MemoryModule.ts",
295+
"memory/MemoryBlockManager.ts",
296+
"memory/MemoryAgentConfig.ts",
297+
"memory/index.ts",
284298
"core/Graph.ts",
285299
"core/State.ts",
286300
"core/Types.ts",
@@ -342,6 +356,9 @@ _ai_chat_sources = [
342356
"tools/DeleteFileTool.ts",
343357
"tools/ReadFileTool.ts",
344358
"tools/ListFilesTool.ts",
359+
"memory/SearchMemoryTool.ts",
360+
"memory/UpdateMemoryTool.ts",
361+
"memory/ListMemoryBlocksTool.ts",
345362
"tools/UpdateTodoTool.ts",
346363
"tools/ExecuteCodeTool.ts",
347364
"tools/SequentialThinkingTool.ts",

front_end/panels/ai_chat/agent_framework/AgentRunner.ts

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -430,12 +430,13 @@ export class AgentRunner {
430430
hooks: AgentRunnerHooks,
431431
executingAgent: ConfigurableAgentTool | null,
432432
parentSession?: AgentSession, // For natural nesting
433-
overrides?: { sessionId?: string; parentSessionId?: string; traceId?: string },
433+
overrides?: { sessionId?: string; parentSessionId?: string; traceId?: string; background?: boolean },
434434
abortSignal?: AbortSignal
435435
): Promise<ConfigurableAgentResult & { agentSession: AgentSession }> {
436436
const agentName = executingAgent?.name || 'Unknown';
437437
logger.info(`Starting execution loop for agent: ${agentName}`);
438438
const { apiKey, modelName, systemPrompt, tools, maxIterations, temperature, agentDescriptor } = config;
439+
const isBackground = overrides?.background === true;
439440
const { prepareInitialMessages, createSuccessResult, createErrorResult, afterExecute } = hooks;
440441

441442

@@ -463,8 +464,8 @@ export class AgentRunner {
463464
// Use local session variable instead of static
464465
let currentSession = agentSession;
465466

466-
// Emit session started event
467-
if (AgentRunner.eventBus) {
467+
// Emit session started event (skip for background agents)
468+
if (AgentRunner.eventBus && !isBackground) {
468469
AgentRunner.eventBus.emitProgress({
469470
type: 'session_started',
470471
sessionId: agentSession.sessionId,
@@ -485,20 +486,20 @@ export class AgentRunner {
485486

486487
currentSession.messages.push(fullMessage);
487488

488-
// Emit progress events based on message type
489-
if (AgentRunner.eventBus && fullMessage.type === 'tool_call') {
489+
// Emit progress events based on message type (skip for background agents)
490+
if (AgentRunner.eventBus && !isBackground && fullMessage.type === 'tool_call') {
490491
AgentRunner.eventBus.emitProgress({
491492
type: 'tool_started',
492493
sessionId: currentSession.sessionId,
493494
parentSessionId: currentSession.parentSessionId,
494495
agentName: currentSession.agentName,
495496
timestamp: new Date(),
496-
data: {
497+
data: {
497498
session: currentSession,
498499
toolCall: fullMessage
499500
}
500501
});
501-
} else if (AgentRunner.eventBus && fullMessage.type === 'tool_result') {
502+
} else if (AgentRunner.eventBus && !isBackground && fullMessage.type === 'tool_result') {
502503
AgentRunner.eventBus.emitProgress({
503504
type: 'tool_completed',
504505
sessionId: currentSession.sessionId,
@@ -591,8 +592,8 @@ export class AgentRunner {
591592
currentSession.endTime = new Date();
592593
currentSession.terminationReason = 'error';
593594

594-
// Emit session completed event
595-
if (AgentRunner.eventBus) {
595+
// Emit session completed event (skip for background agents)
596+
if (AgentRunner.eventBus && !isBackground) {
596597
AgentRunner.eventBus.emitProgress({
597598
type: 'session_completed',
598599
sessionId: currentSession.sessionId,
@@ -836,8 +837,8 @@ export class AgentRunner {
836837
agentSession.endTime = new Date();
837838
agentSession.terminationReason = 'error';
838839

839-
// Emit session completed event
840-
if (AgentRunner.eventBus) {
840+
// Emit session completed event (skip for background agents)
841+
if (AgentRunner.eventBus && !isBackground) {
841842
AgentRunner.eventBus.emitProgress({
842843
type: 'session_completed',
843844
sessionId: agentSession.sessionId,
@@ -1017,8 +1018,8 @@ export class AgentRunner {
10171018
agentSession.endTime = new Date();
10181019
agentSession.terminationReason = 'handed_off';
10191020

1020-
// Emit session completed event
1021-
if (AgentRunner.eventBus) {
1021+
// Emit session completed event (skip for background agents)
1022+
if (AgentRunner.eventBus && !isBackground) {
10221023
AgentRunner.eventBus.emitProgress({
10231024
type: 'session_completed',
10241025
sessionId: agentSession.sessionId,
@@ -1104,8 +1105,8 @@ export class AgentRunner {
11041105
}
11051106
});
11061107

1107-
// Emit child agent starting
1108-
if (AgentRunner.eventBus) {
1108+
// Emit child agent starting (skip for background agents)
1109+
if (AgentRunner.eventBus && !isBackground) {
11091110
AgentRunner.eventBus.emitProgress({
11101111
type: 'child_agent_started',
11111112
sessionId: currentSession.sessionId,
@@ -1326,8 +1327,8 @@ export class AgentRunner {
13261327
agentSession.endTime = new Date();
13271328
agentSession.terminationReason = 'final_answer';
13281329

1329-
// Emit session completed event
1330-
if (AgentRunner.eventBus) {
1330+
// Emit session completed event (skip for background agents)
1331+
if (AgentRunner.eventBus && !isBackground) {
13311332
AgentRunner.eventBus.emitProgress({
13321333
type: 'session_completed',
13331334
sessionId: agentSession.sessionId,
@@ -1388,8 +1389,8 @@ export class AgentRunner {
13881389
agentSession.endTime = new Date();
13891390
agentSession.terminationReason = 'error';
13901391

1391-
// Emit session completed event
1392-
if (AgentRunner.eventBus) {
1392+
// Emit session completed event (skip for background agents)
1393+
if (AgentRunner.eventBus && !isBackground) {
13931394
AgentRunner.eventBus.emitProgress({
13941395
type: 'session_completed',
13951396
sessionId: agentSession.sessionId,
@@ -1461,8 +1462,8 @@ export class AgentRunner {
14611462
agentSession.endTime = new Date();
14621463
agentSession.terminationReason = 'handed_off';
14631464

1464-
// Emit session completed event
1465-
if (AgentRunner.eventBus) {
1465+
// Emit session completed event (skip for background agents)
1466+
if (AgentRunner.eventBus && !isBackground) {
14661467
AgentRunner.eventBus.emitProgress({
14671468
type: 'session_completed',
14681469
sessionId: agentSession.sessionId,
@@ -1485,8 +1486,8 @@ export class AgentRunner {
14851486
agentSession.endTime = new Date();
14861487
agentSession.terminationReason = 'max_iterations';
14871488

1488-
// Emit session completed event
1489-
if (AgentRunner.eventBus) {
1489+
// Emit session completed event (skip for background agents)
1490+
if (AgentRunner.eventBus && !isBackground) {
14901491
AgentRunner.eventBus.emitProgress({
14911492
type: 'session_completed',
14921493
sessionId: agentSession.sessionId,

front_end/panels/ai_chat/agent_framework/ConfigurableAgentTool.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ export interface CallCtx {
3030
overrideTraceId?: string,
3131
abortSignal?: AbortSignal,
3232
agentDescriptor?: AgentDescriptor,
33+
/** If true, don't emit UI progress events (for background agents) */
34+
background?: boolean,
3335
}
3436

3537
/**
@@ -595,6 +597,7 @@ export class ConfigurableAgentTool implements Tool<ConfigurableAgentArgs, Config
595597
sessionId: ctx.overrideSessionId,
596598
parentSessionId: ctx.overrideParentSessionId,
597599
traceId: ctx.overrideTraceId,
600+
background: ctx.background,
598601
},
599602
callCtx.abortSignal
600603
);

front_end/panels/ai_chat/agent_framework/implementation/ConfiguredAgents.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ import { SchemaBasedExtractorTool } from '../../tools/SchemaBasedExtractorTool.j
88
import { StreamlinedSchemaExtractorTool } from '../../tools/StreamlinedSchemaExtractorTool.js';
99
import { BookmarkStoreTool } from '../../tools/BookmarkStoreTool.js';
1010
import { DocumentSearchTool } from '../../tools/DocumentSearchTool.js';
11-
import { SearchMemoryTool } from '../../tools/SearchMemoryTool.js';
12-
import { UpdateMemoryTool } from '../../tools/UpdateMemoryTool.js';
13-
import { ListMemoryBlocksTool } from '../../tools/ListMemoryBlocksTool.js';
11+
import { SearchMemoryTool, UpdateMemoryTool, ListMemoryBlocksTool, createMemoryAgentConfig } from '../../memory/index.js';
1412
import { NavigateURLTool, PerformActionTool, GetAccessibilityTreeTool, SearchContentTool, NavigateBackTool, NodeIDsToURLsTool, TakeScreenshotTool, ScrollPageTool, WaitTool, RenderWebAppTool, GetWebAppDataTool, RemoveWebAppTool, CreateFileTool, UpdateFileTool, DeleteFileTool, ReadFileTool, ListFilesTool } from '../../tools/Tools.js';
1513
import { UpdateTodoTool } from '../../tools/UpdateTodoTool.js';
1614
import { ExecuteCodeTool } from '../../tools/ExecuteCodeTool.js';
@@ -32,8 +30,6 @@ import { createScrollActionAgentConfig } from './agents/ScrollActionAgent.js';
3230
import { createWebTaskAgentConfig } from './agents/WebTaskAgent.js';
3331
import { createEcommerceProductInfoAgentConfig } from './agents/EcommerceProductInfoAgent.js';
3432
import { createSearchAgentConfig } from './agents/SearchAgent.js';
35-
import { createMemoryAgentConfig } from './agents/MemoryAgent.js';
36-
import { createSearchMemoryAgentConfig } from './agents/SearchMemoryAgent.js';
3733

3834
/**
3935
* Initialize all configured agents
@@ -142,12 +138,12 @@ export function initializeConfiguredAgents(): void {
142138
ToolRegistry.registerToolFactory('ecommerce_product_info_fetcher_tool', () => ecommerceProductInfoAgent);
143139

144140
// Create and register Memory Agent (background memory consolidation)
145-
const memoryAgentConfig = createMemoryAgentConfig();
141+
const memoryAgentConfig = createMemoryAgentConfig('extraction');
146142
const memoryAgent = new ConfigurableAgentTool(memoryAgentConfig);
147143
ToolRegistry.registerToolFactory('memory_agent', () => memoryAgent);
148144

149145
// Create and register Search Memory Agent (read-only memory search for orchestrators)
150-
const searchMemoryAgentConfig = createSearchMemoryAgentConfig();
146+
const searchMemoryAgentConfig = createMemoryAgentConfig('search');
151147
const searchMemoryAgent = new ConfigurableAgentTool(searchMemoryAgentConfig);
152148
ToolRegistry.registerToolFactory('search_memory_agent', () => searchMemoryAgent);
153149

front_end/panels/ai_chat/core/AgentService.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import { VisualIndicatorManager } from '../tools/VisualIndicatorTool.js';
3030
import { ConversationManager } from '../persistence/ConversationManager.js';
3131
import type { ConversationMetadata } from '../persistence/ConversationTypes.js';
3232
import { ToolRegistry } from '../agent_framework/ConfigurableAgentTool.js';
33+
import { MemoryModule } from '../memory/index.js';
3334

3435
// Cache break: 2025-09-17T17:54:00Z - Force rebuild with AUTOMATED_MODE bypass
3536
const logger = createLogger('AgentService');
@@ -936,6 +937,13 @@ export class AgentService extends Common.ObjectWrapper.ObjectWrapper<{
936937
* concurrent processing of the same conversation.
937938
*/
938939
async #processConversationMemory(conversationId: string): Promise<void> {
940+
logger.info('[Memory] Starting processing for conversation', {conversationId});
941+
// Check if memory is enabled in settings
942+
if (!MemoryModule.getInstance().isEnabled()) {
943+
logger.info('[Memory] Skipping - memory disabled in settings');
944+
return;
945+
}
946+
939947
// Try to claim - if another instance is processing, skip
940948
const claimed = await this.#conversationManager.tryClaimForMemoryProcessing(conversationId);
941949
if (!claimed) {
@@ -991,15 +999,18 @@ export class AgentService extends Common.ObjectWrapper.ObjectWrapper<{
991999
model: config.mainModel,
9921000
miniModel: config.miniModel,
9931001
nanoModel: config.nanoModel,
1002+
background: true, // Don't show in UI
9941003
});
9951004

9961005
logger.info('[Memory] Agent execution result', {
9971006
conversationId,
9981007
success: result.success,
9991008
outputLength: result.output?.length || 0,
1000-
outputPreview: result.output?.substring(0, 200),
1009+
outputPreview: result.output?.substring(0, 500),
10011010
error: result.error,
1002-
terminationReason: result.terminationReason
1011+
terminationReason: result.terminationReason,
1012+
toolCallsCount: result.toolCalls?.length || 0,
1013+
toolCalls: result.toolCalls?.map((tc: any) => ({ name: tc.name, args: tc.args })) || [],
10031014
});
10041015

10051016
await this.#conversationManager.markMemoryCompleted(conversationId);
@@ -1263,8 +1274,6 @@ export class AgentService extends Common.ObjectWrapper.ObjectWrapper<{
12631274
// Schedule auto-save after session completion
12641275
void this.#scheduleAutoSave();
12651276

1266-
// Note: Memory extraction is now handled by MemoryNode in the graph flow
1267-
12681277
// Clean up after a short delay (5 seconds) to allow UI to finish rendering
12691278
this.#cleanupCompletedSession(progressEvent.sessionId);
12701279
} else {

0 commit comments

Comments
 (0)