@launchsecure/launch-kit 0.0.16 → 0.0.18
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/dist/chart-client/assets/index--120d9P9.css +1 -0
- package/dist/chart-client/assets/index-D7x8nz-H.js +441 -0
- package/dist/chart-client/index.html +2 -2
- package/dist/client/assets/index-Bf8zdL3x.css +32 -0
- package/dist/client/assets/index-Ds9UP_cj.js +291 -0
- package/dist/client/index.html +2 -2
- package/dist/council-client/assets/index-CofZh7pS.css +1 -0
- package/dist/council-client/assets/index-Dc41S-R2.js +198 -0
- package/dist/council-client/index.html +21 -0
- package/dist/deck-client/assets/_baseUniq-2gclQXo7.js +1 -0
- package/dist/deck-client/assets/arc-DcMY5Wm0.js +1 -0
- package/dist/deck-client/assets/architectureDiagram-Q4EWVU46-B8iirmmJ.js +36 -0
- package/dist/deck-client/assets/blockDiagram-DXYQGD6D-B4JBLjmJ.js +132 -0
- package/dist/deck-client/assets/c4Diagram-AHTNJAMY-CojrJAk8.js +10 -0
- package/dist/deck-client/assets/channel-ERh5jKXV.js +1 -0
- package/dist/deck-client/assets/chunk-4BX2VUAB-Bmb_BMDo.js +1 -0
- package/dist/deck-client/assets/chunk-4TB4RGXK-CumBy8qe.js +206 -0
- package/dist/deck-client/assets/chunk-55IACEB6-Ka8Hb1wD.js +1 -0
- package/dist/deck-client/assets/chunk-EDXVE4YY-B3sIPiQo.js +1 -0
- package/dist/deck-client/assets/chunk-FMBD7UC4-C1tYkaqu.js +15 -0
- package/dist/deck-client/assets/chunk-OYMX7WX6-D7Wacbky.js +231 -0
- package/dist/deck-client/assets/chunk-QZHKN3VN-ChXI0vO3.js +1 -0
- package/dist/deck-client/assets/chunk-YZCP3GAM-BXhiqf8u.js +1 -0
- package/dist/deck-client/assets/classDiagram-6PBFFD2Q-CMi1Gaev.js +1 -0
- package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-CMi1Gaev.js +1 -0
- package/dist/deck-client/assets/clone-DfWhlD4X.js +1 -0
- package/dist/deck-client/assets/cose-bilkent-S5V4N54A-Bqp3p68D.js +1 -0
- package/dist/deck-client/assets/cytoscape.esm-BQk4lpUV.js +331 -0
- package/dist/deck-client/assets/dagre-KV5264BT-BS-rtyhZ.js +4 -0
- package/dist/deck-client/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/dist/deck-client/assets/diagram-5BDNPKRD-BIrj9YGI.js +10 -0
- package/dist/deck-client/assets/diagram-G4DWMVQ6-noHWPIg4.js +24 -0
- package/dist/deck-client/assets/diagram-MMDJMWI5-C2qHxvqV.js +43 -0
- package/dist/deck-client/assets/diagram-TYMM5635-BytnGQr-.js +24 -0
- package/dist/deck-client/assets/erDiagram-SMLLAGMA-BfK5m2YQ.js +85 -0
- package/dist/deck-client/assets/flowDiagram-DWJPFMVM-Cq925G1Z.js +162 -0
- package/dist/deck-client/assets/ganttDiagram-T4ZO3ILL-DhhHPAmj.js +292 -0
- package/dist/deck-client/assets/gitGraphDiagram-UUTBAWPF-B3Lc0h9q.js +106 -0
- package/dist/deck-client/assets/graph-RTawgVWm.js +1 -0
- package/dist/deck-client/assets/index-765AIQ9z.css +1 -0
- package/dist/deck-client/assets/index-BfIfJXmS.js +476 -0
- package/dist/deck-client/assets/infoDiagram-42DDH7IO-BlR584kX.js +2 -0
- package/dist/deck-client/assets/init-Gi6I4Gst.js +1 -0
- package/dist/deck-client/assets/ishikawaDiagram-UXIWVN3A-DygKoNGY.js +70 -0
- package/dist/deck-client/assets/journeyDiagram-VCZTEJTY-BnaiYp9N.js +139 -0
- package/dist/deck-client/assets/kanban-definition-6JOO6SKY-BQBUBzJC.js +89 -0
- package/dist/deck-client/assets/katex-DkKDou_j.js +257 -0
- package/dist/deck-client/assets/layout-DeZ8HI1T.js +1 -0
- package/dist/deck-client/assets/linear-C6roLi_9.js +1 -0
- package/dist/deck-client/assets/min-CbUksbuI.js +1 -0
- package/dist/deck-client/assets/mindmap-definition-QFDTVHPH-iNxV62yN.js +96 -0
- package/dist/deck-client/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dist/deck-client/assets/pieDiagram-DEJITSTG-DHVA0jaG.js +30 -0
- package/dist/deck-client/assets/quadrantDiagram-34T5L4WZ-DBeKKLUQ.js +7 -0
- package/dist/deck-client/assets/requirementDiagram-MS252O5E-CBwITx7p.js +84 -0
- package/dist/deck-client/assets/sankeyDiagram-XADWPNL6-BtE-1YTU.js +10 -0
- package/dist/deck-client/assets/sequenceDiagram-FGHM5R23-DN96yPP2.js +157 -0
- package/dist/deck-client/assets/stateDiagram-FHFEXIEX-VUkKC2uJ.js +1 -0
- package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-CA0IjulK.js +1 -0
- package/dist/deck-client/assets/timeline-definition-GMOUNBTQ-oUeZhRns.js +120 -0
- package/dist/deck-client/assets/vennDiagram-DHZGUBPP-D87fK90n.js +34 -0
- package/dist/deck-client/assets/wardley-RL74JXVD-DYbYcpDp.js +162 -0
- package/dist/deck-client/assets/wardleyDiagram-NUSXRM2D-Ca_i0QRA.js +20 -0
- package/dist/deck-client/assets/xychartDiagram-5P7HB3ND-CUOJVIvq.js +7 -0
- package/dist/deck-client/index.html +21 -0
- package/dist/server/chart-serve.js +258 -273
- package/dist/server/cli.js +305 -713
- package/dist/server/council-entry.js +1418 -0
- package/dist/server/council-serve.js +1039 -0
- package/dist/server/deck-mcp-entry.js +1789 -0
- package/dist/server/deck-serve.js +1275 -0
- package/dist/server/deck-server/deck-mcp-entry.js +1789 -0
- package/dist/server/deck-server/deck-serve.js +1275 -0
- package/dist/server/fb-wizard.js +0 -0
- package/dist/server/graph-mcp-entry.js +268 -701
- package/dist/server/server/chart-serve.js +4643 -0
- package/dist/server/server/cli.js +13360 -0
- package/dist/server/server/fb-wizard.js +136 -0
- package/dist/server/server/graph-mcp-entry.js +6776 -0
- package/package.json +25 -18
- package/dist/chart-client/assets/index-BpQPtTuo.js +0 -441
- package/dist/chart-client/assets/index-CbZ13AXL.css +0 -1
- package/dist/client/assets/index-3ENenBk-.js +0 -291
- package/dist/client/assets/index-BCYw64M7.css +0 -32
package/dist/server/cli.js
CHANGED
|
@@ -34,43 +34,43 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
34
34
|
));
|
|
35
35
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
36
36
|
|
|
37
|
-
// ../../node_modules/uuid/dist/esm-node/max.js
|
|
37
|
+
// ../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/max.js
|
|
38
38
|
var max_default;
|
|
39
39
|
var init_max = __esm({
|
|
40
|
-
"../../node_modules/uuid/dist/esm-node/max.js"() {
|
|
40
|
+
"../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/max.js"() {
|
|
41
41
|
max_default = "ffffffff-ffff-ffff-ffff-ffffffffffff";
|
|
42
42
|
}
|
|
43
43
|
});
|
|
44
44
|
|
|
45
|
-
// ../../node_modules/uuid/dist/esm-node/nil.js
|
|
45
|
+
// ../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/nil.js
|
|
46
46
|
var nil_default;
|
|
47
47
|
var init_nil = __esm({
|
|
48
|
-
"../../node_modules/uuid/dist/esm-node/nil.js"() {
|
|
48
|
+
"../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/nil.js"() {
|
|
49
49
|
nil_default = "00000000-0000-0000-0000-000000000000";
|
|
50
50
|
}
|
|
51
51
|
});
|
|
52
52
|
|
|
53
|
-
// ../../node_modules/uuid/dist/esm-node/regex.js
|
|
53
|
+
// ../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/regex.js
|
|
54
54
|
var regex_default;
|
|
55
55
|
var init_regex = __esm({
|
|
56
|
-
"../../node_modules/uuid/dist/esm-node/regex.js"() {
|
|
56
|
+
"../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/regex.js"() {
|
|
57
57
|
regex_default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i;
|
|
58
58
|
}
|
|
59
59
|
});
|
|
60
60
|
|
|
61
|
-
// ../../node_modules/uuid/dist/esm-node/validate.js
|
|
61
|
+
// ../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/validate.js
|
|
62
62
|
function validate(uuid) {
|
|
63
63
|
return typeof uuid === "string" && regex_default.test(uuid);
|
|
64
64
|
}
|
|
65
65
|
var validate_default;
|
|
66
66
|
var init_validate = __esm({
|
|
67
|
-
"../../node_modules/uuid/dist/esm-node/validate.js"() {
|
|
67
|
+
"../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/validate.js"() {
|
|
68
68
|
init_regex();
|
|
69
69
|
validate_default = validate;
|
|
70
70
|
}
|
|
71
71
|
});
|
|
72
72
|
|
|
73
|
-
// ../../node_modules/uuid/dist/esm-node/parse.js
|
|
73
|
+
// ../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/parse.js
|
|
74
74
|
function parse(uuid) {
|
|
75
75
|
if (!validate_default(uuid)) {
|
|
76
76
|
throw TypeError("Invalid UUID");
|
|
@@ -97,13 +97,13 @@ function parse(uuid) {
|
|
|
97
97
|
}
|
|
98
98
|
var parse_default;
|
|
99
99
|
var init_parse = __esm({
|
|
100
|
-
"../../node_modules/uuid/dist/esm-node/parse.js"() {
|
|
100
|
+
"../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/parse.js"() {
|
|
101
101
|
init_validate();
|
|
102
102
|
parse_default = parse;
|
|
103
103
|
}
|
|
104
104
|
});
|
|
105
105
|
|
|
106
|
-
// ../../node_modules/uuid/dist/esm-node/stringify.js
|
|
106
|
+
// ../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/stringify.js
|
|
107
107
|
function unsafeStringify(arr, offset = 0) {
|
|
108
108
|
return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
|
|
109
109
|
}
|
|
@@ -116,7 +116,7 @@ function stringify(arr, offset = 0) {
|
|
|
116
116
|
}
|
|
117
117
|
var byteToHex, stringify_default;
|
|
118
118
|
var init_stringify = __esm({
|
|
119
|
-
"../../node_modules/uuid/dist/esm-node/stringify.js"() {
|
|
119
|
+
"../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/stringify.js"() {
|
|
120
120
|
init_validate();
|
|
121
121
|
byteToHex = [];
|
|
122
122
|
for (let i = 0; i < 256; ++i) {
|
|
@@ -126,7 +126,7 @@ var init_stringify = __esm({
|
|
|
126
126
|
}
|
|
127
127
|
});
|
|
128
128
|
|
|
129
|
-
// ../../node_modules/uuid/dist/esm-node/rng.js
|
|
129
|
+
// ../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/rng.js
|
|
130
130
|
function rng() {
|
|
131
131
|
if (poolPtr > rnds8Pool.length - 16) {
|
|
132
132
|
import_node_crypto.default.randomFillSync(rnds8Pool);
|
|
@@ -136,14 +136,14 @@ function rng() {
|
|
|
136
136
|
}
|
|
137
137
|
var import_node_crypto, rnds8Pool, poolPtr;
|
|
138
138
|
var init_rng = __esm({
|
|
139
|
-
"../../node_modules/uuid/dist/esm-node/rng.js"() {
|
|
139
|
+
"../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/rng.js"() {
|
|
140
140
|
import_node_crypto = __toESM(require("node:crypto"));
|
|
141
141
|
rnds8Pool = new Uint8Array(256);
|
|
142
142
|
poolPtr = rnds8Pool.length;
|
|
143
143
|
}
|
|
144
144
|
});
|
|
145
145
|
|
|
146
|
-
// ../../node_modules/uuid/dist/esm-node/v1.js
|
|
146
|
+
// ../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/v1.js
|
|
147
147
|
function v1(options, buf, offset) {
|
|
148
148
|
let i = buf && offset || 0;
|
|
149
149
|
const b = buf || new Array(16);
|
|
@@ -209,7 +209,7 @@ function v1(options, buf, offset) {
|
|
|
209
209
|
}
|
|
210
210
|
var _nodeId, _clockseq, _lastMSecs, _lastNSecs, v1_default;
|
|
211
211
|
var init_v1 = __esm({
|
|
212
|
-
"../../node_modules/uuid/dist/esm-node/v1.js"() {
|
|
212
|
+
"../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/v1.js"() {
|
|
213
213
|
init_rng();
|
|
214
214
|
init_stringify();
|
|
215
215
|
_lastMSecs = 0;
|
|
@@ -218,7 +218,7 @@ var init_v1 = __esm({
|
|
|
218
218
|
}
|
|
219
219
|
});
|
|
220
220
|
|
|
221
|
-
// ../../node_modules/uuid/dist/esm-node/v1ToV6.js
|
|
221
|
+
// ../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/v1ToV6.js
|
|
222
222
|
function v1ToV6(uuid) {
|
|
223
223
|
const v1Bytes = typeof uuid === "string" ? parse_default(uuid) : uuid;
|
|
224
224
|
const v6Bytes = _v1ToV6(v1Bytes);
|
|
@@ -228,13 +228,13 @@ function _v1ToV6(v1Bytes, randomize = false) {
|
|
|
228
228
|
return Uint8Array.of((v1Bytes[6] & 15) << 4 | v1Bytes[7] >> 4 & 15, (v1Bytes[7] & 15) << 4 | (v1Bytes[4] & 240) >> 4, (v1Bytes[4] & 15) << 4 | (v1Bytes[5] & 240) >> 4, (v1Bytes[5] & 15) << 4 | (v1Bytes[0] & 240) >> 4, (v1Bytes[0] & 15) << 4 | (v1Bytes[1] & 240) >> 4, (v1Bytes[1] & 15) << 4 | (v1Bytes[2] & 240) >> 4, 96 | v1Bytes[2] & 15, v1Bytes[3], v1Bytes[8], v1Bytes[9], v1Bytes[10], v1Bytes[11], v1Bytes[12], v1Bytes[13], v1Bytes[14], v1Bytes[15]);
|
|
229
229
|
}
|
|
230
230
|
var init_v1ToV6 = __esm({
|
|
231
|
-
"../../node_modules/uuid/dist/esm-node/v1ToV6.js"() {
|
|
231
|
+
"../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/v1ToV6.js"() {
|
|
232
232
|
init_parse();
|
|
233
233
|
init_stringify();
|
|
234
234
|
}
|
|
235
235
|
});
|
|
236
236
|
|
|
237
|
-
// ../../node_modules/uuid/dist/esm-node/v35.js
|
|
237
|
+
// ../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/v35.js
|
|
238
238
|
function stringToBytes(str) {
|
|
239
239
|
str = unescape(encodeURIComponent(str));
|
|
240
240
|
const bytes = [];
|
|
@@ -280,7 +280,7 @@ function v35(name, version2, hashfunc) {
|
|
|
280
280
|
}
|
|
281
281
|
var DNS, URL2;
|
|
282
282
|
var init_v35 = __esm({
|
|
283
|
-
"../../node_modules/uuid/dist/esm-node/v35.js"() {
|
|
283
|
+
"../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/v35.js"() {
|
|
284
284
|
init_stringify();
|
|
285
285
|
init_parse();
|
|
286
286
|
DNS = "6ba7b810-9dad-11d1-80b4-00c04fd430c8";
|
|
@@ -288,7 +288,7 @@ var init_v35 = __esm({
|
|
|
288
288
|
}
|
|
289
289
|
});
|
|
290
290
|
|
|
291
|
-
// ../../node_modules/uuid/dist/esm-node/md5.js
|
|
291
|
+
// ../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/md5.js
|
|
292
292
|
function md5(bytes) {
|
|
293
293
|
if (Array.isArray(bytes)) {
|
|
294
294
|
bytes = Buffer.from(bytes);
|
|
@@ -299,16 +299,16 @@ function md5(bytes) {
|
|
|
299
299
|
}
|
|
300
300
|
var import_node_crypto2, md5_default;
|
|
301
301
|
var init_md5 = __esm({
|
|
302
|
-
"../../node_modules/uuid/dist/esm-node/md5.js"() {
|
|
302
|
+
"../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/md5.js"() {
|
|
303
303
|
import_node_crypto2 = __toESM(require("node:crypto"));
|
|
304
304
|
md5_default = md5;
|
|
305
305
|
}
|
|
306
306
|
});
|
|
307
307
|
|
|
308
|
-
// ../../node_modules/uuid/dist/esm-node/v3.js
|
|
308
|
+
// ../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/v3.js
|
|
309
309
|
var v3, v3_default;
|
|
310
310
|
var init_v3 = __esm({
|
|
311
|
-
"../../node_modules/uuid/dist/esm-node/v3.js"() {
|
|
311
|
+
"../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/v3.js"() {
|
|
312
312
|
init_v35();
|
|
313
313
|
init_md5();
|
|
314
314
|
v3 = v35("v3", 48, md5_default);
|
|
@@ -316,10 +316,10 @@ var init_v3 = __esm({
|
|
|
316
316
|
}
|
|
317
317
|
});
|
|
318
318
|
|
|
319
|
-
// ../../node_modules/uuid/dist/esm-node/native.js
|
|
319
|
+
// ../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/native.js
|
|
320
320
|
var import_node_crypto3, native_default;
|
|
321
321
|
var init_native = __esm({
|
|
322
|
-
"../../node_modules/uuid/dist/esm-node/native.js"() {
|
|
322
|
+
"../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/native.js"() {
|
|
323
323
|
import_node_crypto3 = __toESM(require("node:crypto"));
|
|
324
324
|
native_default = {
|
|
325
325
|
randomUUID: import_node_crypto3.default.randomUUID
|
|
@@ -327,7 +327,7 @@ var init_native = __esm({
|
|
|
327
327
|
}
|
|
328
328
|
});
|
|
329
329
|
|
|
330
|
-
// ../../node_modules/uuid/dist/esm-node/v4.js
|
|
330
|
+
// ../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/v4.js
|
|
331
331
|
function v4(options, buf, offset) {
|
|
332
332
|
if (native_default.randomUUID && !buf && !options) {
|
|
333
333
|
return native_default.randomUUID();
|
|
@@ -347,7 +347,7 @@ function v4(options, buf, offset) {
|
|
|
347
347
|
}
|
|
348
348
|
var v4_default;
|
|
349
349
|
var init_v4 = __esm({
|
|
350
|
-
"../../node_modules/uuid/dist/esm-node/v4.js"() {
|
|
350
|
+
"../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/v4.js"() {
|
|
351
351
|
init_native();
|
|
352
352
|
init_rng();
|
|
353
353
|
init_stringify();
|
|
@@ -355,7 +355,7 @@ var init_v4 = __esm({
|
|
|
355
355
|
}
|
|
356
356
|
});
|
|
357
357
|
|
|
358
|
-
// ../../node_modules/uuid/dist/esm-node/sha1.js
|
|
358
|
+
// ../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/sha1.js
|
|
359
359
|
function sha1(bytes) {
|
|
360
360
|
if (Array.isArray(bytes)) {
|
|
361
361
|
bytes = Buffer.from(bytes);
|
|
@@ -366,16 +366,16 @@ function sha1(bytes) {
|
|
|
366
366
|
}
|
|
367
367
|
var import_node_crypto4, sha1_default;
|
|
368
368
|
var init_sha1 = __esm({
|
|
369
|
-
"../../node_modules/uuid/dist/esm-node/sha1.js"() {
|
|
369
|
+
"../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/sha1.js"() {
|
|
370
370
|
import_node_crypto4 = __toESM(require("node:crypto"));
|
|
371
371
|
sha1_default = sha1;
|
|
372
372
|
}
|
|
373
373
|
});
|
|
374
374
|
|
|
375
|
-
// ../../node_modules/uuid/dist/esm-node/v5.js
|
|
375
|
+
// ../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/v5.js
|
|
376
376
|
var v5, v5_default;
|
|
377
377
|
var init_v5 = __esm({
|
|
378
|
-
"../../node_modules/uuid/dist/esm-node/v5.js"() {
|
|
378
|
+
"../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/v5.js"() {
|
|
379
379
|
init_v35();
|
|
380
380
|
init_sha1();
|
|
381
381
|
v5 = v35("v5", 80, sha1_default);
|
|
@@ -383,7 +383,7 @@ var init_v5 = __esm({
|
|
|
383
383
|
}
|
|
384
384
|
});
|
|
385
385
|
|
|
386
|
-
// ../../node_modules/uuid/dist/esm-node/v6.js
|
|
386
|
+
// ../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/v6.js
|
|
387
387
|
function v6(options = {}, buf, offset = 0) {
|
|
388
388
|
let bytes = v1_default({
|
|
389
389
|
...options,
|
|
@@ -399,14 +399,14 @@ function v6(options = {}, buf, offset = 0) {
|
|
|
399
399
|
return unsafeStringify(bytes);
|
|
400
400
|
}
|
|
401
401
|
var init_v6 = __esm({
|
|
402
|
-
"../../node_modules/uuid/dist/esm-node/v6.js"() {
|
|
402
|
+
"../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/v6.js"() {
|
|
403
403
|
init_stringify();
|
|
404
404
|
init_v1();
|
|
405
405
|
init_v1ToV6();
|
|
406
406
|
}
|
|
407
407
|
});
|
|
408
408
|
|
|
409
|
-
// ../../node_modules/uuid/dist/esm-node/v6ToV1.js
|
|
409
|
+
// ../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/v6ToV1.js
|
|
410
410
|
function v6ToV1(uuid) {
|
|
411
411
|
const v6Bytes = typeof uuid === "string" ? parse_default(uuid) : uuid;
|
|
412
412
|
const v1Bytes = _v6ToV1(v6Bytes);
|
|
@@ -416,13 +416,13 @@ function _v6ToV1(v6Bytes) {
|
|
|
416
416
|
return Uint8Array.of((v6Bytes[3] & 15) << 4 | v6Bytes[4] >> 4 & 15, (v6Bytes[4] & 15) << 4 | (v6Bytes[5] & 240) >> 4, (v6Bytes[5] & 15) << 4 | v6Bytes[6] & 15, v6Bytes[7], (v6Bytes[1] & 15) << 4 | (v6Bytes[2] & 240) >> 4, (v6Bytes[2] & 15) << 4 | (v6Bytes[3] & 240) >> 4, 16 | (v6Bytes[0] & 240) >> 4, (v6Bytes[0] & 15) << 4 | (v6Bytes[1] & 240) >> 4, v6Bytes[8], v6Bytes[9], v6Bytes[10], v6Bytes[11], v6Bytes[12], v6Bytes[13], v6Bytes[14], v6Bytes[15]);
|
|
417
417
|
}
|
|
418
418
|
var init_v6ToV1 = __esm({
|
|
419
|
-
"../../node_modules/uuid/dist/esm-node/v6ToV1.js"() {
|
|
419
|
+
"../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/v6ToV1.js"() {
|
|
420
420
|
init_parse();
|
|
421
421
|
init_stringify();
|
|
422
422
|
}
|
|
423
423
|
});
|
|
424
424
|
|
|
425
|
-
// ../../node_modules/uuid/dist/esm-node/v7.js
|
|
425
|
+
// ../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/v7.js
|
|
426
426
|
function v7(options, buf, offset) {
|
|
427
427
|
options = options || {};
|
|
428
428
|
let i = buf && offset || 0;
|
|
@@ -486,7 +486,7 @@ function v7(options, buf, offset) {
|
|
|
486
486
|
}
|
|
487
487
|
var _seqLow, _seqHigh, _msecs, v7_default;
|
|
488
488
|
var init_v7 = __esm({
|
|
489
|
-
"../../node_modules/uuid/dist/esm-node/v7.js"() {
|
|
489
|
+
"../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/v7.js"() {
|
|
490
490
|
init_rng();
|
|
491
491
|
init_stringify();
|
|
492
492
|
_seqLow = null;
|
|
@@ -496,7 +496,7 @@ var init_v7 = __esm({
|
|
|
496
496
|
}
|
|
497
497
|
});
|
|
498
498
|
|
|
499
|
-
// ../../node_modules/uuid/dist/esm-node/version.js
|
|
499
|
+
// ../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/version.js
|
|
500
500
|
function version(uuid) {
|
|
501
501
|
if (!validate_default(uuid)) {
|
|
502
502
|
throw TypeError("Invalid UUID");
|
|
@@ -505,13 +505,13 @@ function version(uuid) {
|
|
|
505
505
|
}
|
|
506
506
|
var version_default;
|
|
507
507
|
var init_version = __esm({
|
|
508
|
-
"../../node_modules/uuid/dist/esm-node/version.js"() {
|
|
508
|
+
"../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/version.js"() {
|
|
509
509
|
init_validate();
|
|
510
510
|
version_default = version;
|
|
511
511
|
}
|
|
512
512
|
});
|
|
513
513
|
|
|
514
|
-
// ../../node_modules/uuid/dist/esm-node/index.js
|
|
514
|
+
// ../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/index.js
|
|
515
515
|
var esm_node_exports = {};
|
|
516
516
|
__export(esm_node_exports, {
|
|
517
517
|
MAX: () => max_default,
|
|
@@ -530,7 +530,7 @@ __export(esm_node_exports, {
|
|
|
530
530
|
version: () => version_default
|
|
531
531
|
});
|
|
532
532
|
var init_esm_node = __esm({
|
|
533
|
-
"../../node_modules/uuid/dist/esm-node/index.js"() {
|
|
533
|
+
"../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/index.js"() {
|
|
534
534
|
init_max();
|
|
535
535
|
init_nil();
|
|
536
536
|
init_parse();
|
|
@@ -554,7 +554,7 @@ var require_claude_bridge = __commonJS({
|
|
|
554
554
|
"use strict";
|
|
555
555
|
var { spawn: spawn3 } = require("node-pty");
|
|
556
556
|
var path9 = require("path");
|
|
557
|
-
var
|
|
557
|
+
var fs9 = require("fs");
|
|
558
558
|
var ClaudeBridge = class {
|
|
559
559
|
constructor() {
|
|
560
560
|
this.sessions = /* @__PURE__ */ new Map();
|
|
@@ -572,7 +572,7 @@ var require_claude_bridge = __commonJS({
|
|
|
572
572
|
];
|
|
573
573
|
for (const cmd of possibleCommands) {
|
|
574
574
|
try {
|
|
575
|
-
if (
|
|
575
|
+
if (fs9.existsSync(cmd) || this.commandExists(cmd)) {
|
|
576
576
|
console.log(`Found Claude command at: ${cmd}`);
|
|
577
577
|
return cmd;
|
|
578
578
|
}
|
|
@@ -600,6 +600,8 @@ var require_claude_bridge = __commonJS({
|
|
|
600
600
|
dangerouslySkipPermissions = false,
|
|
601
601
|
appendSystemPrompt,
|
|
602
602
|
initialPrompt,
|
|
603
|
+
mcpConfig,
|
|
604
|
+
strictMcpConfig = false,
|
|
603
605
|
onOutput = () => {
|
|
604
606
|
},
|
|
605
607
|
onExit = () => {
|
|
@@ -622,6 +624,8 @@ var require_claude_bridge = __commonJS({
|
|
|
622
624
|
}
|
|
623
625
|
const args = [];
|
|
624
626
|
if (dangerouslySkipPermissions) args.push("--dangerously-skip-permissions");
|
|
627
|
+
if (mcpConfig) args.push("--mcp-config", mcpConfig);
|
|
628
|
+
if (strictMcpConfig) args.push("--strict-mcp-config");
|
|
625
629
|
if (appendSystemPrompt) args.push("--append-system-prompt", appendSystemPrompt);
|
|
626
630
|
if (initialPrompt) args.push(initialPrompt);
|
|
627
631
|
const claudeProcess = spawn3(this.claudeCommand, args, {
|
|
@@ -773,7 +777,7 @@ var require_codex_bridge = __commonJS({
|
|
|
773
777
|
"use strict";
|
|
774
778
|
var { spawn: spawn3 } = require("node-pty");
|
|
775
779
|
var path9 = require("path");
|
|
776
|
-
var
|
|
780
|
+
var fs9 = require("fs");
|
|
777
781
|
var CodexBridge = class {
|
|
778
782
|
constructor() {
|
|
779
783
|
this.sessions = /* @__PURE__ */ new Map();
|
|
@@ -790,7 +794,7 @@ var require_codex_bridge = __commonJS({
|
|
|
790
794
|
];
|
|
791
795
|
for (const cmd of possibleCommands) {
|
|
792
796
|
try {
|
|
793
|
-
if (
|
|
797
|
+
if (fs9.existsSync(cmd) || this.commandExists(cmd)) {
|
|
794
798
|
console.log(`Found Codex command at: ${cmd}`);
|
|
795
799
|
return cmd;
|
|
796
800
|
}
|
|
@@ -966,7 +970,7 @@ var require_agent_bridge = __commonJS({
|
|
|
966
970
|
"use strict";
|
|
967
971
|
var { spawn: spawn3 } = require("node-pty");
|
|
968
972
|
var path9 = require("path");
|
|
969
|
-
var
|
|
973
|
+
var fs9 = require("fs");
|
|
970
974
|
var AgentBridge = class {
|
|
971
975
|
constructor() {
|
|
972
976
|
this.sessions = /* @__PURE__ */ new Map();
|
|
@@ -982,7 +986,7 @@ var require_agent_bridge = __commonJS({
|
|
|
982
986
|
];
|
|
983
987
|
for (const cmd of possibleCommands) {
|
|
984
988
|
try {
|
|
985
|
-
if (
|
|
989
|
+
if (fs9.existsSync(cmd) || this.commandExists(cmd)) {
|
|
986
990
|
console.log(`Found Agent command at: ${cmd}`);
|
|
987
991
|
return cmd;
|
|
988
992
|
}
|
|
@@ -1306,7 +1310,7 @@ var require_script_bridge = __commonJS({
|
|
|
1306
1310
|
var require_session_store = __commonJS({
|
|
1307
1311
|
"../claude-code-web/src/utils/session-store.js"(exports2, module2) {
|
|
1308
1312
|
"use strict";
|
|
1309
|
-
var
|
|
1313
|
+
var fs9 = require("fs").promises;
|
|
1310
1314
|
var path9 = require("path");
|
|
1311
1315
|
var os2 = require("os");
|
|
1312
1316
|
var SessionStore = class {
|
|
@@ -1317,14 +1321,14 @@ var require_session_store = __commonJS({
|
|
|
1317
1321
|
}
|
|
1318
1322
|
async initializeStorage() {
|
|
1319
1323
|
try {
|
|
1320
|
-
await
|
|
1324
|
+
await fs9.mkdir(this.storageDir, { recursive: true });
|
|
1321
1325
|
} catch (error) {
|
|
1322
1326
|
console.error("Failed to create storage directory:", error);
|
|
1323
1327
|
}
|
|
1324
1328
|
}
|
|
1325
1329
|
async saveSessions(sessions) {
|
|
1326
1330
|
try {
|
|
1327
|
-
await
|
|
1331
|
+
await fs9.mkdir(this.storageDir, { recursive: true });
|
|
1328
1332
|
const sessionsArray = Array.from(sessions.entries()).map(([id, session]) => ({
|
|
1329
1333
|
id,
|
|
1330
1334
|
name: session.name || "Unnamed Session",
|
|
@@ -1355,9 +1359,9 @@ var require_session_store = __commonJS({
|
|
|
1355
1359
|
sessions: sessionsArray
|
|
1356
1360
|
};
|
|
1357
1361
|
const tempFile = `${this.sessionsFile}.tmp`;
|
|
1358
|
-
await
|
|
1359
|
-
await
|
|
1360
|
-
await
|
|
1362
|
+
await fs9.writeFile(tempFile, JSON.stringify(data, null, 2));
|
|
1363
|
+
await fs9.mkdir(this.storageDir, { recursive: true });
|
|
1364
|
+
await fs9.rename(tempFile, this.sessionsFile);
|
|
1361
1365
|
return true;
|
|
1362
1366
|
} catch (error) {
|
|
1363
1367
|
console.error("Failed to save sessions:", error.message);
|
|
@@ -1366,8 +1370,8 @@ var require_session_store = __commonJS({
|
|
|
1366
1370
|
}
|
|
1367
1371
|
async loadSessions() {
|
|
1368
1372
|
try {
|
|
1369
|
-
await
|
|
1370
|
-
const data = await
|
|
1373
|
+
await fs9.access(this.sessionsFile);
|
|
1374
|
+
const data = await fs9.readFile(this.sessionsFile, "utf8");
|
|
1371
1375
|
if (!data || !data.trim()) {
|
|
1372
1376
|
console.log("Sessions file is empty, starting fresh");
|
|
1373
1377
|
return /* @__PURE__ */ new Map();
|
|
@@ -1378,7 +1382,7 @@ var require_session_store = __commonJS({
|
|
|
1378
1382
|
} catch (parseError) {
|
|
1379
1383
|
console.error("Sessions file is corrupted, starting fresh:", parseError.message);
|
|
1380
1384
|
try {
|
|
1381
|
-
await
|
|
1385
|
+
await fs9.rename(this.sessionsFile, `${this.sessionsFile}.corrupted.${Date.now()}`);
|
|
1382
1386
|
} catch (renameError) {
|
|
1383
1387
|
}
|
|
1384
1388
|
return /* @__PURE__ */ new Map();
|
|
@@ -1422,7 +1426,7 @@ var require_session_store = __commonJS({
|
|
|
1422
1426
|
}
|
|
1423
1427
|
async clearOldSessions() {
|
|
1424
1428
|
try {
|
|
1425
|
-
await
|
|
1429
|
+
await fs9.unlink(this.sessionsFile);
|
|
1426
1430
|
console.log("Cleared old sessions");
|
|
1427
1431
|
return true;
|
|
1428
1432
|
} catch (error) {
|
|
@@ -1434,9 +1438,9 @@ var require_session_store = __commonJS({
|
|
|
1434
1438
|
}
|
|
1435
1439
|
async getSessionMetadata() {
|
|
1436
1440
|
try {
|
|
1437
|
-
await
|
|
1438
|
-
const stats = await
|
|
1439
|
-
const data = await
|
|
1441
|
+
await fs9.access(this.sessionsFile);
|
|
1442
|
+
const stats = await fs9.stat(this.sessionsFile);
|
|
1443
|
+
const data = await fs9.readFile(this.sessionsFile, "utf8");
|
|
1440
1444
|
const parsed = JSON.parse(data);
|
|
1441
1445
|
return {
|
|
1442
1446
|
exists: true,
|
|
@@ -1461,7 +1465,7 @@ var require_session_store = __commonJS({
|
|
|
1461
1465
|
var require_usage_reader = __commonJS({
|
|
1462
1466
|
"../claude-code-web/src/usage-reader.js"(exports2, module2) {
|
|
1463
1467
|
"use strict";
|
|
1464
|
-
var
|
|
1468
|
+
var fs9 = require("fs").promises;
|
|
1465
1469
|
var path9 = require("path");
|
|
1466
1470
|
var readline = require("readline");
|
|
1467
1471
|
var { createReadStream } = require("fs");
|
|
@@ -1669,12 +1673,12 @@ var require_usage_reader = __commonJS({
|
|
|
1669
1673
|
const projectDirName = cwd.replace(/\//g, "-");
|
|
1670
1674
|
let projectPath = path9.join(this.claudeProjectsPath, projectDirName);
|
|
1671
1675
|
try {
|
|
1672
|
-
await
|
|
1676
|
+
await fs9.access(projectPath);
|
|
1673
1677
|
} catch (err2) {
|
|
1674
1678
|
console.log(`Project directory not found: ${projectPath}`);
|
|
1675
1679
|
return null;
|
|
1676
1680
|
}
|
|
1677
|
-
const files = await
|
|
1681
|
+
const files = await fs9.readdir(projectPath);
|
|
1678
1682
|
const jsonlFiles = files.filter((f) => f.endsWith(".jsonl"));
|
|
1679
1683
|
if (jsonlFiles.length === 0) {
|
|
1680
1684
|
return null;
|
|
@@ -1683,7 +1687,7 @@ var require_usage_reader = __commonJS({
|
|
|
1683
1687
|
let mostRecentTime = 0;
|
|
1684
1688
|
for (const file of jsonlFiles) {
|
|
1685
1689
|
const filePath = path9.join(projectPath, file);
|
|
1686
|
-
const stat = await
|
|
1690
|
+
const stat = await fs9.stat(filePath);
|
|
1687
1691
|
if (stat.mtime.getTime() > mostRecentTime) {
|
|
1688
1692
|
mostRecentTime = stat.mtime.getTime();
|
|
1689
1693
|
mostRecentFile = filePath;
|
|
@@ -1698,17 +1702,17 @@ var require_usage_reader = __commonJS({
|
|
|
1698
1702
|
async findJsonlFiles(onlyRecent = false) {
|
|
1699
1703
|
const files = [];
|
|
1700
1704
|
try {
|
|
1701
|
-
const projectDirs = await
|
|
1705
|
+
const projectDirs = await fs9.readdir(this.claudeProjectsPath);
|
|
1702
1706
|
for (const projectDir of projectDirs) {
|
|
1703
1707
|
const projectPath = path9.join(this.claudeProjectsPath, projectDir);
|
|
1704
|
-
const stat = await
|
|
1708
|
+
const stat = await fs9.stat(projectPath);
|
|
1705
1709
|
if (stat.isDirectory()) {
|
|
1706
|
-
const projectFiles = await
|
|
1710
|
+
const projectFiles = await fs9.readdir(projectPath);
|
|
1707
1711
|
const jsonlFiles = projectFiles.filter((f) => f.endsWith(".jsonl"));
|
|
1708
1712
|
for (const jsonlFile of jsonlFiles) {
|
|
1709
1713
|
const filePath = path9.join(projectPath, jsonlFile);
|
|
1710
1714
|
if (onlyRecent) {
|
|
1711
|
-
const fileStat = await
|
|
1715
|
+
const fileStat = await fs9.stat(filePath);
|
|
1712
1716
|
const hoursSinceModified = (Date.now() - fileStat.mtime.getTime()) / (1e3 * 60 * 60);
|
|
1713
1717
|
if (hoursSinceModified <= 24) {
|
|
1714
1718
|
files.push(filePath);
|
|
@@ -1871,7 +1875,7 @@ var require_usage_reader = __commonJS({
|
|
|
1871
1875
|
}
|
|
1872
1876
|
const sessionFile = path9.join(this.claudeProjectsPath, path9.basename(process.cwd()).replace(/[^a-zA-Z0-9-]/g, "-"), `${sessionId}.jsonl`);
|
|
1873
1877
|
try {
|
|
1874
|
-
await
|
|
1878
|
+
await fs9.access(sessionFile);
|
|
1875
1879
|
} catch (err2) {
|
|
1876
1880
|
return null;
|
|
1877
1881
|
}
|
|
@@ -2537,7 +2541,7 @@ var require_src = __commonJS({
|
|
|
2537
2541
|
var SessionStore = require_session_store();
|
|
2538
2542
|
var UsageReader = require_usage_reader();
|
|
2539
2543
|
var UsageAnalytics = require_usage_analytics();
|
|
2540
|
-
var
|
|
2544
|
+
var fs9 = require("fs");
|
|
2541
2545
|
function stripAnsi(str) {
|
|
2542
2546
|
return str.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, "").replace(/\x1b\][^\x07]*\x07/g, "").replace(/\x1b[()][AB012]/g, "").replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, "").replace(/\r\n?/g, "\n").trim();
|
|
2543
2547
|
}
|
|
@@ -2795,7 +2799,7 @@ var require_src = __commonJS({
|
|
|
2795
2799
|
return true;
|
|
2796
2800
|
}
|
|
2797
2801
|
try {
|
|
2798
|
-
const items =
|
|
2802
|
+
const items = fs9.readdirSync(validation.path, { withFileTypes: true });
|
|
2799
2803
|
const showHidden = url.searchParams.get("showHidden") === "true";
|
|
2800
2804
|
const folders = items.filter((item) => item.isDirectory()).filter((item) => !item.name.startsWith(".") || showHidden).map((item) => ({
|
|
2801
2805
|
name: item.name,
|
|
@@ -2830,7 +2834,7 @@ var require_src = __commonJS({
|
|
|
2830
2834
|
res.end(JSON.stringify({ error: validation.error }));
|
|
2831
2835
|
return;
|
|
2832
2836
|
}
|
|
2833
|
-
if (!
|
|
2837
|
+
if (!fs9.existsSync(validation.path) || !fs9.statSync(validation.path).isDirectory()) {
|
|
2834
2838
|
res.writeHead(400, { "Content-Type": "application/json" });
|
|
2835
2839
|
res.end(JSON.stringify({ error: "Not a valid directory" }));
|
|
2836
2840
|
return;
|
|
@@ -2857,7 +2861,7 @@ var require_src = __commonJS({
|
|
|
2857
2861
|
res.end(JSON.stringify({ error: validation.error }));
|
|
2858
2862
|
return;
|
|
2859
2863
|
}
|
|
2860
|
-
if (!
|
|
2864
|
+
if (!fs9.existsSync(validation.path) || !fs9.statSync(validation.path).isDirectory()) {
|
|
2861
2865
|
res.writeHead(400, { "Content-Type": "application/json" });
|
|
2862
2866
|
res.end(JSON.stringify({ error: "Invalid directory path" }));
|
|
2863
2867
|
return;
|
|
@@ -2892,12 +2896,12 @@ var require_src = __commonJS({
|
|
|
2892
2896
|
res.end(JSON.stringify({ message: "Cannot create folder outside the allowed area" }));
|
|
2893
2897
|
return;
|
|
2894
2898
|
}
|
|
2895
|
-
if (
|
|
2899
|
+
if (fs9.existsSync(fullValidation.path)) {
|
|
2896
2900
|
res.writeHead(409, { "Content-Type": "application/json" });
|
|
2897
2901
|
res.end(JSON.stringify({ message: "Folder already exists" }));
|
|
2898
2902
|
return;
|
|
2899
2903
|
}
|
|
2900
|
-
|
|
2904
|
+
fs9.mkdirSync(fullValidation.path, { recursive: true });
|
|
2901
2905
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
2902
2906
|
res.end(JSON.stringify({ success: true, path: fullValidation.path }));
|
|
2903
2907
|
} catch (e) {
|
|
@@ -2923,7 +2927,7 @@ var require_src = __commonJS({
|
|
|
2923
2927
|
if (!filePath || filePath === "") filePath = "index.html";
|
|
2924
2928
|
const fullPath = path9.join(__dirname, "public", filePath);
|
|
2925
2929
|
try {
|
|
2926
|
-
if (!
|
|
2930
|
+
if (!fs9.existsSync(fullPath)) return false;
|
|
2927
2931
|
const ext = path9.extname(fullPath);
|
|
2928
2932
|
const mimeTypes = {
|
|
2929
2933
|
".html": "text/html",
|
|
@@ -2935,7 +2939,7 @@ var require_src = __commonJS({
|
|
|
2935
2939
|
".ico": "image/x-icon"
|
|
2936
2940
|
};
|
|
2937
2941
|
const mime = mimeTypes[ext] || "application/octet-stream";
|
|
2938
|
-
const content =
|
|
2942
|
+
const content = fs9.readFileSync(fullPath);
|
|
2939
2943
|
res.writeHead(200, { "Content-Type": mime });
|
|
2940
2944
|
res.end(content);
|
|
2941
2945
|
return true;
|
|
@@ -3761,15 +3765,15 @@ function getQuery(name) {
|
|
|
3761
3765
|
ensureInit();
|
|
3762
3766
|
const cached = queryCache.get(name);
|
|
3763
3767
|
if (cached) return cached;
|
|
3764
|
-
const scmPath = (0,
|
|
3765
|
-
const scm = (0,
|
|
3768
|
+
const scmPath = (0, import_node_path4.join)(queriesDir, `${name}.scm`);
|
|
3769
|
+
const scm = (0, import_node_fs4.readFileSync)(scmPath, "utf-8");
|
|
3766
3770
|
const query = tsxLanguage.query(scm);
|
|
3767
3771
|
queryCache.set(name, query);
|
|
3768
3772
|
return query;
|
|
3769
3773
|
}
|
|
3770
3774
|
function parseSource(absPath) {
|
|
3771
3775
|
ensureInit();
|
|
3772
|
-
const content = (0,
|
|
3776
|
+
const content = (0, import_node_fs4.readFileSync)(absPath, "utf-8");
|
|
3773
3777
|
return parserInstance.parse(content);
|
|
3774
3778
|
}
|
|
3775
3779
|
function parseCodeTS(code) {
|
|
@@ -4234,17 +4238,17 @@ function extractDeep(absPath) {
|
|
|
4234
4238
|
}
|
|
4235
4239
|
return { elements, stateVars, conditions, variables, responses, params };
|
|
4236
4240
|
}
|
|
4237
|
-
var
|
|
4241
|
+
var import_node_fs4, import_node_path4, tsxLanguage, parserInstance, initPromise, initialized, queriesDir, queryCache, PRISMA_MUTATION_METHODS_BUILTIN, DB_IDENTIFIERS_FALLBACK, extraDbIdentifiers, extraMutationMethods;
|
|
4238
4242
|
var init_ts_extractor = __esm({
|
|
4239
4243
|
"src/server/graph/core/ts-extractor.ts"() {
|
|
4240
4244
|
"use strict";
|
|
4241
|
-
|
|
4242
|
-
|
|
4245
|
+
import_node_fs4 = require("node:fs");
|
|
4246
|
+
import_node_path4 = require("node:path");
|
|
4243
4247
|
initialized = false;
|
|
4244
4248
|
queriesDir = (() => {
|
|
4245
|
-
const srcPath = (0,
|
|
4249
|
+
const srcPath = (0, import_node_path4.join)((0, import_node_path4.dirname)(__filename), "..", "queries");
|
|
4246
4250
|
if (require("fs").existsSync(srcPath)) return srcPath;
|
|
4247
|
-
return (0,
|
|
4251
|
+
return (0, import_node_path4.join)((0, import_node_path4.dirname)(__filename), "graph", "queries");
|
|
4248
4252
|
})();
|
|
4249
4253
|
queryCache = /* @__PURE__ */ new Map();
|
|
4250
4254
|
PRISMA_MUTATION_METHODS_BUILTIN = [
|
|
@@ -4632,7 +4636,7 @@ var NodeTriggerController = class {
|
|
|
4632
4636
|
this.workingDir = opts.workingDir;
|
|
4633
4637
|
this.maxConcurrent = opts.maxConcurrent ?? 1;
|
|
4634
4638
|
this.agentMap = /* @__PURE__ */ new Map();
|
|
4635
|
-
for (const ag of opts.graphData.
|
|
4639
|
+
for (const ag of opts.graphData.nd) {
|
|
4636
4640
|
this.agentMap.set(ag.id, ag);
|
|
4637
4641
|
}
|
|
4638
4642
|
}
|
|
@@ -4649,7 +4653,7 @@ var NodeTriggerController = class {
|
|
|
4649
4653
|
for (const change of changes) {
|
|
4650
4654
|
const agent = this.agentMap.get(change.agentId);
|
|
4651
4655
|
if (!agent) continue;
|
|
4652
|
-
if (agent.
|
|
4656
|
+
if (agent.tp === "script_pod" && change.newStatus === "in_progress") {
|
|
4653
4657
|
if (agent.gr === "per_unit" && !change.unitId) continue;
|
|
4654
4658
|
if (agent.gr !== "per_unit" && change.unitId) continue;
|
|
4655
4659
|
const executor = this.podExecutors.get(change.agentId);
|
|
@@ -4662,8 +4666,8 @@ var NodeTriggerController = class {
|
|
|
4662
4666
|
}
|
|
4663
4667
|
continue;
|
|
4664
4668
|
}
|
|
4665
|
-
if (agent.
|
|
4666
|
-
if (agent.
|
|
4669
|
+
if (agent.tp === "script") continue;
|
|
4670
|
+
if (agent.tp !== "llm") continue;
|
|
4667
4671
|
if (agent.gr === "per_unit") {
|
|
4668
4672
|
if (!change.unitId) continue;
|
|
4669
4673
|
} else {
|
|
@@ -4797,8 +4801,27 @@ var NodeTriggerController = class {
|
|
|
4797
4801
|
|
|
4798
4802
|
// src/server/adapters/claude-terminal-adapter.ts
|
|
4799
4803
|
var ClaudeTerminalAdapter = class {
|
|
4800
|
-
constructor() {
|
|
4804
|
+
constructor(opts = {}) {
|
|
4801
4805
|
this.activeSessions = /* @__PURE__ */ new Set();
|
|
4806
|
+
if (opts.mcpServers) {
|
|
4807
|
+
const { token, serverUrl } = opts.mcpServers;
|
|
4808
|
+
this.mcpConfigJson = JSON.stringify({
|
|
4809
|
+
mcpServers: {
|
|
4810
|
+
"launch-pod": {
|
|
4811
|
+
type: "http",
|
|
4812
|
+
url: `${serverUrl}/api/mcp/pipeline`,
|
|
4813
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
4814
|
+
},
|
|
4815
|
+
"launch-chart": {
|
|
4816
|
+
command: "launch-chart",
|
|
4817
|
+
args: []
|
|
4818
|
+
}
|
|
4819
|
+
}
|
|
4820
|
+
});
|
|
4821
|
+
this.strictMcp = true;
|
|
4822
|
+
} else {
|
|
4823
|
+
this.strictMcp = false;
|
|
4824
|
+
}
|
|
4802
4825
|
}
|
|
4803
4826
|
async start(config) {
|
|
4804
4827
|
const sessionName = `Agent: ${config.agentId}${config.unitId ? ` [${config.unitId}]` : ""}`;
|
|
@@ -4809,7 +4832,8 @@ var ClaudeTerminalAdapter = class {
|
|
|
4809
4832
|
await startClaudeInSession(sessionId, {
|
|
4810
4833
|
dangerouslySkipPermissions: true,
|
|
4811
4834
|
appendSystemPrompt: config.prompt,
|
|
4812
|
-
initialPrompt: "Begin."
|
|
4835
|
+
initialPrompt: "Begin.",
|
|
4836
|
+
...this.mcpConfigJson ? { mcpConfig: this.mcpConfigJson, strictMcpConfig: this.strictMcp } : {}
|
|
4813
4837
|
});
|
|
4814
4838
|
this.activeSessions.add(sessionId);
|
|
4815
4839
|
return sessionId;
|
|
@@ -6938,20 +6962,20 @@ ${links}
|
|
|
6938
6962
|
}
|
|
6939
6963
|
|
|
6940
6964
|
// src/server/graph/index.ts
|
|
6941
|
-
var
|
|
6942
|
-
var
|
|
6965
|
+
var import_node_fs15 = require("node:fs");
|
|
6966
|
+
var import_node_path17 = require("node:path");
|
|
6943
6967
|
|
|
6944
6968
|
// src/server/graph/core/graph-builder.ts
|
|
6945
|
-
var
|
|
6946
|
-
var
|
|
6969
|
+
var import_node_fs12 = require("node:fs");
|
|
6970
|
+
var import_node_path13 = require("node:path");
|
|
6947
6971
|
init_config();
|
|
6948
6972
|
|
|
6949
6973
|
// src/server/graph/core/parser-registry.ts
|
|
6950
|
-
var
|
|
6974
|
+
var import_node_path12 = require("node:path");
|
|
6951
6975
|
|
|
6952
6976
|
// src/server/graph/parsers/ts/typescript-project.ts
|
|
6953
|
-
var
|
|
6954
|
-
var
|
|
6977
|
+
var import_node_fs5 = require("node:fs");
|
|
6978
|
+
var import_node_path5 = require("node:path");
|
|
6955
6979
|
init_config();
|
|
6956
6980
|
|
|
6957
6981
|
// src/server/graph/core/resolve-paths.ts
|
|
@@ -6981,6 +7005,50 @@ function resolveProjectPaths(rootDir, config) {
|
|
|
6981
7005
|
return null;
|
|
6982
7006
|
}
|
|
6983
7007
|
|
|
7008
|
+
// src/server/graph/core/walk.ts
|
|
7009
|
+
var import_node_fs3 = require("node:fs");
|
|
7010
|
+
var import_node_path3 = require("node:path");
|
|
7011
|
+
var DEFAULT_IGNORE_DIRS = /* @__PURE__ */ new Set([
|
|
7012
|
+
"node_modules",
|
|
7013
|
+
".git",
|
|
7014
|
+
".next",
|
|
7015
|
+
".launchsecure",
|
|
7016
|
+
".claude",
|
|
7017
|
+
"dist",
|
|
7018
|
+
"build",
|
|
7019
|
+
"out",
|
|
7020
|
+
".turbo",
|
|
7021
|
+
".vercel",
|
|
7022
|
+
"coverage"
|
|
7023
|
+
]);
|
|
7024
|
+
function walk(dir, exts) {
|
|
7025
|
+
const results = [];
|
|
7026
|
+
if (!(0, import_node_fs3.existsSync)(dir)) return results;
|
|
7027
|
+
for (const entry of (0, import_node_fs3.readdirSync)(dir, { withFileTypes: true })) {
|
|
7028
|
+
const full = (0, import_node_path3.join)(dir, entry.name);
|
|
7029
|
+
if (entry.isDirectory()) {
|
|
7030
|
+
results.push(...walk(full, exts));
|
|
7031
|
+
} else if (exts.includes((0, import_node_path3.extname)(entry.name))) {
|
|
7032
|
+
results.push(full);
|
|
7033
|
+
}
|
|
7034
|
+
}
|
|
7035
|
+
return results;
|
|
7036
|
+
}
|
|
7037
|
+
function walkWithIgnore(dir, exts, opts = {}) {
|
|
7038
|
+
const results = [];
|
|
7039
|
+
if (!(0, import_node_fs3.existsSync)(dir)) return results;
|
|
7040
|
+
const skip = opts.extraIgnore ? /* @__PURE__ */ new Set([...DEFAULT_IGNORE_DIRS, ...opts.extraIgnore]) : DEFAULT_IGNORE_DIRS;
|
|
7041
|
+
for (const entry of (0, import_node_fs3.readdirSync)(dir, { withFileTypes: true })) {
|
|
7042
|
+
if (entry.isDirectory()) {
|
|
7043
|
+
if (skip.has(entry.name)) continue;
|
|
7044
|
+
results.push(...walkWithIgnore((0, import_node_path3.join)(dir, entry.name), exts, opts));
|
|
7045
|
+
} else if (exts.includes((0, import_node_path3.extname)(entry.name))) {
|
|
7046
|
+
results.push((0, import_node_path3.join)(dir, entry.name));
|
|
7047
|
+
}
|
|
7048
|
+
}
|
|
7049
|
+
return results;
|
|
7050
|
+
}
|
|
7051
|
+
|
|
6984
7052
|
// src/server/graph/parsers/ts/typescript-project.ts
|
|
6985
7053
|
init_ts_extractor();
|
|
6986
7054
|
var HTTP_METHODS = /* @__PURE__ */ new Set(["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"]);
|
|
@@ -6997,48 +7065,22 @@ var CLASSIFICATION_TO_LAYER = {
|
|
|
6997
7065
|
"mcp-tool": "ui",
|
|
6998
7066
|
external: "ui"
|
|
6999
7067
|
};
|
|
7000
|
-
function walk(dir, exts) {
|
|
7001
|
-
const results = [];
|
|
7002
|
-
if (!(0, import_node_fs4.existsSync)(dir)) return results;
|
|
7003
|
-
for (const entry of (0, import_node_fs4.readdirSync)(dir, { withFileTypes: true })) {
|
|
7004
|
-
const full = (0, import_node_path4.join)(dir, entry.name);
|
|
7005
|
-
if (entry.isDirectory()) {
|
|
7006
|
-
results.push(...walk(full, exts));
|
|
7007
|
-
} else if (exts.includes((0, import_node_path4.extname)(entry.name))) {
|
|
7008
|
-
results.push(full);
|
|
7009
|
-
}
|
|
7010
|
-
}
|
|
7011
|
-
return results;
|
|
7012
|
-
}
|
|
7013
|
-
function walkWithIgnore(dir, exts, ignoreDirs) {
|
|
7014
|
-
const results = [];
|
|
7015
|
-
if (!(0, import_node_fs4.existsSync)(dir)) return results;
|
|
7016
|
-
for (const entry of (0, import_node_fs4.readdirSync)(dir, { withFileTypes: true })) {
|
|
7017
|
-
if (entry.isDirectory()) {
|
|
7018
|
-
if (ignoreDirs.has(entry.name)) continue;
|
|
7019
|
-
results.push(...walkWithIgnore((0, import_node_path4.join)(dir, entry.name), exts, ignoreDirs));
|
|
7020
|
-
} else if (exts.includes((0, import_node_path4.extname)(entry.name))) {
|
|
7021
|
-
results.push((0, import_node_path4.join)(dir, entry.name));
|
|
7022
|
-
}
|
|
7023
|
-
}
|
|
7024
|
-
return results;
|
|
7025
|
-
}
|
|
7026
7068
|
function toNodeId(srcDir, absPath) {
|
|
7027
|
-
return (0,
|
|
7069
|
+
return (0, import_node_path5.relative)(srcDir, absPath).replace(/\\/g, "/");
|
|
7028
7070
|
}
|
|
7029
7071
|
function resolveImport(srcDir, specifier) {
|
|
7030
7072
|
if (!specifier.startsWith("@/")) return null;
|
|
7031
7073
|
const rel = specifier.slice(2);
|
|
7032
|
-
const base = (0,
|
|
7033
|
-
for (const c of [base, base + ".ts", base + ".tsx", (0,
|
|
7034
|
-
if ((0,
|
|
7074
|
+
const base = (0, import_node_path5.join)(srcDir, rel);
|
|
7075
|
+
for (const c of [base, base + ".ts", base + ".tsx", (0, import_node_path5.join)(base, "index.ts"), (0, import_node_path5.join)(base, "index.tsx")]) {
|
|
7076
|
+
if ((0, import_node_fs5.existsSync)(c) && (0, import_node_fs5.statSync)(c).isFile()) return c;
|
|
7035
7077
|
}
|
|
7036
7078
|
return null;
|
|
7037
7079
|
}
|
|
7038
7080
|
function resolveRelativeImport(fromFile, specifier) {
|
|
7039
|
-
const base = (0,
|
|
7040
|
-
for (const c of [base, base + ".ts", base + ".tsx", (0,
|
|
7041
|
-
if ((0,
|
|
7081
|
+
const base = (0, import_node_path5.join)((0, import_node_path5.dirname)(fromFile), specifier);
|
|
7082
|
+
for (const c of [base, base + ".ts", base + ".tsx", (0, import_node_path5.join)(base, "index.ts"), (0, import_node_path5.join)(base, "index.tsx")]) {
|
|
7083
|
+
if ((0, import_node_fs5.existsSync)(c) && (0, import_node_fs5.statSync)(c).isFile()) return c;
|
|
7042
7084
|
}
|
|
7043
7085
|
return null;
|
|
7044
7086
|
}
|
|
@@ -7059,7 +7101,7 @@ function resolveBarrelMap(barrelAbsPath, parsedByPath, memo, visiting) {
|
|
|
7059
7101
|
const resolved = resolveRelativeImport(barrelAbsPath, re.from);
|
|
7060
7102
|
if (!resolved) continue;
|
|
7061
7103
|
if (re.isWildcard) {
|
|
7062
|
-
const targetBn = (0,
|
|
7104
|
+
const targetBn = (0, import_node_path5.basename)(resolved);
|
|
7063
7105
|
const targetIsBarrel = targetBn === "index.ts" || targetBn === "index.tsx";
|
|
7064
7106
|
if (targetIsBarrel) {
|
|
7065
7107
|
const nested = resolveBarrelMap(resolved, parsedByPath, memo, visiting);
|
|
@@ -7086,12 +7128,12 @@ function buildAllBarrelMaps(srcDir, parsedByPath) {
|
|
|
7086
7128
|
const barrels = /* @__PURE__ */ new Map();
|
|
7087
7129
|
const memo = /* @__PURE__ */ new Map();
|
|
7088
7130
|
for (const [absPath, parsed] of parsedByPath) {
|
|
7089
|
-
const bn = (0,
|
|
7131
|
+
const bn = (0, import_node_path5.basename)(absPath);
|
|
7090
7132
|
if (bn !== "index.ts" && bn !== "index.tsx") continue;
|
|
7091
7133
|
if (parsed.reExports.length === 0) continue;
|
|
7092
7134
|
const map = resolveBarrelMap(absPath, parsedByPath, memo, /* @__PURE__ */ new Set());
|
|
7093
7135
|
if (map.size > 0) {
|
|
7094
|
-
const barrelId = (0,
|
|
7136
|
+
const barrelId = (0, import_node_path5.relative)(srcDir, (0, import_node_path5.dirname)(absPath)).replace(/\\/g, "/");
|
|
7095
7137
|
barrels.set(barrelId, map);
|
|
7096
7138
|
}
|
|
7097
7139
|
}
|
|
@@ -7112,10 +7154,10 @@ function extractRoute(id) {
|
|
|
7112
7154
|
return route || "/";
|
|
7113
7155
|
}
|
|
7114
7156
|
function nameFromFilename(absPath) {
|
|
7115
|
-
return (0,
|
|
7157
|
+
return (0, import_node_path5.basename)(absPath, (0, import_node_path5.extname)(absPath)).replace(/[-_](\w)/g, (_, c) => c.toUpperCase()).replace(/^(\w)/, (_, c) => c.toUpperCase());
|
|
7116
7158
|
}
|
|
7117
7159
|
function filePathToApiRoute(apiDir, absPath) {
|
|
7118
|
-
let route = "/" + (0,
|
|
7160
|
+
let route = "/" + (0, import_node_path5.relative)(apiDir, absPath).replace(/\\/g, "/").replace(/\/route\.tsx?$/, "");
|
|
7119
7161
|
route = route.replace(/\[([^\]]+)\]/g, ":$1");
|
|
7120
7162
|
route = route.replace(/\/+/g, "/");
|
|
7121
7163
|
if (route === "/") return "/api";
|
|
@@ -7299,12 +7341,9 @@ function extractEdges(srcDir, absPath, sourceId, parsed, nodeIdSet, barrelMaps,
|
|
|
7299
7341
|
}
|
|
7300
7342
|
return { edges, flagged };
|
|
7301
7343
|
}
|
|
7302
|
-
function hasNextConfig(rootDir) {
|
|
7303
|
-
return (0, import_node_fs4.existsSync)((0, import_node_path4.join)(rootDir, "next.config.ts")) || (0, import_node_fs4.existsSync)((0, import_node_path4.join)(rootDir, "next.config.js")) || (0, import_node_fs4.existsSync)((0, import_node_path4.join)(rootDir, "next.config.mjs"));
|
|
7304
|
-
}
|
|
7305
7344
|
function detect(rootDir) {
|
|
7306
7345
|
const paths = resolveProjectPaths(rootDir, loadConfig(rootDir));
|
|
7307
|
-
return paths !== null
|
|
7346
|
+
return paths !== null;
|
|
7308
7347
|
}
|
|
7309
7348
|
function generate(rootDir) {
|
|
7310
7349
|
const config = loadConfig(rootDir);
|
|
@@ -7312,10 +7351,10 @@ function generate(rootDir) {
|
|
|
7312
7351
|
const srcDir = paths.srcDir;
|
|
7313
7352
|
const apiDir = paths.apiDir;
|
|
7314
7353
|
const appFiles = walk(paths.appDir, [".tsx", ".ts"]);
|
|
7315
|
-
const clientFiles = walk((0,
|
|
7316
|
-
const serverFiles = walk((0,
|
|
7317
|
-
const libFiles = walk((0,
|
|
7318
|
-
const configFiles = walk((0,
|
|
7354
|
+
const clientFiles = walk((0, import_node_path5.join)(srcDir, "client"), [".tsx", ".ts"]);
|
|
7355
|
+
const serverFiles = walk((0, import_node_path5.join)(srcDir, "server"), [".ts", ".tsx"]);
|
|
7356
|
+
const libFiles = walk((0, import_node_path5.join)(srcDir, "lib"), [".ts", ".tsx"]);
|
|
7357
|
+
const configFiles = walk((0, import_node_path5.join)(srcDir, "config"), [".ts", ".tsx"]);
|
|
7319
7358
|
const allDiscovered = [...appFiles, ...clientFiles, ...serverFiles, ...libFiles, ...configFiles];
|
|
7320
7359
|
const parsedByPath = /* @__PURE__ */ new Map();
|
|
7321
7360
|
for (const absPath of allDiscovered) {
|
|
@@ -7326,7 +7365,7 @@ function generate(rootDir) {
|
|
|
7326
7365
|
const apiNodes = [];
|
|
7327
7366
|
const nodeIdSet = /* @__PURE__ */ new Set();
|
|
7328
7367
|
const routeToNodeId = /* @__PURE__ */ new Map();
|
|
7329
|
-
const fileSet = allDiscovered.filter((f) => !(0,
|
|
7368
|
+
const fileSet = allDiscovered.filter((f) => !(0, import_node_path5.basename)(f).startsWith("index."));
|
|
7330
7369
|
for (const absPath of fileSet) {
|
|
7331
7370
|
const id = toNodeId(srcDir, absPath);
|
|
7332
7371
|
const type = classifyType(absPath, id);
|
|
@@ -7343,7 +7382,7 @@ function generate(rootDir) {
|
|
|
7343
7382
|
const dbCalls = extractDbCallsTS(absPath);
|
|
7344
7383
|
const authWrappers = extractAuthWrappersTS(absPath);
|
|
7345
7384
|
const deep = extractDeep(absPath);
|
|
7346
|
-
const routePath = (0,
|
|
7385
|
+
const routePath = (0, import_node_fs5.existsSync)(apiDir) ? filePathToApiRoute(apiDir, absPath) : `/api/${id.replace(/\/route\.tsx?$/, "")}`;
|
|
7347
7386
|
const mutations = dbCalls.filter((c) => c.isMutation);
|
|
7348
7387
|
const mutates = mutations.length > 0;
|
|
7349
7388
|
const authStrategy = [...authWrappers];
|
|
@@ -7420,20 +7459,7 @@ function generate(rootDir) {
|
|
|
7420
7459
|
});
|
|
7421
7460
|
}
|
|
7422
7461
|
const externalScanned = new Set(allDiscovered.map((f) => f.replace(/\\/g, "/")));
|
|
7423
|
-
const
|
|
7424
|
-
"node_modules",
|
|
7425
|
-
".next",
|
|
7426
|
-
"dist",
|
|
7427
|
-
".launchsecure",
|
|
7428
|
-
".git",
|
|
7429
|
-
"src",
|
|
7430
|
-
"coverage",
|
|
7431
|
-
".turbo",
|
|
7432
|
-
"build",
|
|
7433
|
-
"out",
|
|
7434
|
-
".vercel"
|
|
7435
|
-
]);
|
|
7436
|
-
const externalCandidates = walkWithIgnore(rootDir, [".ts", ".tsx"], IGNORE_DIRS2);
|
|
7462
|
+
const externalCandidates = walkWithIgnore(rootDir, [".ts", ".tsx"], { extraIgnore: /* @__PURE__ */ new Set(["src"]) });
|
|
7437
7463
|
for (const absPath of externalCandidates) {
|
|
7438
7464
|
const normalized = absPath.replace(/\\/g, "/");
|
|
7439
7465
|
if (externalScanned.has(normalized)) continue;
|
|
@@ -7443,7 +7469,7 @@ function generate(rootDir) {
|
|
|
7443
7469
|
} catch {
|
|
7444
7470
|
continue;
|
|
7445
7471
|
}
|
|
7446
|
-
const externalId = (0,
|
|
7472
|
+
const externalId = (0, import_node_path5.relative)(rootDir, absPath).replace(/\\/g, "/");
|
|
7447
7473
|
const edgesFromThis = [];
|
|
7448
7474
|
const seen = /* @__PURE__ */ new Set();
|
|
7449
7475
|
for (const imp of parsed.imports) {
|
|
@@ -7647,8 +7673,8 @@ var typescriptProjectParser = {
|
|
|
7647
7673
|
};
|
|
7648
7674
|
|
|
7649
7675
|
// src/server/graph/parsers/db/prisma-schema.ts
|
|
7650
|
-
var
|
|
7651
|
-
var
|
|
7676
|
+
var import_node_fs6 = require("node:fs");
|
|
7677
|
+
var import_node_path6 = require("node:path");
|
|
7652
7678
|
function parseModels(content) {
|
|
7653
7679
|
const nodes = [];
|
|
7654
7680
|
const relations = [];
|
|
@@ -7739,11 +7765,11 @@ function parseEnums(content) {
|
|
|
7739
7765
|
return nodes;
|
|
7740
7766
|
}
|
|
7741
7767
|
function detect2(rootDir) {
|
|
7742
|
-
return (0,
|
|
7768
|
+
return (0, import_node_fs6.existsSync)((0, import_node_path6.join)(rootDir, "prisma", "schema.prisma"));
|
|
7743
7769
|
}
|
|
7744
7770
|
function generate2(rootDir) {
|
|
7745
|
-
const schemaPath = (0,
|
|
7746
|
-
const content = (0,
|
|
7771
|
+
const schemaPath = (0, import_node_path6.join)(rootDir, "prisma", "schema.prisma");
|
|
7772
|
+
const content = (0, import_node_fs6.readFileSync)(schemaPath, "utf-8");
|
|
7747
7773
|
const { nodes: modelNodes, relations } = parseModels(content);
|
|
7748
7774
|
const enumNodes = parseEnums(content);
|
|
7749
7775
|
const allNodes = [...modelNodes, ...enumNodes];
|
|
@@ -7800,8 +7826,8 @@ var prismaSchemaParser = {
|
|
|
7800
7826
|
};
|
|
7801
7827
|
|
|
7802
7828
|
// src/server/graph/parsers/db/sql-migrations.ts
|
|
7803
|
-
var
|
|
7804
|
-
var
|
|
7829
|
+
var import_node_fs7 = require("node:fs");
|
|
7830
|
+
var import_node_path7 = require("node:path");
|
|
7805
7831
|
var PG_TO_PRISMA = {
|
|
7806
7832
|
"TEXT": "String",
|
|
7807
7833
|
"VARCHAR": "String",
|
|
@@ -7951,19 +7977,19 @@ function parseUniqueIndex(sql, state) {
|
|
|
7951
7977
|
}
|
|
7952
7978
|
}
|
|
7953
7979
|
function parseMigrations(rootDir) {
|
|
7954
|
-
const migrationsDir = (0,
|
|
7980
|
+
const migrationsDir = (0, import_node_path7.join)(rootDir, "prisma", "migrations");
|
|
7955
7981
|
const state = {
|
|
7956
7982
|
tables: /* @__PURE__ */ new Map(),
|
|
7957
7983
|
enums: /* @__PURE__ */ new Map(),
|
|
7958
7984
|
fks: [],
|
|
7959
7985
|
uniqueIndexes: /* @__PURE__ */ new Map()
|
|
7960
7986
|
};
|
|
7961
|
-
if (!(0,
|
|
7962
|
-
const dirs = (0,
|
|
7987
|
+
if (!(0, import_node_fs7.existsSync)(migrationsDir)) return state;
|
|
7988
|
+
const dirs = (0, import_node_fs7.readdirSync)(migrationsDir, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name).sort();
|
|
7963
7989
|
for (const dir of dirs) {
|
|
7964
|
-
const sqlPath = (0,
|
|
7965
|
-
if (!(0,
|
|
7966
|
-
const sql = (0,
|
|
7990
|
+
const sqlPath = (0, import_node_path7.join)(migrationsDir, dir, "migration.sql");
|
|
7991
|
+
if (!(0, import_node_fs7.existsSync)(sqlPath)) continue;
|
|
7992
|
+
const sql = (0, import_node_fs7.readFileSync)(sqlPath, "utf-8");
|
|
7967
7993
|
parseCreateEnum(sql, state);
|
|
7968
7994
|
parseCreateTable(sql, state);
|
|
7969
7995
|
parseAlterTable(sql, state);
|
|
@@ -7974,9 +8000,9 @@ function parseMigrations(rootDir) {
|
|
|
7974
8000
|
return state;
|
|
7975
8001
|
}
|
|
7976
8002
|
function loadPrismaState(rootDir) {
|
|
7977
|
-
const schemaPath = (0,
|
|
7978
|
-
if (!(0,
|
|
7979
|
-
const content = (0,
|
|
8003
|
+
const schemaPath = (0, import_node_path7.join)(rootDir, "prisma", "schema.prisma");
|
|
8004
|
+
if (!(0, import_node_fs7.existsSync)(schemaPath)) return null;
|
|
8005
|
+
const content = (0, import_node_fs7.readFileSync)(schemaPath, "utf-8");
|
|
7980
8006
|
const tables = /* @__PURE__ */ new Map();
|
|
7981
8007
|
const enums = /* @__PURE__ */ new Map();
|
|
7982
8008
|
const relations = [];
|
|
@@ -8141,9 +8167,9 @@ function verify(sqlState, prisma) {
|
|
|
8141
8167
|
return { contradictions, flaggedEdges };
|
|
8142
8168
|
}
|
|
8143
8169
|
function detect3(rootDir) {
|
|
8144
|
-
const migrationsDir = (0,
|
|
8145
|
-
if (!(0,
|
|
8146
|
-
return (0,
|
|
8170
|
+
const migrationsDir = (0, import_node_path7.join)(rootDir, "prisma", "migrations");
|
|
8171
|
+
if (!(0, import_node_fs7.existsSync)(migrationsDir)) return false;
|
|
8172
|
+
return (0, import_node_fs7.readdirSync)(migrationsDir, { withFileTypes: true }).some((d) => d.isDirectory() && (0, import_node_fs7.existsSync)((0, import_node_path7.join)(migrationsDir, d.name, "migration.sql")));
|
|
8147
8173
|
}
|
|
8148
8174
|
function generate3(rootDir) {
|
|
8149
8175
|
const sqlState = parseMigrations(rootDir);
|
|
@@ -8431,32 +8457,32 @@ var fetchResolverParser = {
|
|
|
8431
8457
|
};
|
|
8432
8458
|
|
|
8433
8459
|
// src/server/graph/parsers/crosslayer/api-annotations.ts
|
|
8434
|
-
var
|
|
8435
|
-
var
|
|
8460
|
+
var import_node_fs8 = require("node:fs");
|
|
8461
|
+
var import_node_path8 = require("node:path");
|
|
8436
8462
|
var API_ANNOTATION_RE = /@api\s+(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\s+(\/\S+)/g;
|
|
8437
8463
|
function walk2(dir, exts) {
|
|
8438
|
-
if (!(0,
|
|
8464
|
+
if (!(0, import_node_fs8.existsSync)(dir)) return [];
|
|
8439
8465
|
const results = [];
|
|
8440
|
-
for (const entry of (0,
|
|
8466
|
+
for (const entry of (0, import_node_fs8.readdirSync)(dir, { withFileTypes: true })) {
|
|
8441
8467
|
if (entry.name.startsWith(".") || entry.name === "node_modules") continue;
|
|
8442
|
-
const full = (0,
|
|
8468
|
+
const full = (0, import_node_path8.join)(dir, entry.name);
|
|
8443
8469
|
if (entry.isDirectory()) {
|
|
8444
8470
|
results.push(...walk2(full, exts));
|
|
8445
|
-
} else if (exts.includes((0,
|
|
8471
|
+
} else if (exts.includes((0, import_node_path8.extname)(entry.name))) {
|
|
8446
8472
|
results.push(full);
|
|
8447
8473
|
}
|
|
8448
8474
|
}
|
|
8449
8475
|
return results;
|
|
8450
8476
|
}
|
|
8451
8477
|
function toNodeId2(srcDir, absPath) {
|
|
8452
|
-
return (0,
|
|
8478
|
+
return (0, import_node_path8.relative)(srcDir, absPath).replace(/\\/g, "/");
|
|
8453
8479
|
}
|
|
8454
8480
|
var apiAnnotationsParser = {
|
|
8455
8481
|
id: "api-annotations",
|
|
8456
8482
|
layer: "crosslayer",
|
|
8457
8483
|
concern: "api-binding",
|
|
8458
8484
|
detect(rootDir) {
|
|
8459
|
-
return (0,
|
|
8485
|
+
return (0, import_node_fs8.existsSync)((0, import_node_path8.join)(rootDir, "src"));
|
|
8460
8486
|
},
|
|
8461
8487
|
generate(rootDir, layerOutputs) {
|
|
8462
8488
|
const apiOutput = layerOutputs.get("api");
|
|
@@ -8467,13 +8493,13 @@ var apiAnnotationsParser = {
|
|
|
8467
8493
|
const uiNodeIds = new Set(uiOutput?.nodes.map((n) => n.id) ?? []);
|
|
8468
8494
|
const apiRoutes = loadApiRoutesFromOutput(apiOutput);
|
|
8469
8495
|
const apiPathMap = buildApiPathMap(apiRoutes);
|
|
8470
|
-
const srcDir = (0,
|
|
8496
|
+
const srcDir = (0, import_node_path8.join)(rootDir, "src");
|
|
8471
8497
|
const files = walk2(srcDir, [".ts", ".tsx"]);
|
|
8472
8498
|
const crossRefs = [];
|
|
8473
8499
|
const flaggedEdges = [];
|
|
8474
8500
|
const seen = /* @__PURE__ */ new Set();
|
|
8475
8501
|
for (const absPath of files) {
|
|
8476
|
-
const content = (0,
|
|
8502
|
+
const content = (0, import_node_fs8.readFileSync)(absPath, "utf-8");
|
|
8477
8503
|
const sourceId = toNodeId2(srcDir, absPath);
|
|
8478
8504
|
if (!uiNodeIds.has(sourceId)) continue;
|
|
8479
8505
|
let match;
|
|
@@ -8517,26 +8543,26 @@ var apiAnnotationsParser = {
|
|
|
8517
8543
|
};
|
|
8518
8544
|
|
|
8519
8545
|
// src/server/graph/parsers/crosslayer/url-literal-scanner.ts
|
|
8520
|
-
var
|
|
8521
|
-
var
|
|
8546
|
+
var import_node_fs9 = require("node:fs");
|
|
8547
|
+
var import_node_path9 = require("node:path");
|
|
8522
8548
|
init_config();
|
|
8523
8549
|
var URL_LITERAL_RE = /['"`](\/api\/[^'"`\s]+?)['"`]/g;
|
|
8524
8550
|
function walk3(dir, exts) {
|
|
8525
|
-
if (!(0,
|
|
8551
|
+
if (!(0, import_node_fs9.existsSync)(dir)) return [];
|
|
8526
8552
|
const results = [];
|
|
8527
|
-
for (const entry of (0,
|
|
8553
|
+
for (const entry of (0, import_node_fs9.readdirSync)(dir, { withFileTypes: true })) {
|
|
8528
8554
|
if (entry.name.startsWith(".") || entry.name === "node_modules") continue;
|
|
8529
|
-
const full = (0,
|
|
8555
|
+
const full = (0, import_node_path9.join)(dir, entry.name);
|
|
8530
8556
|
if (entry.isDirectory()) {
|
|
8531
8557
|
results.push(...walk3(full, exts));
|
|
8532
|
-
} else if (exts.includes((0,
|
|
8558
|
+
} else if (exts.includes((0, import_node_path9.extname)(entry.name))) {
|
|
8533
8559
|
results.push(full);
|
|
8534
8560
|
}
|
|
8535
8561
|
}
|
|
8536
8562
|
return results;
|
|
8537
8563
|
}
|
|
8538
8564
|
function toNodeId3(srcDir, absPath) {
|
|
8539
|
-
return (0,
|
|
8565
|
+
return (0, import_node_path9.relative)(srcDir, absPath).replace(/\\/g, "/");
|
|
8540
8566
|
}
|
|
8541
8567
|
var urlLiteralScannerParser = {
|
|
8542
8568
|
id: "url-literal-scanner",
|
|
@@ -8557,7 +8583,7 @@ var urlLiteralScannerParser = {
|
|
|
8557
8583
|
const apiPathMap = buildApiPathMap(apiRoutes);
|
|
8558
8584
|
const paths = resolveProjectPaths(rootDir, loadConfig(rootDir));
|
|
8559
8585
|
const srcDir = paths.srcDir;
|
|
8560
|
-
const clientDir = (0,
|
|
8586
|
+
const clientDir = (0, import_node_path9.join)(srcDir, "client");
|
|
8561
8587
|
const files = [
|
|
8562
8588
|
...walk3(clientDir, [".ts", ".tsx"]),
|
|
8563
8589
|
...walk3(paths.appDir, [".ts", ".tsx"])
|
|
@@ -8567,7 +8593,7 @@ var urlLiteralScannerParser = {
|
|
|
8567
8593
|
for (const absPath of files) {
|
|
8568
8594
|
const sourceId = toNodeId3(srcDir, absPath);
|
|
8569
8595
|
if (!uiNodeIds.has(sourceId)) continue;
|
|
8570
|
-
const content = (0,
|
|
8596
|
+
const content = (0, import_node_fs9.readFileSync)(absPath, "utf-8");
|
|
8571
8597
|
let match;
|
|
8572
8598
|
URL_LITERAL_RE.lastIndex = 0;
|
|
8573
8599
|
while ((match = URL_LITERAL_RE.exec(content)) !== null) {
|
|
@@ -8598,8 +8624,8 @@ var urlLiteralScannerParser = {
|
|
|
8598
8624
|
};
|
|
8599
8625
|
|
|
8600
8626
|
// src/server/graph/parsers/static/static-values.ts
|
|
8601
|
-
var
|
|
8602
|
-
var
|
|
8627
|
+
var import_node_fs10 = require("node:fs");
|
|
8628
|
+
var import_node_path10 = require("node:path");
|
|
8603
8629
|
var parseCode = null;
|
|
8604
8630
|
function tryLoadTreeSitter() {
|
|
8605
8631
|
if (parseCode) return true;
|
|
@@ -8632,19 +8658,19 @@ function extractEnumValues(rootDir) {
|
|
|
8632
8658
|
const nodes = [];
|
|
8633
8659
|
const edges = [];
|
|
8634
8660
|
const schemaPaths = [
|
|
8635
|
-
(0,
|
|
8636
|
-
(0,
|
|
8661
|
+
(0, import_node_path10.join)(rootDir, "prisma", "schema.prisma"),
|
|
8662
|
+
(0, import_node_path10.join)(rootDir, "prisma", "schema")
|
|
8637
8663
|
];
|
|
8638
8664
|
let content = "";
|
|
8639
8665
|
for (const p of schemaPaths) {
|
|
8640
|
-
if ((0,
|
|
8666
|
+
if ((0, import_node_fs10.existsSync)(p)) {
|
|
8641
8667
|
try {
|
|
8642
|
-
const stat = (0,
|
|
8668
|
+
const stat = (0, import_node_fs10.statSync)(p);
|
|
8643
8669
|
if (stat.isFile()) {
|
|
8644
|
-
content = (0,
|
|
8670
|
+
content = (0, import_node_fs10.readFileSync)(p, "utf-8");
|
|
8645
8671
|
} else if (stat.isDirectory()) {
|
|
8646
|
-
const files = (0,
|
|
8647
|
-
content = files.map((f) => (0,
|
|
8672
|
+
const files = (0, import_node_fs10.readdirSync)(p).filter((f) => f.endsWith(".prisma"));
|
|
8673
|
+
content = files.map((f) => (0, import_node_fs10.readFileSync)((0, import_node_path10.join)(p, f), "utf-8")).join("\n");
|
|
8648
8674
|
}
|
|
8649
8675
|
} catch {
|
|
8650
8676
|
continue;
|
|
@@ -8718,7 +8744,7 @@ function extractStringArrayFromNode(node) {
|
|
|
8718
8744
|
return values;
|
|
8719
8745
|
}
|
|
8720
8746
|
function findArrayDecl(root, varName) {
|
|
8721
|
-
function
|
|
8747
|
+
function walk4(node) {
|
|
8722
8748
|
if (node.type === "variable_declarator") {
|
|
8723
8749
|
const nameNode = node.childForFieldName("name");
|
|
8724
8750
|
const valueNode = node.childForFieldName("value");
|
|
@@ -8731,12 +8757,12 @@ function findArrayDecl(root, varName) {
|
|
|
8731
8757
|
}
|
|
8732
8758
|
}
|
|
8733
8759
|
for (const child of node.namedChildren) {
|
|
8734
|
-
const found =
|
|
8760
|
+
const found = walk4(child);
|
|
8735
8761
|
if (found) return found;
|
|
8736
8762
|
}
|
|
8737
8763
|
return null;
|
|
8738
8764
|
}
|
|
8739
|
-
return
|
|
8765
|
+
return walk4(root);
|
|
8740
8766
|
}
|
|
8741
8767
|
function extractObjectPropsRegex(objStr) {
|
|
8742
8768
|
const props = {};
|
|
@@ -8800,14 +8826,14 @@ function extractSeedData(rootDir) {
|
|
|
8800
8826
|
const nodes = [];
|
|
8801
8827
|
const edges = [];
|
|
8802
8828
|
const seedFiles = [
|
|
8803
|
-
(0,
|
|
8804
|
-
(0,
|
|
8805
|
-
(0,
|
|
8806
|
-
].filter(
|
|
8829
|
+
(0, import_node_path10.join)(rootDir, "prisma", "seed.ts"),
|
|
8830
|
+
(0, import_node_path10.join)(rootDir, "prisma", "seed.js"),
|
|
8831
|
+
(0, import_node_path10.join)(rootDir, "src", "server", "lib", "system-tags.ts")
|
|
8832
|
+
].filter(import_node_fs10.existsSync);
|
|
8807
8833
|
const useTreeSitter = tryLoadTreeSitter();
|
|
8808
8834
|
for (const filePath of seedFiles) {
|
|
8809
|
-
const content = (0,
|
|
8810
|
-
const relPath = (0,
|
|
8835
|
+
const content = (0, import_node_fs10.readFileSync)(filePath, "utf-8");
|
|
8836
|
+
const relPath = (0, import_node_path10.relative)(rootDir, filePath);
|
|
8811
8837
|
const seeded = detectSeededArrays(content, relPath);
|
|
8812
8838
|
let astRoot = null;
|
|
8813
8839
|
if (useTreeSitter && parseCode) {
|
|
@@ -8901,11 +8927,11 @@ function extractSeedData(rootDir) {
|
|
|
8901
8927
|
return { nodes, edges };
|
|
8902
8928
|
}
|
|
8903
8929
|
function walkDir(dir, exts) {
|
|
8904
|
-
if (!(0,
|
|
8930
|
+
if (!(0, import_node_fs10.existsSync)(dir)) return [];
|
|
8905
8931
|
const results = [];
|
|
8906
|
-
for (const entry of (0,
|
|
8932
|
+
for (const entry of (0, import_node_fs10.readdirSync)(dir, { withFileTypes: true })) {
|
|
8907
8933
|
if (entry.name === "node_modules" || entry.name === ".next" || entry.name === "dist") continue;
|
|
8908
|
-
const full = (0,
|
|
8934
|
+
const full = (0, import_node_path10.join)(dir, entry.name);
|
|
8909
8935
|
if (entry.isDirectory()) results.push(...walkDir(full, exts));
|
|
8910
8936
|
else if (exts.some((ext) => entry.name.endsWith(ext))) results.push(full);
|
|
8911
8937
|
}
|
|
@@ -8913,11 +8939,11 @@ function walkDir(dir, exts) {
|
|
|
8913
8939
|
}
|
|
8914
8940
|
function extractConstants(rootDir) {
|
|
8915
8941
|
const nodes = [];
|
|
8916
|
-
const srcDir = (0,
|
|
8917
|
-
if (!(0,
|
|
8942
|
+
const srcDir = (0, import_node_path10.join)(rootDir, "src");
|
|
8943
|
+
if (!(0, import_node_fs10.existsSync)(srcDir)) return { nodes };
|
|
8918
8944
|
for (const filePath of walkDir(srcDir, [".ts", ".tsx"])) {
|
|
8919
|
-
const content = (0,
|
|
8920
|
-
const relPath = (0,
|
|
8945
|
+
const content = (0, import_node_fs10.readFileSync)(filePath, "utf-8");
|
|
8946
|
+
const relPath = (0, import_node_path10.relative)(rootDir, filePath);
|
|
8921
8947
|
const constArrayRe = /export\s+const\s+([A-Z][A-Z_0-9]+)\s*(?::[^=]+)?\s*=\s*\[/g;
|
|
8922
8948
|
let cm;
|
|
8923
8949
|
while ((cm = constArrayRe.exec(content)) !== null) {
|
|
@@ -8950,7 +8976,7 @@ function extractConstants(rootDir) {
|
|
|
8950
8976
|
return { nodes };
|
|
8951
8977
|
}
|
|
8952
8978
|
function detect4(rootDir) {
|
|
8953
|
-
return (0,
|
|
8979
|
+
return (0, import_node_fs10.existsSync)((0, import_node_path10.join)(rootDir, "prisma", "schema.prisma")) || (0, import_node_fs10.existsSync)((0, import_node_path10.join)(rootDir, "prisma", "seed.ts"));
|
|
8954
8980
|
}
|
|
8955
8981
|
function generate4(rootDir) {
|
|
8956
8982
|
const enumResult = extractEnumValues(rootDir);
|
|
@@ -9025,26 +9051,9 @@ var staticValuesParser = {
|
|
|
9025
9051
|
};
|
|
9026
9052
|
|
|
9027
9053
|
// src/server/graph/parsers/crosslayer/static-ref-scanner.ts
|
|
9028
|
-
var
|
|
9029
|
-
var
|
|
9054
|
+
var import_node_fs11 = require("node:fs");
|
|
9055
|
+
var import_node_path11 = require("node:path");
|
|
9030
9056
|
init_config();
|
|
9031
|
-
function walk4(dir, exts) {
|
|
9032
|
-
if (!(0, import_node_fs10.existsSync)(dir)) return [];
|
|
9033
|
-
const results = [];
|
|
9034
|
-
function recurse(d) {
|
|
9035
|
-
for (const entry of (0, import_node_fs10.readdirSync)(d, { withFileTypes: true })) {
|
|
9036
|
-
const full = (0, import_node_path10.join)(d, entry.name);
|
|
9037
|
-
if (entry.isDirectory()) {
|
|
9038
|
-
if (entry.name === "node_modules" || entry.name === ".next" || entry.name === "dist") continue;
|
|
9039
|
-
recurse(full);
|
|
9040
|
-
} else if (exts.some((ext) => entry.name.endsWith(ext))) {
|
|
9041
|
-
results.push(full);
|
|
9042
|
-
}
|
|
9043
|
-
}
|
|
9044
|
-
}
|
|
9045
|
-
recurse(dir);
|
|
9046
|
-
return results;
|
|
9047
|
-
}
|
|
9048
9057
|
var MIN_VALUE_LENGTH = 4;
|
|
9049
9058
|
var SKIP_VALUES = /* @__PURE__ */ new Set([
|
|
9050
9059
|
"true",
|
|
@@ -9187,11 +9196,11 @@ var staticRefScannerParser = {
|
|
|
9187
9196
|
if (!paths) return { cross_refs: [], flagged_edges: [], warnings: [] };
|
|
9188
9197
|
const srcDir = paths.srcDir;
|
|
9189
9198
|
const files = [
|
|
9190
|
-
...
|
|
9191
|
-
...
|
|
9192
|
-
...
|
|
9193
|
-
...
|
|
9194
|
-
...
|
|
9199
|
+
...walkWithIgnore((0, import_node_path11.join)(srcDir, "client"), [".ts", ".tsx"]),
|
|
9200
|
+
...walkWithIgnore(paths.appDir, [".ts", ".tsx"]),
|
|
9201
|
+
...walkWithIgnore((0, import_node_path11.join)(srcDir, "server"), [".ts", ".tsx"]),
|
|
9202
|
+
...walkWithIgnore((0, import_node_path11.join)(srcDir, "lib"), [".ts", ".tsx"]),
|
|
9203
|
+
...walkWithIgnore((0, import_node_path11.join)(srcDir, "config"), [".ts", ".tsx"])
|
|
9195
9204
|
];
|
|
9196
9205
|
const uiOutput = layerOutputs.get("ui");
|
|
9197
9206
|
const apiOutput = layerOutputs.get("api");
|
|
@@ -9209,10 +9218,10 @@ var staticRefScannerParser = {
|
|
|
9209
9218
|
const seen = /* @__PURE__ */ new Set();
|
|
9210
9219
|
let filesScanned = 0;
|
|
9211
9220
|
for (const absPath of files) {
|
|
9212
|
-
const sourceId = (0,
|
|
9221
|
+
const sourceId = (0, import_node_path11.relative)(srcDir, absPath).replace(/\\/g, "/");
|
|
9213
9222
|
const sourceLayer = uiNodeIds.has(sourceId) ? "ui" : apiNodeIds.has(sourceId) ? "api" : null;
|
|
9214
9223
|
if (!sourceLayer) continue;
|
|
9215
|
-
const content = (0,
|
|
9224
|
+
const content = (0, import_node_fs11.readFileSync)(absPath, "utf-8");
|
|
9216
9225
|
filesScanned++;
|
|
9217
9226
|
let fileRefs;
|
|
9218
9227
|
if (parseCode2) {
|
|
@@ -9328,7 +9337,7 @@ function registerBuiltins(registry, disabled) {
|
|
|
9328
9337
|
function loadCustomParsers(registry, config, rootDir, disabled) {
|
|
9329
9338
|
for (const entry of config.parsers?.custom ?? []) {
|
|
9330
9339
|
try {
|
|
9331
|
-
const absPath = (0,
|
|
9340
|
+
const absPath = (0, import_node_path12.resolve)(rootDir, entry.path);
|
|
9332
9341
|
const mod = require(absPath);
|
|
9333
9342
|
const parser = "default" in mod ? mod.default : mod;
|
|
9334
9343
|
if (disabled.has(parser.id)) continue;
|
|
@@ -9458,10 +9467,10 @@ function applyCrossLayerResults(uiOutput, results) {
|
|
|
9458
9467
|
|
|
9459
9468
|
// src/server/graph/core/graph-builder.ts
|
|
9460
9469
|
function readGraphFromDisk(rootDir, layer) {
|
|
9461
|
-
const filePath = (0,
|
|
9462
|
-
if (!(0,
|
|
9470
|
+
const filePath = (0, import_node_path13.join)(rootDir, ".launchsecure", "graphs", `${layer}.json`);
|
|
9471
|
+
if (!(0, import_node_fs12.existsSync)(filePath)) return null;
|
|
9463
9472
|
try {
|
|
9464
|
-
return JSON.parse((0,
|
|
9473
|
+
return JSON.parse((0, import_node_fs12.readFileSync)(filePath, "utf-8"));
|
|
9465
9474
|
} catch {
|
|
9466
9475
|
return null;
|
|
9467
9476
|
}
|
|
@@ -9562,11 +9571,11 @@ function generateAll(rootDir) {
|
|
|
9562
9571
|
init_config();
|
|
9563
9572
|
|
|
9564
9573
|
// src/server/graph/core/tagger-registry.ts
|
|
9565
|
-
var
|
|
9574
|
+
var import_node_path15 = require("node:path");
|
|
9566
9575
|
|
|
9567
9576
|
// src/server/graph/taggers/module-tagger.ts
|
|
9568
|
-
var
|
|
9569
|
-
var
|
|
9577
|
+
var import_node_fs13 = require("node:fs");
|
|
9578
|
+
var import_node_path14 = require("node:path");
|
|
9570
9579
|
function matchGlob(pattern, id) {
|
|
9571
9580
|
const patParts = pattern.split("/");
|
|
9572
9581
|
const idParts = id.split("/");
|
|
@@ -9599,18 +9608,18 @@ function detectConventionDirs(rootDir, extraConventionDirs = []) {
|
|
|
9599
9608
|
const conventionDirs = [...CONVENTION_DIRS_BUILTIN, ...extraConventionDirs];
|
|
9600
9609
|
const searchDirs = [
|
|
9601
9610
|
rootDir,
|
|
9602
|
-
(0,
|
|
9603
|
-
(0,
|
|
9604
|
-
(0,
|
|
9611
|
+
(0, import_node_path14.join)(rootDir, "src"),
|
|
9612
|
+
(0, import_node_path14.join)(rootDir, "app"),
|
|
9613
|
+
(0, import_node_path14.join)(rootDir, "lib")
|
|
9605
9614
|
];
|
|
9606
9615
|
for (const base of searchDirs) {
|
|
9607
9616
|
for (const convention of conventionDirs) {
|
|
9608
|
-
const dir = (0,
|
|
9609
|
-
if (!(0,
|
|
9617
|
+
const dir = (0, import_node_path14.join)(base, convention);
|
|
9618
|
+
if (!(0, import_node_fs13.existsSync)(dir)) continue;
|
|
9610
9619
|
try {
|
|
9611
|
-
const stat = (0,
|
|
9620
|
+
const stat = (0, import_node_fs13.statSync)(dir);
|
|
9612
9621
|
if (!stat.isDirectory()) continue;
|
|
9613
|
-
const entries = (0,
|
|
9622
|
+
const entries = (0, import_node_fs13.readdirSync)(dir, { withFileTypes: true }).filter((e) => e.isDirectory() && !e.name.startsWith(".")).map((e) => e.name);
|
|
9614
9623
|
if (entries.length > 0) {
|
|
9615
9624
|
const relPath = dir.replace(rootDir + "/", "").replace(rootDir + "\\", "");
|
|
9616
9625
|
result.set(relPath, entries);
|
|
@@ -9904,7 +9913,7 @@ function loadCustomTaggers(registry, config, rootDir, disabled) {
|
|
|
9904
9913
|
for (const entry of config.taggers?.custom ?? []) {
|
|
9905
9914
|
if (disabled.has(entry.id)) continue;
|
|
9906
9915
|
try {
|
|
9907
|
-
const absPath = (0,
|
|
9916
|
+
const absPath = (0, import_node_path15.resolve)(rootDir, entry.path);
|
|
9908
9917
|
const mod = require(absPath);
|
|
9909
9918
|
const tagger = "default" in mod ? mod.default : mod;
|
|
9910
9919
|
const override = config.taggers?.trackUntagged?.[tagger.id];
|
|
@@ -9927,24 +9936,24 @@ function createTaggerRegistry(config, rootDir) {
|
|
|
9927
9936
|
}
|
|
9928
9937
|
|
|
9929
9938
|
// src/server/graph/core/tag-store.ts
|
|
9930
|
-
var
|
|
9931
|
-
var
|
|
9939
|
+
var import_node_fs14 = require("node:fs");
|
|
9940
|
+
var import_node_path16 = require("node:path");
|
|
9932
9941
|
var TAGS_FILENAME = "tags.json";
|
|
9933
9942
|
var GRAPHS_DIR = ".launchsecure/graphs";
|
|
9934
9943
|
var tagCache = /* @__PURE__ */ new Map();
|
|
9935
9944
|
function tagsFilePath(rootDir) {
|
|
9936
|
-
return (0,
|
|
9945
|
+
return (0, import_node_path16.join)(rootDir, GRAPHS_DIR, TAGS_FILENAME);
|
|
9937
9946
|
}
|
|
9938
9947
|
function readTagStore(rootDir) {
|
|
9939
9948
|
const filePath = tagsFilePath(rootDir);
|
|
9940
|
-
if (!(0,
|
|
9941
|
-
const stat = (0,
|
|
9949
|
+
if (!(0, import_node_fs14.existsSync)(filePath)) return {};
|
|
9950
|
+
const stat = (0, import_node_fs14.statSync)(filePath);
|
|
9942
9951
|
const cached = tagCache.get(filePath);
|
|
9943
9952
|
if (cached && cached.mtimeMs === stat.mtimeMs) {
|
|
9944
9953
|
return cached.store;
|
|
9945
9954
|
}
|
|
9946
9955
|
try {
|
|
9947
|
-
const content = (0,
|
|
9956
|
+
const content = (0, import_node_fs14.readFileSync)(filePath, "utf-8");
|
|
9948
9957
|
const store = JSON.parse(content);
|
|
9949
9958
|
tagCache.set(filePath, { mtimeMs: stat.mtimeMs, store });
|
|
9950
9959
|
return store;
|
|
@@ -9954,15 +9963,15 @@ function readTagStore(rootDir) {
|
|
|
9954
9963
|
}
|
|
9955
9964
|
function writeTagStore(rootDir, store) {
|
|
9956
9965
|
const filePath = tagsFilePath(rootDir);
|
|
9957
|
-
const dir = (0,
|
|
9958
|
-
(0,
|
|
9966
|
+
const dir = (0, import_node_path16.dirname)(filePath);
|
|
9967
|
+
(0, import_node_fs14.mkdirSync)(dir, { recursive: true });
|
|
9959
9968
|
const cleaned = {};
|
|
9960
9969
|
for (const [nodeId, tags] of Object.entries(store)) {
|
|
9961
9970
|
if (Object.keys(tags).length > 0) {
|
|
9962
9971
|
cleaned[nodeId] = tags;
|
|
9963
9972
|
}
|
|
9964
9973
|
}
|
|
9965
|
-
(0,
|
|
9974
|
+
(0, import_node_fs14.writeFileSync)(filePath, JSON.stringify(cleaned, null, 2) + "\n", "utf-8");
|
|
9966
9975
|
tagCache.delete(filePath);
|
|
9967
9976
|
}
|
|
9968
9977
|
function setTag(rootDir, nodeId, key, value) {
|
|
@@ -9985,24 +9994,24 @@ function removeTag(rootDir, nodeId, key) {
|
|
|
9985
9994
|
init_ts_extractor();
|
|
9986
9995
|
var GRAPHS_DIR2 = ".launchsecure/graphs";
|
|
9987
9996
|
function getAvailableLayers(rootDir) {
|
|
9988
|
-
const dir = (0,
|
|
9989
|
-
if (!(0,
|
|
9990
|
-
return (0,
|
|
9997
|
+
const dir = (0, import_node_path17.join)(rootDir, GRAPHS_DIR2);
|
|
9998
|
+
if (!(0, import_node_fs15.existsSync)(dir)) return [];
|
|
9999
|
+
return (0, import_node_fs15.readdirSync)(dir).filter((f) => f.endsWith(".json") && f !== "tags.json").map((f) => f.replace(".json", ""));
|
|
9991
10000
|
}
|
|
9992
10001
|
var graphCache = /* @__PURE__ */ new Map();
|
|
9993
10002
|
var taggedCache = /* @__PURE__ */ new Map();
|
|
9994
10003
|
function graphsDir(rootDir) {
|
|
9995
|
-
return (0,
|
|
10004
|
+
return (0, import_node_path17.join)(rootDir, GRAPHS_DIR2);
|
|
9996
10005
|
}
|
|
9997
10006
|
function graphFilePath(rootDir, layer) {
|
|
9998
|
-
return (0,
|
|
10007
|
+
return (0, import_node_path17.join)(graphsDir(rootDir), `${layer}.json`);
|
|
9999
10008
|
}
|
|
10000
10009
|
function tagsFilePath2(rootDir) {
|
|
10001
|
-
return (0,
|
|
10010
|
+
return (0, import_node_path17.join)(graphsDir(rootDir), "tags.json");
|
|
10002
10011
|
}
|
|
10003
10012
|
function getMtimeMs(filePath) {
|
|
10004
|
-
if (!(0,
|
|
10005
|
-
return (0,
|
|
10013
|
+
if (!(0, import_node_fs15.existsSync)(filePath)) return 0;
|
|
10014
|
+
return (0, import_node_fs15.statSync)(filePath).mtimeMs;
|
|
10006
10015
|
}
|
|
10007
10016
|
function invalidateCache(filePath) {
|
|
10008
10017
|
graphCache.delete(filePath);
|
|
@@ -10041,20 +10050,20 @@ function applyTags(graph, layer, rootDir) {
|
|
|
10041
10050
|
}
|
|
10042
10051
|
function readGraphRaw(rootDir, layer) {
|
|
10043
10052
|
const filePath = graphFilePath(rootDir, layer);
|
|
10044
|
-
if (!(0,
|
|
10045
|
-
const stat = (0,
|
|
10053
|
+
if (!(0, import_node_fs15.existsSync)(filePath)) return null;
|
|
10054
|
+
const stat = (0, import_node_fs15.statSync)(filePath);
|
|
10046
10055
|
const cached = graphCache.get(filePath);
|
|
10047
10056
|
if (cached && cached.mtimeMs === stat.mtimeMs) {
|
|
10048
10057
|
return cached.graph;
|
|
10049
10058
|
}
|
|
10050
|
-
const content = (0,
|
|
10059
|
+
const content = (0, import_node_fs15.readFileSync)(filePath, "utf-8");
|
|
10051
10060
|
const graph = JSON.parse(content);
|
|
10052
10061
|
graphCache.set(filePath, { mtimeMs: stat.mtimeMs, graph });
|
|
10053
10062
|
return graph;
|
|
10054
10063
|
}
|
|
10055
10064
|
function readGraph(rootDir, layer) {
|
|
10056
10065
|
const rawFilePath = graphFilePath(rootDir, layer);
|
|
10057
|
-
if (!(0,
|
|
10066
|
+
if (!(0, import_node_fs15.existsSync)(rawFilePath)) return null;
|
|
10058
10067
|
const rawMtime = getMtimeMs(rawFilePath);
|
|
10059
10068
|
const tagsMtime = getMtimeMs(tagsFilePath2(rootDir));
|
|
10060
10069
|
const cacheKey = `${rootDir}:${layer}`;
|
|
@@ -10084,11 +10093,11 @@ async function generateGraph(rootDir, layer) {
|
|
|
10084
10093
|
mutationMethods: config.parsers?.patterns?.mutationMethods
|
|
10085
10094
|
});
|
|
10086
10095
|
const dir = graphsDir(rootDir);
|
|
10087
|
-
(0,
|
|
10096
|
+
(0, import_node_fs15.mkdirSync)(dir, { recursive: true });
|
|
10088
10097
|
const results = layer ? [generateLayer(rootDir, layer)].filter((r) => r !== null) : generateAll(rootDir);
|
|
10089
10098
|
for (const result of results) {
|
|
10090
10099
|
const filePath = graphFilePath(rootDir, result.layer);
|
|
10091
|
-
(0,
|
|
10100
|
+
(0, import_node_fs15.writeFileSync)(filePath, JSON.stringify(result.output, null, 2) + "\n", "utf-8");
|
|
10092
10101
|
invalidateCache(filePath);
|
|
10093
10102
|
invalidateTaggedCache(rootDir, result.layer);
|
|
10094
10103
|
}
|
|
@@ -10155,208 +10164,6 @@ var import_node_path21 = require("node:path");
|
|
|
10155
10164
|
var import_node_child_process2 = require("node:child_process");
|
|
10156
10165
|
var import_node_os2 = require("node:os");
|
|
10157
10166
|
|
|
10158
|
-
// src/server/blast-radius-builder.ts
|
|
10159
|
-
var import_node_fs15 = __toESM(require("node:fs"));
|
|
10160
|
-
var import_node_path17 = require("node:path");
|
|
10161
|
-
var FALLBACK_DEFAULTS = {
|
|
10162
|
-
rings: [
|
|
10163
|
-
{ id: "modify", name: "Modify", color: "#ff6b00" },
|
|
10164
|
-
{ id: "ripple", name: "Ripple (verify)", color: "#ffff00" },
|
|
10165
|
-
{ id: "create", name: "Create", color: "#00ff00" }
|
|
10166
|
-
],
|
|
10167
|
-
layers: {
|
|
10168
|
-
db: { name: "Database", icon: "database", color: "#cbd5e1" },
|
|
10169
|
-
api: { name: "API", icon: "server", color: "#cbd5e1" },
|
|
10170
|
-
middleware: { name: "Middleware", icon: "shield", color: "#cbd5e1" },
|
|
10171
|
-
ui: { name: "UI", icon: "layout-dashboard", color: "#cbd5e1" },
|
|
10172
|
-
config: { name: "Config / Seed", icon: "settings", color: "#cbd5e1" },
|
|
10173
|
-
shared: { name: "Shared Types", icon: "box", color: "#cbd5e1" }
|
|
10174
|
-
},
|
|
10175
|
-
center: { color: "#ff0000" }
|
|
10176
|
-
};
|
|
10177
|
-
function loadDefaults(rootDir) {
|
|
10178
|
-
const filePath = (0, import_node_path17.join)(rootDir, ".launchsecure", "blast-radius-defaults.json");
|
|
10179
|
-
try {
|
|
10180
|
-
if (import_node_fs15.default.existsSync(filePath)) {
|
|
10181
|
-
const raw = import_node_fs15.default.readFileSync(filePath, "utf-8");
|
|
10182
|
-
return JSON.parse(raw);
|
|
10183
|
-
}
|
|
10184
|
-
} catch {
|
|
10185
|
-
}
|
|
10186
|
-
return FALLBACK_DEFAULTS;
|
|
10187
|
-
}
|
|
10188
|
-
function generateAcceptance(node, inspect) {
|
|
10189
|
-
const criteria = [];
|
|
10190
|
-
const t = node.type?.toLowerCase() ?? "";
|
|
10191
|
-
if (t === "endpoint" || t === "mcp-tool") {
|
|
10192
|
-
const methods = inspect?.methods ?? [];
|
|
10193
|
-
const path9 = inspect?.path ?? node.id;
|
|
10194
|
-
if (methods.length > 0) {
|
|
10195
|
-
criteria.push(`${methods.join("/")} ${path9} still returns correct responses for authorized users`);
|
|
10196
|
-
} else {
|
|
10197
|
-
criteria.push(`${path9} still responds correctly`);
|
|
10198
|
-
}
|
|
10199
|
-
if (inspect?.auth && inspect.auth.includes("withAuth")) {
|
|
10200
|
-
criteria.push("Authentication and authorization still enforced");
|
|
10201
|
-
}
|
|
10202
|
-
if (inspect?.db_models && inspect.db_models.length > 0) {
|
|
10203
|
-
criteria.push(`DB operations on ${inspect.db_models.join(", ")} still work correctly`);
|
|
10204
|
-
}
|
|
10205
|
-
} else if (t === "page" || t === "component" || t === "layout") {
|
|
10206
|
-
criteria.push(`${node.name} renders without errors`);
|
|
10207
|
-
if (inspect?.stateVars && inspect.stateVars.length > 0) {
|
|
10208
|
-
criteria.push("State management still works correctly");
|
|
10209
|
-
}
|
|
10210
|
-
if (inspect?.elements && inspect.elements.length > 5) {
|
|
10211
|
-
criteria.push("All child components render correctly");
|
|
10212
|
-
}
|
|
10213
|
-
} else if (t === "table" || t === "enum") {
|
|
10214
|
-
criteria.push(`${node.name} schema unchanged or migration applies cleanly`);
|
|
10215
|
-
criteria.push("Existing queries against this table still work");
|
|
10216
|
-
} else if (t === "hook") {
|
|
10217
|
-
criteria.push(`${node.name} returns expected shape`);
|
|
10218
|
-
if (inspect?.stateVars && inspect.stateVars.length > 0) {
|
|
10219
|
-
criteria.push(`State variables [${inspect.stateVars.map((s) => s.name).join(", ")}] still returned`);
|
|
10220
|
-
}
|
|
10221
|
-
} else if (t === "context") {
|
|
10222
|
-
criteria.push(`${node.name} provides correct context to consumers`);
|
|
10223
|
-
} else if (t === "lib" || t === "config" || t === "types") {
|
|
10224
|
-
criteria.push(`${node.name} exports still conform to expected interface`);
|
|
10225
|
-
} else if (t === "seed" || t === "seed_role" || t === "seed_permission") {
|
|
10226
|
-
criteria.push("Seed runs without errors");
|
|
10227
|
-
criteria.push("Expected rows created in database");
|
|
10228
|
-
} else {
|
|
10229
|
-
criteria.push("Verify no regression");
|
|
10230
|
-
}
|
|
10231
|
-
return criteria;
|
|
10232
|
-
}
|
|
10233
|
-
function buildManifest(input) {
|
|
10234
|
-
const { mode, title, description, subtitle, blastResults, createNodes, inspectData, defaults } = input;
|
|
10235
|
-
const nodeMap = /* @__PURE__ */ new Map();
|
|
10236
|
-
const centerNodeIds = /* @__PURE__ */ new Set();
|
|
10237
|
-
for (const result of blastResults) {
|
|
10238
|
-
centerNodeIds.add(result.center.id);
|
|
10239
|
-
for (const node of result.affected) {
|
|
10240
|
-
const existing = nodeMap.get(node.id);
|
|
10241
|
-
if (!existing || node.hop < existing.hop) {
|
|
10242
|
-
nodeMap.set(node.id, node);
|
|
10243
|
-
}
|
|
10244
|
-
}
|
|
10245
|
-
}
|
|
10246
|
-
for (const id of centerNodeIds) {
|
|
10247
|
-
nodeMap.delete(id);
|
|
10248
|
-
}
|
|
10249
|
-
const manifestNodes = [];
|
|
10250
|
-
for (const result of blastResults) {
|
|
10251
|
-
const c = result.center;
|
|
10252
|
-
if (manifestNodes.some((n) => n.id === c.id)) continue;
|
|
10253
|
-
const inspect = inspectData[c.id];
|
|
10254
|
-
manifestNodes.push({
|
|
10255
|
-
id: c.id,
|
|
10256
|
-
name: c.name,
|
|
10257
|
-
layer: c.layer,
|
|
10258
|
-
ring: "modify",
|
|
10259
|
-
type: c.type,
|
|
10260
|
-
reason: `Direct change target`,
|
|
10261
|
-
acceptance: generateAcceptance(
|
|
10262
|
-
{ id: c.id, name: c.name, type: c.type, layer: c.layer, hop: 0 },
|
|
10263
|
-
inspect
|
|
10264
|
-
)
|
|
10265
|
-
});
|
|
10266
|
-
}
|
|
10267
|
-
for (const [, node] of nodeMap) {
|
|
10268
|
-
const ring = node.hop <= 1 ? "modify" : "ripple";
|
|
10269
|
-
const inspect = inspectData[node.id];
|
|
10270
|
-
const reason = node.hop <= 1 ? `Directly depends on changed node` : `Indirect dependency (${node.hop} hops away)`;
|
|
10271
|
-
manifestNodes.push({
|
|
10272
|
-
id: node.id,
|
|
10273
|
-
name: node.name,
|
|
10274
|
-
layer: node.layer,
|
|
10275
|
-
ring,
|
|
10276
|
-
type: node.type,
|
|
10277
|
-
reason,
|
|
10278
|
-
acceptance: generateAcceptance(node, inspect)
|
|
10279
|
-
});
|
|
10280
|
-
}
|
|
10281
|
-
for (const cn of createNodes) {
|
|
10282
|
-
manifestNodes.push({
|
|
10283
|
-
id: cn.id,
|
|
10284
|
-
name: cn.name,
|
|
10285
|
-
layer: cn.layer,
|
|
10286
|
-
ring: "create",
|
|
10287
|
-
type: cn.type ?? "unknown",
|
|
10288
|
-
reason: cn.reason,
|
|
10289
|
-
acceptance: cn.acceptance ?? ["Verify implementation matches spec"]
|
|
10290
|
-
});
|
|
10291
|
-
}
|
|
10292
|
-
const layerIds = /* @__PURE__ */ new Set();
|
|
10293
|
-
for (const n of manifestNodes) {
|
|
10294
|
-
layerIds.add(n.layer);
|
|
10295
|
-
}
|
|
10296
|
-
const layers = [];
|
|
10297
|
-
for (const id of layerIds) {
|
|
10298
|
-
const def = defaults.layers[id];
|
|
10299
|
-
if (def) {
|
|
10300
|
-
layers.push({ id, name: def.name, icon: def.icon, color: def.color });
|
|
10301
|
-
} else {
|
|
10302
|
-
layers.push({ id, name: id, icon: "box", color: "#cbd5e1" });
|
|
10303
|
-
}
|
|
10304
|
-
}
|
|
10305
|
-
const edgeSet = /* @__PURE__ */ new Set();
|
|
10306
|
-
const edges = [];
|
|
10307
|
-
const allNodeIds = new Set(manifestNodes.map((n) => n.id));
|
|
10308
|
-
for (const cId of centerNodeIds) {
|
|
10309
|
-
for (const result of blastResults) {
|
|
10310
|
-
for (const affected of result.affected) {
|
|
10311
|
-
if (affected.hop === 1 && result.center.id === cId && allNodeIds.has(affected.id)) {
|
|
10312
|
-
const key = `${cId}->${affected.id}`;
|
|
10313
|
-
if (!edgeSet.has(key)) {
|
|
10314
|
-
edgeSet.add(key);
|
|
10315
|
-
edges.push({ source: cId, target: affected.id });
|
|
10316
|
-
}
|
|
10317
|
-
}
|
|
10318
|
-
}
|
|
10319
|
-
}
|
|
10320
|
-
}
|
|
10321
|
-
for (const result of blastResults) {
|
|
10322
|
-
if (result.edges) {
|
|
10323
|
-
for (const edge of result.edges) {
|
|
10324
|
-
if (allNodeIds.has(edge.source) && allNodeIds.has(edge.target)) {
|
|
10325
|
-
const key = `${edge.source}->${edge.target}`;
|
|
10326
|
-
if (!edgeSet.has(key)) {
|
|
10327
|
-
edgeSet.add(key);
|
|
10328
|
-
edges.push({ source: edge.source, target: edge.target });
|
|
10329
|
-
}
|
|
10330
|
-
}
|
|
10331
|
-
}
|
|
10332
|
-
}
|
|
10333
|
-
}
|
|
10334
|
-
for (const cn of createNodes) {
|
|
10335
|
-
edges.push({ source: "center", target: cn.id });
|
|
10336
|
-
if (cn.connects_to) {
|
|
10337
|
-
for (const targetId of cn.connects_to) {
|
|
10338
|
-
if (allNodeIds.has(targetId) || createNodes.some((c) => c.id === targetId)) {
|
|
10339
|
-
const key = `${cn.id}->${targetId}`;
|
|
10340
|
-
if (!edgeSet.has(key)) {
|
|
10341
|
-
edgeSet.add(key);
|
|
10342
|
-
edges.push({ source: cn.id, target: targetId });
|
|
10343
|
-
}
|
|
10344
|
-
}
|
|
10345
|
-
}
|
|
10346
|
-
}
|
|
10347
|
-
}
|
|
10348
|
-
return {
|
|
10349
|
-
mode,
|
|
10350
|
-
title,
|
|
10351
|
-
subtitle,
|
|
10352
|
-
layers,
|
|
10353
|
-
rings: defaults.rings,
|
|
10354
|
-
center: { name: title, description },
|
|
10355
|
-
nodes: manifestNodes,
|
|
10356
|
-
edges
|
|
10357
|
-
};
|
|
10358
|
-
}
|
|
10359
|
-
|
|
10360
10167
|
// src/server/lockfile.ts
|
|
10361
10168
|
var import_node_child_process = require("node:child_process");
|
|
10362
10169
|
var import_node_fs16 = require("node:fs");
|
|
@@ -11178,81 +10985,6 @@ Example: blast_points(node_id: "server/auth/middleware.ts", hops: 2) \u2192 retu
|
|
|
11178
10985
|
},
|
|
11179
10986
|
required: ["node_id"]
|
|
11180
10987
|
}
|
|
11181
|
-
},
|
|
11182
|
-
{
|
|
11183
|
-
name: "generate_blast_radius",
|
|
11184
|
-
description: `Generate a complete BlastRadiusManifest from graph data \u2014 ready to push to deck.
|
|
11185
|
-
|
|
11186
|
-
Two modes:
|
|
11187
|
-
- **Structural**: single node changed \u2192 auto-discover what's affected via reverse BFS
|
|
11188
|
-
Example: generate_blast_radius({ mode: "structural", node_id: "CommentChannel", title: "CommentChannel refactor" })
|
|
11189
|
-
- **Feature**: new feature \u2192 multiple starting nodes + new nodes to create
|
|
11190
|
-
Example: generate_blast_radius({ mode: "feature", title: "Client Role", description: "...", center_nodes: ["CommentChannel", "ProjectMember"], create_nodes: [{ id: "ChannelMember", name: "ChannelMember table", layer: "db", reason: "..." }] })
|
|
11191
|
-
|
|
11192
|
-
Output is a BlastRadiusManifest JSON that passes directly to the deck tool's blast-radius block.
|
|
11193
|
-
Reads ring/layer/center colors from .launchsecure/blast-radius-defaults.json.
|
|
11194
|
-
Auto-generates acceptance criteria per node using inspect_node AST data.`,
|
|
11195
|
-
inputSchema: {
|
|
11196
|
-
type: "object",
|
|
11197
|
-
properties: {
|
|
11198
|
-
mode: {
|
|
11199
|
-
type: "string",
|
|
11200
|
-
enum: ["structural", "feature"],
|
|
11201
|
-
description: '"structural" = single node changed. "feature" = new feature with multiple nodes.'
|
|
11202
|
-
},
|
|
11203
|
-
title: {
|
|
11204
|
-
type: "string",
|
|
11205
|
-
description: "Title for the blast radius (shown in center node and header)."
|
|
11206
|
-
},
|
|
11207
|
-
description: {
|
|
11208
|
-
type: "string",
|
|
11209
|
-
description: "Description of the change or feature."
|
|
11210
|
-
},
|
|
11211
|
-
subtitle: {
|
|
11212
|
-
type: "string",
|
|
11213
|
-
description: "Optional subtitle shown above title in the viz."
|
|
11214
|
-
},
|
|
11215
|
-
node_id: {
|
|
11216
|
-
type: "string",
|
|
11217
|
-
description: "Structural mode only: the node being changed."
|
|
11218
|
-
},
|
|
11219
|
-
center_nodes: {
|
|
11220
|
-
type: "array",
|
|
11221
|
-
items: { type: "string" },
|
|
11222
|
-
description: "Feature mode: existing graph node IDs that are the starting points for traversal."
|
|
11223
|
-
},
|
|
11224
|
-
create_nodes: {
|
|
11225
|
-
type: "array",
|
|
11226
|
-
items: {
|
|
11227
|
-
type: "object",
|
|
11228
|
-
properties: {
|
|
11229
|
-
id: { type: "string" },
|
|
11230
|
-
name: { type: "string" },
|
|
11231
|
-
layer: { type: "string" },
|
|
11232
|
-
type: { type: "string" },
|
|
11233
|
-
reason: { type: "string" },
|
|
11234
|
-
acceptance: { type: "array", items: { type: "string" } },
|
|
11235
|
-
connects_to: { type: "array", items: { type: "string" }, description: "IDs of existing nodes this new node has FK/relationship edges to." }
|
|
11236
|
-
},
|
|
11237
|
-
required: ["id", "name", "layer", "reason"]
|
|
11238
|
-
},
|
|
11239
|
-
description: "Feature mode: new nodes that need to be created (not in graph yet)."
|
|
11240
|
-
},
|
|
11241
|
-
hops: {
|
|
11242
|
-
type: "number",
|
|
11243
|
-
description: "Max hops for traversal. Default 2. Hop 1 = modify ring, hop 2+ = ripple ring."
|
|
11244
|
-
},
|
|
11245
|
-
push_to_deck: {
|
|
11246
|
-
type: "boolean",
|
|
11247
|
-
description: "If true, pushes the manifest directly to LaunchDeck browser (requires deck server running). Default false."
|
|
11248
|
-
},
|
|
11249
|
-
session: {
|
|
11250
|
-
type: "string",
|
|
11251
|
-
description: "Session name for the deck tab. Required when push_to_deck is true."
|
|
11252
|
-
}
|
|
11253
|
-
},
|
|
11254
|
-
required: ["title"]
|
|
11255
|
-
}
|
|
11256
10988
|
}
|
|
11257
10989
|
];
|
|
11258
10990
|
function matchesSearch(node, query) {
|
|
@@ -11529,144 +11261,6 @@ function handleBlastPoints(args) {
|
|
|
11529
11261
|
}
|
|
11530
11262
|
});
|
|
11531
11263
|
}
|
|
11532
|
-
function handleGenerateBlastRadius(args) {
|
|
11533
|
-
const rootDir = process.cwd();
|
|
11534
|
-
const mode = args.mode ?? "structural";
|
|
11535
|
-
const title = args.title;
|
|
11536
|
-
const description = args.description ?? title;
|
|
11537
|
-
const subtitle = args.subtitle;
|
|
11538
|
-
const hops = args.hops ?? 2;
|
|
11539
|
-
const defaults = loadDefaults(rootDir);
|
|
11540
|
-
let centerNodeIds = [];
|
|
11541
|
-
if (mode === "structural") {
|
|
11542
|
-
const nodeId = args.node_id;
|
|
11543
|
-
if (!nodeId) return err("structural mode requires node_id");
|
|
11544
|
-
centerNodeIds = [nodeId];
|
|
11545
|
-
} else {
|
|
11546
|
-
centerNodeIds = args.center_nodes ?? [];
|
|
11547
|
-
if (centerNodeIds.length === 0) return err("feature mode requires center_nodes[]");
|
|
11548
|
-
}
|
|
11549
|
-
const createNodes = args.create_nodes ?? [];
|
|
11550
|
-
const blastResults = [];
|
|
11551
|
-
for (const nodeId of centerNodeIds) {
|
|
11552
|
-
let targetLayer;
|
|
11553
|
-
const graphs = readAllGraphs(rootDir);
|
|
11554
|
-
for (const [layer, graph2] of Object.entries(graphs)) {
|
|
11555
|
-
if (graph2 && graph2.nodes.some((n) => n.id === nodeId)) {
|
|
11556
|
-
targetLayer = layer;
|
|
11557
|
-
break;
|
|
11558
|
-
}
|
|
11559
|
-
}
|
|
11560
|
-
if (!targetLayer) continue;
|
|
11561
|
-
const graph = readGraph(rootDir, targetLayer);
|
|
11562
|
-
if (!graph) continue;
|
|
11563
|
-
const center = graph.nodes.find((n) => n.id === nodeId);
|
|
11564
|
-
if (!center) continue;
|
|
11565
|
-
const result2 = reverseNeighborhood(graph, nodeId, hops, "reverse");
|
|
11566
|
-
const affected = [];
|
|
11567
|
-
for (const [id, { node, hop }] of result2.nodes) {
|
|
11568
|
-
if (id === nodeId) continue;
|
|
11569
|
-
const tags = node.tags;
|
|
11570
|
-
affected.push({ id: node.id, name: node.name, type: node.type, layer: targetLayer, hop, module: tags?.module });
|
|
11571
|
-
}
|
|
11572
|
-
const otherLayers = getAvailableLayers(rootDir).filter((l) => l !== targetLayer && l !== "static");
|
|
11573
|
-
for (const otherLayer of otherLayers) {
|
|
11574
|
-
const otherGraph = readGraph(rootDir, otherLayer);
|
|
11575
|
-
if (!otherGraph) continue;
|
|
11576
|
-
for (const edge of otherGraph.edges) {
|
|
11577
|
-
if (edge.target === nodeId || edge.source === nodeId) {
|
|
11578
|
-
const dependentId = edge.target === nodeId ? edge.source : edge.target;
|
|
11579
|
-
if (affected.some((a) => a.id === dependentId)) continue;
|
|
11580
|
-
const depNode = otherGraph.nodes.find((n) => n.id === dependentId);
|
|
11581
|
-
if (depNode) {
|
|
11582
|
-
const tags = depNode.tags;
|
|
11583
|
-
affected.push({ id: depNode.id, name: depNode.name, type: depNode.type, layer: otherLayer, hop: 1, module: tags?.module });
|
|
11584
|
-
}
|
|
11585
|
-
}
|
|
11586
|
-
}
|
|
11587
|
-
}
|
|
11588
|
-
const centerTags = center.tags;
|
|
11589
|
-
const edges = result2.edges.map((e) => ({ source: e.source, target: e.target }));
|
|
11590
|
-
blastResults.push({
|
|
11591
|
-
center: { id: center.id, name: center.name, type: center.type, layer: targetLayer, module: centerTags?.module },
|
|
11592
|
-
affected,
|
|
11593
|
-
edges
|
|
11594
|
-
});
|
|
11595
|
-
}
|
|
11596
|
-
if (blastResults.length === 0) {
|
|
11597
|
-
return err(`None of the center nodes were found in any graph layer: ${centerNodeIds.join(", ")}`);
|
|
11598
|
-
}
|
|
11599
|
-
const inspectData = {};
|
|
11600
|
-
const allAffectedIds = /* @__PURE__ */ new Set();
|
|
11601
|
-
for (const r of blastResults) {
|
|
11602
|
-
allAffectedIds.add(r.center.id);
|
|
11603
|
-
for (const a of r.affected) allAffectedIds.add(a.id);
|
|
11604
|
-
}
|
|
11605
|
-
const allGraphs = readAllGraphs(rootDir);
|
|
11606
|
-
for (const id of allAffectedIds) {
|
|
11607
|
-
for (const [, graph] of Object.entries(allGraphs)) {
|
|
11608
|
-
if (!graph) continue;
|
|
11609
|
-
const node = graph.nodes.find((n) => n.id === id);
|
|
11610
|
-
if (node) {
|
|
11611
|
-
inspectData[id] = {
|
|
11612
|
-
type: node.type,
|
|
11613
|
-
name: node.name,
|
|
11614
|
-
methods: node.methods,
|
|
11615
|
-
path: node.path ?? node.handler,
|
|
11616
|
-
auth: node.auth,
|
|
11617
|
-
db_models: node.db_models
|
|
11618
|
-
};
|
|
11619
|
-
break;
|
|
11620
|
-
}
|
|
11621
|
-
}
|
|
11622
|
-
}
|
|
11623
|
-
const manifest = buildManifest({
|
|
11624
|
-
mode,
|
|
11625
|
-
title,
|
|
11626
|
-
description,
|
|
11627
|
-
subtitle,
|
|
11628
|
-
blastResults,
|
|
11629
|
-
createNodes,
|
|
11630
|
-
inspectData,
|
|
11631
|
-
defaults
|
|
11632
|
-
});
|
|
11633
|
-
const pushToDeck = args.push_to_deck;
|
|
11634
|
-
const session = args.session;
|
|
11635
|
-
let deckResult;
|
|
11636
|
-
if (pushToDeck) {
|
|
11637
|
-
if (!session) return err("push_to_deck requires a session name");
|
|
11638
|
-
const deckLockPath = (0, import_node_path21.join)(rootDir, ".launchsecure", "launch-deck.lock");
|
|
11639
|
-
if (!(0, import_node_fs19.existsSync)(deckLockPath)) {
|
|
11640
|
-
deckResult = { pushed: false, reason: "Deck server not running (no lock file). Push manually via deck tool." };
|
|
11641
|
-
} else {
|
|
11642
|
-
try {
|
|
11643
|
-
const lock = JSON.parse((0, import_node_fs19.readFileSync)(deckLockPath, "utf-8"));
|
|
11644
|
-
const deckUrl = lock.url;
|
|
11645
|
-
const body = JSON.stringify({
|
|
11646
|
-
session,
|
|
11647
|
-
mode: "show",
|
|
11648
|
-
blocks: [{ type: "blast-radius", label: title, manifest }]
|
|
11649
|
-
});
|
|
11650
|
-
(0, import_node_child_process2.execFileSync)("curl", [
|
|
11651
|
-
"-s",
|
|
11652
|
-
"-X",
|
|
11653
|
-
"POST",
|
|
11654
|
-
deckUrl + "/api/deck",
|
|
11655
|
-
"-H",
|
|
11656
|
-
"Content-Type: application/json",
|
|
11657
|
-
"-d",
|
|
11658
|
-
body
|
|
11659
|
-
], { timeout: 5e3, stdio: ["ignore", "pipe", "ignore"] });
|
|
11660
|
-
deckResult = { pushed: true, session, url: deckUrl };
|
|
11661
|
-
} catch (e) {
|
|
11662
|
-
deckResult = { pushed: false, reason: `Failed to push to deck: ${e}` };
|
|
11663
|
-
}
|
|
11664
|
-
}
|
|
11665
|
-
}
|
|
11666
|
-
const result = { ...manifest };
|
|
11667
|
-
if (deckResult) result._deck = deckResult;
|
|
11668
|
-
return okJson(result);
|
|
11669
|
-
}
|
|
11670
11264
|
function layerSummary(graph) {
|
|
11671
11265
|
const typeCounts = {};
|
|
11672
11266
|
const moduleCounts = {};
|
|
@@ -12368,10 +11962,6 @@ async function handleMessage(msg) {
|
|
|
12368
11962
|
respond(id ?? null, handleBlastPoints(args));
|
|
12369
11963
|
return;
|
|
12370
11964
|
}
|
|
12371
|
-
if (toolName === "generate_blast_radius") {
|
|
12372
|
-
respond(id ?? null, handleGenerateBlastRadius(args));
|
|
12373
|
-
return;
|
|
12374
|
-
}
|
|
12375
11965
|
respondError(id ?? null, -32601, `Unknown tool: ${toolName}`);
|
|
12376
11966
|
return;
|
|
12377
11967
|
}
|
|
@@ -12803,7 +12393,7 @@ function parseTrackerData(result) {
|
|
|
12803
12393
|
} else if (result && typeof result === "object") {
|
|
12804
12394
|
obj = result;
|
|
12805
12395
|
}
|
|
12806
|
-
const agents = obj.agents ?? obj;
|
|
12396
|
+
const agents = obj.nodes ?? obj.agents ?? obj;
|
|
12807
12397
|
const interventions = Array.isArray(obj.interventions) ? obj.interventions : [];
|
|
12808
12398
|
const run = obj.run;
|
|
12809
12399
|
const runStatus = typeof run?.status === "string" ? run.status : void 0;
|
|
@@ -12824,7 +12414,9 @@ async function startPipelineSystem(creds, capabilities) {
|
|
|
12824
12414
|
{}
|
|
12825
12415
|
);
|
|
12826
12416
|
const graphData = graphResult.data ?? graphResult;
|
|
12827
|
-
const adapter = new ClaudeTerminalAdapter(
|
|
12417
|
+
const adapter = new ClaudeTerminalAdapter({
|
|
12418
|
+
mcpServers: { token: creds.token, serverUrl: creds.serverUrl }
|
|
12419
|
+
});
|
|
12828
12420
|
triggerController = new NodeTriggerController({
|
|
12829
12421
|
adapter,
|
|
12830
12422
|
graphData,
|
|
@@ -12946,7 +12538,7 @@ async function startPipelineSystem(creds, capabilities) {
|
|
|
12946
12538
|
creds.serverUrl,
|
|
12947
12539
|
creds.token,
|
|
12948
12540
|
"tracker_read",
|
|
12949
|
-
{ fields: ["run", "
|
|
12541
|
+
{ fields: ["run", "nodes", "interventions"] }
|
|
12950
12542
|
);
|
|
12951
12543
|
const data = parseTrackerData(result);
|
|
12952
12544
|
latestAgents = data.agents;
|
|
@@ -13110,7 +12702,7 @@ if (!__isMcpMode) {
|
|
|
13110
12702
|
res.end(JSON.stringify({ error: "Not authenticated" }));
|
|
13111
12703
|
return;
|
|
13112
12704
|
}
|
|
13113
|
-
mcpToolCall(creds.serverUrl, creds.token, "tracker_read", { fields: ["run", "
|
|
12705
|
+
mcpToolCall(creds.serverUrl, creds.token, "tracker_read", { fields: ["run", "nodes", "interventions"] }).then((result) => {
|
|
13114
12706
|
const { agents, interventions, runStatus } = parseTrackerData(result);
|
|
13115
12707
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
13116
12708
|
res.end(JSON.stringify({ agents, interventions, runStatus }));
|