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.
Files changed (61) hide show
  1. package/README.md +70 -33
  2. package/dist/analyzer/index.d.ts +1 -0
  3. package/dist/analyzer/index.d.ts.map +1 -1
  4. package/dist/analyzer/index.js +35 -0
  5. package/dist/analyzer/index.js.map +1 -1
  6. package/dist/bindings/claude-code.d.ts.map +1 -1
  7. package/dist/bindings/claude-code.js +283 -2
  8. package/dist/bindings/claude-code.js.map +1 -1
  9. package/dist/bindings/openclaw.d.ts.map +1 -1
  10. package/dist/bindings/openclaw.js +390 -12
  11. package/dist/bindings/openclaw.js.map +1 -1
  12. package/dist/cli/index.js +2 -2
  13. package/dist/cli/index.js.map +1 -1
  14. package/dist/docs/__tests__/docs.test.js +2 -1
  15. package/dist/docs/__tests__/docs.test.js.map +1 -1
  16. package/dist/docs/content.d.ts.map +1 -1
  17. package/dist/docs/content.js +730 -4
  18. package/dist/docs/content.js.map +1 -1
  19. package/dist/exporters/markdown.d.ts.map +1 -1
  20. package/dist/exporters/markdown.js +165 -0
  21. package/dist/exporters/markdown.js.map +1 -1
  22. package/dist/exporters/mermaid.d.ts.map +1 -1
  23. package/dist/exporters/mermaid.js +30 -0
  24. package/dist/exporters/mermaid.js.map +1 -1
  25. package/dist/import/__tests__/import.test.js +554 -0
  26. package/dist/import/__tests__/import.test.js.map +1 -1
  27. package/dist/import/claude-code.d.ts.map +1 -1
  28. package/dist/import/claude-code.js +2 -0
  29. package/dist/import/claude-code.js.map +1 -1
  30. package/dist/import/index.d.ts +1 -0
  31. package/dist/import/index.d.ts.map +1 -1
  32. package/dist/import/index.js +7 -1
  33. package/dist/import/index.js.map +1 -1
  34. package/dist/import/openclaw.d.ts +70 -0
  35. package/dist/import/openclaw.d.ts.map +1 -0
  36. package/dist/import/openclaw.js +1060 -0
  37. package/dist/import/openclaw.js.map +1 -0
  38. package/dist/import/serializer.d.ts.map +1 -1
  39. package/dist/import/serializer.js +171 -4
  40. package/dist/import/serializer.js.map +1 -1
  41. package/dist/parser/__tests__/parser.test.js +463 -0
  42. package/dist/parser/__tests__/parser.test.js.map +1 -1
  43. package/dist/parser/ast.d.ts +122 -0
  44. package/dist/parser/ast.d.ts.map +1 -1
  45. package/dist/parser/index.d.ts +14 -2
  46. package/dist/parser/index.d.ts.map +1 -1
  47. package/dist/parser/index.js +226 -5
  48. package/dist/parser/index.js.map +1 -1
  49. package/dist/parser/validator.d.ts +1 -1
  50. package/dist/parser/validator.d.ts.map +1 -1
  51. package/dist/parser/validator.js +214 -1
  52. package/dist/parser/validator.js.map +1 -1
  53. package/dist/visualizer/index.d.ts.map +1 -1
  54. package/dist/visualizer/index.js +263 -27
  55. package/dist/visualizer/index.js.map +1 -1
  56. package/examples/memory-system.at +162 -0
  57. package/examples/script-agent-pipeline.at +65 -0
  58. package/package.json +1 -1
  59. package/spec/grammar.md +345 -10
  60. package/spec/reserved-keywords.md +25 -1
  61. package/spec/validation.md +171 -2
@@ -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
- <div class="topo-desc" id="topo-desc"></div>
251
- <div class="pattern-badges" id="pattern-badges"></div>
252
- <input type="text" id="search-input" class="search-input" placeholder="Search nodes..." oninput="onSearchInput(this.value)" />
253
- <button class="header-btn" id="dataflow-btn" onclick="toggleDataFlow()">Data Flow</button>
254
- <button class="header-btn" id="orientation-btn" onclick="toggleOrientation()" title="Switch between vertical and horizontal layout">&#8596; Horizontal</button>
255
- <button class="header-btn" onclick="exportSvg()">Export SVG</button>
256
- <button class="header-btn" id="issues-btn" onclick="toggleIssuesPanel()" style="display:none">Issues <span id="issues-badge" class="issues-badge">0</span></button>
257
- <button class="header-btn" onclick="openLoadModal()">Load JSON</button>
258
- <button class="header-btn" id="panel-btn" onclick="togglePanel()">Panel &#9654;</button>
256
+ <button id="mobile-menu-btn" onclick="toggleMobileMenu()">&#9776;</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">&#8596; 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 &#9654;</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()">&times;</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
- nodePositions = layoutNodes(data.nodes, data.edges);
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
- data.nodes.forEach(n => nodeMap[n.id] = n);
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
- data.edges.forEach(edge => {
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
- data.edges.forEach(edge => {
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 (isLoop) { edgeClass = 'loop'; markerEnd = 'url(#arrow-loop)'; }
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
- data.nodes.forEach(node => {
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
- if (panel.classList.contains('collapsed')) panel.classList.remove('collapsed');
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 = '&#9664; 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
- if (!mem || Object.keys(mem).length === 0) { setTabContent(emptyMsg('No memory config')); return; }
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
- Object.entries(mem).forEach(function(entry) {
1640
- const key = entry[0], val = entry[1];
1641
- h += '<div class="panel-section"><div class="panel-title">' + esc(key) + '</div>';
1642
- 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>';
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 &#9654;' : '&#9664; 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 &#9654;';
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 &#9654;';
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":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAm6CV,CAAC;AAEF,8EAA8E"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/visualizer/index.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6lDV,CAAC;AAEF,8EAA8E"}