agentopology 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +70 -33
- package/dist/analyzer/index.d.ts +1 -0
- package/dist/analyzer/index.d.ts.map +1 -1
- package/dist/analyzer/index.js +35 -0
- package/dist/analyzer/index.js.map +1 -1
- package/dist/bindings/claude-code.d.ts.map +1 -1
- package/dist/bindings/claude-code.js +283 -2
- package/dist/bindings/claude-code.js.map +1 -1
- package/dist/bindings/openclaw.d.ts.map +1 -1
- package/dist/bindings/openclaw.js +390 -12
- package/dist/bindings/openclaw.js.map +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/docs/__tests__/docs.test.js +2 -1
- package/dist/docs/__tests__/docs.test.js.map +1 -1
- package/dist/docs/content.d.ts.map +1 -1
- package/dist/docs/content.js +730 -4
- package/dist/docs/content.js.map +1 -1
- package/dist/exporters/markdown.d.ts.map +1 -1
- package/dist/exporters/markdown.js +165 -0
- package/dist/exporters/markdown.js.map +1 -1
- package/dist/exporters/mermaid.d.ts.map +1 -1
- package/dist/exporters/mermaid.js +30 -0
- package/dist/exporters/mermaid.js.map +1 -1
- package/dist/import/__tests__/import.test.js +554 -0
- package/dist/import/__tests__/import.test.js.map +1 -1
- package/dist/import/claude-code.d.ts.map +1 -1
- package/dist/import/claude-code.js +2 -0
- package/dist/import/claude-code.js.map +1 -1
- package/dist/import/index.d.ts +1 -0
- package/dist/import/index.d.ts.map +1 -1
- package/dist/import/index.js +7 -1
- package/dist/import/index.js.map +1 -1
- package/dist/import/openclaw.d.ts +70 -0
- package/dist/import/openclaw.d.ts.map +1 -0
- package/dist/import/openclaw.js +1060 -0
- package/dist/import/openclaw.js.map +1 -0
- package/dist/import/serializer.d.ts.map +1 -1
- package/dist/import/serializer.js +171 -4
- package/dist/import/serializer.js.map +1 -1
- package/dist/parser/__tests__/parser.test.js +463 -0
- package/dist/parser/__tests__/parser.test.js.map +1 -1
- package/dist/parser/ast.d.ts +122 -0
- package/dist/parser/ast.d.ts.map +1 -1
- package/dist/parser/index.d.ts +14 -2
- package/dist/parser/index.d.ts.map +1 -1
- package/dist/parser/index.js +226 -5
- package/dist/parser/index.js.map +1 -1
- package/dist/parser/validator.d.ts +1 -1
- package/dist/parser/validator.d.ts.map +1 -1
- package/dist/parser/validator.js +214 -1
- package/dist/parser/validator.js.map +1 -1
- package/dist/visualizer/index.d.ts.map +1 -1
- package/dist/visualizer/index.js +263 -27
- package/dist/visualizer/index.js.map +1 -1
- package/examples/memory-system.at +162 -0
- package/examples/script-agent-pipeline.at +65 -0
- package/package.json +1 -1
- package/spec/grammar.md +345 -10
- package/spec/reserved-keywords.md +25 -1
- package/spec/validation.md +171 -2
package/dist/visualizer/index.js
CHANGED
|
@@ -132,6 +132,10 @@ function astToViewData(ast) {
|
|
|
132
132
|
base.sandbox = a.sandbox;
|
|
133
133
|
if (a.fallbackChain)
|
|
134
134
|
base.fallbackChain = a.fallbackChain;
|
|
135
|
+
if (a.memory && a.memory.length > 0)
|
|
136
|
+
base.memory = a.memory;
|
|
137
|
+
if (a.retrieval)
|
|
138
|
+
base.retrieval = a.retrieval;
|
|
135
139
|
break;
|
|
136
140
|
}
|
|
137
141
|
case "gate": {
|
|
@@ -196,6 +200,8 @@ function astToViewData(ast) {
|
|
|
196
200
|
edges,
|
|
197
201
|
depth: ast.depth,
|
|
198
202
|
memory: ast.memory,
|
|
203
|
+
stores: ast.stores,
|
|
204
|
+
retrievals: ast.retrievals,
|
|
199
205
|
batch: ast.batch,
|
|
200
206
|
environments: ast.environments,
|
|
201
207
|
triggers: ast.triggers,
|
|
@@ -247,17 +253,21 @@ ${CSS}
|
|
|
247
253
|
</div>
|
|
248
254
|
<div class="topo-name" id="topo-name"></div>
|
|
249
255
|
<div class="topo-ver" id="topo-ver"></div>
|
|
250
|
-
<
|
|
251
|
-
<div
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
256
|
+
<button id="mobile-menu-btn" onclick="toggleMobileMenu()">☰</button>
|
|
257
|
+
<div id="header-actions">
|
|
258
|
+
<div class="topo-desc" id="topo-desc"></div>
|
|
259
|
+
<div class="pattern-badges" id="pattern-badges"></div>
|
|
260
|
+
<input type="text" id="search-input" class="search-input" placeholder="Search nodes..." oninput="onSearchInput(this.value)" />
|
|
261
|
+
<button class="header-btn" id="dataflow-btn" onclick="toggleDataFlow()">Data Flow</button>
|
|
262
|
+
<button class="header-btn" id="orientation-btn" onclick="toggleOrientation()" title="Switch between vertical and horizontal layout">↔ Horizontal</button>
|
|
263
|
+
<button class="header-btn" onclick="exportSvg()">Export SVG</button>
|
|
264
|
+
<button class="header-btn" id="issues-btn" onclick="toggleIssuesPanel()" style="display:none">Issues <span id="issues-badge" class="issues-badge">0</span></button>
|
|
265
|
+
<button class="header-btn" onclick="openLoadModal()">Load JSON</button>
|
|
266
|
+
<button class="header-btn" id="panel-btn" onclick="togglePanel()">Panel ▶</button>
|
|
267
|
+
</div>
|
|
259
268
|
</div>
|
|
260
269
|
<div id="main">
|
|
270
|
+
<div class="mobile-overlay-backdrop" id="mobile-backdrop" onclick="closeMobileOverlays()"></div>
|
|
261
271
|
<div id="graph-container">
|
|
262
272
|
<svg id="graph-svg"></svg>
|
|
263
273
|
<div id="zoom-controls">
|
|
@@ -277,6 +287,7 @@ ${CSS}
|
|
|
277
287
|
<div id="issues-list" class="issues-list"></div>
|
|
278
288
|
</div>
|
|
279
289
|
<div id="side-panel" class="collapsed">
|
|
290
|
+
<button id="panel-close-btn" onclick="closePanel()">×</button>
|
|
280
291
|
<div id="tab-bar">
|
|
281
292
|
<div class="tab active" data-tab="inspect">Inspect</div>
|
|
282
293
|
<div class="tab" data-tab="memory">Memory</div>
|
|
@@ -356,7 +367,7 @@ body{background:var(--bg);color:var(--t);font-family:var(--font-body);line-heigh
|
|
|
356
367
|
#app{display:flex;flex-direction:column;height:100vh}
|
|
357
368
|
#header{padding:10px 20px;background:var(--s);border-bottom:1px solid var(--b);display:flex;align-items:center;gap:14px;flex-shrink:0;z-index:10}
|
|
358
369
|
#main{display:flex;flex:1;overflow:hidden}
|
|
359
|
-
#graph-container{flex:1;position:relative;overflow:hidden;cursor:grab}
|
|
370
|
+
#graph-container{flex:1;position:relative;overflow:hidden;cursor:grab;touch-action:none}
|
|
360
371
|
#graph-container.dragging{cursor:grabbing}
|
|
361
372
|
#graph-svg{position:absolute;top:0;left:0}
|
|
362
373
|
#side-panel{width:380px;background:var(--s);border-left:1px solid var(--b);display:flex;flex-direction:column;flex-shrink:0;overflow:hidden;transition:width .2s}
|
|
@@ -440,6 +451,7 @@ body{background:var(--bg);color:var(--t);font-family:var(--font-body);line-heigh
|
|
|
440
451
|
.edge-path.conditional{stroke:var(--t3);stroke-dasharray:6 4}
|
|
441
452
|
.edge-path.failure{stroke:var(--red);stroke-dasharray:6 4;opacity:.7}
|
|
442
453
|
.edge-path.loop{stroke:var(--orange);stroke-dasharray:4 4}
|
|
454
|
+
.edge-path.memory{stroke:#14b8a6;stroke-dasharray:4 4;opacity:.6}
|
|
443
455
|
.edge-group.dimmed .edge-path{opacity:.06}
|
|
444
456
|
.edge-group.dimmed .edge-label-group{opacity:.06}
|
|
445
457
|
.edge-group.highlighted .edge-path{stroke-width:2.5;opacity:1}
|
|
@@ -524,6 +536,44 @@ body{background:var(--bg);color:var(--t);font-family:var(--font-body);line-heigh
|
|
|
524
536
|
.trigger-popover-item:hover{background:rgba(255,255,255,.04)}
|
|
525
537
|
.trigger-popover-cmd{font-family:var(--font-mono);font-size:12px;color:var(--cyan);font-weight:600}
|
|
526
538
|
.trigger-popover-pattern{font-family:var(--font-mono);font-size:10px;color:var(--t2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
539
|
+
|
|
540
|
+
#mobile-menu-btn{display:none;background:var(--s2);border:1px solid var(--b);color:var(--t2);font-size:18px;padding:4px 10px;border-radius:6px;cursor:pointer;line-height:1}
|
|
541
|
+
#header-actions{display:contents}
|
|
542
|
+
#panel-close-btn{display:none}
|
|
543
|
+
.mobile-overlay-backdrop{display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.5);z-index:20;backdrop-filter:blur(2px)}
|
|
544
|
+
.mobile-overlay-backdrop.visible{display:block}
|
|
545
|
+
|
|
546
|
+
@media(max-width:768px){
|
|
547
|
+
#mobile-menu-btn{display:block}
|
|
548
|
+
#header{padding:8px 12px;gap:8px;flex-wrap:nowrap;position:relative}
|
|
549
|
+
#header-actions{display:none;position:absolute;top:100%;left:0;right:0;background:var(--s);border-bottom:1px solid var(--b);padding:12px;flex-direction:column;gap:8px;z-index:30;box-shadow:0 8px 24px rgba(0,0,0,.4)}
|
|
550
|
+
#header-actions.open{display:flex}
|
|
551
|
+
.topo-desc,.pattern-badges,.topo-ver{display:none}
|
|
552
|
+
.search-input{width:100%!important}
|
|
553
|
+
.search-input:focus{width:100%!important}
|
|
554
|
+
#panel-close-btn{display:flex;position:absolute;top:8px;right:8px;z-index:30;width:32px;height:32px;align-items:center;justify-content:center;background:var(--s2);border:1px solid var(--b2);border-radius:8px;color:var(--t2);font-size:18px;cursor:pointer;transition:all .15s}
|
|
555
|
+
#panel-close-btn:hover{background:rgba(255,255,255,.08);color:var(--t)}
|
|
556
|
+
#side-panel{position:fixed;top:0;right:0;height:100vh;height:100dvh;z-index:25;border-left:1px solid var(--b);width:min(380px,85vw)!important;flex-shrink:0;transition:transform .25s cubic-bezier(.4,0,.2,1)!important;transform:translateX(0);box-shadow:-4px 0 24px rgba(0,0,0,.3)}
|
|
557
|
+
#side-panel.collapsed{transform:translateX(100%)!important;box-shadow:none}
|
|
558
|
+
.issues-panel{position:fixed;top:0;right:0;height:100vh;height:100dvh;z-index:25;border-left:1px solid var(--b);width:min(340px,85vw)}
|
|
559
|
+
.issues-panel.collapsed{transform:translateX(100%)}
|
|
560
|
+
#legend{max-width:180px;font-size:9px;padding:8px 12px}
|
|
561
|
+
.legend-label{font-size:9px}
|
|
562
|
+
.zoom-btn{width:40px;height:40px;font-size:18px}
|
|
563
|
+
#load-modal .modal-content{width:100%;max-width:100%;border-radius:0;max-height:100vh;height:100vh}
|
|
564
|
+
.tab{padding:6px 10px;font-size:9px}
|
|
565
|
+
#tab-bar{padding-right:40px}
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
@media(max-width:480px){
|
|
569
|
+
#side-panel{width:100vw!important}
|
|
570
|
+
#side-panel.collapsed{width:100vw!important}
|
|
571
|
+
.issues-panel,.issues-panel.collapsed{width:100vw;max-width:100vw}
|
|
572
|
+
#legend{display:none}
|
|
573
|
+
#legend.visible{display:block}
|
|
574
|
+
.topo-name{font-size:11px}
|
|
575
|
+
#header{padding:6px 8px;gap:6px}
|
|
576
|
+
}
|
|
527
577
|
`;
|
|
528
578
|
// ---------------------------------------------------------------------------
|
|
529
579
|
// Inline JS (the full advanced viewer logic)
|
|
@@ -613,6 +663,7 @@ function typeColor(type) {
|
|
|
613
663
|
case 'action': return { main: COLOR_GRAY, bg: 'rgba(148,163,184,.08)', br: 'rgba(148,163,184,.2)' };
|
|
614
664
|
case 'gate': return { main: COLOR_ORANGE, bg: 'rgba(251,146,60,.10)', br: 'rgba(251,146,60,.25)' };
|
|
615
665
|
case 'orchestrator': return { main: COLOR_GOLD, bg: 'rgba(251,191,36,.10)', br: 'rgba(251,191,36,.25)' };
|
|
666
|
+
case 'store': return { main: '#14b8a6', bg: 'rgba(20,184,166,.10)', br: 'rgba(20,184,166,.25)' };
|
|
616
667
|
default: return { main: COLOR_GRAY, bg: 'rgba(148,163,184,.08)', br: 'rgba(148,163,184,.2)' };
|
|
617
668
|
}
|
|
618
669
|
}
|
|
@@ -620,6 +671,7 @@ function typeIcon(type) {
|
|
|
620
671
|
switch (type) {
|
|
621
672
|
case 'agent': return '\\u2726'; case 'action': return '\\u25C7';
|
|
622
673
|
case 'gate': return '\\u2B21'; case 'orchestrator': return '\\u2B22';
|
|
674
|
+
case 'store': return '\\u26C1';
|
|
623
675
|
default: return '\\u25CB';
|
|
624
676
|
}
|
|
625
677
|
}
|
|
@@ -627,6 +679,7 @@ function nodeSize(node) {
|
|
|
627
679
|
if (node.type === 'orchestrator') return { w: ORCH_W, h: ORCH_H };
|
|
628
680
|
if (node.type === 'gate') return { w: 120, h: 70 };
|
|
629
681
|
if (node.type === 'action') return { w: ACTION_W, h: ACTION_H };
|
|
682
|
+
if (node.type === 'store') return { w: 140, h: 60 };
|
|
630
683
|
return { w: NODE_W, h: NODE_H };
|
|
631
684
|
}
|
|
632
685
|
function isManualNode(node) { return node.invocation === 'manual'; }
|
|
@@ -795,9 +848,29 @@ function renderGraph() {
|
|
|
795
848
|
const container = document.getElementById('graph-container');
|
|
796
849
|
const rect = container.getBoundingClientRect();
|
|
797
850
|
|
|
798
|
-
|
|
851
|
+
// Build combined nodes and edges including memory store pseudo-nodes
|
|
852
|
+
var allNodes = data.nodes.slice();
|
|
853
|
+
var allEdges = data.edges.slice();
|
|
854
|
+
var storeIds = new Set();
|
|
855
|
+
if (data.stores && data.stores.length > 0) {
|
|
856
|
+
data.stores.forEach(function(store) {
|
|
857
|
+
allNodes.push({ id: store.id, type: 'store', label: store.id, storeType: store.type, backend: store.backend });
|
|
858
|
+
storeIds.add(store.id);
|
|
859
|
+
});
|
|
860
|
+
// Add edges from agents to their memory stores
|
|
861
|
+
data.nodes.forEach(function(n) {
|
|
862
|
+
if (n.memory && n.memory.length > 0) {
|
|
863
|
+
n.memory.forEach(function(storeId) {
|
|
864
|
+
if (storeIds.has(storeId)) {
|
|
865
|
+
allEdges.push({ from: n.id, to: storeId, condition: null, maxIterations: null, isMemory: true });
|
|
866
|
+
}
|
|
867
|
+
});
|
|
868
|
+
}
|
|
869
|
+
});
|
|
870
|
+
}
|
|
871
|
+
nodePositions = layoutNodes(allNodes, allEdges);
|
|
799
872
|
const nodeMap = {};
|
|
800
|
-
|
|
873
|
+
allNodes.forEach(n => nodeMap[n.id] = n);
|
|
801
874
|
|
|
802
875
|
if (isHorizontal) {
|
|
803
876
|
let minNewX = Infinity;
|
|
@@ -849,7 +922,7 @@ function renderGraph() {
|
|
|
849
922
|
// --- Build parallel-edge lookup ---
|
|
850
923
|
const edgePairCount = {};
|
|
851
924
|
const edgePairIndex = {};
|
|
852
|
-
|
|
925
|
+
allEdges.forEach(edge => {
|
|
853
926
|
const pairKey = [edge.from, edge.to].sort().join('::');
|
|
854
927
|
if (!edgePairCount[pairKey]) edgePairCount[pairKey] = 0;
|
|
855
928
|
edgePairIndex[edge.from + '::' + edge.to + '::' + (edge.condition||'') + '::' + (edge.maxIterations||'')] = edgePairCount[pairKey];
|
|
@@ -858,16 +931,18 @@ function renderGraph() {
|
|
|
858
931
|
|
|
859
932
|
// --- Edges ---
|
|
860
933
|
const edgeLabelCount = {};
|
|
861
|
-
|
|
934
|
+
allEdges.forEach(edge => {
|
|
862
935
|
const fromPos = nodePositions[edge.from], toPos = nodePositions[edge.to];
|
|
863
936
|
if (!fromPos || !toPos) return;
|
|
864
937
|
|
|
938
|
+
const isMemoryEdge = edge.isMemory === true;
|
|
865
939
|
const isFailure = edge.condition && edge.condition.includes('fail');
|
|
866
940
|
const isLoop = edge.maxIterations != null;
|
|
867
941
|
const isConditional = edge.condition != null;
|
|
868
942
|
|
|
869
943
|
let edgeClass = 'unconditional', markerEnd = 'url(#arrow)';
|
|
870
|
-
if (
|
|
944
|
+
if (isMemoryEdge) { edgeClass = 'memory'; markerEnd = 'url(#arrow)'; }
|
|
945
|
+
else if (isLoop) { edgeClass = 'loop'; markerEnd = 'url(#arrow-loop)'; }
|
|
871
946
|
else if (isFailure) { edgeClass = 'failure'; markerEnd = 'url(#arrow-fail)'; }
|
|
872
947
|
else if (isConditional) { edgeClass = 'conditional'; markerEnd = 'url(#arrow-cond)'; }
|
|
873
948
|
|
|
@@ -928,8 +1003,8 @@ function renderGraph() {
|
|
|
928
1003
|
}
|
|
929
1004
|
}
|
|
930
1005
|
|
|
931
|
-
// Back-edges with maxIterations get dashed stroke
|
|
932
|
-
const backEdgeDash = isLoop ? ' stroke-dasharray="6 4"' : '';
|
|
1006
|
+
// Back-edges with maxIterations get dashed stroke, memory edges get dotted
|
|
1007
|
+
const backEdgeDash = isMemoryEdge ? ' stroke-dasharray="4 4"' : isLoop ? ' stroke-dasharray="6 4"' : '';
|
|
933
1008
|
|
|
934
1009
|
s += '<g class="edge-group" data-from="' + edge.from + '" data-to="' + edge.to + '">';
|
|
935
1010
|
s += '<path d="' + pathD + '" class="edge-path ' + edgeClass + '" marker-end="' + markerEnd + '"' + backEdgeDash + '/>';
|
|
@@ -1063,8 +1138,8 @@ function renderGraph() {
|
|
|
1063
1138
|
}
|
|
1064
1139
|
}
|
|
1065
1140
|
|
|
1066
|
-
// --- Nodes ---
|
|
1067
|
-
|
|
1141
|
+
// --- Nodes (includes store pseudo-nodes) ---
|
|
1142
|
+
allNodes.forEach(node => {
|
|
1068
1143
|
const pos = nodePositions[node.id];
|
|
1069
1144
|
if (!pos) return;
|
|
1070
1145
|
const isSelected = selectedNode === node.id;
|
|
@@ -1094,6 +1169,11 @@ function renderGraph() {
|
|
|
1094
1169
|
const hw = pos.w / 2, hh = pos.h / 2;
|
|
1095
1170
|
const d = 'M' + cx + ',' + (cy - hh) + ' Q' + (cx + hw * 0.6) + ',' + (cy - hh * 0.4) + ' ' + (cx + hw) + ',' + cy + ' Q' + (cx + hw * 0.6) + ',' + (cy + hh * 0.4) + ' ' + cx + ',' + (cy + hh) + ' Q' + (cx - hw * 0.6) + ',' + (cy + hh * 0.4) + ' ' + (cx - hw) + ',' + cy + ' Q' + (cx - hw * 0.6) + ',' + (cy - hh * 0.4) + ' ' + cx + ',' + (cy - hh) + ' Z';
|
|
1096
1171
|
s += '<path class="node-shape" d="' + d + '" fill="' + colors.bg + '" stroke="' + colors.main + '" stroke-width="' + (isSelected ? 2.5 : 1) + '" data-glow="' + glowFilter + '"/>';
|
|
1172
|
+
} else if (node.type === 'store') {
|
|
1173
|
+
// Cylinder shape for memory stores
|
|
1174
|
+
const cw = pos.w, ch = pos.h, ry = 8;
|
|
1175
|
+
s += '<path class="node-shape" d="M' + x + ',' + (y + ry) + ' A' + (cw/2) + ',' + ry + ' 0 0,1 ' + (x + cw) + ',' + (y + ry) + ' V' + (y + ch - ry) + ' A' + (cw/2) + ',' + ry + ' 0 0,1 ' + x + ',' + (y + ch - ry) + ' Z" fill="' + colors.bg + '" stroke="' + colors.main + '" stroke-width="' + (isSelected ? 2.5 : 1) + '" data-glow="' + glowFilter + '"/>';
|
|
1176
|
+
s += '<ellipse cx="' + (x + cw/2) + '" cy="' + (y + ry) + '" rx="' + (cw/2) + '" ry="' + ry + '" fill="' + colors.bg + '" stroke="' + colors.main + '" stroke-width="' + (isSelected ? 2.5 : 1) + '"/>';
|
|
1097
1177
|
} else {
|
|
1098
1178
|
s += '<rect class="node-shape" x="' + x + '" y="' + y + '" width="' + pos.w + '" height="' + pos.h + '" rx="12" fill="' + colors.bg + '" stroke="' + colors.main + '" stroke-width="' + (isSelected ? 2.5 : 1) + '" ' + strokeDash + ' ' + dimOpacity + ' data-glow="' + glowFilter + '"/>';
|
|
1099
1179
|
}
|
|
@@ -1110,6 +1190,8 @@ function renderGraph() {
|
|
|
1110
1190
|
s += '<text class="node-sublabel" x="' + pos.x + '" y="' + (labelY + 13) + '">' + esc(node.kind) + '</text>';
|
|
1111
1191
|
} else if (node.type === 'gate') {
|
|
1112
1192
|
s += '<text class="node-sublabel" x="' + pos.x + '" y="' + (labelY + 11) + '">gate</text>';
|
|
1193
|
+
} else if (node.type === 'store') {
|
|
1194
|
+
s += '<text class="node-sublabel" x="' + pos.x + '" y="' + (labelY + 13) + '">' + esc(node.storeType || 'store') + '</text>';
|
|
1113
1195
|
}
|
|
1114
1196
|
|
|
1115
1197
|
const badgeY = y - 2;
|
|
@@ -1223,6 +1305,9 @@ function renderLegend() {
|
|
|
1223
1305
|
h += '<div class="legend-row"><div class="legend-swatch" style="background:rgba(251,146,60,.10);border:1px solid rgba(251,146,60,.25);clip-path:polygon(50% 0%,100% 50%,50% 100%,0% 50%);border-radius:0"></div><span class="legend-label">Gate</span></div>';
|
|
1224
1306
|
h += '<div class="legend-row"><div class="legend-swatch" style="background:rgba(251,191,36,.10);border:1px solid rgba(251,191,36,.25);border-radius:3px"></div><span class="legend-label">Orchestrator</span></div>';
|
|
1225
1307
|
h += '<div class="legend-row"><div class="legend-swatch" style="background:rgba(34,211,238,.08);border:1px solid rgba(34,211,238,.35);border-radius:8px"></div><span class="legend-label">Trigger</span></div>';
|
|
1308
|
+
if (data.stores && data.stores.length > 0) {
|
|
1309
|
+
h += '<div class="legend-row"><div class="legend-swatch" style="background:rgba(20,184,166,.10);border:1px solid rgba(20,184,166,.25);border-radius:50%"></div><span class="legend-label">Memory Store</span></div>';
|
|
1310
|
+
}
|
|
1226
1311
|
h += '<div class="legend-section-title" style="margin-top:8px">Badges</div>';
|
|
1227
1312
|
h += '<div class="legend-row"><div class="legend-badge" style="background:rgba(34,211,238,.15);border:1px solid rgba(34,211,238,.35);color:#22d3ee;font-size:8px">\\u26A1</div><span class="legend-label">Has Hooks</span></div>';
|
|
1228
1313
|
h += '<div class="legend-row"><div class="legend-badge" style="background:rgba(251,191,36,.15);border:1px solid rgba(251,191,36,.35);color:#fbbf24;font-size:7px;font-weight:700">A</div><span class="legend-label">Advisory</span></div>';
|
|
@@ -1232,6 +1317,9 @@ function renderLegend() {
|
|
|
1232
1317
|
h += '<div class="legend-row"><div class="legend-line dashed" style="border-color:#5858a0"></div><span class="legend-label">Conditional</span></div>';
|
|
1233
1318
|
h += '<div class="legend-row"><div class="legend-line dashed" style="border-color:#f87171"></div><span class="legend-label">Failure</span></div>';
|
|
1234
1319
|
h += '<div class="legend-row"><div class="legend-line dashed" style="border-color:#fb923c"></div><span class="legend-label">Loop (max N)</span></div>';
|
|
1320
|
+
if (data.stores && data.stores.length > 0) {
|
|
1321
|
+
h += '<div class="legend-row"><div class="legend-line dashed" style="border-color:#14b8a6"></div><span class="legend-label">Memory</span></div>';
|
|
1322
|
+
}
|
|
1235
1323
|
if (dataFlowEnabled) {
|
|
1236
1324
|
h += '<div class="legend-section-title" style="margin-top:8px">Data Flow</div>';
|
|
1237
1325
|
h += '<div class="legend-row"><div class="legend-line" style="border-color:#f59e0b"></div><span class="legend-label">Active</span></div>';
|
|
@@ -1381,6 +1469,52 @@ graphContainer.addEventListener('wheel', e => {
|
|
|
1381
1469
|
applyTransform();
|
|
1382
1470
|
}, { passive: false });
|
|
1383
1471
|
|
|
1472
|
+
// --- Touch Pan & Pinch-to-Zoom ---
|
|
1473
|
+
var touchState = { panning: false, pinching: false, startX: 0, startY: 0, initDist: 0, initScale: 1 };
|
|
1474
|
+
function getTouchDist(t1, t2) {
|
|
1475
|
+
var dx = t1.clientX - t2.clientX, dy = t1.clientY - t2.clientY;
|
|
1476
|
+
return Math.sqrt(dx * dx + dy * dy);
|
|
1477
|
+
}
|
|
1478
|
+
graphContainer.addEventListener('touchstart', function(e) {
|
|
1479
|
+
if (e.touches.length === 1) {
|
|
1480
|
+
if (e.target.closest('.node-group') || e.target.closest('.zoom-btn')) return;
|
|
1481
|
+
touchState.panning = true;
|
|
1482
|
+
touchState.startX = e.touches[0].clientX - transform.x;
|
|
1483
|
+
touchState.startY = e.touches[0].clientY - transform.y;
|
|
1484
|
+
graphContainer.classList.add('dragging');
|
|
1485
|
+
} else if (e.touches.length === 2) {
|
|
1486
|
+
touchState.panning = false;
|
|
1487
|
+
touchState.pinching = true;
|
|
1488
|
+
touchState.initDist = getTouchDist(e.touches[0], e.touches[1]);
|
|
1489
|
+
touchState.initScale = transform.scale;
|
|
1490
|
+
}
|
|
1491
|
+
}, { passive: true });
|
|
1492
|
+
graphContainer.addEventListener('touchmove', function(e) {
|
|
1493
|
+
if (touchState.panning && e.touches.length === 1) {
|
|
1494
|
+
e.preventDefault();
|
|
1495
|
+
transform.x = e.touches[0].clientX - touchState.startX;
|
|
1496
|
+
transform.y = e.touches[0].clientY - touchState.startY;
|
|
1497
|
+
applyTransform();
|
|
1498
|
+
} else if (touchState.pinching && e.touches.length === 2) {
|
|
1499
|
+
e.preventDefault();
|
|
1500
|
+
var dist = getTouchDist(e.touches[0], e.touches[1]);
|
|
1501
|
+
var scale = touchState.initScale * (dist / touchState.initDist);
|
|
1502
|
+
var newScale = Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, scale));
|
|
1503
|
+
var r = graphContainer.getBoundingClientRect();
|
|
1504
|
+
var mx = (e.touches[0].clientX + e.touches[1].clientX) / 2 - r.left;
|
|
1505
|
+
var my = (e.touches[0].clientY + e.touches[1].clientY) / 2 - r.top;
|
|
1506
|
+
var ratio = newScale / transform.scale;
|
|
1507
|
+
transform.x = mx - ratio * (mx - transform.x);
|
|
1508
|
+
transform.y = my - ratio * (my - transform.y);
|
|
1509
|
+
transform.scale = newScale;
|
|
1510
|
+
applyTransform();
|
|
1511
|
+
}
|
|
1512
|
+
}, { passive: false });
|
|
1513
|
+
graphContainer.addEventListener('touchend', function(e) {
|
|
1514
|
+
if (e.touches.length < 2) touchState.pinching = false;
|
|
1515
|
+
if (e.touches.length === 0) { touchState.panning = false; graphContainer.classList.remove('dragging'); }
|
|
1516
|
+
}, { passive: true });
|
|
1517
|
+
|
|
1384
1518
|
function applyTransform() {
|
|
1385
1519
|
const g = document.getElementById('graph-transform');
|
|
1386
1520
|
if (g) g.setAttribute('transform', 'translate(' + transform.x + ',' + transform.y + ') scale(' + transform.scale + ')');
|
|
@@ -1434,7 +1568,13 @@ document.querySelectorAll('.tab').forEach(tab => {
|
|
|
1434
1568
|
function switchTab(tabName) {
|
|
1435
1569
|
document.querySelectorAll('.tab').forEach(t => t.classList.toggle('active', t.dataset.tab === tabName));
|
|
1436
1570
|
const panel = document.getElementById('side-panel');
|
|
1437
|
-
|
|
1571
|
+
var isMobile = window.innerWidth <= 768;
|
|
1572
|
+
if (panel.classList.contains('collapsed') && !(isMobile && !selectedNode)) {
|
|
1573
|
+
panel.classList.remove('collapsed');
|
|
1574
|
+
showMobileBackdrop(true);
|
|
1575
|
+
var pb = document.getElementById('panel-btn');
|
|
1576
|
+
if (pb) pb.innerHTML = '◀ Panel';
|
|
1577
|
+
}
|
|
1438
1578
|
switch (tabName) {
|
|
1439
1579
|
case 'inspect': showInspectPanel(); break;
|
|
1440
1580
|
case 'memory': showMemoryPanel(); break;
|
|
@@ -1634,14 +1774,57 @@ function renderMiniGraph(nodeId) {
|
|
|
1634
1774
|
|
|
1635
1775
|
function showMemoryPanel() {
|
|
1636
1776
|
const mem = data.memory;
|
|
1637
|
-
|
|
1777
|
+
const stores = data.stores;
|
|
1778
|
+
const retrievals = data.retrievals;
|
|
1779
|
+
const hasLegacyMem = mem && Object.keys(mem).length > 0;
|
|
1780
|
+
const hasStores = stores && stores.length > 0;
|
|
1781
|
+
const hasRetrievals = retrievals && retrievals.length > 0;
|
|
1782
|
+
if (!hasLegacyMem && !hasStores && !hasRetrievals) { setTabContent(emptyMsg('No memory config')); return; }
|
|
1638
1783
|
let h = '';
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1784
|
+
if (hasLegacyMem) {
|
|
1785
|
+
Object.entries(mem).forEach(function(entry) {
|
|
1786
|
+
const key = entry[0], val = entry[1];
|
|
1787
|
+
h += '<div class="panel-section"><div class="panel-title">' + esc(key) + '</div>';
|
|
1788
|
+
h += '<div class="panel-card"><div class="panel-card-desc" style="font-family:var(--font-mono);font-size:10px;word-break:break-all">' + esc(JSON.stringify(val, null, 2)) + '</div></div>';
|
|
1789
|
+
h += '</div>';
|
|
1790
|
+
});
|
|
1791
|
+
}
|
|
1792
|
+
if (hasStores) {
|
|
1793
|
+
h += '<div class="panel-section"><div class="panel-title">Memory Stores</div>';
|
|
1794
|
+
stores.forEach(function(store) {
|
|
1795
|
+
h += '<div class="panel-card">';
|
|
1796
|
+
h += '<div class="panel-card-title" style="color:#14b8a6">' + esc(store.id) + '</div>';
|
|
1797
|
+
h += '<div class="panel-card-desc">';
|
|
1798
|
+
h += '<span class="panel-tag">' + esc(store.type) + '</span>';
|
|
1799
|
+
h += '<span class="panel-tag">' + esc(store.backend) + '</span>';
|
|
1800
|
+
if (store.scope) h += '<span class="panel-tag">scope: ' + esc(store.scope) + '</span>';
|
|
1801
|
+
if (store.isolation) h += '<span class="panel-tag">isolation: ' + esc(store.isolation) + '</span>';
|
|
1802
|
+
h += '</div>';
|
|
1803
|
+
if (store.description) h += '<div class="panel-card-desc" style="margin-top:4px">' + esc(store.description) + '</div>';
|
|
1804
|
+
if (store.embedding) {
|
|
1805
|
+
h += '<div style="margin-top:6px;font-size:10px;color:var(--t2)">Embedding: ';
|
|
1806
|
+
if (store.embedding.provider) h += esc(store.embedding.provider);
|
|
1807
|
+
if (store.embedding.model) h += ' / ' + esc(store.embedding.model);
|
|
1808
|
+
if (store.embedding.dimensions) h += ' (' + store.embedding.dimensions + 'd)';
|
|
1809
|
+
h += '</div>';
|
|
1810
|
+
}
|
|
1811
|
+
h += '</div>';
|
|
1812
|
+
});
|
|
1643
1813
|
h += '</div>';
|
|
1644
|
-
}
|
|
1814
|
+
}
|
|
1815
|
+
if (hasRetrievals) {
|
|
1816
|
+
h += '<div class="panel-section"><div class="panel-title">Retrieval Strategies</div>';
|
|
1817
|
+
retrievals.forEach(function(ret) {
|
|
1818
|
+
h += '<div class="panel-card">';
|
|
1819
|
+
h += '<div class="panel-card-title" style="color:#14b8a6">' + esc(ret.id) + '</div>';
|
|
1820
|
+
h += '<div class="panel-card-desc">';
|
|
1821
|
+
if (ret.sources) h += 'Sources: ' + ret.sources.map(function(s) { return '<span class="panel-tag">' + esc(s) + '</span>'; }).join(' ');
|
|
1822
|
+
if (ret.budget) h += '<br/>Budget: ' + ret.budget + ' tokens';
|
|
1823
|
+
if (ret.paths) h += '<br/>Paths: ' + ret.paths.map(function(p) { return '<span class="panel-tag">' + esc(p) + '</span>'; }).join(' ');
|
|
1824
|
+
h += '</div></div>';
|
|
1825
|
+
});
|
|
1826
|
+
h += '</div>';
|
|
1827
|
+
}
|
|
1645
1828
|
setTabContent(h);
|
|
1646
1829
|
}
|
|
1647
1830
|
|
|
@@ -1817,11 +2000,24 @@ function showSettingsPanel() {
|
|
|
1817
2000
|
}
|
|
1818
2001
|
|
|
1819
2002
|
// --- Toggle Panel & Orientation ---
|
|
2003
|
+
function showMobileBackdrop(show) {
|
|
2004
|
+
var backdrop = document.getElementById('mobile-backdrop');
|
|
2005
|
+
if (backdrop && window.innerWidth <= 768) backdrop.classList.toggle('visible', show);
|
|
2006
|
+
}
|
|
1820
2007
|
function togglePanel() {
|
|
1821
2008
|
const panel = document.getElementById('side-panel');
|
|
1822
2009
|
panel.classList.toggle('collapsed');
|
|
1823
2010
|
const btn = document.getElementById('panel-btn');
|
|
1824
2011
|
btn.innerHTML = panel.classList.contains('collapsed') ? 'Panel ▶' : '◀ Panel';
|
|
2012
|
+
showMobileBackdrop(!panel.classList.contains('collapsed'));
|
|
2013
|
+
setTimeout(zoomFit, 250);
|
|
2014
|
+
}
|
|
2015
|
+
function closePanel() {
|
|
2016
|
+
const panel = document.getElementById('side-panel');
|
|
2017
|
+
if (panel) panel.classList.add('collapsed');
|
|
2018
|
+
const btn = document.getElementById('panel-btn');
|
|
2019
|
+
if (btn) btn.innerHTML = 'Panel ▶';
|
|
2020
|
+
showMobileBackdrop(false);
|
|
1825
2021
|
setTimeout(zoomFit, 250);
|
|
1826
2022
|
}
|
|
1827
2023
|
function toggleOrientation() {
|
|
@@ -1898,7 +2094,7 @@ function exportSvg() {
|
|
|
1898
2094
|
const clone = svg.cloneNode(true);
|
|
1899
2095
|
// Add inline styles for standalone SVG
|
|
1900
2096
|
const styleEl = document.createElementNS('http://www.w3.org/2000/svg', 'style');
|
|
1901
|
-
styleEl.textContent = 'text{font-family:-apple-system,BlinkMacSystemFont,\\'Segoe UI\\',sans-serif}.node-label{font-weight:600;font-size:12px}.node-sublabel{font-size:8.5px}.edge-path{fill:none;stroke-width:1.5}.edge-path.unconditional{stroke:rgba(255,255,255,.15)}.edge-path.conditional{stroke:#5858a0;stroke-dasharray:6 4}.edge-path.failure{stroke:#f87171;stroke-dasharray:6 4}.edge-path.loop{stroke:#fb923c;stroke-dasharray:4 4}';
|
|
2097
|
+
styleEl.textContent = 'text{font-family:-apple-system,BlinkMacSystemFont,\\'Segoe UI\\',sans-serif}.node-label{font-weight:600;font-size:12px}.node-sublabel{font-size:8.5px}.edge-path{fill:none;stroke-width:1.5}.edge-path.unconditional{stroke:rgba(255,255,255,.15)}.edge-path.conditional{stroke:#5858a0;stroke-dasharray:6 4}.edge-path.failure{stroke:#f87171;stroke-dasharray:6 4}.edge-path.loop{stroke:#fb923c;stroke-dasharray:4 4}.edge-path.memory{stroke:#14b8a6;stroke-dasharray:4 4;opacity:.6}';
|
|
1902
2098
|
clone.insertBefore(styleEl, clone.firstChild);
|
|
1903
2099
|
clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
|
|
1904
2100
|
const blob = new Blob([clone.outerHTML], { type: 'image/svg+xml' });
|
|
@@ -1962,6 +2158,7 @@ function toggleIssuesPanel() {
|
|
|
1962
2158
|
issuesPanelOpen = !issuesPanelOpen;
|
|
1963
2159
|
const panel = document.getElementById('issues-panel');
|
|
1964
2160
|
if (panel) panel.classList.toggle('collapsed', !issuesPanelOpen);
|
|
2161
|
+
showMobileBackdrop(issuesPanelOpen);
|
|
1965
2162
|
}
|
|
1966
2163
|
|
|
1967
2164
|
// ═══════════════════════════════════════════════════════════════
|
|
@@ -1971,6 +2168,45 @@ function toggleIssuesPanel() {
|
|
|
1971
2168
|
window.addEventListener('resize', () => { if (data) zoomFit(); });
|
|
1972
2169
|
loadData(DEFAULT_DATA);
|
|
1973
2170
|
initIssuesPanel();
|
|
2171
|
+
|
|
2172
|
+
// --- Mobile menu ---
|
|
2173
|
+
function toggleMobileMenu() {
|
|
2174
|
+
var actions = document.getElementById('header-actions');
|
|
2175
|
+
if (actions) actions.classList.toggle('open');
|
|
2176
|
+
}
|
|
2177
|
+
function closeMobileOverlays() {
|
|
2178
|
+
var actions = document.getElementById('header-actions');
|
|
2179
|
+
if (actions) actions.classList.remove('open');
|
|
2180
|
+
var backdrop = document.getElementById('mobile-backdrop');
|
|
2181
|
+
if (backdrop) backdrop.classList.remove('visible');
|
|
2182
|
+
var panel = document.getElementById('side-panel');
|
|
2183
|
+
if (panel && !panel.classList.contains('collapsed')) {
|
|
2184
|
+
panel.classList.add('collapsed');
|
|
2185
|
+
var btn = document.getElementById('panel-btn');
|
|
2186
|
+
if (btn) btn.innerHTML = 'Panel ▶';
|
|
2187
|
+
}
|
|
2188
|
+
var ip = document.getElementById('issues-panel');
|
|
2189
|
+
if (ip && !ip.classList.contains('collapsed')) {
|
|
2190
|
+
ip.classList.add('collapsed');
|
|
2191
|
+
issuesPanelOpen = false;
|
|
2192
|
+
}
|
|
2193
|
+
}
|
|
2194
|
+
|
|
2195
|
+
// --- Legend toggle for small screens ---
|
|
2196
|
+
if (window.innerWidth <= 480) {
|
|
2197
|
+
var zc = document.getElementById('zoom-controls');
|
|
2198
|
+
if (zc) {
|
|
2199
|
+
var lb = document.createElement('button');
|
|
2200
|
+
lb.className = 'zoom-btn';
|
|
2201
|
+
lb.title = 'Toggle Legend';
|
|
2202
|
+
lb.textContent = 'L';
|
|
2203
|
+
lb.onclick = function() {
|
|
2204
|
+
var leg = document.getElementById('legend');
|
|
2205
|
+
if (leg) leg.classList.toggle('visible');
|
|
2206
|
+
};
|
|
2207
|
+
zc.appendChild(lb);
|
|
2208
|
+
}
|
|
2209
|
+
}
|
|
1974
2210
|
`;
|
|
1975
2211
|
// ---------------------------------------------------------------------------
|
|
1976
2212
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/visualizer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/visualizer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAY1C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,8EAA8E;AAC9E,yDAAyD;AACzD,8EAA8E;AAE9E,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtD,MAAM,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;AAE9C,SAAS,YAAY;IACnB,4EAA4E;IAC5E,IAAI,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;QACjC,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;QAClE,OAAO,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;IAC3E,CAAC;IAED,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC;QAChF,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC;QAC1E,IAAI,CAAC,aAAa,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC;QACpE,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC;QACtE,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC;QAC5E,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC;KACrE,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,WAAW;QACb,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;AAEjC,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAgB;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1C,OAAO,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAC5D,CAAC;AAED,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAE9E,uDAAuD;AACvD,SAAS,aAAa,CAAC,GAAgB;IACrC,MAAM,KAAK,GAA0B,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE;QAChE,MAAM,IAAI,GAAwB,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7E,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,MAAM,CAAC,GAAG,CAAqB,CAAC;gBAChC,IAAI,CAAC,CAAC,KAAK;oBAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;gBAClC,IAAI,CAAC,CAAC,SAAS;oBAAE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;gBAC9C,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;oBAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;gBAChE,IAAI,CAAC,CAAC,OAAO;oBAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;gBACxC,MAAM;YACR,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,CAAC,GAAG,CAAc,CAAC;gBACzB,IAAI,CAAC,CAAC,KAAK;oBAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;gBAClC,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI;oBAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;gBAC1C,IAAI,CAAC,CAAC,WAAW;oBAAE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;gBACpD,IAAI,CAAC,CAAC,KAAK;oBAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;gBAClC,IAAI,CAAC,CAAC,MAAM;oBAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;gBACrC,IAAI,CAAC,CAAC,KAAK;oBAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;gBAClC,IAAI,CAAC,CAAC,MAAM;oBAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;gBACrC,IAAI,CAAC,CAAC,OAAO;oBAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;gBACxC,IAAI,CAAC,CAAC,IAAI;oBAAE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC/B,IAAI,CAAC,CAAC,WAAW;oBAAE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;gBACpD,IAAI,CAAC,CAAC,UAAU;oBAAE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;gBACjD,IAAI,CAAC,CAAC,QAAQ;oBAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;gBAC3C,IAAI,CAAC,CAAC,IAAI;oBAAE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC/B,IAAI,CAAC,CAAC,SAAS;oBAAE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;gBAC9C,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI;oBAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;gBAC1C,IAAI,CAAC,CAAC,UAAU;oBAAE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;gBACjD,IAAI,CAAC,CAAC,UAAU;oBAAE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;gBACjD,IAAI,CAAC,CAAC,KAAK;oBAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;gBAClC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;gBACxD,IAAI,CAAC,CAAC,eAAe;oBAAE,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC;gBAChE,IAAI,CAAC,CAAC,MAAM;oBAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;gBACrC,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI;oBAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;gBACnD,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI;oBAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;gBAChD,IAAI,CAAC,CAAC,aAAa;oBAAE,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC;gBAC1D,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;oBAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;gBAC5D,IAAI,CAAC,CAAC,SAAS;oBAAE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;gBAC9C,MAAM;YACR,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,CAAC,GAAG,CAAa,CAAC;gBACxB,IAAI,CAAC,CAAC,KAAK;oBAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;gBAClC,IAAI,CAAC,CAAC,MAAM;oBAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;gBACrC,IAAI,CAAC,CAAC,GAAG;oBAAE,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;gBAC5B,IAAI,CAAC,CAAC,MAAM;oBAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;gBACrC,IAAI,CAAC,CAAC,MAAM;oBAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;gBACrC,IAAI,CAAC,CAAC,QAAQ;oBAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;gBAC3C,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI;oBAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;gBAC1C,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,GAAG,GAAG,CAAe,CAAC;gBAC5B,IAAI,GAAG,CAAC,IAAI;oBAAE,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;gBACnC,IAAI,GAAG,CAAC,WAAW;oBAAE,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;gBACxD,IAAI,GAAG,CAAC,MAAM;oBAAE,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;gBACzC,IAAI,GAAG,CAAC,QAAQ;oBAAE,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;gBAC/C,MAAM;YACR,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,CAAC,GAAG,CAAc,CAAC;gBACzB,IAAI,CAAC,CAAC,WAAW;oBAAE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;gBACpD,IAAI,CAAC,CAAC,OAAO;oBAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;gBACxC,IAAI,CAAC,CAAC,SAAS;oBAAE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;gBAC9C,MAAM;YACR,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClC,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,aAAa,EAAE,CAAC,CAAC,aAAa;KAC/B,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,QAAQ,EAAE;YACR,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI;YACvB,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO;YAC7B,WAAW,EAAE,GAAG,CAAC,QAAQ,CAAC,WAAW;YACrC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ;YAC/B,WAAW,EAAE,GAAG,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE;YAC3C,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE;SACtC;QACD,KAAK;QACL,KAAK;QACL,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,IAAI,EAAE,EAAE;KACT,CAAC;AACJ,CAAC;AACD,sDAAsD;AAEtD,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,SAAS,SAAS,CAAC,QAAgB,EAAE,KAAa,EAAE,UAAkB;IACpE,OAAO;;;;;SAKA,OAAO,CAAC,KAAK,CAAC;;;;;EAKrB,GAAG;;;;SAII,GAAG,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBA8FD,QAAQ;4BACH,UAAU;EACpC,EAAE;;;QAGI,CAAC;AACT,CAAC;AAED,SAAS,OAAO,CAAC,CAAS;IACxB,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsOX,CAAC;AAEF,8EAA8E;AAC9E,8CAA8C;AAC9C,8EAA8E;AAE9E,MAAM,EAAE,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6lDV,CAAC;AAEF,8EAA8E"}
|