@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,37 @@
|
|
|
1
|
+
import { resolve, join } from 'path';
|
|
2
|
+
import Graph from 'graphology';
|
|
3
|
+
import { openDb, closeDb } from '../storage/db.js';
|
|
4
|
+
import { PipelineRunner } from './runner.js';
|
|
5
|
+
import { scanPhase } from './phases/scan.js';
|
|
6
|
+
import { structurePhase } from './phases/structure.js';
|
|
7
|
+
import { parsePhase } from './phases/parse.js';
|
|
8
|
+
import { crossFilePhase } from './phases/cross-file.js';
|
|
9
|
+
import { mroPhase } from './phases/mro.js';
|
|
10
|
+
import { communitiesPhase } from './phases/communities.js';
|
|
11
|
+
import { godNodesPhase } from './phases/god-nodes.js';
|
|
12
|
+
import { surprisesPhase } from './phases/surprises.js';
|
|
13
|
+
import { suggestPhase } from './phases/suggest.js';
|
|
14
|
+
import { DEFAULT_OPTIONS } from './types.js';
|
|
15
|
+
export async function buildAsync(repoPath, options = {}) {
|
|
16
|
+
const dbPath = resolve(join(repoPath, '.monomind', 'monograph.db'));
|
|
17
|
+
const fullOptions = { ...DEFAULT_OPTIONS, ...options };
|
|
18
|
+
const db = openDb(dbPath);
|
|
19
|
+
try {
|
|
20
|
+
const graph = new Graph({ multi: true, type: 'directed' });
|
|
21
|
+
const ctx = {
|
|
22
|
+
repoPath: resolve(repoPath),
|
|
23
|
+
db, graph,
|
|
24
|
+
onProgress: options.onProgress ?? (() => { }),
|
|
25
|
+
options: fullOptions,
|
|
26
|
+
};
|
|
27
|
+
const runner = new PipelineRunner([
|
|
28
|
+
scanPhase, structurePhase, parsePhase, crossFilePhase,
|
|
29
|
+
mroPhase, communitiesPhase, godNodesPhase, surprisesPhase, suggestPhase,
|
|
30
|
+
]);
|
|
31
|
+
await runner.run(ctx);
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
closeDb(db);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/pipeline/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAQ7C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB,EAAE,UAAwB,EAAE;IAC3E,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;IACpE,MAAM,WAAW,GAAoB,EAAE,GAAG,eAAe,EAAE,GAAG,OAAO,EAAE,CAAC;IACxE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAE1B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAoB;YAC3B,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC;YAC3B,EAAE,EAAE,KAAK;YACT,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;YAC5C,OAAO,EAAE,WAAW;SACrB,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;YAChC,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc;YACrD,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY;SACxE,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PipelinePhase } from '../types.js';
|
|
2
|
+
export interface CommunitiesOutput {
|
|
3
|
+
memberships: Map<string, number>;
|
|
4
|
+
communityLabels: Map<number, string>;
|
|
5
|
+
}
|
|
6
|
+
export declare const communitiesPhase: PipelinePhase<CommunitiesOutput>;
|
|
7
|
+
//# sourceMappingURL=communities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"communities.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/phases/communities.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAMlE,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,eAAO,MAAM,gBAAgB,EAAE,aAAa,CAAC,iBAAiB,CAgC7D,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import louvain from 'graphology-communities-louvain';
|
|
2
|
+
import { loadGraphFromEdges } from '../../graph/loader.js';
|
|
3
|
+
export const communitiesPhase = {
|
|
4
|
+
name: 'communities',
|
|
5
|
+
deps: ['cross-file', 'mro'],
|
|
6
|
+
async execute(_ctx, deps) {
|
|
7
|
+
const { resolvedEdges } = deps.get('cross-file');
|
|
8
|
+
const { allEdges } = deps.get('parse');
|
|
9
|
+
const allUsedEdges = [...allEdges, ...resolvedEdges];
|
|
10
|
+
const graph = loadGraphFromEdges(allUsedEdges);
|
|
11
|
+
let communities = {};
|
|
12
|
+
try {
|
|
13
|
+
communities = louvain(graph);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// Empty or disconnected graph
|
|
17
|
+
}
|
|
18
|
+
const memberships = new Map(Object.entries(communities).map(([k, v]) => [k, v]));
|
|
19
|
+
const communityLabels = new Map();
|
|
20
|
+
const communityDegrees = new Map();
|
|
21
|
+
for (const [nodeId, commId] of memberships) {
|
|
22
|
+
if (!communityDegrees.has(commId))
|
|
23
|
+
communityDegrees.set(commId, new Map());
|
|
24
|
+
const deg = graph.degree(nodeId) ?? 0;
|
|
25
|
+
communityDegrees.get(commId).set(nodeId, deg);
|
|
26
|
+
}
|
|
27
|
+
for (const [commId, nodeDegs] of communityDegrees) {
|
|
28
|
+
const topNode = [...nodeDegs.entries()].sort((a, b) => b[1] - a[1])[0]?.[0] ?? '';
|
|
29
|
+
communityLabels.set(commId, `community-${commId}(${topNode.slice(0, 20)})`);
|
|
30
|
+
}
|
|
31
|
+
return { memberships, communityLabels };
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=communities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"communities.js","sourceRoot":"","sources":["../../../../src/pipeline/phases/communities.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,gCAAgC,CAAC;AAGrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAS3D,MAAM,CAAC,MAAM,gBAAgB,GAAqC;IAChE,IAAI,EAAE,aAAa;IACnB,IAAI,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC;IAC3B,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI;QACtB,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAoB,CAAC;QACpE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAgB,CAAC;QACtD,MAAM,YAAY,GAAoB,CAAC,GAAG,QAAQ,EAAE,GAAG,aAAa,CAAC,CAAC;QAEtE,MAAM,KAAK,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;QAC/C,IAAI,WAAW,GAA2B,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,GAAG,CAAiB,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACjG,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;QAElD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA+B,CAAC;QAChE,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC3C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YAC3E,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACtC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACjD,CAAC;QACD,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,gBAAgB,EAAE,CAAC;YAClD,MAAM,OAAO,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAClF,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;QAC9E,CAAC;QAED,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;IAC1C,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PipelinePhase } from '../types.js';
|
|
2
|
+
import type { MonographEdge } from '../../types.js';
|
|
3
|
+
export interface CrossFileOutput {
|
|
4
|
+
resolvedEdges: MonographEdge[];
|
|
5
|
+
}
|
|
6
|
+
export declare const crossFilePhase: PipelinePhase<CrossFileOutput>;
|
|
7
|
+
//# sourceMappingURL=cross-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-file.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/phases/cross-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAKpD,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,aAAa,EAAE,CAAC;CAChC;AAED,eAAO,MAAM,cAAc,EAAE,aAAa,CAAC,eAAe,CAqCzD,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { makeId, CONFIDENCE_SCORE } from '../../types.js';
|
|
2
|
+
import { insertEdges } from '../../storage/edge-store.js';
|
|
3
|
+
export const crossFilePhase = {
|
|
4
|
+
name: 'cross-file',
|
|
5
|
+
deps: ['parse'],
|
|
6
|
+
async execute(_ctx, deps) {
|
|
7
|
+
const { allEdges, symbolNodes } = deps.get('parse');
|
|
8
|
+
const nameIndex = new Map();
|
|
9
|
+
for (const node of symbolNodes) {
|
|
10
|
+
nameIndex.set(node.name, node.id);
|
|
11
|
+
if (node.normLabel)
|
|
12
|
+
nameIndex.set(node.normLabel, node.id);
|
|
13
|
+
}
|
|
14
|
+
const resolvedEdges = [];
|
|
15
|
+
for (const edge of allEdges) {
|
|
16
|
+
if (edge.relation !== 'IMPORTS')
|
|
17
|
+
continue;
|
|
18
|
+
const targetName = edge.targetId.replace(/^import_/, '').split('/').pop() ?? '';
|
|
19
|
+
const resolvedId = nameIndex.get(targetName) ?? nameIndex.get(targetName.toLowerCase());
|
|
20
|
+
if (resolvedId && resolvedId !== edge.targetId) {
|
|
21
|
+
resolvedEdges.push({
|
|
22
|
+
...edge,
|
|
23
|
+
id: makeId(edge.sourceId, resolvedId, 'resolved'),
|
|
24
|
+
targetId: resolvedId,
|
|
25
|
+
confidence: 'INFERRED',
|
|
26
|
+
confidenceScore: CONFIDENCE_SCORE.INFERRED,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (_ctx.db && resolvedEdges.length > 0) {
|
|
31
|
+
insertEdges(_ctx.db, resolvedEdges);
|
|
32
|
+
}
|
|
33
|
+
return { resolvedEdges };
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=cross-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-file.js","sourceRoot":"","sources":["../../../../src/pipeline/phases/cross-file.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAO1D,MAAM,CAAC,MAAM,cAAc,GAAmC;IAC5D,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,CAAC,OAAO,CAAC;IACf,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI;QACtB,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAgB,CAAC;QAEnE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC5C,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YAClC,IAAI,IAAI,CAAC,SAAS;gBAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,aAAa,GAAoB,EAAE,CAAC;QAE1C,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;gBAAE,SAAS;YAE1C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAChF,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;YAExF,IAAI,UAAU,IAAI,UAAU,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC/C,aAAa,CAAC,IAAI,CAAC;oBACjB,GAAG,IAAI;oBACP,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC;oBACjD,QAAQ,EAAE,UAAU;oBACpB,UAAU,EAAE,UAAU;oBACtB,eAAe,EAAE,gBAAgB,CAAC,QAAQ;iBAC3C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,EAAE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,EAAE,aAAa,EAAE,CAAC;IAC3B,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PipelinePhase } from '../types.js';
|
|
2
|
+
import type { GodNode } from '../../types.js';
|
|
3
|
+
export interface GodNodesOutput {
|
|
4
|
+
godNodes: GodNode[];
|
|
5
|
+
}
|
|
6
|
+
export declare const godNodesPhase: PipelinePhase<GodNodesOutput>;
|
|
7
|
+
//# sourceMappingURL=god-nodes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"god-nodes.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/phases/god-nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,gBAAgB,CAAC;AAM7D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,cAAc,CA4BvD,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const EXCLUDED_LABELS = new Set(['File', 'Folder', 'Community', 'Concept']);
|
|
2
|
+
export const godNodesPhase = {
|
|
3
|
+
name: 'god-nodes',
|
|
4
|
+
deps: ['cross-file', 'parse'],
|
|
5
|
+
async execute(ctx, deps) {
|
|
6
|
+
const { resolvedEdges } = deps.get('cross-file');
|
|
7
|
+
const { allEdges, symbolNodes } = deps.get('parse');
|
|
8
|
+
const allEdgesCombined = [...allEdges, ...resolvedEdges];
|
|
9
|
+
const inDeg = new Map();
|
|
10
|
+
const outDeg = new Map();
|
|
11
|
+
for (const e of allEdgesCombined) {
|
|
12
|
+
outDeg.set(e.sourceId, (outDeg.get(e.sourceId) ?? 0) + 1);
|
|
13
|
+
inDeg.set(e.targetId, (inDeg.get(e.targetId) ?? 0) + 1);
|
|
14
|
+
}
|
|
15
|
+
const godNodes = symbolNodes
|
|
16
|
+
.filter(n => !EXCLUDED_LABELS.has(n.label) && (inDeg.get(n.id) ?? 0) + (outDeg.get(n.id) ?? 0) > 0)
|
|
17
|
+
.map(n => ({
|
|
18
|
+
...n,
|
|
19
|
+
inDegree: inDeg.get(n.id) ?? 0,
|
|
20
|
+
outDegree: outDeg.get(n.id) ?? 0,
|
|
21
|
+
degree: (inDeg.get(n.id) ?? 0) + (outDeg.get(n.id) ?? 0),
|
|
22
|
+
}))
|
|
23
|
+
.sort((a, b) => b.degree - a.degree)
|
|
24
|
+
.slice(0, 20);
|
|
25
|
+
return { godNodes };
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=god-nodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"god-nodes.js","sourceRoot":"","sources":["../../../../src/pipeline/phases/god-nodes.ts"],"names":[],"mappings":"AAKA,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;AAM5E,MAAM,CAAC,MAAM,aAAa,GAAkC;IAC1D,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC;IAC7B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI;QACrB,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAoB,CAAC;QACpE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAgB,CAAC;QACnE,MAAM,gBAAgB,GAAoB,CAAC,GAAG,QAAQ,EAAE,GAAG,aAAa,CAAC,CAAC;QAE1E,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1D,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,QAAQ,GAAc,WAAW;aACpC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;aAClG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACT,GAAG,CAAC;YACJ,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;YAC9B,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;YAChC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;SACzD,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;aACnC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEhB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mro.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/phases/mro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAIpD,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,eAAO,MAAM,QAAQ,EAAE,aAAa,CAAC,SAAS,CA0C7C,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { makeId, CONFIDENCE_SCORE } from '../../types.js';
|
|
2
|
+
export const mroPhase = {
|
|
3
|
+
name: 'mro',
|
|
4
|
+
deps: ['cross-file'],
|
|
5
|
+
async execute(_ctx, deps) {
|
|
6
|
+
const { allEdges, symbolNodes } = deps.get('parse');
|
|
7
|
+
const classMethodsIndex = new Map();
|
|
8
|
+
for (const edge of allEdges) {
|
|
9
|
+
if (edge.relation === 'HAS_METHOD') {
|
|
10
|
+
const methods = classMethodsIndex.get(edge.sourceId) ?? [];
|
|
11
|
+
methods.push(edge.targetId);
|
|
12
|
+
classMethodsIndex.set(edge.sourceId, methods);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const nameIndex = new Map(symbolNodes.map(n => [n.id, n.name]));
|
|
16
|
+
const mroEdges = [];
|
|
17
|
+
for (const edge of allEdges) {
|
|
18
|
+
if (edge.relation !== 'EXTENDS' && edge.relation !== 'IMPLEMENTS')
|
|
19
|
+
continue;
|
|
20
|
+
const parentMethods = classMethodsIndex.get(edge.targetId) ?? [];
|
|
21
|
+
const childMethods = classMethodsIndex.get(edge.sourceId) ?? [];
|
|
22
|
+
const parentMethodNames = new Map(parentMethods.map(id => [nameIndex.get(id) ?? id, id]));
|
|
23
|
+
for (const childMethodId of childMethods) {
|
|
24
|
+
const childName = nameIndex.get(childMethodId);
|
|
25
|
+
if (!childName)
|
|
26
|
+
continue;
|
|
27
|
+
const parentMethodId = parentMethodNames.get(childName);
|
|
28
|
+
if (!parentMethodId)
|
|
29
|
+
continue;
|
|
30
|
+
const relation = edge.relation === 'IMPLEMENTS' ? 'METHOD_IMPLEMENTS' : 'METHOD_OVERRIDES';
|
|
31
|
+
mroEdges.push({
|
|
32
|
+
id: makeId(childMethodId, parentMethodId, relation.toLowerCase()),
|
|
33
|
+
sourceId: childMethodId, targetId: parentMethodId,
|
|
34
|
+
relation, confidence: 'EXTRACTED', confidenceScore: CONFIDENCE_SCORE.EXTRACTED,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return { mroEdges };
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=mro.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mro.js","sourceRoot":"","sources":["../../../../src/pipeline/phases/mro.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAO1D,MAAM,CAAC,MAAM,QAAQ,GAA6B;IAChD,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,CAAC,YAAY,CAAC;IACpB,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI;QACtB,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAgB,CAAC;QAEnE,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAoB,CAAC;QACtD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;gBACnC,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC3D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC5B,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAoB,EAAE,CAAC;QAErC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY;gBAAE,SAAS;YAE5E,MAAM,aAAa,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACjE,MAAM,YAAY,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChE,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YAE1F,KAAK,MAAM,aAAa,IAAI,YAAY,EAAE,CAAC;gBACzC,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gBAC/C,IAAI,CAAC,SAAS;oBAAE,SAAS;gBACzB,MAAM,cAAc,GAAG,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACxD,IAAI,CAAC,cAAc;oBAAE,SAAS;gBAE9B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,kBAAkB,CAAC;gBAC3F,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,MAAM,CAAC,aAAa,EAAE,cAAc,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC;oBACjE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc;oBACjD,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,CAAC,SAAS;iBAC/E,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PipelinePhase } from '../types.js';
|
|
2
|
+
import type { MonographNode, MonographEdge } from '../../types.js';
|
|
3
|
+
export interface ParseOutput {
|
|
4
|
+
symbolNodes: MonographNode[];
|
|
5
|
+
allEdges: MonographEdge[];
|
|
6
|
+
parseErrors: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare const parsePhase: PipelinePhase<ParseOutput>;
|
|
9
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/phases/parse.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAMnE,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,eAAO,MAAM,UAAU,EAAE,aAAa,CAAC,WAAW,CA8CjD,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { readFileSync, statSync } from 'fs';
|
|
2
|
+
import { extname } from 'path';
|
|
3
|
+
import { parseFile } from '../../parsers/loader.js';
|
|
4
|
+
import { insertNodes } from '../../storage/node-store.js';
|
|
5
|
+
import { insertEdges } from '../../storage/edge-store.js';
|
|
6
|
+
export const parsePhase = {
|
|
7
|
+
name: 'parse',
|
|
8
|
+
deps: ['structure'],
|
|
9
|
+
async execute(ctx, deps) {
|
|
10
|
+
const { fileNodes } = deps.get('structure');
|
|
11
|
+
const symbolNodes = [];
|
|
12
|
+
const allEdges = [];
|
|
13
|
+
const parseErrors = [];
|
|
14
|
+
let processed = 0;
|
|
15
|
+
for (const fileNode of fileNodes) {
|
|
16
|
+
const absPath = fileNode.filePath ? `${ctx.repoPath}/${fileNode.filePath}` : '';
|
|
17
|
+
const ext = extname(absPath).toLowerCase();
|
|
18
|
+
let source;
|
|
19
|
+
try {
|
|
20
|
+
const stat = statSync(absPath);
|
|
21
|
+
if (stat.size > ctx.options.maxFileSizeBytes) {
|
|
22
|
+
parseErrors.push(`${fileNode.filePath}: skipped (too large)`);
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
source = readFileSync(absPath, 'utf-8');
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const result = await parseFile(absPath, source, fileNode.filePath ?? '');
|
|
31
|
+
symbolNodes.push(...result.nodes);
|
|
32
|
+
allEdges.push(...result.edges);
|
|
33
|
+
parseErrors.push(...result.parseErrors);
|
|
34
|
+
processed++;
|
|
35
|
+
if (processed % 50 === 0) {
|
|
36
|
+
ctx.onProgress?.({ phase: 'parse', filesProcessed: processed, totalFiles: fileNodes.length });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (ctx.db) {
|
|
40
|
+
insertNodes(ctx.db, symbolNodes);
|
|
41
|
+
// Only insert edges whose target already exists in the DB (intra-file edges).
|
|
42
|
+
// Cross-file import edges with unresolved targets are handled by crossFilePhase
|
|
43
|
+
// after it resolves them to real node IDs.
|
|
44
|
+
const knownIds = new Set(symbolNodes.map(n => n.id));
|
|
45
|
+
const resolvableEdges = allEdges.filter(e => knownIds.has(e.targetId));
|
|
46
|
+
insertEdges(ctx.db, resolvableEdges);
|
|
47
|
+
}
|
|
48
|
+
return { symbolNodes, allEdges, parseErrors };
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../../src/pipeline/phases/parse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAG/B,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAS1D,MAAM,CAAC,MAAM,UAAU,GAA+B;IACpD,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,CAAC,WAAW,CAAC;IACnB,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI;QACrB,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAoB,CAAC;QAC/D,MAAM,WAAW,GAAoB,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAoB,EAAE,CAAC;QACrC,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC3C,IAAI,MAAc,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC/B,IAAI,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;oBAC7C,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,QAAQ,uBAAuB,CAAC,CAAC;oBAC9D,SAAS;gBACX,CAAC;gBACD,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC;gBAAC,SAAS;YAAC,CAAC;YAErB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;YACzE,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAClC,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/B,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;YACxC,SAAS,EAAE,CAAC;YAEZ,IAAI,SAAS,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;gBACzB,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;YAChG,CAAC;QACH,CAAC;QAED,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;YACjC,8EAA8E;YAC9E,gFAAgF;YAChF,2CAA2C;YAC3C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACrD,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YACvE,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IAChD,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/phases/scan.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAgBlE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,SAAS,EAAE,aAAa,CAAC,UAAU,CAkC/C,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { readdirSync, statSync } from 'fs';
|
|
2
|
+
import { join, extname } from 'path';
|
|
3
|
+
import { isSupportedExtension } from '../../parsers/loader.js';
|
|
4
|
+
const DEFAULT_IGNORE = new Set([
|
|
5
|
+
'node_modules', '.git', 'dist', 'build', '__pycache__',
|
|
6
|
+
'.cache', 'coverage', '.monomind', 'vendor', 'target',
|
|
7
|
+
]);
|
|
8
|
+
const BINARY_EXTENSIONS = new Set([
|
|
9
|
+
'.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico', '.woff', '.woff2',
|
|
10
|
+
'.ttf', '.eot', '.mp3', '.mp4', '.zip', '.gz', '.tar', '.pdf',
|
|
11
|
+
'.exe', '.dll', '.so', '.dylib', '.class', '.jar',
|
|
12
|
+
]);
|
|
13
|
+
const GENERATED_PATTERNS = [/\.min\.(js|css)$/, /\.pb\.go$/, /_generated\.ts$/];
|
|
14
|
+
export const scanPhase = {
|
|
15
|
+
name: 'scan',
|
|
16
|
+
deps: [],
|
|
17
|
+
async execute(ctx) {
|
|
18
|
+
const filePaths = [];
|
|
19
|
+
let totalBytes = 0;
|
|
20
|
+
const ignoreDirs = new Set([...DEFAULT_IGNORE, ...ctx.options.ignore]);
|
|
21
|
+
function walk(dir) {
|
|
22
|
+
let entries;
|
|
23
|
+
try {
|
|
24
|
+
entries = readdirSync(dir);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
for (const entry of entries) {
|
|
30
|
+
if (ignoreDirs.has(entry))
|
|
31
|
+
continue;
|
|
32
|
+
const fullPath = join(dir, entry);
|
|
33
|
+
let stat;
|
|
34
|
+
try {
|
|
35
|
+
stat = statSync(fullPath);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (stat.isDirectory()) {
|
|
41
|
+
walk(fullPath);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const ext = extname(entry).toLowerCase();
|
|
45
|
+
if (BINARY_EXTENSIONS.has(ext))
|
|
46
|
+
continue;
|
|
47
|
+
if (GENERATED_PATTERNS.some(r => r.test(entry)))
|
|
48
|
+
continue;
|
|
49
|
+
if (ctx.options.codeOnly && !isSupportedExtension(ext))
|
|
50
|
+
continue;
|
|
51
|
+
filePaths.push(fullPath);
|
|
52
|
+
totalBytes += stat.size;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
walk(ctx.repoPath);
|
|
56
|
+
ctx.onProgress?.({ phase: 'scan', totalFiles: filePaths.length });
|
|
57
|
+
return { filePaths, totalBytes };
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../../src/pipeline/phases/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PipelinePhase } from '../types.js';
|
|
2
|
+
import type { MonographNode, MonographEdge } from '../../types.js';
|
|
3
|
+
export interface StructureOutput {
|
|
4
|
+
fileNodes: MonographNode[];
|
|
5
|
+
folderNodes: MonographNode[];
|
|
6
|
+
containsEdges: MonographEdge[];
|
|
7
|
+
}
|
|
8
|
+
export declare const structurePhase: PipelinePhase<StructureOutput>;
|
|
9
|
+
//# sourceMappingURL=structure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/phases/structure.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAInE,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,aAAa,EAAE,aAAa,EAAE,CAAC;CAChC;AAED,eAAO,MAAM,cAAc,EAAE,aAAa,CAAC,eAAe,CAuDzD,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { relative, dirname, basename } from 'path';
|
|
2
|
+
import { makeId, toNormLabel, CONFIDENCE_SCORE } from '../../types.js';
|
|
3
|
+
export const structurePhase = {
|
|
4
|
+
name: 'structure',
|
|
5
|
+
deps: ['scan'],
|
|
6
|
+
async execute(ctx, deps) {
|
|
7
|
+
const { filePaths } = deps.get('scan');
|
|
8
|
+
const fileNodes = [];
|
|
9
|
+
const folderNodes = [];
|
|
10
|
+
const containsEdges = [];
|
|
11
|
+
const seenFolders = new Set();
|
|
12
|
+
for (const absPath of filePaths) {
|
|
13
|
+
const rel = relative(ctx.repoPath, absPath);
|
|
14
|
+
const fileId = makeId(rel.replace(/\//g, '_'), 'file');
|
|
15
|
+
fileNodes.push({
|
|
16
|
+
id: fileId, label: 'File',
|
|
17
|
+
name: basename(rel), normLabel: toNormLabel(basename(rel)),
|
|
18
|
+
filePath: rel, isExported: false,
|
|
19
|
+
});
|
|
20
|
+
const parts = dirname(rel).split('/');
|
|
21
|
+
let current = '';
|
|
22
|
+
let parentFolderId = null;
|
|
23
|
+
for (const part of parts) {
|
|
24
|
+
if (part === '.')
|
|
25
|
+
continue;
|
|
26
|
+
current = current ? `${current}/${part}` : part;
|
|
27
|
+
const folderId = makeId(current.replace(/\//g, '_'), 'folder');
|
|
28
|
+
if (!seenFolders.has(folderId)) {
|
|
29
|
+
seenFolders.add(folderId);
|
|
30
|
+
folderNodes.push({
|
|
31
|
+
id: folderId, label: 'Folder',
|
|
32
|
+
name: part, normLabel: toNormLabel(part),
|
|
33
|
+
filePath: current, isExported: false,
|
|
34
|
+
});
|
|
35
|
+
if (parentFolderId) {
|
|
36
|
+
containsEdges.push({
|
|
37
|
+
id: makeId(parentFolderId, folderId, 'contains'),
|
|
38
|
+
sourceId: parentFolderId, targetId: folderId,
|
|
39
|
+
relation: 'CONTAINS', confidence: 'EXTRACTED', confidenceScore: CONFIDENCE_SCORE.EXTRACTED,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
parentFolderId = folderId;
|
|
44
|
+
}
|
|
45
|
+
if (parentFolderId) {
|
|
46
|
+
containsEdges.push({
|
|
47
|
+
id: makeId(parentFolderId, fileId, 'contains'),
|
|
48
|
+
sourceId: parentFolderId, targetId: fileId,
|
|
49
|
+
relation: 'CONTAINS', confidence: 'EXTRACTED', confidenceScore: CONFIDENCE_SCORE.EXTRACTED,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return { fileNodes, folderNodes, containsEdges };
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=structure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structure.js","sourceRoot":"","sources":["../../../../src/pipeline/phases/structure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PipelinePhase } from '../types.js';
|
|
2
|
+
import type { SuggestedQuestion } from '../../types.js';
|
|
3
|
+
export interface SuggestOutput {
|
|
4
|
+
questions: SuggestedQuestion[];
|
|
5
|
+
}
|
|
6
|
+
export declare const suggestPhase: PipelinePhase<SuggestOutput>;
|
|
7
|
+
//# sourceMappingURL=suggest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/phases/suggest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAIxD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,iBAAiB,EAAE,CAAC;CAChC;AAED,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,aAAa,CA6DrD,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export const suggestPhase = {
|
|
2
|
+
name: 'suggest',
|
|
3
|
+
deps: ['parse', 'cross-file', 'mro', 'communities', 'god-nodes', 'surprises'],
|
|
4
|
+
async execute(_ctx, deps) {
|
|
5
|
+
const { allEdges, symbolNodes } = deps.get('parse');
|
|
6
|
+
const { memberships } = deps.get('communities');
|
|
7
|
+
const questions = [];
|
|
8
|
+
// Signal 1: ambiguous edges
|
|
9
|
+
for (const edge of allEdges) {
|
|
10
|
+
if (edge.confidence === 'AMBIGUOUS') {
|
|
11
|
+
questions.push({ type: 'ambiguous_edge', edge, reason: 'Dynamic dispatch or unresolved target' });
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
// Signal 2: bridge nodes
|
|
15
|
+
const nodeCommSet = new Map();
|
|
16
|
+
for (const edge of allEdges) {
|
|
17
|
+
const srcComm = memberships.get(edge.sourceId);
|
|
18
|
+
const tgtComm = memberships.get(edge.targetId);
|
|
19
|
+
if (srcComm !== undefined && tgtComm !== undefined && srcComm !== tgtComm) {
|
|
20
|
+
for (const [nid, comm] of [[edge.sourceId, srcComm], [edge.targetId, tgtComm]]) {
|
|
21
|
+
const s = nodeCommSet.get(nid) ?? new Set();
|
|
22
|
+
s.add(comm);
|
|
23
|
+
nodeCommSet.set(nid, s);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
for (const [nodeId, comms] of nodeCommSet) {
|
|
28
|
+
if (comms.size >= 2) {
|
|
29
|
+
const node = symbolNodes.find(n => n.id === nodeId);
|
|
30
|
+
if (!node)
|
|
31
|
+
continue;
|
|
32
|
+
const [commA, commB] = [...comms];
|
|
33
|
+
questions.push({ type: 'bridge_node', node, commA, commB });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Signal 3: verify_inferred
|
|
37
|
+
for (const edge of allEdges) {
|
|
38
|
+
if (edge.confidence === 'INFERRED') {
|
|
39
|
+
questions.push({ type: 'verify_inferred', edge, inferredFrom: 'type inference / alias resolution' });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Signal 4: isolated nodes
|
|
43
|
+
const connectedIds = new Set();
|
|
44
|
+
for (const e of allEdges) {
|
|
45
|
+
connectedIds.add(e.sourceId);
|
|
46
|
+
connectedIds.add(e.targetId);
|
|
47
|
+
}
|
|
48
|
+
const isolated = symbolNodes.filter(n => !connectedIds.has(n.id) && n.label !== 'File' && n.label !== 'Folder');
|
|
49
|
+
if (isolated.length > 0) {
|
|
50
|
+
questions.push({ type: 'isolated_nodes', nodes: isolated.slice(0, 10), reason: 'No edges found' });
|
|
51
|
+
}
|
|
52
|
+
const PRIORITY = {
|
|
53
|
+
bridge_node: 5, ambiguous_edge: 4, verify_inferred: 3, low_cohesion: 2, isolated_nodes: 1
|
|
54
|
+
};
|
|
55
|
+
questions.sort((a, b) => (PRIORITY[b.type] ?? 0) - (PRIORITY[a.type] ?? 0));
|
|
56
|
+
return { questions };
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=suggest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../../../src/pipeline/phases/suggest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PipelinePhase } from '../types.js';
|
|
2
|
+
import type { SurprisingConnection } from '../../types.js';
|
|
3
|
+
export interface SurprisesOutput {
|
|
4
|
+
surprises: SurprisingConnection[];
|
|
5
|
+
}
|
|
6
|
+
export declare const surprisesPhase: PipelinePhase<SurprisesOutput>;
|
|
7
|
+
//# sourceMappingURL=surprises.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surprises.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/phases/surprises.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAa3D,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAED,eAAO,MAAM,cAAc,EAAE,aAAa,CAAC,eAAe,CAmDzD,CAAC"}
|