@monoes/monograph 1.0.0
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/.monomind/data/ranked-context.json +5 -0
- package/.monomind/sessions/current.json +13 -0
- package/__tests__/export/formats.test.ts +82 -0
- package/__tests__/fixtures/sample.py +11 -0
- package/__tests__/fixtures/sample.ts +17 -0
- package/__tests__/integration/full-pipeline.test.ts +64 -0
- package/__tests__/parsers/loader.test.ts +14 -0
- package/__tests__/parsers/python.test.ts +32 -0
- package/__tests__/parsers/typescript.test.ts +45 -0
- package/__tests__/pipeline/analysis.test.ts +58 -0
- package/__tests__/pipeline/phases.test.ts +41 -0
- package/__tests__/pipeline/runner.test.ts +28 -0
- package/__tests__/setup.ts +1 -0
- package/__tests__/storage/db.test.ts +37 -0
- package/__tests__/storage/stores.test.ts +100 -0
- package/__tests__/types.test.ts +13 -0
- package/__tests__/watch/watcher.test.ts +31 -0
- package/dist/src/export/canvas.d.ts +3 -0
- package/dist/src/export/canvas.d.ts.map +1 -0
- package/dist/src/export/canvas.js +39 -0
- package/dist/src/export/canvas.js.map +1 -0
- package/dist/src/export/cypher.d.ts +3 -0
- package/dist/src/export/cypher.d.ts.map +1 -0
- package/dist/src/export/cypher.js +24 -0
- package/dist/src/export/cypher.js.map +1 -0
- package/dist/src/export/graphml.d.ts +3 -0
- package/dist/src/export/graphml.d.ts.map +1 -0
- package/dist/src/export/graphml.js +38 -0
- package/dist/src/export/graphml.js.map +1 -0
- package/dist/src/export/html.d.ts +3 -0
- package/dist/src/export/html.d.ts.map +1 -0
- package/dist/src/export/html.js +54 -0
- package/dist/src/export/html.js.map +1 -0
- package/dist/src/export/index.d.ts +8 -0
- package/dist/src/export/index.d.ts.map +1 -0
- package/dist/src/export/index.js +8 -0
- package/dist/src/export/index.js.map +1 -0
- package/dist/src/export/json.d.ts +3 -0
- package/dist/src/export/json.d.ts.map +1 -0
- package/dist/src/export/json.js +31 -0
- package/dist/src/export/json.js.map +1 -0
- package/dist/src/export/obsidian.d.ts +3 -0
- package/dist/src/export/obsidian.d.ts.map +1 -0
- package/dist/src/export/obsidian.js +38 -0
- package/dist/src/export/obsidian.js.map +1 -0
- package/dist/src/export/svg.d.ts +3 -0
- package/dist/src/export/svg.d.ts.map +1 -0
- package/dist/src/export/svg.js +46 -0
- package/dist/src/export/svg.js.map +1 -0
- package/dist/src/graph/analyzer.d.ts +8 -0
- package/dist/src/graph/analyzer.d.ts.map +1 -0
- package/dist/src/graph/analyzer.js +25 -0
- package/dist/src/graph/analyzer.js.map +1 -0
- package/dist/src/graph/diff.d.ts +19 -0
- package/dist/src/graph/diff.d.ts.map +1 -0
- package/dist/src/graph/diff.js +44 -0
- package/dist/src/graph/diff.js.map +1 -0
- package/dist/src/graph/loader.d.ts +5 -0
- package/dist/src/graph/loader.d.ts.map +1 -0
- package/dist/src/graph/loader.js +42 -0
- package/dist/src/graph/loader.js.map +1 -0
- package/dist/src/index.d.ts +18 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +18 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/mcp/resources.d.ts +11 -0
- package/dist/src/mcp/resources.d.ts.map +1 -0
- package/dist/src/mcp/resources.js +69 -0
- package/dist/src/mcp/resources.js.map +1 -0
- package/dist/src/parsers/extractor.d.ts +5 -0
- package/dist/src/parsers/extractor.d.ts.map +1 -0
- package/dist/src/parsers/extractor.js +142 -0
- package/dist/src/parsers/extractor.js.map +1 -0
- package/dist/src/parsers/go.d.ts +3 -0
- package/dist/src/parsers/go.d.ts.map +1 -0
- package/dist/src/parsers/go.js +25 -0
- package/dist/src/parsers/go.js.map +1 -0
- package/dist/src/parsers/java.d.ts +3 -0
- package/dist/src/parsers/java.d.ts.map +1 -0
- package/dist/src/parsers/java.js +25 -0
- package/dist/src/parsers/java.js.map +1 -0
- package/dist/src/parsers/language-config.d.ts +27 -0
- package/dist/src/parsers/language-config.d.ts.map +1 -0
- package/dist/src/parsers/language-config.js +2 -0
- package/dist/src/parsers/language-config.js.map +1 -0
- package/dist/src/parsers/loader.d.ts +15 -0
- package/dist/src/parsers/loader.d.ts.map +1 -0
- package/dist/src/parsers/loader.js +73 -0
- package/dist/src/parsers/loader.js.map +1 -0
- package/dist/src/parsers/python.d.ts +3 -0
- package/dist/src/parsers/python.d.ts.map +1 -0
- package/dist/src/parsers/python.js +24 -0
- package/dist/src/parsers/python.js.map +1 -0
- package/dist/src/parsers/rust.d.ts +3 -0
- package/dist/src/parsers/rust.d.ts.map +1 -0
- package/dist/src/parsers/rust.js +23 -0
- package/dist/src/parsers/rust.js.map +1 -0
- package/dist/src/parsers/typescript.d.ts +3 -0
- package/dist/src/parsers/typescript.d.ts.map +1 -0
- package/dist/src/parsers/typescript.js +39 -0
- package/dist/src/parsers/typescript.js.map +1 -0
- package/dist/src/pipeline/orchestrator.d.ts +8 -0
- package/dist/src/pipeline/orchestrator.d.ts.map +1 -0
- package/dist/src/pipeline/orchestrator.js +37 -0
- package/dist/src/pipeline/orchestrator.js.map +1 -0
- package/dist/src/pipeline/phases/communities.d.ts +7 -0
- package/dist/src/pipeline/phases/communities.d.ts.map +1 -0
- package/dist/src/pipeline/phases/communities.js +34 -0
- package/dist/src/pipeline/phases/communities.js.map +1 -0
- package/dist/src/pipeline/phases/cross-file.d.ts +7 -0
- package/dist/src/pipeline/phases/cross-file.d.ts.map +1 -0
- package/dist/src/pipeline/phases/cross-file.js +36 -0
- package/dist/src/pipeline/phases/cross-file.js.map +1 -0
- package/dist/src/pipeline/phases/god-nodes.d.ts +7 -0
- package/dist/src/pipeline/phases/god-nodes.d.ts.map +1 -0
- package/dist/src/pipeline/phases/god-nodes.js +28 -0
- package/dist/src/pipeline/phases/god-nodes.js.map +1 -0
- package/dist/src/pipeline/phases/mro.d.ts +7 -0
- package/dist/src/pipeline/phases/mro.d.ts.map +1 -0
- package/dist/src/pipeline/phases/mro.js +41 -0
- package/dist/src/pipeline/phases/mro.js.map +1 -0
- package/dist/src/pipeline/phases/parse.d.ts +9 -0
- package/dist/src/pipeline/phases/parse.d.ts.map +1 -0
- package/dist/src/pipeline/phases/parse.js +51 -0
- package/dist/src/pipeline/phases/parse.js.map +1 -0
- package/dist/src/pipeline/phases/scan.d.ts +7 -0
- package/dist/src/pipeline/phases/scan.d.ts.map +1 -0
- package/dist/src/pipeline/phases/scan.js +60 -0
- package/dist/src/pipeline/phases/scan.js.map +1 -0
- package/dist/src/pipeline/phases/structure.d.ts +9 -0
- package/dist/src/pipeline/phases/structure.d.ts.map +1 -0
- package/dist/src/pipeline/phases/structure.js +56 -0
- package/dist/src/pipeline/phases/structure.js.map +1 -0
- package/dist/src/pipeline/phases/suggest.d.ts +7 -0
- package/dist/src/pipeline/phases/suggest.d.ts.map +1 -0
- package/dist/src/pipeline/phases/suggest.js +59 -0
- package/dist/src/pipeline/phases/suggest.js.map +1 -0
- package/dist/src/pipeline/phases/surprises.d.ts +7 -0
- package/dist/src/pipeline/phases/surprises.d.ts.map +1 -0
- package/dist/src/pipeline/phases/surprises.js +54 -0
- package/dist/src/pipeline/phases/surprises.js.map +1 -0
- package/dist/src/pipeline/runner.d.ts +8 -0
- package/dist/src/pipeline/runner.d.ts.map +1 -0
- package/dist/src/pipeline/runner.js +53 -0
- package/dist/src/pipeline/runner.js.map +1 -0
- package/dist/src/pipeline/types.d.ts +24 -0
- package/dist/src/pipeline/types.d.ts.map +1 -0
- package/dist/src/pipeline/types.js +8 -0
- package/dist/src/pipeline/types.js.map +1 -0
- package/dist/src/storage/db.d.ts +7 -0
- package/dist/src/storage/db.d.ts.map +1 -0
- package/dist/src/storage/db.js +52 -0
- package/dist/src/storage/db.js.map +1 -0
- package/dist/src/storage/edge-store.d.ts +9 -0
- package/dist/src/storage/edge-store.d.ts.map +1 -0
- package/dist/src/storage/edge-store.js +46 -0
- package/dist/src/storage/edge-store.js.map +1 -0
- package/dist/src/storage/fts-store.d.ts +11 -0
- package/dist/src/storage/fts-store.d.ts.map +1 -0
- package/dist/src/storage/fts-store.js +32 -0
- package/dist/src/storage/fts-store.js.map +1 -0
- package/dist/src/storage/node-store.d.ts +9 -0
- package/dist/src/storage/node-store.d.ts.map +1 -0
- package/dist/src/storage/node-store.js +52 -0
- package/dist/src/storage/node-store.js.map +1 -0
- package/dist/src/storage/schema.d.ts +8 -0
- package/dist/src/storage/schema.d.ts.map +1 -0
- package/dist/src/storage/schema.js +72 -0
- package/dist/src/storage/schema.js.map +1 -0
- package/dist/src/types.d.ts +76 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +37 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/watch/watcher.d.ts +16 -0
- package/dist/src/watch/watcher.d.ts.map +1 -0
- package/dist/src/watch/watcher.js +59 -0
- package/dist/src/watch/watcher.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +44 -0
- package/src/export/canvas.ts +42 -0
- package/src/export/cypher.ts +33 -0
- package/src/export/graphml.ts +48 -0
- package/src/export/html.ts +61 -0
- package/src/export/index.ts +7 -0
- package/src/export/json.ts +36 -0
- package/src/export/obsidian.ts +44 -0
- package/src/export/svg.ts +55 -0
- package/src/graph/analyzer.ts +29 -0
- package/src/graph/diff.ts +65 -0
- package/src/graph/loader.ts +41 -0
- package/src/index.ts +17 -0
- package/src/mcp/resources.ts +69 -0
- package/src/parsers/extractor.ts +180 -0
- package/src/parsers/go.ts +27 -0
- package/src/parsers/java.ts +27 -0
- package/src/parsers/language-config.ts +28 -0
- package/src/parsers/loader.ts +85 -0
- package/src/parsers/python.ts +26 -0
- package/src/parsers/rust.ts +25 -0
- package/src/parsers/typescript.ts +41 -0
- package/src/pipeline/orchestrator.ts +46 -0
- package/src/pipeline/phases/communities.ts +45 -0
- package/src/pipeline/phases/cross-file.ts +48 -0
- package/src/pipeline/phases/god-nodes.ts +40 -0
- package/src/pipeline/phases/mro.ts +52 -0
- package/src/pipeline/phases/parse.ts +62 -0
- package/src/pipeline/phases/scan.ts +58 -0
- package/src/pipeline/phases/structure.ts +68 -0
- package/src/pipeline/phases/suggest.ts +71 -0
- package/src/pipeline/phases/surprises.ts +70 -0
- package/src/pipeline/runner.ts +61 -0
- package/src/pipeline/types.ts +33 -0
- package/src/storage/db.ts +54 -0
- package/src/storage/edge-store.ts +61 -0
- package/src/storage/fts-store.ts +52 -0
- package/src/storage/node-store.ts +72 -0
- package/src/storage/schema.ts +77 -0
- package/src/types.ts +131 -0
- package/src/watch/watcher.ts +66 -0
- package/tsconfig.json +10 -0
- package/vitest.config.ts +12 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
const WEIGHTS = {
|
|
2
|
+
confidence: 0.30,
|
|
3
|
+
crossType: 0.20,
|
|
4
|
+
crossRepo: 0.15,
|
|
5
|
+
crossCommunity: 0.25,
|
|
6
|
+
peripheral: 0.10,
|
|
7
|
+
};
|
|
8
|
+
export const surprisesPhase = {
|
|
9
|
+
name: 'surprises',
|
|
10
|
+
deps: ['cross-file', 'communities', 'parse'],
|
|
11
|
+
async execute(_ctx, deps) {
|
|
12
|
+
const { allEdges, symbolNodes } = deps.get('parse');
|
|
13
|
+
const { resolvedEdges } = deps.get('cross-file');
|
|
14
|
+
const { memberships } = deps.get('communities');
|
|
15
|
+
const edges = [...allEdges, ...resolvedEdges];
|
|
16
|
+
const labelIndex = new Map(symbolNodes.map(n => [n.id, n.label]));
|
|
17
|
+
const inDeg = new Map();
|
|
18
|
+
for (const e of edges)
|
|
19
|
+
inDeg.set(e.targetId, (inDeg.get(e.targetId) ?? 0) + 1);
|
|
20
|
+
const maxDeg = Math.max(...inDeg.values(), 1);
|
|
21
|
+
const peripheralThreshold = maxDeg * 0.1;
|
|
22
|
+
const surprises = edges
|
|
23
|
+
.filter(e => e.confidence !== 'EXTRACTED')
|
|
24
|
+
.map(e => {
|
|
25
|
+
const reasons = [];
|
|
26
|
+
let score = 0;
|
|
27
|
+
const conf = 1 - e.confidenceScore;
|
|
28
|
+
score += WEIGHTS.confidence * conf;
|
|
29
|
+
if (conf > 0)
|
|
30
|
+
reasons.push(`${e.confidence} confidence`);
|
|
31
|
+
const srcLabel = labelIndex.get(e.sourceId);
|
|
32
|
+
const tgtLabel = labelIndex.get(e.targetId);
|
|
33
|
+
if (srcLabel && tgtLabel && srcLabel !== tgtLabel) {
|
|
34
|
+
score += WEIGHTS.crossType;
|
|
35
|
+
reasons.push(`cross-type (${srcLabel}→${tgtLabel})`);
|
|
36
|
+
}
|
|
37
|
+
const srcComm = memberships.get(e.sourceId);
|
|
38
|
+
const tgtComm = memberships.get(e.targetId);
|
|
39
|
+
if (srcComm !== undefined && tgtComm !== undefined && srcComm !== tgtComm) {
|
|
40
|
+
score += WEIGHTS.crossCommunity;
|
|
41
|
+
reasons.push('cross-community');
|
|
42
|
+
}
|
|
43
|
+
if ((inDeg.get(e.targetId) ?? 0) < peripheralThreshold) {
|
|
44
|
+
score += WEIGHTS.peripheral;
|
|
45
|
+
reasons.push('peripheral target');
|
|
46
|
+
}
|
|
47
|
+
return { edge: e, score, reasons };
|
|
48
|
+
})
|
|
49
|
+
.sort((a, b) => b.score - a.score)
|
|
50
|
+
.slice(0, 50);
|
|
51
|
+
return { surprises };
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=surprises.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surprises.js","sourceRoot":"","sources":["../../../../src/pipeline/phases/surprises.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PipelinePhase, PipelineContext } from './types.js';
|
|
2
|
+
export declare class PipelineRunner {
|
|
3
|
+
private readonly phases;
|
|
4
|
+
private readonly order;
|
|
5
|
+
constructor(phases: PipelinePhase<unknown>[]);
|
|
6
|
+
run(ctx: PipelineContext): Promise<Map<string, unknown>>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/pipeline/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGjE,qBAAa,cAAc;IAGb,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;gBAEJ,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE;IAIvD,GAAG,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAa/D"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { MonographError } from '../types.js';
|
|
2
|
+
export class PipelineRunner {
|
|
3
|
+
phases;
|
|
4
|
+
order;
|
|
5
|
+
constructor(phases) {
|
|
6
|
+
this.phases = phases;
|
|
7
|
+
this.order = topoSort(phases);
|
|
8
|
+
}
|
|
9
|
+
async run(ctx) {
|
|
10
|
+
const outputs = new Map();
|
|
11
|
+
const phaseMap = new Map(this.phases.map(p => [p.name, p]));
|
|
12
|
+
for (const name of this.order) {
|
|
13
|
+
const phase = phaseMap.get(name);
|
|
14
|
+
ctx.onProgress?.({ phase: name });
|
|
15
|
+
const output = await phase.execute(ctx, outputs);
|
|
16
|
+
outputs.set(name, output);
|
|
17
|
+
}
|
|
18
|
+
return outputs;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function topoSort(phases) {
|
|
22
|
+
const names = new Set(phases.map(p => p.name));
|
|
23
|
+
const inDegree = new Map();
|
|
24
|
+
const adjList = new Map();
|
|
25
|
+
for (const p of phases) {
|
|
26
|
+
inDegree.set(p.name, p.deps.length);
|
|
27
|
+
for (const dep of p.deps) {
|
|
28
|
+
if (!names.has(dep)) {
|
|
29
|
+
throw new MonographError(`Phase '${p.name}' depends on unknown phase '${dep}'`);
|
|
30
|
+
}
|
|
31
|
+
const adj = adjList.get(dep) ?? [];
|
|
32
|
+
adj.push(p.name);
|
|
33
|
+
adjList.set(dep, adj);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const queue = phases.filter(p => (inDegree.get(p.name) ?? 0) === 0).map(p => p.name);
|
|
37
|
+
const result = [];
|
|
38
|
+
while (queue.length) {
|
|
39
|
+
const name = queue.shift();
|
|
40
|
+
result.push(name);
|
|
41
|
+
for (const next of (adjList.get(name) ?? [])) {
|
|
42
|
+
const deg = (inDegree.get(next) ?? 0) - 1;
|
|
43
|
+
inDegree.set(next, deg);
|
|
44
|
+
if (deg === 0)
|
|
45
|
+
queue.push(next);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (result.length !== phases.length) {
|
|
49
|
+
throw new MonographError('Cycle detected in pipeline phase graph');
|
|
50
|
+
}
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/pipeline/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { MonographDb } from '../storage/db.js';
|
|
2
|
+
import type { PipelineProgress } from '../types.js';
|
|
3
|
+
import type Graph from 'graphology';
|
|
4
|
+
export interface PipelineContext {
|
|
5
|
+
repoPath: string;
|
|
6
|
+
db: MonographDb;
|
|
7
|
+
graph: Graph;
|
|
8
|
+
onProgress: (p: PipelineProgress) => void;
|
|
9
|
+
options: PipelineOptions;
|
|
10
|
+
}
|
|
11
|
+
export interface PipelineOptions {
|
|
12
|
+
codeOnly: boolean;
|
|
13
|
+
maxFileSizeBytes: number;
|
|
14
|
+
workerPoolThreshold: number;
|
|
15
|
+
workerChunkBudgetBytes: number;
|
|
16
|
+
ignore: string[];
|
|
17
|
+
}
|
|
18
|
+
export declare const DEFAULT_OPTIONS: PipelineOptions;
|
|
19
|
+
export interface PipelinePhase<TOutput> {
|
|
20
|
+
name: string;
|
|
21
|
+
deps: string[];
|
|
22
|
+
execute(ctx: PipelineContext, depOutputs: Map<string, unknown>): Promise<TOutput>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/pipeline/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AAEpC,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,WAAW,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC1C,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,eAAO,MAAM,eAAe,EAAE,eAM7B,CAAC;AAEF,MAAM,WAAW,aAAa,CAAC,OAAO;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACnF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/pipeline/types.ts"],"names":[],"mappings":"AAoBA,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C,QAAQ,EAAE,KAAK;IACf,gBAAgB,EAAE,MAAM;IACxB,mBAAmB,EAAE,EAAE;IACvB,sBAAsB,EAAE,QAAQ;IAChC,MAAM,EAAE,EAAE;CACX,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
export type MonographDb = Database.Database;
|
|
3
|
+
export declare function openDb(dbPath: string): MonographDb;
|
|
4
|
+
export declare function closeDb(db: MonographDb): void;
|
|
5
|
+
/** Write to a .tmp file then rename for atomic replacement. */
|
|
6
|
+
export declare function atomicRebuild(dbPath: string, buildFn: (db: MonographDb) => void): void;
|
|
7
|
+
//# sourceMappingURL=db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../src/storage/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAStC,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC;AAE5C,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAWlD;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,CAE7C;AAYD,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI,CActF"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import { mkdirSync, existsSync, renameSync, unlinkSync } from 'fs';
|
|
3
|
+
import { dirname } from 'path';
|
|
4
|
+
import { CREATE_NODES, CREATE_EDGES, CREATE_COMMUNITIES, CREATE_INDEX_META, CREATE_NODES_FTS, CREATE_INDEXES, FTS_SYNC_TRIGGERS, } from './schema.js';
|
|
5
|
+
import { MonographError } from '../types.js';
|
|
6
|
+
export function openDb(dbPath) {
|
|
7
|
+
try {
|
|
8
|
+
mkdirSync(dirname(dbPath), { recursive: true });
|
|
9
|
+
const db = new Database(dbPath);
|
|
10
|
+
db.pragma('journal_mode = WAL');
|
|
11
|
+
db.pragma('foreign_keys = ON');
|
|
12
|
+
applyMigrations(db);
|
|
13
|
+
return db;
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
throw new MonographError(`Failed to open database at ${dbPath}`, err);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function closeDb(db) {
|
|
20
|
+
db.close();
|
|
21
|
+
}
|
|
22
|
+
function applyMigrations(db) {
|
|
23
|
+
db.exec(CREATE_NODES);
|
|
24
|
+
db.exec(CREATE_EDGES);
|
|
25
|
+
db.exec(CREATE_COMMUNITIES);
|
|
26
|
+
db.exec(CREATE_INDEX_META);
|
|
27
|
+
db.exec(CREATE_NODES_FTS);
|
|
28
|
+
for (const idx of CREATE_INDEXES)
|
|
29
|
+
db.exec(idx);
|
|
30
|
+
db.exec(FTS_SYNC_TRIGGERS);
|
|
31
|
+
}
|
|
32
|
+
/** Write to a .tmp file then rename for atomic replacement. */
|
|
33
|
+
export function atomicRebuild(dbPath, buildFn) {
|
|
34
|
+
const tmpPath = dbPath + '.tmp';
|
|
35
|
+
const db = openDb(tmpPath);
|
|
36
|
+
try {
|
|
37
|
+
buildFn(db);
|
|
38
|
+
db.close();
|
|
39
|
+
renameSync(tmpPath, dbPath);
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
db.close();
|
|
43
|
+
if (existsSync(tmpPath)) {
|
|
44
|
+
try {
|
|
45
|
+
unlinkSync(tmpPath);
|
|
46
|
+
}
|
|
47
|
+
catch { /* ignore */ }
|
|
48
|
+
}
|
|
49
|
+
throw err;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/storage/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EACL,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAC9C,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAAE,iBAAiB,GACvE,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAI7C,MAAM,UAAU,MAAM,CAAC,MAAc;IACnC,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC/B,eAAe,CAAC,EAAE,CAAC,CAAC;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,cAAc,CAAC,8BAA8B,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EAAe;IACrC,EAAE,CAAC,KAAK,EAAE,CAAC;AACb,CAAC;AAED,SAAS,eAAe,CAAC,EAAe;IACtC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACtB,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACtB,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC5B,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC3B,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,cAAc;QAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC7B,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,OAAkC;IAC9E,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IAChC,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3B,IAAI,CAAC;QACH,OAAO,CAAC,EAAE,CAAC,CAAC;QACZ,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC;gBAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { MonographEdge } from '../types.js';
|
|
3
|
+
export declare function insertEdge(db: Database.Database, edge: MonographEdge): void;
|
|
4
|
+
export declare function insertEdges(db: Database.Database, edges: MonographEdge[]): void;
|
|
5
|
+
export declare function getEdgesForSource(db: Database.Database, sourceId: string): MonographEdge[];
|
|
6
|
+
export declare function getEdgesForTarget(db: Database.Database, targetId: string): MonographEdge[];
|
|
7
|
+
export declare function deleteEdgesForFile(db: Database.Database, filePath: string): void;
|
|
8
|
+
export declare function countEdges(db: Database.Database): number;
|
|
9
|
+
//# sourceMappingURL=edge-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edge-store.d.ts","sourceRoot":"","sources":["../../../src/storage/edge-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAY3E;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,CAO/E;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAK1F;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAK1F;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAIhF;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAGxD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export function insertEdge(db, edge) {
|
|
2
|
+
db.prepare(`
|
|
3
|
+
INSERT OR REPLACE INTO edges (id, source_id, target_id, relation, confidence, confidence_score)
|
|
4
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
5
|
+
`).run(edge.id, edge.sourceId, edge.targetId, edge.relation, edge.confidence, edge.confidenceScore);
|
|
6
|
+
}
|
|
7
|
+
export function insertEdges(db, edges) {
|
|
8
|
+
const insertMany = db.transaction((rows) => {
|
|
9
|
+
for (const e of rows) {
|
|
10
|
+
insertEdge(db, e);
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
insertMany(edges);
|
|
14
|
+
}
|
|
15
|
+
export function getEdgesForSource(db, sourceId) {
|
|
16
|
+
const rows = db
|
|
17
|
+
.prepare('SELECT * FROM edges WHERE source_id = ?')
|
|
18
|
+
.all(sourceId);
|
|
19
|
+
return rows.map(rowToEdge);
|
|
20
|
+
}
|
|
21
|
+
export function getEdgesForTarget(db, targetId) {
|
|
22
|
+
const rows = db
|
|
23
|
+
.prepare('SELECT * FROM edges WHERE target_id = ?')
|
|
24
|
+
.all(targetId);
|
|
25
|
+
return rows.map(rowToEdge);
|
|
26
|
+
}
|
|
27
|
+
export function deleteEdgesForFile(db, filePath) {
|
|
28
|
+
db.prepare(`
|
|
29
|
+
DELETE FROM edges WHERE source_id IN (SELECT id FROM nodes WHERE file_path = ?)
|
|
30
|
+
`).run(filePath);
|
|
31
|
+
}
|
|
32
|
+
export function countEdges(db) {
|
|
33
|
+
const row = db.prepare('SELECT COUNT(*) as n FROM edges').get();
|
|
34
|
+
return row.n;
|
|
35
|
+
}
|
|
36
|
+
function rowToEdge(row) {
|
|
37
|
+
return {
|
|
38
|
+
id: row.id,
|
|
39
|
+
sourceId: row.source_id,
|
|
40
|
+
targetId: row.target_id,
|
|
41
|
+
relation: row.relation,
|
|
42
|
+
confidence: row.confidence,
|
|
43
|
+
confidenceScore: row.confidence_score,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=edge-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edge-store.js","sourceRoot":"","sources":["../../../src/storage/edge-store.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,UAAU,CAAC,EAAqB,EAAE,IAAmB;IACnE,EAAE,CAAC,OAAO,CAAC;;;GAGV,CAAC,CAAC,GAAG,CACJ,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,eAAe,CACrB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAqB,EAAE,KAAsB;IACvE,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,IAAqB,EAAE,EAAE;QAC1D,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IACH,UAAU,CAAC,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAqB,EAAE,QAAgB;IACvE,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CAAC,yCAAyC,CAAC;SAClD,GAAG,CAAC,QAAQ,CAA8B,CAAC;IAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAqB,EAAE,QAAgB;IACvE,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CAAC,yCAAyC,CAAC;SAClD,GAAG,CAAC,QAAQ,CAA8B,CAAC;IAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAqB,EAAE,QAAgB;IACxE,EAAE,CAAC,OAAO,CAAC;;GAEV,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAqB;IAC9C,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC,GAAG,EAAmB,CAAC;IACjF,OAAO,GAAG,CAAC,CAAC,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,GAA4B;IAC7C,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAY;QACpB,QAAQ,EAAE,GAAG,CAAC,SAAmB;QACjC,QAAQ,EAAE,GAAG,CAAC,SAAmB;QACjC,QAAQ,EAAE,GAAG,CAAC,QAAqC;QACnD,UAAU,EAAE,GAAG,CAAC,UAAyC;QACzD,eAAe,EAAE,GAAG,CAAC,gBAA0B;KAChD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
export interface FtsResult {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
normLabel: string;
|
|
6
|
+
filePath: string | null;
|
|
7
|
+
label: string;
|
|
8
|
+
rank: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function ftsSearch(db: Database.Database, query: string, limit: number, label?: string): FtsResult[];
|
|
11
|
+
//# sourceMappingURL=fts-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fts-store.d.ts","sourceRoot":"","sources":["../../../src/storage/fts-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,SAAS,CACvB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,GACb,SAAS,EAAE,CAmCb"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export function ftsSearch(db, query, limit, label) {
|
|
2
|
+
// Clean and sanitize the query for FTS5
|
|
3
|
+
const safeQuery = query.replace(/['"*]/g, ' ').trim();
|
|
4
|
+
if (!safeQuery)
|
|
5
|
+
return [];
|
|
6
|
+
// Add wildcard for prefix matching
|
|
7
|
+
const ftsPrefixQuery = safeQuery.split(/\s+/).map((term) => term + '*').join(' ');
|
|
8
|
+
let sql = `
|
|
9
|
+
SELECT n.id, n.name, n.norm_label, n.file_path, n.label,
|
|
10
|
+
nodes_fts.rank
|
|
11
|
+
FROM nodes_fts
|
|
12
|
+
JOIN nodes n ON n.rowid = nodes_fts.rowid
|
|
13
|
+
WHERE nodes_fts MATCH ?
|
|
14
|
+
`;
|
|
15
|
+
const params = [ftsPrefixQuery];
|
|
16
|
+
if (label) {
|
|
17
|
+
sql += ' AND n.label = ?';
|
|
18
|
+
params.push(label);
|
|
19
|
+
}
|
|
20
|
+
sql += ' ORDER BY nodes_fts.rank LIMIT ?';
|
|
21
|
+
params.push(limit);
|
|
22
|
+
const rows = db.prepare(sql).all(...params);
|
|
23
|
+
return rows.map((r) => ({
|
|
24
|
+
id: r.id,
|
|
25
|
+
name: r.name,
|
|
26
|
+
normLabel: r.norm_label,
|
|
27
|
+
filePath: r.file_path ?? null,
|
|
28
|
+
label: r.label,
|
|
29
|
+
rank: r.rank,
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=fts-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fts-store.js","sourceRoot":"","sources":["../../../src/storage/fts-store.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,SAAS,CACvB,EAAqB,EACrB,KAAa,EACb,KAAa,EACb,KAAc;IAEd,wCAAwC;IACxC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACtD,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAE1B,mCAAmC;IACnC,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAElF,IAAI,GAAG,GAAG;;;;;;GAMT,CAAC;IACF,MAAM,MAAM,GAAc,CAAC,cAAc,CAAC,CAAC;IAC3C,IAAI,KAAK,EAAE,CAAC;QACV,GAAG,IAAI,kBAAkB,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,GAAG,IAAI,kCAAkC,CAAC;IAC1C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEnB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAI,MAAiC,CAGnE,CAAC;IACJ,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtB,EAAE,EAAE,CAAC,CAAC,EAAY;QAClB,IAAI,EAAE,CAAC,CAAC,IAAc;QACtB,SAAS,EAAE,CAAC,CAAC,UAAoB;QACjC,QAAQ,EAAG,CAAC,CAAC,SAA2B,IAAI,IAAI;QAChD,KAAK,EAAE,CAAC,CAAC,KAAe;QACxB,IAAI,EAAE,CAAC,CAAC,IAAc;KACvB,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { MonographNode } from '../types.js';
|
|
3
|
+
export declare function insertNode(db: Database.Database, node: MonographNode): void;
|
|
4
|
+
export declare function insertNodes(db: Database.Database, nodes: MonographNode[]): void;
|
|
5
|
+
export declare function getNode(db: Database.Database, id: string): MonographNode | undefined;
|
|
6
|
+
export declare function getNodesForFile(db: Database.Database, filePath: string): MonographNode[];
|
|
7
|
+
export declare function deleteNodesForFile(db: Database.Database, filePath: string): void;
|
|
8
|
+
export declare function countNodes(db: Database.Database): number;
|
|
9
|
+
//# sourceMappingURL=node-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-store.d.ts","sourceRoot":"","sources":["../../../src/storage/node-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAmB3E;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,CAO/E;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAKpF;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAKxF;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEhF;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAGxD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { toNormLabel } from '../types.js';
|
|
2
|
+
export function insertNode(db, node) {
|
|
3
|
+
db.prepare(`
|
|
4
|
+
INSERT OR REPLACE INTO nodes
|
|
5
|
+
(id, label, name, norm_label, file_path, start_line, end_line,
|
|
6
|
+
community_id, is_exported, language, properties)
|
|
7
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
8
|
+
`).run(node.id, node.label, node.name, node.normLabel ?? toNormLabel(node.name), node.filePath ?? null, node.startLine ?? null, node.endLine ?? null, node.communityId ?? null, node.isExported ? 1 : 0, node.language ?? null, node.properties ? JSON.stringify(node.properties) : null);
|
|
9
|
+
}
|
|
10
|
+
export function insertNodes(db, nodes) {
|
|
11
|
+
const insertMany = db.transaction((rows) => {
|
|
12
|
+
for (const n of rows) {
|
|
13
|
+
insertNode(db, n);
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
insertMany(nodes);
|
|
17
|
+
}
|
|
18
|
+
export function getNode(db, id) {
|
|
19
|
+
const row = db
|
|
20
|
+
.prepare('SELECT * FROM nodes WHERE id = ?')
|
|
21
|
+
.get(id);
|
|
22
|
+
return row ? rowToNode(row) : undefined;
|
|
23
|
+
}
|
|
24
|
+
export function getNodesForFile(db, filePath) {
|
|
25
|
+
const rows = db
|
|
26
|
+
.prepare('SELECT * FROM nodes WHERE file_path = ?')
|
|
27
|
+
.all(filePath);
|
|
28
|
+
return rows.map(rowToNode);
|
|
29
|
+
}
|
|
30
|
+
export function deleteNodesForFile(db, filePath) {
|
|
31
|
+
db.prepare('DELETE FROM nodes WHERE file_path = ?').run(filePath);
|
|
32
|
+
}
|
|
33
|
+
export function countNodes(db) {
|
|
34
|
+
const row = db.prepare('SELECT COUNT(*) as n FROM nodes').get();
|
|
35
|
+
return row.n;
|
|
36
|
+
}
|
|
37
|
+
function rowToNode(row) {
|
|
38
|
+
return {
|
|
39
|
+
id: row.id,
|
|
40
|
+
label: row.label,
|
|
41
|
+
name: row.name,
|
|
42
|
+
normLabel: row.norm_label,
|
|
43
|
+
filePath: row.file_path,
|
|
44
|
+
startLine: row.start_line,
|
|
45
|
+
endLine: row.end_line,
|
|
46
|
+
communityId: row.community_id,
|
|
47
|
+
isExported: row.is_exported === 1,
|
|
48
|
+
language: row.language,
|
|
49
|
+
properties: row.properties ? JSON.parse(row.properties) : undefined,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=node-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-store.js","sourceRoot":"","sources":["../../../src/storage/node-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,UAAU,UAAU,CAAC,EAAqB,EAAE,IAAmB;IACnE,EAAE,CAAC,OAAO,CAAC;;;;;GAKV,CAAC,CAAC,GAAG,CACJ,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,SAAS,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EACxC,IAAI,CAAC,QAAQ,IAAI,IAAI,EACrB,IAAI,CAAC,SAAS,IAAI,IAAI,EACtB,IAAI,CAAC,OAAO,IAAI,IAAI,EACpB,IAAI,CAAC,WAAW,IAAI,IAAI,EACxB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACvB,IAAI,CAAC,QAAQ,IAAI,IAAI,EACrB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CACzD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAqB,EAAE,KAAsB;IACvE,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,IAAqB,EAAE,EAAE;QAC1D,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IACH,UAAU,CAAC,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EAAqB,EAAE,EAAU;IACvD,MAAM,GAAG,GAAG,EAAE;SACX,OAAO,CAAC,kCAAkC,CAAC;SAC3C,GAAG,CAAC,EAAE,CAAwC,CAAC;IAClD,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAqB,EAAE,QAAgB;IACrE,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CAAC,yCAAyC,CAAC;SAClD,GAAG,CAAC,QAAQ,CAA8B,CAAC;IAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAqB,EAAE,QAAgB;IACxE,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAqB;IAC9C,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC,GAAG,EAAmB,CAAC;IACjF,OAAO,GAAG,CAAC,CAAC,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,GAA4B;IAC7C,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAY;QACpB,KAAK,EAAE,GAAG,CAAC,KAA+B;QAC1C,IAAI,EAAE,GAAG,CAAC,IAAc;QACxB,SAAS,EAAE,GAAG,CAAC,UAAoB;QACnC,QAAQ,EAAE,GAAG,CAAC,SAA+B;QAC7C,SAAS,EAAE,GAAG,CAAC,UAAgC;QAC/C,OAAO,EAAE,GAAG,CAAC,QAA8B;QAC3C,WAAW,EAAE,GAAG,CAAC,YAAkC;QACnD,UAAU,EAAG,GAAG,CAAC,WAAsB,KAAK,CAAC;QAC7C,QAAQ,EAAE,GAAG,CAAC,QAA8B;QAC5C,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAoB,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const CREATE_NODES = "\nCREATE TABLE IF NOT EXISTS nodes (\n id TEXT PRIMARY KEY,\n label TEXT NOT NULL,\n name TEXT NOT NULL,\n norm_label TEXT NOT NULL DEFAULT '',\n file_path TEXT,\n start_line INTEGER,\n end_line INTEGER,\n community_id INTEGER,\n is_exported INTEGER NOT NULL DEFAULT 0,\n language TEXT,\n properties TEXT\n)";
|
|
2
|
+
export declare const CREATE_EDGES = "\nCREATE TABLE IF NOT EXISTS edges (\n id TEXT PRIMARY KEY,\n source_id TEXT NOT NULL,\n target_id TEXT NOT NULL,\n relation TEXT NOT NULL,\n confidence TEXT NOT NULL DEFAULT 'EXTRACTED',\n confidence_score REAL NOT NULL DEFAULT 1.0,\n FOREIGN KEY (source_id) REFERENCES nodes(id),\n FOREIGN KEY (target_id) REFERENCES nodes(id)\n)";
|
|
3
|
+
export declare const CREATE_COMMUNITIES = "\nCREATE TABLE IF NOT EXISTS communities (\n id INTEGER PRIMARY KEY,\n label TEXT,\n size INTEGER NOT NULL DEFAULT 0,\n cohesion_score REAL NOT NULL DEFAULT 0.0\n)";
|
|
4
|
+
export declare const CREATE_INDEX_META = "\nCREATE TABLE IF NOT EXISTS index_meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n)";
|
|
5
|
+
export declare const CREATE_NODES_FTS = "\nCREATE VIRTUAL TABLE IF NOT EXISTS nodes_fts USING fts5(\n id UNINDEXED,\n name,\n norm_label,\n file_path,\n label UNINDEXED,\n content='nodes',\n content_rowid='rowid'\n)";
|
|
6
|
+
export declare const CREATE_INDEXES: string[];
|
|
7
|
+
export declare const FTS_SYNC_TRIGGERS = "\nCREATE TRIGGER IF NOT EXISTS nodes_fts_insert AFTER INSERT ON nodes BEGIN\n INSERT INTO nodes_fts(rowid, id, name, norm_label, file_path, label)\n VALUES (new.rowid, new.id, new.name, new.norm_label, new.file_path, new.label);\nEND;\nCREATE TRIGGER IF NOT EXISTS nodes_fts_delete AFTER DELETE ON nodes BEGIN\n INSERT INTO nodes_fts(nodes_fts, rowid, id, name, norm_label, file_path, label)\n VALUES ('delete', old.rowid, old.id, old.name, old.norm_label, old.file_path, old.label);\nEND;\nCREATE TRIGGER IF NOT EXISTS nodes_fts_update AFTER UPDATE ON nodes BEGIN\n INSERT INTO nodes_fts(nodes_fts, rowid, id, name, norm_label, file_path, label)\n VALUES ('delete', old.rowid, old.id, old.name, old.norm_label, old.file_path, old.label);\n INSERT INTO nodes_fts(rowid, id, name, norm_label, file_path, label)\n VALUES (new.rowid, new.id, new.name, new.norm_label, new.file_path, new.label);\nEND";
|
|
8
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/storage/schema.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,mUAavB,CAAC;AAEH,eAAO,MAAM,YAAY,wVAUvB,CAAC;AAEH,eAAO,MAAM,kBAAkB,4KAM7B,CAAC;AAEH,eAAO,MAAM,iBAAiB,iGAI5B,CAAC;AAEH,eAAO,MAAM,gBAAgB,0LAS3B,CAAC;AAEH,eAAO,MAAM,cAAc,UAQ1B,CAAC;AAEF,eAAO,MAAM,iBAAiB,64BAc1B,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export const CREATE_NODES = `
|
|
2
|
+
CREATE TABLE IF NOT EXISTS nodes (
|
|
3
|
+
id TEXT PRIMARY KEY,
|
|
4
|
+
label TEXT NOT NULL,
|
|
5
|
+
name TEXT NOT NULL,
|
|
6
|
+
norm_label TEXT NOT NULL DEFAULT '',
|
|
7
|
+
file_path TEXT,
|
|
8
|
+
start_line INTEGER,
|
|
9
|
+
end_line INTEGER,
|
|
10
|
+
community_id INTEGER,
|
|
11
|
+
is_exported INTEGER NOT NULL DEFAULT 0,
|
|
12
|
+
language TEXT,
|
|
13
|
+
properties TEXT
|
|
14
|
+
)`;
|
|
15
|
+
export const CREATE_EDGES = `
|
|
16
|
+
CREATE TABLE IF NOT EXISTS edges (
|
|
17
|
+
id TEXT PRIMARY KEY,
|
|
18
|
+
source_id TEXT NOT NULL,
|
|
19
|
+
target_id TEXT NOT NULL,
|
|
20
|
+
relation TEXT NOT NULL,
|
|
21
|
+
confidence TEXT NOT NULL DEFAULT 'EXTRACTED',
|
|
22
|
+
confidence_score REAL NOT NULL DEFAULT 1.0,
|
|
23
|
+
FOREIGN KEY (source_id) REFERENCES nodes(id),
|
|
24
|
+
FOREIGN KEY (target_id) REFERENCES nodes(id)
|
|
25
|
+
)`;
|
|
26
|
+
export const CREATE_COMMUNITIES = `
|
|
27
|
+
CREATE TABLE IF NOT EXISTS communities (
|
|
28
|
+
id INTEGER PRIMARY KEY,
|
|
29
|
+
label TEXT,
|
|
30
|
+
size INTEGER NOT NULL DEFAULT 0,
|
|
31
|
+
cohesion_score REAL NOT NULL DEFAULT 0.0
|
|
32
|
+
)`;
|
|
33
|
+
export const CREATE_INDEX_META = `
|
|
34
|
+
CREATE TABLE IF NOT EXISTS index_meta (
|
|
35
|
+
key TEXT PRIMARY KEY,
|
|
36
|
+
value TEXT NOT NULL
|
|
37
|
+
)`;
|
|
38
|
+
export const CREATE_NODES_FTS = `
|
|
39
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS nodes_fts USING fts5(
|
|
40
|
+
id UNINDEXED,
|
|
41
|
+
name,
|
|
42
|
+
norm_label,
|
|
43
|
+
file_path,
|
|
44
|
+
label UNINDEXED,
|
|
45
|
+
content='nodes',
|
|
46
|
+
content_rowid='rowid'
|
|
47
|
+
)`;
|
|
48
|
+
export const CREATE_INDEXES = [
|
|
49
|
+
`CREATE INDEX IF NOT EXISTS idx_nodes_file ON nodes(file_path)`,
|
|
50
|
+
`CREATE INDEX IF NOT EXISTS idx_nodes_label ON nodes(label)`,
|
|
51
|
+
`CREATE INDEX IF NOT EXISTS idx_nodes_norm ON nodes(norm_label)`,
|
|
52
|
+
`CREATE INDEX IF NOT EXISTS idx_edges_source ON edges(source_id)`,
|
|
53
|
+
`CREATE INDEX IF NOT EXISTS idx_edges_target ON edges(target_id)`,
|
|
54
|
+
`CREATE INDEX IF NOT EXISTS idx_edges_relation ON edges(relation)`,
|
|
55
|
+
`CREATE INDEX IF NOT EXISTS idx_edges_confidence ON edges(confidence)`,
|
|
56
|
+
];
|
|
57
|
+
export const FTS_SYNC_TRIGGERS = `
|
|
58
|
+
CREATE TRIGGER IF NOT EXISTS nodes_fts_insert AFTER INSERT ON nodes BEGIN
|
|
59
|
+
INSERT INTO nodes_fts(rowid, id, name, norm_label, file_path, label)
|
|
60
|
+
VALUES (new.rowid, new.id, new.name, new.norm_label, new.file_path, new.label);
|
|
61
|
+
END;
|
|
62
|
+
CREATE TRIGGER IF NOT EXISTS nodes_fts_delete AFTER DELETE ON nodes BEGIN
|
|
63
|
+
INSERT INTO nodes_fts(nodes_fts, rowid, id, name, norm_label, file_path, label)
|
|
64
|
+
VALUES ('delete', old.rowid, old.id, old.name, old.norm_label, old.file_path, old.label);
|
|
65
|
+
END;
|
|
66
|
+
CREATE TRIGGER IF NOT EXISTS nodes_fts_update AFTER UPDATE ON nodes BEGIN
|
|
67
|
+
INSERT INTO nodes_fts(nodes_fts, rowid, id, name, norm_label, file_path, label)
|
|
68
|
+
VALUES ('delete', old.rowid, old.id, old.name, old.norm_label, old.file_path, old.label);
|
|
69
|
+
INSERT INTO nodes_fts(rowid, id, name, norm_label, file_path, label)
|
|
70
|
+
VALUES (new.rowid, new.id, new.name, new.norm_label, new.file_path, new.label);
|
|
71
|
+
END`;
|
|
72
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/storage/schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;EAa1B,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;EAU1B,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;EAMhC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;EAI/B,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;EAS9B,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,+DAA+D;IAC/D,4DAA4D;IAC5D,gEAAgE;IAChE,iEAAiE;IACjE,iEAAiE;IACjE,kEAAkE;IAClE,sEAAsE;CACvE,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;IAc7B,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export type NodeLabel = 'File' | 'Folder' | 'Function' | 'Class' | 'Method' | 'Interface' | 'Variable' | 'Struct' | 'Enum' | 'Macro' | 'Typedef' | 'Union' | 'Namespace' | 'Trait' | 'Impl' | 'TypeAlias' | 'Const' | 'Static' | 'Property' | 'Record' | 'Delegate' | 'Annotation' | 'Constructor' | 'Template' | 'Module' | 'Process' | 'Route' | 'Community' | 'Concept';
|
|
2
|
+
export declare const SYMBOL_NODE_LABELS: Set<NodeLabel>;
|
|
3
|
+
export type EdgeRelation = 'CONTAINS' | 'DEFINES' | 'CALLS' | 'IMPORTS' | 'EXTENDS' | 'IMPLEMENTS' | 'HAS_METHOD' | 'HAS_PROPERTY' | 'ACCESSES' | 'METHOD_OVERRIDES' | 'METHOD_IMPLEMENTS' | 'MEMBER_OF' | 'STEP_IN_PROCESS' | 'HANDLES_ROUTE' | 'FETCHES' | 'HANDLES_TOOL' | 'ENTRY_POINT_OF' | 'WRAPS' | 'QUERIES';
|
|
4
|
+
export type EdgeConfidence = 'EXTRACTED' | 'INFERRED' | 'AMBIGUOUS';
|
|
5
|
+
export declare const CONFIDENCE_SCORE: Record<EdgeConfidence, number>;
|
|
6
|
+
export interface MonographNode {
|
|
7
|
+
id: string;
|
|
8
|
+
label: NodeLabel;
|
|
9
|
+
name: string;
|
|
10
|
+
normLabel: string;
|
|
11
|
+
filePath?: string;
|
|
12
|
+
startLine?: number;
|
|
13
|
+
endLine?: number;
|
|
14
|
+
communityId?: number;
|
|
15
|
+
isExported: boolean;
|
|
16
|
+
language?: string;
|
|
17
|
+
properties?: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
export interface MonographEdge {
|
|
20
|
+
id: string;
|
|
21
|
+
sourceId: string;
|
|
22
|
+
targetId: string;
|
|
23
|
+
relation: EdgeRelation;
|
|
24
|
+
confidence: EdgeConfidence;
|
|
25
|
+
confidenceScore: number;
|
|
26
|
+
}
|
|
27
|
+
export interface MonographCommunity {
|
|
28
|
+
id: number;
|
|
29
|
+
label?: string;
|
|
30
|
+
size: number;
|
|
31
|
+
cohesionScore: number;
|
|
32
|
+
}
|
|
33
|
+
export interface GodNode extends MonographNode {
|
|
34
|
+
degree: number;
|
|
35
|
+
inDegree: number;
|
|
36
|
+
outDegree: number;
|
|
37
|
+
}
|
|
38
|
+
export interface SurprisingConnection {
|
|
39
|
+
edge: MonographEdge;
|
|
40
|
+
score: number;
|
|
41
|
+
reasons: string[];
|
|
42
|
+
}
|
|
43
|
+
export type SuggestedQuestion = {
|
|
44
|
+
type: 'ambiguous_edge';
|
|
45
|
+
edge: MonographEdge;
|
|
46
|
+
reason: string;
|
|
47
|
+
} | {
|
|
48
|
+
type: 'bridge_node';
|
|
49
|
+
node: MonographNode;
|
|
50
|
+
commA: number;
|
|
51
|
+
commB: number;
|
|
52
|
+
} | {
|
|
53
|
+
type: 'verify_inferred';
|
|
54
|
+
edge: MonographEdge;
|
|
55
|
+
inferredFrom: string;
|
|
56
|
+
} | {
|
|
57
|
+
type: 'isolated_nodes';
|
|
58
|
+
nodes: MonographNode[];
|
|
59
|
+
reason: string;
|
|
60
|
+
} | {
|
|
61
|
+
type: 'low_cohesion';
|
|
62
|
+
community: MonographCommunity;
|
|
63
|
+
};
|
|
64
|
+
export declare function makeId(...parts: string[]): string;
|
|
65
|
+
export declare function toNormLabel(name: string): string;
|
|
66
|
+
export interface PipelineProgress {
|
|
67
|
+
phase: string;
|
|
68
|
+
filesProcessed?: number;
|
|
69
|
+
totalFiles?: number;
|
|
70
|
+
message?: string;
|
|
71
|
+
}
|
|
72
|
+
export declare class MonographError extends Error {
|
|
73
|
+
readonly cause?: unknown | undefined;
|
|
74
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|