@launchsecure/launch-kit 0.0.17 → 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.
Files changed (84) hide show
  1. package/dist/chart-client/assets/index--120d9P9.css +1 -0
  2. package/dist/chart-client/assets/index-D7x8nz-H.js +441 -0
  3. package/dist/chart-client/index.html +2 -2
  4. package/dist/client/assets/index-Bf8zdL3x.css +32 -0
  5. package/dist/client/assets/index-Ds9UP_cj.js +291 -0
  6. package/dist/client/index.html +2 -2
  7. package/dist/council-client/assets/index-CofZh7pS.css +1 -0
  8. package/dist/council-client/assets/index-Dc41S-R2.js +198 -0
  9. package/dist/council-client/index.html +21 -0
  10. package/dist/deck-client/assets/{_baseUniq-BbqvoK-V.js → _baseUniq-2gclQXo7.js} +1 -1
  11. package/dist/deck-client/assets/{arc-CMtYsIZt.js → arc-DcMY5Wm0.js} +1 -1
  12. package/dist/deck-client/assets/{architectureDiagram-Q4EWVU46-BEN5hESa.js → architectureDiagram-Q4EWVU46-B8iirmmJ.js} +1 -1
  13. package/dist/deck-client/assets/{blockDiagram-DXYQGD6D-BV4CZ6k8.js → blockDiagram-DXYQGD6D-B4JBLjmJ.js} +1 -1
  14. package/dist/deck-client/assets/{c4Diagram-AHTNJAMY-fLcBXqdD.js → c4Diagram-AHTNJAMY-CojrJAk8.js} +1 -1
  15. package/dist/deck-client/assets/channel-ERh5jKXV.js +1 -0
  16. package/dist/deck-client/assets/{chunk-4BX2VUAB-BO_19zwB.js → chunk-4BX2VUAB-Bmb_BMDo.js} +1 -1
  17. package/dist/deck-client/assets/{chunk-4TB4RGXK-iYegd5fu.js → chunk-4TB4RGXK-CumBy8qe.js} +1 -1
  18. package/dist/deck-client/assets/{chunk-55IACEB6-DM3QwYFL.js → chunk-55IACEB6-Ka8Hb1wD.js} +1 -1
  19. package/dist/deck-client/assets/{chunk-EDXVE4YY-DGznOul1.js → chunk-EDXVE4YY-B3sIPiQo.js} +1 -1
  20. package/dist/deck-client/assets/{chunk-FMBD7UC4-DsANJqYW.js → chunk-FMBD7UC4-C1tYkaqu.js} +1 -1
  21. package/dist/deck-client/assets/{chunk-OYMX7WX6-6PGH1F7d.js → chunk-OYMX7WX6-D7Wacbky.js} +1 -1
  22. package/dist/deck-client/assets/{chunk-QZHKN3VN-Dihf0Uq7.js → chunk-QZHKN3VN-ChXI0vO3.js} +1 -1
  23. package/dist/deck-client/assets/{chunk-YZCP3GAM-Cali2wW5.js → chunk-YZCP3GAM-BXhiqf8u.js} +1 -1
  24. package/dist/deck-client/assets/classDiagram-6PBFFD2Q-CMi1Gaev.js +1 -0
  25. package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-CMi1Gaev.js +1 -0
  26. package/dist/deck-client/assets/clone-DfWhlD4X.js +1 -0
  27. package/dist/deck-client/assets/{cose-bilkent-S5V4N54A-DsRY4vbI.js → cose-bilkent-S5V4N54A-Bqp3p68D.js} +1 -1
  28. package/dist/deck-client/assets/cytoscape.esm-BQk4lpUV.js +331 -0
  29. package/dist/deck-client/assets/{dagre-KV5264BT-DJIKE_pI.js → dagre-KV5264BT-BS-rtyhZ.js} +1 -1
  30. package/dist/deck-client/assets/{diagram-5BDNPKRD-Ckgli1SP.js → diagram-5BDNPKRD-BIrj9YGI.js} +1 -1
  31. package/dist/deck-client/assets/{diagram-G4DWMVQ6-CozcDzae.js → diagram-G4DWMVQ6-noHWPIg4.js} +1 -1
  32. package/dist/deck-client/assets/{diagram-MMDJMWI5-xVSwW3f_.js → diagram-MMDJMWI5-C2qHxvqV.js} +1 -1
  33. package/dist/deck-client/assets/{diagram-TYMM5635-CJeZVY-P.js → diagram-TYMM5635-BytnGQr-.js} +1 -1
  34. package/dist/deck-client/assets/{erDiagram-SMLLAGMA-j4wjAERH.js → erDiagram-SMLLAGMA-BfK5m2YQ.js} +1 -1
  35. package/dist/deck-client/assets/{flowDiagram-DWJPFMVM-CVLZ1efi.js → flowDiagram-DWJPFMVM-Cq925G1Z.js} +1 -1
  36. package/dist/deck-client/assets/{ganttDiagram-T4ZO3ILL-CcIJ7pkP.js → ganttDiagram-T4ZO3ILL-DhhHPAmj.js} +1 -1
  37. package/dist/deck-client/assets/{gitGraphDiagram-UUTBAWPF-BZRhQX-a.js → gitGraphDiagram-UUTBAWPF-B3Lc0h9q.js} +1 -1
  38. package/dist/deck-client/assets/{graph-D0l25xfo.js → graph-RTawgVWm.js} +1 -1
  39. package/dist/deck-client/assets/index-765AIQ9z.css +1 -0
  40. package/dist/deck-client/assets/{index-BXcoHWVM.js → index-BfIfJXmS.js} +93 -93
  41. package/dist/deck-client/assets/{infoDiagram-42DDH7IO-BLwgxnYT.js → infoDiagram-42DDH7IO-BlR584kX.js} +1 -1
  42. package/dist/deck-client/assets/{ishikawaDiagram-UXIWVN3A-BfOLoWv3.js → ishikawaDiagram-UXIWVN3A-DygKoNGY.js} +1 -1
  43. package/dist/deck-client/assets/{journeyDiagram-VCZTEJTY-CPuL6C9h.js → journeyDiagram-VCZTEJTY-BnaiYp9N.js} +1 -1
  44. package/dist/deck-client/assets/{kanban-definition-6JOO6SKY-D3uf7_tx.js → kanban-definition-6JOO6SKY-BQBUBzJC.js} +1 -1
  45. package/dist/deck-client/assets/{layout-CzToiXdK.js → layout-DeZ8HI1T.js} +1 -1
  46. package/dist/deck-client/assets/{linear-BU36t460.js → linear-C6roLi_9.js} +1 -1
  47. package/dist/deck-client/assets/{min-DX_q-lqP.js → min-CbUksbuI.js} +1 -1
  48. package/dist/deck-client/assets/{mindmap-definition-QFDTVHPH-Ccty4O16.js → mindmap-definition-QFDTVHPH-iNxV62yN.js} +1 -1
  49. package/dist/deck-client/assets/{pieDiagram-DEJITSTG-DVjsvH19.js → pieDiagram-DEJITSTG-DHVA0jaG.js} +1 -1
  50. package/dist/deck-client/assets/{quadrantDiagram-34T5L4WZ-DtOXFVW9.js → quadrantDiagram-34T5L4WZ-DBeKKLUQ.js} +1 -1
  51. package/dist/deck-client/assets/{requirementDiagram-MS252O5E-BbO_kKg6.js → requirementDiagram-MS252O5E-CBwITx7p.js} +1 -1
  52. package/dist/deck-client/assets/{sankeyDiagram-XADWPNL6-qbbj-CmC.js → sankeyDiagram-XADWPNL6-BtE-1YTU.js} +1 -1
  53. package/dist/deck-client/assets/{sequenceDiagram-FGHM5R23-JNKZAgfQ.js → sequenceDiagram-FGHM5R23-DN96yPP2.js} +1 -1
  54. package/dist/deck-client/assets/{stateDiagram-FHFEXIEX-dtFalcNx.js → stateDiagram-FHFEXIEX-VUkKC2uJ.js} +1 -1
  55. package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-CA0IjulK.js +1 -0
  56. package/dist/deck-client/assets/{timeline-definition-GMOUNBTQ-Dpp5nqSJ.js → timeline-definition-GMOUNBTQ-oUeZhRns.js} +1 -1
  57. package/dist/deck-client/assets/{vennDiagram-DHZGUBPP-D8qEutX7.js → vennDiagram-DHZGUBPP-D87fK90n.js} +1 -1
  58. package/dist/deck-client/assets/wardley-RL74JXVD-DYbYcpDp.js +162 -0
  59. package/dist/deck-client/assets/{wardleyDiagram-NUSXRM2D-Bxl9X3CK.js → wardleyDiagram-NUSXRM2D-Ca_i0QRA.js} +1 -1
  60. package/dist/deck-client/assets/{xychartDiagram-5P7HB3ND-DYcvxLhi.js → xychartDiagram-5P7HB3ND-CUOJVIvq.js} +1 -1
  61. package/dist/deck-client/index.html +2 -2
  62. package/dist/server/chart-serve.js +258 -273
  63. package/dist/server/cli.js +305 -713
  64. package/dist/server/council-entry.js +1418 -0
  65. package/dist/server/council-serve.js +1039 -0
  66. package/dist/server/deck-server/deck-mcp-entry.js +0 -0
  67. package/dist/server/fb-wizard.js +0 -0
  68. package/dist/server/graph-mcp-entry.js +268 -701
  69. package/dist/server/server/cli.js +0 -0
  70. package/dist/server/server/fb-wizard.js +0 -0
  71. package/dist/server/server/graph-mcp-entry.js +0 -0
  72. package/package.json +17 -17
  73. package/dist/chart-client/assets/index-BUhuLBaw.js +0 -441
  74. package/dist/chart-client/assets/index-CWRZxjqR.css +0 -1
  75. package/dist/client/assets/index-CAAipH3V.js +0 -291
  76. package/dist/client/assets/index-DtbN793z.css +0 -32
  77. package/dist/deck-client/assets/channel-Nf-B3Qor.js +0 -1
  78. package/dist/deck-client/assets/classDiagram-6PBFFD2Q-3i3-miMR.js +0 -1
  79. package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-3i3-miMR.js +0 -1
  80. package/dist/deck-client/assets/clone-DXBuQlG8.js +0 -1
  81. package/dist/deck-client/assets/cytoscape.esm-BiciSPf8.js +0 -331
  82. package/dist/deck-client/assets/index-Cdh-f3-c.css +0 -1
  83. package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-CviYYulW.js +0 -1
  84. package/dist/deck-client/assets/wardley-RL74JXVD-BwMqiNcL.js +0 -162
@@ -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 fs10 = require("fs");
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 (fs10.existsSync(cmd) || this.commandExists(cmd)) {
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 fs10 = require("fs");
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 (fs10.existsSync(cmd) || this.commandExists(cmd)) {
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 fs10 = require("fs");
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 (fs10.existsSync(cmd) || this.commandExists(cmd)) {
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 fs10 = require("fs").promises;
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 fs10.mkdir(this.storageDir, { recursive: true });
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 fs10.mkdir(this.storageDir, { recursive: true });
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 fs10.writeFile(tempFile, JSON.stringify(data, null, 2));
1359
- await fs10.mkdir(this.storageDir, { recursive: true });
1360
- await fs10.rename(tempFile, this.sessionsFile);
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 fs10.access(this.sessionsFile);
1370
- const data = await fs10.readFile(this.sessionsFile, "utf8");
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 fs10.rename(this.sessionsFile, `${this.sessionsFile}.corrupted.${Date.now()}`);
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 fs10.unlink(this.sessionsFile);
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 fs10.access(this.sessionsFile);
1438
- const stats = await fs10.stat(this.sessionsFile);
1439
- const data = await fs10.readFile(this.sessionsFile, "utf8");
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 fs10 = require("fs").promises;
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 fs10.access(projectPath);
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 fs10.readdir(projectPath);
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 fs10.stat(filePath);
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 fs10.readdir(this.claudeProjectsPath);
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 fs10.stat(projectPath);
1708
+ const stat = await fs9.stat(projectPath);
1705
1709
  if (stat.isDirectory()) {
1706
- const projectFiles = await fs10.readdir(projectPath);
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 fs10.stat(filePath);
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 fs10.access(sessionFile);
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 fs10 = require("fs");
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 = fs10.readdirSync(validation.path, { withFileTypes: true });
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 (!fs10.existsSync(validation.path) || !fs10.statSync(validation.path).isDirectory()) {
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 (!fs10.existsSync(validation.path) || !fs10.statSync(validation.path).isDirectory()) {
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 (fs10.existsSync(fullValidation.path)) {
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
- fs10.mkdirSync(fullValidation.path, { recursive: true });
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 (!fs10.existsSync(fullPath)) return false;
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 = fs10.readFileSync(fullPath);
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, import_node_path3.join)(queriesDir, `${name}.scm`);
3765
- const scm = (0, import_node_fs3.readFileSync)(scmPath, "utf-8");
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, import_node_fs3.readFileSync)(absPath, "utf-8");
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 import_node_fs3, import_node_path3, tsxLanguage, parserInstance, initPromise, initialized, queriesDir, queryCache, PRISMA_MUTATION_METHODS_BUILTIN, DB_IDENTIFIERS_FALLBACK, extraDbIdentifiers, extraMutationMethods;
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
- import_node_fs3 = require("node:fs");
4242
- import_node_path3 = require("node:path");
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, import_node_path3.join)((0, import_node_path3.dirname)(__filename), "..", "queries");
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, import_node_path3.join)((0, import_node_path3.dirname)(__filename), "graph", "queries");
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.ag) {
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.rn === "script_pod" && change.newStatus === "in_progress") {
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.rn === "script") continue;
4666
- if (agent.rn !== "llm") continue;
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 import_node_fs14 = require("node:fs");
6942
- var import_node_path16 = require("node:path");
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 import_node_fs11 = require("node:fs");
6946
- var import_node_path12 = require("node:path");
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 import_node_path11 = require("node:path");
6974
+ var import_node_path12 = require("node:path");
6951
6975
 
6952
6976
  // src/server/graph/parsers/ts/typescript-project.ts
6953
- var import_node_fs4 = require("node:fs");
6954
- var import_node_path4 = require("node:path");
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, import_node_path4.relative)(srcDir, absPath).replace(/\\/g, "/");
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, import_node_path4.join)(srcDir, rel);
7033
- for (const c of [base, base + ".ts", base + ".tsx", (0, import_node_path4.join)(base, "index.ts"), (0, import_node_path4.join)(base, "index.tsx")]) {
7034
- if ((0, import_node_fs4.existsSync)(c) && (0, import_node_fs4.statSync)(c).isFile()) return c;
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, import_node_path4.join)((0, import_node_path4.dirname)(fromFile), specifier);
7040
- for (const c of [base, base + ".ts", base + ".tsx", (0, import_node_path4.join)(base, "index.ts"), (0, import_node_path4.join)(base, "index.tsx")]) {
7041
- if ((0, import_node_fs4.existsSync)(c) && (0, import_node_fs4.statSync)(c).isFile()) return c;
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, import_node_path4.basename)(resolved);
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, import_node_path4.basename)(absPath);
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, import_node_path4.relative)(srcDir, (0, import_node_path4.dirname)(absPath)).replace(/\\/g, "/");
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, import_node_path4.basename)(absPath, (0, import_node_path4.extname)(absPath)).replace(/[-_](\w)/g, (_, c) => c.toUpperCase()).replace(/^(\w)/, (_, c) => c.toUpperCase());
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, import_node_path4.relative)(apiDir, absPath).replace(/\\/g, "/").replace(/\/route\.tsx?$/, "");
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 && hasNextConfig(rootDir);
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, import_node_path4.join)(srcDir, "client"), [".tsx", ".ts"]);
7316
- const serverFiles = walk((0, import_node_path4.join)(srcDir, "server"), [".ts", ".tsx"]);
7317
- const libFiles = walk((0, import_node_path4.join)(srcDir, "lib"), [".ts", ".tsx"]);
7318
- const configFiles = walk((0, import_node_path4.join)(srcDir, "config"), [".ts", ".tsx"]);
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, import_node_path4.basename)(f).startsWith("index."));
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, import_node_fs4.existsSync)(apiDir) ? filePathToApiRoute(apiDir, absPath) : `/api/${id.replace(/\/route\.tsx?$/, "")}`;
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 IGNORE_DIRS2 = /* @__PURE__ */ new Set([
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, import_node_path4.relative)(rootDir, absPath).replace(/\\/g, "/");
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 import_node_fs5 = require("node:fs");
7651
- var import_node_path5 = require("node:path");
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, import_node_fs5.existsSync)((0, import_node_path5.join)(rootDir, "prisma", "schema.prisma"));
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, import_node_path5.join)(rootDir, "prisma", "schema.prisma");
7746
- const content = (0, import_node_fs5.readFileSync)(schemaPath, "utf-8");
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 import_node_fs6 = require("node:fs");
7804
- var import_node_path6 = require("node:path");
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, import_node_path6.join)(rootDir, "prisma", "migrations");
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, import_node_fs6.existsSync)(migrationsDir)) return state;
7962
- const dirs = (0, import_node_fs6.readdirSync)(migrationsDir, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name).sort();
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, import_node_path6.join)(migrationsDir, dir, "migration.sql");
7965
- if (!(0, import_node_fs6.existsSync)(sqlPath)) continue;
7966
- const sql = (0, import_node_fs6.readFileSync)(sqlPath, "utf-8");
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, import_node_path6.join)(rootDir, "prisma", "schema.prisma");
7978
- if (!(0, import_node_fs6.existsSync)(schemaPath)) return null;
7979
- const content = (0, import_node_fs6.readFileSync)(schemaPath, "utf-8");
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, import_node_path6.join)(rootDir, "prisma", "migrations");
8145
- if (!(0, import_node_fs6.existsSync)(migrationsDir)) return false;
8146
- return (0, import_node_fs6.readdirSync)(migrationsDir, { withFileTypes: true }).some((d) => d.isDirectory() && (0, import_node_fs6.existsSync)((0, import_node_path6.join)(migrationsDir, d.name, "migration.sql")));
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 import_node_fs7 = require("node:fs");
8435
- var import_node_path7 = require("node:path");
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, import_node_fs7.existsSync)(dir)) return [];
8464
+ if (!(0, import_node_fs8.existsSync)(dir)) return [];
8439
8465
  const results = [];
8440
- for (const entry of (0, import_node_fs7.readdirSync)(dir, { withFileTypes: true })) {
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, import_node_path7.join)(dir, entry.name);
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, import_node_path7.extname)(entry.name))) {
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, import_node_path7.relative)(srcDir, absPath).replace(/\\/g, "/");
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, import_node_fs7.existsSync)((0, import_node_path7.join)(rootDir, "src"));
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, import_node_path7.join)(rootDir, "src");
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, import_node_fs7.readFileSync)(absPath, "utf-8");
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 import_node_fs8 = require("node:fs");
8521
- var import_node_path8 = require("node:path");
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, import_node_fs8.existsSync)(dir)) return [];
8551
+ if (!(0, import_node_fs9.existsSync)(dir)) return [];
8526
8552
  const results = [];
8527
- for (const entry of (0, import_node_fs8.readdirSync)(dir, { withFileTypes: true })) {
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, import_node_path8.join)(dir, entry.name);
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, import_node_path8.extname)(entry.name))) {
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, import_node_path8.relative)(srcDir, absPath).replace(/\\/g, "/");
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, import_node_path8.join)(srcDir, "client");
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, import_node_fs8.readFileSync)(absPath, "utf-8");
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 import_node_fs9 = require("node:fs");
8602
- var import_node_path9 = require("node:path");
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, import_node_path9.join)(rootDir, "prisma", "schema.prisma"),
8636
- (0, import_node_path9.join)(rootDir, "prisma", "schema")
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, import_node_fs9.existsSync)(p)) {
8666
+ if ((0, import_node_fs10.existsSync)(p)) {
8641
8667
  try {
8642
- const stat = (0, import_node_fs9.statSync)(p);
8668
+ const stat = (0, import_node_fs10.statSync)(p);
8643
8669
  if (stat.isFile()) {
8644
- content = (0, import_node_fs9.readFileSync)(p, "utf-8");
8670
+ content = (0, import_node_fs10.readFileSync)(p, "utf-8");
8645
8671
  } else if (stat.isDirectory()) {
8646
- const files = (0, import_node_fs9.readdirSync)(p).filter((f) => f.endsWith(".prisma"));
8647
- content = files.map((f) => (0, import_node_fs9.readFileSync)((0, import_node_path9.join)(p, f), "utf-8")).join("\n");
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 walk5(node) {
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 = walk5(child);
8760
+ const found = walk4(child);
8735
8761
  if (found) return found;
8736
8762
  }
8737
8763
  return null;
8738
8764
  }
8739
- return walk5(root);
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, import_node_path9.join)(rootDir, "prisma", "seed.ts"),
8804
- (0, import_node_path9.join)(rootDir, "prisma", "seed.js"),
8805
- (0, import_node_path9.join)(rootDir, "src", "server", "lib", "system-tags.ts")
8806
- ].filter(import_node_fs9.existsSync);
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, import_node_fs9.readFileSync)(filePath, "utf-8");
8810
- const relPath = (0, import_node_path9.relative)(rootDir, filePath);
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, import_node_fs9.existsSync)(dir)) return [];
8930
+ if (!(0, import_node_fs10.existsSync)(dir)) return [];
8905
8931
  const results = [];
8906
- for (const entry of (0, import_node_fs9.readdirSync)(dir, { withFileTypes: true })) {
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, import_node_path9.join)(dir, entry.name);
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, import_node_path9.join)(rootDir, "src");
8917
- if (!(0, import_node_fs9.existsSync)(srcDir)) return { nodes };
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, import_node_fs9.readFileSync)(filePath, "utf-8");
8920
- const relPath = (0, import_node_path9.relative)(rootDir, filePath);
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, import_node_fs9.existsSync)((0, import_node_path9.join)(rootDir, "prisma", "schema.prisma")) || (0, import_node_fs9.existsSync)((0, import_node_path9.join)(rootDir, "prisma", "seed.ts"));
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 import_node_fs10 = require("node:fs");
9029
- var import_node_path10 = require("node:path");
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
- ...walk4((0, import_node_path10.join)(srcDir, "client"), [".ts", ".tsx"]),
9191
- ...walk4(paths.appDir, [".ts", ".tsx"]),
9192
- ...walk4((0, import_node_path10.join)(srcDir, "server"), [".ts", ".tsx"]),
9193
- ...walk4((0, import_node_path10.join)(srcDir, "lib"), [".ts", ".tsx"]),
9194
- ...walk4((0, import_node_path10.join)(srcDir, "config"), [".ts", ".tsx"])
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, import_node_path10.relative)(srcDir, absPath).replace(/\\/g, "/");
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, import_node_fs10.readFileSync)(absPath, "utf-8");
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, import_node_path11.resolve)(rootDir, entry.path);
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, import_node_path12.join)(rootDir, ".launchsecure", "graphs", `${layer}.json`);
9462
- if (!(0, import_node_fs11.existsSync)(filePath)) return null;
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, import_node_fs11.readFileSync)(filePath, "utf-8"));
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 import_node_path14 = require("node:path");
9574
+ var import_node_path15 = require("node:path");
9566
9575
 
9567
9576
  // src/server/graph/taggers/module-tagger.ts
9568
- var import_node_fs12 = require("node:fs");
9569
- var import_node_path13 = require("node:path");
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, import_node_path13.join)(rootDir, "src"),
9603
- (0, import_node_path13.join)(rootDir, "app"),
9604
- (0, import_node_path13.join)(rootDir, "lib")
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, import_node_path13.join)(base, convention);
9609
- if (!(0, import_node_fs12.existsSync)(dir)) continue;
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, import_node_fs12.statSync)(dir);
9620
+ const stat = (0, import_node_fs13.statSync)(dir);
9612
9621
  if (!stat.isDirectory()) continue;
9613
- const entries = (0, import_node_fs12.readdirSync)(dir, { withFileTypes: true }).filter((e) => e.isDirectory() && !e.name.startsWith(".")).map((e) => e.name);
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, import_node_path14.resolve)(rootDir, entry.path);
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 import_node_fs13 = require("node:fs");
9931
- var import_node_path15 = require("node:path");
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, import_node_path15.join)(rootDir, GRAPHS_DIR, TAGS_FILENAME);
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, import_node_fs13.existsSync)(filePath)) return {};
9941
- const stat = (0, import_node_fs13.statSync)(filePath);
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, import_node_fs13.readFileSync)(filePath, "utf-8");
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, import_node_path15.dirname)(filePath);
9958
- (0, import_node_fs13.mkdirSync)(dir, { recursive: true });
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, import_node_fs13.writeFileSync)(filePath, JSON.stringify(cleaned, null, 2) + "\n", "utf-8");
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, import_node_path16.join)(rootDir, GRAPHS_DIR2);
9989
- if (!(0, import_node_fs14.existsSync)(dir)) return [];
9990
- return (0, import_node_fs14.readdirSync)(dir).filter((f) => f.endsWith(".json") && f !== "tags.json").map((f) => f.replace(".json", ""));
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, import_node_path16.join)(rootDir, GRAPHS_DIR2);
10004
+ return (0, import_node_path17.join)(rootDir, GRAPHS_DIR2);
9996
10005
  }
9997
10006
  function graphFilePath(rootDir, layer) {
9998
- return (0, import_node_path16.join)(graphsDir(rootDir), `${layer}.json`);
10007
+ return (0, import_node_path17.join)(graphsDir(rootDir), `${layer}.json`);
9999
10008
  }
10000
10009
  function tagsFilePath2(rootDir) {
10001
- return (0, import_node_path16.join)(graphsDir(rootDir), "tags.json");
10010
+ return (0, import_node_path17.join)(graphsDir(rootDir), "tags.json");
10002
10011
  }
10003
10012
  function getMtimeMs(filePath) {
10004
- if (!(0, import_node_fs14.existsSync)(filePath)) return 0;
10005
- return (0, import_node_fs14.statSync)(filePath).mtimeMs;
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, import_node_fs14.existsSync)(filePath)) return null;
10045
- const stat = (0, import_node_fs14.statSync)(filePath);
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, import_node_fs14.readFileSync)(filePath, "utf-8");
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, import_node_fs14.existsSync)(rawFilePath)) return null;
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, import_node_fs14.mkdirSync)(dir, { recursive: true });
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, import_node_fs14.writeFileSync)(filePath, JSON.stringify(result.output, null, 2) + "\n", "utf-8");
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", "agents", "interventions"] }
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", "agents", "interventions"] }).then((result) => {
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 }));