@kernel.chat/kbot 2.5.0 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +98 -42
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +140 -21
  4. package/dist/agent.js.map +1 -1
  5. package/dist/architect.d.ts +44 -0
  6. package/dist/architect.d.ts.map +1 -0
  7. package/dist/architect.js +403 -0
  8. package/dist/architect.js.map +1 -0
  9. package/dist/auth.d.ts +11 -1
  10. package/dist/auth.d.ts.map +1 -1
  11. package/dist/auth.js +165 -7
  12. package/dist/auth.js.map +1 -1
  13. package/dist/cli.js +251 -22
  14. package/dist/cli.js.map +1 -1
  15. package/dist/graph-memory.d.ts +98 -0
  16. package/dist/graph-memory.d.ts.map +1 -0
  17. package/dist/graph-memory.js +926 -0
  18. package/dist/graph-memory.js.map +1 -0
  19. package/dist/ide/acp-server.js +2 -2
  20. package/dist/ide/mcp-server.js +1 -1
  21. package/dist/lsp-client.d.ts +167 -0
  22. package/dist/lsp-client.d.ts.map +1 -0
  23. package/dist/lsp-client.js +679 -0
  24. package/dist/lsp-client.js.map +1 -0
  25. package/dist/matrix.d.ts +6 -0
  26. package/dist/matrix.d.ts.map +1 -1
  27. package/dist/matrix.js +98 -0
  28. package/dist/matrix.js.map +1 -1
  29. package/dist/mcp-plugins.d.ts +62 -0
  30. package/dist/mcp-plugins.d.ts.map +1 -0
  31. package/dist/mcp-plugins.js +551 -0
  32. package/dist/mcp-plugins.js.map +1 -0
  33. package/dist/planner.d.ts.map +1 -1
  34. package/dist/planner.js +29 -0
  35. package/dist/planner.js.map +1 -1
  36. package/dist/provider-fallback.d.ts +51 -0
  37. package/dist/provider-fallback.d.ts.map +1 -0
  38. package/dist/provider-fallback.js +237 -0
  39. package/dist/provider-fallback.js.map +1 -0
  40. package/dist/repo-map.d.ts +9 -0
  41. package/dist/repo-map.d.ts.map +1 -0
  42. package/dist/repo-map.js +280 -0
  43. package/dist/repo-map.js.map +1 -0
  44. package/dist/self-eval.d.ts +45 -0
  45. package/dist/self-eval.d.ts.map +1 -0
  46. package/dist/self-eval.js +232 -0
  47. package/dist/self-eval.js.map +1 -0
  48. package/dist/streaming.d.ts.map +1 -1
  49. package/dist/streaming.js +22 -2
  50. package/dist/streaming.js.map +1 -1
  51. package/dist/task-ledger.d.ts +71 -0
  52. package/dist/task-ledger.d.ts.map +1 -0
  53. package/dist/task-ledger.js +282 -0
  54. package/dist/task-ledger.js.map +1 -0
  55. package/dist/tools/computer.js +3 -3
  56. package/dist/tools/computer.js.map +1 -1
  57. package/dist/tools/e2b-sandbox.d.ts +2 -0
  58. package/dist/tools/e2b-sandbox.d.ts.map +1 -0
  59. package/dist/tools/e2b-sandbox.js +460 -0
  60. package/dist/tools/e2b-sandbox.js.map +1 -0
  61. package/dist/tools/index.d.ts.map +1 -1
  62. package/dist/tools/index.js +15 -1
  63. package/dist/tools/index.js.map +1 -1
  64. package/dist/tools/lsp-tools.d.ts +2 -0
  65. package/dist/tools/lsp-tools.d.ts.map +1 -0
  66. package/dist/tools/lsp-tools.js +268 -0
  67. package/dist/tools/lsp-tools.js.map +1 -0
  68. package/dist/tools/memory-tools.d.ts +2 -0
  69. package/dist/tools/memory-tools.d.ts.map +1 -0
  70. package/dist/tools/memory-tools.js +228 -0
  71. package/dist/tools/memory-tools.js.map +1 -0
  72. package/dist/tools/quality.d.ts +2 -0
  73. package/dist/tools/quality.d.ts.map +1 -0
  74. package/dist/tools/quality.js +313 -0
  75. package/dist/tools/quality.js.map +1 -0
  76. package/dist/ui.d.ts.map +1 -1
  77. package/dist/ui.js +33 -18
  78. package/dist/ui.js.map +1 -1
  79. package/package.json +27 -3
@@ -0,0 +1,268 @@
1
+ // K:BOT LSP Tools — Language intelligence for the agent
2
+ //
3
+ // Exposes LSP capabilities as kbot tools so the agent can:
4
+ // - Navigate code (go-to-definition, find-references)
5
+ // - Understand types (hover, completions)
6
+ // - Refactor safely (rename across project)
7
+ // - Detect issues (diagnostics)
8
+ // - Explore structure (document symbols)
9
+ //
10
+ // All operations are local — zero API calls, zero cost.
11
+ import { registerTool } from './index.js';
12
+ import { gotoDefinition, findReferences, hover, completions, rename, getDiagnostics, documentSymbols, detectLanguage, formatLocations, formatDiagnosticsList, formatSymbol, formatCompletion, formatWorkspaceEdit, } from '../lsp-client.js';
13
+ import { resolve } from 'node:path';
14
+ import { existsSync } from 'node:fs';
15
+ /** Validate file path and return absolute path, or throw */
16
+ function validateFile(filePath) {
17
+ if (!filePath || typeof filePath !== 'string') {
18
+ throw new Error('file parameter is required and must be a string');
19
+ }
20
+ const absPath = resolve(String(filePath));
21
+ if (!existsSync(absPath)) {
22
+ throw new Error(`File not found: ${absPath}`);
23
+ }
24
+ return absPath;
25
+ }
26
+ /** Validate and parse a line number (1-indexed from user, 0-indexed for LSP) */
27
+ function parseLine(line) {
28
+ const n = Number(line);
29
+ if (isNaN(n) || n < 1) {
30
+ throw new Error('line must be a positive integer (1-indexed)');
31
+ }
32
+ return n - 1; // Convert to 0-indexed for LSP
33
+ }
34
+ /** Validate and parse a column number (1-indexed from user, 0-indexed for LSP) */
35
+ function parseCol(col) {
36
+ const n = Number(col);
37
+ if (isNaN(n) || n < 1) {
38
+ throw new Error('col must be a positive integer (1-indexed)');
39
+ }
40
+ return n - 1; // Convert to 0-indexed for LSP
41
+ }
42
+ /** Check that the file has a supported language and return an error message if not */
43
+ function checkLanguageSupport(filePath) {
44
+ const lang = detectLanguage(filePath);
45
+ if (!lang) {
46
+ const ext = filePath.split('.').pop() || 'unknown';
47
+ return `No LSP support for .${ext} files. Supported: .ts, .tsx, .js, .jsx, .py, .go, .rs`;
48
+ }
49
+ return null;
50
+ }
51
+ export function registerLspTools() {
52
+ // ── Go to Definition ──
53
+ registerTool({
54
+ name: 'lsp_goto_definition',
55
+ description: 'Go to the definition of a symbol at a given position in a file. Returns the file path(s) and location(s) where the symbol is defined. Positions are 1-indexed (line 1, col 1 = first character of first line).',
56
+ parameters: {
57
+ file: { type: 'string', description: 'Path to the source file', required: true },
58
+ line: { type: 'number', description: 'Line number (1-indexed)', required: true },
59
+ col: { type: 'number', description: 'Column number (1-indexed)', required: true },
60
+ },
61
+ tier: 'free',
62
+ timeout: 15_000,
63
+ async execute(args) {
64
+ const filePath = validateFile(args.file);
65
+ const langErr = checkLanguageSupport(filePath);
66
+ if (langErr)
67
+ return langErr;
68
+ const line = parseLine(args.line);
69
+ const col = parseCol(args.col);
70
+ try {
71
+ const locations = await gotoDefinition(filePath, line, col);
72
+ if (locations.length === 0) {
73
+ return 'No definition found at this position.';
74
+ }
75
+ return `Definition location(s):\n${formatLocations(locations)}`;
76
+ }
77
+ catch (err) {
78
+ return `LSP error: ${err instanceof Error ? err.message : String(err)}`;
79
+ }
80
+ },
81
+ });
82
+ // ── Find References ──
83
+ registerTool({
84
+ name: 'lsp_find_references',
85
+ description: 'Find all references to a symbol at a given position across the project. Returns file paths and locations of every usage. Positions are 1-indexed.',
86
+ parameters: {
87
+ file: { type: 'string', description: 'Path to the source file', required: true },
88
+ line: { type: 'number', description: 'Line number (1-indexed)', required: true },
89
+ col: { type: 'number', description: 'Column number (1-indexed)', required: true },
90
+ },
91
+ tier: 'free',
92
+ timeout: 20_000,
93
+ async execute(args) {
94
+ const filePath = validateFile(args.file);
95
+ const langErr = checkLanguageSupport(filePath);
96
+ if (langErr)
97
+ return langErr;
98
+ const line = parseLine(args.line);
99
+ const col = parseCol(args.col);
100
+ try {
101
+ const locations = await findReferences(filePath, line, col);
102
+ if (locations.length === 0) {
103
+ return 'No references found at this position.';
104
+ }
105
+ return `${locations.length} reference(s) found:\n${formatLocations(locations)}`;
106
+ }
107
+ catch (err) {
108
+ return `LSP error: ${err instanceof Error ? err.message : String(err)}`;
109
+ }
110
+ },
111
+ });
112
+ // ── Hover ──
113
+ registerTool({
114
+ name: 'lsp_hover',
115
+ description: 'Get hover information (type signature, documentation) for a symbol at a given position. Useful for checking the type of a variable, function signature, or reading inline docs. Positions are 1-indexed.',
116
+ parameters: {
117
+ file: { type: 'string', description: 'Path to the source file', required: true },
118
+ line: { type: 'number', description: 'Line number (1-indexed)', required: true },
119
+ col: { type: 'number', description: 'Column number (1-indexed)', required: true },
120
+ },
121
+ tier: 'free',
122
+ timeout: 15_000,
123
+ async execute(args) {
124
+ const filePath = validateFile(args.file);
125
+ const langErr = checkLanguageSupport(filePath);
126
+ if (langErr)
127
+ return langErr;
128
+ const line = parseLine(args.line);
129
+ const col = parseCol(args.col);
130
+ try {
131
+ const result = await hover(filePath, line, col);
132
+ if (!result) {
133
+ return 'No hover information available at this position.';
134
+ }
135
+ return result;
136
+ }
137
+ catch (err) {
138
+ return `LSP error: ${err instanceof Error ? err.message : String(err)}`;
139
+ }
140
+ },
141
+ });
142
+ // ── Completions ──
143
+ registerTool({
144
+ name: 'lsp_completions',
145
+ description: 'Get code completions at a given position. Useful for checking available methods, properties, or API surface of an object. Returns up to 30 completions. Positions are 1-indexed.',
146
+ parameters: {
147
+ file: { type: 'string', description: 'Path to the source file', required: true },
148
+ line: { type: 'number', description: 'Line number (1-indexed)', required: true },
149
+ col: { type: 'number', description: 'Column number (1-indexed)', required: true },
150
+ },
151
+ tier: 'free',
152
+ timeout: 15_000,
153
+ async execute(args) {
154
+ const filePath = validateFile(args.file);
155
+ const langErr = checkLanguageSupport(filePath);
156
+ if (langErr)
157
+ return langErr;
158
+ const line = parseLine(args.line);
159
+ const col = parseCol(args.col);
160
+ try {
161
+ const items = await completions(filePath, line, col);
162
+ if (items.length === 0) {
163
+ return 'No completions available at this position.';
164
+ }
165
+ const maxShow = 30;
166
+ const shown = items.slice(0, maxShow);
167
+ const formatted = shown.map(formatCompletion).join('\n');
168
+ const suffix = items.length > maxShow
169
+ ? `\n\n(showing ${maxShow} of ${items.length} completions)`
170
+ : '';
171
+ return `${shown.length} completion(s):\n${formatted}${suffix}`;
172
+ }
173
+ catch (err) {
174
+ return `LSP error: ${err instanceof Error ? err.message : String(err)}`;
175
+ }
176
+ },
177
+ });
178
+ // ── Rename ──
179
+ registerTool({
180
+ name: 'lsp_rename',
181
+ description: 'Rename a symbol across the entire project. Returns a list of all files and edits that would be made. Does NOT apply the edits automatically — review them first. Positions are 1-indexed.',
182
+ parameters: {
183
+ file: { type: 'string', description: 'Path to the source file', required: true },
184
+ line: { type: 'number', description: 'Line number (1-indexed)', required: true },
185
+ col: { type: 'number', description: 'Column number (1-indexed)', required: true },
186
+ new_name: { type: 'string', description: 'New name for the symbol', required: true },
187
+ },
188
+ tier: 'free',
189
+ timeout: 20_000,
190
+ async execute(args) {
191
+ const filePath = validateFile(args.file);
192
+ const langErr = checkLanguageSupport(filePath);
193
+ if (langErr)
194
+ return langErr;
195
+ const line = parseLine(args.line);
196
+ const col = parseCol(args.col);
197
+ if (!args.new_name || typeof args.new_name !== 'string') {
198
+ return 'new_name parameter is required and must be a string.';
199
+ }
200
+ const newName = String(args.new_name);
201
+ try {
202
+ const edit = await rename(filePath, line, col, newName);
203
+ if (!edit) {
204
+ return 'Rename not supported at this position (symbol may not be renameable).';
205
+ }
206
+ const formatted = formatWorkspaceEdit(edit);
207
+ if (formatted === 'No edits.') {
208
+ return 'No edits produced — the symbol may already have this name or is not renameable.';
209
+ }
210
+ return `Rename edits (preview only — not applied):\n${formatted}`;
211
+ }
212
+ catch (err) {
213
+ return `LSP error: ${err instanceof Error ? err.message : String(err)}`;
214
+ }
215
+ },
216
+ });
217
+ // ── Diagnostics ──
218
+ registerTool({
219
+ name: 'lsp_diagnostics',
220
+ description: 'Get diagnostics (errors, warnings, hints) for a source file from the language server. More accurate than text-based linting because it uses the full type system.',
221
+ parameters: {
222
+ file: { type: 'string', description: 'Path to the source file', required: true },
223
+ },
224
+ tier: 'free',
225
+ timeout: 20_000,
226
+ async execute(args) {
227
+ const filePath = validateFile(args.file);
228
+ const langErr = checkLanguageSupport(filePath);
229
+ if (langErr)
230
+ return langErr;
231
+ try {
232
+ const diagnostics = await getDiagnostics(filePath);
233
+ return formatDiagnosticsList(filePath, diagnostics);
234
+ }
235
+ catch (err) {
236
+ return `LSP error: ${err instanceof Error ? err.message : String(err)}`;
237
+ }
238
+ },
239
+ });
240
+ // ── Document Symbols ──
241
+ registerTool({
242
+ name: 'lsp_symbols',
243
+ description: 'Get all symbols (functions, classes, interfaces, variables, etc.) defined in a file. Useful for understanding file structure without reading the entire file. Returns a hierarchical list.',
244
+ parameters: {
245
+ file: { type: 'string', description: 'Path to the source file', required: true },
246
+ },
247
+ tier: 'free',
248
+ timeout: 15_000,
249
+ async execute(args) {
250
+ const filePath = validateFile(args.file);
251
+ const langErr = checkLanguageSupport(filePath);
252
+ if (langErr)
253
+ return langErr;
254
+ try {
255
+ const symbols = await documentSymbols(filePath);
256
+ if (symbols.length === 0) {
257
+ return 'No symbols found in this file.';
258
+ }
259
+ const formatted = symbols.map(s => formatSymbol(s)).join('\n');
260
+ return `${symbols.length} top-level symbol(s):\n${formatted}`;
261
+ }
262
+ catch (err) {
263
+ return `LSP error: ${err instanceof Error ? err.message : String(err)}`;
264
+ }
265
+ },
266
+ });
267
+ }
268
+ //# sourceMappingURL=lsp-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lsp-tools.js","sourceRoot":"","sources":["../../src/tools/lsp-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function registerMemoryTools(): void;
2
+ //# sourceMappingURL=memory-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-tools.d.ts","sourceRoot":"","sources":["../../src/tools/memory-tools.ts"],"names":[],"mappings":"AA+GA,wBAAgB,mBAAmB,IAAI,IAAI,CAsK1C"}
@@ -0,0 +1,228 @@
1
+ // K:BOT Memory Tools — Active memory management (Letta/MemGPT-inspired)
2
+ //
3
+ // Gives agents the ability to self-edit their persistent memory:
4
+ // - Save facts, preferences, patterns, and solutions
5
+ // - Search memories by keyword
6
+ // - Update existing memories (preserving creation time)
7
+ // - Forget specific memories
8
+ //
9
+ // Memory is stored as individual JSON files under ~/.kbot/memory/{category}/
10
+ import { registerTool } from './index.js';
11
+ import { homedir } from 'node:os';
12
+ import { join } from 'node:path';
13
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync, readdirSync } from 'node:fs';
14
+ const VALID_CATEGORIES = ['fact', 'preference', 'pattern', 'solution'];
15
+ // ── Helpers ──
16
+ const MEMORY_BASE = join(homedir(), '.kbot', 'memory');
17
+ function ensureCategoryDir(category) {
18
+ const dir = join(MEMORY_BASE, category);
19
+ if (!existsSync(dir)) {
20
+ mkdirSync(dir, { recursive: true });
21
+ }
22
+ return dir;
23
+ }
24
+ /** Sanitize key for safe filesystem usage */
25
+ function sanitizeKey(key) {
26
+ return key
27
+ .toLowerCase()
28
+ .replace(/[^a-z0-9_-]/g, '-')
29
+ .replace(/-+/g, '-')
30
+ .replace(/^-|-$/g, '')
31
+ .slice(0, 128);
32
+ }
33
+ function getMemoryPath(category, key) {
34
+ return join(ensureCategoryDir(category), `${sanitizeKey(key)}.json`);
35
+ }
36
+ function readMemoryFile(filePath) {
37
+ try {
38
+ if (!existsSync(filePath))
39
+ return null;
40
+ return JSON.parse(readFileSync(filePath, 'utf-8'));
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ function writeMemoryFile(filePath, entry) {
47
+ writeFileSync(filePath, JSON.stringify(entry, null, 2), 'utf-8');
48
+ }
49
+ /** Search all memories in a specific category directory */
50
+ function searchInCategory(category, query) {
51
+ const dir = join(MEMORY_BASE, category);
52
+ if (!existsSync(dir))
53
+ return [];
54
+ const matches = [];
55
+ const lowerQuery = query.toLowerCase();
56
+ try {
57
+ const files = readdirSync(dir).filter(f => f.endsWith('.json'));
58
+ for (const file of files) {
59
+ const entry = readMemoryFile(join(dir, file));
60
+ if (!entry)
61
+ continue;
62
+ const keyMatch = entry.key.toLowerCase().includes(lowerQuery);
63
+ const contentMatch = entry.content.toLowerCase().includes(lowerQuery);
64
+ if (keyMatch || contentMatch) {
65
+ matches.push(entry);
66
+ }
67
+ }
68
+ }
69
+ catch { /* dir read failed */ }
70
+ return matches;
71
+ }
72
+ /** Find a memory by key across all categories. Returns [entry, filePath, category] or null. */
73
+ function findMemoryByKey(key, category) {
74
+ const sanitized = sanitizeKey(key);
75
+ const categoriesToSearch = category && VALID_CATEGORIES.includes(category)
76
+ ? [category]
77
+ : VALID_CATEGORIES;
78
+ for (const cat of categoriesToSearch) {
79
+ const filePath = join(MEMORY_BASE, cat, `${sanitized}.json`);
80
+ const entry = readMemoryFile(filePath);
81
+ if (entry)
82
+ return [entry, filePath, cat];
83
+ }
84
+ return null;
85
+ }
86
+ // ── Tools ──
87
+ export function registerMemoryTools() {
88
+ // ── memory_save ──
89
+ registerTool({
90
+ name: 'memory_save',
91
+ description: 'Save a fact, preference, learned pattern, or solution to persistent memory. Use this proactively when you learn something important about the user, their project, or discover a reusable solution.',
92
+ parameters: {
93
+ key: { type: 'string', description: 'Short descriptive key for this memory (e.g. "isaac-prefers-vanilla-css")', required: true },
94
+ content: { type: 'string', description: 'The memory content to save — be specific and actionable', required: true },
95
+ category: { type: 'string', description: 'Category: "fact", "preference", "pattern", or "solution" (default: "fact")' },
96
+ },
97
+ tier: 'free',
98
+ timeout: 10_000,
99
+ async execute(args) {
100
+ const key = String(args.key || '').trim();
101
+ const content = String(args.content || '').trim();
102
+ const category = (VALID_CATEGORIES.includes(args.category) ? args.category : 'fact');
103
+ if (!key)
104
+ return 'Error: key is required.';
105
+ if (!content)
106
+ return 'Error: content is required.';
107
+ const filePath = getMemoryPath(category, key);
108
+ const existing = readMemoryFile(filePath);
109
+ const now = new Date().toISOString();
110
+ const entry = {
111
+ key: sanitizeKey(key),
112
+ content,
113
+ category,
114
+ created_at: existing?.created_at || now,
115
+ modified_at: now,
116
+ access_count: existing ? existing.access_count + 1 : 0,
117
+ };
118
+ writeMemoryFile(filePath, entry);
119
+ return `Saved memory [${category}/${sanitizeKey(key)}]: ${content.slice(0, 120)}${content.length > 120 ? '...' : ''}`;
120
+ },
121
+ });
122
+ // ── memory_search ──
123
+ registerTool({
124
+ name: 'memory_search',
125
+ description: 'Search persistent memories by keyword. Use this to recall user preferences, previously learned patterns, known facts, or saved solutions before starting a task.',
126
+ parameters: {
127
+ query: { type: 'string', description: 'Keyword or phrase to search for in memory keys and content', required: true },
128
+ category: { type: 'string', description: 'Limit search to a specific category: "fact", "preference", "pattern", or "solution" (default: search all)' },
129
+ },
130
+ tier: 'free',
131
+ timeout: 10_000,
132
+ async execute(args) {
133
+ const query = String(args.query || '').trim();
134
+ if (!query)
135
+ return 'Error: query is required.';
136
+ const categoriesToSearch = args.category && VALID_CATEGORIES.includes(args.category)
137
+ ? [args.category]
138
+ : VALID_CATEGORIES;
139
+ let allMatches = [];
140
+ for (const cat of categoriesToSearch) {
141
+ allMatches = allMatches.concat(searchInCategory(cat, query));
142
+ }
143
+ if (allMatches.length === 0) {
144
+ return `No memories found matching "${query}".`;
145
+ }
146
+ // Sort by modified_at descending (most recent first)
147
+ allMatches.sort((a, b) => b.modified_at.localeCompare(a.modified_at));
148
+ // Take top 10
149
+ const top = allMatches.slice(0, 10);
150
+ // Increment access_count for each accessed memory
151
+ for (const entry of top) {
152
+ const filePath = getMemoryPath(entry.category, entry.key);
153
+ entry.access_count++;
154
+ writeMemoryFile(filePath, entry);
155
+ }
156
+ const results = top.map((entry, i) => {
157
+ const age = entry.modified_at.split('T')[0];
158
+ return `${i + 1}. [${entry.category}/${entry.key}] (${age}, accessed ${entry.access_count}x)\n ${entry.content.slice(0, 200)}${entry.content.length > 200 ? '...' : ''}`;
159
+ }).join('\n');
160
+ return `Found ${allMatches.length} memor${allMatches.length === 1 ? 'y' : 'ies'} matching "${query}"${allMatches.length > 10 ? ` (showing top 10)` : ''}:\n\n${results}`;
161
+ },
162
+ });
163
+ // ── memory_forget ──
164
+ registerTool({
165
+ name: 'memory_forget',
166
+ description: 'Remove a specific memory by key. Use this when information is outdated, incorrect, or no longer relevant.',
167
+ parameters: {
168
+ key: { type: 'string', description: 'The key of the memory to remove', required: true },
169
+ category: { type: 'string', description: 'Category to search in (default: search all categories)' },
170
+ },
171
+ tier: 'free',
172
+ timeout: 10_000,
173
+ async execute(args) {
174
+ const key = String(args.key || '').trim();
175
+ if (!key)
176
+ return 'Error: key is required.';
177
+ const found = findMemoryByKey(key, args.category);
178
+ if (!found) {
179
+ return `No memory found with key "${sanitizeKey(key)}"${args.category ? ` in category "${args.category}"` : ''}.`;
180
+ }
181
+ const [entry, filePath, category] = found;
182
+ try {
183
+ unlinkSync(filePath);
184
+ return `Removed memory [${category}/${entry.key}]: ${entry.content.slice(0, 80)}${entry.content.length > 80 ? '...' : ''}`;
185
+ }
186
+ catch (err) {
187
+ return `Error removing memory: ${err instanceof Error ? err.message : String(err)}`;
188
+ }
189
+ },
190
+ });
191
+ // ── memory_update ──
192
+ registerTool({
193
+ name: 'memory_update',
194
+ description: 'Update the content of an existing memory while preserving its creation timestamp. Use this when a fact, preference, or pattern has changed but the memory entry should be kept.',
195
+ parameters: {
196
+ key: { type: 'string', description: 'The key of the memory to update', required: true },
197
+ content: { type: 'string', description: 'The new content to replace the existing content', required: true },
198
+ category: { type: 'string', description: 'Category to search in (default: search all categories)' },
199
+ },
200
+ tier: 'free',
201
+ timeout: 10_000,
202
+ async execute(args) {
203
+ const key = String(args.key || '').trim();
204
+ const content = String(args.content || '').trim();
205
+ if (!key)
206
+ return 'Error: key is required.';
207
+ if (!content)
208
+ return 'Error: content is required.';
209
+ const found = findMemoryByKey(key, args.category);
210
+ if (!found) {
211
+ return `No memory found with key "${sanitizeKey(key)}"${args.category ? ` in category "${args.category}"` : ''}. Use memory_save to create a new memory.`;
212
+ }
213
+ const [entry, filePath, category] = found;
214
+ const now = new Date().toISOString();
215
+ const updated = {
216
+ key: entry.key,
217
+ content,
218
+ category,
219
+ created_at: entry.created_at,
220
+ modified_at: now,
221
+ access_count: entry.access_count + 1,
222
+ };
223
+ writeMemoryFile(filePath, updated);
224
+ return `Updated memory [${category}/${entry.key}]:\n Old: ${entry.content.slice(0, 100)}${entry.content.length > 100 ? '...' : ''}\n New: ${content.slice(0, 100)}${content.length > 100 ? '...' : ''}`;
225
+ },
226
+ });
227
+ }
228
+ //# sourceMappingURL=memory-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-tools.js","sourceRoot":"","sources":["../../src/tools/memory-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function registerQualityTools(): void;
2
+ //# sourceMappingURL=quality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality.d.ts","sourceRoot":"","sources":["../../src/tools/quality.ts"],"names":[],"mappings":"AAkFA,wBAAgB,oBAAoB,IAAI,IAAI,CA4Q3C"}