@blamechris/repo-memory 0.6.0 → 0.9.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 (59) hide show
  1. package/README.md +48 -9
  2. package/dist/cache/store.d.ts +10 -0
  3. package/dist/cache/store.d.ts.map +1 -1
  4. package/dist/cache/store.js +21 -0
  5. package/dist/cache/store.js.map +1 -1
  6. package/dist/config.d.ts +2 -0
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +66 -31
  9. package/dist/config.js.map +1 -1
  10. package/dist/grammars/tree-sitter-javascript.wasm +0 -0
  11. package/dist/grammars/tree-sitter-tsx.wasm +0 -0
  12. package/dist/grammars/tree-sitter-typescript.wasm +0 -0
  13. package/dist/indexer/ast-summarizer.d.ts +10 -0
  14. package/dist/indexer/ast-summarizer.d.ts.map +1 -0
  15. package/dist/indexer/ast-summarizer.js +401 -0
  16. package/dist/indexer/ast-summarizer.js.map +1 -0
  17. package/dist/indexer/imports.d.ts.map +1 -1
  18. package/dist/indexer/imports.js +2 -1
  19. package/dist/indexer/imports.js.map +1 -1
  20. package/dist/indexer/project-map.d.ts +0 -2
  21. package/dist/indexer/project-map.d.ts.map +1 -1
  22. package/dist/indexer/project-map.js +13 -9
  23. package/dist/indexer/project-map.js.map +1 -1
  24. package/dist/indexer/scanner.d.ts.map +1 -1
  25. package/dist/indexer/scanner.js +2 -1
  26. package/dist/indexer/scanner.js.map +1 -1
  27. package/dist/indexer/smart-summarizer.d.ts +2 -2
  28. package/dist/indexer/smart-summarizer.d.ts.map +1 -1
  29. package/dist/indexer/smart-summarizer.js +4 -4
  30. package/dist/indexer/smart-summarizer.js.map +1 -1
  31. package/dist/indexer/summarize.d.ts +21 -0
  32. package/dist/indexer/summarize.d.ts.map +1 -0
  33. package/dist/indexer/summarize.js +50 -0
  34. package/dist/indexer/summarize.js.map +1 -0
  35. package/dist/indexer/summarizer.js +1 -1
  36. package/dist/indexer/summarizer.js.map +1 -1
  37. package/dist/persistence/db.d.ts.map +1 -1
  38. package/dist/persistence/db.js +11 -0
  39. package/dist/persistence/db.js.map +1 -1
  40. package/dist/server.js +14 -7
  41. package/dist/server.js.map +1 -1
  42. package/dist/tools/force-reread.d.ts.map +1 -1
  43. package/dist/tools/force-reread.js +3 -2
  44. package/dist/tools/force-reread.js.map +1 -1
  45. package/dist/tools/get-file-summary.d.ts.map +1 -1
  46. package/dist/tools/get-file-summary.js +3 -2
  47. package/dist/tools/get-file-summary.js.map +1 -1
  48. package/dist/tools/search-by-purpose.d.ts +2 -1
  49. package/dist/tools/search-by-purpose.d.ts.map +1 -1
  50. package/dist/tools/search-by-purpose.js +24 -5
  51. package/dist/tools/search-by-purpose.js.map +1 -1
  52. package/dist/utils/posix-path.d.ts +14 -0
  53. package/dist/utils/posix-path.d.ts.map +1 -0
  54. package/dist/utils/posix-path.js +16 -0
  55. package/dist/utils/posix-path.js.map +1 -0
  56. package/dist/utils/validate-path.d.ts.map +1 -1
  57. package/dist/utils/validate-path.js +2 -1
  58. package/dist/utils/validate-path.js.map +1 -1
  59. package/package.json +6 -4
package/README.md CHANGED
@@ -62,20 +62,39 @@ The savings compound fast. An agent exploring a project touches the same files 3
62
62
 
63
63
  ## Tools
64
64
 
65
+ Tools are organized into **groups**. `navigation` and `summaries` are **on by default** — together they deliver the core "understand the repo without re-reading" loop. `tasks` and `telemetry` are **off by default** (niche/meta features; each MCP tool adds ~100 tokens/turn, so the default surface stays lean). Toggle any group in `.repo-memory.json` (see [Configuration](#configuration)).
66
+
67
+ **Navigation** — always on:
68
+
65
69
  | Tool | Description |
66
70
  |------|-------------|
67
- | `get_file_summary` | Cached file summary (exports, imports, purpose) |
68
- | `batch_file_summaries` | Get summaries for multiple files at once |
69
- | `get_changed_files` | Files changed since last check |
70
71
  | `get_project_map` | Structural overview of project |
71
- | `search_by_purpose` | Search files by purpose/exports keywords |
72
72
  | `get_related_files` | Find related files ranked by relevance |
73
73
  | `get_dependency_graph` | File dependency relationships |
74
- | `create_task` / `get_task_context` / `mark_explored` | Track investigation progress across turns |
75
- | `get_token_report` | Token usage and savings report |
74
+ | `get_changed_files` | Files changed since last check |
75
+
76
+ **Summaries** — on by default (the core feature); disable with `"tools": { "summaries": false }`:
77
+
78
+ | Tool | Description |
79
+ |------|-------------|
80
+ | `get_file_summary` | Cached file summary (exports, imports, purpose) |
81
+ | `batch_file_summaries` | Get summaries for multiple files at once |
82
+ | `search_by_purpose` | Search files by purpose/exports keywords |
76
83
  | `force_reread` | Force fresh summary generation |
77
84
  | `invalidate` | Clear cache entries |
78
85
 
86
+ **Tasks** — off by default; enable with `"tools": { "tasks": true }`:
87
+
88
+ | Tool | Description |
89
+ |------|-------------|
90
+ | `create_task` / `get_task_context` / `mark_explored` | Track investigation progress across turns |
91
+
92
+ **Telemetry** — off by default; enable with `"tools": { "telemetry": true }`:
93
+
94
+ | Tool | Description |
95
+ |------|-------------|
96
+ | `get_token_report` | Token usage and savings report |
97
+
79
98
  ## Token Savings Tracking
80
99
 
81
100
  repo-memory tracks every cache interaction so you can measure exactly how many tokens you're saving. Call `get_token_report` at any time to see your stats.
@@ -162,16 +181,36 @@ Create a `.repo-memory.json` in your project root to customize behavior:
162
181
  {
163
182
  "ignore": ["dist", "node_modules", "*.generated.ts"],
164
183
  "maxFiles": 5000,
184
+ "summarizer": "ast",
165
185
  "gc": {
166
- "cacheMaxAgeDays": 30
186
+ "cacheMaxAgeDays": 30,
187
+ "taskMaxAgeDays": 30,
188
+ "telemetryMaxAgeDays": 90
189
+ },
190
+ "tools": {
191
+ "tasks": true,
192
+ "telemetry": true
167
193
  }
168
194
  }
169
195
  ```
170
196
 
197
+ `summarizer` selects the summary engine: `"regex"` (default) or `"ast"`. AST mode parses TypeScript/JavaScript files (`.ts/.tsx/.js/.jsx/.mjs/.cjs`) with tree-sitter, producing accurate exports/declarations and a semantic `purpose` line that names the dominant symbols (e.g. `class CacheStore (9 methods)` instead of `source`) — which is what `search_by_purpose` matches against. TS/JS only for now; other languages, unsupported extensions, and files with parse errors fall back to the regex summarizer automatically. Switching modes regenerates summaries lazily on next access.
198
+
199
+ The `tools` block toggles tool groups. `navigation` and `summaries` are **on by default** (set `"summaries": false` to drop the summary tools); `tasks` and `telemetry` are **off by default** (set them to `true` to enable).
200
+
201
+ The `gc` block controls garbage collection, which runs automatically on server startup:
202
+ - `cacheMaxAgeDays` — remove cache entries not checked in N days (default: 30)
203
+ - `taskMaxAgeDays` — remove completed/archived tasks not updated in N days (default: 30)
204
+ - `telemetryMaxAgeDays` — remove telemetry events older than N days (default: 90)
205
+
206
+ GC also removes cache entries for deleted files and orphaned import records, regardless of age.
207
+
208
+ Config validation is per-key: an invalid value is skipped with a warning on stderr while the remaining valid keys still apply. Only a file that can't be read or parsed as JSON falls back entirely to built-in defaults.
209
+
171
210
  ## Language Support
172
211
 
173
- Summaries are extracted via regex analysis. Supported languages:
174
- - **TypeScript / JavaScript** — exports, imports, declarations, purpose classification
212
+ Summaries are extracted via regex analysis (or tree-sitter when `"summarizer": "ast"` is set — TS/JS only). Supported languages:
213
+ - **TypeScript / JavaScript** — exports, imports, declarations, purpose classification; optional AST mode for semantic purpose lines
175
214
  - **Python** — functions, classes, `__all__`, `from`/`import` statements
176
215
  - **Go** — exported names (uppercase), imports, type/func/var/const declarations
177
216
  - **Rust** — `pub` items, `use`/`mod` statements, structs/enums/traits/impls
@@ -11,6 +11,16 @@ export declare class CacheStore {
11
11
  hash: string;
12
12
  summary?: FileSummary | null;
13
13
  }>): void;
14
+ /** Read a value from the meta key/value table. */
15
+ getMeta(key: string): string | null;
16
+ /** Write a value to the meta key/value table. */
17
+ setMeta(key: string, value: string): void;
18
+ /**
19
+ * Drop all cached summaries while keeping hashes and timestamps. Used when
20
+ * the summarizer implementation changes: change detection stays intact and
21
+ * summaries regenerate lazily on next access.
22
+ */
23
+ clearAllSummaries(): void;
14
24
  getStaleEntries(maxAge: number): CacheEntry[];
15
25
  }
16
26
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/cache/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAkB3D,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,WAAW,EAAE,MAAM;IAI/B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IASzC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAevE,aAAa,IAAI,UAAU,EAAE;IAS7B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK/B,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;KAAE,CAAC,GAAG,IAAI;IAsB9F,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE;CAW9C"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/cache/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAkB3D,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,WAAW,EAAE,MAAM;IAI/B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IASzC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAevE,aAAa,IAAI,UAAU,EAAE;IAS7B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK/B,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;KAAE,CAAC,GAAG,IAAI;IAsB9F,kDAAkD;IAClD,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQnC,iDAAiD;IACjD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAQzC;;;;OAIG;IACH,iBAAiB,IAAI,IAAI;IAKzB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE;CAW9C"}
@@ -58,6 +58,27 @@ export class CacheStore {
58
58
  });
59
59
  runBatch();
60
60
  }
61
+ /** Read a value from the meta key/value table. */
62
+ getMeta(key) {
63
+ const db = getDatabase(this.projectRoot);
64
+ const row = db.prepare('SELECT value FROM meta WHERE key = ?').get(key);
65
+ return row?.value ?? null;
66
+ }
67
+ /** Write a value to the meta key/value table. */
68
+ setMeta(key, value) {
69
+ const db = getDatabase(this.projectRoot);
70
+ db.prepare(`INSERT INTO meta (key, value) VALUES (?, ?)
71
+ ON CONFLICT(key) DO UPDATE SET value = excluded.value`).run(key, value);
72
+ }
73
+ /**
74
+ * Drop all cached summaries while keeping hashes and timestamps. Used when
75
+ * the summarizer implementation changes: change detection stays intact and
76
+ * summaries regenerate lazily on next access.
77
+ */
78
+ clearAllSummaries() {
79
+ const db = getDatabase(this.projectRoot);
80
+ db.prepare('UPDATE files SET summary_json = NULL').run();
81
+ }
61
82
  getStaleEntries(maxAge) {
62
83
  const db = getDatabase(this.projectRoot);
63
84
  const cutoff = Date.now() - maxAge;
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/cache/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/cache/store.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -6,6 +6,8 @@ export interface ToolGroupConfig {
6
6
  export interface RepoMemoryConfig {
7
7
  ignore?: string[];
8
8
  maxFiles?: number;
9
+ /** Summary engine for TS/JS files: 'regex' (default) or 'ast' (tree-sitter). */
10
+ summarizer?: 'regex' | 'ast';
9
11
  gc?: {
10
12
  cacheMaxAgeDays?: number;
11
13
  taskMaxAgeDays?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE;QACH,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAID,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAqBhE;AA6DD,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,UAAU,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAC7B,EAAE,CAAC,EAAE;QACH,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAQD,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAqBhE;AAiFD,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
package/dist/config.js CHANGED
@@ -2,6 +2,9 @@ import { readFileSync, existsSync } from 'fs';
2
2
  import { join } from 'path';
3
3
  const CONFIG_FILENAME = '.repo-memory.json';
4
4
  const configCache = new Map();
5
+ function warn(message) {
6
+ process.stderr.write(`Warning: ${CONFIG_FILENAME}: ${message}\n`);
7
+ }
5
8
  export function loadConfig(projectRoot) {
6
9
  const cached = configCache.get(projectRoot);
7
10
  if (cached)
@@ -11,62 +14,94 @@ export function loadConfig(projectRoot) {
11
14
  if (existsSync(configPath)) {
12
15
  try {
13
16
  const raw = readFileSync(configPath, 'utf-8');
14
- const parsed = JSON.parse(raw);
15
- config = validateConfig(parsed);
17
+ config = validateConfig(JSON.parse(raw));
16
18
  }
17
19
  catch (err) {
18
- process.stderr.write(`Warning: failed to load ${CONFIG_FILENAME}: ${err instanceof Error ? err.message : String(err)}\n`);
20
+ // Reached only if the file can't be read (IO/permissions) or parsed —
21
+ // validateConfig never throws, it skips invalid keys. Either way, fall
22
+ // back to built-in defaults.
23
+ warn(`failed to load: ${err instanceof Error ? err.message : String(err)}`);
19
24
  }
20
25
  }
21
26
  configCache.set(projectRoot, config);
22
27
  return config;
23
28
  }
29
+ // Validate per key: an invalid key is skipped with a warning and the valid keys
30
+ // are still applied, rather than discarding the whole config on one bad value.
31
+ // (A non-object root, or a non-object gc/tools, drops just that scope.)
24
32
  function validateConfig(raw) {
33
+ const config = {};
25
34
  if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
26
- throw new Error('Config must be a JSON object');
35
+ warn('must be a JSON object; using defaults');
36
+ return config;
27
37
  }
28
38
  const obj = raw;
29
- const config = {};
30
39
  if ('ignore' in obj) {
31
- if (!Array.isArray(obj.ignore) || !obj.ignore.every((v) => typeof v === 'string')) {
32
- throw new Error('"ignore" must be an array of strings');
40
+ if (Array.isArray(obj.ignore) && obj.ignore.every((v) => typeof v === 'string')) {
41
+ config.ignore = obj.ignore;
42
+ }
43
+ else {
44
+ warn('"ignore" must be an array of strings; ignoring it');
33
45
  }
34
- config.ignore = obj.ignore;
35
46
  }
36
47
  if ('maxFiles' in obj) {
37
- if (typeof obj.maxFiles !== 'number' || obj.maxFiles < 1) {
38
- throw new Error('"maxFiles" must be a positive number');
48
+ if (typeof obj.maxFiles === 'number' && obj.maxFiles >= 1) {
49
+ config.maxFiles = obj.maxFiles;
50
+ }
51
+ else {
52
+ warn('"maxFiles" must be a positive number; ignoring it');
39
53
  }
40
- config.maxFiles = obj.maxFiles;
41
54
  }
42
- if ('gc' in obj) {
43
- if (typeof obj.gc !== 'object' || obj.gc === null || Array.isArray(obj.gc)) {
44
- throw new Error('"gc" must be an object');
55
+ if ('summarizer' in obj) {
56
+ if (obj.summarizer === 'regex' || obj.summarizer === 'ast') {
57
+ config.summarizer = obj.summarizer;
45
58
  }
46
- const gc = obj.gc;
47
- config.gc = {};
48
- for (const key of ['cacheMaxAgeDays', 'taskMaxAgeDays', 'telemetryMaxAgeDays']) {
49
- if (key in gc) {
50
- if (typeof gc[key] !== 'number' || gc[key] < 1) {
51
- throw new Error(`"gc.${key}" must be a positive number`);
59
+ else {
60
+ warn('"summarizer" must be "regex" or "ast"; ignoring it');
61
+ }
62
+ }
63
+ if ('gc' in obj) {
64
+ if (typeof obj.gc === 'object' && obj.gc !== null && !Array.isArray(obj.gc)) {
65
+ const gc = obj.gc;
66
+ const out = {};
67
+ for (const key of ['cacheMaxAgeDays', 'taskMaxAgeDays', 'telemetryMaxAgeDays']) {
68
+ if (key in gc) {
69
+ const value = gc[key];
70
+ if (typeof value === 'number' && value >= 1) {
71
+ out[key] = value;
72
+ }
73
+ else {
74
+ warn(`"gc.${key}" must be a positive number; ignoring it`);
75
+ }
52
76
  }
53
- config.gc[key] = gc[key];
54
77
  }
78
+ if (Object.keys(out).length > 0)
79
+ config.gc = out;
80
+ }
81
+ else {
82
+ warn('"gc" must be an object; ignoring it');
55
83
  }
56
84
  }
57
85
  if ('tools' in obj) {
58
- if (typeof obj.tools !== 'object' || obj.tools === null || Array.isArray(obj.tools)) {
59
- throw new Error('"tools" must be an object');
60
- }
61
- const tools = obj.tools;
62
- config.tools = {};
63
- for (const key of ['summaries', 'tasks', 'telemetry']) {
64
- if (key in tools) {
65
- if (typeof tools[key] !== 'boolean') {
66
- throw new Error(`"tools.${key}" must be a boolean`);
86
+ if (typeof obj.tools === 'object' && obj.tools !== null && !Array.isArray(obj.tools)) {
87
+ const tools = obj.tools;
88
+ const out = {};
89
+ for (const key of ['summaries', 'tasks', 'telemetry']) {
90
+ if (key in tools) {
91
+ const value = tools[key];
92
+ if (typeof value === 'boolean') {
93
+ out[key] = value;
94
+ }
95
+ else {
96
+ warn(`"tools.${key}" must be a boolean; ignoring it`);
97
+ }
67
98
  }
68
- config.tools[key] = tools[key];
69
99
  }
100
+ if (Object.keys(out).length > 0)
101
+ config.tools = out;
102
+ }
103
+ else {
104
+ warn('"tools" must be an object; ignoring it');
70
105
  }
71
106
  }
72
107
  return config;
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { FileSummary } from '../types.js';
2
+ /**
3
+ * Summarize a TS/JS file from its syntax tree. Falls back to the regex
4
+ * summarizer for unsupported extensions, empty files, parse errors, or when
5
+ * the WASM runtime cannot be loaded.
6
+ */
7
+ export declare function summarizeFileAst(filePath: string, contents: string): Promise<FileSummary>;
8
+ /** True when the AST summarizer handles this file natively (vs regex fallback). */
9
+ export declare function isAstSupported(filePath: string): boolean;
10
+ //# sourceMappingURL=ast-summarizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-summarizer.d.ts","sourceRoot":"","sources":["../../src/indexer/ast-summarizer.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA+Y/C;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAmC/F;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD"}