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.
- package/README.md +2 -1
- package/dist/scripts/init.js +45 -3
- package/dist/scripts/init.js.map +1 -1
- package/dist/scripts/lib/constants.d.ts +15 -0
- package/dist/scripts/lib/constants.d.ts.map +1 -1
- package/dist/scripts/lib/constants.js +16 -1
- package/dist/scripts/lib/constants.js.map +1 -1
- package/dist/scripts/lib/db-helpers.d.ts +15 -0
- package/dist/scripts/lib/db-helpers.d.ts.map +1 -1
- package/dist/scripts/lib/db-helpers.js +51 -0
- package/dist/scripts/lib/db-helpers.js.map +1 -1
- package/dist/scripts/lib/embedding.d.ts +5 -0
- package/dist/scripts/lib/embedding.d.ts.map +1 -0
- package/dist/scripts/lib/embedding.js +44 -0
- package/dist/scripts/lib/embedding.js.map +1 -0
- package/dist/scripts/lib/hybrid-search.d.ts +62 -0
- package/dist/scripts/lib/hybrid-search.d.ts.map +1 -0
- package/dist/scripts/lib/hybrid-search.js +150 -0
- package/dist/scripts/lib/hybrid-search.js.map +1 -0
- package/dist/scripts/lib/migrations-v051.d.ts +3 -0
- package/dist/scripts/lib/migrations-v051.d.ts.map +1 -0
- package/dist/scripts/lib/migrations-v051.js +24 -0
- package/dist/scripts/lib/migrations-v051.js.map +1 -0
- package/dist/scripts/lib/migrations.d.ts +4 -0
- package/dist/scripts/lib/migrations.d.ts.map +1 -0
- package/dist/scripts/lib/migrations.js +40 -0
- package/dist/scripts/lib/migrations.js.map +1 -0
- package/dist/scripts/lib/privacy-filter.d.ts +3 -0
- package/dist/scripts/lib/privacy-filter.d.ts.map +1 -0
- package/dist/scripts/lib/privacy-filter.js +28 -0
- package/dist/scripts/lib/privacy-filter.js.map +1 -0
- package/dist/scripts/lib/schema-version.d.ts +13 -0
- package/dist/scripts/lib/schema-version.d.ts.map +1 -0
- package/dist/scripts/lib/schema-version.js +37 -0
- package/dist/scripts/lib/schema-version.js.map +1 -0
- package/dist/scripts/lib/similarity.d.ts +12 -0
- package/dist/scripts/lib/similarity.d.ts.map +1 -0
- package/dist/scripts/lib/similarity.js +64 -0
- package/dist/scripts/lib/similarity.js.map +1 -0
- package/dist/scripts/lib/synonym.d.ts +4 -0
- package/dist/scripts/lib/synonym.d.ts.map +1 -0
- package/dist/scripts/lib/synonym.js +37 -0
- package/dist/scripts/lib/synonym.js.map +1 -0
- package/dist/scripts/mindlore-fts5-index.d.ts +2 -1
- package/dist/scripts/mindlore-fts5-index.d.ts.map +1 -1
- package/dist/scripts/mindlore-fts5-index.js +71 -5
- package/dist/scripts/mindlore-fts5-index.js.map +1 -1
- package/dist/scripts/mindlore-fts5-search.d.ts +3 -2
- package/dist/scripts/mindlore-fts5-search.d.ts.map +1 -1
- package/dist/scripts/mindlore-fts5-search.js +89 -35
- package/dist/scripts/mindlore-fts5-search.js.map +1 -1
- package/dist/scripts/mindlore-health-check.js +105 -0
- package/dist/scripts/mindlore-health-check.js.map +1 -1
- package/dist/scripts/quality-populate.js +8 -4
- package/dist/scripts/quality-populate.js.map +1 -1
- package/dist/tests/cc-memory-sync.test.d.ts +2 -0
- package/dist/tests/cc-memory-sync.test.d.ts.map +1 -0
- package/dist/tests/cc-memory-sync.test.js +121 -0
- package/dist/tests/cc-memory-sync.test.js.map +1 -0
- package/dist/tests/embedding.test.d.ts +6 -0
- package/dist/tests/embedding.test.d.ts.map +1 -0
- package/dist/tests/embedding.test.js +71 -0
- package/dist/tests/embedding.test.js.map +1 -0
- package/dist/tests/episode-file.test.d.ts +2 -0
- package/dist/tests/episode-file.test.d.ts.map +1 -0
- package/dist/tests/episode-file.test.js +79 -0
- package/dist/tests/episode-file.test.js.map +1 -0
- package/dist/tests/fts5.test.js +82 -0
- package/dist/tests/fts5.test.js.map +1 -1
- package/dist/tests/helpers/db.d.ts +6 -0
- package/dist/tests/helpers/db.d.ts.map +1 -1
- package/dist/tests/helpers/db.js +29 -0
- package/dist/tests/helpers/db.js.map +1 -1
- package/dist/tests/hook-logging.test.d.ts +2 -0
- package/dist/tests/hook-logging.test.d.ts.map +1 -0
- package/dist/tests/hook-logging.test.js +108 -0
- package/dist/tests/hook-logging.test.js.map +1 -0
- package/dist/tests/hybrid-search.test.d.ts +2 -0
- package/dist/tests/hybrid-search.test.d.ts.map +1 -0
- package/dist/tests/hybrid-search.test.js +114 -0
- package/dist/tests/hybrid-search.test.js.map +1 -0
- package/dist/tests/index-cli-embed.test.d.ts +7 -0
- package/dist/tests/index-cli-embed.test.d.ts.map +1 -0
- package/dist/tests/index-cli-embed.test.js +128 -0
- package/dist/tests/index-cli-embed.test.js.map +1 -0
- package/dist/tests/privacy-filter.test.d.ts +2 -0
- package/dist/tests/privacy-filter.test.d.ts.map +1 -0
- package/dist/tests/privacy-filter.test.js +56 -0
- package/dist/tests/privacy-filter.test.js.map +1 -0
- package/dist/tests/schema-version.test.d.ts +2 -0
- package/dist/tests/schema-version.test.d.ts.map +1 -0
- package/dist/tests/schema-version.test.js +127 -0
- package/dist/tests/schema-version.test.js.map +1 -0
- package/dist/tests/search-cli-hybrid.test.d.ts +6 -0
- package/dist/tests/search-cli-hybrid.test.d.ts.map +1 -0
- package/dist/tests/search-cli-hybrid.test.js +103 -0
- package/dist/tests/search-cli-hybrid.test.js.map +1 -0
- package/dist/tests/search-hook.test.js +44 -0
- package/dist/tests/search-hook.test.js.map +1 -1
- package/dist/tests/similarity.test.d.ts +2 -0
- package/dist/tests/similarity.test.d.ts.map +1 -0
- package/dist/tests/similarity.test.js +61 -0
- package/dist/tests/similarity.test.js.map +1 -0
- package/dist/tests/synonym.test.d.ts +2 -0
- package/dist/tests/synonym.test.d.ts.map +1 -0
- package/dist/tests/synonym.test.js +47 -0
- package/dist/tests/synonym.test.js.map +1 -0
- package/dist/tests/token-budget.test.d.ts +2 -0
- package/dist/tests/token-budget.test.d.ts.map +1 -0
- package/dist/tests/token-budget.test.js +32 -0
- package/dist/tests/token-budget.test.js.map +1 -0
- package/hooks/lib/mindlore-common.cjs +120 -0
- package/hooks/mindlore-index.cjs +82 -2
- package/hooks/mindlore-search.cjs +102 -35
- package/hooks/mindlore-session-end.cjs +129 -39
- package/hooks/mindlore-session-focus.cjs +24 -3
- package/package.json +6 -4
- package/plugin.json +1 -1
- package/skills/mindlore-ingest/SKILL.md +7 -1
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|
-
*
|
|
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
|
|
1
|
+
{"version":3,"file":"mindlore-fts5-index.d.ts","sourceRoot":"","sources":["../../scripts/mindlore-fts5-index.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG"}
|