claude-eidetic 0.1.1 → 0.1.2

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 (96) hide show
  1. package/README.md +333 -0
  2. package/dist/config.d.ts +25 -0
  3. package/dist/config.js +29 -10
  4. package/dist/core/cleanup.d.ts +8 -0
  5. package/dist/core/cleanup.js +41 -0
  6. package/dist/core/doc-indexer.d.ts +13 -0
  7. package/dist/core/doc-indexer.js +76 -0
  8. package/dist/core/doc-searcher.d.ts +13 -0
  9. package/dist/core/doc-searcher.js +65 -0
  10. package/dist/core/file-category.d.ts +7 -0
  11. package/dist/core/file-category.js +75 -0
  12. package/dist/core/indexer.js +12 -4
  13. package/dist/core/preview.d.ts +1 -2
  14. package/dist/core/preview.js +2 -5
  15. package/dist/core/repo-map.d.ts +33 -0
  16. package/dist/core/repo-map.js +144 -0
  17. package/dist/core/searcher.d.ts +1 -13
  18. package/dist/core/searcher.js +20 -24
  19. package/dist/core/snapshot-io.js +2 -2
  20. package/dist/core/sync.d.ts +5 -25
  21. package/dist/core/sync.js +90 -65
  22. package/dist/core/targeted-indexer.d.ts +19 -0
  23. package/dist/core/targeted-indexer.js +127 -0
  24. package/dist/embedding/factory.d.ts +0 -13
  25. package/dist/embedding/factory.js +0 -17
  26. package/dist/embedding/openai.d.ts +2 -14
  27. package/dist/embedding/openai.js +7 -20
  28. package/dist/errors.d.ts +2 -0
  29. package/dist/errors.js +2 -0
  30. package/dist/format.d.ts +12 -0
  31. package/dist/format.js +160 -31
  32. package/dist/hooks/post-tool-use.d.ts +13 -0
  33. package/dist/hooks/post-tool-use.js +113 -0
  34. package/dist/hooks/stop-hook.d.ts +11 -0
  35. package/dist/hooks/stop-hook.js +121 -0
  36. package/dist/hooks/targeted-runner.d.ts +11 -0
  37. package/dist/hooks/targeted-runner.js +66 -0
  38. package/dist/index.js +68 -9
  39. package/dist/infra/qdrant-bootstrap.js +14 -12
  40. package/dist/memory/history.d.ts +19 -0
  41. package/dist/memory/history.js +40 -0
  42. package/dist/memory/llm.d.ts +2 -0
  43. package/dist/memory/llm.js +56 -0
  44. package/dist/memory/prompts.d.ts +5 -0
  45. package/dist/memory/prompts.js +36 -0
  46. package/dist/memory/reconciler.d.ts +12 -0
  47. package/dist/memory/reconciler.js +36 -0
  48. package/dist/memory/store.d.ts +20 -0
  49. package/dist/memory/store.js +206 -0
  50. package/dist/memory/types.d.ts +28 -0
  51. package/dist/memory/types.js +2 -0
  52. package/dist/paths.d.ts +3 -4
  53. package/dist/paths.js +14 -4
  54. package/dist/precompact/hook.d.ts +9 -0
  55. package/dist/precompact/hook.js +170 -0
  56. package/dist/precompact/index-runner.d.ts +9 -0
  57. package/dist/precompact/index-runner.js +52 -0
  58. package/dist/precompact/note-writer.d.ts +15 -0
  59. package/dist/precompact/note-writer.js +109 -0
  60. package/dist/precompact/session-indexer.d.ts +13 -0
  61. package/dist/precompact/session-indexer.js +31 -0
  62. package/dist/precompact/tier0-inject.d.ts +16 -0
  63. package/dist/precompact/tier0-inject.js +88 -0
  64. package/dist/precompact/tier0-writer.d.ts +16 -0
  65. package/dist/precompact/tier0-writer.js +74 -0
  66. package/dist/precompact/transcript-parser.d.ts +10 -0
  67. package/dist/precompact/transcript-parser.js +148 -0
  68. package/dist/precompact/types.d.ts +93 -0
  69. package/dist/precompact/types.js +5 -0
  70. package/dist/precompact/utils.d.ts +29 -0
  71. package/dist/precompact/utils.js +95 -0
  72. package/dist/setup-message.d.ts +2 -2
  73. package/dist/setup-message.js +39 -20
  74. package/dist/splitter/ast.js +84 -22
  75. package/dist/splitter/line.d.ts +0 -4
  76. package/dist/splitter/line.js +1 -7
  77. package/dist/splitter/symbol-extract.d.ts +16 -0
  78. package/dist/splitter/symbol-extract.js +61 -0
  79. package/dist/splitter/types.d.ts +5 -0
  80. package/dist/splitter/types.js +1 -1
  81. package/dist/state/doc-metadata.d.ts +18 -0
  82. package/dist/state/doc-metadata.js +59 -0
  83. package/dist/state/registry.d.ts +1 -3
  84. package/dist/state/snapshot.d.ts +0 -1
  85. package/dist/state/snapshot.js +3 -19
  86. package/dist/tool-schemas.d.ts +251 -1
  87. package/dist/tool-schemas.js +307 -0
  88. package/dist/tools.d.ts +69 -0
  89. package/dist/tools.js +286 -17
  90. package/dist/vectordb/milvus.d.ts +7 -5
  91. package/dist/vectordb/milvus.js +116 -19
  92. package/dist/vectordb/qdrant.d.ts +8 -10
  93. package/dist/vectordb/qdrant.js +105 -33
  94. package/dist/vectordb/types.d.ts +20 -0
  95. package/messages.yaml +50 -0
  96. package/package.json +31 -6
@@ -0,0 +1,61 @@
1
+ const CONTAINER_TYPES = new Set(['class_declaration', 'class_definition', 'interface_declaration']);
2
+ const KIND_MAP = {
3
+ function_declaration: 'function',
4
+ arrow_function: 'function',
5
+ async_function_definition: 'function',
6
+ function_definition: 'function',
7
+ class_declaration: 'class',
8
+ class_definition: 'class',
9
+ interface_declaration: 'interface',
10
+ method_definition: 'method',
11
+ method_declaration: 'method',
12
+ type_alias_declaration: 'type',
13
+ enum_declaration: 'enum',
14
+ // Java
15
+ constructor_declaration: 'constructor',
16
+ // Rust
17
+ function_item: 'function',
18
+ impl_item: 'impl',
19
+ struct_item: 'struct',
20
+ enum_item: 'enum',
21
+ trait_item: 'trait',
22
+ // C#
23
+ struct_declaration: 'struct',
24
+ };
25
+ function getIdentifier(node, code) {
26
+ const identChild = node.children.find((c) => c.type === 'identifier' || c.type === 'type_identifier' || c.type === 'name');
27
+ if (identChild)
28
+ return code.slice(identChild.startIndex, identChild.endIndex);
29
+ return undefined;
30
+ }
31
+ function extractSignature(node, code) {
32
+ const text = code.slice(node.startIndex, node.endIndex);
33
+ // Take first line up to opening brace or end of line
34
+ const firstLine = text.split('\n')[0];
35
+ const upToBrace = firstLine.split('{')[0].trimEnd();
36
+ const sig = upToBrace || firstLine;
37
+ return sig.length > 200 ? sig.slice(0, 200) + '…' : sig;
38
+ }
39
+ export function extractSymbolInfo(node, code, parentName) {
40
+ const nodeType = node.type;
41
+ // Handle export_statement: recurse into declaration child
42
+ if (nodeType === 'export_statement') {
43
+ const declChild = node.children.find((c) => c.type !== 'export' && c.type !== 'default' && c.type !== ';' && c.type !== 'identifier');
44
+ if (declChild)
45
+ return extractSymbolInfo(declChild, code, parentName);
46
+ return undefined;
47
+ }
48
+ const kind = KIND_MAP[nodeType];
49
+ if (!kind)
50
+ return undefined;
51
+ const name = getIdentifier(node, code);
52
+ if (!name)
53
+ return undefined;
54
+ const signature = extractSignature(node, code);
55
+ void parentName; // consumed by caller to set chunk.parentSymbol
56
+ return { name, kind, signature };
57
+ }
58
+ export function isContainerType(nodeType) {
59
+ return CONTAINER_TYPES.has(nodeType);
60
+ }
61
+ //# sourceMappingURL=symbol-extract.js.map
@@ -1,9 +1,14 @@
1
+ export declare const MAX_CHUNK_CHARS = 2500;
1
2
  export interface CodeChunk {
2
3
  content: string;
3
4
  startLine: number;
4
5
  endLine: number;
5
6
  language: string;
6
7
  filePath: string;
8
+ symbolName?: string;
9
+ symbolKind?: string;
10
+ symbolSignature?: string;
11
+ parentSymbol?: string;
7
12
  }
8
13
  export interface Splitter {
9
14
  split(code: string, language: string, filePath: string): CodeChunk[];
@@ -1,2 +1,2 @@
1
- export {};
1
+ export const MAX_CHUNK_CHARS = 2500;
2
2
  //# sourceMappingURL=types.js.map
@@ -0,0 +1,18 @@
1
+ export interface DocEntry {
2
+ library: string;
3
+ topic: string;
4
+ source: string;
5
+ collectionName: string;
6
+ indexedAt: string;
7
+ ttlDays: number;
8
+ totalChunks: number;
9
+ }
10
+ export type DocMetadata = Record<string, DocEntry>;
11
+ export declare function loadDocMetadata(): DocMetadata;
12
+ export declare function saveDocMetadata(metadata: DocMetadata): void;
13
+ export declare function upsertDocEntry(entry: DocEntry): void;
14
+ export declare function removeDocEntry(library: string, topic: string): boolean;
15
+ export declare function findDocEntries(library: string): DocEntry[];
16
+ export declare function isStale(entry: DocEntry): boolean;
17
+ export declare function listDocLibraries(): string[];
18
+ //# sourceMappingURL=doc-metadata.d.ts.map
@@ -0,0 +1,59 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { getDocMetadataPath } from '../paths.js';
4
+ function metadataKey(library, topic) {
5
+ return `${library.toLowerCase()}::${topic.toLowerCase()}`;
6
+ }
7
+ export function loadDocMetadata() {
8
+ const metadataPath = getDocMetadataPath();
9
+ try {
10
+ const data = fs.readFileSync(metadataPath, 'utf-8');
11
+ return JSON.parse(data);
12
+ }
13
+ catch {
14
+ return {};
15
+ }
16
+ }
17
+ export function saveDocMetadata(metadata) {
18
+ const metadataPath = getDocMetadataPath();
19
+ const dir = path.dirname(metadataPath);
20
+ fs.mkdirSync(dir, { recursive: true });
21
+ fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 2) + '\n', 'utf-8');
22
+ }
23
+ export function upsertDocEntry(entry) {
24
+ const metadata = loadDocMetadata();
25
+ const key = metadataKey(entry.library, entry.topic);
26
+ metadata[key] = entry;
27
+ saveDocMetadata(metadata);
28
+ }
29
+ export function removeDocEntry(library, topic) {
30
+ const metadata = loadDocMetadata();
31
+ const key = metadataKey(library, topic);
32
+ if (!(key in metadata))
33
+ return false;
34
+ Reflect.deleteProperty(metadata, key);
35
+ saveDocMetadata(metadata);
36
+ return true;
37
+ }
38
+ export function findDocEntries(library) {
39
+ const metadata = loadDocMetadata();
40
+ const prefix = `${library.toLowerCase()}::`;
41
+ return Object.entries(metadata)
42
+ .filter(([key]) => key.startsWith(prefix))
43
+ .map(([, entry]) => entry);
44
+ }
45
+ export function isStale(entry) {
46
+ const indexedAt = new Date(entry.indexedAt).getTime();
47
+ const now = Date.now();
48
+ const ttlMs = entry.ttlDays * 24 * 60 * 60 * 1000;
49
+ return now - indexedAt > ttlMs;
50
+ }
51
+ export function listDocLibraries() {
52
+ const metadata = loadDocMetadata();
53
+ const libs = new Set();
54
+ for (const entry of Object.values(metadata)) {
55
+ libs.add(entry.library);
56
+ }
57
+ return [...libs].sort();
58
+ }
59
+ //# sourceMappingURL=doc-metadata.js.map
@@ -1,6 +1,4 @@
1
- interface Registry {
2
- [project: string]: string;
3
- }
1
+ type Registry = Record<string, string>;
4
2
  export declare function registerProject(absolutePath: string): void;
5
3
  export declare function resolveProject(project: string): string | undefined;
6
4
  export declare function listProjects(): Registry;
@@ -20,7 +20,6 @@ export declare class StateManager {
20
20
  setIndexed(normalizedPath: string, totalFiles: number, totalChunks: number): void;
21
21
  setError(normalizedPath: string, error: string): void;
22
22
  remove(normalizedPath: string): void;
23
- markExisting(normalizedPath: string, collectionName: string): void;
24
23
  }
25
24
  export declare function cleanupOrphanedSnapshots(vectordb: VectorDB): Promise<number>;
26
25
  //# sourceMappingURL=snapshot.d.ts.map
@@ -46,14 +46,6 @@ export class StateManager {
46
46
  remove(normalizedPath) {
47
47
  this.states.delete(normalizedPath);
48
48
  }
49
- markExisting(normalizedPath, collectionName) {
50
- this.states.set(normalizedPath, {
51
- path: normalizedPath,
52
- collectionName,
53
- status: 'indexed',
54
- lastIndexed: 'unknown (pre-existing)',
55
- });
56
- }
57
49
  }
58
50
  export async function cleanupOrphanedSnapshots(vectordb) {
59
51
  const snapshotDir = getSnapshotDir();
@@ -61,16 +53,10 @@ export async function cleanupOrphanedSnapshots(vectordb) {
61
53
  try {
62
54
  if (!fs.existsSync(snapshotDir))
63
55
  return 0;
64
- const files = fs.readdirSync(snapshotDir).filter(f => f.endsWith('.json'));
56
+ const files = fs.readdirSync(snapshotDir).filter((f) => f.endsWith('.json'));
65
57
  if (files.length === 0)
66
58
  return 0;
67
- // Connectivity probe: use a name unlikely to exist. If hasCollection throws
68
- // or the vector DB is unreachable (Qdrant's hasCollection returns false on
69
- // network error), we must not proceed -- deleting snapshots when we cannot
70
- // confirm collection absence would destroy valid state.
71
59
  const probeResult = await vectordb.hasCollection('__eidetic_connectivity_probe__');
72
- // If the probe returns true for a name that should never exist, something is
73
- // wrong -- skip cleanup to be safe.
74
60
  if (probeResult) {
75
61
  console.warn('Orphan cleanup skipped: connectivity probe returned unexpected result.');
76
62
  return 0;
@@ -87,14 +73,12 @@ export async function cleanupOrphanedSnapshots(vectordb) {
87
73
  }
88
74
  }
89
75
  catch (err) {
90
- // Network error for this specific check -- skip rather than risk deletion
91
- console.warn(`Skipping orphan check for ${collectionName}: ${err}`);
76
+ console.warn(`Skipping orphan check for ${collectionName}:`, err);
92
77
  }
93
78
  }
94
79
  }
95
80
  catch (err) {
96
- // Connectivity probe failure or filesystem error -- skip cleanup entirely
97
- console.warn(`Orphan cleanup skipped: ${err}`);
81
+ console.warn('Orphan cleanup skipped:', err);
98
82
  }
99
83
  return cleaned;
100
84
  }
@@ -43,7 +43,7 @@ export declare const TOOL_DEFINITIONS: readonly [{
43
43
  };
44
44
  }, {
45
45
  readonly name: "search_code";
46
- readonly description: "Search the indexed codebase using natural language queries.\n\nProvide either `path` (absolute) or `project` (name). Use `list_indexed` to see registered projects.\n\nWhen to Use:\n- Code search: Find specific functions, classes, or implementations\n- Context-aware assistance: Gather relevant code context before making changes\n- Issue identification: Locate problematic code sections or bugs\n- Code review: Understand existing implementations and patterns\n- Refactoring: Find all related code pieces that need to be updated\n- Feature development: Understand existing architecture and similar implementations\n- Duplicate detection: Identify redundant or duplicated code patterns\n\nIf the codebase is not indexed, this tool will return a clear error message indicating that indexing is required first.";
46
+ readonly description: "Search the indexed codebase using natural language queries.\nPrefer over Grep for conceptual/semantic queries — returns ~20 tokens/result vs ~100+ for Grep.\nTry before launching an Explore agent — faster and cheaper for understanding code.\n\nProvide either `path` (absolute) or `project` (name). Use `list_indexed` to see registered projects.\n\nWhen to Use:\n- Code search: Find specific functions, classes, or implementations\n- Context-aware assistance: Gather relevant code context before making changes\n- Issue identification: Locate problematic code sections or bugs\n- Code review: Understand existing implementations and patterns\n- Refactoring: Find all related code pieces that need to be updated\n- Feature development: Understand existing architecture and similar implementations\n- Duplicate detection: Identify redundant or duplicated code patterns\n\nIf the codebase is not indexed, this tool will return a clear error message indicating that indexing is required first.";
47
47
  readonly inputSchema: {
48
48
  readonly type: "object";
49
49
  readonly properties: {
@@ -123,6 +123,256 @@ export declare const TOOL_DEFINITIONS: readonly [{
123
123
  readonly properties: {};
124
124
  readonly required: readonly [];
125
125
  };
126
+ }, {
127
+ readonly name: "cleanup_vectors";
128
+ readonly description: "Remove orphaned vectors for files that no longer exist on disk. Lightweight alternative to re-indexing — no embedding cost.\n\nProvide either `path` (absolute) or `project` (name). Use `list_indexed` to see registered projects.\n\nUse `dryRun=true` first to preview which files would be cleaned without making any changes.";
129
+ readonly inputSchema: {
130
+ readonly type: "object";
131
+ readonly properties: {
132
+ readonly path: {
133
+ readonly type: "string";
134
+ readonly description: "Absolute path to the codebase directory.";
135
+ };
136
+ readonly project: {
137
+ readonly type: "string";
138
+ readonly description: "Project name (resolves via registry). Use list_indexed to see registered projects.";
139
+ };
140
+ readonly dryRun: {
141
+ readonly type: "boolean";
142
+ readonly description: "List files that would be cleaned without actually deleting any vectors.";
143
+ readonly default: false;
144
+ };
145
+ };
146
+ readonly required: readonly [];
147
+ };
148
+ }, {
149
+ readonly name: "index_document";
150
+ readonly description: "Cache external documentation (from query-docs, WebFetch, etc.) for cheap semantic search later.\n\nAfter fetching documentation from an external source, call this tool to store it. Subsequent queries about the same library will use search_documents (~20 tokens/result) instead of re-fetching (~5K+ tokens).\n\nThe content is split into chunks, embedded, and stored in a vector collection grouped by library. A TTL tracks staleness — stale docs still return results but are flagged.";
151
+ readonly inputSchema: {
152
+ readonly type: "object";
153
+ readonly properties: {
154
+ readonly content: {
155
+ readonly type: "string";
156
+ readonly description: "The full text content of the documentation to cache.";
157
+ };
158
+ readonly source: {
159
+ readonly type: "string";
160
+ readonly description: "Source URL or identifier (e.g., \"https://docs.langfuse.com/guides/evaluators\" or \"context7:langfuse/hooks\").";
161
+ };
162
+ readonly library: {
163
+ readonly type: "string";
164
+ readonly description: "Library name (e.g., \"react\", \"langfuse\"). Used for collection grouping.";
165
+ };
166
+ readonly topic: {
167
+ readonly type: "string";
168
+ readonly description: "Topic within the library (e.g., \"hooks\", \"evaluators\").";
169
+ };
170
+ readonly ttlDays: {
171
+ readonly type: "number";
172
+ readonly description: "Days before the cached content is considered stale.";
173
+ readonly default: 7;
174
+ };
175
+ };
176
+ readonly required: readonly ["content", "source", "library", "topic"];
177
+ };
178
+ }, {
179
+ readonly name: "search_documents";
180
+ readonly description: "Search cached documentation using natural language queries.\n\nReturns results from previously cached documentation (via index_document). Much cheaper than re-fetching docs (~20 tokens/result vs ~5K+ tokens/fetch).\n\nIf a specific library is provided, searches only that library's collection. Otherwise searches across all cached documentation. Results include staleness indicators.";
181
+ readonly inputSchema: {
182
+ readonly type: "object";
183
+ readonly properties: {
184
+ readonly query: {
185
+ readonly type: "string";
186
+ readonly description: "Natural language query to search cached documentation.";
187
+ };
188
+ readonly library: {
189
+ readonly type: "string";
190
+ readonly description: "Optional: limit search to a specific library (e.g., \"langfuse\"). Omit to search all cached docs.";
191
+ };
192
+ readonly limit: {
193
+ readonly type: "number";
194
+ readonly description: "Maximum number of results to return.";
195
+ readonly default: 5;
196
+ readonly maximum: 20;
197
+ };
198
+ };
199
+ readonly required: readonly ["query"];
200
+ };
201
+ }, {
202
+ readonly name: "read_file";
203
+ readonly description: "Read a file and return raw content without line-number overhead (~15-20% fewer tokens than built-in Read for code, more for short-line files).\n\nUse offset and limit to page through large files. Add lineNumbers=true only when you need line references for editing.";
204
+ readonly inputSchema: {
205
+ readonly type: "object";
206
+ readonly properties: {
207
+ readonly path: {
208
+ readonly type: "string";
209
+ readonly description: "Absolute file path to read.";
210
+ };
211
+ readonly offset: {
212
+ readonly type: "number";
213
+ readonly description: "1-based line number to start reading from.";
214
+ readonly default: 1;
215
+ };
216
+ readonly limit: {
217
+ readonly type: "number";
218
+ readonly description: "Maximum number of lines to return.";
219
+ readonly default: 5000;
220
+ readonly maximum: 10000;
221
+ };
222
+ readonly lineNumbers: {
223
+ readonly type: "boolean";
224
+ readonly description: "Prefix each line with its line number. Only enable when you need line references for editing.";
225
+ readonly default: false;
226
+ };
227
+ };
228
+ readonly required: readonly ["path"];
229
+ };
230
+ }, {
231
+ readonly name: "add_memory";
232
+ readonly description: "Extract and store developer knowledge from text. Uses LLM to identify facts about coding style, tools, architecture, conventions, debugging insights, and workflow preferences. Automatically deduplicates against existing memories.";
233
+ readonly inputSchema: {
234
+ readonly type: "object";
235
+ readonly properties: {
236
+ readonly content: {
237
+ readonly type: "string";
238
+ readonly description: "Text containing developer knowledge to extract and store (conversation snippets, notes, preferences).";
239
+ };
240
+ readonly source: {
241
+ readonly type: "string";
242
+ readonly description: "Optional source identifier (e.g., \"conversation\", \"claude-code\", \"user-note\").";
243
+ };
244
+ };
245
+ readonly required: readonly ["content"];
246
+ };
247
+ }, {
248
+ readonly name: "search_memory";
249
+ readonly description: "Search stored developer memories using natural language. Returns semantically similar memories ranked by relevance.";
250
+ readonly inputSchema: {
251
+ readonly type: "object";
252
+ readonly properties: {
253
+ readonly query: {
254
+ readonly type: "string";
255
+ readonly description: "Natural language query to search memories.";
256
+ };
257
+ readonly limit: {
258
+ readonly type: "number";
259
+ readonly description: "Maximum number of results.";
260
+ readonly default: 10;
261
+ readonly maximum: 50;
262
+ };
263
+ readonly category: {
264
+ readonly type: "string";
265
+ readonly description: "Filter by category: coding_style, tools, architecture, conventions, debugging, workflow, preferences.";
266
+ readonly enum: readonly ["coding_style", "tools", "architecture", "conventions", "debugging", "workflow", "preferences"];
267
+ };
268
+ };
269
+ readonly required: readonly ["query"];
270
+ };
271
+ }, {
272
+ readonly name: "list_memories";
273
+ readonly description: "List all stored developer memories, optionally filtered by category.";
274
+ readonly inputSchema: {
275
+ readonly type: "object";
276
+ readonly properties: {
277
+ readonly category: {
278
+ readonly type: "string";
279
+ readonly description: "Filter by category: coding_style, tools, architecture, conventions, debugging, workflow, preferences.";
280
+ readonly enum: readonly ["coding_style", "tools", "architecture", "conventions", "debugging", "workflow", "preferences"];
281
+ };
282
+ readonly limit: {
283
+ readonly type: "number";
284
+ readonly description: "Maximum number of memories to return.";
285
+ readonly default: 50;
286
+ readonly maximum: 100;
287
+ };
288
+ };
289
+ readonly required: readonly [];
290
+ };
291
+ }, {
292
+ readonly name: "delete_memory";
293
+ readonly description: "Delete a specific memory by its ID.";
294
+ readonly inputSchema: {
295
+ readonly type: "object";
296
+ readonly properties: {
297
+ readonly id: {
298
+ readonly type: "string";
299
+ readonly description: "The UUID of the memory to delete.";
300
+ };
301
+ };
302
+ readonly required: readonly ["id"];
303
+ };
304
+ }, {
305
+ readonly name: "memory_history";
306
+ readonly description: "View the change history for a specific memory (additions, updates, deletions).";
307
+ readonly inputSchema: {
308
+ readonly type: "object";
309
+ readonly properties: {
310
+ readonly id: {
311
+ readonly type: "string";
312
+ readonly description: "The UUID of the memory to view history for.";
313
+ };
314
+ };
315
+ readonly required: readonly ["id"];
316
+ };
317
+ }, {
318
+ readonly name: "browse_structure";
319
+ readonly description: "Show a condensed structural map of the indexed codebase — classes, functions, methods with signatures, grouped by file.\nPrefer over Glob + Read cascades for understanding architecture — one call vs many.\n\nProvide either `path` (absolute) or `project` (name). Use `list_indexed` to see registered projects.";
320
+ readonly inputSchema: {
321
+ readonly type: "object";
322
+ readonly properties: {
323
+ readonly path: {
324
+ readonly type: "string";
325
+ readonly description: "Absolute path to the codebase directory.";
326
+ };
327
+ readonly project: {
328
+ readonly type: "string";
329
+ readonly description: "Project name (resolves via registry). Use list_indexed to see registered projects.";
330
+ };
331
+ readonly pathFilter: {
332
+ readonly type: "string";
333
+ readonly description: "Glob pattern to filter by file path (e.g., \"src/core/**\", \"**/*.ts\").";
334
+ };
335
+ readonly kind: {
336
+ readonly type: "string";
337
+ readonly description: "Filter by symbol kind: function, class, interface, method, type, enum, etc.";
338
+ };
339
+ readonly maxTokens: {
340
+ readonly type: "number";
341
+ readonly description: "Approximate token budget for the output (1 token ≈ 4 chars). Default: 4000.";
342
+ readonly default: 4000;
343
+ };
344
+ };
345
+ readonly required: readonly [];
346
+ };
347
+ }, {
348
+ readonly name: "list_symbols";
349
+ readonly description: "List symbols (functions, classes, methods, etc.) from the indexed codebase as a compact table. Supports filtering by name, kind, or path.\n\nProvide either `path` (absolute) or `project` (name). Use `list_indexed` to see registered projects.";
350
+ readonly inputSchema: {
351
+ readonly type: "object";
352
+ readonly properties: {
353
+ readonly path: {
354
+ readonly type: "string";
355
+ readonly description: "Absolute path to the codebase directory.";
356
+ };
357
+ readonly project: {
358
+ readonly type: "string";
359
+ readonly description: "Project name (resolves via registry). Use list_indexed to see registered projects.";
360
+ };
361
+ readonly pathFilter: {
362
+ readonly type: "string";
363
+ readonly description: "Glob pattern to filter by file path (e.g., \"src/core/**\").";
364
+ };
365
+ readonly kind: {
366
+ readonly type: "string";
367
+ readonly description: "Filter by symbol kind: function, class, interface, method, type, enum, etc.";
368
+ };
369
+ readonly nameFilter: {
370
+ readonly type: "string";
371
+ readonly description: "Substring filter on symbol name (case-insensitive).";
372
+ };
373
+ };
374
+ readonly required: readonly [];
375
+ };
126
376
  }, {
127
377
  readonly name: "__IMPORTANT";
128
378
  readonly description: "Workflow guidance for efficient code search. ALWAYS index before searching. Use project names after first index. Use extensionFilter to narrow results.";