MCPcopy Create free account
hub / github.com/MarsWang42/Awel / createMemoryTool

Function createMemoryTool

packages/cli/src/tools/memory.ts:5–51  ·  view source on GitHub ↗
(cwd: string)

Source from the content-addressed store, hash-verified

3import { readMemories, addMemory, searchMemories, touchMemories } from '../memory.js';
4
5export function createMemoryTool(cwd: string) {
6 return tool({
7 description: 'Read, write, or search project memories. Memories persist across sessions. Actions: "read" (list all), "write" (save new entry), "search" (find contextual memories by keyword).',
8 inputSchema: z.object({
9 action: z.enum(['read', 'write', 'search']),
10 content: z.string().optional().describe('The memory content to save (required for "write")'),
11 tags: z.array(z.string()).optional().describe('Keywords for retrieval (required for "write")'),
12 scope: z.enum(['always', 'contextual']).optional().describe('Memory scope: "always" for project-wide rules injected every request, "contextual" for specific facts retrieved on demand. Defaults to "contextual".'),
13 query: z.string().optional().describe('Search query to find contextual memories (required for "search")'),
14 }),
15 execute: async ({ action, content, tags, scope, query }) => {
16 if (action === 'read') {
17 const entries = readMemories(cwd);
18 if (entries.length === 0) return 'No memories stored yet.';
19 const lines = entries.map(e =>
20 `[${e.scope}] (${e.id.slice(0, 8)}) ${e.content} [tags: ${e.tags.join(', ')}]`
21 );
22 return `${entries.length} memories:\n` + lines.join('\n');
23 }
24
25 if (action === 'write') {
26 if (!content) return 'Error: "content" is required for write action.';
27 if (!tags || tags.length === 0) return 'Error: "tags" is required for write action.';
28 const entry = addMemory(cwd, {
29 content,
30 tags,
31 scope: scope ?? 'contextual',
32 source: 'agent',
33 });
34 return `Memory saved (id: ${entry.id}, scope: ${entry.scope}).`;
35 }
36
37 if (action === 'search') {
38 if (!query) return 'Error: "query" is required for search action.';
39 const results = searchMemories(cwd, query);
40 if (results.length === 0) return 'No matching memories found.';
41 touchMemories(cwd, results.map(r => r.id));
42 const lines = results.map(e =>
43 `[${e.id.slice(0, 8)}] ${e.content} [tags: ${e.tags.join(', ')}]`
44 );
45 return `${results.length} matching memories:\n` + lines.join('\n');
46 }
47
48 return 'Error: Unknown action.';
49 },
50 });
51}

Callers 1

awelToolsFunction · 0.85

Calls 4

readMemoriesFunction · 0.85
addMemoryFunction · 0.85
searchMemoriesFunction · 0.85
touchMemoriesFunction · 0.85

Tested by

no test coverage detected