mindlore 0.4.3 → 0.5.1

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 (120) hide show
  1. package/README.md +2 -1
  2. package/dist/scripts/init.js +45 -3
  3. package/dist/scripts/init.js.map +1 -1
  4. package/dist/scripts/lib/constants.d.ts +15 -0
  5. package/dist/scripts/lib/constants.d.ts.map +1 -1
  6. package/dist/scripts/lib/constants.js +16 -1
  7. package/dist/scripts/lib/constants.js.map +1 -1
  8. package/dist/scripts/lib/db-helpers.d.ts +15 -0
  9. package/dist/scripts/lib/db-helpers.d.ts.map +1 -1
  10. package/dist/scripts/lib/db-helpers.js +51 -0
  11. package/dist/scripts/lib/db-helpers.js.map +1 -1
  12. package/dist/scripts/lib/embedding.d.ts +5 -0
  13. package/dist/scripts/lib/embedding.d.ts.map +1 -0
  14. package/dist/scripts/lib/embedding.js +44 -0
  15. package/dist/scripts/lib/embedding.js.map +1 -0
  16. package/dist/scripts/lib/hybrid-search.d.ts +62 -0
  17. package/dist/scripts/lib/hybrid-search.d.ts.map +1 -0
  18. package/dist/scripts/lib/hybrid-search.js +150 -0
  19. package/dist/scripts/lib/hybrid-search.js.map +1 -0
  20. package/dist/scripts/lib/migrations-v051.d.ts +3 -0
  21. package/dist/scripts/lib/migrations-v051.d.ts.map +1 -0
  22. package/dist/scripts/lib/migrations-v051.js +24 -0
  23. package/dist/scripts/lib/migrations-v051.js.map +1 -0
  24. package/dist/scripts/lib/migrations.d.ts +4 -0
  25. package/dist/scripts/lib/migrations.d.ts.map +1 -0
  26. package/dist/scripts/lib/migrations.js +40 -0
  27. package/dist/scripts/lib/migrations.js.map +1 -0
  28. package/dist/scripts/lib/privacy-filter.d.ts +3 -0
  29. package/dist/scripts/lib/privacy-filter.d.ts.map +1 -0
  30. package/dist/scripts/lib/privacy-filter.js +28 -0
  31. package/dist/scripts/lib/privacy-filter.js.map +1 -0
  32. package/dist/scripts/lib/schema-version.d.ts +13 -0
  33. package/dist/scripts/lib/schema-version.d.ts.map +1 -0
  34. package/dist/scripts/lib/schema-version.js +37 -0
  35. package/dist/scripts/lib/schema-version.js.map +1 -0
  36. package/dist/scripts/lib/similarity.d.ts +12 -0
  37. package/dist/scripts/lib/similarity.d.ts.map +1 -0
  38. package/dist/scripts/lib/similarity.js +64 -0
  39. package/dist/scripts/lib/similarity.js.map +1 -0
  40. package/dist/scripts/lib/synonym.d.ts +4 -0
  41. package/dist/scripts/lib/synonym.d.ts.map +1 -0
  42. package/dist/scripts/lib/synonym.js +37 -0
  43. package/dist/scripts/lib/synonym.js.map +1 -0
  44. package/dist/scripts/mindlore-fts5-index.d.ts +2 -1
  45. package/dist/scripts/mindlore-fts5-index.d.ts.map +1 -1
  46. package/dist/scripts/mindlore-fts5-index.js +71 -5
  47. package/dist/scripts/mindlore-fts5-index.js.map +1 -1
  48. package/dist/scripts/mindlore-fts5-search.d.ts +3 -2
  49. package/dist/scripts/mindlore-fts5-search.d.ts.map +1 -1
  50. package/dist/scripts/mindlore-fts5-search.js +89 -35
  51. package/dist/scripts/mindlore-fts5-search.js.map +1 -1
  52. package/dist/scripts/mindlore-health-check.js +105 -0
  53. package/dist/scripts/mindlore-health-check.js.map +1 -1
  54. package/dist/scripts/quality-populate.js +8 -4
  55. package/dist/scripts/quality-populate.js.map +1 -1
  56. package/dist/tests/cc-memory-sync.test.d.ts +2 -0
  57. package/dist/tests/cc-memory-sync.test.d.ts.map +1 -0
  58. package/dist/tests/cc-memory-sync.test.js +121 -0
  59. package/dist/tests/cc-memory-sync.test.js.map +1 -0
  60. package/dist/tests/embedding.test.d.ts +6 -0
  61. package/dist/tests/embedding.test.d.ts.map +1 -0
  62. package/dist/tests/embedding.test.js +71 -0
  63. package/dist/tests/embedding.test.js.map +1 -0
  64. package/dist/tests/episode-file.test.d.ts +2 -0
  65. package/dist/tests/episode-file.test.d.ts.map +1 -0
  66. package/dist/tests/episode-file.test.js +79 -0
  67. package/dist/tests/episode-file.test.js.map +1 -0
  68. package/dist/tests/fts5.test.js +82 -0
  69. package/dist/tests/fts5.test.js.map +1 -1
  70. package/dist/tests/helpers/db.d.ts +6 -0
  71. package/dist/tests/helpers/db.d.ts.map +1 -1
  72. package/dist/tests/helpers/db.js +29 -0
  73. package/dist/tests/helpers/db.js.map +1 -1
  74. package/dist/tests/hook-logging.test.d.ts +2 -0
  75. package/dist/tests/hook-logging.test.d.ts.map +1 -0
  76. package/dist/tests/hook-logging.test.js +108 -0
  77. package/dist/tests/hook-logging.test.js.map +1 -0
  78. package/dist/tests/hybrid-search.test.d.ts +2 -0
  79. package/dist/tests/hybrid-search.test.d.ts.map +1 -0
  80. package/dist/tests/hybrid-search.test.js +114 -0
  81. package/dist/tests/hybrid-search.test.js.map +1 -0
  82. package/dist/tests/index-cli-embed.test.d.ts +7 -0
  83. package/dist/tests/index-cli-embed.test.d.ts.map +1 -0
  84. package/dist/tests/index-cli-embed.test.js +128 -0
  85. package/dist/tests/index-cli-embed.test.js.map +1 -0
  86. package/dist/tests/privacy-filter.test.d.ts +2 -0
  87. package/dist/tests/privacy-filter.test.d.ts.map +1 -0
  88. package/dist/tests/privacy-filter.test.js +56 -0
  89. package/dist/tests/privacy-filter.test.js.map +1 -0
  90. package/dist/tests/schema-version.test.d.ts +2 -0
  91. package/dist/tests/schema-version.test.d.ts.map +1 -0
  92. package/dist/tests/schema-version.test.js +127 -0
  93. package/dist/tests/schema-version.test.js.map +1 -0
  94. package/dist/tests/search-cli-hybrid.test.d.ts +6 -0
  95. package/dist/tests/search-cli-hybrid.test.d.ts.map +1 -0
  96. package/dist/tests/search-cli-hybrid.test.js +103 -0
  97. package/dist/tests/search-cli-hybrid.test.js.map +1 -0
  98. package/dist/tests/search-hook.test.js +44 -0
  99. package/dist/tests/search-hook.test.js.map +1 -1
  100. package/dist/tests/similarity.test.d.ts +2 -0
  101. package/dist/tests/similarity.test.d.ts.map +1 -0
  102. package/dist/tests/similarity.test.js +61 -0
  103. package/dist/tests/similarity.test.js.map +1 -0
  104. package/dist/tests/synonym.test.d.ts +2 -0
  105. package/dist/tests/synonym.test.d.ts.map +1 -0
  106. package/dist/tests/synonym.test.js +47 -0
  107. package/dist/tests/synonym.test.js.map +1 -0
  108. package/dist/tests/token-budget.test.d.ts +2 -0
  109. package/dist/tests/token-budget.test.d.ts.map +1 -0
  110. package/dist/tests/token-budget.test.js +32 -0
  111. package/dist/tests/token-budget.test.js.map +1 -0
  112. package/hooks/lib/mindlore-common.cjs +120 -0
  113. package/hooks/mindlore-index.cjs +82 -2
  114. package/hooks/mindlore-search.cjs +102 -35
  115. package/hooks/mindlore-session-end.cjs +129 -39
  116. package/hooks/mindlore-session-focus.cjs +24 -3
  117. package/package.json +6 -4
  118. package/plugin.json +1 -1
  119. package/skills/mindlore-ingest/SKILL.md +7 -1
  120. package/templates/config.json +20 -1
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.l2ToCosine = l2ToCosine;
4
+ exports.normalizeBM25 = normalizeBM25;
5
+ exports.computeRRF = computeRRF;
6
+ exports.searchFts5 = searchFts5;
7
+ exports.searchVec = searchVec;
8
+ exports.hybridSearch = hybridSearch;
9
+ const db_helpers_js_1 = require("./db-helpers.js");
10
+ // ── Utility Functions ──────────────────────────────────────────────
11
+ /**
12
+ * Convert L2 distance to cosine similarity.
13
+ * For normalized vectors: cosine_sim = 1.0 - (l2_dist² / 2.0)
14
+ */
15
+ function l2ToCosine(l2Distance) {
16
+ const cosine = 1.0 - (l2Distance * l2Distance / 2.0);
17
+ return Math.max(0.0, Math.min(1.0, cosine));
18
+ }
19
+ // Empirical upper bound for BM25 absolute rank in Mindlore corpus (~150 docs)
20
+ const BM25_MAX_RANK = 25.0;
21
+ /**
22
+ * Normalize FTS5 BM25 rank to 0-1 range.
23
+ * FTS5 returns negative rank — more negative = better match.
24
+ */
25
+ function normalizeBM25(rank) {
26
+ return Math.abs(rank) / BM25_MAX_RANK;
27
+ }
28
+ // ── RRF Fusion ─────────────────────────────────────────────────────
29
+ function computeRRF(ftsResults, vecResults, options = {}) {
30
+ const k = options.k ?? 60;
31
+ const ftsWeight = options.ftsWeight ?? 0.4;
32
+ const vecWeight = options.vecWeight ?? 0.6;
33
+ const scores = new Map();
34
+ // FTS5 results — already sorted by rank (most negative first = best)
35
+ for (let i = 0; i < ftsResults.length; i++) {
36
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- loop guard: i < length
37
+ const r = ftsResults[i];
38
+ const rrfScore = ftsWeight * (1.0 / (k + i + 1));
39
+ const existing = scores.get(r.slug);
40
+ if (existing) {
41
+ existing.score += rrfScore;
42
+ existing.ftsRank = r.rank;
43
+ }
44
+ else {
45
+ scores.set(r.slug, {
46
+ slug: r.slug,
47
+ score: rrfScore,
48
+ ftsRank: r.rank,
49
+ path: r.path,
50
+ description: r.description,
51
+ title: r.title,
52
+ category: r.category,
53
+ tags: r.tags,
54
+ });
55
+ }
56
+ }
57
+ // Vec results — already sorted by distance (lowest first = most similar)
58
+ for (let i = 0; i < vecResults.length; i++) {
59
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- loop guard: i < length
60
+ const r = vecResults[i];
61
+ const rrfScore = vecWeight * (1.0 / (k + i + 1));
62
+ const existing = scores.get(r.slug);
63
+ if (existing) {
64
+ existing.score += rrfScore;
65
+ existing.vecDistance = r.distance;
66
+ }
67
+ else {
68
+ scores.set(r.slug, {
69
+ slug: r.slug,
70
+ score: rrfScore,
71
+ vecDistance: r.distance,
72
+ });
73
+ }
74
+ }
75
+ return Array.from(scores.values()).sort((a, b) => b.score - a.score);
76
+ }
77
+ // ── Search Functions ───────────────────────────────────────────────
78
+ function searchFts5(db, query, limit = 20, project) {
79
+ const sanitized = query.replace(/["*(){}[\]^~:]/g, '').trim();
80
+ if (!sanitized)
81
+ return [];
82
+ const terms = sanitized.split(/\s+/).map(t => `"${t}"`).join(' OR ');
83
+ try {
84
+ if (project) {
85
+ return (0, db_helpers_js_1.dbAll)(db, `SELECT slug, path, description, title, category, tags, rank
86
+ FROM mindlore_fts
87
+ WHERE mindlore_fts MATCH ? AND project = ?
88
+ ORDER BY rank
89
+ LIMIT ?`, terms, project, limit);
90
+ }
91
+ return (0, db_helpers_js_1.dbAll)(db, `SELECT slug, path, description, title, category, tags, rank
92
+ FROM mindlore_fts
93
+ WHERE mindlore_fts MATCH ?
94
+ ORDER BY rank
95
+ LIMIT ?`, terms, limit);
96
+ }
97
+ catch (_err) {
98
+ return [];
99
+ }
100
+ }
101
+ function searchVec(db, queryEmbedding, limit = 20) {
102
+ try {
103
+ const buf = Buffer.from(new Float32Array(queryEmbedding).buffer);
104
+ return (0, db_helpers_js_1.dbAll)(db, `SELECT slug, distance
105
+ FROM documents_vec
106
+ WHERE embedding MATCH ?
107
+ ORDER BY distance
108
+ LIMIT ?`, buf, limit);
109
+ }
110
+ catch (_err) {
111
+ return [];
112
+ }
113
+ }
114
+ /**
115
+ * Main hybrid search entry point.
116
+ * Falls back to pure FTS5 when vec table or embedding is not available.
117
+ */
118
+ function hybridSearch(db, query, options = {}) {
119
+ const maxResults = options.maxResults ?? 5;
120
+ const ftsLimit = 20;
121
+ const vecLimit = 20;
122
+ // Always search FTS5
123
+ const ftsResults = searchFts5(db, query, ftsLimit, options.project);
124
+ // Try vec search if embedding is provided and vec table exists
125
+ let vecResults = [];
126
+ if (options.queryEmbedding && (0, db_helpers_js_1.hasVecTable)(db)) {
127
+ vecResults = searchVec(db, options.queryEmbedding, vecLimit);
128
+ }
129
+ // If no vec results, return FTS5 results directly
130
+ if (vecResults.length === 0) {
131
+ return ftsResults.slice(0, maxResults).map(r => ({
132
+ slug: r.slug,
133
+ score: normalizeBM25(r.rank),
134
+ ftsRank: r.rank,
135
+ path: r.path,
136
+ description: r.description,
137
+ title: r.title,
138
+ category: r.category,
139
+ tags: r.tags,
140
+ }));
141
+ }
142
+ // Fuse results with RRF
143
+ const fused = computeRRF(ftsResults, vecResults, {
144
+ k: options.k,
145
+ ftsWeight: options.ftsWeight,
146
+ vecWeight: options.vecWeight,
147
+ });
148
+ return fused.slice(0, maxResults);
149
+ }
150
+ //# sourceMappingURL=hybrid-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-search.js","sourceRoot":"","sources":["../../../scripts/lib/hybrid-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Migration } from './schema-version.js';
2
+ export declare const V051_MIGRATIONS: Migration[];
3
+ //# sourceMappingURL=migrations-v051.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations-v051.d.ts","sourceRoot":"","sources":["../../../scripts/lib/migrations-v051.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIrD,eAAO,MAAM,eAAe,EAAE,SAAS,EAoBtC,CAAC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.V051_MIGRATIONS = void 0;
4
+ exports.V051_MIGRATIONS = [
5
+ {
6
+ version: 2,
7
+ name: 'add_source_type_and_project_scope',
8
+ up: (db) => {
9
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- pragma returns array of objects
10
+ const cols = db.pragma('table_info(file_hashes)');
11
+ const colNames = new Set(cols.map(c => c.name));
12
+ if (!colNames.has('source_type')) {
13
+ db.exec("ALTER TABLE file_hashes ADD COLUMN source_type TEXT DEFAULT 'mindlore'");
14
+ }
15
+ if (!colNames.has('project_scope')) {
16
+ db.exec('ALTER TABLE file_hashes ADD COLUMN project_scope TEXT');
17
+ }
18
+ if (!colNames.has('content_hash')) {
19
+ db.exec('ALTER TABLE file_hashes ADD COLUMN content_hash TEXT');
20
+ }
21
+ },
22
+ },
23
+ ];
24
+ //# sourceMappingURL=migrations-v051.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations-v051.js","sourceRoot":"","sources":["../../../scripts/lib/migrations-v051.ts"],"names":[],"mappings":";;;AAIa,QAAA,eAAe,GAAgB;IAC1C;QACE,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,mCAAmC;QACzC,EAAE,EAAE,CAAC,EAAY,EAAE,EAAE;YACnB,0GAA0G;YAC1G,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,yBAAyB,CAA4B,CAAC;YAC7E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAEhD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;gBACjC,EAAE,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;YACpF,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;gBACnC,EAAE,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YACnE,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;gBAClC,EAAE,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;KACF;CACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Migration } from './schema-version.js';
2
+ export declare const V050_MIGRATIONS: Migration[];
3
+ export { V051_MIGRATIONS } from './migrations-v051.js';
4
+ //# sourceMappingURL=migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../scripts/lib/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAKrD,eAAO,MAAM,eAAe,EAAE,SAAS,EAiCtC,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.V051_MIGRATIONS = exports.V050_MIGRATIONS = void 0;
4
+ const constants_js_1 = require("./constants.js");
5
+ exports.V050_MIGRATIONS = [
6
+ {
7
+ version: 1,
8
+ name: 'add_vec_table_and_timestamps',
9
+ up: (db) => {
10
+ // 1. Create vec table (requires sqlite-vec loaded — skip gracefully if not)
11
+ try {
12
+ db.exec(`
13
+ CREATE VIRTUAL TABLE IF NOT EXISTS ${constants_js_1.VEC_TABLE_NAME} USING vec0(
14
+ embedding float[${constants_js_1.EMBEDDING_DIM_CONST}],
15
+ slug text,
16
+ +created_at text,
17
+ +model_name text
18
+ )
19
+ `);
20
+ }
21
+ catch (_err) {
22
+ // sqlite-vec not loaded — vec table will be created when extension is available
23
+ }
24
+ // 2. Add timestamp columns to file_hashes
25
+ // (FTS5 virtual tables can't be altered — timestamps go in file_hashes)
26
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- pragma returns array of objects
27
+ const cols = db.pragma('table_info(file_hashes)');
28
+ const colNames = new Set(cols.map(c => c.name));
29
+ if (!colNames.has('created_at')) {
30
+ db.exec('ALTER TABLE file_hashes ADD COLUMN created_at TEXT');
31
+ }
32
+ if (!colNames.has('updated_at')) {
33
+ db.exec('ALTER TABLE file_hashes ADD COLUMN updated_at TEXT');
34
+ }
35
+ },
36
+ },
37
+ ];
38
+ var migrations_v051_js_1 = require("./migrations-v051.js");
39
+ Object.defineProperty(exports, "V051_MIGRATIONS", { enumerable: true, get: function () { return migrations_v051_js_1.V051_MIGRATIONS; } });
40
+ //# sourceMappingURL=migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../scripts/lib/migrations.ts"],"names":[],"mappings":";;;AACA,iDAAqE;AAIxD,QAAA,eAAe,GAAgB;IAC1C;QACE,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,8BAA8B;QACpC,EAAE,EAAE,CAAC,EAAY,EAAE,EAAE;YACnB,4EAA4E;YAC5E,IAAI,CAAC;gBACH,EAAE,CAAC,IAAI,CAAC;+CAC+B,6BAAc;8BAC/B,kCAAmB;;;;;SAKxC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,IAAI,EAAE,CAAC;gBACd,gFAAgF;YAClF,CAAC;YAED,0CAA0C;YAC1C,wEAAwE;YACxE,0GAA0G;YAC1G,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,yBAAyB,CAA4B,CAAC;YAC7E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAEhD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;gBAChC,EAAE,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;YAChE,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;gBAChC,EAAE,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;KACF;CACF,CAAC;AAEF,2DAAuD;AAA9C,qHAAA,eAAe,OAAA"}
@@ -0,0 +1,3 @@
1
+ export declare const DEFAULT_PATTERNS: RegExp[];
2
+ export declare function redactSecrets(text: string, extraPatterns?: RegExp[]): string;
3
+ //# sourceMappingURL=privacy-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privacy-filter.d.ts","sourceRoot":"","sources":["../../../scripts/lib/privacy-filter.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,EAAE,MAAM,EAUpC,CAAC;AAIF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAW5E"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_PATTERNS = void 0;
4
+ exports.redactSecrets = redactSecrets;
5
+ exports.DEFAULT_PATTERNS = [
6
+ /sk-(?:proj-)?[A-Za-z0-9_-]{20,}/g,
7
+ /AKIA[0-9A-Z]{16}/g,
8
+ /ghp_[A-Za-z0-9]{36,}/g,
9
+ /gho_[A-Za-z0-9]{36,}/g,
10
+ /github_pat_[A-Za-z0-9_]{22,}/g,
11
+ /npm_[A-Za-z0-9]{36,}/g,
12
+ /xox[bporas]-[A-Za-z0-9-]{10,}/g,
13
+ /(?:postgres|mysql|mongodb|redis|amqp):\/\/[^\s"']+/g,
14
+ /(?:PASSWORD|SECRET|TOKEN|API_KEY|PRIVATE_KEY|DATABASE_URL|DB_PASSWORD|AUTH_TOKEN|ACCESS_KEY|SECRET_KEY)=\S+/gi,
15
+ ];
16
+ const REPLACEMENT = '[REDACTED]';
17
+ function redactSecrets(text, extraPatterns) {
18
+ let result = text;
19
+ const patterns = extraPatterns
20
+ ? [...exports.DEFAULT_PATTERNS, ...extraPatterns]
21
+ : exports.DEFAULT_PATTERNS;
22
+ for (const pattern of patterns) {
23
+ pattern.lastIndex = 0;
24
+ result = result.replace(pattern, REPLACEMENT);
25
+ }
26
+ return result;
27
+ }
28
+ //# sourceMappingURL=privacy-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privacy-filter.js","sourceRoot":"","sources":["../../../scripts/lib/privacy-filter.ts"],"names":[],"mappings":";;;AAcA,sCAWC;AAzBY,QAAA,gBAAgB,GAAa;IACxC,kCAAkC;IAClC,mBAAmB;IACnB,uBAAuB;IACvB,uBAAuB;IACvB,+BAA+B;IAC/B,uBAAuB;IACvB,gCAAgC;IAChC,qDAAqD;IACrD,+GAA+G;CAChH,CAAC;AAEF,MAAM,WAAW,GAAG,YAAY,CAAC;AAEjC,SAAgB,aAAa,CAAC,IAAY,EAAE,aAAwB;IAClE,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,MAAM,QAAQ,GAAG,aAAa;QAC5B,CAAC,CAAC,CAAC,GAAG,wBAAgB,EAAE,GAAG,aAAa,CAAC;QACzC,CAAC,CAAC,wBAAgB,CAAC;IAErB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QACtB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type BetterSqlite3 from 'better-sqlite3';
2
+ type Database = BetterSqlite3.Database;
3
+ export interface Migration {
4
+ version: number;
5
+ name: string;
6
+ up: (db: Database) => void;
7
+ }
8
+ export declare function ensureSchemaTable(db: Database): void;
9
+ export declare function getSchemaVersion(db: Database): number;
10
+ export declare function setSchemaVersion(db: Database, version: number, name?: string): void;
11
+ export declare function runMigrations(db: Database, migrations: Migration[]): void;
12
+ export {};
13
+ //# sourceMappingURL=schema-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-version.d.ts","sourceRoot":"","sources":["../../../scripts/lib/schema-version.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAC;AAChD,KAAK,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;AAEvC,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,IAAI,CAAC;CAC5B;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAQpD;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAKrD;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAKnF;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,CAYzE"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ensureSchemaTable = ensureSchemaTable;
4
+ exports.getSchemaVersion = getSchemaVersion;
5
+ exports.setSchemaVersion = setSchemaVersion;
6
+ exports.runMigrations = runMigrations;
7
+ function ensureSchemaTable(db) {
8
+ db.exec(`
9
+ CREATE TABLE IF NOT EXISTS schema_versions (
10
+ version INTEGER PRIMARY KEY,
11
+ name TEXT NOT NULL,
12
+ applied_at TEXT NOT NULL
13
+ )
14
+ `);
15
+ }
16
+ function getSchemaVersion(db) {
17
+ ensureSchemaTable(db);
18
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- better-sqlite3 .get() returns unknown
19
+ const row = db.prepare('SELECT MAX(version) as v FROM schema_versions').get();
20
+ return row?.v ?? 0;
21
+ }
22
+ function setSchemaVersion(db, version, name) {
23
+ ensureSchemaTable(db);
24
+ db.prepare('INSERT OR REPLACE INTO schema_versions (version, name, applied_at) VALUES (?, ?, ?)').run(version, name ?? `migration_${version}`, new Date().toISOString());
25
+ }
26
+ function runMigrations(db, migrations) {
27
+ ensureSchemaTable(db);
28
+ const current = getSchemaVersion(db);
29
+ const pending = migrations
30
+ .filter(m => m.version > current)
31
+ .sort((a, b) => a.version - b.version);
32
+ for (const migration of pending) {
33
+ migration.up(db);
34
+ setSchemaVersion(db, migration.version, migration.name);
35
+ }
36
+ }
37
+ //# sourceMappingURL=schema-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-version.js","sourceRoot":"","sources":["../../../scripts/lib/schema-version.ts"],"names":[],"mappings":";;AASA,8CAQC;AAED,4CAKC;AAED,4CAKC;AAED,sCAYC;AApCD,SAAgB,iBAAiB,CAAC,EAAY;IAC5C,EAAE,CAAC,IAAI,CAAC;;;;;;GAMP,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,gBAAgB,CAAC,EAAY;IAC3C,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACtB,gHAAgH;IAChH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC,GAAG,EAAsC,CAAC;IAClH,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAED,SAAgB,gBAAgB,CAAC,EAAY,EAAE,OAAe,EAAE,IAAa;IAC3E,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACtB,EAAE,CAAC,OAAO,CACR,qFAAqF,CACtF,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,aAAa,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,SAAgB,aAAa,CAAC,EAAY,EAAE,UAAuB;IACjE,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACtB,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAErC,MAAM,OAAO,GAAG,UAAU;SACvB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC;SAChC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IAEzC,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;QAChC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACjB,gBAAgB,CAAC,EAAE,EAAE,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface SimilarResult {
2
+ slug: string;
3
+ path: string;
4
+ title: string;
5
+ description: string;
6
+ score: number;
7
+ }
8
+ export declare function findSimilar(dbPath: string, text: string, options?: {
9
+ maxResults?: number;
10
+ threshold?: number;
11
+ }): SimilarResult[];
12
+ //# sourceMappingURL=similarity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"similarity.d.ts","sourceRoot":"","sources":["../../../scripts/lib/similarity.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAUD,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD,aAAa,EAAE,CAqCjB"}
@@ -0,0 +1,64 @@
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
+ exports.findSimilar = findSimilar;
7
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const db_helpers_js_1 = require("./db-helpers.js");
10
+ const constants_js_1 = require("./constants.js");
11
+ // Import shared utilities from CJS common module
12
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- dynamic CJS require, typed by mindlore-common.d.cts
13
+ const { extractKeywords, sanitizeKeyword } = require((0, constants_js_1.resolveHookCommon)(__dirname));
14
+ function findSimilar(dbPath, text, options) {
15
+ const maxResults = options?.maxResults ?? 3;
16
+ const keywords = extractKeywords(text);
17
+ if (keywords.length === 0)
18
+ return [];
19
+ const sanitized = keywords.map(sanitizeKeyword).filter((s) => s !== null && s.length > 0);
20
+ if (sanitized.length === 0)
21
+ return [];
22
+ const ftsQuery = sanitized.join(' OR ');
23
+ let db = null;
24
+ try {
25
+ db = new better_sqlite3_1.default(dbPath, { readonly: true });
26
+ const rows = (0, db_helpers_js_1.dbAll)(db, `SELECT slug, path, title, description, rank
27
+ FROM mindlore_fts
28
+ WHERE mindlore_fts MATCH ?
29
+ ORDER BY rank
30
+ LIMIT ?`, ftsQuery, maxResults);
31
+ return rows.map(r => ({
32
+ slug: r.slug,
33
+ path: r.path,
34
+ title: r.title,
35
+ description: r.description,
36
+ score: Math.abs(r.rank),
37
+ }));
38
+ }
39
+ catch (_err) {
40
+ return [];
41
+ }
42
+ finally {
43
+ db?.close();
44
+ }
45
+ }
46
+ const isMain = typeof require !== 'undefined' && require.main === module;
47
+ if (isMain) {
48
+ const queryArg = process.argv[2];
49
+ const dbPathArg = process.argv[3] ?? path_1.default.join(process.env.MINDLORE_HOME ?? path_1.default.join(require('os').homedir(), '.mindlore'), 'mindlore.db');
50
+ if (!queryArg) {
51
+ console.error('Usage: node similarity.js "query text" [dbPath]');
52
+ process.exit(1);
53
+ }
54
+ const results = findSimilar(dbPathArg, queryArg);
55
+ if (results.length === 0) {
56
+ console.log('No similar documents found.');
57
+ }
58
+ else {
59
+ for (const r of results) {
60
+ console.log(`[${r.score.toFixed(2)}] ${r.slug} — ${r.description}`);
61
+ }
62
+ }
63
+ }
64
+ //# sourceMappingURL=similarity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"similarity.js","sourceRoot":"","sources":["../../../scripts/lib/similarity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type SynonymMap = Record<string, string[]>;
2
+ export declare function loadSynonyms(config: Record<string, unknown>): SynonymMap;
3
+ export declare function expandQuery(query: string, synonyms: SynonymMap): string[];
4
+ //# sourceMappingURL=synonym.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synonym.d.ts","sourceRoot":"","sources":["../../../scripts/lib/synonym.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AAElD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAMxE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,MAAM,EAAE,CA2BzE"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadSynonyms = loadSynonyms;
4
+ exports.expandQuery = expandQuery;
5
+ function loadSynonyms(config) {
6
+ if (!config || typeof config.synonyms !== 'object' || config.synonyms === null) {
7
+ return {};
8
+ }
9
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- runtime-validated object shape
10
+ return config.synonyms;
11
+ }
12
+ function expandQuery(query, synonyms) {
13
+ const terms = query.trim().split(/\s+/).filter(Boolean);
14
+ if (terms.length === 0)
15
+ return [];
16
+ const expanded = [];
17
+ const seen = new Set();
18
+ for (const term of terms) {
19
+ const lower = term.toLowerCase();
20
+ if (!seen.has(lower)) {
21
+ seen.add(lower);
22
+ expanded.push(term);
23
+ }
24
+ const syns = synonyms[lower];
25
+ if (syns) {
26
+ for (const syn of syns) {
27
+ const synLower = syn.toLowerCase();
28
+ if (!seen.has(synLower)) {
29
+ seen.add(synLower);
30
+ expanded.push(syn);
31
+ }
32
+ }
33
+ }
34
+ }
35
+ return expanded;
36
+ }
37
+ //# sourceMappingURL=synonym.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synonym.js","sourceRoot":"","sources":["../../../scripts/lib/synonym.ts"],"names":[],"mappings":";;AAEA,oCAMC;AAED,kCA2BC;AAnCD,SAAgB,YAAY,CAAC,MAA+B;IAC1D,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC/E,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,yGAAyG;IACzG,OAAO,MAAM,CAAC,QAAsB,CAAC;AACvC,CAAC;AAED,SAAgB,WAAW,CAAC,KAAa,EAAE,QAAoB;IAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAChB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;gBACnC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACxB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBACnB,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -3,7 +3,8 @@
3
3
  * mindlore-fts5-index — Full re-index of .mindlore/ into FTS5 database.
4
4
  *
5
5
  * Scans all .md files, computes SHA256 content-hash, skips unchanged files.
6
- * Usage: node dist/scripts/mindlore-fts5-index.js [path-to-mindlore-dir]
6
+ * v0.5.0: --embed flag generates vector embeddings into documents_vec table.
7
+ * Usage: node dist/scripts/mindlore-fts5-index.js [path-to-mindlore-dir] [--embed]
7
8
  */
8
9
  export {};
9
10
  //# sourceMappingURL=mindlore-fts5-index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mindlore-fts5-index.d.ts","sourceRoot":"","sources":["../../scripts/mindlore-fts5-index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
1
+ {"version":3,"file":"mindlore-fts5-index.d.ts","sourceRoot":"","sources":["../../scripts/mindlore-fts5-index.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG"}