@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.
- package/LICENSE +21 -0
- package/README.md +85 -0
- package/dist/cache/gc.d.ts +14 -0
- package/dist/cache/gc.d.ts.map +1 -0
- package/dist/cache/gc.js +75 -0
- package/dist/cache/gc.js.map +1 -0
- package/dist/cache/hash.d.ts +10 -0
- package/dist/cache/hash.d.ts.map +1 -0
- package/dist/cache/hash.js +22 -0
- package/dist/cache/hash.js.map +1 -0
- package/dist/cache/invalidation.d.ts +29 -0
- package/dist/cache/invalidation.d.ts.map +1 -0
- package/dist/cache/invalidation.js +58 -0
- package/dist/cache/invalidation.js.map +1 -0
- package/dist/cache/ranking.d.ts +57 -0
- package/dist/cache/ranking.d.ts.map +1 -0
- package/dist/cache/ranking.js +196 -0
- package/dist/cache/ranking.js.map +1 -0
- package/dist/cache/store.d.ts +16 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/store.js +70 -0
- package/dist/cache/store.js.map +1 -0
- package/dist/graph/dependency-graph.d.ts +26 -0
- package/dist/graph/dependency-graph.d.ts.map +1 -0
- package/dist/graph/dependency-graph.js +131 -0
- package/dist/graph/dependency-graph.js.map +1 -0
- package/dist/indexer/diff-analyzer.d.ts +8 -0
- package/dist/indexer/diff-analyzer.d.ts.map +1 -0
- package/dist/indexer/diff-analyzer.js +95 -0
- package/dist/indexer/diff-analyzer.js.map +1 -0
- package/dist/indexer/imports.d.ts +3 -0
- package/dist/indexer/imports.d.ts.map +1 -0
- package/dist/indexer/imports.js +123 -0
- package/dist/indexer/imports.js.map +1 -0
- package/dist/indexer/project-map.d.ts +20 -0
- package/dist/indexer/project-map.d.ts.map +1 -0
- package/dist/indexer/project-map.js +120 -0
- package/dist/indexer/project-map.js.map +1 -0
- package/dist/indexer/scanner.d.ts +7 -0
- package/dist/indexer/scanner.d.ts.map +1 -0
- package/dist/indexer/scanner.js +114 -0
- package/dist/indexer/scanner.js.map +1 -0
- package/dist/indexer/smart-summarizer.d.ts +6 -0
- package/dist/indexer/smart-summarizer.d.ts.map +1 -0
- package/dist/indexer/smart-summarizer.js +26 -0
- package/dist/indexer/smart-summarizer.js.map +1 -0
- package/dist/indexer/summarizer.d.ts +3 -0
- package/dist/indexer/summarizer.d.ts.map +1 -0
- package/dist/indexer/summarizer.js +145 -0
- package/dist/indexer/summarizer.js.map +1 -0
- package/dist/memory/session.d.ts +18 -0
- package/dist/memory/session.d.ts.map +1 -0
- package/dist/memory/session.js +75 -0
- package/dist/memory/session.js.map +1 -0
- package/dist/memory/task.d.ts +35 -0
- package/dist/memory/task.d.ts.map +1 -0
- package/dist/memory/task.js +120 -0
- package/dist/memory/task.js.map +1 -0
- package/dist/persistence/db.d.ts +4 -0
- package/dist/persistence/db.d.ts.map +1 -0
- package/dist/persistence/db.js +146 -0
- package/dist/persistence/db.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +197 -0
- package/dist/server.js.map +1 -0
- package/dist/telemetry/tracker.d.ts +40 -0
- package/dist/telemetry/tracker.d.ts.map +1 -0
- package/dist/telemetry/tracker.js +136 -0
- package/dist/telemetry/tracker.js.map +1 -0
- package/dist/tools/force-reread.d.ts +9 -0
- package/dist/tools/force-reread.d.ts.map +1 -0
- package/dist/tools/force-reread.js +17 -0
- package/dist/tools/force-reread.js.map +1 -0
- package/dist/tools/get-changed-files.d.ts +8 -0
- package/dist/tools/get-changed-files.d.ts.map +1 -0
- package/dist/tools/get-changed-files.js +61 -0
- package/dist/tools/get-changed-files.js.map +1 -0
- package/dist/tools/get-dependency-graph.d.ts +17 -0
- package/dist/tools/get-dependency-graph.d.ts.map +1 -0
- package/dist/tools/get-dependency-graph.js +88 -0
- package/dist/tools/get-dependency-graph.js.map +1 -0
- package/dist/tools/get-file-summary.d.ts +12 -0
- package/dist/tools/get-file-summary.d.ts.map +1 -0
- package/dist/tools/get-file-summary.js +53 -0
- package/dist/tools/get-file-summary.js.map +1 -0
- package/dist/tools/get-project-map.d.ts +3 -0
- package/dist/tools/get-project-map.d.ts.map +1 -0
- package/dist/tools/get-project-map.js +5 -0
- package/dist/tools/get-project-map.js.map +1 -0
- package/dist/tools/get-token-report.d.ts +16 -0
- package/dist/tools/get-token-report.d.ts.map +1 -0
- package/dist/tools/get-token-report.js +44 -0
- package/dist/tools/get-token-report.js.map +1 -0
- package/dist/tools/invalidate.d.ts +5 -0
- package/dist/tools/invalidate.d.ts.map +1 -0
- package/dist/tools/invalidate.js +19 -0
- package/dist/tools/invalidate.js.map +1 -0
- package/dist/tools/task-context.d.ts +18 -0
- package/dist/tools/task-context.d.ts.map +1 -0
- package/dist/tools/task-context.js +28 -0
- package/dist/tools/task-context.js.map +1 -0
- package/dist/types.d.ts +21 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/validate-path.d.ts +10 -0
- package/dist/utils/validate-path.d.ts.map +1 -0
- package/dist/utils/validate-path.js +22 -0
- package/dist/utils/validate-path.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-map.js","sourceRoot":"","sources":["../../src/indexer/project-map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAuBhD,KAAK,UAAU,YAAY,CACzB,WAAmB,EACnB,KAAe;IAEf,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAuB,EAAE,CAAC;IAEvC,KAAK,MAAM,YAAY,IAAI,KAAK,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC5C,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACxD,SAAS;QACX,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QACrD,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpC,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,SAAS,CAChB,OAA2B,EAC3B,QAAgB,EAChB,QAAiB;IAEjB,MAAM,IAAI,GAAkB;QAC1B,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,CAAC;KACb,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAChD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAEtB,SAAS,cAAc,CAAC,OAAe,EAAE,YAAoB;QAC3D,IAAI,OAAO,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QACjC,IAAI,QAAQ,KAAK,SAAS,IAAI,YAAY,GAAG,QAAQ;YAAE,OAAO,IAAI,CAAC;QAEnE,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAE9B,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,WAAW,GAAG,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;QAC1E,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,MAAM,IAAI,GAAkB;YAC1B,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC;YACvB,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,CAAC;SACb,CAAC;QAEF,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;QAC9D,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,GAAG;YAAE,SAAS;QAEnB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YACb,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC;YAClC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,SAAS,iBAAiB,CAAC,IAAmB;QAC5C,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAExB,SAAS,QAAQ,CAAC,IAAmB;QACnC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEf,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAe;IAC/C,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC;QAC9C,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,eAAe,CAAC,OAA2B;IAClD,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,KAAK,aAAa,CAAC;SAClD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;SAC1B,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,WAAmB,EACnB,OAA4B;IAE5B,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAEvC,OAAO;QACL,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC;QAClD,WAAW,EAAE,eAAe,CAAC,OAAO,CAAC;QACrC,UAAU,EAAE,KAAK,CAAC,MAAM;QACxB,iBAAiB,EAAE,wBAAwB,CAAC,KAAK,CAAC;KACnD,CAAC;AACJ,CAAC"}
|
|
@@ -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":"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"}
|
|
@@ -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 @@
|
|
|
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":"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"}
|
|
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAsCnD,SAAS,SAAS,CAAC,GAAY;IAC7B,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,KAAK,EAAE,GAAG,CAAC,KAAsB;QACjC,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,QAAQ,EAAE,GAAG,CAAC,aAAa;YACzB,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAA6B;YAC5D,CAAC,CAAC,IAAI;KACT,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,GAAgB;IACrC,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,OAAO;QACnB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,MAAM,EAAE,GAAG,CAAC,MAA4B;QACxC,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,UAAU,EAAE,GAAG,CAAC,WAAW;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,UAAU;IACJ,WAAW,CAAS;IAErC,YAAY,WAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED,UAAU,CACR,IAAY,EACZ,QAAkC,EAClC,SAAkB;QAElB,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEhE,EAAE,CAAC,OAAO,CACR;4CACsC,CACvC,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,IAAI,IAAI,EAAE,YAAY,CAAC,CAAC;QAE3D,OAAO;YACL,EAAE;YACF,IAAI;YACJ,KAAK,EAAE,SAAS;YAChB,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,SAAS,IAAI,IAAI;YAC5B,QAAQ,EAAE,QAAQ,IAAI,IAAI;SAC3B,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CAAC,kCAAkC,CAAC;aAC3C,GAAG,CAAC,EAAE,CAAwB,CAAC;QAElC,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrC,CAAC;IAED,SAAS,CAAC,MAA2B;QACnC,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEzC,IAAI,MAAM,EAAE,KAAK,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,EAAE;iBACZ,OAAO,CAAC,8DAA8D,CAAC;iBACvE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAc,CAAC;YAClC,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QAED,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CAAC,8CAA8C,CAAC;aACvD,GAAG,EAAe,CAAC;QACtB,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED,UAAU,CACR,EAAU,EACV,OAA8E;QAE9E,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC;QAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC;QAC9C,MAAM,YAAY,GAChB,OAAO,CAAC,QAAQ,KAAK,SAAS;YAC5B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC;YAClC,CAAC,CAAC,QAAQ,CAAC,QAAQ;gBACjB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACnC,CAAC,CAAC,IAAI,CAAC;QAEb,EAAE,CAAC,OAAO,CACR,sFAAsF,CACvF,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAE1C,OAAO;YACL,EAAE;YACF,IAAI;YACJ,KAAK,EAAE,KAAsB;YAC7B,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ;SAChF,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,EAAU;QACnB,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzC,EAAE,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,YAAY,CACV,MAAc,EACd,QAAgB,EAChB,SAA6C,UAAU,EACvD,KAAc;QAEd,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,EAAE,CAAC,OAAO,CACR;8BACwB,CACzB,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,IAAI,EAAE,GAAG,CAAC,CAAC;QAEpD,qDAAqD;QACrD,EAAE,CAAC,OAAO,CACR,sFAAsF,CACvF,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACrB,CAAC;IAED,gBAAgB,CAAC,MAAc;QAC7B,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CAAC,iEAAiE,CAAC;aAC1E,GAAG,CAAC,MAAM,CAAkB,CAAC;QAEhC,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IAED,qBAAqB,CAAC,MAAc,EAAE,eAAyB;QAC7D,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CAAC,oDAAoD,CAAC;aAC7D,GAAG,CAAC,MAAM,CAAiC,CAAC;QAE/C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAC1D,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;CACF"}
|
|
@@ -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"}
|