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.
Files changed (177) hide show
  1. package/LICENSE +661 -21
  2. package/README.md +3 -3
  3. package/dist/scripts/cc-session-sync.d.ts +2 -0
  4. package/dist/scripts/cc-session-sync.d.ts.map +1 -1
  5. package/dist/scripts/cc-session-sync.js +56 -0
  6. package/dist/scripts/cc-session-sync.js.map +1 -1
  7. package/dist/scripts/fetch-raw.js +133 -8
  8. package/dist/scripts/fetch-raw.js.map +1 -1
  9. package/dist/scripts/init.js +28 -43
  10. package/dist/scripts/init.js.map +1 -1
  11. package/dist/scripts/lib/chunker.d.ts +12 -0
  12. package/dist/scripts/lib/chunker.d.ts.map +1 -0
  13. package/dist/scripts/lib/chunker.js +94 -0
  14. package/dist/scripts/lib/chunker.js.map +1 -0
  15. package/dist/scripts/lib/episodes.d.ts +1 -1
  16. package/dist/scripts/lib/episodes.d.ts.map +1 -1
  17. package/dist/scripts/lib/episodes.js +1 -1
  18. package/dist/scripts/lib/episodes.js.map +1 -1
  19. package/dist/scripts/lib/fuzzy.d.ts +10 -0
  20. package/dist/scripts/lib/fuzzy.d.ts.map +1 -0
  21. package/dist/scripts/lib/fuzzy.js +88 -0
  22. package/dist/scripts/lib/fuzzy.js.map +1 -0
  23. package/dist/scripts/lib/hybrid-search.d.ts +1 -0
  24. package/dist/scripts/lib/hybrid-search.d.ts.map +1 -1
  25. package/dist/scripts/lib/hybrid-search.js.map +1 -1
  26. package/dist/scripts/lib/merge-defaults.d.ts +5 -0
  27. package/dist/scripts/lib/merge-defaults.d.ts.map +1 -0
  28. package/dist/scripts/lib/merge-defaults.js +25 -0
  29. package/dist/scripts/lib/merge-defaults.js.map +1 -0
  30. package/dist/scripts/lib/migrations-v062.d.ts +3 -0
  31. package/dist/scripts/lib/migrations-v062.d.ts.map +1 -0
  32. package/dist/scripts/lib/migrations-v062.js +35 -0
  33. package/dist/scripts/lib/migrations-v062.js.map +1 -0
  34. package/dist/scripts/lib/migrations-v063.d.ts +7 -0
  35. package/dist/scripts/lib/migrations-v063.d.ts.map +1 -0
  36. package/dist/scripts/lib/migrations-v063.js +58 -0
  37. package/dist/scripts/lib/migrations-v063.js.map +1 -0
  38. package/dist/scripts/lib/proximity.d.ts +3 -0
  39. package/dist/scripts/lib/proximity.d.ts.map +1 -0
  40. package/dist/scripts/lib/proximity.js +53 -0
  41. package/dist/scripts/lib/proximity.js.map +1 -0
  42. package/dist/scripts/lib/rrf.d.ts +23 -0
  43. package/dist/scripts/lib/rrf.d.ts.map +1 -0
  44. package/dist/scripts/lib/rrf.js +63 -0
  45. package/dist/scripts/lib/rrf.js.map +1 -0
  46. package/dist/scripts/lib/search-cache.d.ts +20 -0
  47. package/dist/scripts/lib/search-cache.d.ts.map +1 -0
  48. package/dist/scripts/lib/search-cache.js +60 -0
  49. package/dist/scripts/lib/search-cache.js.map +1 -0
  50. package/dist/scripts/lib/search-engine.d.ts +22 -0
  51. package/dist/scripts/lib/search-engine.d.ts.map +1 -0
  52. package/dist/scripts/lib/search-engine.js +105 -0
  53. package/dist/scripts/lib/search-engine.js.map +1 -0
  54. package/dist/scripts/lib/session-payload.d.ts +2 -4
  55. package/dist/scripts/lib/session-payload.d.ts.map +1 -1
  56. package/dist/scripts/lib/session-payload.js +43 -43
  57. package/dist/scripts/lib/session-payload.js.map +1 -1
  58. package/dist/scripts/lib/snippet.d.ts +2 -0
  59. package/dist/scripts/lib/snippet.d.ts.map +1 -0
  60. package/dist/scripts/lib/snippet.js +32 -0
  61. package/dist/scripts/lib/snippet.js.map +1 -0
  62. package/dist/scripts/lib/triage.d.ts +18 -0
  63. package/dist/scripts/lib/triage.d.ts.map +1 -0
  64. package/dist/scripts/lib/triage.js +81 -0
  65. package/dist/scripts/lib/triage.js.map +1 -0
  66. package/dist/scripts/mindlore-doctor.d.ts +1 -0
  67. package/dist/scripts/mindlore-doctor.d.ts.map +1 -1
  68. package/dist/scripts/mindlore-doctor.js +26 -1
  69. package/dist/scripts/mindlore-doctor.js.map +1 -1
  70. package/dist/scripts/mindlore-fts5-index.js +44 -3
  71. package/dist/scripts/mindlore-fts5-index.js.map +1 -1
  72. package/dist/scripts/mindlore-fts5-search.d.ts +3 -5
  73. package/dist/scripts/mindlore-fts5-search.d.ts.map +1 -1
  74. package/dist/scripts/mindlore-fts5-search.js +41 -116
  75. package/dist/scripts/mindlore-fts5-search.js.map +1 -1
  76. package/dist/scripts/mindlore-health-check.d.ts +10 -0
  77. package/dist/scripts/mindlore-health-check.d.ts.map +1 -1
  78. package/dist/scripts/mindlore-health-check.js +26 -1
  79. package/dist/scripts/mindlore-health-check.js.map +1 -1
  80. package/dist/scripts/mindlore-perf.d.ts +3 -3
  81. package/dist/scripts/mindlore-perf.d.ts.map +1 -1
  82. package/dist/scripts/mindlore-perf.js +10 -8
  83. package/dist/scripts/mindlore-perf.js.map +1 -1
  84. package/dist/tests/chunker.test.d.ts +2 -0
  85. package/dist/tests/chunker.test.d.ts.map +1 -0
  86. package/dist/tests/chunker.test.js +40 -0
  87. package/dist/tests/chunker.test.js.map +1 -0
  88. package/dist/tests/chunks-migration.test.d.ts +2 -0
  89. package/dist/tests/chunks-migration.test.d.ts.map +1 -0
  90. package/dist/tests/chunks-migration.test.js +55 -0
  91. package/dist/tests/chunks-migration.test.js.map +1 -0
  92. package/dist/tests/compaction-snapshot.test.d.ts +2 -0
  93. package/dist/tests/compaction-snapshot.test.d.ts.map +1 -0
  94. package/dist/tests/compaction-snapshot.test.js +102 -0
  95. package/dist/tests/compaction-snapshot.test.js.map +1 -0
  96. package/dist/tests/daemon-integration.test.js +5 -5
  97. package/dist/tests/daemon-integration.test.js.map +1 -1
  98. package/dist/tests/diary.test.js +3 -3
  99. package/dist/tests/diary.test.js.map +1 -1
  100. package/dist/tests/doctor.test.js +13 -0
  101. package/dist/tests/doctor.test.js.map +1 -1
  102. package/dist/tests/fetch-raw.test.js +12 -5
  103. package/dist/tests/fetch-raw.test.js.map +1 -1
  104. package/dist/tests/fuzzy.test.d.ts +2 -0
  105. package/dist/tests/fuzzy.test.d.ts.map +1 -0
  106. package/dist/tests/fuzzy.test.js +70 -0
  107. package/dist/tests/fuzzy.test.js.map +1 -0
  108. package/dist/tests/health-check-memory.test.js +27 -0
  109. package/dist/tests/health-check-memory.test.js.map +1 -1
  110. package/dist/tests/helpers/db.d.ts.map +1 -1
  111. package/dist/tests/helpers/db.js +4 -1
  112. package/dist/tests/helpers/db.js.map +1 -1
  113. package/dist/tests/init.test.js +20 -0
  114. package/dist/tests/init.test.js.map +1 -1
  115. package/dist/tests/merge-defaults.test.d.ts +2 -0
  116. package/dist/tests/merge-defaults.test.d.ts.map +1 -0
  117. package/dist/tests/merge-defaults.test.js +35 -0
  118. package/dist/tests/merge-defaults.test.js.map +1 -0
  119. package/dist/tests/migrations-v062.test.d.ts +2 -0
  120. package/dist/tests/migrations-v062.test.d.ts.map +1 -0
  121. package/dist/tests/migrations-v062.test.js +61 -0
  122. package/dist/tests/migrations-v062.test.js.map +1 -0
  123. package/dist/tests/migrations-v063.test.d.ts +2 -0
  124. package/dist/tests/migrations-v063.test.d.ts.map +1 -0
  125. package/dist/tests/migrations-v063.test.js +84 -0
  126. package/dist/tests/migrations-v063.test.js.map +1 -0
  127. package/dist/tests/nomination.test.js +1 -1
  128. package/dist/tests/proximity.test.d.ts +2 -0
  129. package/dist/tests/proximity.test.d.ts.map +1 -0
  130. package/dist/tests/proximity.test.js +31 -0
  131. package/dist/tests/proximity.test.js.map +1 -0
  132. package/dist/tests/rrf.test.d.ts +2 -0
  133. package/dist/tests/rrf.test.d.ts.map +1 -0
  134. package/dist/tests/rrf.test.js +100 -0
  135. package/dist/tests/rrf.test.js.map +1 -0
  136. package/dist/tests/savings.test.d.ts +2 -0
  137. package/dist/tests/savings.test.d.ts.map +1 -0
  138. package/dist/tests/savings.test.js +87 -0
  139. package/dist/tests/savings.test.js.map +1 -0
  140. package/dist/tests/search-cache.test.d.ts +2 -0
  141. package/dist/tests/search-cache.test.d.ts.map +1 -0
  142. package/dist/tests/search-cache.test.js +95 -0
  143. package/dist/tests/search-cache.test.js.map +1 -0
  144. package/dist/tests/search-engine.test.d.ts +2 -0
  145. package/dist/tests/search-engine.test.d.ts.map +1 -0
  146. package/dist/tests/search-engine.test.js +125 -0
  147. package/dist/tests/search-engine.test.js.map +1 -0
  148. package/dist/tests/search-hook.test.js +3 -3
  149. package/dist/tests/search-hook.test.js.map +1 -1
  150. package/dist/tests/session-payload.test.d.ts +1 -1
  151. package/dist/tests/session-payload.test.js +1 -14
  152. package/dist/tests/session-payload.test.js.map +1 -1
  153. package/dist/tests/session-summary.test.d.ts +2 -0
  154. package/dist/tests/session-summary.test.d.ts.map +1 -0
  155. package/dist/tests/session-summary.test.js +138 -0
  156. package/dist/tests/session-summary.test.js.map +1 -0
  157. package/dist/tests/snippet.test.d.ts +2 -0
  158. package/dist/tests/snippet.test.d.ts.map +1 -0
  159. package/dist/tests/snippet.test.js +30 -0
  160. package/dist/tests/snippet.test.js.map +1 -0
  161. package/dist/tests/telemetry-perf.test.js +7 -0
  162. package/dist/tests/telemetry-perf.test.js.map +1 -1
  163. package/dist/tests/triage.test.d.ts +2 -0
  164. package/dist/tests/triage.test.d.ts.map +1 -0
  165. package/dist/tests/triage.test.js +69 -0
  166. package/dist/tests/triage.test.js.map +1 -0
  167. package/hooks/lib/mindlore-common.cjs +74 -13
  168. package/hooks/mindlore-index.cjs +6 -0
  169. package/hooks/mindlore-post-compact.cjs +23 -3
  170. package/hooks/mindlore-pre-compact.cjs +86 -3
  171. package/hooks/mindlore-search.cjs +90 -214
  172. package/hooks/mindlore-session-end.cjs +22 -18
  173. package/hooks/mindlore-session-focus.cjs +92 -71
  174. package/package.json +6 -5
  175. package/plugin.json +1 -1
  176. package/skills/mindlore-maintain/SKILL.md +1 -0
  177. 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 + cache-lock.
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":"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"}
1
+ {"version":3,"file":"session-payload.test.js","sourceRoot":"","sources":["../../tests/session-payload.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session-summary.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=snippet.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=triage.test.d.ts.map
@@ -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 stmt = db.prepare(SQL_FTS_INSERT);
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?.injected_tokens) entry.injected_tokens = extra.injected_tokens;
683
- if (extra?.full_read_tokens) entry.full_read_tokens = extra.full_read_tokens;
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
- _writeTelemetry(hookName, Date.now() - start, ok);
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
- _writeTelemetry(hookName, Date.now() - start, ok);
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());
@@ -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
- process.stdout.write(output.join('\n\n') + '\n');
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