mindlore 0.7.0 → 0.7.2
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 +30 -3
- package/dist/scripts/bundle-hooks.d.ts +2 -0
- package/dist/scripts/bundle-hooks.d.ts.map +1 -0
- package/dist/scripts/bundle-hooks.js +70 -0
- package/dist/scripts/bundle-hooks.js.map +1 -0
- package/dist/scripts/init.js +0 -3
- package/dist/scripts/init.js.map +1 -1
- package/dist/scripts/lib/all-migrations.d.ts.map +1 -1
- package/dist/scripts/lib/all-migrations.js +3 -0
- package/dist/scripts/lib/all-migrations.js.map +1 -1
- package/dist/scripts/lib/constants.d.ts +7 -2
- package/dist/scripts/lib/constants.d.ts.map +1 -1
- package/dist/scripts/lib/constants.js +17 -22
- package/dist/scripts/lib/constants.js.map +1 -1
- package/dist/scripts/lib/mcp-tools.d.ts.map +1 -1
- package/dist/scripts/lib/mcp-tools.js +63 -78
- package/dist/scripts/lib/mcp-tools.js.map +1 -1
- package/dist/scripts/lib/migrations-v072.d.ts +3 -0
- package/dist/scripts/lib/migrations-v072.d.ts.map +1 -0
- package/dist/scripts/lib/migrations-v072.js +25 -0
- package/dist/scripts/lib/migrations-v072.js.map +1 -0
- package/dist/scripts/lib/relation-helpers.d.ts +15 -0
- package/dist/scripts/lib/relation-helpers.d.ts.map +1 -0
- package/dist/scripts/lib/relation-helpers.js +30 -0
- package/dist/scripts/lib/relation-helpers.js.map +1 -0
- package/dist/scripts/lib/tool-adapters/get-adapter.d.ts +21 -0
- package/dist/scripts/lib/tool-adapters/get-adapter.d.ts.map +1 -0
- package/dist/scripts/lib/tool-adapters/get-adapter.js +51 -0
- package/dist/scripts/lib/tool-adapters/get-adapter.js.map +1 -0
- package/dist/scripts/lib/tool-adapters/relate-adapter.d.ts +34 -0
- package/dist/scripts/lib/tool-adapters/relate-adapter.d.ts.map +1 -0
- package/dist/scripts/lib/tool-adapters/relate-adapter.js +43 -0
- package/dist/scripts/lib/tool-adapters/relate-adapter.js.map +1 -0
- package/dist/scripts/lib/tool-adapters/search-adapter.d.ts +5 -0
- package/dist/scripts/lib/tool-adapters/search-adapter.d.ts.map +1 -1
- package/dist/scripts/lib/tool-adapters/search-adapter.js +37 -0
- package/dist/scripts/lib/tool-adapters/search-adapter.js.map +1 -1
- package/dist/scripts/mcp-server.js +1 -1
- package/dist/scripts/mcp-server.js.map +1 -1
- package/dist/tests/dont-repeat-dedup.test.d.ts +2 -0
- package/dist/tests/dont-repeat-dedup.test.d.ts.map +1 -0
- package/dist/tests/dont-repeat-dedup.test.js +93 -0
- package/dist/tests/dont-repeat-dedup.test.js.map +1 -0
- package/dist/tests/e2e-kg-pipeline.test.d.ts +2 -0
- package/dist/tests/e2e-kg-pipeline.test.d.ts.map +1 -0
- package/dist/tests/e2e-kg-pipeline.test.js +59 -0
- package/dist/tests/e2e-kg-pipeline.test.js.map +1 -0
- package/dist/tests/helpers/db.d.ts.map +1 -1
- package/dist/tests/helpers/db.js +2 -1
- package/dist/tests/helpers/db.js.map +1 -1
- package/dist/tests/hook-smoke.test.js +1 -1
- package/dist/tests/hook-smoke.test.js.map +1 -1
- package/dist/tests/mcp-get-tool.test.d.ts +2 -0
- package/dist/tests/mcp-get-tool.test.d.ts.map +1 -0
- package/dist/tests/mcp-get-tool.test.js +93 -0
- package/dist/tests/mcp-get-tool.test.js.map +1 -0
- package/dist/tests/mcp-relate-tool.test.d.ts +2 -0
- package/dist/tests/mcp-relate-tool.test.d.ts.map +1 -0
- package/dist/tests/mcp-relate-tool.test.js +85 -0
- package/dist/tests/mcp-relate-tool.test.js.map +1 -0
- package/dist/tests/mcp-server.test.js +3 -1
- package/dist/tests/mcp-server.test.js.map +1 -1
- package/dist/tests/mcp-tools.test.js +20 -0
- package/dist/tests/mcp-tools.test.js.map +1 -1
- package/dist/tests/memory-relate.test.d.ts +2 -0
- package/dist/tests/memory-relate.test.d.ts.map +1 -0
- package/dist/tests/memory-relate.test.js +70 -0
- package/dist/tests/memory-relate.test.js.map +1 -0
- package/dist/tests/migrations-v063.test.js +1 -1
- package/dist/tests/migrations-v072.test.d.ts +2 -0
- package/dist/tests/migrations-v072.test.d.ts.map +1 -0
- package/dist/tests/migrations-v072.test.js +74 -0
- package/dist/tests/migrations-v072.test.js.map +1 -0
- package/dist/tests/plugin-cache-regression.test.d.ts +2 -0
- package/dist/tests/plugin-cache-regression.test.d.ts.map +1 -0
- package/dist/tests/plugin-cache-regression.test.js +19 -0
- package/dist/tests/plugin-cache-regression.test.js.map +1 -0
- package/dist/tests/search-hook.test.js +1 -1
- package/dist/tests/search-hook.test.js.map +1 -1
- package/hooks/cc-memory-bulk-sync.cjs +606 -0
- package/hooks/cc-session-sync.cjs +856 -0
- package/hooks/hooks.json +149 -0
- package/hooks/lib/mindlore-common.cjs +2 -2
- package/hooks/lib/secure-io.cjs +17 -0
- package/hooks/mindlore-cwd-changed.cjs +19 -34
- package/hooks/mindlore-decision-detector.cjs +40 -31
- package/hooks/mindlore-dont-repeat.cjs +75 -115
- package/hooks/mindlore-fts5-sync.cjs +15 -44
- package/hooks/mindlore-index.cjs +100 -101
- package/hooks/mindlore-model-router.cjs +20 -32
- package/hooks/mindlore-post-compact.cjs +26 -42
- package/hooks/mindlore-post-read.cjs +35 -60
- package/hooks/mindlore-pre-compact.cjs +55 -73
- package/hooks/mindlore-read-guard.cjs +28 -51
- package/hooks/mindlore-research-guard.cjs +63 -101
- package/hooks/mindlore-search.cjs +1156 -93
- package/hooks/mindlore-session-end.cjs +155 -276
- package/hooks/mindlore-session-focus.cjs +672 -110
- package/hooks/src/lib/constants.cjs +15 -0
- package/hooks/src/lib/mindlore-common.cjs +975 -0
- package/hooks/src/lib/mindlore-common.d.cts +72 -0
- package/hooks/src/lib/secure-io.cjs +17 -0
- package/hooks/src/lib/types.d.ts +58 -0
- package/hooks/src/mindlore-cwd-changed.cjs +57 -0
- package/hooks/src/mindlore-decision-detector.cjs +54 -0
- package/hooks/src/mindlore-dont-repeat.cjs +243 -0
- package/hooks/src/mindlore-fts5-sync.cjs +98 -0
- package/hooks/src/mindlore-index.cjs +230 -0
- package/hooks/src/mindlore-model-router.cjs +54 -0
- package/hooks/src/mindlore-post-compact.cjs +69 -0
- package/hooks/src/mindlore-post-read.cjs +106 -0
- package/hooks/src/mindlore-pre-compact.cjs +154 -0
- package/hooks/src/mindlore-read-guard.cjs +105 -0
- package/hooks/src/mindlore-research-guard.cjs +176 -0
- package/hooks/src/mindlore-search.cjs +200 -0
- package/hooks/src/mindlore-session-end.cjs +511 -0
- package/hooks/src/mindlore-session-focus.cjs +256 -0
- package/package.json +8 -3
- package/plugin.json +5 -4
- package/templates/config.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-tools.js","sourceRoot":"","sources":["../../../scripts/lib/mcp-tools.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"mcp-tools.js","sourceRoot":"","sources":["../../../scripts/lib/mcp-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations-v072.d.ts","sourceRoot":"","sources":["../../../scripts/lib/migrations-v072.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIrD,eAAO,MAAM,eAAe,EAAE,SAAS,EAoBtC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.V072_MIGRATIONS = void 0;
|
|
4
|
+
exports.V072_MIGRATIONS = [
|
|
5
|
+
{
|
|
6
|
+
version: 20,
|
|
7
|
+
name: 'create_mindlore_relations',
|
|
8
|
+
up: (db) => {
|
|
9
|
+
db.exec(`
|
|
10
|
+
CREATE TABLE IF NOT EXISTS mindlore_relations (
|
|
11
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
12
|
+
source_a TEXT NOT NULL,
|
|
13
|
+
source_b TEXT NOT NULL,
|
|
14
|
+
relation_type TEXT NOT NULL CHECK(relation_type IN ('cites', 'extends', 'contradicts', 'supersedes')),
|
|
15
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
|
|
16
|
+
UNIQUE(source_a, source_b, relation_type)
|
|
17
|
+
);
|
|
18
|
+
CREATE INDEX IF NOT EXISTS idx_relations_source_a ON mindlore_relations(source_a);
|
|
19
|
+
CREATE INDEX IF NOT EXISTS idx_relations_source_b ON mindlore_relations(source_b);
|
|
20
|
+
CREATE INDEX IF NOT EXISTS idx_relations_type ON mindlore_relations(relation_type);
|
|
21
|
+
`);
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
];
|
|
25
|
+
//# sourceMappingURL=migrations-v072.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations-v072.js","sourceRoot":"","sources":["../../../scripts/lib/migrations-v072.ts"],"names":[],"mappings":";;;AAIa,QAAA,eAAe,GAAgB;IAC1C;QACE,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,2BAA2B;QACjC,EAAE,EAAE,CAAC,EAAY,EAAE,EAAE;YACnB,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;OAYP,CAAC,CAAC;QACL,CAAC;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type BetterSqlite3 from 'better-sqlite3';
|
|
2
|
+
type Database = BetterSqlite3.Database;
|
|
3
|
+
export interface SourceRow {
|
|
4
|
+
path: string;
|
|
5
|
+
title: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function assertSlugExists(db: Database, slug: string): SourceRow;
|
|
8
|
+
export interface RelatedSource {
|
|
9
|
+
source: string;
|
|
10
|
+
relation_type: string;
|
|
11
|
+
direction: 'outgoing' | 'incoming';
|
|
12
|
+
}
|
|
13
|
+
export declare function getRelationsForSlug(db: Database, slug: string, limit?: number): RelatedSource[];
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=relation-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation-helpers.d.ts","sourceRoot":"","sources":["../../../scripts/lib/relation-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAC;AAChD,KAAK,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;AAKvC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAItE;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,UAAU,GAAG,UAAU,CAAC;CACpC;AAiBD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,SAAoB,GAAG,aAAa,EAAE,CAE1G"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.assertSlugExists = assertSlugExists;
|
|
4
|
+
exports.getRelationsForSlug = getRelationsForSlug;
|
|
5
|
+
const constants_js_1 = require("./constants.js");
|
|
6
|
+
const db_helpers_js_1 = require("./db-helpers.js");
|
|
7
|
+
function assertSlugExists(db, slug) {
|
|
8
|
+
const row = (0, db_helpers_js_1.dbGet)(db, 'SELECT path, title FROM mindlore_fts WHERE slug = ? LIMIT 1', slug);
|
|
9
|
+
if (!row)
|
|
10
|
+
throw new Error(`Source slug "${slug}" not found in knowledge base`);
|
|
11
|
+
return row;
|
|
12
|
+
}
|
|
13
|
+
const symmetricPlaceholders = Array.from(constants_js_1.SYMMETRIC_TYPES).map(() => '?').join(',');
|
|
14
|
+
const symmetricValues = [...constants_js_1.SYMMETRIC_TYPES];
|
|
15
|
+
const priorityCaseExpr = (0, constants_js_1.buildPriorityCase)();
|
|
16
|
+
const RELATIONS_SQL = `
|
|
17
|
+
SELECT * FROM (
|
|
18
|
+
SELECT source_b AS source, relation_type, 'outgoing' AS direction
|
|
19
|
+
FROM mindlore_relations WHERE source_a = ?
|
|
20
|
+
UNION ALL
|
|
21
|
+
SELECT source_a AS source, relation_type, 'incoming' AS direction
|
|
22
|
+
FROM mindlore_relations WHERE source_b = ? AND relation_type IN (${symmetricPlaceholders})
|
|
23
|
+
)
|
|
24
|
+
ORDER BY CASE relation_type ${priorityCaseExpr} END
|
|
25
|
+
LIMIT ?
|
|
26
|
+
`;
|
|
27
|
+
function getRelationsForSlug(db, slug, limit = constants_js_1.RELATED_OVERFETCH) {
|
|
28
|
+
return (0, db_helpers_js_1.dbAll)(db, RELATIONS_SQL, slug, slug, ...symmetricValues, limit);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=relation-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation-helpers.js","sourceRoot":"","sources":["../../../scripts/lib/relation-helpers.ts"],"names":[],"mappings":";;AAWA,4CAIC;AAuBD,kDAEC;AArCD,iDAAuF;AACvF,mDAA+C;AAO/C,SAAgB,gBAAgB,CAAC,EAAY,EAAE,IAAY;IACzD,MAAM,GAAG,GAAG,IAAA,qBAAK,EAAY,EAAE,EAAE,6DAA6D,EAAE,IAAI,CAAC,CAAC;IACtG,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,+BAA+B,CAAC,CAAC;IAC/E,OAAO,GAAG,CAAC;AACb,CAAC;AAQD,MAAM,qBAAqB,GAAG,KAAK,CAAC,IAAI,CAAC,8BAAe,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnF,MAAM,eAAe,GAAG,CAAC,GAAG,8BAAe,CAAC,CAAC;AAC7C,MAAM,gBAAgB,GAAG,IAAA,gCAAiB,GAAE,CAAC;AAC7C,MAAM,aAAa,GAAG;;;;;;uEAMiD,qBAAqB;;gCAE5D,gBAAgB;;CAE/C,CAAC;AAEF,SAAgB,mBAAmB,CAAC,EAAY,EAAE,IAAY,EAAE,KAAK,GAAG,gCAAiB;IACvF,OAAO,IAAA,qBAAK,EAAgB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,eAAe,EAAE,KAAK,CAAC,CAAC;AACxF,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { McpContext } from '../mcp-tools.js';
|
|
2
|
+
import { type RelatedSource } from '../relation-helpers.js';
|
|
3
|
+
export interface GetInput {
|
|
4
|
+
source: string;
|
|
5
|
+
section?: string;
|
|
6
|
+
include_relations?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface GetOutput {
|
|
9
|
+
title: string;
|
|
10
|
+
slug: string;
|
|
11
|
+
content: string;
|
|
12
|
+
section?: string;
|
|
13
|
+
available_sections?: string[];
|
|
14
|
+
relations?: RelatedSource[];
|
|
15
|
+
metadata: {
|
|
16
|
+
path: string;
|
|
17
|
+
size: number;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export declare function handleGet(ctx: McpContext, input: GetInput): GetOutput;
|
|
21
|
+
//# sourceMappingURL=get-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-adapter.d.ts","sourceRoot":"","sources":["../../../../scripts/lib/tool-adapters/get-adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIlD,OAAO,EAAyC,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEnG,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC;IAC5B,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,GAAG,SAAS,CAwCrE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
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.handleGet = handleGet;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const chunker_js_1 = require("../chunker.js");
|
|
9
|
+
const slugify_js_1 = require("../slugify.js");
|
|
10
|
+
const constants_js_1 = require("../constants.js");
|
|
11
|
+
const relation_helpers_js_1 = require("../relation-helpers.js");
|
|
12
|
+
function handleGet(ctx, input) {
|
|
13
|
+
const { path: sourcePath, title } = (0, relation_helpers_js_1.assertSlugExists)(ctx.db, input.source);
|
|
14
|
+
let raw;
|
|
15
|
+
try {
|
|
16
|
+
raw = fs_1.default.readFileSync(sourcePath, 'utf8').replace(/\r\n/g, '\n');
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
throw new Error(`Source file not found on disk: ${sourcePath}`);
|
|
20
|
+
}
|
|
21
|
+
const size = Buffer.byteLength(raw, 'utf8');
|
|
22
|
+
const result = {
|
|
23
|
+
title,
|
|
24
|
+
slug: input.source,
|
|
25
|
+
content: raw,
|
|
26
|
+
metadata: { path: sourcePath, size },
|
|
27
|
+
};
|
|
28
|
+
if (input.section) {
|
|
29
|
+
const chunks = (0, chunker_js_1.chunkMarkdown)(raw);
|
|
30
|
+
const targetSlug = (0, slugify_js_1.slugify)(input.section);
|
|
31
|
+
const match = chunks.find(c => c.heading && (0, slugify_js_1.slugify)(c.heading) === targetSlug);
|
|
32
|
+
if (match) {
|
|
33
|
+
result.content = match.content;
|
|
34
|
+
result.section = match.heading.replace(/^#+\s*/, '');
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
result.content = '';
|
|
38
|
+
const sections = chunks.filter(c => c.heading).map(c => c.heading.replace(/^#+\s*/, ''));
|
|
39
|
+
if (sections.length > 0)
|
|
40
|
+
result.available_sections = sections;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const includeRelations = input.include_relations !== false;
|
|
44
|
+
if (includeRelations) {
|
|
45
|
+
const related = (0, relation_helpers_js_1.getRelationsForSlug)(ctx.db, input.source, constants_js_1.MAX_RELATED_SOURCES);
|
|
46
|
+
if (related.length > 0)
|
|
47
|
+
result.relations = related;
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=get-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-adapter.js","sourceRoot":"","sources":["../../../../scripts/lib/tool-adapters/get-adapter.ts"],"names":[],"mappings":";;;;;AAuBA,8BAwCC;AA/DD,4CAAoB;AAEpB,8CAA8C;AAC9C,8CAAwC;AACxC,kDAAsD;AACtD,gEAAmG;AAkBnG,SAAgB,SAAS,CAAC,GAAe,EAAE,KAAe;IACxD,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,IAAA,sCAAgB,EAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAE3E,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAE5C,MAAM,MAAM,GAAc;QACxB,KAAK;QACL,IAAI,EAAE,KAAK,CAAC,MAAM;QAClB,OAAO,EAAE,GAAG;QACZ,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;KACrC,CAAC;IAEF,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,IAAA,0BAAa,EAAC,GAAG,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,IAAA,oBAAO,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,IAAA,oBAAO,EAAC,CAAC,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC,CAAC;QAE/E,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YAC/B,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1F,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,CAAC,kBAAkB,GAAG,QAAQ,CAAC;QAChE,CAAC;IACH,CAAC;IAED,MAAM,gBAAgB,GAAG,KAAK,CAAC,iBAAiB,KAAK,KAAK,CAAC;IAC3D,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,IAAA,yCAAmB,EAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,kCAAmB,CAAC,CAAC;QAC/E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC;IACrD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { McpContext } from '../mcp-tools.js';
|
|
2
|
+
import { type RelationType } from '../constants.js';
|
|
3
|
+
export interface RelateInput {
|
|
4
|
+
action: 'add' | 'remove' | 'list';
|
|
5
|
+
source_a?: string;
|
|
6
|
+
source_b?: string;
|
|
7
|
+
relation_type?: RelationType;
|
|
8
|
+
source?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface AddResult {
|
|
11
|
+
created: boolean;
|
|
12
|
+
existing: boolean;
|
|
13
|
+
relation: {
|
|
14
|
+
source_a: string;
|
|
15
|
+
source_b: string;
|
|
16
|
+
relation_type: string;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export interface RemoveResult {
|
|
20
|
+
removed: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface ListResult {
|
|
23
|
+
relations: Array<{
|
|
24
|
+
id: number;
|
|
25
|
+
source_a: string;
|
|
26
|
+
source_b: string;
|
|
27
|
+
relation_type: string;
|
|
28
|
+
created_at: string;
|
|
29
|
+
}>;
|
|
30
|
+
total: number;
|
|
31
|
+
}
|
|
32
|
+
export type RelateResult = AddResult | RemoveResult | ListResult;
|
|
33
|
+
export declare function handleRelate(ctx: McpContext, input: RelateInput): RelateResult;
|
|
34
|
+
//# sourceMappingURL=relate-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relate-adapter.d.ts","sourceRoot":"","sources":["../../../../scripts/lib/tool-adapters/relate-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIpE,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IAAG,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE;AAC3I,MAAM,WAAW,YAAY;IAAG,OAAO,EAAE,OAAO,CAAA;CAAE;AAClD,MAAM,WAAW,UAAU;IAAG,SAAS,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAC9J,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,CAAC;AAQjE,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,GAAG,YAAY,CAyC9E"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleRelate = handleRelate;
|
|
4
|
+
const constants_js_1 = require("../constants.js");
|
|
5
|
+
const db_helpers_js_1 = require("../db-helpers.js");
|
|
6
|
+
const relation_helpers_js_1 = require("../relation-helpers.js");
|
|
7
|
+
function validateRelationType(type) {
|
|
8
|
+
if (!constants_js_1.RELATION_TYPES.includes(type)) {
|
|
9
|
+
throw new Error(`Invalid relation_type "${type}". Valid: ${constants_js_1.RELATION_TYPES.join(', ')}`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function handleRelate(ctx, input) {
|
|
13
|
+
if (input.action === 'add') {
|
|
14
|
+
if (!input.source_a || !input.source_b || !input.relation_type) {
|
|
15
|
+
throw new Error('add requires source_a, source_b, and relation_type');
|
|
16
|
+
}
|
|
17
|
+
validateRelationType(input.relation_type);
|
|
18
|
+
(0, relation_helpers_js_1.assertSlugExists)(ctx.db, input.source_a);
|
|
19
|
+
(0, relation_helpers_js_1.assertSlugExists)(ctx.db, input.source_b);
|
|
20
|
+
const result = ctx.db.prepare('INSERT OR IGNORE INTO mindlore_relations (source_a, source_b, relation_type) VALUES (?, ?, ?)').run(input.source_a, input.source_b, input.relation_type);
|
|
21
|
+
return {
|
|
22
|
+
created: result.changes > 0,
|
|
23
|
+
existing: result.changes === 0,
|
|
24
|
+
relation: { source_a: input.source_a, source_b: input.source_b, relation_type: input.relation_type },
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if (input.action === 'remove') {
|
|
28
|
+
if (!input.source_a || !input.source_b || !input.relation_type) {
|
|
29
|
+
throw new Error('remove requires source_a, source_b, and relation_type');
|
|
30
|
+
}
|
|
31
|
+
validateRelationType(input.relation_type);
|
|
32
|
+
const result = ctx.db.prepare('DELETE FROM mindlore_relations WHERE source_a = ? AND source_b = ? AND relation_type = ?').run(input.source_a, input.source_b, input.relation_type);
|
|
33
|
+
return { removed: result.changes > 0 };
|
|
34
|
+
}
|
|
35
|
+
// list — both outgoing (source_a) and incoming (source_b) edges
|
|
36
|
+
const query = input.source
|
|
37
|
+
? 'SELECT id, source_a, source_b, relation_type, created_at FROM mindlore_relations WHERE source_a = ? OR source_b = ? ORDER BY created_at DESC LIMIT 100'
|
|
38
|
+
: 'SELECT id, source_a, source_b, relation_type, created_at FROM mindlore_relations ORDER BY created_at DESC LIMIT 100';
|
|
39
|
+
const params = input.source ? [input.source, input.source] : [];
|
|
40
|
+
const rows = (0, db_helpers_js_1.dbAll)(ctx.db, query, ...params);
|
|
41
|
+
return { relations: rows, total: rows.length };
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=relate-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relate-adapter.js","sourceRoot":"","sources":["../../../../scripts/lib/tool-adapters/relate-adapter.ts"],"names":[],"mappings":";;AAwBA,oCAyCC;AAhED,kDAAoE;AACpE,oDAAyC;AACzC,gEAA0D;AAe1D,SAAS,oBAAoB,CAAC,IAAY;IACxC,IAAI,CAAE,6BAAoC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,aAAa,6BAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC;AAED,SAAgB,YAAY,CAAC,GAAe,EAAE,KAAkB;IAC9D,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QACD,oBAAoB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC1C,IAAA,sCAAgB,EAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAA,sCAAgB,EAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,OAAO,CAC3B,+FAA+F,CAChG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;QAE3D,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO,GAAG,CAAC;YAC3B,QAAQ,EAAE,MAAM,CAAC,OAAO,KAAK,CAAC;YAC9B,QAAQ,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE;SACrG,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QACD,oBAAoB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,OAAO,CAC3B,0FAA0F,CAC3F,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;QAE3D,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;IACzC,CAAC;IAED,gEAAgE;IAChE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM;QACxB,CAAC,CAAC,wJAAwJ;QAC1J,CAAC,CAAC,qHAAqH,CAAC;IAE1H,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,MAAM,IAAI,GAAG,IAAA,qBAAK,EAAgG,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC;IAE5I,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AACjD,CAAC"}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import type { McpContext } from '../mcp-tools.js';
|
|
2
|
+
import { type RelatedSource as BaseRelatedSource } from '../relation-helpers.js';
|
|
2
3
|
interface SearchInput {
|
|
3
4
|
query: string;
|
|
4
5
|
limit?: number;
|
|
5
6
|
scope?: string;
|
|
6
7
|
contentType?: string;
|
|
7
8
|
}
|
|
9
|
+
interface RelatedSource extends BaseRelatedSource {
|
|
10
|
+
via: string;
|
|
11
|
+
}
|
|
8
12
|
interface SearchOutput {
|
|
9
13
|
results: Array<{
|
|
10
14
|
title: string;
|
|
@@ -16,6 +20,7 @@ interface SearchOutput {
|
|
|
16
20
|
}>;
|
|
17
21
|
total: number;
|
|
18
22
|
truncated: boolean;
|
|
23
|
+
related: RelatedSource[];
|
|
19
24
|
}
|
|
20
25
|
export declare function handleSearch(ctx: McpContext, input: SearchInput): SearchOutput;
|
|
21
26
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-adapter.d.ts","sourceRoot":"","sources":["../../../../scripts/lib/tool-adapters/search-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"search-adapter.d.ts","sourceRoot":"","sources":["../../../../scripts/lib/tool-adapters/search-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAuB,KAAK,aAAa,IAAI,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEtG,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,aAAc,SAAQ,iBAAiB;IAC/C,GAAG,EAAE,MAAM,CAAC;CACb;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAiCD,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,GAAG,YAAY,CAoC9E"}
|
|
@@ -3,9 +3,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.handleSearch = handleSearch;
|
|
4
4
|
const search_engine_js_1 = require("../search-engine.js");
|
|
5
5
|
const smart_snippet_js_1 = require("../smart-snippet.js");
|
|
6
|
+
const constants_js_1 = require("../constants.js");
|
|
7
|
+
const relation_helpers_js_1 = require("../relation-helpers.js");
|
|
6
8
|
const MAX_LIMIT = 20;
|
|
7
9
|
const DEFAULT_LIMIT = 5;
|
|
8
10
|
const MAX_SNIPPET_LEN = 500;
|
|
11
|
+
function getRelatedForSlugs(ctx, slugs, excludeSlugs) {
|
|
12
|
+
if (slugs.length === 0)
|
|
13
|
+
return [];
|
|
14
|
+
const all = [];
|
|
15
|
+
for (const slug of slugs) {
|
|
16
|
+
const rows = (0, relation_helpers_js_1.getRelationsForSlug)(ctx.db, slug);
|
|
17
|
+
for (const row of rows) {
|
|
18
|
+
if (!excludeSlugs.has(row.source)) {
|
|
19
|
+
all.push({ ...row, via: slug });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const seen = new Set();
|
|
24
|
+
const deduped = [];
|
|
25
|
+
for (const item of all) {
|
|
26
|
+
const key = `${item.source}:${item.relation_type}`;
|
|
27
|
+
if (!seen.has(key)) {
|
|
28
|
+
seen.add(key);
|
|
29
|
+
deduped.push(item);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return deduped.slice(0, constants_js_1.MAX_RELATED_SOURCES);
|
|
33
|
+
}
|
|
9
34
|
function handleSearch(ctx, input) {
|
|
10
35
|
const limit = Math.min(input.limit ?? DEFAULT_LIMIT, MAX_LIMIT);
|
|
11
36
|
const results = (0, search_engine_js_1.search)(ctx.db, input.query, { maxResults: limit });
|
|
@@ -23,10 +48,22 @@ function handleSearch(ctx, input) {
|
|
|
23
48
|
path: r.path,
|
|
24
49
|
};
|
|
25
50
|
});
|
|
51
|
+
const slugList = mapped.map(r => r.slug);
|
|
52
|
+
const resultSlugs = new Set(slugList);
|
|
53
|
+
let related = [];
|
|
54
|
+
try {
|
|
55
|
+
related = getRelatedForSlugs(ctx, slugList, resultSlugs);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
const msg = err instanceof Error ? err.message : '';
|
|
59
|
+
if (!msg.includes('no such table'))
|
|
60
|
+
throw err;
|
|
61
|
+
}
|
|
26
62
|
return {
|
|
27
63
|
results: mapped,
|
|
28
64
|
total: mapped.length,
|
|
29
65
|
truncated: results.length >= limit,
|
|
66
|
+
related,
|
|
30
67
|
};
|
|
31
68
|
}
|
|
32
69
|
//# sourceMappingURL=search-adapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-adapter.js","sourceRoot":"","sources":["../../../../scripts/lib/tool-adapters/search-adapter.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"search-adapter.js","sourceRoot":"","sources":["../../../../scripts/lib/tool-adapters/search-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@ const mcp_tools_js_1 = require("./lib/mcp-tools.js");
|
|
|
15
15
|
const err_msg_js_1 = require("./lib/err-msg.js");
|
|
16
16
|
const PACKAGE_VERSION = (() => {
|
|
17
17
|
try {
|
|
18
|
-
const pkg = JSON.parse(fs_1.default.readFileSync(path_1.default.join(__dirname, '..', '
|
|
18
|
+
const pkg = JSON.parse(fs_1.default.readFileSync(path_1.default.join(__dirname, '..', 'package.json'), 'utf8'));
|
|
19
19
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- package.json structure is known
|
|
20
20
|
return pkg.version ?? '0.0.0';
|
|
21
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../scripts/mcp-server.ts"],"names":[],"mappings":";;;;;;AAEA,oEAAoE;AACpE,wEAAiF;AACjF,oEAAsC;AACtC,4CAAoB;AACpB,gDAAwB;AACxB,6DAA6D;AAC7D,qDAAkE;AAClE,qDAAsD;AACtD,iDAA0C;AAE1C,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../scripts/mcp-server.ts"],"names":[],"mappings":";;;;;;AAEA,oEAAoE;AACpE,wEAAiF;AACjF,oEAAsC;AACtC,4CAAoB;AACpB,gDAAwB;AACxB,6DAA6D;AAC7D,qDAAkE;AAClE,qDAAsD;AACtD,iDAA0C;AAE1C,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5F,0GAA0G;QAC1G,OAAQ,GAA4B,CAAC,OAAO,IAAI,OAAO,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC,CAAC,EAAE,CAAC;AAEL,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,IAAA,sCAAmB,GAAE,CAAC;IAEtC,sCAAsC;IACtC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,YAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,oEAAoE;QACpE,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC;YAC3G,MAAM,GAAG,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACpC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,YAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,sBAAO,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,kBAAkB,kCAAmB,EAAE,CAAC,CAAC;IAEnD,oBAAoB;IACpB,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC;QAC3B,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,eAAe;KACzB,CAAC,CAAC;IAEH,IAAA,+BAAgB,EAAC,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAE1C,kBAAkB;IAClB,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,qCAAqC;IACrC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,oBAAoB;IACpB,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,IAAI,CAAC;YAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE/B,kDAAkD;IAClD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;QAC/B,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,aAAa,CAAC,SAAS,CAAC,CAAC;gBACzB,QAAQ,EAAE,CAAC;YACb,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,CAAC;QACT,SAAS,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,IAAA,mBAAM,EAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dont-repeat-dedup.test.d.ts","sourceRoot":"","sources":["../../tests/dont-repeat-dedup.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,93 @@
|
|
|
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 child_process_1 = require("child_process");
|
|
10
|
+
const HOOK_PATH = path_1.default.join(__dirname, '..', 'hooks', 'mindlore-dont-repeat.cjs');
|
|
11
|
+
function runHook(input, settingsContent) {
|
|
12
|
+
const realSettings = path_1.default.join(os_1.default.homedir(), '.claude', 'settings.json');
|
|
13
|
+
let backup = null;
|
|
14
|
+
const claudeDir = path_1.default.dirname(realSettings);
|
|
15
|
+
if (settingsContent !== undefined) {
|
|
16
|
+
if (!fs_1.default.existsSync(claudeDir)) {
|
|
17
|
+
fs_1.default.mkdirSync(claudeDir, { recursive: true });
|
|
18
|
+
}
|
|
19
|
+
if (fs_1.default.existsSync(realSettings)) {
|
|
20
|
+
backup = fs_1.default.readFileSync(realSettings, 'utf8');
|
|
21
|
+
}
|
|
22
|
+
fs_1.default.writeFileSync(realSettings, settingsContent, 'utf8');
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const result = (0, child_process_1.execFileSync)('node', [HOOK_PATH], {
|
|
26
|
+
input: JSON.stringify(input),
|
|
27
|
+
timeout: 5000,
|
|
28
|
+
encoding: 'utf8',
|
|
29
|
+
env: { ...process.env },
|
|
30
|
+
});
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
if (err !== null && err !== undefined && typeof err === 'object' && 'stdout' in err) {
|
|
35
|
+
const stdout = err.stdout;
|
|
36
|
+
return typeof stdout === 'string' ? stdout : '';
|
|
37
|
+
}
|
|
38
|
+
return '';
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
if (backup !== null) {
|
|
42
|
+
fs_1.default.writeFileSync(realSettings, backup, 'utf8');
|
|
43
|
+
}
|
|
44
|
+
else if (settingsContent !== undefined) {
|
|
45
|
+
try {
|
|
46
|
+
fs_1.default.unlinkSync(realSettings);
|
|
47
|
+
}
|
|
48
|
+
catch { /* noop */ }
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
describe('dont-repeat dedup with lessons-enforcement', () => {
|
|
53
|
+
const editInput = {
|
|
54
|
+
tool_name: 'Edit',
|
|
55
|
+
tool_input: {
|
|
56
|
+
file_path: '/tmp/test-file.ts',
|
|
57
|
+
new_string: 'appendFileSync is dangerous pattern that should trigger',
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
it('exits silently when lessons-enforcement hook is registered', () => {
|
|
61
|
+
const settings = JSON.stringify({
|
|
62
|
+
hooks: {
|
|
63
|
+
PreToolUse: [{
|
|
64
|
+
matcher: 'Write|Edit',
|
|
65
|
+
hooks: [{ command: 'node ~/.claude/hooks/lessons-enforcement.cjs' }],
|
|
66
|
+
}],
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
const output = runHook(editInput, settings);
|
|
70
|
+
expect(output).toBe('');
|
|
71
|
+
});
|
|
72
|
+
it('runs full scan when lessons-enforcement is NOT registered', () => {
|
|
73
|
+
const settings = JSON.stringify({
|
|
74
|
+
hooks: {
|
|
75
|
+
PreToolUse: [{
|
|
76
|
+
matcher: 'Bash',
|
|
77
|
+
hooks: [{ command: 'node some-other-hook.cjs' }],
|
|
78
|
+
}],
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
const output = runHook(editInput, settings);
|
|
82
|
+
// May or may not produce output depending on lessons content,
|
|
83
|
+
// but the hook should NOT exit early — it should process
|
|
84
|
+
// We verify it didn't crash (non-empty or empty is fine)
|
|
85
|
+
expect(typeof output).toBe('string');
|
|
86
|
+
});
|
|
87
|
+
it('runs full scan when settings.json has no hooks at all', () => {
|
|
88
|
+
const settings = JSON.stringify({});
|
|
89
|
+
const output = runHook(editInput, settings);
|
|
90
|
+
expect(typeof output).toBe('string');
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=dont-repeat-dedup.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dont-repeat-dedup.test.js","sourceRoot":"","sources":["../../tests/dont-repeat-dedup.test.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AACpB,iDAA6C;AAE7C,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC;AAElF,SAAS,OAAO,CAAC,KAAa,EAAE,eAAwB;IACtD,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IAEzE,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,MAAM,SAAS,GAAG,cAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7C,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,YAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,YAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,MAAM,GAAG,YAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC;QACD,YAAE,CAAC,aAAa,CAAC,YAAY,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,4BAAY,EAAC,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE;YAC/C,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;YAC5B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAC;YACpF,MAAM,MAAM,GAAI,GAA2B,CAAC,MAAM,CAAC;YACnD,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;YAAS,CAAC;QACT,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,YAAE,CAAC,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YACzC,IAAI,CAAC;gBAAC,YAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,4CAA4C,EAAE,GAAG,EAAE;IAC1D,MAAM,SAAS,GAAG;QAChB,SAAS,EAAE,MAAM;QACjB,UAAU,EAAE;YACV,SAAS,EAAE,mBAAmB;YAC9B,UAAU,EAAE,yDAAyD;SACtE;KACF,CAAC;IAEF,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;YAC9B,KAAK,EAAE;gBACL,UAAU,EAAE,CAAC;wBACX,OAAO,EAAE,YAAY;wBACrB,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,8CAA8C,EAAE,CAAC;qBACrE,CAAC;aACH;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;YAC9B,KAAK,EAAE;gBACL,UAAU,EAAE,CAAC;wBACX,OAAO,EAAE,MAAM;wBACf,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC;qBACjD,CAAC;aACH;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC5C,8DAA8D;QAC9D,yDAAyD;QACzD,yDAAyD;QACzD,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2e-kg-pipeline.test.d.ts","sourceRoot":"","sources":["../../tests/e2e-kg-pipeline.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,59 @@
|
|
|
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 path_1 = __importDefault(require("path"));
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const os_1 = __importDefault(require("os"));
|
|
9
|
+
const db_1 = require("./helpers/db");
|
|
10
|
+
const ingest_adapter_1 = require("../scripts/lib/tool-adapters/ingest-adapter");
|
|
11
|
+
const relate_adapter_1 = require("../scripts/lib/tool-adapters/relate-adapter");
|
|
12
|
+
const search_adapter_1 = require("../scripts/lib/tool-adapters/search-adapter");
|
|
13
|
+
const get_adapter_1 = require("../scripts/lib/tool-adapters/get-adapter");
|
|
14
|
+
describe('E2E: KG pipeline — ingest → relate → search → get', () => {
|
|
15
|
+
let testDir;
|
|
16
|
+
let ctx;
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
testDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-e2e-kg-'));
|
|
19
|
+
fs_1.default.mkdirSync(path_1.default.join(testDir, 'raw'), { recursive: true });
|
|
20
|
+
fs_1.default.mkdirSync(path_1.default.join(testDir, 'sources'), { recursive: true });
|
|
21
|
+
const dbPath = path_1.default.join(testDir, 'test.db');
|
|
22
|
+
const db = (0, db_1.createTestDbWithFullSchema)(dbPath);
|
|
23
|
+
ctx = { db, baseDir: testDir };
|
|
24
|
+
});
|
|
25
|
+
afterEach(() => {
|
|
26
|
+
ctx.db.close();
|
|
27
|
+
fs_1.default.rmSync(testDir, { recursive: true, force: true });
|
|
28
|
+
});
|
|
29
|
+
it('full pipeline: ingest two sources, relate, search finds related, get retrieves with relations', () => {
|
|
30
|
+
// 1. Ingest source A
|
|
31
|
+
const a = (0, ingest_adapter_1.handleIngest)(ctx, { type: 'text', content: 'React is a UI framework for web apps', title: 'React Guide' });
|
|
32
|
+
expect(a.slug).toBe('react-guide');
|
|
33
|
+
// Manually index into FTS5 (ingest writes to raw/, FTS5 sync is via hook)
|
|
34
|
+
(0, db_1.insertFts)(ctx.db, { path: a.path, slug: a.slug, title: 'React Guide', content: 'React is a UI framework for web apps', category: 'raw', type: 'raw' });
|
|
35
|
+
// 2. Ingest source B
|
|
36
|
+
const b = (0, ingest_adapter_1.handleIngest)(ctx, { type: 'text', content: 'Next.js builds on top of React for SSR', title: 'Next.js Guide' });
|
|
37
|
+
expect(b.slug).toBe('nextjs-guide');
|
|
38
|
+
(0, db_1.insertFts)(ctx.db, { path: b.path, slug: b.slug, title: 'Next.js Guide', content: 'Next.js builds on top of React for SSR', category: 'raw', type: 'raw' });
|
|
39
|
+
// 3. Relate: B extends A
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
41
|
+
const rel = (0, relate_adapter_1.handleRelate)(ctx, { action: 'add', source_a: 'nextjs-guide', source_b: 'react-guide', relation_type: 'extends' });
|
|
42
|
+
expect(rel.created).toBe(true);
|
|
43
|
+
// 4. Search for "Next.js" → related should include react-guide via KG
|
|
44
|
+
const search = (0, search_adapter_1.handleSearch)(ctx, { query: 'Next.js SSR' });
|
|
45
|
+
const nextResult = search.results.find(r => r.slug === 'nextjs-guide');
|
|
46
|
+
expect(nextResult).toBeDefined();
|
|
47
|
+
expect(search.related.some(r => r.source === 'react-guide' && r.relation_type === 'extends')).toBe(true);
|
|
48
|
+
// 5. Get source with relations
|
|
49
|
+
const got = (0, get_adapter_1.handleGet)(ctx, { source: 'nextjs-guide' });
|
|
50
|
+
expect(got.content).toContain('Next.js builds on top of React');
|
|
51
|
+
expect(got.relations).toBeDefined();
|
|
52
|
+
expect(got.relations.some(r => r.source === 'react-guide')).toBe(true);
|
|
53
|
+
// 6. Remove relation → search should have empty related for this pair
|
|
54
|
+
(0, relate_adapter_1.handleRelate)(ctx, { action: 'remove', source_a: 'nextjs-guide', source_b: 'react-guide', relation_type: 'extends' });
|
|
55
|
+
const got2 = (0, get_adapter_1.handleGet)(ctx, { source: 'nextjs-guide' });
|
|
56
|
+
expect(got2.relations ?? []).toHaveLength(0);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=e2e-kg-pipeline.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2e-kg-pipeline.test.js","sourceRoot":"","sources":["../../tests/e2e-kg-pipeline.test.ts"],"names":[],"mappings":"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"}
|