mindlore 0.6.1 → 0.6.3
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 +661 -21
- package/README.md +3 -3
- package/dist/scripts/cc-session-sync.d.ts +2 -0
- package/dist/scripts/cc-session-sync.d.ts.map +1 -1
- package/dist/scripts/cc-session-sync.js +56 -0
- package/dist/scripts/cc-session-sync.js.map +1 -1
- package/dist/scripts/fetch-raw.js +133 -8
- package/dist/scripts/fetch-raw.js.map +1 -1
- package/dist/scripts/init.js +28 -43
- package/dist/scripts/init.js.map +1 -1
- package/dist/scripts/lib/chunker.d.ts +12 -0
- package/dist/scripts/lib/chunker.d.ts.map +1 -0
- package/dist/scripts/lib/chunker.js +94 -0
- package/dist/scripts/lib/chunker.js.map +1 -0
- package/dist/scripts/lib/episodes.d.ts +1 -1
- package/dist/scripts/lib/episodes.d.ts.map +1 -1
- package/dist/scripts/lib/episodes.js +1 -1
- package/dist/scripts/lib/episodes.js.map +1 -1
- package/dist/scripts/lib/fuzzy.d.ts +10 -0
- package/dist/scripts/lib/fuzzy.d.ts.map +1 -0
- package/dist/scripts/lib/fuzzy.js +88 -0
- package/dist/scripts/lib/fuzzy.js.map +1 -0
- package/dist/scripts/lib/hybrid-search.d.ts +1 -0
- package/dist/scripts/lib/hybrid-search.d.ts.map +1 -1
- package/dist/scripts/lib/hybrid-search.js.map +1 -1
- package/dist/scripts/lib/merge-defaults.d.ts +5 -0
- package/dist/scripts/lib/merge-defaults.d.ts.map +1 -0
- package/dist/scripts/lib/merge-defaults.js +25 -0
- package/dist/scripts/lib/merge-defaults.js.map +1 -0
- package/dist/scripts/lib/migrations-v062.d.ts +3 -0
- package/dist/scripts/lib/migrations-v062.d.ts.map +1 -0
- package/dist/scripts/lib/migrations-v062.js +35 -0
- package/dist/scripts/lib/migrations-v062.js.map +1 -0
- package/dist/scripts/lib/migrations-v063.d.ts +7 -0
- package/dist/scripts/lib/migrations-v063.d.ts.map +1 -0
- package/dist/scripts/lib/migrations-v063.js +58 -0
- package/dist/scripts/lib/migrations-v063.js.map +1 -0
- package/dist/scripts/lib/proximity.d.ts +3 -0
- package/dist/scripts/lib/proximity.d.ts.map +1 -0
- package/dist/scripts/lib/proximity.js +53 -0
- package/dist/scripts/lib/proximity.js.map +1 -0
- package/dist/scripts/lib/rrf.d.ts +23 -0
- package/dist/scripts/lib/rrf.d.ts.map +1 -0
- package/dist/scripts/lib/rrf.js +63 -0
- package/dist/scripts/lib/rrf.js.map +1 -0
- package/dist/scripts/lib/search-cache.d.ts +20 -0
- package/dist/scripts/lib/search-cache.d.ts.map +1 -0
- package/dist/scripts/lib/search-cache.js +60 -0
- package/dist/scripts/lib/search-cache.js.map +1 -0
- package/dist/scripts/lib/search-engine.d.ts +22 -0
- package/dist/scripts/lib/search-engine.d.ts.map +1 -0
- package/dist/scripts/lib/search-engine.js +105 -0
- package/dist/scripts/lib/search-engine.js.map +1 -0
- package/dist/scripts/lib/session-payload.d.ts +2 -4
- package/dist/scripts/lib/session-payload.d.ts.map +1 -1
- package/dist/scripts/lib/session-payload.js +43 -43
- package/dist/scripts/lib/session-payload.js.map +1 -1
- package/dist/scripts/lib/snippet.d.ts +2 -0
- package/dist/scripts/lib/snippet.d.ts.map +1 -0
- package/dist/scripts/lib/snippet.js +32 -0
- package/dist/scripts/lib/snippet.js.map +1 -0
- package/dist/scripts/lib/triage.d.ts +18 -0
- package/dist/scripts/lib/triage.d.ts.map +1 -0
- package/dist/scripts/lib/triage.js +81 -0
- package/dist/scripts/lib/triage.js.map +1 -0
- package/dist/scripts/mindlore-doctor.d.ts +1 -0
- package/dist/scripts/mindlore-doctor.d.ts.map +1 -1
- package/dist/scripts/mindlore-doctor.js +26 -1
- package/dist/scripts/mindlore-doctor.js.map +1 -1
- package/dist/scripts/mindlore-fts5-index.js +44 -3
- package/dist/scripts/mindlore-fts5-index.js.map +1 -1
- package/dist/scripts/mindlore-fts5-search.d.ts +3 -5
- package/dist/scripts/mindlore-fts5-search.d.ts.map +1 -1
- package/dist/scripts/mindlore-fts5-search.js +41 -116
- package/dist/scripts/mindlore-fts5-search.js.map +1 -1
- package/dist/scripts/mindlore-health-check.d.ts +10 -0
- package/dist/scripts/mindlore-health-check.d.ts.map +1 -1
- package/dist/scripts/mindlore-health-check.js +26 -1
- package/dist/scripts/mindlore-health-check.js.map +1 -1
- package/dist/scripts/mindlore-perf.d.ts +3 -3
- package/dist/scripts/mindlore-perf.d.ts.map +1 -1
- package/dist/scripts/mindlore-perf.js +10 -8
- package/dist/scripts/mindlore-perf.js.map +1 -1
- package/dist/tests/chunker.test.d.ts +2 -0
- package/dist/tests/chunker.test.d.ts.map +1 -0
- package/dist/tests/chunker.test.js +40 -0
- package/dist/tests/chunker.test.js.map +1 -0
- package/dist/tests/chunks-migration.test.d.ts +2 -0
- package/dist/tests/chunks-migration.test.d.ts.map +1 -0
- package/dist/tests/chunks-migration.test.js +55 -0
- package/dist/tests/chunks-migration.test.js.map +1 -0
- package/dist/tests/compaction-snapshot.test.d.ts +2 -0
- package/dist/tests/compaction-snapshot.test.d.ts.map +1 -0
- package/dist/tests/compaction-snapshot.test.js +102 -0
- package/dist/tests/compaction-snapshot.test.js.map +1 -0
- package/dist/tests/daemon-integration.test.js +5 -5
- package/dist/tests/daemon-integration.test.js.map +1 -1
- package/dist/tests/diary.test.js +3 -3
- package/dist/tests/diary.test.js.map +1 -1
- package/dist/tests/doctor.test.js +13 -0
- package/dist/tests/doctor.test.js.map +1 -1
- package/dist/tests/fetch-raw.test.js +12 -5
- package/dist/tests/fetch-raw.test.js.map +1 -1
- package/dist/tests/fuzzy.test.d.ts +2 -0
- package/dist/tests/fuzzy.test.d.ts.map +1 -0
- package/dist/tests/fuzzy.test.js +70 -0
- package/dist/tests/fuzzy.test.js.map +1 -0
- package/dist/tests/health-check-memory.test.js +27 -0
- package/dist/tests/health-check-memory.test.js.map +1 -1
- package/dist/tests/helpers/db.d.ts.map +1 -1
- package/dist/tests/helpers/db.js +4 -1
- package/dist/tests/helpers/db.js.map +1 -1
- package/dist/tests/init.test.js +20 -0
- package/dist/tests/init.test.js.map +1 -1
- package/dist/tests/merge-defaults.test.d.ts +2 -0
- package/dist/tests/merge-defaults.test.d.ts.map +1 -0
- package/dist/tests/merge-defaults.test.js +35 -0
- package/dist/tests/merge-defaults.test.js.map +1 -0
- package/dist/tests/migrations-v062.test.d.ts +2 -0
- package/dist/tests/migrations-v062.test.d.ts.map +1 -0
- package/dist/tests/migrations-v062.test.js +61 -0
- package/dist/tests/migrations-v062.test.js.map +1 -0
- package/dist/tests/migrations-v063.test.d.ts +2 -0
- package/dist/tests/migrations-v063.test.d.ts.map +1 -0
- package/dist/tests/migrations-v063.test.js +84 -0
- package/dist/tests/migrations-v063.test.js.map +1 -0
- package/dist/tests/nomination.test.js +1 -1
- package/dist/tests/proximity.test.d.ts +2 -0
- package/dist/tests/proximity.test.d.ts.map +1 -0
- package/dist/tests/proximity.test.js +31 -0
- package/dist/tests/proximity.test.js.map +1 -0
- package/dist/tests/rrf.test.d.ts +2 -0
- package/dist/tests/rrf.test.d.ts.map +1 -0
- package/dist/tests/rrf.test.js +100 -0
- package/dist/tests/rrf.test.js.map +1 -0
- package/dist/tests/savings.test.d.ts +2 -0
- package/dist/tests/savings.test.d.ts.map +1 -0
- package/dist/tests/savings.test.js +87 -0
- package/dist/tests/savings.test.js.map +1 -0
- package/dist/tests/search-cache.test.d.ts +2 -0
- package/dist/tests/search-cache.test.d.ts.map +1 -0
- package/dist/tests/search-cache.test.js +95 -0
- package/dist/tests/search-cache.test.js.map +1 -0
- package/dist/tests/search-engine.test.d.ts +2 -0
- package/dist/tests/search-engine.test.d.ts.map +1 -0
- package/dist/tests/search-engine.test.js +125 -0
- package/dist/tests/search-engine.test.js.map +1 -0
- package/dist/tests/search-hook.test.js +3 -3
- package/dist/tests/search-hook.test.js.map +1 -1
- package/dist/tests/session-payload.test.d.ts +1 -1
- package/dist/tests/session-payload.test.js +1 -14
- package/dist/tests/session-payload.test.js.map +1 -1
- package/dist/tests/session-summary.test.d.ts +2 -0
- package/dist/tests/session-summary.test.d.ts.map +1 -0
- package/dist/tests/session-summary.test.js +138 -0
- package/dist/tests/session-summary.test.js.map +1 -0
- package/dist/tests/snippet.test.d.ts +2 -0
- package/dist/tests/snippet.test.d.ts.map +1 -0
- package/dist/tests/snippet.test.js +30 -0
- package/dist/tests/snippet.test.js.map +1 -0
- package/dist/tests/telemetry-perf.test.js +7 -0
- package/dist/tests/telemetry-perf.test.js.map +1 -1
- package/dist/tests/triage.test.d.ts +2 -0
- package/dist/tests/triage.test.d.ts.map +1 -0
- package/dist/tests/triage.test.js +69 -0
- package/dist/tests/triage.test.js.map +1 -0
- package/hooks/lib/mindlore-common.cjs +74 -13
- package/hooks/mindlore-index.cjs +6 -0
- package/hooks/mindlore-post-compact.cjs +23 -3
- package/hooks/mindlore-pre-compact.cjs +86 -3
- package/hooks/mindlore-search.cjs +90 -214
- package/hooks/mindlore-session-end.cjs +22 -18
- package/hooks/mindlore-session-focus.cjs +92 -71
- package/package.json +6 -5
- package/plugin.json +1 -1
- package/skills/mindlore-maintain/SKILL.md +1 -0
- package/templates/config.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* session-payload tests — 4-section builder with token budget
|
|
3
|
+
* session-payload tests — 4-section builder with token budget.
|
|
4
4
|
*/
|
|
5
5
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
6
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -28,7 +28,6 @@ beforeEach(() => {
|
|
|
28
28
|
env = (0, db_js_1.createEpisodesTestEnv)('session-payload');
|
|
29
29
|
db = env.db;
|
|
30
30
|
baseDir = env.tmpDir;
|
|
31
|
-
(0, session_payload_js_1.resetCache)();
|
|
32
31
|
});
|
|
33
32
|
afterEach(() => {
|
|
34
33
|
(0, db_js_1.destroyEpisodesTestEnv)(env);
|
|
@@ -46,7 +45,6 @@ describe('buildSessionPayload', () => {
|
|
|
46
45
|
expect(payload.sections[2].label).toBe('Friction');
|
|
47
46
|
expect(payload.sections[3].label).toBe('Learnings');
|
|
48
47
|
expect(payload.totalTokens).toBeGreaterThan(0);
|
|
49
|
-
expect(payload.skipInjection).toBe(false);
|
|
50
48
|
expect(payload.contentHash).toMatch(/^[0-9a-f]{8}$/);
|
|
51
49
|
});
|
|
52
50
|
test('trims sections from end when over budget', () => {
|
|
@@ -67,20 +65,10 @@ describe('buildSessionPayload', () => {
|
|
|
67
65
|
const full = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT, 99999);
|
|
68
66
|
const sessionTokens = full.sections[0].tokens;
|
|
69
67
|
const decisionTokens = full.sections[1].tokens;
|
|
70
|
-
(0, session_payload_js_1.resetCache)();
|
|
71
68
|
const budgetFor2 = sessionTokens + decisionTokens + 1;
|
|
72
69
|
const trimmed = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT, budgetFor2);
|
|
73
70
|
expect(trimmed.sections.map(s => s.label)).toEqual(['Session', 'Decisions']);
|
|
74
71
|
});
|
|
75
|
-
test('skips injection when content unchanged (cache-lock)', () => {
|
|
76
|
-
writeDelta('delta-2026-04-19.md', '# Session\n- Same content');
|
|
77
|
-
insertEpisode('decision', 'Same decision');
|
|
78
|
-
const first = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT);
|
|
79
|
-
expect(first.skipInjection).toBe(false);
|
|
80
|
-
const second = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT);
|
|
81
|
-
expect(second.skipInjection).toBe(true);
|
|
82
|
-
expect(second.contentHash).toBe(first.contentHash);
|
|
83
|
-
});
|
|
84
72
|
test('handles empty DB gracefully', () => {
|
|
85
73
|
const payload = (0, session_payload_js_1.buildSessionPayload)(db, baseDir, PROJECT);
|
|
86
74
|
expect(payload.sections).toHaveLength(4);
|
|
@@ -88,7 +76,6 @@ describe('buildSessionPayload', () => {
|
|
|
88
76
|
expect(payload.sections[1].content).toContain('No recent decisions');
|
|
89
77
|
expect(payload.sections[2].content).toContain('No active friction');
|
|
90
78
|
expect(payload.sections[3].content).toContain('No recent learnings');
|
|
91
|
-
expect(payload.skipInjection).toBe(false);
|
|
92
79
|
});
|
|
93
80
|
test('handles missing diary directory', () => {
|
|
94
81
|
insertEpisode('decision', 'A decision');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-payload.test.js","sourceRoot":"","sources":["../../tests/session-payload.test.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AAEH,4CAAoB;AACpB,gDAAwB;AAExB,2CAAgF;AAEhF,
|
|
1
|
+
{"version":3,"file":"session-payload.test.js","sourceRoot":"","sources":["../../tests/session-payload.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-summary.test.d.ts","sourceRoot":"","sources":["../../tests/session-summary.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const fs_1 = __importDefault(require("fs"));
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const cc_session_sync_js_1 = require("../scripts/cc-session-sync.js");
|
|
9
|
+
const session_payload_js_1 = require("../scripts/lib/session-payload.js");
|
|
10
|
+
const schema_version_js_1 = require("../scripts/lib/schema-version.js");
|
|
11
|
+
const migrations_v062_js_1 = require("../scripts/lib/migrations-v062.js");
|
|
12
|
+
const db_js_1 = require("./helpers/db.js");
|
|
13
|
+
describe('session summary extraction', () => {
|
|
14
|
+
it('extracts intent from first user message', () => {
|
|
15
|
+
const transcript = [
|
|
16
|
+
'---',
|
|
17
|
+
'type: raw',
|
|
18
|
+
'project: mindlore',
|
|
19
|
+
'---',
|
|
20
|
+
'',
|
|
21
|
+
'## User',
|
|
22
|
+
'',
|
|
23
|
+
'v0.6.2 spec yaz',
|
|
24
|
+
'',
|
|
25
|
+
'## Assistant',
|
|
26
|
+
'',
|
|
27
|
+
'Tamam, başlıyorum.',
|
|
28
|
+
'',
|
|
29
|
+
].join('\n');
|
|
30
|
+
const summary = (0, cc_session_sync_js_1.extractSessionSummary)(transcript);
|
|
31
|
+
expect(summary).toContain('v0.6.2 spec yaz');
|
|
32
|
+
});
|
|
33
|
+
it('detects decision keywords', () => {
|
|
34
|
+
const transcript = [
|
|
35
|
+
'---',
|
|
36
|
+
'type: raw',
|
|
37
|
+
'---',
|
|
38
|
+
'',
|
|
39
|
+
'## User',
|
|
40
|
+
'',
|
|
41
|
+
'karar: tek DB kullan',
|
|
42
|
+
'',
|
|
43
|
+
].join('\n');
|
|
44
|
+
const summary = (0, cc_session_sync_js_1.extractSessionSummary)(transcript);
|
|
45
|
+
expect(summary).toContain('karar');
|
|
46
|
+
});
|
|
47
|
+
it('detects english decision keywords', () => {
|
|
48
|
+
const transcript = [
|
|
49
|
+
'---',
|
|
50
|
+
'type: raw',
|
|
51
|
+
'---',
|
|
52
|
+
'',
|
|
53
|
+
'## User',
|
|
54
|
+
'',
|
|
55
|
+
'decision: use single DB',
|
|
56
|
+
'',
|
|
57
|
+
].join('\n');
|
|
58
|
+
const summary = (0, cc_session_sync_js_1.extractSessionSummary)(transcript);
|
|
59
|
+
expect(summary).toContain('decision');
|
|
60
|
+
});
|
|
61
|
+
it('rejects bare words without decision context', () => {
|
|
62
|
+
const text = 'implementasyon planı yazacağız';
|
|
63
|
+
const hasDecision = cc_session_sync_js_1.DECISION_KEYWORDS.some(kw => text.toLowerCase().includes(kw));
|
|
64
|
+
expect(hasDecision).toBe(false);
|
|
65
|
+
});
|
|
66
|
+
it('includes last intent when different from first', () => {
|
|
67
|
+
const transcript = [
|
|
68
|
+
'---',
|
|
69
|
+
'type: raw',
|
|
70
|
+
'---',
|
|
71
|
+
'',
|
|
72
|
+
'## User',
|
|
73
|
+
'',
|
|
74
|
+
'brainstorming yap',
|
|
75
|
+
'',
|
|
76
|
+
'## Assistant',
|
|
77
|
+
'',
|
|
78
|
+
'Tamam.',
|
|
79
|
+
'',
|
|
80
|
+
'## User',
|
|
81
|
+
'',
|
|
82
|
+
'spec yaz',
|
|
83
|
+
'',
|
|
84
|
+
].join('\n');
|
|
85
|
+
const summary = (0, cc_session_sync_js_1.extractSessionSummary)(transcript);
|
|
86
|
+
expect(summary).toContain('brainstorming');
|
|
87
|
+
expect(summary).toContain('spec yaz');
|
|
88
|
+
});
|
|
89
|
+
it('returns empty string for empty transcript', () => {
|
|
90
|
+
const summary = (0, cc_session_sync_js_1.extractSessionSummary)('');
|
|
91
|
+
expect(summary).toBe('');
|
|
92
|
+
});
|
|
93
|
+
it('handles transcript with no user messages', () => {
|
|
94
|
+
const transcript = [
|
|
95
|
+
'---',
|
|
96
|
+
'type: raw',
|
|
97
|
+
'---',
|
|
98
|
+
'',
|
|
99
|
+
'## Assistant',
|
|
100
|
+
'',
|
|
101
|
+
'Hello',
|
|
102
|
+
'',
|
|
103
|
+
].join('\n');
|
|
104
|
+
const summary = (0, cc_session_sync_js_1.extractSessionSummary)(transcript);
|
|
105
|
+
expect(summary).toBe('');
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
describe('session summary → DB → payload integration', () => {
|
|
109
|
+
let env;
|
|
110
|
+
beforeEach(() => {
|
|
111
|
+
env = (0, db_js_1.createEpisodesTestEnv)('session-summary-int');
|
|
112
|
+
(0, schema_version_js_1.ensureSchemaTable)(env.db);
|
|
113
|
+
(0, schema_version_js_1.runMigrations)(env.db, migrations_v062_js_1.V062_MIGRATIONS);
|
|
114
|
+
fs_1.default.mkdirSync(path_1.default.join(env.tmpDir, 'diary'), { recursive: true });
|
|
115
|
+
});
|
|
116
|
+
afterEach(() => (0, db_js_1.destroyEpisodesTestEnv)(env));
|
|
117
|
+
it('session-summary episode is readable by buildSessionPayload', () => {
|
|
118
|
+
const summary = 'Intent: v0.6.3 search engine | Son: commit atıldı';
|
|
119
|
+
env.db.prepare(`INSERT INTO episodes (kind, scope, project, summary, session_summary, status, created_at)
|
|
120
|
+
VALUES ('session-summary', 'project', 'test-proj', ?, ?, 'active', datetime('now'))`).run(summary, summary);
|
|
121
|
+
const payload = (0, session_payload_js_1.buildSessionPayload)(env.db, env.tmpDir, 'test-proj', 5000);
|
|
122
|
+
const pastSessions = payload.sections.find(s => s.label === 'Past Sessions');
|
|
123
|
+
expect(pastSessions).toBeDefined();
|
|
124
|
+
expect(pastSessions.content).toContain('v0.6.3 search engine');
|
|
125
|
+
});
|
|
126
|
+
it('extractSessionSummary output fits in episode summary column', () => {
|
|
127
|
+
const longTranscript = [
|
|
128
|
+
'---', 'type: raw', '---', '',
|
|
129
|
+
'## User', '', 'a'.repeat(200), '',
|
|
130
|
+
'## Assistant', '', 'ok', '',
|
|
131
|
+
'## User', '', 'b'.repeat(200), '',
|
|
132
|
+
].join('\n');
|
|
133
|
+
const summary = (0, cc_session_sync_js_1.extractSessionSummary)(longTranscript);
|
|
134
|
+
expect(summary.length).toBeLessThanOrEqual(500);
|
|
135
|
+
expect(summary).toContain('Intent:');
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
//# sourceMappingURL=session-summary.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-summary.test.js","sourceRoot":"","sources":["../../tests/session-summary.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snippet.test.d.ts","sourceRoot":"","sources":["../../tests/snippet.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const snippet_js_1 = require("../scripts/lib/snippet.js");
|
|
4
|
+
test('extracts window around query terms', () => {
|
|
5
|
+
const content = 'A'.repeat(100) + ' TypeScript hooks are powerful ' + 'B'.repeat(100);
|
|
6
|
+
const snippet = (0, snippet_js_1.extractSnippet)(content, ['typescript', 'hooks'], 60);
|
|
7
|
+
expect(snippet).toContain('TypeScript hooks');
|
|
8
|
+
expect(snippet.length).toBeLessThanOrEqual(80);
|
|
9
|
+
});
|
|
10
|
+
test('returns start of content if no term match', () => {
|
|
11
|
+
const content = 'Hello world this is a test document with some words';
|
|
12
|
+
const snippet = (0, snippet_js_1.extractSnippet)(content, ['nonexistent'], 30);
|
|
13
|
+
expect(snippet.startsWith('Hello')).toBe(true);
|
|
14
|
+
expect(snippet.endsWith('...')).toBe(true);
|
|
15
|
+
});
|
|
16
|
+
test('returns full content if shorter than maxLen', () => {
|
|
17
|
+
const content = 'Short text';
|
|
18
|
+
const snippet = (0, snippet_js_1.extractSnippet)(content, ['short'], 300);
|
|
19
|
+
expect(snippet).toBe('Short text');
|
|
20
|
+
});
|
|
21
|
+
test('empty content returns empty', () => {
|
|
22
|
+
expect((0, snippet_js_1.extractSnippet)('', ['test'], 60)).toBe('');
|
|
23
|
+
});
|
|
24
|
+
test('prefers position with most term matches', () => {
|
|
25
|
+
const content = 'alpha beta ' + 'X'.repeat(200) + ' alpha gamma beta';
|
|
26
|
+
const snippet = (0, snippet_js_1.extractSnippet)(content, ['alpha', 'beta'], 40);
|
|
27
|
+
expect(snippet).toContain('alpha');
|
|
28
|
+
expect(snippet).toContain('beta');
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=snippet.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snippet.test.js","sourceRoot":"","sources":["../../tests/snippet.test.ts"],"names":[],"mappings":";;AAAA,0DAA2D;AAE3D,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,iCAAiC,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,IAAA,2BAAc,EAAC,OAAO,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IACrE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC9C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACrD,MAAM,OAAO,GAAG,qDAAqD,CAAC;IACtE,MAAM,OAAO,GAAG,IAAA,2BAAc,EAAC,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7D,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;IACvD,MAAM,OAAO,GAAG,YAAY,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAA,2BAAc,EAAC,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;IACxD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;IACvC,MAAM,CAAC,IAAA,2BAAc,EAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACpD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACnD,MAAM,OAAO,GAAG,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC;IACtE,MAAM,OAAO,GAAG,IAAA,2BAAc,EAAC,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC"}
|
|
@@ -54,5 +54,12 @@ describe('mindlore-perf', () => {
|
|
|
54
54
|
expect(groups['search']).toHaveLength(3);
|
|
55
55
|
expect(groups['session-focus']).toHaveLength(2);
|
|
56
56
|
});
|
|
57
|
+
it('withTelemetry works when fn returns undefined (S1 regression)', async () => {
|
|
58
|
+
const commonPath = require.resolve('../hooks/lib/mindlore-common.cjs');
|
|
59
|
+
delete require.cache[commonPath];
|
|
60
|
+
const { withTelemetry } = require(commonPath);
|
|
61
|
+
const fn = () => { };
|
|
62
|
+
await expect(withTelemetry('test-no-return', fn)).resolves.not.toThrow();
|
|
63
|
+
});
|
|
57
64
|
});
|
|
58
65
|
//# sourceMappingURL=telemetry-perf.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-perf.test.js","sourceRoot":"","sources":["../../tests/telemetry-perf.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"telemetry-perf.test.js","sourceRoot":"","sources":["../../tests/telemetry-perf.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage.test.d.ts","sourceRoot":"","sources":["../../tests/triage.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const fs_1 = __importDefault(require("fs"));
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const os_1 = __importDefault(require("os"));
|
|
9
|
+
const db_js_1 = require("./helpers/db.js");
|
|
10
|
+
const triage_js_1 = require("../scripts/lib/triage.js");
|
|
11
|
+
describe('raw inbox triage', () => {
|
|
12
|
+
let tmpDir;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'triage-'));
|
|
15
|
+
fs_1.default.mkdirSync(path_1.default.join(tmpDir, 'raw'), { recursive: true });
|
|
16
|
+
fs_1.default.mkdirSync(path_1.default.join(tmpDir, 'sources'), { recursive: true });
|
|
17
|
+
});
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
|
|
20
|
+
});
|
|
21
|
+
it('lists unpromoted raw files', () => {
|
|
22
|
+
fs_1.default.writeFileSync(path_1.default.join(tmpDir, 'raw', 'orphan.md'), '# Title\nContent here');
|
|
23
|
+
fs_1.default.writeFileSync(path_1.default.join(tmpDir, 'sources', 'existing.md'), '# Existing');
|
|
24
|
+
const result = (0, triage_js_1.listUnpromoted)(tmpDir);
|
|
25
|
+
expect(result.some(r => r.name === 'orphan.md')).toBe(true);
|
|
26
|
+
expect(result.some(r => r.name === 'existing.md')).toBe(false);
|
|
27
|
+
});
|
|
28
|
+
it('returns empty for non-existent raw dir', () => {
|
|
29
|
+
const emptyDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'triage-empty-'));
|
|
30
|
+
const result = (0, triage_js_1.listUnpromoted)(emptyDir);
|
|
31
|
+
expect(result).toHaveLength(0);
|
|
32
|
+
fs_1.default.rmSync(emptyDir, { recursive: true, force: true });
|
|
33
|
+
});
|
|
34
|
+
it('extracts metadata from raw file', () => {
|
|
35
|
+
const content = [
|
|
36
|
+
'---',
|
|
37
|
+
'url: https://example.com',
|
|
38
|
+
'date_captured: 2026-04-01',
|
|
39
|
+
'---',
|
|
40
|
+
'# Main Title',
|
|
41
|
+
'## Section 1',
|
|
42
|
+
'## Section 2',
|
|
43
|
+
'Some content here.',
|
|
44
|
+
].join('\n');
|
|
45
|
+
fs_1.default.writeFileSync(path_1.default.join(tmpDir, 'raw', 'test.md'), content);
|
|
46
|
+
const meta = (0, triage_js_1.extractRawMetadata)(path_1.default.join(tmpDir, 'raw', 'test.md'));
|
|
47
|
+
expect(meta.title).toBe('Main Title');
|
|
48
|
+
expect(meta.url).toBe('https://example.com');
|
|
49
|
+
expect(meta.headings).toContain('Section 1');
|
|
50
|
+
expect(meta.line_count).toBe(8);
|
|
51
|
+
});
|
|
52
|
+
it('uses filename as fallback title', () => {
|
|
53
|
+
fs_1.default.writeFileSync(path_1.default.join(tmpDir, 'raw', 'no-heading.md'), 'Just some text');
|
|
54
|
+
const meta = (0, triage_js_1.extractRawMetadata)(path_1.default.join(tmpDir, 'raw', 'no-heading.md'));
|
|
55
|
+
expect(meta.title).toBe('no-heading');
|
|
56
|
+
});
|
|
57
|
+
it('caches metadata in raw_metadata table', () => {
|
|
58
|
+
fs_1.default.writeFileSync(path_1.default.join(tmpDir, 'raw', 'cached.md'), '# Cached\nContent');
|
|
59
|
+
const dbPath = path_1.default.join(tmpDir, 'mindlore.db');
|
|
60
|
+
const db = (0, db_js_1.createTestDbWithMigrations)(dbPath);
|
|
61
|
+
(0, triage_js_1.cacheRawMetadata)(db, path_1.default.join(tmpDir, 'raw', 'cached.md'), tmpDir);
|
|
62
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
63
|
+
const row = db.prepare("SELECT * FROM raw_metadata WHERE path = ?").get('raw/cached.md');
|
|
64
|
+
expect(row).toBeDefined();
|
|
65
|
+
expect(row?.title).toBe('Cached');
|
|
66
|
+
db.close();
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=triage.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage.test.js","sourceRoot":"","sources":["../../tests/triage.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -154,6 +154,9 @@ const SQL_FTS_CREATE =
|
|
|
154
154
|
const SQL_FTS_INSERT =
|
|
155
155
|
'INSERT INTO mindlore_fts (path, slug, description, type, category, title, content, tags, quality, date_captured, project) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
|
|
156
156
|
|
|
157
|
+
const SQL_FTS_TRIGRAM_INSERT =
|
|
158
|
+
'INSERT INTO mindlore_fts_trigram (path, slug, description, type, category, title, content, tags, quality, date_captured, project) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
|
|
159
|
+
|
|
157
160
|
const SQL_FTS_SESSIONS_CREATE =
|
|
158
161
|
"CREATE VIRTUAL TABLE IF NOT EXISTS mindlore_fts_sessions USING fts5(path, slug, description, type, category, title, content, tags, quality, date_captured, project)";
|
|
159
162
|
|
|
@@ -175,8 +178,7 @@ function fixVersionTokens(query) {
|
|
|
175
178
|
* Insert a row into FTS5 using an object parameter (replaces positional args).
|
|
176
179
|
*/
|
|
177
180
|
function insertFtsRow(db, entry) {
|
|
178
|
-
const
|
|
179
|
-
stmt.run(
|
|
181
|
+
const vals = [
|
|
180
182
|
entry.path || '',
|
|
181
183
|
entry.slug || '',
|
|
182
184
|
entry.description || '',
|
|
@@ -188,7 +190,13 @@ function insertFtsRow(db, entry) {
|
|
|
188
190
|
entry.quality || null,
|
|
189
191
|
entry.dateCaptured || null,
|
|
190
192
|
entry.project || null,
|
|
191
|
-
|
|
193
|
+
];
|
|
194
|
+
db.prepare(SQL_FTS_INSERT).run(...vals);
|
|
195
|
+
try {
|
|
196
|
+
db.prepare(SQL_FTS_TRIGRAM_INSERT).run(...vals);
|
|
197
|
+
} catch (_err) {
|
|
198
|
+
// trigram table may not exist yet (pre-v0.6.3)
|
|
199
|
+
}
|
|
192
200
|
}
|
|
193
201
|
|
|
194
202
|
/**
|
|
@@ -347,7 +355,7 @@ CREATE TABLE IF NOT EXISTS episodes (
|
|
|
347
355
|
// ~625 tokens context budget for multi-session inject (~4 chars/token)
|
|
348
356
|
const MULTI_SESSION_TOKEN_CAP_CHARS = 2500;
|
|
349
357
|
|
|
350
|
-
const EPISODE_KINDS_CJS = ['session', 'decision', 'event', 'preference', 'learning', 'friction', 'discovery', 'nomination'];
|
|
358
|
+
const EPISODE_KINDS_CJS = ['session', 'decision', 'event', 'preference', 'learning', 'friction', 'discovery', 'nomination', 'session-summary'];
|
|
351
359
|
|
|
352
360
|
/**
|
|
353
361
|
* Valid episode statuses. CO-EVOLUTION: mirrors EPISODE_STATUSES in scripts/lib/episodes.ts
|
|
@@ -671,7 +679,7 @@ function _rotateFile(filePath, maxBytes, keepLines) {
|
|
|
671
679
|
|
|
672
680
|
let _telDirEnsured = false;
|
|
673
681
|
|
|
674
|
-
function _writeTelemetry(hookName, duration_ms, ok, extra) {
|
|
682
|
+
function _writeTelemetry({ hookName, duration_ms, ok, extra }) {
|
|
675
683
|
try {
|
|
676
684
|
if (!_telDirEnsured) {
|
|
677
685
|
fs.mkdirSync(GLOBAL_MINDLORE_DIR, { recursive: true });
|
|
@@ -679,8 +687,11 @@ function _writeTelemetry(hookName, duration_ms, ok, extra) {
|
|
|
679
687
|
}
|
|
680
688
|
const telPath = path.join(GLOBAL_MINDLORE_DIR, 'telemetry.jsonl');
|
|
681
689
|
const entry = { ts: new Date().toISOString(), hook: hookName, duration_ms, ok };
|
|
682
|
-
if (extra
|
|
683
|
-
|
|
690
|
+
if (extra && typeof extra === 'object') {
|
|
691
|
+
for (const key of ['inject_tokens', 'source_tokens', 'injected_tokens', 'full_read_tokens']) {
|
|
692
|
+
if (typeof extra[key] === 'number') entry[key] = extra[key];
|
|
693
|
+
}
|
|
694
|
+
}
|
|
684
695
|
const line = JSON.stringify(entry) + '\n';
|
|
685
696
|
_rotateFile(telPath, HOOK_LOG_MAX_BYTES, TELEMETRY_KEEP_LINES);
|
|
686
697
|
fs.appendFileSync(telPath, line);
|
|
@@ -698,7 +709,8 @@ async function withTelemetry(hookName, fn) {
|
|
|
698
709
|
ok = false;
|
|
699
710
|
thrown = err;
|
|
700
711
|
}
|
|
701
|
-
|
|
712
|
+
const extra = (result && typeof result === 'object') ? result : undefined;
|
|
713
|
+
_writeTelemetry({ hookName, duration_ms: Date.now() - start, ok, extra });
|
|
702
714
|
if (thrown) throw thrown;
|
|
703
715
|
return result;
|
|
704
716
|
}
|
|
@@ -714,21 +726,25 @@ function withTelemetrySync(hookName, fn) {
|
|
|
714
726
|
ok = false;
|
|
715
727
|
thrown = err;
|
|
716
728
|
}
|
|
717
|
-
|
|
729
|
+
const extra = (result && typeof result === 'object') ? result : undefined;
|
|
730
|
+
_writeTelemetry({ hookName, duration_ms: Date.now() - start, ok, extra });
|
|
718
731
|
if (thrown) throw thrown;
|
|
719
732
|
return result;
|
|
720
733
|
}
|
|
721
734
|
|
|
722
|
-
function withTimeoutDb(db, sql, params = [], timeoutMs = 3000) {
|
|
723
|
-
if (!db) return [];
|
|
735
|
+
function withTimeoutDb(db, sql, params = [], { timeoutMs = 3000, mode = 'all' } = {}) {
|
|
736
|
+
if (!db) return mode === 'get' ? undefined : [];
|
|
724
737
|
try {
|
|
725
738
|
db.pragma(`busy_timeout = ${timeoutMs}`);
|
|
726
739
|
const stmt = db.prepare(sql);
|
|
740
|
+
if (mode === 'get') {
|
|
741
|
+
return params.length > 0 ? stmt.get(...params) : stmt.get();
|
|
742
|
+
}
|
|
727
743
|
return params.length > 0 ? stmt.all(...params) : stmt.all();
|
|
728
744
|
} catch (err) {
|
|
729
745
|
hookLog('timeout', 'warn', `DB query timeout/error: ${err.message}`);
|
|
730
|
-
_writeTelemetry('db_timeout', 0, false);
|
|
731
|
-
return [];
|
|
746
|
+
_writeTelemetry({ hookName: 'db_timeout', duration_ms: 0, ok: false });
|
|
747
|
+
return mode === 'get' ? undefined : [];
|
|
732
748
|
}
|
|
733
749
|
}
|
|
734
750
|
|
|
@@ -748,6 +764,7 @@ module.exports = {
|
|
|
748
764
|
readHookStdin,
|
|
749
765
|
SQL_FTS_CREATE,
|
|
750
766
|
SQL_FTS_INSERT,
|
|
767
|
+
SQL_FTS_TRIGRAM_INSERT,
|
|
751
768
|
SQL_FTS_SESSIONS_CREATE,
|
|
752
769
|
SQL_FTS_SESSIONS_INSERT,
|
|
753
770
|
SESSION_CATEGORIES,
|
|
@@ -803,8 +820,52 @@ module.exports = {
|
|
|
803
820
|
withTelemetrySync,
|
|
804
821
|
// DB timeout wrapper (v0.6.1)
|
|
805
822
|
withTimeoutDb,
|
|
823
|
+
// Raw file helpers (v0.6.3)
|
|
824
|
+
getUnpromotedRawFiles,
|
|
825
|
+
// Snapshot helpers (v0.6.3)
|
|
826
|
+
listSnapshots,
|
|
827
|
+
getLatestSnapshot,
|
|
828
|
+
// DB corruption recovery (v0.6.3)
|
|
829
|
+
isCorruptionError,
|
|
830
|
+
recoverCorruptDb,
|
|
806
831
|
};
|
|
807
832
|
|
|
833
|
+
function isCorruptionError(err) {
|
|
834
|
+
const code = err?.code ?? '';
|
|
835
|
+
const msg = String(err?.message ?? err);
|
|
836
|
+
return code === 'SQLITE_CORRUPT' || code === 'SQLITE_NOTADB' || /corrupt|malformed/i.test(msg);
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
function recoverCorruptDb(db, dbPath, hookName) {
|
|
840
|
+
try { db.close(); } catch { /* already closed */ }
|
|
841
|
+
const bakPath = dbPath + '.corrupt.bak';
|
|
842
|
+
try { fs.copyFileSync(dbPath, bakPath); } catch { /* best effort */ }
|
|
843
|
+
try { fs.unlinkSync(dbPath); } catch { /* best effort */ }
|
|
844
|
+
hookLog(hookName, 'warn', 'corrupt DB detected, backed up and removed: ' + dbPath);
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
function listSnapshots(diaryDir) {
|
|
848
|
+
if (!fs.existsSync(diaryDir)) return [];
|
|
849
|
+
return fs.readdirSync(diaryDir)
|
|
850
|
+
.filter(f => f.startsWith('delta-') || f.startsWith('compaction-'))
|
|
851
|
+
.sort();
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
function getLatestSnapshot(diaryDir) {
|
|
855
|
+
const files = listSnapshots(diaryDir);
|
|
856
|
+
return files.length > 0 ? files[files.length - 1] : null;
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
function getUnpromotedRawFiles(baseDir) {
|
|
860
|
+
const rawDir = path.join(baseDir, 'raw');
|
|
861
|
+
const sourcesDir = path.join(baseDir, 'sources');
|
|
862
|
+
if (!fs.existsSync(rawDir)) return [];
|
|
863
|
+
const sourceNames = fs.existsSync(sourcesDir)
|
|
864
|
+
? new Set(fs.readdirSync(sourcesDir).filter(f => f.endsWith('.md')))
|
|
865
|
+
: new Set();
|
|
866
|
+
return fs.readdirSync(rawDir).filter(f => f.endsWith('.md') && !sourceNames.has(f));
|
|
867
|
+
}
|
|
868
|
+
|
|
808
869
|
function isDaemonRunning(pidFile) {
|
|
809
870
|
if (!fs.existsSync(pidFile)) return { running: false };
|
|
810
871
|
const pid = parseInt(fs.readFileSync(pidFile, 'utf8').trim());
|
package/hooks/mindlore-index.cjs
CHANGED
|
@@ -12,6 +12,10 @@ const fs = require('fs');
|
|
|
12
12
|
const path = require('path');
|
|
13
13
|
const { MINDLORE_DIR, DB_NAME, SKIP_FILES, sha256, openDatabase, parseFrontmatter, extractFtsMetadata, insertFtsRow, readHookStdin, getProjectName, resolveProject, globalDir, hookLog, withTelemetry } = require('./lib/mindlore-common.cjs');
|
|
14
14
|
|
|
15
|
+
function invalidateSearchCache(db) {
|
|
16
|
+
try { db.exec('DELETE FROM search_cache'); } catch (_) { /* table may not exist */ }
|
|
17
|
+
}
|
|
18
|
+
|
|
15
19
|
function main() {
|
|
16
20
|
const filePath = readHookStdin(['path', 'file_path']);
|
|
17
21
|
if (!filePath) return;
|
|
@@ -55,6 +59,7 @@ function main() {
|
|
|
55
59
|
try {
|
|
56
60
|
db.prepare('DELETE FROM mindlore_fts WHERE path = ?').run(filePath);
|
|
57
61
|
db.prepare('DELETE FROM file_hashes WHERE path = ?').run(filePath);
|
|
62
|
+
invalidateSearchCache(db);
|
|
58
63
|
} finally {
|
|
59
64
|
db.close();
|
|
60
65
|
}
|
|
@@ -92,6 +97,7 @@ function main() {
|
|
|
92
97
|
).run(filePath, hash, new Date().toISOString());
|
|
93
98
|
});
|
|
94
99
|
updateIndex();
|
|
100
|
+
invalidateSearchCache(db);
|
|
95
101
|
} finally {
|
|
96
102
|
db.close();
|
|
97
103
|
}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
const fs = require('fs');
|
|
16
16
|
const path = require('path');
|
|
17
|
-
const { findMindloreDir, getLatestDelta, hookLog, withTelemetry } = require('./lib/mindlore-common.cjs');
|
|
17
|
+
const { findMindloreDir, getLatestDelta, readConfig, hookLog, withTelemetry } = require('./lib/mindlore-common.cjs');
|
|
18
18
|
|
|
19
19
|
function main() {
|
|
20
20
|
const baseDir = findMindloreDir();
|
|
@@ -29,8 +29,8 @@ function main() {
|
|
|
29
29
|
output.push(`[Mindlore INDEX (post-compact)]\n${content}`);
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
// Re-inject latest delta
|
|
33
32
|
const diaryDir = path.join(baseDir, 'diary');
|
|
33
|
+
|
|
34
34
|
const latestDelta = getLatestDelta(diaryDir);
|
|
35
35
|
if (latestDelta) {
|
|
36
36
|
const deltaContent = fs.readFileSync(latestDelta, 'utf8').trim();
|
|
@@ -38,8 +38,28 @@ function main() {
|
|
|
38
38
|
output.push(`[Mindlore Delta (post-compact): ${deltaName}]\n${deltaContent}`);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
try {
|
|
42
|
+
const snapshots = fs.readdirSync(diaryDir)
|
|
43
|
+
.filter(f => f.startsWith('compaction-snapshot-'))
|
|
44
|
+
.sort();
|
|
45
|
+
if (snapshots.length > 0) {
|
|
46
|
+
const latestSnapshot = snapshots[snapshots.length - 1];
|
|
47
|
+
const snapshotContent = fs.readFileSync(
|
|
48
|
+
path.join(diaryDir, latestSnapshot), 'utf8'
|
|
49
|
+
).trim();
|
|
50
|
+
output.push(`[Mindlore Compaction Resume]\n${snapshotContent}`);
|
|
51
|
+
}
|
|
52
|
+
} catch (_err) { /* snapshot best-effort */ }
|
|
53
|
+
|
|
41
54
|
if (output.length > 0) {
|
|
42
|
-
|
|
55
|
+
const config = readConfig(baseDir);
|
|
56
|
+
const budgetConfig = config?.tokenBudget ?? {};
|
|
57
|
+
const maxInjectChars = (budgetConfig.sessionInject || 2000) * 4;
|
|
58
|
+
let joined = output.join('\n\n');
|
|
59
|
+
if (joined.length > maxInjectChars) {
|
|
60
|
+
joined = joined.slice(0, maxInjectChars) + '\n[...truncated by token budget]';
|
|
61
|
+
}
|
|
62
|
+
process.stdout.write(joined + '\n');
|
|
43
63
|
}
|
|
44
64
|
}
|
|
45
65
|
|