sdl-mcp 0.12.2 → 0.12.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/config/sdlmcp.config.example.json +53 -8
- package/config/sdlmcp.config.schema.json +530 -106
- package/dist/.tsbuildinfo +1 -1
- package/dist/benchmark/external-manifest.d.ts +162 -0
- package/dist/benchmark/external-manifest.d.ts.map +1 -0
- package/dist/benchmark/external-manifest.js +336 -0
- package/dist/benchmark/external-manifest.js.map +1 -0
- package/dist/benchmark/external-runner.d.ts +100 -0
- package/dist/benchmark/external-runner.d.ts.map +1 -0
- package/dist/benchmark/external-runner.js +1171 -0
- package/dist/benchmark/external-runner.js.map +1 -0
- package/dist/benchmark/output-file.d.ts +3 -0
- package/dist/benchmark/output-file.d.ts.map +1 -0
- package/dist/benchmark/output-file.js +8 -0
- package/dist/benchmark/output-file.js.map +1 -0
- package/dist/cli/argParsing.d.ts.map +1 -1
- package/dist/cli/argParsing.js +6 -0
- package/dist/cli/argParsing.js.map +1 -1
- package/dist/cli/commands/benchmark.d.ts.map +1 -1
- package/dist/cli/commands/benchmark.js +3 -2
- package/dist/cli/commands/benchmark.js.map +1 -1
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +13 -7
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts +5 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +73 -3
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/serve.d.ts.map +1 -1
- package/dist/cli/commands/serve.js +2 -0
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/transport/http.d.ts +1 -35
- package/dist/cli/transport/http.d.ts.map +1 -1
- package/dist/cli/transport/http.js +151 -175
- package/dist/cli/transport/http.js.map +1 -1
- package/dist/cli/types.d.ts +1 -0
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/config/constants.d.ts +30 -0
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +30 -0
- package/dist/config/constants.js.map +1 -1
- package/dist/config/types.d.ts +53 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +62 -14
- package/dist/config/types.js.map +1 -1
- package/dist/db/ladybug-batching.d.ts +1 -0
- package/dist/db/ladybug-batching.d.ts.map +1 -1
- package/dist/db/ladybug-batching.js +1 -0
- package/dist/db/ladybug-batching.js.map +1 -1
- package/dist/db/ladybug-core.d.ts +3 -0
- package/dist/db/ladybug-core.d.ts.map +1 -1
- package/dist/db/ladybug-core.js +72 -2
- package/dist/db/ladybug-core.js.map +1 -1
- package/dist/db/ladybug-embeddings.d.ts +6 -1
- package/dist/db/ladybug-embeddings.d.ts.map +1 -1
- package/dist/db/ladybug-embeddings.js +6 -1
- package/dist/db/ladybug-embeddings.js.map +1 -1
- package/dist/db/ladybug-file-summaries.d.ts.map +1 -1
- package/dist/db/ladybug-file-summaries.js +23 -0
- package/dist/db/ladybug-file-summaries.js.map +1 -1
- package/dist/db/ladybug-queries.js +1 -1
- package/dist/db/ladybug-queries.js.map +1 -1
- package/dist/db/migrations/index.d.ts.map +1 -1
- package/dist/db/migrations/index.js +2 -0
- package/dist/db/migrations/index.js.map +1 -1
- package/dist/db/migrations/m007-copy-embeddings-to-symbol.d.ts +5 -9
- package/dist/db/migrations/m007-copy-embeddings-to-symbol.d.ts.map +1 -1
- package/dist/db/migrations/m007-copy-embeddings-to-symbol.js +24 -126
- package/dist/db/migrations/m007-copy-embeddings-to-symbol.js.map +1 -1
- package/dist/db/migrations/m021-remediate-symbol-embeddings.d.ts +5 -0
- package/dist/db/migrations/m021-remediate-symbol-embeddings.d.ts.map +1 -0
- package/dist/db/migrations/m021-remediate-symbol-embeddings.js +7 -0
- package/dist/db/migrations/m021-remediate-symbol-embeddings.js.map +1 -0
- package/dist/db/migrations/symbol-embedding-remediation.d.ts +57 -0
- package/dist/db/migrations/symbol-embedding-remediation.d.ts.map +1 -0
- package/dist/db/migrations/symbol-embedding-remediation.js +335 -0
- package/dist/db/migrations/symbol-embedding-remediation.js.map +1 -0
- package/dist/graph/layout/force-layout.d.ts +4 -0
- package/dist/graph/layout/force-layout.d.ts.map +1 -0
- package/dist/graph/layout/force-layout.js +127 -0
- package/dist/graph/layout/force-layout.js.map +1 -0
- package/dist/graph/layout/layout-service.d.ts +37 -0
- package/dist/graph/layout/layout-service.d.ts.map +1 -0
- package/dist/graph/layout/layout-service.js +172 -0
- package/dist/graph/layout/layout-service.js.map +1 -0
- package/dist/graph/layout/native-engine.d.ts +9 -0
- package/dist/graph/layout/native-engine.d.ts.map +1 -0
- package/dist/graph/layout/native-engine.js +59 -0
- package/dist/graph/layout/native-engine.js.map +1 -0
- package/dist/graph/layout/prng.d.ts +3 -0
- package/dist/graph/layout/prng.d.ts.map +1 -0
- package/dist/graph/layout/prng.js +19 -0
- package/dist/graph/layout/prng.js.map +1 -0
- package/dist/graph/layout/serializer.d.ts +3 -0
- package/dist/graph/layout/serializer.d.ts.map +1 -0
- package/dist/graph/layout/serializer.js +20 -0
- package/dist/graph/layout/serializer.js.map +1 -0
- package/dist/graph/layout/types.d.ts +30 -0
- package/dist/graph/layout/types.d.ts.map +1 -0
- package/dist/graph/layout/types.js +2 -0
- package/dist/graph/layout/types.js.map +1 -0
- package/dist/indexer/embeddings.d.ts +7 -0
- package/dist/indexer/embeddings.d.ts.map +1 -1
- package/dist/indexer/embeddings.js +44 -4
- package/dist/indexer/embeddings.js.map +1 -1
- package/dist/indexer/file-summary-embeddings.d.ts +12 -0
- package/dist/indexer/file-summary-embeddings.d.ts.map +1 -1
- package/dist/indexer/file-summary-embeddings.js +83 -21
- package/dist/indexer/file-summary-embeddings.js.map +1 -1
- package/dist/indexer/fileWalker.d.ts.map +1 -1
- package/dist/indexer/fileWalker.js +2 -1
- package/dist/indexer/fileWalker.js.map +1 -1
- package/dist/indexer/metrics-updater.d.ts.map +1 -1
- package/dist/indexer/metrics-updater.js +27 -4
- package/dist/indexer/metrics-updater.js.map +1 -1
- package/dist/indexer/watcher.d.ts.map +1 -1
- package/dist/indexer/watcher.js +2 -1
- package/dist/indexer/watcher.js.map +1 -1
- package/dist/mcp/context-response-projection.d.ts.map +1 -1
- package/dist/mcp/context-response-projection.js +49 -13
- package/dist/mcp/context-response-projection.js.map +1 -1
- package/dist/mcp/tools/search-edit/planner.d.ts.map +1 -1
- package/dist/mcp/tools/search-edit/planner.js +10 -3
- package/dist/mcp/tools/search-edit/planner.js.map +1 -1
- package/dist/observability/event-tap.d.ts +2 -1
- package/dist/observability/event-tap.d.ts.map +1 -1
- package/dist/observability/event-tap.js.map +1 -1
- package/dist/observability/service.d.ts +11 -4
- package/dist/observability/service.d.ts.map +1 -1
- package/dist/observability/service.js +83 -13
- package/dist/observability/service.js.map +1 -1
- package/dist/observability/types.d.ts +48 -2
- package/dist/observability/types.d.ts.map +1 -1
- package/dist/ui/.tsbuildinfo +1 -0
- package/dist/ui/vendor/fflate.js +2692 -0
- package/dist/ui/vendor/jsm/controls/ArcballControls.js +3543 -0
- package/dist/ui/vendor/jsm/controls/DragControls.js +452 -0
- package/dist/ui/vendor/jsm/controls/FirstPersonControls.js +488 -0
- package/dist/ui/vendor/jsm/controls/FlyControls.js +384 -0
- package/dist/ui/vendor/jsm/controls/MapControls.js +116 -0
- package/dist/ui/vendor/jsm/controls/OrbitControls.js +1963 -0
- package/dist/ui/vendor/jsm/controls/PointerLockControls.js +264 -0
- package/dist/ui/vendor/jsm/controls/TrackballControls.js +1001 -0
- package/dist/ui/vendor/jsm/controls/TransformControls.js +2003 -0
- package/dist/ui/vendor/jsm/loaders/3DMLoader.js +1836 -0
- package/dist/ui/vendor/jsm/loaders/3MFLoader.js +1621 -0
- package/dist/ui/vendor/jsm/loaders/AMFLoader.js +541 -0
- package/dist/ui/vendor/jsm/loaders/BVHLoader.js +484 -0
- package/dist/ui/vendor/jsm/loaders/ColladaLoader.js +153 -0
- package/dist/ui/vendor/jsm/loaders/DDSLoader.js +385 -0
- package/dist/ui/vendor/jsm/loaders/DRACOLoader.js +772 -0
- package/dist/ui/vendor/jsm/loaders/EXRLoader.js +3395 -0
- package/dist/ui/vendor/jsm/loaders/FBXLoader.js +4580 -0
- package/dist/ui/vendor/jsm/loaders/FontLoader.js +260 -0
- package/dist/ui/vendor/jsm/loaders/GCodeLoader.js +318 -0
- package/dist/ui/vendor/jsm/loaders/GLTFLoader.js +4860 -0
- package/dist/ui/vendor/jsm/loaders/HDRCubeTextureLoader.js +164 -0
- package/dist/ui/vendor/jsm/loaders/HDRLoader.js +463 -0
- package/dist/ui/vendor/jsm/loaders/IESLoader.js +379 -0
- package/dist/ui/vendor/jsm/loaders/KMZLoader.js +163 -0
- package/dist/ui/vendor/jsm/loaders/KTX2Loader.js +1276 -0
- package/dist/ui/vendor/jsm/loaders/KTXLoader.js +197 -0
- package/dist/ui/vendor/jsm/loaders/LDrawLoader.js +2510 -0
- package/dist/ui/vendor/jsm/loaders/LUT3dlLoader.js +205 -0
- package/dist/ui/vendor/jsm/loaders/LUTCubeLoader.js +190 -0
- package/dist/ui/vendor/jsm/loaders/LUTImageLoader.js +190 -0
- package/dist/ui/vendor/jsm/loaders/LWOLoader.js +1051 -0
- package/dist/ui/vendor/jsm/loaders/LottieLoader.js +130 -0
- package/dist/ui/vendor/jsm/loaders/MD2Loader.js +435 -0
- package/dist/ui/vendor/jsm/loaders/MDDLoader.js +147 -0
- package/dist/ui/vendor/jsm/loaders/MTLLoader.js +593 -0
- package/dist/ui/vendor/jsm/loaders/MaterialXLoader.js +1126 -0
- package/dist/ui/vendor/jsm/loaders/NRRDLoader.js +718 -0
- package/dist/ui/vendor/jsm/loaders/OBJLoader.js +955 -0
- package/dist/ui/vendor/jsm/loaders/PCDLoader.js +620 -0
- package/dist/ui/vendor/jsm/loaders/PDBLoader.js +272 -0
- package/dist/ui/vendor/jsm/loaders/PLYLoader.js +968 -0
- package/dist/ui/vendor/jsm/loaders/PVRLoader.js +270 -0
- package/dist/ui/vendor/jsm/loaders/RGBELoader.js +18 -0
- package/dist/ui/vendor/jsm/loaders/STLLoader.js +421 -0
- package/dist/ui/vendor/jsm/loaders/SVGLoader.js +3319 -0
- package/dist/ui/vendor/jsm/loaders/TDSLoader.js +1142 -0
- package/dist/ui/vendor/jsm/loaders/TGALoader.js +538 -0
- package/dist/ui/vendor/jsm/loaders/TIFFLoader.js +59 -0
- package/dist/ui/vendor/jsm/loaders/TTFLoader.js +261 -0
- package/dist/ui/vendor/jsm/loaders/USDLoader.js +303 -0
- package/dist/ui/vendor/jsm/loaders/USDZLoader.js +16 -0
- package/dist/ui/vendor/jsm/loaders/UltraHDRLoader.js +755 -0
- package/dist/ui/vendor/jsm/loaders/VOXLoader.js +919 -0
- package/dist/ui/vendor/jsm/loaders/VRMLLoader.js +3646 -0
- package/dist/ui/vendor/jsm/loaders/VTKLoader.js +1293 -0
- package/dist/ui/vendor/jsm/loaders/XYZLoader.js +143 -0
- package/dist/ui/vendor/jsm/loaders/collada/ColladaComposer.js +3044 -0
- package/dist/ui/vendor/jsm/loaders/collada/ColladaParser.js +1977 -0
- package/dist/ui/vendor/jsm/loaders/lwo/IFFParser.js +1217 -0
- package/dist/ui/vendor/jsm/loaders/lwo/LWO2Parser.js +414 -0
- package/dist/ui/vendor/jsm/loaders/lwo/LWO3Parser.js +373 -0
- package/dist/ui/vendor/jsm/loaders/usd/USDAParser.js +901 -0
- package/dist/ui/vendor/jsm/loaders/usd/USDCParser.js +1878 -0
- package/dist/ui/vendor/jsm/loaders/usd/USDComposer.js +4627 -0
- package/dist/ui/vendor/jsm/utils/BufferGeometryUtils.js +1501 -0
- package/dist/ui/vendor/jsm/utils/CameraUtils.js +82 -0
- package/dist/ui/vendor/jsm/utils/ColorUtils.js +76 -0
- package/dist/ui/vendor/jsm/utils/GeometryCompressionUtils.js +547 -0
- package/dist/ui/vendor/jsm/utils/GeometryUtils.js +226 -0
- package/dist/ui/vendor/jsm/utils/LDrawUtils.js +211 -0
- package/dist/ui/vendor/jsm/utils/SceneOptimizer.js +458 -0
- package/dist/ui/vendor/jsm/utils/SceneUtils.js +363 -0
- package/dist/ui/vendor/jsm/utils/ShadowMapViewer.js +244 -0
- package/dist/ui/vendor/jsm/utils/ShadowMapViewerGPU.js +233 -0
- package/dist/ui/vendor/jsm/utils/SkeletonUtils.js +496 -0
- package/dist/ui/vendor/jsm/utils/SortUtils.js +175 -0
- package/dist/ui/vendor/jsm/utils/UVsDebug.js +173 -0
- package/dist/ui/vendor/jsm/utils/WebGLTextureUtils.js +115 -0
- package/dist/ui/vendor/jsm/utils/WebGPUTextureUtils.js +81 -0
- package/dist/ui/vendor/jsm/utils/WorkerPool.js +167 -0
- package/dist/ui/vendor/three.core.min.js +6 -0
- package/dist/ui/vendor/three.module.min.js +6 -0
- package/dist/ui/viewer/ambient.js +39 -0
- package/dist/ui/viewer/api.js +93 -0
- package/dist/ui/viewer/chrome.js +36 -0
- package/dist/ui/viewer/edges.js +33 -0
- package/dist/ui/viewer/index.html +32 -0
- package/dist/ui/viewer/inspector.js +23 -0
- package/dist/ui/viewer/lenses/activity.js +24 -0
- package/dist/ui/viewer/lenses/community.js +5 -0
- package/dist/ui/viewer/lenses/edges.js +4 -0
- package/dist/ui/viewer/lenses/impact.js +6 -0
- package/dist/ui/viewer/lenses/search.js +69 -0
- package/dist/ui/viewer/lod.js +100 -0
- package/dist/ui/viewer/main.js +92 -0
- package/dist/ui/viewer/picking.js +45 -0
- package/dist/ui/viewer/scene.js +85 -0
- package/dist/ui/viewer/skins/default-skin.js +15 -0
- package/dist/ui/viewer/skins/loader.js +44 -0
- package/dist/ui/viewer/skins/manifest-schema.js +30 -0
- package/dist/ui/viewer/state.js +44 -0
- package/dist/ui/viewer/theme.js +23 -0
- package/dist/ui/viewer/universe.js +151 -0
- package/dist/ui/viewer/viewer.css +85 -0
- package/dist/util/safeRegex.d.ts.map +1 -1
- package/dist/util/safeRegex.js +221 -68
- package/dist/util/safeRegex.js.map +1 -1
- package/dist/viewer/legacy-graph.d.ts +40 -0
- package/dist/viewer/legacy-graph.d.ts.map +1 -0
- package/dist/viewer/legacy-graph.js +152 -0
- package/dist/viewer/legacy-graph.js.map +1 -0
- package/dist/viewer/routes.d.ts +10 -0
- package/dist/viewer/routes.d.ts.map +1 -0
- package/dist/viewer/routes.js +221 -0
- package/dist/viewer/routes.js.map +1 -0
- package/dist/viewer/service.d.ts +44 -0
- package/dist/viewer/service.d.ts.map +1 -0
- package/dist/viewer/service.js +160 -0
- package/dist/viewer/service.js.map +1 -0
- package/dist/viewer/types.d.ts +63 -0
- package/dist/viewer/types.d.ts.map +1 -0
- package/dist/viewer/types.js +2 -0
- package/dist/viewer/types.js.map +1 -0
- package/dist/viewer/viewer-config.d.ts +12 -0
- package/dist/viewer/viewer-config.d.ts.map +1 -0
- package/dist/viewer/viewer-config.js +36 -0
- package/dist/viewer/viewer-config.js.map +1 -0
- package/package.json +18 -9
- package/templates/SDL.md +19 -0
- package/templates/claude-code.json +8 -43
- package/dist/ui/graph.css +0 -108
- package/dist/ui/graph.d.ts +0 -2
- package/dist/ui/graph.d.ts.map +0 -1
- package/dist/ui/graph.html +0 -52
- package/dist/ui/graph.js +0 -259
- package/dist/ui/graph.js.map +0 -1
package/dist/util/safeRegex.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { ConfigError } from "../domain/errors.js";
|
|
1
2
|
import { logger } from "./logger.js";
|
|
3
|
+
import { normalizePath } from "./paths.js";
|
|
2
4
|
/**
|
|
3
5
|
* Detects if a regex pattern has ReDoS (Regular Expression Denial of Service) risks.
|
|
4
6
|
* Checks for:
|
|
@@ -72,6 +74,218 @@ export function safeCompileRegex(pattern, flags) {
|
|
|
72
74
|
return null;
|
|
73
75
|
}
|
|
74
76
|
}
|
|
77
|
+
function escapeRegexLiteral(value) {
|
|
78
|
+
return value.replace(/[.*+?^$()|[\]{}\\]/g, (match) => "\\" + match);
|
|
79
|
+
}
|
|
80
|
+
function escapeRegexClassMember(value) {
|
|
81
|
+
if (value === "\\" || value === "]" || value === "-" || value === "^") {
|
|
82
|
+
return "\\" + value;
|
|
83
|
+
}
|
|
84
|
+
return value;
|
|
85
|
+
}
|
|
86
|
+
function findUnescapedClassEnd(glob, startIndex) {
|
|
87
|
+
let escaped = false;
|
|
88
|
+
for (let index = startIndex + 1; index < glob.length; index++) {
|
|
89
|
+
const value = glob[index];
|
|
90
|
+
if (escaped) {
|
|
91
|
+
escaped = false;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (value === "\\") {
|
|
95
|
+
escaped = true;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (value === "]") {
|
|
99
|
+
return index;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return -1;
|
|
103
|
+
}
|
|
104
|
+
function asciiRangeKind(value) {
|
|
105
|
+
const code = value.charCodeAt(0);
|
|
106
|
+
if (value.length !== 1)
|
|
107
|
+
return null;
|
|
108
|
+
if (code >= 48 && code <= 57)
|
|
109
|
+
return "digit";
|
|
110
|
+
if (code >= 65 && code <= 90)
|
|
111
|
+
return "upper";
|
|
112
|
+
if (code >= 97 && code <= 122)
|
|
113
|
+
return "lower";
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
function invalidClass(glob, startIndex, reason) {
|
|
117
|
+
throw new ConfigError("Invalid ignore glob bracket class at index " +
|
|
118
|
+
startIndex +
|
|
119
|
+
' in "' +
|
|
120
|
+
glob +
|
|
121
|
+
'": ' +
|
|
122
|
+
reason);
|
|
123
|
+
}
|
|
124
|
+
function compileSafeBracketClass(glob, startIndex) {
|
|
125
|
+
const endIndex = findUnescapedClassEnd(glob, startIndex);
|
|
126
|
+
if (endIndex === -1)
|
|
127
|
+
return null;
|
|
128
|
+
const body = glob.slice(startIndex + 1, endIndex);
|
|
129
|
+
if (body.length === 0) {
|
|
130
|
+
invalidClass(glob, startIndex, "class has no members");
|
|
131
|
+
}
|
|
132
|
+
if (body[0] === "!" || body[0] === "^") {
|
|
133
|
+
invalidClass(glob, startIndex, "class negation is unsupported");
|
|
134
|
+
}
|
|
135
|
+
const bodyCodePoints = Array.from(body);
|
|
136
|
+
const tokens = [];
|
|
137
|
+
for (let index = 0; index < bodyCodePoints.length; index++) {
|
|
138
|
+
const value = bodyCodePoints[index];
|
|
139
|
+
if (value === "[") {
|
|
140
|
+
invalidClass(glob, startIndex, "nested opening bracket is unsupported");
|
|
141
|
+
}
|
|
142
|
+
if (value !== "\\") {
|
|
143
|
+
tokens.push({ value, escaped: false });
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
const escaped = bodyCodePoints[index + 1];
|
|
147
|
+
if (escaped !== "]" && escaped !== "-" && escaped !== "\\") {
|
|
148
|
+
invalidClass(glob, startIndex, "unsupported escape; only \\], \\-, and \\\\ are allowed");
|
|
149
|
+
}
|
|
150
|
+
tokens.push({ value: escaped, escaped: true });
|
|
151
|
+
index++;
|
|
152
|
+
}
|
|
153
|
+
// Validate ranges ourselves so RegExp never receives an ambiguous hyphen.
|
|
154
|
+
const rangeEndpoints = new Set();
|
|
155
|
+
const pieces = [];
|
|
156
|
+
for (let index = 1; index < tokens.length - 1; index++) {
|
|
157
|
+
const token = tokens[index];
|
|
158
|
+
if (token.value !== "-" || token.escaped)
|
|
159
|
+
continue;
|
|
160
|
+
const left = tokens[index - 1];
|
|
161
|
+
const right = tokens[index + 1];
|
|
162
|
+
if (rangeEndpoints.has(index - 1) || rangeEndpoints.has(index + 1)) {
|
|
163
|
+
invalidClass(glob, startIndex, "range endpoints cannot be reused");
|
|
164
|
+
}
|
|
165
|
+
const leftKind = asciiRangeKind(left.value);
|
|
166
|
+
const rightKind = asciiRangeKind(right.value);
|
|
167
|
+
if (leftKind === null || rightKind === null) {
|
|
168
|
+
invalidClass(glob, startIndex, "range endpoints must be ASCII letters or digits");
|
|
169
|
+
}
|
|
170
|
+
if (leftKind !== rightKind) {
|
|
171
|
+
invalidClass(glob, startIndex, "range endpoints must use the same ASCII category and case");
|
|
172
|
+
}
|
|
173
|
+
if (left.value.charCodeAt(0) > right.value.charCodeAt(0)) {
|
|
174
|
+
invalidClass(glob, startIndex, "range is reversed");
|
|
175
|
+
}
|
|
176
|
+
pieces.push(left.value + "-" + right.value);
|
|
177
|
+
rangeEndpoints.add(index - 1);
|
|
178
|
+
rangeEndpoints.add(index + 1);
|
|
179
|
+
}
|
|
180
|
+
for (let index = 0; index < tokens.length; index++) {
|
|
181
|
+
const token = tokens[index];
|
|
182
|
+
if (token.value === "-" && !token.escaped) {
|
|
183
|
+
if (index === 0 || index === tokens.length - 1) {
|
|
184
|
+
pieces.push("\\-");
|
|
185
|
+
}
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
if (!rangeEndpoints.has(index)) {
|
|
189
|
+
pieces.push(escapeRegexClassMember(token.value));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
source: "[" + pieces.join("") + "]",
|
|
194
|
+
nextIndex: endIndex + 1,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
function normalizeGlobPreservingClasses(glob) {
|
|
198
|
+
const classes = [];
|
|
199
|
+
let sentinel = "\u{E000}";
|
|
200
|
+
while (glob.includes(sentinel))
|
|
201
|
+
sentinel += "\u{E000}";
|
|
202
|
+
const literalOpenMarker = sentinel + "open" + sentinel;
|
|
203
|
+
let masked = "";
|
|
204
|
+
// Mask class substrings so normalizePath only consumes ordinary separators.
|
|
205
|
+
for (let index = 0; index < glob.length;) {
|
|
206
|
+
if (glob[index] === "[") {
|
|
207
|
+
const endIndex = findUnescapedClassEnd(glob, index);
|
|
208
|
+
if (endIndex !== -1) {
|
|
209
|
+
const marker = sentinel + classes.length + sentinel;
|
|
210
|
+
classes.push(glob.slice(index, endIndex + 1));
|
|
211
|
+
masked += marker;
|
|
212
|
+
index = endIndex + 1;
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
masked += literalOpenMarker;
|
|
216
|
+
index++;
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
const value = String.fromCodePoint(glob.codePointAt(index));
|
|
220
|
+
masked += value;
|
|
221
|
+
index += value.length;
|
|
222
|
+
}
|
|
223
|
+
let normalized = normalizePath(masked);
|
|
224
|
+
for (let index = 0; index < classes.length; index++) {
|
|
225
|
+
normalized = normalized.replaceAll(sentinel + index + sentinel, classes[index]);
|
|
226
|
+
}
|
|
227
|
+
return { normalizedGlob: normalized, literalOpenMarker };
|
|
228
|
+
}
|
|
229
|
+
function compileGlobBody(glob, literalOpenMarker) {
|
|
230
|
+
const source = [];
|
|
231
|
+
let currentSegmentHasWildcard = false;
|
|
232
|
+
for (let index = 0; index < glob.length;) {
|
|
233
|
+
const value = glob[index];
|
|
234
|
+
if (glob.startsWith(literalOpenMarker, index)) {
|
|
235
|
+
source.push("\\[");
|
|
236
|
+
index += literalOpenMarker.length;
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
if (value === "[") {
|
|
240
|
+
const compiledClass = compileSafeBracketClass(glob, index);
|
|
241
|
+
if (compiledClass !== null) {
|
|
242
|
+
source.push(compiledClass.source);
|
|
243
|
+
currentSegmentHasWildcard = true;
|
|
244
|
+
index = compiledClass.nextIndex;
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
source.push("\\[");
|
|
248
|
+
index++;
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
if (glob.startsWith("**/", index) ||
|
|
252
|
+
glob.startsWith("**\\", index)) {
|
|
253
|
+
source.push("(?:.*/|)");
|
|
254
|
+
currentSegmentHasWildcard = false;
|
|
255
|
+
index += 3;
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
if ((value === "/" || value === "\\") &&
|
|
259
|
+
glob.startsWith("**", index + 1) &&
|
|
260
|
+
index + 3 === glob.length) {
|
|
261
|
+
source.push(currentSegmentHasWildcard ? "(?:/.*)" : "(?:/.*|)");
|
|
262
|
+
index += 3;
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
if (glob.startsWith("**", index)) {
|
|
266
|
+
source.push(".*");
|
|
267
|
+
currentSegmentHasWildcard = true;
|
|
268
|
+
index += 2;
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
if (value === "*") {
|
|
272
|
+
source.push("[^/]*");
|
|
273
|
+
currentSegmentHasWildcard = true;
|
|
274
|
+
index++;
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
if (value === "/" || value === "\\") {
|
|
278
|
+
source.push("/");
|
|
279
|
+
currentSegmentHasWildcard = false;
|
|
280
|
+
index++;
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
const codePoint = String.fromCodePoint(glob.codePointAt(index));
|
|
284
|
+
source.push(escapeRegexLiteral(codePoint));
|
|
285
|
+
index += codePoint.length;
|
|
286
|
+
}
|
|
287
|
+
return source.join("");
|
|
288
|
+
}
|
|
75
289
|
/**
|
|
76
290
|
* Converts a glob pattern to a safe regex.
|
|
77
291
|
* Handles:
|
|
@@ -83,75 +297,14 @@ export function safeCompileRegex(pattern, flags) {
|
|
|
83
297
|
* @returns RegExp object anchored with ^ and $
|
|
84
298
|
*/
|
|
85
299
|
export function globToSafeRegex(glob) {
|
|
86
|
-
// Guard
|
|
87
|
-
// so we short-circuit early and avoid unnecessary work (H2).
|
|
300
|
+
// Guard raw input before parsing or normalization can reduce its complexity.
|
|
88
301
|
const doubleStarCount = (glob.match(/\*\*/g) || []).length;
|
|
89
302
|
if (doubleStarCount > 5 || glob.length > 500) {
|
|
90
|
-
logger.warn(
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
.replace(/\+/g, "\\+") // plus
|
|
97
|
-
.replace(/\?/g, "\\?") // question mark
|
|
98
|
-
.replace(/\*/g, "\\*") // star
|
|
99
|
-
.replace(/\^/g, "\\^") // caret
|
|
100
|
-
.replace(/\$/g, "\\$") // dollar
|
|
101
|
-
.replace(/\|/g, "\\|") // pipe
|
|
102
|
-
.replace(/\(/g, "\\(") // left paren
|
|
103
|
-
.replace(/\)/g, "\\)") // right paren
|
|
104
|
-
.replace(/\[/g, "\\[") // left bracket
|
|
105
|
-
.replace(/\]/g, "\\]") // right bracket
|
|
106
|
-
.replace(/\{/g, "\\{") // left brace
|
|
107
|
-
.replace(/\}/g, "\\}"); // right brace
|
|
108
|
-
return new RegExp(`^${litEscaped}$`);
|
|
109
|
-
}
|
|
110
|
-
const trailingDirectorySegment = glob.endsWith("/**")
|
|
111
|
-
? (glob.slice(0, -"/**".length).split("/").pop() ?? "")
|
|
112
|
-
: "";
|
|
113
|
-
const trailingDirectorySegmentHasWildcard = trailingDirectorySegment.includes("*");
|
|
114
|
-
// First, handle glob wildcards with placeholders to protect them
|
|
115
|
-
// **/ must be handled before ** to avoid double-replacement
|
|
116
|
-
let pattern = glob.replace(/\*\*\//g, "GLOB_DOUBLESTAR_SLASH");
|
|
117
|
-
pattern = pattern.replace(/\*\*/g, "GLOB_DOUBLESTAR");
|
|
118
|
-
pattern = pattern.replace(/\*/g, "GLOB_SINGLESTAR");
|
|
119
|
-
// Now escape all regex metacharacters
|
|
120
|
-
// Order matters: \ must be first
|
|
121
|
-
pattern = pattern
|
|
122
|
-
.replace(/\\/g, "\\\\") // backslash
|
|
123
|
-
.replace(/\./g, "\\.") // dot
|
|
124
|
-
.replace(/\+/g, "\\+") // plus
|
|
125
|
-
.replace(/\?/g, "\\?") // question mark
|
|
126
|
-
.replace(/\(/g, "\\(") // left paren
|
|
127
|
-
.replace(/\)/g, "\\)") // right paren
|
|
128
|
-
.replace(/\[/g, "\\[") // left bracket
|
|
129
|
-
.replace(/\]/g, "\\]") // right bracket
|
|
130
|
-
.replace(/\{/g, "\\{") // left brace
|
|
131
|
-
.replace(/\}/g, "\\}") // right brace
|
|
132
|
-
.replace(/\^/g, "\\^") // caret
|
|
133
|
-
.replace(/\$/g, "\\$") // dollar
|
|
134
|
-
.replace(/\|/g, "\\|"); // pipe
|
|
135
|
-
// Replace placeholders with regex equivalents
|
|
136
|
-
// **/ matches zero or more path segments (including the trailing /)
|
|
137
|
-
pattern = pattern.replace(/GLOB_DOUBLESTAR_SLASH/g, "(?:.*/)?");
|
|
138
|
-
// * matches anything except /
|
|
139
|
-
pattern = pattern.replace(/GLOB_SINGLESTAR/g, "[^/]*");
|
|
140
|
-
// Trailing /** should match directory contents. Exact directory globs also
|
|
141
|
-
// match the directory itself; wildcard directory globs need a slash boundary
|
|
142
|
-
// so **/dist-*/** does not match source files named dist-runtime.ts.
|
|
143
|
-
// Handle /GLOB_DOUBLESTAR at end (the / was already escaped to /)
|
|
144
|
-
if (pattern.endsWith("/GLOB_DOUBLESTAR")) {
|
|
145
|
-
const suffix = trailingDirectorySegmentHasWildcard ? "(?:/.*)" : "(?:/.*)?";
|
|
146
|
-
pattern = pattern.slice(0, -"/GLOB_DOUBLESTAR".length) + suffix;
|
|
147
|
-
}
|
|
148
|
-
else if (pattern.endsWith("GLOB_DOUBLESTAR")) {
|
|
149
|
-
// Bare trailing ** (no preceding /)
|
|
150
|
-
pattern = pattern.slice(0, -"GLOB_DOUBLESTAR".length) + ".*";
|
|
151
|
-
}
|
|
152
|
-
// Non-trailing ** matches anything including /
|
|
153
|
-
pattern = pattern.replace(/GLOB_DOUBLESTAR/g, ".*");
|
|
154
|
-
// Anchor the pattern
|
|
155
|
-
return new RegExp(`^${pattern}$`);
|
|
303
|
+
logger.warn("Overly complex glob pattern rejected: " + glob);
|
|
304
|
+
const normalizedLiteral = normalizePath(glob);
|
|
305
|
+
return new RegExp("^" + escapeRegexLiteral(normalizedLiteral) + "$", "u");
|
|
306
|
+
}
|
|
307
|
+
const { normalizedGlob, literalOpenMarker } = normalizeGlobPreservingClasses(glob);
|
|
308
|
+
return new RegExp("^" + compileGlobBody(normalizedGlob, literalOpenMarker) + "$", "u");
|
|
156
309
|
}
|
|
157
310
|
//# sourceMappingURL=safeRegex.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safeRegex.js","sourceRoot":"","sources":["../../src/util/safeRegex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"safeRegex.js","sourceRoot":"","sources":["../../src/util/safeRegex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Connection } from "kuzu";
|
|
2
|
+
import * as ladybugDb from "../db/ladybug-queries.js";
|
|
3
|
+
export type GraphNode = {
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
kind: string;
|
|
7
|
+
file?: string;
|
|
8
|
+
fanIn?: number;
|
|
9
|
+
fanOut?: number;
|
|
10
|
+
size?: number;
|
|
11
|
+
cluster?: string;
|
|
12
|
+
};
|
|
13
|
+
export type GraphLink = {
|
|
14
|
+
source: string;
|
|
15
|
+
target: string;
|
|
16
|
+
type: string;
|
|
17
|
+
weight: number;
|
|
18
|
+
};
|
|
19
|
+
export declare function buildNeighborhood(conn: Connection, symbolId: string, maxNodes: number): Promise<{
|
|
20
|
+
nodes: GraphNode[];
|
|
21
|
+
links: GraphLink[];
|
|
22
|
+
}>;
|
|
23
|
+
declare function buildRepoPreview(conn: Connection, repoId: string, maxNodes: number): Promise<{
|
|
24
|
+
nodes: GraphNode[];
|
|
25
|
+
links: GraphLink[];
|
|
26
|
+
}>;
|
|
27
|
+
export declare function buildGraphForSliceHandle(conn: Connection, repoId: string, handle: string, maxNodes: number, deps?: {
|
|
28
|
+
getSliceHandle?: typeof ladybugDb.getSliceHandle;
|
|
29
|
+
buildRepoPreview?: typeof buildRepoPreview;
|
|
30
|
+
buildBlastRadiusGraph?: typeof buildBlastRadiusGraph;
|
|
31
|
+
}): Promise<{
|
|
32
|
+
nodes: GraphNode[];
|
|
33
|
+
links: GraphLink[];
|
|
34
|
+
} | null>;
|
|
35
|
+
export declare function buildBlastRadiusGraph(conn: Connection, repoId: string, fromVersion: string, toVersion: string, maxNodes: number): Promise<{
|
|
36
|
+
nodes: GraphNode[];
|
|
37
|
+
links: GraphLink[];
|
|
38
|
+
}>;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=legacy-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-graph.d.ts","sourceRoot":"","sources":["../../src/viewer/legacy-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAEvC,OAAO,KAAK,SAAS,MAAM,0BAA0B,CAAC;AAItD,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAwGF,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IACT,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB,CAAC,CAoBD;AAED,iBAAe,gBAAgB,CAC7B,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IACT,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB,CAAC,CAWD;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IACJ,cAAc,CAAC,EAAE,OAAO,SAAS,CAAC,cAAc,CAAC;IACjD,gBAAgB,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3C,qBAAqB,CAAC,EAAE,OAAO,qBAAqB,CAAC;CACjD,GACL,OAAO,CAAC;IACT,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB,GAAG,IAAI,CAAC,CAsBR;AAED,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAAC,KAAK,EAAE,SAAS,EAAE,CAAA;CAAE,CAAC,CA2BrD"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import * as ladybugDb from "../db/ladybug-queries.js";
|
|
2
|
+
import { computeDelta } from "../delta/diff.js";
|
|
3
|
+
import { runGovernorLoop } from "../delta/blastRadius.js";
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Graph visualization helpers
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
function toClusterPath(filePath) {
|
|
8
|
+
const slash = Math.max(filePath.lastIndexOf("/"), filePath.lastIndexOf("\\"));
|
|
9
|
+
if (slash === -1) {
|
|
10
|
+
return "root";
|
|
11
|
+
}
|
|
12
|
+
return filePath.slice(0, slash) || "root";
|
|
13
|
+
}
|
|
14
|
+
async function buildNodes(conn, symbolIds) {
|
|
15
|
+
const symbolMap = await ladybugDb.getSymbolsByIds(conn, symbolIds);
|
|
16
|
+
const metricsMap = await ladybugDb.getMetricsBySymbolIds(conn, symbolIds);
|
|
17
|
+
const fileIds = new Set();
|
|
18
|
+
for (const symbol of symbolMap.values()) {
|
|
19
|
+
fileIds.add(symbol.fileId);
|
|
20
|
+
}
|
|
21
|
+
const fileMap = await ladybugDb.getFilesByIds(conn, Array.from(fileIds));
|
|
22
|
+
const nodes = [];
|
|
23
|
+
for (const symbolId of symbolIds) {
|
|
24
|
+
const symbol = symbolMap.get(symbolId);
|
|
25
|
+
if (!symbol)
|
|
26
|
+
continue;
|
|
27
|
+
const file = fileMap.get(symbol.fileId);
|
|
28
|
+
const metrics = metricsMap.get(symbolId);
|
|
29
|
+
nodes.push({
|
|
30
|
+
id: symbolId,
|
|
31
|
+
label: symbol.name,
|
|
32
|
+
kind: symbol.kind,
|
|
33
|
+
file: file?.relPath,
|
|
34
|
+
fanIn: metrics?.fanIn,
|
|
35
|
+
fanOut: metrics?.fanOut,
|
|
36
|
+
size: Math.max(5, Math.min(40, (metrics?.fanIn ?? 0) + 6)),
|
|
37
|
+
cluster: toClusterPath(file?.relPath ?? ""),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return nodes;
|
|
41
|
+
}
|
|
42
|
+
async function buildLinksForNodes(conn, ids) {
|
|
43
|
+
const idList = Array.from(ids);
|
|
44
|
+
const edgeMap = await ladybugDb.getEdgesFromSymbolsForSlice(conn, idList);
|
|
45
|
+
const links = [];
|
|
46
|
+
for (const fromSymbolId of idList) {
|
|
47
|
+
const edges = edgeMap.get(fromSymbolId) ?? [];
|
|
48
|
+
for (const edge of edges) {
|
|
49
|
+
if (!ids.has(edge.toSymbolId))
|
|
50
|
+
continue;
|
|
51
|
+
links.push({
|
|
52
|
+
source: fromSymbolId,
|
|
53
|
+
target: edge.toSymbolId,
|
|
54
|
+
type: edge.edgeType,
|
|
55
|
+
weight: edge.weight,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return links;
|
|
60
|
+
}
|
|
61
|
+
function collapseClusters(nodes, maxChildrenPerCluster = 10) {
|
|
62
|
+
const byCluster = new Map();
|
|
63
|
+
for (const node of nodes) {
|
|
64
|
+
const key = node.cluster ?? "root";
|
|
65
|
+
const list = byCluster.get(key) ?? [];
|
|
66
|
+
list.push(node);
|
|
67
|
+
byCluster.set(key, list);
|
|
68
|
+
}
|
|
69
|
+
const collapsed = [];
|
|
70
|
+
for (const [cluster, list] of byCluster) {
|
|
71
|
+
if (list.length <= maxChildrenPerCluster) {
|
|
72
|
+
collapsed.push(...list);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const sorted = [...list].sort((a, b) => (b.fanIn ?? 0) - (a.fanIn ?? 0));
|
|
76
|
+
collapsed.push(...sorted.slice(0, maxChildrenPerCluster));
|
|
77
|
+
collapsed.push({
|
|
78
|
+
id: `cluster:${cluster}`,
|
|
79
|
+
label: `${cluster} (+${list.length - maxChildrenPerCluster})`,
|
|
80
|
+
kind: "module",
|
|
81
|
+
cluster,
|
|
82
|
+
size: 10,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return collapsed;
|
|
86
|
+
}
|
|
87
|
+
export async function buildNeighborhood(conn, symbolId, maxNodes) {
|
|
88
|
+
const ids = new Set();
|
|
89
|
+
ids.add(symbolId);
|
|
90
|
+
for (const edge of await ladybugDb.getEdgesFrom(conn, symbolId)) {
|
|
91
|
+
ids.add(edge.toSymbolId);
|
|
92
|
+
}
|
|
93
|
+
const edgesTo = await ladybugDb.getEdgesToSymbols(conn, [symbolId]);
|
|
94
|
+
for (const edge of edgesTo.get(symbolId) ?? []) {
|
|
95
|
+
ids.add(edge.fromSymbolId);
|
|
96
|
+
}
|
|
97
|
+
const limited = new Set(Array.from(ids).slice(0, maxNodes));
|
|
98
|
+
const nodes = await buildNodes(conn, Array.from(limited));
|
|
99
|
+
const links = await buildLinksForNodes(conn, limited);
|
|
100
|
+
return {
|
|
101
|
+
nodes: collapseClusters(nodes),
|
|
102
|
+
links,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
async function buildRepoPreview(conn, repoId, maxNodes) {
|
|
106
|
+
const top = await ladybugDb.getTopSymbolsByFanIn(conn, repoId, maxNodes);
|
|
107
|
+
const symbolIds = top.map((row) => row.symbolId);
|
|
108
|
+
const ids = new Set(symbolIds);
|
|
109
|
+
const nodes = await buildNodes(conn, symbolIds);
|
|
110
|
+
const links = await buildLinksForNodes(conn, ids);
|
|
111
|
+
return {
|
|
112
|
+
nodes: collapseClusters(nodes),
|
|
113
|
+
links,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
export async function buildGraphForSliceHandle(conn, repoId, handle, maxNodes, deps = {}) {
|
|
117
|
+
const getSliceHandleFn = deps.getSliceHandle ?? ladybugDb.getSliceHandle;
|
|
118
|
+
const buildRepoPreviewFn = deps.buildRepoPreview ?? buildRepoPreview;
|
|
119
|
+
const buildBlastRadiusGraphFn = deps.buildBlastRadiusGraph ?? buildBlastRadiusGraph;
|
|
120
|
+
const handleRow = await getSliceHandleFn(conn, handle);
|
|
121
|
+
if (!handleRow || handleRow.repoId !== repoId) {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
if (handleRow.minVersion && handleRow.maxVersion) {
|
|
125
|
+
return buildBlastRadiusGraphFn(conn, repoId, handleRow.minVersion, handleRow.maxVersion, maxNodes);
|
|
126
|
+
}
|
|
127
|
+
return buildRepoPreviewFn(conn, repoId, maxNodes);
|
|
128
|
+
}
|
|
129
|
+
export async function buildBlastRadiusGraph(conn, repoId, fromVersion, toVersion, maxNodes) {
|
|
130
|
+
const delta = await computeDelta(repoId, fromVersion, toVersion);
|
|
131
|
+
const changedSymbolIds = delta.changedSymbols.map((change) => change.symbolId);
|
|
132
|
+
const governor = await runGovernorLoop(conn, changedSymbolIds, {
|
|
133
|
+
repoId,
|
|
134
|
+
budget: { maxCards: maxNodes, maxEstimatedTokens: 4000 },
|
|
135
|
+
runDiagnostics: false,
|
|
136
|
+
});
|
|
137
|
+
const ids = new Set();
|
|
138
|
+
for (const changed of delta.changedSymbols) {
|
|
139
|
+
ids.add(changed.symbolId);
|
|
140
|
+
}
|
|
141
|
+
for (const affected of governor.blastRadius) {
|
|
142
|
+
ids.add(affected.symbolId);
|
|
143
|
+
}
|
|
144
|
+
const limited = new Set(Array.from(ids).slice(0, maxNodes));
|
|
145
|
+
const nodes = await buildNodes(conn, Array.from(limited));
|
|
146
|
+
const links = await buildLinksForNodes(conn, limited);
|
|
147
|
+
return {
|
|
148
|
+
nodes: collapseClusters(nodes),
|
|
149
|
+
links,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=legacy-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-graph.js","sourceRoot":"","sources":["../../src/viewer/legacy-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { ObservabilityService } from "../observability/service.js";
|
|
3
|
+
type SearchEventService = Pick<ObservabilityService, "recordGraphEvent">;
|
|
4
|
+
type SearchEventResult = {
|
|
5
|
+
symbolId: string;
|
|
6
|
+
};
|
|
7
|
+
export declare function _recordSearchGraphEventForTesting(observabilityService: SearchEventService | null, repoId: string, query: string, results: SearchEventResult[]): void;
|
|
8
|
+
export declare function handleViewerApiRequest(req: IncomingMessage, res: ServerResponse, pathname: string, url: URL, observabilityService?: ObservabilityService | null): Promise<boolean>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/viewer/routes.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAoCxE,KAAK,kBAAkB,GAAG,IAAI,CAAC,oBAAoB,EAAE,kBAAkB,CAAC,CAAC;AACzE,KAAK,iBAAiB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAoB9C,wBAAgB,iCAAiC,CAC/C,oBAAoB,EAAE,kBAAkB,GAAG,IAAI,EAC/C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,iBAAiB,EAAE,GAC3B,IAAI,CAEN;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,GAAG,EACR,oBAAoB,CAAC,EAAE,oBAAoB,GAAG,IAAI,GACjD,OAAO,CAAC,OAAO,CAAC,CAmLlB"}
|