guardlink 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +14 -0
  3. package/dist/agents/config.d.ts +2 -0
  4. package/dist/agents/config.d.ts.map +1 -1
  5. package/dist/agents/config.js +1 -1
  6. package/dist/agents/config.js.map +1 -1
  7. package/dist/agents/prompts.d.ts +2 -2
  8. package/dist/agents/prompts.d.ts.map +1 -1
  9. package/dist/agents/prompts.js +223 -31
  10. package/dist/agents/prompts.js.map +1 -1
  11. package/dist/analyzer/sarif.js +1 -1
  12. package/dist/cli/index.js +2 -56
  13. package/dist/cli/index.js.map +1 -1
  14. package/dist/dashboard/data.d.ts.map +1 -1
  15. package/dist/dashboard/data.js +19 -12
  16. package/dist/dashboard/data.js.map +1 -1
  17. package/dist/dashboard/diagrams.d.ts.map +1 -1
  18. package/dist/dashboard/diagrams.js +310 -37
  19. package/dist/dashboard/diagrams.js.map +1 -1
  20. package/dist/dashboard/generate.d.ts.map +1 -1
  21. package/dist/dashboard/generate.js +21 -5
  22. package/dist/dashboard/generate.js.map +1 -1
  23. package/dist/init/picker.d.ts.map +1 -1
  24. package/dist/init/picker.js +2 -2
  25. package/dist/init/picker.js.map +1 -1
  26. package/dist/init/templates.js +1 -1
  27. package/dist/mcp/server.d.ts.map +1 -1
  28. package/dist/mcp/server.js +8 -26
  29. package/dist/mcp/server.js.map +1 -1
  30. package/dist/parser/index.d.ts +1 -0
  31. package/dist/parser/index.d.ts.map +1 -1
  32. package/dist/parser/index.js +1 -0
  33. package/dist/parser/index.js.map +1 -1
  34. package/dist/parser/parse-line.js +3 -3
  35. package/dist/parser/parse-line.js.map +1 -1
  36. package/dist/parser/parse-project.js +1 -1
  37. package/dist/parser/validate.d.ts +19 -0
  38. package/dist/parser/validate.d.ts.map +1 -0
  39. package/dist/parser/validate.js +105 -0
  40. package/dist/parser/validate.js.map +1 -0
  41. package/dist/tui/commands.d.ts +1 -6
  42. package/dist/tui/commands.d.ts.map +1 -1
  43. package/dist/tui/commands.js +96 -221
  44. package/dist/tui/commands.js.map +1 -1
  45. package/dist/tui/config.d.ts +2 -0
  46. package/dist/tui/config.d.ts.map +1 -1
  47. package/dist/tui/config.js.map +1 -1
  48. package/dist/tui/index.d.ts.map +1 -1
  49. package/dist/tui/index.js +20 -24
  50. package/dist/tui/index.js.map +1 -1
  51. package/dist/tui/input.d.ts +2 -2
  52. package/dist/tui/input.js +2 -2
  53. package/dist/types/index.d.ts +1 -1
  54. package/dist/types/index.d.ts.map +1 -1
  55. package/package.json +1 -1
@@ -10,11 +10,47 @@
10
10
  function mid(s) {
11
11
  return s.replace(/[^a-zA-Z0-9_]/g, '_');
12
12
  }
13
- /** Truncate long labels and sanitize for Mermaid (strip brackets/braces/pipes that conflict with syntax) */
13
+ /** Truncate long labels and sanitize for Mermaid (strip syntax-breaking characters) */
14
14
  function label(s, max = 40) {
15
- const clean = s.replace(/"/g, "'").replace(/[\[\]{}|]/g, '');
15
+ const clean = s.replace(/"/g, "'").replace(/[\[\]{}()|`;]/g, '');
16
16
  return clean.length > max ? clean.slice(0, max - 1) + '…' : clean;
17
17
  }
18
+ /** Sanitize labels without truncation (for long edge text/mechanisms). */
19
+ function labelFull(s) {
20
+ return s.replace(/"/g, "'").replace(/[\[\]{}()|`;]/g, '');
21
+ }
22
+ /** Normalize a ref: strip leading # so that "#sqli" and "sqli" compare equal. */
23
+ function normalizeRef(ref) {
24
+ return ref.startsWith('#') ? ref.slice(1) : ref;
25
+ }
26
+ /** Heuristic icon for data-flow assets to make diagrams easier to scan. */
27
+ function assetIcon(name) {
28
+ const n = normalizeRef(name).toLowerCase();
29
+ if (/(user|client|browser|mobile|frontend|ui)/.test(n))
30
+ return '👤';
31
+ if (/(external|internet|partner|vendor|public|third[_-]?party)/.test(n))
32
+ return '🌐';
33
+ if (/(queue|topic|kafka|pubsub|amqp|broker|stream)/.test(n))
34
+ return '📨';
35
+ if (/(db|database|store|storage|bucket|cache|redis|s3|blob)/.test(n))
36
+ return '🗄️';
37
+ if (/(api|service|backend|server|worker|lambda|function|processor|gateway)/.test(n))
38
+ return '🖥️';
39
+ return '🧩';
40
+ }
41
+ /** Heuristic icon for flow mechanisms/protocols. */
42
+ function flowIcon(mechanism) {
43
+ const m = mechanism.toLowerCase();
44
+ if (/(https|tls|ssl|mtls|ssh)/.test(m))
45
+ return '🔐';
46
+ if (/(http|grpc|rest|graphql|websocket|ws|rpc)/.test(m))
47
+ return '🌐';
48
+ if (/(kafka|queue|amqp|pubsub|stream|event)/.test(m))
49
+ return '📨';
50
+ if (/(sql|db|database|redis|cache|s3|blob|file)/.test(m))
51
+ return '🗄️';
52
+ return '📡';
53
+ }
18
54
  /**
19
55
  * Diagram 1: Threat Model Graph
20
56
  * Shows assets (boxes), threats (red), controls (green), and relationships.
@@ -23,15 +59,59 @@ export function generateThreatGraph(model) {
23
59
  // Filter to critical+high severity threats to keep diagram readable
24
60
  const highSevThreats = new Set();
25
61
  const sevMap = new Map();
62
+ const threatLabelMap = new Map();
63
+ const sevRank = { critical: 0, p0: 0, high: 1, p1: 1, medium: 2, p2: 2, low: 3, p3: 3, unset: 4 };
64
+ const setThreatSeverity = (ref, severity) => {
65
+ if (!ref || !severity)
66
+ return;
67
+ const norm = normalizeRef(ref);
68
+ const current = sevMap.get(ref) || sevMap.get(norm);
69
+ if (!current || (sevRank[severity] ?? 4) < (sevRank[current] ?? 4)) {
70
+ sevMap.set(ref, severity);
71
+ sevMap.set(norm, severity);
72
+ }
73
+ };
74
+ const setThreatLabel = (ref, display) => {
75
+ if (!ref || !display)
76
+ return;
77
+ const norm = normalizeRef(ref);
78
+ const existing = threatLabelMap.get(ref) || threatLabelMap.get(norm);
79
+ // Prefer richer labels (e.g., canonical threat name) over terse id-like refs.
80
+ if (!existing || display.length > existing.length) {
81
+ threatLabelMap.set(ref, display);
82
+ threatLabelMap.set(norm, display);
83
+ }
84
+ };
26
85
  for (const t of model.threats) {
27
86
  const s = (t.severity || '').toLowerCase();
28
- sevMap.set(`#${t.id}`, s);
29
- sevMap.set(t.name, s);
87
+ if (t.id) {
88
+ setThreatSeverity(`#${t.id}`, s);
89
+ setThreatSeverity(t.id, s);
90
+ setThreatLabel(`#${t.id}`, t.name);
91
+ setThreatLabel(t.id, t.name);
92
+ }
93
+ setThreatSeverity(t.name, s);
94
+ setThreatLabel(t.name, t.name);
30
95
  if (s === 'critical' || s === 'p0' || s === 'high' || s === 'p1') {
31
- highSevThreats.add(`#${t.id}`);
96
+ if (t.id) {
97
+ highSevThreats.add(`#${t.id}`);
98
+ highSevThreats.add(t.id);
99
+ }
32
100
  highSevThreats.add(t.name);
101
+ highSevThreats.add(normalizeRef(t.name));
33
102
  }
34
103
  }
104
+ // Exposure-level severity can exist even when a threat definition doesn't.
105
+ for (const e of model.exposures) {
106
+ const s = (e.severity || '').toLowerCase();
107
+ setThreatSeverity(e.threat, s);
108
+ setThreatLabel(e.threat, e.threat.replace('#', ''));
109
+ if (s === 'critical' || s === 'p0' || s === 'high' || s === 'p1') {
110
+ highSevThreats.add(e.threat);
111
+ highSevThreats.add(normalizeRef(e.threat));
112
+ }
113
+ }
114
+ const isHighThreat = (ref) => highSevThreats.has(ref) || highSevThreats.has(normalizeRef(ref));
35
115
  // If very many threats, filter to critical+high only
36
116
  const totalThreats = new Set();
37
117
  for (const e of model.exposures)
@@ -43,13 +123,13 @@ export function generateThreatGraph(model) {
43
123
  const usedControls = new Set();
44
124
  const edges = new Set();
45
125
  for (const e of model.exposures) {
46
- if (filterHigh && !highSevThreats.has(e.threat))
126
+ if (filterHigh && !isHighThreat(e.threat))
47
127
  continue;
48
128
  usedAssets.add(e.asset);
49
129
  usedThreats.add(e.threat);
50
130
  }
51
131
  for (const m of model.mitigations) {
52
- if (filterHigh && !highSevThreats.has(m.threat))
132
+ if (filterHigh && !isHighThreat(m.threat))
53
133
  continue;
54
134
  usedAssets.add(m.asset);
55
135
  usedThreats.add(m.threat);
@@ -57,20 +137,133 @@ export function generateThreatGraph(model) {
57
137
  usedControls.add(m.control);
58
138
  }
59
139
  for (const a of model.acceptances) {
60
- if (filterHigh && !highSevThreats.has(a.threat))
140
+ if (filterHigh && !isHighThreat(a.threat))
61
141
  continue;
62
142
  usedAssets.add(a.asset);
63
143
  usedThreats.add(a.threat);
64
144
  }
65
- // Asset nodes
145
+ for (const t of model.transfers) {
146
+ if (filterHigh && !isHighThreat(t.threat))
147
+ continue;
148
+ usedAssets.add(t.source);
149
+ usedAssets.add(t.target);
150
+ usedThreats.add(t.threat);
151
+ }
152
+ for (const v of model.validations) {
153
+ usedAssets.add(v.asset);
154
+ usedControls.add(v.control);
155
+ }
156
+ // ── Build data-classification map (asset → classification badges) ──
157
+ const dataClassMap = new Map();
158
+ for (const h of model.data_handling) {
159
+ const norm = normalizeRef(h.asset);
160
+ if (!dataClassMap.has(h.asset))
161
+ dataClassMap.set(h.asset, []);
162
+ dataClassMap.get(h.asset).push(h.classification.toUpperCase());
163
+ if (norm !== h.asset) {
164
+ if (!dataClassMap.has(norm))
165
+ dataClassMap.set(norm, []);
166
+ dataClassMap.get(norm).push(h.classification.toUpperCase());
167
+ }
168
+ }
169
+ // ── Build ownership map (asset → owner) ──
170
+ const ownerMap = new Map();
171
+ for (const o of model.ownership) {
172
+ ownerMap.set(o.asset, o.owner);
173
+ ownerMap.set(normalizeRef(o.asset), o.owner);
174
+ }
175
+ // ── Build external-refs map (threat → CWE/refs) ──
176
+ const extRefMap = new Map();
177
+ const addExtRefs = (ref, refs) => {
178
+ if (!refs || refs.length === 0)
179
+ return;
180
+ const norm = normalizeRef(ref);
181
+ for (const r of [ref, norm]) {
182
+ if (!extRefMap.has(r))
183
+ extRefMap.set(r, []);
184
+ for (const er of refs) {
185
+ if (!extRefMap.get(r).includes(er))
186
+ extRefMap.get(r).push(er);
187
+ }
188
+ }
189
+ };
190
+ for (const t of model.threats) {
191
+ if (t.external_refs.length > 0) {
192
+ addExtRefs(t.name, t.external_refs);
193
+ if (t.id) {
194
+ addExtRefs(`#${t.id}`, t.external_refs);
195
+ addExtRefs(t.id, t.external_refs);
196
+ }
197
+ }
198
+ }
199
+ for (const e of model.exposures) {
200
+ if (e.external_refs.length > 0)
201
+ addExtRefs(e.threat, e.external_refs);
202
+ }
203
+ // ── Determine trust-boundary groupings for used assets ──
204
+ const assetZone = new Map(); // asset → zone id
205
+ const zoneAssets = new Map(); // zone id → assets
206
+ const zoneLabel = new Map(); // zone id → label
207
+ let zIdx = 0;
208
+ for (const b of model.boundaries) {
209
+ // Only include boundaries where at least one side is a used asset
210
+ const aUsed = usedAssets.has(b.asset_a) || usedAssets.has(normalizeRef(b.asset_a));
211
+ const bUsed = usedAssets.has(b.asset_b) || usedAssets.has(normalizeRef(b.asset_b));
212
+ if (!aUsed && !bUsed)
213
+ continue;
214
+ // Assign each side to a zone if not already assigned
215
+ for (const side of [b.asset_a, b.asset_b]) {
216
+ if (!assetZone.has(side) && !assetZone.has(normalizeRef(side))) {
217
+ const zId = `TZ${zIdx++}`;
218
+ assetZone.set(side, zId);
219
+ assetZone.set(normalizeRef(side), zId);
220
+ zoneAssets.set(zId, new Set([side]));
221
+ zoneLabel.set(zId, side);
222
+ }
223
+ }
224
+ }
225
+ // ── Emit trust-boundary subgraphs ──
226
+ const inSubgraph = new Set();
227
+ for (const [zId, members] of zoneAssets) {
228
+ const rep = zoneLabel.get(zId) || [...members][0];
229
+ lines.push(` subgraph ${zId}["🧱 ${label(rep)}"]`);
230
+ for (const m of members) {
231
+ if (!usedAssets.has(m) && !usedAssets.has(normalizeRef(m)))
232
+ continue;
233
+ const badges = dataClassMap.get(m) || dataClassMap.get(normalizeRef(m));
234
+ const owner = ownerMap.get(m) || ownerMap.get(normalizeRef(m));
235
+ let suffix = '';
236
+ if (badges && badges.length > 0)
237
+ suffix += ` [${badges.join(', ')}]`;
238
+ if (owner)
239
+ suffix += ` (${label(owner, 15)})`;
240
+ lines.push(` ${mid(m)}["🔷 ${label(m)}${suffix}"]`);
241
+ inSubgraph.add(m);
242
+ inSubgraph.add(normalizeRef(m));
243
+ }
244
+ lines.push(' end');
245
+ }
246
+ // ── Asset nodes (not already in a subgraph) ──
66
247
  for (const a of usedAssets) {
67
- lines.push(` ${mid(a)}["🔷 ${label(a)}"]`);
248
+ if (inSubgraph.has(a) || inSubgraph.has(normalizeRef(a)))
249
+ continue;
250
+ const badges = dataClassMap.get(a) || dataClassMap.get(normalizeRef(a));
251
+ const owner = ownerMap.get(a) || ownerMap.get(normalizeRef(a));
252
+ let suffix = '';
253
+ if (badges && badges.length > 0)
254
+ suffix += ` [${badges.join(', ')}]`;
255
+ if (owner)
256
+ suffix += ` (${label(owner, 15)})`;
257
+ lines.push(` ${mid(a)}["🔷 ${label(a)}${suffix}"]`);
68
258
  }
69
- // Threat nodes
259
+ // Threat nodes (with CWE/external-ref badges)
70
260
  for (const t of usedThreats) {
71
- const sev = sevMap.get(t) || '';
261
+ const sev = sevMap.get(t) || sevMap.get(normalizeRef(t)) || '';
262
+ const display = threatLabelMap.get(t) || threatLabelMap.get(normalizeRef(t)) || t.replace('#', '');
72
263
  const icon = sev === 'critical' || sev === 'p0' ? '🔴' : sev === 'high' || sev === 'p1' ? '🟠' : '🟡';
73
- lines.push(` ${mid(t)}["${icon} ${label(t.replace('#', ''), 35)}"]:::threat`);
264
+ const refs = extRefMap.get(t) || extRefMap.get(normalizeRef(t));
265
+ const refSuffix = refs && refs.length > 0 ? ` (${refs.slice(0, 2).join(', ')})` : '';
266
+ lines.push(` ${mid(t)}["${icon} ${label(display, 35)}${refSuffix}"]:::threat`);
74
267
  }
75
268
  // Control nodes
76
269
  for (const c of usedControls) {
@@ -78,7 +271,7 @@ export function generateThreatGraph(model) {
78
271
  }
79
272
  // Exposure edges (deduplicated)
80
273
  for (const e of model.exposures) {
81
- if (filterHigh && !highSevThreats.has(e.threat))
274
+ if (filterHigh && !isHighThreat(e.threat))
82
275
  continue;
83
276
  const key = `${mid(e.asset)}->exp->${mid(e.threat)}`;
84
277
  if (!edges.has(key)) {
@@ -88,7 +281,7 @@ export function generateThreatGraph(model) {
88
281
  }
89
282
  // Mitigation edges
90
283
  for (const m of model.mitigations) {
91
- if (filterHigh && !highSevThreats.has(m.threat))
284
+ if (filterHigh && !isHighThreat(m.threat))
92
285
  continue;
93
286
  if (m.control) {
94
287
  const k1 = `${mid(m.control)}->mit->${mid(m.threat)}`;
@@ -102,10 +295,17 @@ export function generateThreatGraph(model) {
102
295
  lines.push(` ${mid(m.control)} -.- ${mid(m.asset)}`);
103
296
  }
104
297
  }
298
+ else {
299
+ const key = `${mid(m.asset)}->mit->${mid(m.threat)}`;
300
+ if (!edges.has(key)) {
301
+ edges.add(key);
302
+ lines.push(` ${mid(m.asset)} -. mitigates .-> ${mid(m.threat)}`);
303
+ }
304
+ }
105
305
  }
106
306
  // Acceptance edges
107
307
  for (const a of model.acceptances) {
108
- if (filterHigh && !highSevThreats.has(a.threat))
308
+ if (filterHigh && !isHighThreat(a.threat))
109
309
  continue;
110
310
  const key = `${mid(a.asset)}->acc->${mid(a.threat)}`;
111
311
  if (!edges.has(key)) {
@@ -113,6 +313,55 @@ export function generateThreatGraph(model) {
113
313
  lines.push(` ${mid(a.asset)} -- accepts --> ${mid(a.threat)}`);
114
314
  }
115
315
  }
316
+ // Transfer edges (risk moved between parties for a specific threat)
317
+ for (const t of model.transfers) {
318
+ if (filterHigh && !isHighThreat(t.threat))
319
+ continue;
320
+ const threatDisplay = threatLabelMap.get(t.threat) || threatLabelMap.get(normalizeRef(t.threat)) || t.threat.replace('#', '');
321
+ const key = `${mid(t.source)}->xfer->${mid(t.target)}::${mid(t.threat)}`;
322
+ if (!edges.has(key)) {
323
+ edges.add(key);
324
+ lines.push(` ${mid(t.source)} -- "transfers risk: ${label(threatDisplay, 26)}" --> ${mid(t.target)}`);
325
+ }
326
+ }
327
+ // Validation edges (controls validating assets)
328
+ for (const v of model.validations) {
329
+ const key = `${mid(v.control)}->val->${mid(v.asset)}`;
330
+ if (!edges.has(key)) {
331
+ edges.add(key);
332
+ lines.push(` ${mid(v.control)} -. validates .-> ${mid(v.asset)}`);
333
+ }
334
+ }
335
+ // Data-flow edges (only between assets already in the graph)
336
+ for (const f of model.flows) {
337
+ const srcIn = usedAssets.has(f.source) || usedAssets.has(normalizeRef(f.source));
338
+ const tgtIn = usedAssets.has(f.target) || usedAssets.has(normalizeRef(f.target));
339
+ if (!srcIn || !tgtIn)
340
+ continue;
341
+ const key = `${mid(f.source)}->flow->${mid(f.target)}`;
342
+ if (!edges.has(key)) {
343
+ edges.add(key);
344
+ if (f.mechanism) {
345
+ lines.push(` ${mid(f.source)} -- "${flowIcon(f.mechanism)} ${label(f.mechanism, 22)}" --> ${mid(f.target)}`);
346
+ }
347
+ else {
348
+ lines.push(` ${mid(f.source)} --> ${mid(f.target)}`);
349
+ }
350
+ }
351
+ }
352
+ // Trust-boundary crossing edges (dashed purple line between zones)
353
+ for (const b of model.boundaries) {
354
+ const aIn = usedAssets.has(b.asset_a) || usedAssets.has(normalizeRef(b.asset_a));
355
+ const bIn = usedAssets.has(b.asset_b) || usedAssets.has(normalizeRef(b.asset_b));
356
+ if (!aIn || !bIn)
357
+ continue;
358
+ const key = `${mid(b.asset_a)}->boundary->${mid(b.asset_b)}`;
359
+ if (!edges.has(key)) {
360
+ edges.add(key);
361
+ const desc = b.description ? label(b.description, 26) : 'trust boundary';
362
+ lines.push(` ${mid(b.asset_a)} -.-|🧱 ${desc}| ${mid(b.asset_b)}`);
363
+ }
364
+ }
116
365
  lines.push(' classDef threat fill:#991b1b,stroke:#ef4444,color:#fecaca');
117
366
  lines.push(' classDef control fill:#065f46,stroke:#10b981,color:#a7f3d0');
118
367
  return lines.join('\n');
@@ -124,28 +373,52 @@ export function generateThreatGraph(model) {
124
373
  export function generateDataFlowDiagram(model) {
125
374
  if (model.flows.length === 0)
126
375
  return '';
127
- const lines = ['graph LR'];
128
- // Collect boundary memberships
129
- const boundaryMembers = new Map();
376
+ const maxMechanismLen = model.flows.reduce((max, f) => {
377
+ const len = (f.mechanism || '').length;
378
+ return len > max ? len : max;
379
+ }, 0);
380
+ const spacingBoost = Math.max(0, Math.min(140, (maxMechanismLen - 24) * 3));
381
+ const nodeSpacing = 40 + Math.floor(spacingBoost * 0.4);
382
+ const rankSpacing = 50 + spacingBoost;
383
+ const lines = [
384
+ `%%{init: {"flowchart": {"nodeSpacing": ${nodeSpacing}, "rankSpacing": ${rankSpacing}, "curve": "basis"}}}%%`,
385
+ 'graph LR',
386
+ ];
387
+ // Collect boundary zones: each side of a boundary is a separate zone
388
+ // An asset may appear in multiple boundaries, so track zone membership
389
+ const assetZone = new Map(); // asset -> zone label
390
+ const zones = new Map(); // zone label -> members
391
+ const boundaryEdges = [];
392
+ let zIdx = 0;
130
393
  for (const b of model.boundaries) {
131
- const bName = b.id || `${b.asset_a}_${b.asset_b}`;
132
- if (!boundaryMembers.has(bName))
133
- boundaryMembers.set(bName, new Set());
134
- boundaryMembers.get(bName).add(b.asset_a);
135
- boundaryMembers.get(bName).add(b.asset_b);
394
+ const desc = b.description || b.id || `${b.asset_a}/${b.asset_b}`;
395
+ // Assign each side to its own zone if not already in one
396
+ if (!assetZone.has(b.asset_a)) {
397
+ const zoneLabel = `Z${zIdx++}`;
398
+ assetZone.set(b.asset_a, zoneLabel);
399
+ zones.set(zoneLabel, new Set([b.asset_a]));
400
+ }
401
+ if (!assetZone.has(b.asset_b)) {
402
+ const zoneLabel = `Z${zIdx++}`;
403
+ assetZone.set(b.asset_b, zoneLabel);
404
+ zones.set(zoneLabel, new Set([b.asset_b]));
405
+ }
406
+ boundaryEdges.push({ a: b.asset_a, b: b.asset_b, desc });
136
407
  }
137
- // Emit boundary subgraphs
408
+ // Emit zone subgraphs
138
409
  const inBoundary = new Set();
139
- let bIdx = 0;
140
- for (const [bName, members] of boundaryMembers) {
141
- const desc = model.boundaries.find(b => (b.id || `${b.asset_a}_${b.asset_b}`) === bName)?.description || bName;
142
- lines.push(` subgraph B${bIdx}["🔒 ${label(desc, 50)}"]`);
410
+ for (const [zoneId, members] of zones) {
411
+ const representative = [...members][0];
412
+ lines.push(` subgraph ${zoneId}["🧱 Trust Zone · ${labelFull(representative)}"]`);
143
413
  for (const m of members) {
144
- lines.push(` ${mid(m)}["${label(m)}"]`);
414
+ lines.push(` ${mid(m)}["${assetIcon(m)} ${labelFull(m)}"]`);
145
415
  inBoundary.add(m);
146
416
  }
147
417
  lines.push(' end');
148
- bIdx++;
418
+ }
419
+ // Emit boundary edges between zones (thick dashed line)
420
+ for (const be of boundaryEdges) {
421
+ lines.push(` ${mid(be.a)} -.-|🧱 ${labelFull(be.desc)}| ${mid(be.b)}`);
149
422
  }
150
423
  // Data handling badges
151
424
  const handling = new Map();
@@ -164,13 +437,13 @@ export function generateDataFlowDiagram(model) {
164
437
  if (!inBoundary.has(n)) {
165
438
  const badges = handling.get(n);
166
439
  const suffix = badges ? ` · ${badges.join(', ')}` : '';
167
- lines.push(` ${mid(n)}["${label(n)}${suffix}"]`);
440
+ lines.push(` ${mid(n)}["${assetIcon(n)} ${labelFull(n)}${suffix}"]`);
168
441
  }
169
442
  }
170
443
  // Flow edges
171
444
  for (const f of model.flows) {
172
445
  if (f.mechanism) {
173
- lines.push(` ${mid(f.source)} -- ${label(f.mechanism, 28)} --> ${mid(f.target)}`);
446
+ lines.push(` ${mid(f.source)} -- "${flowIcon(f.mechanism)} ${labelFull(f.mechanism)}" --> ${mid(f.target)}`);
174
447
  }
175
448
  else {
176
449
  lines.push(` ${mid(f.source)} --> ${mid(f.target)}`);
@@ -186,12 +459,12 @@ export function generateAttackSurface(model) {
186
459
  if (model.exposures.length === 0)
187
460
  return '';
188
461
  const lines = ['graph LR'];
189
- // Build set of mitigated/accepted
462
+ // Build set of mitigated/accepted (normalize refs for consistent matching)
190
463
  const resolved = new Set();
191
464
  for (const m of model.mitigations)
192
- resolved.add(`${m.asset}::${m.threat}`);
465
+ resolved.add(`${normalizeRef(m.asset)}::${normalizeRef(m.threat)}`);
193
466
  for (const a of model.acceptances)
194
- resolved.add(`${a.asset}::${a.threat}`);
467
+ resolved.add(`${normalizeRef(a.asset)}::${normalizeRef(a.threat)}`);
195
468
  // Group exposures by asset, deduplicate by threat, keep highest severity
196
469
  const sevOrder = { critical: 0, p0: 0, high: 1, p1: 1, medium: 2, p2: 2, low: 3, p3: 3, unset: 4 };
197
470
  const byAsset = new Map();
@@ -201,7 +474,7 @@ export function generateAttackSurface(model) {
201
474
  const assetMap = byAsset.get(e.asset);
202
475
  const existing = assetMap.get(e.threat);
203
476
  const sev = (e.severity || 'unset').toLowerCase();
204
- const isResolved = resolved.has(`${e.asset}::${e.threat}`);
477
+ const isResolved = resolved.has(`${normalizeRef(e.asset)}::${normalizeRef(e.threat)}`);
205
478
  if (!existing || (sevOrder[sev] ?? 4) < (sevOrder[existing.severity] ?? 4)) {
206
479
  assetMap.set(e.threat, { threat: e.threat, severity: sev, count: (existing?.count || 0) + 1, resolved: isResolved });
207
480
  }
@@ -1 +1 @@
1
- {"version":3,"file":"diagrams.js","sourceRoot":"","sources":["../../src/dashboard/diagrams.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diagrams.js","sourceRoot":"","sources":["../../src/dashboard/diagrams.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,yDAAyD;AACzD,SAAS,GAAG,CAAC,CAAS;IACpB,OAAO,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED,uFAAuF;AACvF,SAAS,KAAK,CAAC,CAAS,EAAE,GAAG,GAAG,EAAE;IAChC,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACjE,OAAO,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;AACpE,CAAC;AAED,0EAA0E;AAC1E,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,iFAAiF;AACjF,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAClD,CAAC;AAED,2EAA2E;AAC3E,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3C,IAAI,0CAA0C,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpE,IAAI,2DAA2D,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACrF,IAAI,+CAA+C,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACzE,IAAI,wDAAwD,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACnF,IAAI,uEAAuE,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAClG,OAAO,IAAI,CAAC;AACd,CAAC;AAED,oDAAoD;AACpD,SAAS,QAAQ,CAAC,SAAiB;IACjC,MAAM,CAAC,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IAClC,IAAI,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,IAAI,2CAA2C,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACrE,IAAI,wCAAwC,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAClE,IAAI,4CAA4C,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACvE,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAkB;IACpD,oEAAoE;IACpE,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IACjD,MAAM,OAAO,GAA2B,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAE1H,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAE,QAAgB,EAAQ,EAAE;QAChE,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC9B,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACnE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAC1B,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,OAAe,EAAQ,EAAE;QAC5D,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO;YAAE,OAAO;QAC7B,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrE,8EAA8E;QAC9E,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YAClD,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACjC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3C,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;YACT,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YACjC,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC3B,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACnC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7B,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACjE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;gBAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;YACvE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3B,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3C,iBAAiB,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/B,cAAc,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACjE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC7B,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,GAAW,EAAW,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;IAEhH,qDAAqD;IACrD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS;QAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,GAAG,EAAE,CAAC;IAE1C,MAAM,KAAK,GAAa,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,UAAU,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;YAAE,SAAS;QACpD,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxB,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,UAAU,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;YAAE,SAAS;QACpD,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,CAAC,CAAC,OAAO;YAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,UAAU,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;YAAE,SAAS;QACpD,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,UAAU,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;YAAE,SAAS;QACpD,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAChF,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QAClC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxB,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,sEAAsE;IACtE,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC9D,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;QAChE,IAAI,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;YACrB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACxD,YAAY,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAChC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QAC/B,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,oDAAoD;IACpD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC9C,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,IAAc,EAAE,EAAE;QACjD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACvC,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5C,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;gBACtB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;YACpC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;gBAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;gBAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;YAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;YAAE,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;IACxE,CAAC;IAED,2DAA2D;IAC3D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAE,kBAAkB;IAChE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAuB,CAAC,CAAC,mBAAmB;IACtE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,kBAAkB;IAC/D,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACjC,kEAAkE;QAClE,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACnF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACnF,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK;YAAE,SAAS;QAE/B,qDAAqD;QACrD,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBAC/D,MAAM,GAAG,GAAG,KAAK,IAAI,EAAE,EAAE,CAAC;gBAC1B,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBACzB,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;gBACvC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACrC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,UAAU,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,QAAQ,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAAE,SAAS;YACrE,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;YACxE,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YACrE,IAAI,KAAK;gBAAE,MAAM,IAAI,KAAK,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;YACvD,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAClB,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAED,gDAAgD;IAChD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAAE,SAAS;QACnE,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACrE,IAAI,KAAK;YAAE,MAAM,IAAI,KAAK,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;IACvD,CAAC;IACD,8CAA8C;IAC9C,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/D,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACnG,MAAM,IAAI,GAAG,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACtG,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,SAAS,aAAa,CAAC,CAAC;IAClF,CAAC;IACD,gBAAgB;IAChB,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;IAC1E,CAAC;IAED,gCAAgC;IAChC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,UAAU,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;YAAE,SAAS;QACpD,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IACD,mBAAmB;IACnB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,UAAU,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;YAAE,SAAS;QACpD,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;YAC3G,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;QAC/F,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;QAC7G,CAAC;IACH,CAAC;IACD,mBAAmB;IACnB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,UAAU,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;YAAE,SAAS;QACpD,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;IAC3G,CAAC;IACD,oEAAoE;IACpE,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,UAAU,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;YAAE,SAAS;QACpD,MAAM,aAAa,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC9H,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,wBAAwB,KAAK,CAAC,aAAa,EAAE,EAAE,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzG,CAAC;IACH,CAAC;IACD,gDAAgD;IAChD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;IAC9G,CAAC;IACD,6DAA6D;IAC7D,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACjF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK;YAAE,SAAS;QAC/B,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACf,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;gBAChB,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAChH,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;IACH,CAAC;IACD,mEAAmE;IACnE,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACjF,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG;YAAE,SAAS;QAC3B,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACf,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;YACzE,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAC1E,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IAE3E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAkB;IACxD,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACpD,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACvC,OAAO,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC/B,CAAC,EAAE,CAAC,CAAC,CAAC;IACN,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,eAAe,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,EAAE,GAAG,YAAY,CAAC;IAEtC,MAAM,KAAK,GAAa;QACtB,0CAA0C,WAAW,oBAAoB,WAAW,yBAAyB;QAC7G,UAAU;KACX,CAAC;IAEF,qEAAqE;IACrE,uEAAuE;IACvE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,sBAAsB;IACnE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC,CAAC,wBAAwB;IACtE,MAAM,aAAa,GAA6C,EAAE,CAAC;IACnE,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QAClE,yDAAyD;QACzD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;YAC/B,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACpC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;YAC/B,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACpC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,sBAAsB;IACtB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC;QACtC,MAAM,cAAc,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,qBAAqB,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACnF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/D,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAED,wDAAwD;IACxD,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,uBAAuB;IACvB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IAChD,CAAC;IAED,yCAAyC;IACzC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAAC,CAAC;IAChF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,aAAa;IACb,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChH,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAkB;IACtD,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE5C,MAAM,KAAK,GAAa,CAAC,UAAU,CAAC,CAAC;IAErC,2EAA2E;IAC3E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW;QAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvG,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW;QAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAEvG,yEAAyE;IACzE,MAAM,QAAQ,GAA2B,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC3H,MAAM,OAAO,GAAG,IAAI,GAAG,EAA+F,CAAC;IAEvH,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAClD,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvF,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC3E,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;QACvH,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAED,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,OAAO,EAAE,CAAC;QACzC,4CAA4C;QAC5C,MAAM,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEjH,KAAK,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,GAAG,GAAG,WAAW,CAAC;YACtB,IAAI,KAAK,CAAC,QAAQ,KAAK,UAAU,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;gBAAE,GAAG,GAAG,UAAU,CAAC;iBAC1E,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;gBAAE,GAAG,GAAG,UAAU,CAAC;iBAC3E,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;gBAAE,GAAG,GAAG,SAAS,CAAC;iBAC5E,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;gBAAE,GAAG,GAAG,SAAS,CAAC;YAE9E,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YACzC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7D,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,IAAI,IAAI,WAAW,GAAG,WAAW,QAAQ,GAAG,EAAE,CAAC,CAAC;YAC5E,IAAI,EAAE,CAAC;QACT,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAC5E,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAC5E,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IAC3E,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IAC3E,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;IAE7E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/dashboard/generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAInE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,uBAAuB,EAAE,GAAG,MAAM,CAwkBrH"}
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/dashboard/generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAInE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,uBAAuB,EAAE,GAAG,MAAM,CAulBrH"}
@@ -449,7 +449,7 @@ async function getMermaidInstance() {
449
449
  background: '#ffffff', mainBkg: '#e8f4f8', nodeBorder: '#94a3b8',
450
450
  clusterBkg: '#f8fafc', clusterBorder: '#cbd5e1', fontSize: '12px', fontFamily: 'var(--font-ui)'
451
451
  },
452
- flowchart: { curve: 'basis', padding: 15, nodeSpacing: 40, rankSpacing: 50, htmlLabels: true, useMaxWidth: false },
452
+ flowchart: { curve: 'basis', padding: 15, nodeSpacing: 40, rankSpacing: 50, htmlLabels: false, useMaxWidth: false },
453
453
  securityLevel: 'loose',
454
454
  });
455
455
  return mermaid;
@@ -481,8 +481,23 @@ async function renderMermaidPanel(panel) {
481
481
  });
482
482
  svg.call(zoom);
483
483
 
484
- // Let the SVG fill the container
485
- svg.attr('width', '100%').attr('height', '100%').style('max-width', 'none');
484
+ // Preserve natural SVG size so long labels are not clipped.
485
+ // Container scrolling handles overflow for large graphs.
486
+ const rootNode = inner.node();
487
+ if (rootNode && typeof rootNode.getBBox === 'function') {
488
+ const bbox = rootNode.getBBox();
489
+ const pad = 80;
490
+ const viewX = Math.floor(bbox.x - pad / 2);
491
+ const viewY = Math.floor(bbox.y - pad / 2);
492
+ const viewW = Math.max(900, Math.ceil(bbox.width + pad));
493
+ const viewH = Math.max(520, Math.ceil(bbox.height + pad));
494
+ svg
495
+ .attr('viewBox', viewX + ' ' + viewY + ' ' + viewW + ' ' + viewH)
496
+ .attr('width', viewW)
497
+ .attr('height', viewH)
498
+ .style('max-width', 'none')
499
+ .style('overflow', 'visible');
500
+ }
486
501
 
487
502
  // Double click to reset
488
503
  svg.on('dblclick.zoom', null); // disable default dblclick zoom
@@ -1193,8 +1208,9 @@ tr.clickable { cursor: pointer; } tr.clickable:hover { background: var(--table-h
1193
1208
 
1194
1209
  /* ── Diagrams ── */
1195
1210
  .diagram-hint { font-size: .75rem; color: var(--muted); margin-bottom: .6rem; }
1196
- .mermaid-wrap { background: var(--surface); border: 1px solid var(--border); border-radius: 6px; padding: 16px; overflow-x: auto; margin-bottom: 1rem; }
1197
- .mermaid { text-align: center; } .mermaid svg { max-width: 100%; height: auto; }
1211
+ .mermaid-wrap { background: var(--surface); border: 1px solid var(--border); border-radius: 6px; padding: 16px; overflow: auto; margin-bottom: 1rem; }
1212
+ .mermaid { text-align: left; width: max-content; min-width: 100%; }
1213
+ .mermaid svg { max-width: none; height: auto; display: block; }
1198
1214
 
1199
1215
  /* ── Heatmap ── */
1200
1216
  .heatmap { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px; }