@blamechris/repo-memory 0.1.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 (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +85 -0
  3. package/dist/cache/gc.d.ts +14 -0
  4. package/dist/cache/gc.d.ts.map +1 -0
  5. package/dist/cache/gc.js +75 -0
  6. package/dist/cache/gc.js.map +1 -0
  7. package/dist/cache/hash.d.ts +10 -0
  8. package/dist/cache/hash.d.ts.map +1 -0
  9. package/dist/cache/hash.js +22 -0
  10. package/dist/cache/hash.js.map +1 -0
  11. package/dist/cache/invalidation.d.ts +29 -0
  12. package/dist/cache/invalidation.d.ts.map +1 -0
  13. package/dist/cache/invalidation.js +58 -0
  14. package/dist/cache/invalidation.js.map +1 -0
  15. package/dist/cache/ranking.d.ts +57 -0
  16. package/dist/cache/ranking.d.ts.map +1 -0
  17. package/dist/cache/ranking.js +196 -0
  18. package/dist/cache/ranking.js.map +1 -0
  19. package/dist/cache/store.d.ts +16 -0
  20. package/dist/cache/store.d.ts.map +1 -0
  21. package/dist/cache/store.js +70 -0
  22. package/dist/cache/store.js.map +1 -0
  23. package/dist/graph/dependency-graph.d.ts +26 -0
  24. package/dist/graph/dependency-graph.d.ts.map +1 -0
  25. package/dist/graph/dependency-graph.js +131 -0
  26. package/dist/graph/dependency-graph.js.map +1 -0
  27. package/dist/indexer/diff-analyzer.d.ts +8 -0
  28. package/dist/indexer/diff-analyzer.d.ts.map +1 -0
  29. package/dist/indexer/diff-analyzer.js +95 -0
  30. package/dist/indexer/diff-analyzer.js.map +1 -0
  31. package/dist/indexer/imports.d.ts +3 -0
  32. package/dist/indexer/imports.d.ts.map +1 -0
  33. package/dist/indexer/imports.js +123 -0
  34. package/dist/indexer/imports.js.map +1 -0
  35. package/dist/indexer/project-map.d.ts +20 -0
  36. package/dist/indexer/project-map.d.ts.map +1 -0
  37. package/dist/indexer/project-map.js +120 -0
  38. package/dist/indexer/project-map.js.map +1 -0
  39. package/dist/indexer/scanner.d.ts +7 -0
  40. package/dist/indexer/scanner.d.ts.map +1 -0
  41. package/dist/indexer/scanner.js +114 -0
  42. package/dist/indexer/scanner.js.map +1 -0
  43. package/dist/indexer/smart-summarizer.d.ts +6 -0
  44. package/dist/indexer/smart-summarizer.d.ts.map +1 -0
  45. package/dist/indexer/smart-summarizer.js +26 -0
  46. package/dist/indexer/smart-summarizer.js.map +1 -0
  47. package/dist/indexer/summarizer.d.ts +3 -0
  48. package/dist/indexer/summarizer.d.ts.map +1 -0
  49. package/dist/indexer/summarizer.js +145 -0
  50. package/dist/indexer/summarizer.js.map +1 -0
  51. package/dist/memory/session.d.ts +18 -0
  52. package/dist/memory/session.d.ts.map +1 -0
  53. package/dist/memory/session.js +75 -0
  54. package/dist/memory/session.js.map +1 -0
  55. package/dist/memory/task.d.ts +35 -0
  56. package/dist/memory/task.d.ts.map +1 -0
  57. package/dist/memory/task.js +120 -0
  58. package/dist/memory/task.js.map +1 -0
  59. package/dist/persistence/db.d.ts +4 -0
  60. package/dist/persistence/db.d.ts.map +1 -0
  61. package/dist/persistence/db.js +146 -0
  62. package/dist/persistence/db.js.map +1 -0
  63. package/dist/server.d.ts +3 -0
  64. package/dist/server.d.ts.map +1 -0
  65. package/dist/server.js +197 -0
  66. package/dist/server.js.map +1 -0
  67. package/dist/telemetry/tracker.d.ts +40 -0
  68. package/dist/telemetry/tracker.d.ts.map +1 -0
  69. package/dist/telemetry/tracker.js +136 -0
  70. package/dist/telemetry/tracker.js.map +1 -0
  71. package/dist/tools/force-reread.d.ts +9 -0
  72. package/dist/tools/force-reread.d.ts.map +1 -0
  73. package/dist/tools/force-reread.js +17 -0
  74. package/dist/tools/force-reread.js.map +1 -0
  75. package/dist/tools/get-changed-files.d.ts +8 -0
  76. package/dist/tools/get-changed-files.d.ts.map +1 -0
  77. package/dist/tools/get-changed-files.js +61 -0
  78. package/dist/tools/get-changed-files.js.map +1 -0
  79. package/dist/tools/get-dependency-graph.d.ts +17 -0
  80. package/dist/tools/get-dependency-graph.d.ts.map +1 -0
  81. package/dist/tools/get-dependency-graph.js +88 -0
  82. package/dist/tools/get-dependency-graph.js.map +1 -0
  83. package/dist/tools/get-file-summary.d.ts +12 -0
  84. package/dist/tools/get-file-summary.d.ts.map +1 -0
  85. package/dist/tools/get-file-summary.js +53 -0
  86. package/dist/tools/get-file-summary.js.map +1 -0
  87. package/dist/tools/get-project-map.d.ts +3 -0
  88. package/dist/tools/get-project-map.d.ts.map +1 -0
  89. package/dist/tools/get-project-map.js +5 -0
  90. package/dist/tools/get-project-map.js.map +1 -0
  91. package/dist/tools/get-token-report.d.ts +16 -0
  92. package/dist/tools/get-token-report.d.ts.map +1 -0
  93. package/dist/tools/get-token-report.js +44 -0
  94. package/dist/tools/get-token-report.js.map +1 -0
  95. package/dist/tools/invalidate.d.ts +5 -0
  96. package/dist/tools/invalidate.d.ts.map +1 -0
  97. package/dist/tools/invalidate.js +19 -0
  98. package/dist/tools/invalidate.js.map +1 -0
  99. package/dist/tools/task-context.d.ts +18 -0
  100. package/dist/tools/task-context.d.ts.map +1 -0
  101. package/dist/tools/task-context.js +28 -0
  102. package/dist/tools/task-context.js.map +1 -0
  103. package/dist/types.d.ts +21 -0
  104. package/dist/types.d.ts.map +1 -0
  105. package/dist/types.js +2 -0
  106. package/dist/types.js.map +1 -0
  107. package/dist/utils/validate-path.d.ts +10 -0
  108. package/dist/utils/validate-path.d.ts.map +1 -0
  109. package/dist/utils/validate-path.js +22 -0
  110. package/dist/utils/validate-path.js.map +1 -0
  111. package/package.json +62 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-map.js","sourceRoot":"","sources":["../../src/indexer/project-map.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface ScanOptions {
2
+ include?: string[];
3
+ exclude?: string[];
4
+ maxFiles?: number;
5
+ }
6
+ export declare function scanProject(rootDir: string, options?: ScanOptions): Promise<string[]>;
7
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/indexer/scanner.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA2GD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBnB"}
@@ -0,0 +1,114 @@
1
+ import { execFile } from 'child_process';
2
+ import { readdir } from 'fs/promises';
3
+ import { join, relative } from 'path';
4
+ import { promisify } from 'util';
5
+ const execFileAsync = promisify(execFile);
6
+ const BINARY_EXTENSIONS = new Set([
7
+ '.png', '.jpg', '.jpeg', '.gif', '.ico', '.bmp', '.webp',
8
+ '.woff', '.woff2', '.ttf', '.eot', '.otf',
9
+ '.pdf', '.zip', '.tar', '.gz', '.bz2', '.7z',
10
+ '.exe', '.dll', '.so', '.dylib',
11
+ '.mp3', '.mp4', '.wav', '.avi', '.mov',
12
+ ]);
13
+ const ALWAYS_SKIP = new Set(['.git', '.repo-memory', 'node_modules']);
14
+ function isBinaryPath(filePath) {
15
+ const dotIndex = filePath.lastIndexOf('.');
16
+ if (dotIndex === -1)
17
+ return false;
18
+ return BINARY_EXTENSIONS.has(filePath.slice(dotIndex).toLowerCase());
19
+ }
20
+ function matchesPattern(filePath, pattern) {
21
+ if (pattern.startsWith('*.')) {
22
+ return filePath.endsWith(pattern.slice(1));
23
+ }
24
+ if (pattern.endsWith('/') || pattern.endsWith('/*')) {
25
+ const dir = pattern.replace(/\/?\*?$/, '');
26
+ return filePath.startsWith(dir + '/') || filePath === dir;
27
+ }
28
+ return filePath.includes(pattern);
29
+ }
30
+ function shouldInclude(filePath, include, exclude) {
31
+ if (include && include.length > 0) {
32
+ const matched = include.some((p) => matchesPattern(filePath, p));
33
+ if (!matched)
34
+ return false;
35
+ }
36
+ if (exclude && exclude.length > 0) {
37
+ const matched = exclude.some((p) => matchesPattern(filePath, p));
38
+ if (matched)
39
+ return false;
40
+ }
41
+ return true;
42
+ }
43
+ async function isGitRepo(rootDir) {
44
+ try {
45
+ await execFileAsync('git', ['rev-parse', '--git-dir'], { cwd: rootDir });
46
+ return true;
47
+ }
48
+ catch {
49
+ return false;
50
+ }
51
+ }
52
+ async function scanWithGit(rootDir) {
53
+ const [tracked, untracked] = await Promise.all([
54
+ execFileAsync('git', ['ls-files'], { cwd: rootDir, maxBuffer: 10 * 1024 * 1024 }),
55
+ execFileAsync('git', ['ls-files', '--others', '--exclude-standard'], { cwd: rootDir, maxBuffer: 10 * 1024 * 1024 }),
56
+ ]);
57
+ const files = new Set();
58
+ for (const line of tracked.stdout.split('\n')) {
59
+ const trimmed = line.trim();
60
+ if (trimmed)
61
+ files.add(trimmed);
62
+ }
63
+ for (const line of untracked.stdout.split('\n')) {
64
+ const trimmed = line.trim();
65
+ if (trimmed)
66
+ files.add(trimmed);
67
+ }
68
+ return [...files];
69
+ }
70
+ async function scanWithFs(rootDir) {
71
+ const files = [];
72
+ async function walk(dir) {
73
+ let entries;
74
+ try {
75
+ entries = await readdir(dir, { withFileTypes: true });
76
+ }
77
+ catch {
78
+ return;
79
+ }
80
+ for (const entry of entries) {
81
+ if (ALWAYS_SKIP.has(entry.name))
82
+ continue;
83
+ const fullPath = join(dir, entry.name);
84
+ if (entry.isDirectory()) {
85
+ await walk(fullPath);
86
+ }
87
+ else if (entry.isFile()) {
88
+ files.push(relative(rootDir, fullPath));
89
+ }
90
+ }
91
+ }
92
+ await walk(rootDir);
93
+ return files;
94
+ }
95
+ export async function scanProject(rootDir, options) {
96
+ const useGit = await isGitRepo(rootDir);
97
+ const rawFiles = useGit ? await scanWithGit(rootDir) : await scanWithFs(rootDir);
98
+ let filtered = rawFiles.filter((f) => {
99
+ const parts = f.split('/');
100
+ if (parts.some((p) => ALWAYS_SKIP.has(p)))
101
+ return false;
102
+ if (isBinaryPath(f))
103
+ return false;
104
+ if (!shouldInclude(f, options?.include, options?.exclude))
105
+ return false;
106
+ return true;
107
+ });
108
+ filtered.sort((a, b) => a.localeCompare(b));
109
+ if (options?.maxFiles && filtered.length > options.maxFiles) {
110
+ filtered = filtered.slice(0, options.maxFiles);
111
+ }
112
+ return filtered;
113
+ }
114
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/indexer/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAQ1C,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IACzC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK;IAC5C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ;IAC/B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CACvC,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;AAEtE,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,QAAQ,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAClC,OAAO,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB,EAAE,OAAe;IACvD,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC3C,OAAO,QAAQ,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,QAAQ,KAAK,GAAG,CAAC;IAC5D,CAAC;IACD,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,aAAa,CACpB,QAAgB,EAChB,OAAkB,EAClB,OAAkB;IAElB,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;IAC7B,CAAC;IACD,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,IAAI,OAAO;YAAE,OAAO,KAAK,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAAe;IACtC,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,OAAe;IACxC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC7C,aAAa,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;QACjF,aAAa,CACX,KAAK,EACL,CAAC,UAAU,EAAE,UAAU,EAAE,oBAAoB,CAAC,EAC9C,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAC9C;KACF,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO;YAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO;YAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,OAAe;IACvC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,UAAU,IAAI,CAAC,GAAW;QAC7B,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAE1C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAEvC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;IACpB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAe,EACf,OAAqB;IAErB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;IAEjF,IAAI,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QACxD,IAAI,YAAY,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAClC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QACxE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5C,IAAI,OAAO,EAAE,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5D,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { FileSummary } from '../types.js';
2
+ export declare function smartSummarize(filePath: string, contents: string, oldSummary: FileSummary | null, projectRoot: string): {
3
+ summary: FileSummary;
4
+ source: 'full' | 'diff-partial';
5
+ };
6
+ //# sourceMappingURL=smart-summarizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-summarizer.d.ts","sourceRoot":"","sources":["../../src/indexer/smart-summarizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,WAAW,GAAG,IAAI,EAC9B,WAAW,EAAE,MAAM,GAClB;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAAA;CAAE,CA0B3D"}
@@ -0,0 +1,26 @@
1
+ import { analyzeDiff } from './diff-analyzer.js';
2
+ import { summarizeFile } from './summarizer.js';
3
+ export function smartSummarize(filePath, contents, oldSummary, projectRoot) {
4
+ if (!oldSummary) {
5
+ return {
6
+ summary: summarizeFile(filePath, contents),
7
+ source: 'full',
8
+ };
9
+ }
10
+ const analysis = analyzeDiff(filePath, projectRoot);
11
+ if (analysis.structural) {
12
+ return {
13
+ summary: summarizeFile(filePath, contents),
14
+ source: 'full',
15
+ };
16
+ }
17
+ const lineCount = contents === '' ? 0 : contents.split('\n').length;
18
+ return {
19
+ summary: {
20
+ ...oldSummary,
21
+ lineCount,
22
+ },
23
+ source: 'diff-partial',
24
+ };
25
+ }
26
+ //# sourceMappingURL=smart-summarizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-summarizer.js","sourceRoot":"","sources":["../../src/indexer/smart-summarizer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,UAAU,cAAc,CAC5B,QAAgB,EAChB,QAAgB,EAChB,UAA8B,EAC9B,WAAmB;IAEnB,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;YACL,OAAO,EAAE,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC;YAC1C,MAAM,EAAE,MAAM;SACf,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAEpD,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO;YACL,OAAO,EAAE,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC;YAC1C,MAAM,EAAE,MAAM;SACf,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAEpE,OAAO;QACL,OAAO,EAAE;YACP,GAAG,UAAU;YACb,SAAS;SACV;QACD,MAAM,EAAE,cAAc;KACvB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { FileSummary } from '../types.js';
2
+ export declare function summarizeFile(filePath: string, contents: string): FileSummary;
3
+ //# sourceMappingURL=summarizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../../src/indexer/summarizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAqI/C,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAkC7E"}
@@ -0,0 +1,145 @@
1
+ const TS_JS_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs']);
2
+ const CONFIG_EXTENSIONS = new Set(['.json', '.yaml', '.yml', '.toml']);
3
+ const EXPORT_PATTERN = /^export\s+(?:default\s+)?(?:const|let|var|function\s*\*?|class|interface|type|enum|abstract\s+class)\s+(\w+)/gm;
4
+ const DEFAULT_EXPORT_PATTERN = /^export\s+default\s+/gm;
5
+ const IMPORT_FROM_PATTERN = /^import\s+.*?\s+from\s+['"]([^'"]+)['"]/gm;
6
+ const IMPORT_SIDE_EFFECT_PATTERN = /^import\s+['"]([^'"]+)['"]/gm;
7
+ const TOP_LEVEL_DECLARATION_PATTERN = /^(?:export\s+)?(?:declare\s+)?(?:abstract\s+)?(?:async\s+)?(const|let|var|function\s*\*?|class|interface|type|enum)\s+(\w+)/gm;
8
+ function getExtension(filePath) {
9
+ if (filePath.endsWith('.d.ts'))
10
+ return '.d.ts';
11
+ const dot = filePath.lastIndexOf('.');
12
+ return dot === -1 ? '' : filePath.slice(dot);
13
+ }
14
+ function getBasename(filePath) {
15
+ const slash = filePath.lastIndexOf('/');
16
+ return slash === -1 ? filePath : filePath.slice(slash + 1);
17
+ }
18
+ function classifyPurpose(filePath, contents, ext) {
19
+ const basename = getBasename(filePath);
20
+ if (ext === '.d.ts')
21
+ return 'types';
22
+ if (/\.(?:test|spec)\.[tj]sx?$/.test(basename))
23
+ return 'test';
24
+ if (/\.config\.[tj]sx?$/.test(basename) || /\.config\.mjs$/.test(basename))
25
+ return 'config';
26
+ if (basename === 'types.ts' || basename === 'interfaces.ts')
27
+ return 'types';
28
+ if (basename === 'index.ts' || basename === 'index.js')
29
+ return 'entry point';
30
+ const dir = filePath.replace(/\\/g, '/');
31
+ if (dir.includes('/bin/') || dir.endsWith('/bin'))
32
+ return 'entry point';
33
+ if (/\bmain\s*\(/.test(contents))
34
+ return 'entry point';
35
+ return 'source';
36
+ }
37
+ function classifyNonCodePurpose(ext) {
38
+ switch (ext) {
39
+ case '.json':
40
+ return 'config';
41
+ case '.md':
42
+ return 'documentation';
43
+ case '.yml':
44
+ case '.yaml':
45
+ return 'config';
46
+ case '.css':
47
+ case '.scss':
48
+ case '.less':
49
+ return 'styles';
50
+ case '.html':
51
+ return 'markup';
52
+ case '.svg':
53
+ case '.png':
54
+ case '.jpg':
55
+ case '.jpeg':
56
+ case '.gif':
57
+ return 'asset';
58
+ case '.sh':
59
+ case '.bash':
60
+ return 'script';
61
+ case '.env':
62
+ return 'config';
63
+ case '.lock':
64
+ return 'lockfile';
65
+ default:
66
+ return 'other';
67
+ }
68
+ }
69
+ function extractMatches(contents, pattern, group) {
70
+ const results = [];
71
+ const re = new RegExp(pattern.source, pattern.flags);
72
+ let match;
73
+ while ((match = re.exec(contents)) !== null) {
74
+ results.push(match[group]);
75
+ }
76
+ return results;
77
+ }
78
+ function extractExports(contents) {
79
+ const named = extractMatches(contents, EXPORT_PATTERN, 1);
80
+ const defaults = extractMatches(contents, DEFAULT_EXPORT_PATTERN, 0);
81
+ const hasDefault = defaults.some((d) => !EXPORT_PATTERN.test(d.trimEnd()));
82
+ if (hasDefault && !named.includes('default')) {
83
+ named.push('default');
84
+ }
85
+ return [...new Set(named)];
86
+ }
87
+ function extractImports(contents) {
88
+ const fromImports = extractMatches(contents, IMPORT_FROM_PATTERN, 1);
89
+ const sideEffects = extractMatches(contents, IMPORT_SIDE_EFFECT_PATTERN, 1);
90
+ return [...new Set([...fromImports, ...sideEffects])];
91
+ }
92
+ function extractTopLevelDeclarations(contents) {
93
+ const results = [];
94
+ const re = new RegExp(TOP_LEVEL_DECLARATION_PATTERN.source, TOP_LEVEL_DECLARATION_PATTERN.flags);
95
+ let match;
96
+ while ((match = re.exec(contents)) !== null) {
97
+ const kind = match[1].replace(/\s*\*$/, '').trim();
98
+ const name = match[2];
99
+ results.push(`${kind} ${name}`);
100
+ }
101
+ return [...new Set(results)];
102
+ }
103
+ const CLEAR_PURPOSES = new Set(['entry point', 'config', 'types', 'test']);
104
+ function calculateConfidence(purpose, exports, imports, declarations, lineCount) {
105
+ if (lineCount === 0)
106
+ return 'low';
107
+ if (exports.length === 0 && imports.length === 0 && declarations.length === 0)
108
+ return 'low';
109
+ if (exports.length > 0 || CLEAR_PURPOSES.has(purpose))
110
+ return 'high';
111
+ return 'medium';
112
+ }
113
+ export function summarizeFile(filePath, contents) {
114
+ const ext = getExtension(filePath);
115
+ const lineCount = contents === '' ? 0 : contents.split('\n').length;
116
+ if (!TS_JS_EXTENSIONS.has(ext) && ext !== '.d.ts') {
117
+ const confidence = lineCount === 0
118
+ ? 'low'
119
+ : CONFIG_EXTENSIONS.has(ext)
120
+ ? 'medium'
121
+ : 'low';
122
+ return {
123
+ purpose: classifyNonCodePurpose(ext),
124
+ exports: [],
125
+ imports: [],
126
+ lineCount,
127
+ topLevelDeclarations: [],
128
+ confidence,
129
+ };
130
+ }
131
+ const exports = extractExports(contents);
132
+ const imports = extractImports(contents);
133
+ const topLevelDeclarations = extractTopLevelDeclarations(contents);
134
+ const purpose = classifyPurpose(filePath, contents, ext);
135
+ const confidence = calculateConfidence(purpose, exports, imports, topLevelDeclarations, lineCount);
136
+ return {
137
+ purpose,
138
+ exports,
139
+ imports,
140
+ lineCount,
141
+ topLevelDeclarations,
142
+ confidence,
143
+ };
144
+ }
145
+ //# sourceMappingURL=summarizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarizer.js","sourceRoot":"","sources":["../../src/indexer/summarizer.ts"],"names":[],"mappings":"AAEA,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEjF,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEvE,MAAM,cAAc,GAClB,gHAAgH,CAAC;AAEnH,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAExD,MAAM,mBAAmB,GAAG,2CAA2C,CAAC;AAExE,MAAM,0BAA0B,GAAG,8BAA8B,CAAC;AAElE,MAAM,6BAA6B,GACjC,+HAA+H,CAAC;AAElI,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB;IACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB,EAAE,QAAgB,EAAE,GAAW;IACtE,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEvC,IAAI,GAAG,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACpC,IAAI,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9D,IAAI,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC5F,IAAI,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,eAAe;QAAE,OAAO,OAAO,CAAC;IAC5E,IAAI,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,aAAa,CAAC;IAE7E,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,aAAa,CAAC;IACxE,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,aAAa,CAAC;IAEvD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,sBAAsB,CAAC,GAAW;IACzC,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC;QAClB,KAAK,KAAK;YACR,OAAO,eAAe,CAAC;QACzB,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC;QAClB,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC;QAClB,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC;QAClB,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,MAAM;YACT,OAAO,OAAO,CAAC;QACjB,KAAK,KAAK,CAAC;QACX,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC;QAClB,KAAK,OAAO;YACV,OAAO,UAAU,CAAC;QACpB;YACE,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB,EAAE,OAAe,EAAE,KAAa;IACtE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACrD,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CACzC,CAAC;IACF,IAAI,UAAU,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;IACrE,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,EAAE,0BAA0B,EAAE,CAAC,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,WAAW,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,2BAA2B,CAAC,QAAgB;IACnD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,6BAA6B,CAAC,MAAM,EAAE,6BAA6B,CAAC,KAAK,CAAC,CAAC;IACjG,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAE3E,SAAS,mBAAmB,CAC1B,OAAe,EACf,OAAiB,EACjB,OAAiB,EACjB,YAAsB,EACtB,SAAiB;IAEjB,IAAI,SAAS,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5F,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC;IACrE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,QAAgB;IAC9D,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAEpE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QAClD,MAAM,UAAU,GAA8B,SAAS,KAAK,CAAC;YAC3D,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC;gBAC1B,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,KAAK,CAAC;QACZ,OAAO;YACL,OAAO,EAAE,sBAAsB,CAAC,GAAG,CAAC;YACpC,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,EAAE;YACX,SAAS;YACT,oBAAoB,EAAE,EAAE;YACxB,UAAU;SACX,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,oBAAoB,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,SAAS,CAAC,CAAC;IAEnG,OAAO;QACL,OAAO;QACP,OAAO;QACP,OAAO;QACP,SAAS;QACT,oBAAoB;QACpB,UAAU;KACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface Session {
2
+ id: string;
3
+ startedAt: number;
4
+ endedAt: number | null;
5
+ metadata: Record<string, unknown> | null;
6
+ }
7
+ export declare class SessionManager {
8
+ private readonly projectRoot;
9
+ private currentSessionId;
10
+ constructor(projectRoot: string);
11
+ startSession(metadata?: Record<string, unknown>): Session;
12
+ endSession(sessionId: string): void;
13
+ getCurrentSession(): Session | null;
14
+ getSession(id: string): Session | null;
15
+ listSessions(limit?: number): Session[];
16
+ getStaleFiles(sessionId: string): string[];
17
+ }
18
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/memory/session.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC1C;AAoBD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,gBAAgB,CAAuB;gBAEnC,WAAW,EAAE,MAAM;IAI/B,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IAqBzD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAWnC,iBAAiB,IAAI,OAAO,GAAG,IAAI;IAOnC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAStC,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE;IAWvC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;CAa3C"}
@@ -0,0 +1,75 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { getDatabase } from '../persistence/db.js';
3
+ function rowToSession(row) {
4
+ return {
5
+ id: row.id,
6
+ startedAt: row.started_at,
7
+ endedAt: row.ended_at,
8
+ metadata: row.metadata_json
9
+ ? JSON.parse(row.metadata_json)
10
+ : null,
11
+ };
12
+ }
13
+ export class SessionManager {
14
+ projectRoot;
15
+ currentSessionId = null;
16
+ constructor(projectRoot) {
17
+ this.projectRoot = projectRoot;
18
+ }
19
+ startSession(metadata) {
20
+ const db = getDatabase(this.projectRoot);
21
+ const id = randomUUID();
22
+ const now = Date.now();
23
+ const metadataJson = metadata ? JSON.stringify(metadata) : null;
24
+ db.prepare(`INSERT INTO sessions (id, started_at, ended_at, metadata_json)
25
+ VALUES (?, ?, NULL, ?)`).run(id, now, metadataJson);
26
+ this.currentSessionId = id;
27
+ return {
28
+ id,
29
+ startedAt: now,
30
+ endedAt: null,
31
+ metadata: metadata ?? null,
32
+ };
33
+ }
34
+ endSession(sessionId) {
35
+ const db = getDatabase(this.projectRoot);
36
+ const now = Date.now();
37
+ db.prepare('UPDATE sessions SET ended_at = ? WHERE id = ?').run(now, sessionId);
38
+ if (this.currentSessionId === sessionId) {
39
+ this.currentSessionId = null;
40
+ }
41
+ }
42
+ getCurrentSession() {
43
+ if (!this.currentSessionId) {
44
+ return null;
45
+ }
46
+ return this.getSession(this.currentSessionId);
47
+ }
48
+ getSession(id) {
49
+ const db = getDatabase(this.projectRoot);
50
+ const row = db
51
+ .prepare('SELECT * FROM sessions WHERE id = ?')
52
+ .get(id);
53
+ return row ? rowToSession(row) : null;
54
+ }
55
+ listSessions(limit) {
56
+ const db = getDatabase(this.projectRoot);
57
+ const effectiveLimit = limit ?? 100;
58
+ const rows = db
59
+ .prepare('SELECT * FROM sessions ORDER BY started_at DESC LIMIT ?')
60
+ .all(effectiveLimit);
61
+ return rows.map(rowToSession);
62
+ }
63
+ getStaleFiles(sessionId) {
64
+ const db = getDatabase(this.projectRoot);
65
+ const session = this.getSession(sessionId);
66
+ if (!session) {
67
+ return [];
68
+ }
69
+ const rows = db
70
+ .prepare('SELECT path FROM files WHERE last_checked < ?')
71
+ .all(session.startedAt);
72
+ return rows.map((r) => r.path);
73
+ }
74
+ }
75
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/memory/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export interface Task {
2
+ id: string;
3
+ name: string;
4
+ state: 'created' | 'active' | 'completed' | 'archived';
5
+ createdAt: number;
6
+ updatedAt: number;
7
+ sessionId: string | null;
8
+ metadata: Record<string, unknown> | null;
9
+ }
10
+ export interface TaskFile {
11
+ taskId: string;
12
+ filePath: string;
13
+ status: 'explored' | 'skipped' | 'flagged';
14
+ notes: string | null;
15
+ exploredAt: number;
16
+ }
17
+ export declare class TaskMemory {
18
+ private readonly projectRoot;
19
+ constructor(projectRoot: string);
20
+ createTask(name: string, metadata?: Record<string, unknown>, sessionId?: string): Task;
21
+ getTask(id: string): Task | null;
22
+ listTasks(filter?: {
23
+ state?: string;
24
+ }): Task[];
25
+ updateTask(id: string, updates: {
26
+ name?: string;
27
+ state?: string;
28
+ metadata?: Record<string, unknown>;
29
+ }): Task;
30
+ deleteTask(id: string): void;
31
+ markExplored(taskId: string, filePath: string, status?: 'explored' | 'skipped' | 'flagged', notes?: string): void;
32
+ getExploredFiles(taskId: string): TaskFile[];
33
+ getUnexploredFrontier(taskId: string, allProjectFiles: string[]): string[];
34
+ }
35
+ //# sourceMappingURL=task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/memory/task.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;IAC3C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AA4CD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,WAAW,EAAE,MAAM;IAI/B,UAAU,CACR,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI;IAsBP,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAShC,SAAS,CAAC,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,EAAE;IAgB9C,UAAU,CACR,EAAE,EAAE,MAAM,EACV,OAAO,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAC7E,IAAI;IAgCP,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAK5B,YAAY,CACV,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,UAAU,GAAG,SAAS,GAAG,SAAsB,EACvD,KAAK,CAAC,EAAE,MAAM,GACb,IAAI;IAeP,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE;IAS5C,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;CAS3E"}
@@ -0,0 +1,120 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { getDatabase } from '../persistence/db.js';
3
+ function rowToTask(row) {
4
+ return {
5
+ id: row.id,
6
+ name: row.name,
7
+ state: row.state,
8
+ createdAt: row.created_at,
9
+ updatedAt: row.updated_at,
10
+ sessionId: row.session_id,
11
+ metadata: row.metadata_json
12
+ ? JSON.parse(row.metadata_json)
13
+ : null,
14
+ };
15
+ }
16
+ function rowToTaskFile(row) {
17
+ return {
18
+ taskId: row.task_id,
19
+ filePath: row.file_path,
20
+ status: row.status,
21
+ notes: row.notes,
22
+ exploredAt: row.explored_at,
23
+ };
24
+ }
25
+ export class TaskMemory {
26
+ projectRoot;
27
+ constructor(projectRoot) {
28
+ this.projectRoot = projectRoot;
29
+ }
30
+ createTask(name, metadata, sessionId) {
31
+ const db = getDatabase(this.projectRoot);
32
+ const id = randomUUID();
33
+ const now = Date.now();
34
+ const metadataJson = metadata ? JSON.stringify(metadata) : null;
35
+ db.prepare(`INSERT INTO tasks (id, name, state, created_at, updated_at, session_id, metadata_json)
36
+ VALUES (?, ?, 'created', ?, ?, ?, ?)`).run(id, name, now, now, sessionId ?? null, metadataJson);
37
+ return {
38
+ id,
39
+ name,
40
+ state: 'created',
41
+ createdAt: now,
42
+ updatedAt: now,
43
+ sessionId: sessionId ?? null,
44
+ metadata: metadata ?? null,
45
+ };
46
+ }
47
+ getTask(id) {
48
+ const db = getDatabase(this.projectRoot);
49
+ const row = db
50
+ .prepare('SELECT * FROM tasks WHERE id = ?')
51
+ .get(id);
52
+ return row ? rowToTask(row) : null;
53
+ }
54
+ listTasks(filter) {
55
+ const db = getDatabase(this.projectRoot);
56
+ if (filter?.state) {
57
+ const rows = db
58
+ .prepare('SELECT * FROM tasks WHERE state = ? ORDER BY updated_at DESC')
59
+ .all(filter.state);
60
+ return rows.map(rowToTask);
61
+ }
62
+ const rows = db
63
+ .prepare('SELECT * FROM tasks ORDER BY updated_at DESC')
64
+ .all();
65
+ return rows.map(rowToTask);
66
+ }
67
+ updateTask(id, updates) {
68
+ const db = getDatabase(this.projectRoot);
69
+ const existing = this.getTask(id);
70
+ if (!existing) {
71
+ throw new Error(`Task not found: ${id}`);
72
+ }
73
+ const now = Date.now();
74
+ const name = updates.name ?? existing.name;
75
+ const state = updates.state ?? existing.state;
76
+ const metadataJson = updates.metadata !== undefined
77
+ ? JSON.stringify(updates.metadata)
78
+ : existing.metadata
79
+ ? JSON.stringify(existing.metadata)
80
+ : null;
81
+ db.prepare(`UPDATE tasks SET name = ?, state = ?, metadata_json = ?, updated_at = ? WHERE id = ?`).run(name, state, metadataJson, now, id);
82
+ return {
83
+ id,
84
+ name,
85
+ state: state,
86
+ createdAt: existing.createdAt,
87
+ updatedAt: now,
88
+ sessionId: existing.sessionId,
89
+ metadata: updates.metadata !== undefined ? updates.metadata : existing.metadata,
90
+ };
91
+ }
92
+ deleteTask(id) {
93
+ const db = getDatabase(this.projectRoot);
94
+ db.prepare('DELETE FROM tasks WHERE id = ?').run(id);
95
+ }
96
+ markExplored(taskId, filePath, status = 'explored', notes) {
97
+ const db = getDatabase(this.projectRoot);
98
+ const now = Date.now();
99
+ db.prepare(`INSERT OR REPLACE INTO task_files (task_id, file_path, status, notes, explored_at)
100
+ VALUES (?, ?, ?, ?, ?)`).run(taskId, filePath, status, notes ?? null, now);
101
+ // Auto-activate task if currently in 'created' state
102
+ db.prepare(`UPDATE tasks SET state = 'active', updated_at = ? WHERE id = ? AND state = 'created'`).run(now, taskId);
103
+ }
104
+ getExploredFiles(taskId) {
105
+ const db = getDatabase(this.projectRoot);
106
+ const rows = db
107
+ .prepare('SELECT * FROM task_files WHERE task_id = ? ORDER BY explored_at')
108
+ .all(taskId);
109
+ return rows.map(rowToTaskFile);
110
+ }
111
+ getUnexploredFrontier(taskId, allProjectFiles) {
112
+ const db = getDatabase(this.projectRoot);
113
+ const rows = db
114
+ .prepare('SELECT file_path FROM task_files WHERE task_id = ?')
115
+ .all(taskId);
116
+ const exploredSet = new Set(rows.map((r) => r.file_path));
117
+ return allProjectFiles.filter((f) => !exploredSet.has(f));
118
+ }
119
+ }
120
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/memory/task.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import Database from 'better-sqlite3';
2
+ export declare function getDatabase(projectRoot: string): Database.Database;
3
+ export declare function closeDatabase(): void;
4
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/persistence/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAgItC,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CA4BlE;AAED,wBAAgB,aAAa,IAAI,IAAI,CAMpC"}