@memberjunction/ng-core-entity-forms 5.10.1 → 5.12.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/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.js +2 -2
- package/dist/lib/custom/AIAgents/add-action-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +8 -0
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js +199 -139
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +6 -6
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +6 -6
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +2 -2
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +2 -2
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +4 -4
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +2 -2
- package/dist/lib/custom/Actions/action-execution-log-form.component.js +4 -4
- package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.js +22 -22
- package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.d.ts +11 -0
- package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.js +244 -217
- package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
- package/dist/lib/custom/EntityActions/entityaction.form.component.js +2 -2
- package/dist/lib/custom/Lists/list-form.component.js +3 -3
- package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-category-dialog.component.js +3 -3
- package/dist/lib/custom/Queries/query-category-dialog.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.d.ts +25 -2
- package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.js +299 -139
- package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-run-dialog.component.js +3 -3
- package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
- package/dist/lib/custom/Templates/template-param-dialog.component.js +107 -111
- package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
- package/dist/lib/custom/Templates/template-params-grid.component.js +2 -2
- package/dist/lib/custom/Templates/templates-form.component.js +40 -43
- package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/entity-link-pill.component.js +2 -2
- package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.js +2 -2
- package/dist/lib/custom/Tests/test-rubric-form.component.js +2 -2
- package/dist/lib/custom/Tests/test-rubric-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-feedback-form.component.js +2 -2
- package/dist/lib/custom/Tests/test-run-feedback-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.js +2 -2
- package/dist/lib/custom/Tests/test-suite-form.component.js +2 -2
- package/dist/lib/custom/Tests/test-suite-run-form.component.js +2 -2
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +2 -2
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +2 -2
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js +2 -2
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +2 -2
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts +1 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js +28 -18
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +2 -2
- package/dist/lib/custom/custom-forms.module.d.ts +2 -1
- package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
- package/dist/lib/custom/custom-forms.module.js +7 -3
- package/dist/lib/custom/custom-forms.module.js.map +1 -1
- package/dist/lib/custom/shared/entity-selector-dialog.component.js +2 -2
- package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +155 -153
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.js +105 -0
- package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentRequest/mjaiagentrequest.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRequest/mjaiagentrequest.form.component.js +31 -7
- package/dist/lib/generated/Entities/MJAIAgentRequest/mjaiagentrequest.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRequestType/mjaiagentrequesttype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAIAgentRequestType/mjaiagentrequesttype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentRequestType/mjaiagentrequesttype.form.component.js +89 -0
- package/dist/lib/generated/Entities/MJAIAgentRequestType/mjaiagentrequesttype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +50 -14
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js +22 -4
- package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentType/mjaiagenttype.form.component.js +13 -11
- package/dist/lib/generated/Entities/MJAIAgentType/mjaiagenttype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js +83 -81
- package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJIntegration/mjintegration.form.component.js +35 -33
- package/dist/lib/generated/Entities/MJIntegration/mjintegration.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.js +25 -19
- package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.js +87 -49
- package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJQueryDependency/mjquerydependency.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJQueryDependency/mjquerydependency.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJQueryDependency/mjquerydependency.form.component.js +69 -0
- package/dist/lib/generated/Entities/MJQueryDependency/mjquerydependency.form.component.js.map +1 -0
- package/dist/lib/generated/generated-forms.module.d.ts +289 -286
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
- package/dist/lib/generated/generated-forms.module.js +113 -104
- package/dist/lib/generated/generated-forms.module.js.map +1 -1
- package/dist/lib/shared/components/template-editor.component.js +85 -89
- package/dist/lib/shared/components/template-editor.component.js.map +1 -1
- package/package.json +31 -31
|
@@ -328,7 +328,7 @@ export class AIAgentRunVisualizationComponent {
|
|
|
328
328
|
marker.setAttribute('orient', 'auto');
|
|
329
329
|
const polygon = document.createElementNS('http://www.w3.org/2000/svg', 'polygon');
|
|
330
330
|
polygon.setAttribute('points', '0 0, 10 3.5, 0 7');
|
|
331
|
-
polygon.setAttribute('
|
|
331
|
+
polygon.setAttribute('class', 'arrowhead-polygon');
|
|
332
332
|
marker.appendChild(polygon);
|
|
333
333
|
defs.appendChild(marker);
|
|
334
334
|
svg.appendChild(defs);
|
|
@@ -460,6 +460,7 @@ export class AIAgentRunVisualizationComponent {
|
|
|
460
460
|
const g = document.createElementNS('http://www.w3.org/2000/svg', 'g');
|
|
461
461
|
g.setAttribute('class', 'step-node');
|
|
462
462
|
g.setAttribute('data-step-id', step.ID);
|
|
463
|
+
g.setAttribute('data-type', this.getStepDataType(step.StepType));
|
|
463
464
|
// Add event handlers
|
|
464
465
|
g.addEventListener('click', (e) => this.onNodeClick(e, step));
|
|
465
466
|
g.addEventListener('mousedown', (e) => this.onNodeMouseDown(e, step.ID));
|
|
@@ -471,7 +472,7 @@ export class AIAgentRunVisualizationComponent {
|
|
|
471
472
|
rect.setAttribute('width', nodeWidth.toString());
|
|
472
473
|
rect.setAttribute('height', nodeHeight.toString());
|
|
473
474
|
rect.setAttribute('rx', '8');
|
|
474
|
-
rect.setAttribute('
|
|
475
|
+
rect.setAttribute('class', 'node-bg');
|
|
475
476
|
rect.setAttribute('stroke', this.getStepColor(step));
|
|
476
477
|
rect.setAttribute('stroke-width', '2');
|
|
477
478
|
g.appendChild(rect);
|
|
@@ -496,7 +497,7 @@ export class AIAgentRunVisualizationComponent {
|
|
|
496
497
|
title.setAttribute('y', '20');
|
|
497
498
|
title.setAttribute('font-size', '14');
|
|
498
499
|
title.setAttribute('font-weight', '600');
|
|
499
|
-
title.setAttribute('
|
|
500
|
+
title.setAttribute('class', 'node-title');
|
|
500
501
|
title.textContent = this.truncateText(step.StepName || `Step ${step.StepNumber}`, 15);
|
|
501
502
|
g.appendChild(title);
|
|
502
503
|
// Step type
|
|
@@ -504,7 +505,7 @@ export class AIAgentRunVisualizationComponent {
|
|
|
504
505
|
type.setAttribute('x', '12');
|
|
505
506
|
type.setAttribute('y', '40');
|
|
506
507
|
type.setAttribute('font-size', '12');
|
|
507
|
-
type.setAttribute('
|
|
508
|
+
type.setAttribute('class', 'node-subtitle');
|
|
508
509
|
type.textContent = step.StepType;
|
|
509
510
|
g.appendChild(type);
|
|
510
511
|
// Model info for prompts
|
|
@@ -515,7 +516,7 @@ export class AIAgentRunVisualizationComponent {
|
|
|
515
516
|
model.setAttribute('x', '12');
|
|
516
517
|
model.setAttribute('y', '55');
|
|
517
518
|
model.setAttribute('font-size', '11');
|
|
518
|
-
model.setAttribute('
|
|
519
|
+
model.setAttribute('class', 'node-meta');
|
|
519
520
|
model.textContent = `${promptRun.Model || 'Unknown'}`;
|
|
520
521
|
g.appendChild(model);
|
|
521
522
|
}
|
|
@@ -527,7 +528,7 @@ export class AIAgentRunVisualizationComponent {
|
|
|
527
528
|
durationText.setAttribute('x', '12');
|
|
528
529
|
durationText.setAttribute('y', '70');
|
|
529
530
|
durationText.setAttribute('font-size', '11');
|
|
530
|
-
durationText.setAttribute('
|
|
531
|
+
durationText.setAttribute('class', 'node-meta');
|
|
531
532
|
durationText.textContent = `⏱️ ${duration}`;
|
|
532
533
|
g.appendChild(durationText);
|
|
533
534
|
}
|
|
@@ -545,8 +546,7 @@ export class AIAgentRunVisualizationComponent {
|
|
|
545
546
|
bg.setAttribute('width', scopeWidth.toString());
|
|
546
547
|
bg.setAttribute('height', scopeHeight.toString());
|
|
547
548
|
bg.setAttribute('rx', '12');
|
|
548
|
-
bg.setAttribute('
|
|
549
|
-
bg.setAttribute('stroke', '#4a90e2');
|
|
549
|
+
bg.setAttribute('class', 'scope-bg');
|
|
550
550
|
bg.setAttribute('stroke-width', '2');
|
|
551
551
|
bg.setAttribute('stroke-dasharray', '5,5');
|
|
552
552
|
g.appendChild(bg);
|
|
@@ -555,14 +555,14 @@ export class AIAgentRunVisualizationComponent {
|
|
|
555
555
|
headerBg.setAttribute('width', scopeWidth.toString());
|
|
556
556
|
headerBg.setAttribute('height', headerHeight.toString());
|
|
557
557
|
headerBg.setAttribute('rx', '12');
|
|
558
|
-
headerBg.setAttribute('
|
|
558
|
+
headerBg.setAttribute('class', 'scope-header');
|
|
559
559
|
g.appendChild(headerBg);
|
|
560
560
|
// Fix bottom corners
|
|
561
561
|
const headerFix = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
|
|
562
562
|
headerFix.setAttribute('y', (headerHeight - 12).toString());
|
|
563
563
|
headerFix.setAttribute('width', scopeWidth.toString());
|
|
564
564
|
headerFix.setAttribute('height', '12');
|
|
565
|
-
headerFix.setAttribute('
|
|
565
|
+
headerFix.setAttribute('class', 'scope-header');
|
|
566
566
|
g.appendChild(headerFix);
|
|
567
567
|
// Robot icon
|
|
568
568
|
const icon = document.createElementNS('http://www.w3.org/2000/svg', 'text');
|
|
@@ -577,7 +577,7 @@ export class AIAgentRunVisualizationComponent {
|
|
|
577
577
|
title.setAttribute('y', '26');
|
|
578
578
|
title.setAttribute('font-size', '14');
|
|
579
579
|
title.setAttribute('font-weight', '600');
|
|
580
|
-
title.setAttribute('
|
|
580
|
+
title.setAttribute('class', 'scope-title');
|
|
581
581
|
title.textContent = subRun?.Agent || 'Sub-Agent';
|
|
582
582
|
g.appendChild(title);
|
|
583
583
|
// Expand/collapse button
|
|
@@ -589,15 +589,14 @@ export class AIAgentRunVisualizationComponent {
|
|
|
589
589
|
expandBg.setAttribute('cx', '10');
|
|
590
590
|
expandBg.setAttribute('cy', '10');
|
|
591
591
|
expandBg.setAttribute('r', '10');
|
|
592
|
-
expandBg.setAttribute('
|
|
593
|
-
expandBg.setAttribute('stroke', '#4a90e2');
|
|
592
|
+
expandBg.setAttribute('class', 'expand-bg');
|
|
594
593
|
expandBtn.appendChild(expandBg);
|
|
595
594
|
const expandIcon = document.createElementNS('http://www.w3.org/2000/svg', 'text');
|
|
596
595
|
expandIcon.setAttribute('x', '10');
|
|
597
596
|
expandIcon.setAttribute('y', '15');
|
|
598
597
|
expandIcon.setAttribute('text-anchor', 'middle');
|
|
599
598
|
expandIcon.setAttribute('font-size', '12');
|
|
600
|
-
expandIcon.setAttribute('
|
|
599
|
+
expandIcon.setAttribute('class', 'expand-icon');
|
|
601
600
|
expandIcon.textContent = '+';
|
|
602
601
|
expandBtn.appendChild(expandIcon);
|
|
603
602
|
expandBtn.addEventListener('click', (e) => this.onScopeExpandClick(e, step.ID));
|
|
@@ -698,10 +697,9 @@ export class AIAgentRunVisualizationComponent {
|
|
|
698
697
|
const d = `M ${fromX} ${fromY} L ${toX} ${toY}`;
|
|
699
698
|
path.setAttribute('d', d);
|
|
700
699
|
path.setAttribute('fill', 'none');
|
|
701
|
-
path.setAttribute('
|
|
700
|
+
path.setAttribute('class', 'connection-line');
|
|
702
701
|
path.setAttribute('stroke-width', '2');
|
|
703
702
|
path.setAttribute('marker-end', 'url(#arrowhead-viz)');
|
|
704
|
-
path.setAttribute('opacity', '0.6');
|
|
705
703
|
connectionsGroup.appendChild(path);
|
|
706
704
|
conn.path = path;
|
|
707
705
|
}
|
|
@@ -749,6 +747,18 @@ export class AIAgentRunVisualizationComponent {
|
|
|
749
747
|
};
|
|
750
748
|
return colorMap[status] || '#9e9e9e';
|
|
751
749
|
}
|
|
750
|
+
getStepDataType(stepType) {
|
|
751
|
+
const typeMap = {
|
|
752
|
+
'Prompt': 'prompt',
|
|
753
|
+
'Actions': 'action',
|
|
754
|
+
'Sub-Agent': 'subagent',
|
|
755
|
+
'Tool': 'tool',
|
|
756
|
+
'Decision': 'decision',
|
|
757
|
+
'ForEach': 'foreach',
|
|
758
|
+
'While': 'while'
|
|
759
|
+
};
|
|
760
|
+
return typeMap[stepType] || 'default';
|
|
761
|
+
}
|
|
752
762
|
truncateText(text, maxLength) {
|
|
753
763
|
if (text.length <= maxLength)
|
|
754
764
|
return text;
|
|
@@ -1006,11 +1016,11 @@ export class AIAgentRunVisualizationComponent {
|
|
|
1006
1016
|
} if (rf & 2) {
|
|
1007
1017
|
i0.ɵɵadvance();
|
|
1008
1018
|
i0.ɵɵconditional(ctx.error ? 1 : 2);
|
|
1009
|
-
} }, dependencies: [i1.SplitterComponent, i1.SplitterPaneComponent, i2.AIAgentRunStepDetailComponent], styles: [".visualization-container[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n position: relative;\n background:
|
|
1019
|
+
} }, dependencies: [i1.SplitterComponent, i1.SplitterPaneComponent, i2.AIAgentRunStepDetailComponent], styles: [".visualization-container[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n position: relative;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n overflow: hidden;\n}\n\n.loading-state[_ngcontent-%COMP%], .error-state[_ngcontent-%COMP%], .empty-state[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n gap: 0.5rem;\n color: var(--mj-text-muted);\n}\n\n.error-state[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.empty-state[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 1rem;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 2rem;\n opacity: 0.5;\n}\n\n.loading-overlay[_ngcontent-%COMP%] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n align-items: center;\n gap: 0.5rem;\n background: color-mix(in srgb, var(--mj-bg-surface) 90%, transparent);\n padding: 1rem 2rem;\n border-radius: 4px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n z-index: 10;\n}\n\n.diagram-container[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n position: relative;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n}\n\n.diagram-toolbar[_ngcontent-%COMP%] {\n position: absolute;\n top: 10px;\n right: 10px;\n left: 10px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: var(--mj-bg-surface);\n padding: 8px 12px;\n border-radius: 4px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n z-index: 10;\n}\n\n.toolbar-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.zoom-controls[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n align-items: center;\n}\n\n.zoom-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 3px;\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n transition: all 0.2s;\n}\n\n.zoom-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-brand-primary);\n}\n\n.zoom-level[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n margin-left: 8px;\n font-family: monospace;\n}\n\n.visualization-svg[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n cursor: grab;\n}\n\n.visualization-svg[_ngcontent-%COMP%]:active {\n cursor: grabbing;\n}\n\n\n\n[_nghost-%COMP%] .step-node {\n cursor: pointer;\n}\n\n[_nghost-%COMP%] .step-node.dragging {\n opacity: 0.8;\n cursor: move;\n}\n\n[_nghost-%COMP%] .step-node rect {\n filter: drop-shadow(0 2px 4px rgba(0,0,0,0.1));\n}\n\n[_nghost-%COMP%] .step-node:hover rect {\n filter: drop-shadow(0 4px 8px rgba(0,0,0,0.15));\n}\n\n\n\n[_nghost-%COMP%] .node-bg {\n fill: var(--mj-bg-surface-card);\n}\n\n[_nghost-%COMP%] .node-title {\n fill: var(--mj-text-primary);\n}\n\n[_nghost-%COMP%] .node-subtitle {\n fill: var(--mj-text-secondary);\n}\n\n[_nghost-%COMP%] .node-meta {\n fill: var(--mj-text-muted);\n}\n\n[_nghost-%COMP%] .connection-line {\n stroke: var(--mj-text-secondary);\n opacity: 0.5;\n}\n\n[_nghost-%COMP%] .arrowhead-polygon {\n fill: var(--mj-text-secondary);\n}\n\n[_nghost-%COMP%] .scope-bg {\n fill: var(--mj-bg-surface-sunken);\n stroke: var(--mj-brand-primary);\n}\n\n[_nghost-%COMP%] .scope-header {\n fill: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n}\n\n[_nghost-%COMP%] .scope-title {\n fill: var(--mj-brand-primary);\n}\n\n[_nghost-%COMP%] .expand-button .expand-bg {\n fill: var(--mj-bg-surface-card);\n stroke: var(--mj-brand-primary);\n}\n\n[_nghost-%COMP%] .expand-button .expand-icon {\n fill: var(--mj-brand-primary);\n}\n\n[_nghost-%COMP%] .scope-container {\n cursor: pointer;\n}\n\n[_nghost-%COMP%] .scope-container rect {\n filter: drop-shadow(0 2px 4px rgba(0,0,0,0.1));\n}\n\n[_nghost-%COMP%] .expand-button:hover circle {\n fill: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n}\n\n[_nghost-%COMP%] .connections-group path {\n transition: stroke-width 0.2s;\n}\n\n[_nghost-%COMP%] .connections-group path:hover {\n stroke-width: 3;\n}\n\n\n\n[_nghost-%COMP%] .k-splitter {\n border: none;\n}\n\n[_nghost-%COMP%] .k-splitter-pane {\n overflow: visible;\n}\n\n[_nghost-%COMP%] .k-splitbar {\n background: var(--mj-border-default);\n width: 4px;\n}\n\n[_nghost-%COMP%] .k-splitbar:hover {\n background: var(--mj-border-strong);\n}\n\n[_nghost-%COMP%] .k-splitbar-draggable-horizontal {\n cursor: col-resize;\n}\n\n\n\n[_nghost-%COMP%] .step-node[data-type=\"prompt\"] rect {\n fill: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n}\n\n[_nghost-%COMP%] .step-node[data-type=\"action\"] rect {\n fill: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n}\n\n[_nghost-%COMP%] .step-node[data-type=\"subagent\"] rect {\n fill: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n}\n\n[_nghost-%COMP%] .step-node[data-type=\"tool\"] rect {\n fill: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n}\n\n[_nghost-%COMP%] .step-node[data-type=\"decision\"] rect {\n fill: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n}"], changeDetection: 0 }); }
|
|
1010
1020
|
}
|
|
1011
1021
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AIAgentRunVisualizationComponent, [{
|
|
1012
1022
|
type: Component,
|
|
1013
|
-
args: [{ standalone: false, selector: 'mj-ai-agent-run-visualization', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"visualization-container\">\n @if (error) {\n <div class=\"error-state\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>{{ error }}</span>\n </div>\n } @else {\n <kendo-splitter orientation=\"horizontal\" style=\"height: 100%;\">\n <!-- Diagram Pane -->\n <kendo-splitter-pane [collapsible]=\"false\">\n <div class=\"diagram-container\" #svgContainer>\n <div class=\"diagram-toolbar\">\n <div class=\"toolbar-title\">\n <i class=\"fa-solid fa-diagram-project\"></i>\n Agent Execution Flow\n </div>\n <div class=\"zoom-controls\">\n <button (click)=\"zoomIn()\" title=\"Zoom in\">\n <i class=\"fa-solid fa-search-plus\"></i>\n </button>\n <button (click)=\"zoomOut()\" title=\"Zoom out\">\n <i class=\"fa-solid fa-search-minus\"></i>\n </button>\n <button (click)=\"resetZoom()\" title=\"Reset zoom\">\n <i class=\"fa-solid fa-compress\"></i>\n </button>\n <span class=\"zoom-level\">{{ (panZoom.scale * 100).toFixed(0) }}%</span>\n </div>\n </div>\n @if (loading) {\n <div class=\"loading-overlay\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading visualization...</span>\n </div>\n }\n </div>\n </kendo-splitter-pane>\n \n <!-- Detail Pane -->\n @if (selectedItem) {\n <kendo-splitter-pane [size]=\"'400px'\" [min]=\"'300px'\" [max]=\"'600px'\" [collapsible]=\"true\">\n <mj-ai-agent-run-step-detail\n [selectedTimelineItem]=\"selectedItem\"\n (closePanel)=\"closeDetailPane()\"\n (navigateToActionLog)=\"navigateToActionLog($event)\"\n (copyToClipboard)=\"copyToClipboard($event)\">\n </mj-ai-agent-run-step-detail>\n </kendo-splitter-pane>\n }\n </kendo-splitter>\n }\n</div>", styles: [".visualization-container {\n width: 100%;\n height: 100%;\n position: relative;\n background:
|
|
1023
|
+
args: [{ standalone: false, selector: 'mj-ai-agent-run-visualization', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"visualization-container\">\n @if (error) {\n <div class=\"error-state\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>{{ error }}</span>\n </div>\n } @else {\n <kendo-splitter orientation=\"horizontal\" style=\"height: 100%;\">\n <!-- Diagram Pane -->\n <kendo-splitter-pane [collapsible]=\"false\">\n <div class=\"diagram-container\" #svgContainer>\n <div class=\"diagram-toolbar\">\n <div class=\"toolbar-title\">\n <i class=\"fa-solid fa-diagram-project\"></i>\n Agent Execution Flow\n </div>\n <div class=\"zoom-controls\">\n <button (click)=\"zoomIn()\" title=\"Zoom in\">\n <i class=\"fa-solid fa-search-plus\"></i>\n </button>\n <button (click)=\"zoomOut()\" title=\"Zoom out\">\n <i class=\"fa-solid fa-search-minus\"></i>\n </button>\n <button (click)=\"resetZoom()\" title=\"Reset zoom\">\n <i class=\"fa-solid fa-compress\"></i>\n </button>\n <span class=\"zoom-level\">{{ (panZoom.scale * 100).toFixed(0) }}%</span>\n </div>\n </div>\n @if (loading) {\n <div class=\"loading-overlay\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading visualization...</span>\n </div>\n }\n </div>\n </kendo-splitter-pane>\n \n <!-- Detail Pane -->\n @if (selectedItem) {\n <kendo-splitter-pane [size]=\"'400px'\" [min]=\"'300px'\" [max]=\"'600px'\" [collapsible]=\"true\">\n <mj-ai-agent-run-step-detail\n [selectedTimelineItem]=\"selectedItem\"\n (closePanel)=\"closeDetailPane()\"\n (navigateToActionLog)=\"navigateToActionLog($event)\"\n (copyToClipboard)=\"copyToClipboard($event)\">\n </mj-ai-agent-run-step-detail>\n </kendo-splitter-pane>\n }\n </kendo-splitter>\n }\n</div>", styles: [".visualization-container {\n width: 100%;\n height: 100%;\n position: relative;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n overflow: hidden;\n}\n\n.loading-state, .error-state, .empty-state {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n gap: 0.5rem;\n color: var(--mj-text-muted);\n}\n\n.error-state {\n color: var(--mj-status-error);\n}\n\n.empty-state {\n flex-direction: column;\n gap: 1rem;\n}\n\n.empty-state i {\n font-size: 2rem;\n opacity: 0.5;\n}\n\n.loading-overlay {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n align-items: center;\n gap: 0.5rem;\n background: color-mix(in srgb, var(--mj-bg-surface) 90%, transparent);\n padding: 1rem 2rem;\n border-radius: 4px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n z-index: 10;\n}\n\n.diagram-container {\n width: 100%;\n height: 100%;\n position: relative;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n}\n\n.diagram-toolbar {\n position: absolute;\n top: 10px;\n right: 10px;\n left: 10px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: var(--mj-bg-surface);\n padding: 8px 12px;\n border-radius: 4px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n z-index: 10;\n}\n\n.toolbar-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.zoom-controls {\n display: flex;\n gap: 4px;\n align-items: center;\n}\n\n.zoom-controls button {\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 3px;\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n transition: all 0.2s;\n}\n\n.zoom-controls button:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-brand-primary);\n}\n\n.zoom-level {\n font-size: 12px;\n color: var(--mj-text-muted);\n margin-left: 8px;\n font-family: monospace;\n}\n\n.visualization-svg {\n width: 100%;\n height: 100%;\n cursor: grab;\n}\n\n.visualization-svg:active {\n cursor: grabbing;\n}\n\n/* SVG Styles */\n:host ::ng-deep .step-node {\n cursor: pointer;\n}\n\n:host ::ng-deep .step-node.dragging {\n opacity: 0.8;\n cursor: move;\n}\n\n:host ::ng-deep .step-node rect {\n filter: drop-shadow(0 2px 4px rgba(0,0,0,0.1));\n}\n\n:host ::ng-deep .step-node:hover rect {\n filter: drop-shadow(0 4px 8px rgba(0,0,0,0.15));\n}\n\n/* SVG structural colors \u2014 adapt to light/dark theme via CSS classes */\n:host ::ng-deep .node-bg {\n fill: var(--mj-bg-surface-card);\n}\n\n:host ::ng-deep .node-title {\n fill: var(--mj-text-primary);\n}\n\n:host ::ng-deep .node-subtitle {\n fill: var(--mj-text-secondary);\n}\n\n:host ::ng-deep .node-meta {\n fill: var(--mj-text-muted);\n}\n\n:host ::ng-deep .connection-line {\n stroke: var(--mj-text-secondary);\n opacity: 0.5;\n}\n\n:host ::ng-deep .arrowhead-polygon {\n fill: var(--mj-text-secondary);\n}\n\n:host ::ng-deep .scope-bg {\n fill: var(--mj-bg-surface-sunken);\n stroke: var(--mj-brand-primary);\n}\n\n:host ::ng-deep .scope-header {\n fill: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n}\n\n:host ::ng-deep .scope-title {\n fill: var(--mj-brand-primary);\n}\n\n:host ::ng-deep .expand-button .expand-bg {\n fill: var(--mj-bg-surface-card);\n stroke: var(--mj-brand-primary);\n}\n\n:host ::ng-deep .expand-button .expand-icon {\n fill: var(--mj-brand-primary);\n}\n\n:host ::ng-deep .scope-container {\n cursor: pointer;\n}\n\n:host ::ng-deep .scope-container rect {\n filter: drop-shadow(0 2px 4px rgba(0,0,0,0.1));\n}\n\n:host ::ng-deep .expand-button:hover circle {\n fill: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n}\n\n:host ::ng-deep .connections-group path {\n transition: stroke-width 0.2s;\n}\n\n:host ::ng-deep .connections-group path:hover {\n stroke-width: 3;\n}\n\n/* Splitter customization */\n:host ::ng-deep .k-splitter {\n border: none;\n}\n\n:host ::ng-deep .k-splitter-pane {\n overflow: visible;\n}\n\n:host ::ng-deep .k-splitbar {\n background: var(--mj-border-default);\n width: 4px;\n}\n\n:host ::ng-deep .k-splitbar:hover {\n background: var(--mj-border-strong);\n}\n\n:host ::ng-deep .k-splitbar-draggable-horizontal {\n cursor: col-resize;\n}\n\n/* Node type colors */\n:host ::ng-deep .step-node[data-type=\"prompt\"] rect {\n fill: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n}\n\n:host ::ng-deep .step-node[data-type=\"action\"] rect {\n fill: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n}\n\n:host ::ng-deep .step-node[data-type=\"subagent\"] rect {\n fill: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n}\n\n:host ::ng-deep .step-node[data-type=\"tool\"] rect {\n fill: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n}\n\n:host ::ng-deep .step-node[data-type=\"decision\"] rect {\n fill: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n}"] }]
|
|
1014
1024
|
}], () => [{ type: i0.ChangeDetectorRef }], { svgContainer: [{
|
|
1015
1025
|
type: ViewChild,
|
|
1016
1026
|
args: ['svgContainer', { static: false }]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-agent-run-visualization.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-visualization.component.ts","../../../../src/lib/custom/ai-agent-run/ai-agent-run-visualization.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnInit, OnDestroy, ViewChild, ElementRef, AfterViewInit, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { Subject, combineLatest } from 'rxjs';\nimport { takeUntil, take } from 'rxjs/operators';\nimport { MJAIAgentRunEntity, MJAIAgentRunStepEntity, MJActionExecutionLogEntity, MJAIPromptRunEntity } from '@memberjunction/core-entities';\nimport { TimelineItem } from './ai-agent-run-timeline.component';\nimport { AIAgentRunDataHelper } from './ai-agent-run-data.service';\nimport { UUIDsEqual } from '@memberjunction/global';\n\ninterface NodeData {\n step: MJAIAgentRunStepEntity;\n x: number;\n y: number;\n width: number;\n height: number;\n element?: SVGGElement;\n}\n\ninterface ScopeData {\n id: string;\n name: string;\n x: number;\n y: number;\n width: number;\n height: number;\n expanded: boolean;\n nodes: NodeData[];\n element?: SVGGElement;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-ai-agent-run-visualization',\n templateUrl: './ai-agent-run-visualization.component.html',\n styleUrls: ['./ai-agent-run-visualization.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AIAgentRunVisualizationComponent implements OnInit, OnDestroy, AfterViewInit {\n @ViewChild('svgContainer', { static: false }) svgContainer!: ElementRef<HTMLDivElement>;\n @Input() aiAgentRunId!: string;\n @Input() dataHelper!: AIAgentRunDataHelper;\n \n private destroy$ = new Subject<void>();\n private viewInitialized = false;\n \n /** Track active timeouts for cleanup */\n private activeTimeouts: number[] = [];\n \n /** Remove timeout from tracking array */\n private removeTimeoutFromTracking(timeoutId: number): void {\n const index = this.activeTimeouts.indexOf(timeoutId);\n if (index > -1) {\n this.activeTimeouts.splice(index, 1);\n }\n }\n private pendingData: { steps: MJAIAgentRunStepEntity[], subRuns: MJAIAgentRunEntity[], actionLogs: MJActionExecutionLogEntity[], promptRuns: MJAIPromptRunEntity[] } | null = null;\n \n loading = false; // Start with false so the container renders\n error: string | null = null;\n private dataLoading = false; // Track data loading state from service\n \n selectedItem: TimelineItem | null = null;\n \n // Node management\n private nodes = new Map<string, NodeData>();\n private scopes = new Map<string, ScopeData>();\n private connections: Array<{from: string, to: string, path?: SVGPathElement}> = [];\n \n // Pan and zoom state\n panZoom = {\n scale: 1,\n translateX: 0,\n translateY: 0,\n isPanning: false,\n startX: 0,\n startY: 0\n };\n \n // Drag state\n private dragState: {\n isDragging: boolean;\n element: SVGGElement | null;\n nodeId: string | null;\n startX: number;\n startY: number;\n startTransform: { x: number; y: number };\n initialX?: number;\n initialY?: number;\n } = {\n isDragging: false,\n element: null,\n nodeId: null,\n startX: 0,\n startY: 0,\n startTransform: { x: 0, y: 0 }\n };\n \n // Pan state\n private panState = {\n isPanning: false,\n startX: 0,\n startY: 0,\n initialTranslateX: 0,\n initialTranslateY: 0\n };\n \n // Animation frame ID for cleanup\n private animationFrameId: number | null = null;\n \n // Bound event handlers for proper cleanup\n private boundOnWheel = this.onWheel.bind(this);\n private boundOnSvgMouseDown = this.onSvgMouseDown.bind(this);\n private boundOnSvgMouseMove = this.onSvgMouseMove.bind(this);\n private boundOnSvgMouseUp = this.onSvgMouseUp.bind(this);\n \n constructor(\n private cdr: ChangeDetectorRef\n ) {}\n \n ngOnInit() {\n if (this.aiAgentRunId) {\n // Subscribe to data from helper\n combineLatest([\n this.dataHelper.steps$,\n this.dataHelper.subRuns$,\n this.dataHelper.actionLogs$,\n this.dataHelper.promptRuns$,\n this.dataHelper.loading$\n ]).pipe(\n takeUntil(this.destroy$)\n ).subscribe(([steps, subRuns, actionLogs, promptRuns, loading]) => {\n this.dataLoading = loading;\n \n if (!loading && steps && steps.length > 0) {\n console.log('Visualization: Received data from service', {\n steps: steps.length,\n subRuns: subRuns.length,\n viewInitialized: this.viewInitialized\n });\n \n if (this.viewInitialized && this.svgContainer?.nativeElement) {\n // View is ready, build immediately\n this.buildVisualization(steps, subRuns, actionLogs, promptRuns);\n } else {\n // Store data for when view is ready\n console.log('View not ready, storing data for later');\n this.pendingData = { steps, subRuns, actionLogs, promptRuns };\n }\n } else if (!loading && (!steps || steps.length === 0)) {\n console.log('Visualization: No steps available');\n this.error = null;\n }\n });\n \n // Subscribe to error state\n this.dataHelper.error$.pipe(takeUntil(this.destroy$)).subscribe((error: string | null) => {\n if (error) {\n this.error = error;\n this.loading = false;\n }\n });\n } else {\n console.error('Visualization: No agent run ID provided');\n this.error = 'No agent run ID provided';\n }\n }\n \n ngAfterViewInit() {\n console.log('Visualization ngAfterViewInit');\n this.viewInitialized = true;\n \n // Initialize SVG\n if (this.svgContainer && this.svgContainer.nativeElement) {\n this.initializeSVG();\n \n // If we have pending data, process it now\n if (this.pendingData) {\n console.log('Processing pending data after view init');\n this.buildVisualization(\n this.pendingData.steps,\n this.pendingData.subRuns,\n this.pendingData.actionLogs,\n this.pendingData.promptRuns\n );\n this.pendingData = null;\n }\n \n this.cdr.detectChanges();\n } else {\n console.error('SVG container not found in ngAfterViewInit');\n }\n }\n \n ngOnDestroy() {\n // Signal all subscriptions to complete\n this.destroy$.next();\n this.destroy$.complete();\n \n // Clear all active timeouts\n this.activeTimeouts.forEach(timeoutId => {\n clearTimeout(timeoutId);\n });\n this.activeTimeouts.length = 0;\n \n // Clean up document-level event listeners\n document.removeEventListener('mousemove', this.onMouseMove);\n document.removeEventListener('mouseup', this.onMouseUp);\n \n // Clean up SVG and all its event listeners\n if (this.svgContainer?.nativeElement) {\n const svg = this.svgContainer.nativeElement.querySelector('svg');\n if (svg) {\n // Remove all SVG event listeners with bound handlers\n svg.removeEventListener('wheel', this.boundOnWheel);\n svg.removeEventListener('mousedown', this.boundOnSvgMouseDown);\n svg.removeEventListener('mousemove', this.boundOnSvgMouseMove);\n svg.removeEventListener('mouseup', this.boundOnSvgMouseUp);\n \n // Remove all node and scope event listeners\n // We can't remove specific listeners if we don't have references to them\n // The best approach is to clone and replace the elements, which removes all listeners\n svg.querySelectorAll('g[id^=\"node-\"], g[id^=\"scope-\"]').forEach(element => {\n const clone = element.cloneNode(true);\n element.parentNode?.replaceChild(clone, element);\n });\n \n // Remove expand button listeners\n svg.querySelectorAll('.expand-button').forEach(button => {\n const clone = button.cloneNode(true);\n button.parentNode?.replaceChild(clone, button);\n });\n \n // Clear all SVG content\n while (svg.firstChild) {\n svg.removeChild(svg.firstChild);\n }\n }\n }\n \n // Clear data structures\n this.nodes.clear();\n this.scopes.clear();\n this.connections = [];\n \n // Clear any pending animation frames\n if (this.animationFrameId) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n \n // Reset state\n this.dragState = {\n isDragging: false,\n element: null,\n nodeId: null,\n startX: 0,\n startY: 0,\n startTransform: { x: 0, y: 0 }\n };\n \n this.panState = {\n isPanning: false,\n startX: 0,\n startY: 0,\n initialTranslateX: 0,\n initialTranslateY: 0\n };\n }\n \n private initializeSVG() {\n const container = this.svgContainer?.nativeElement;\n if (!container) {\n console.error('SVG container element not found');\n return;\n }\n \n // Create SVG element if it doesn't exist\n let svg = container.querySelector('svg');\n if (!svg) {\n svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('class', 'visualization-svg');\n svg.setAttribute('width', '100%');\n svg.setAttribute('height', '100%');\n \n // Add event listeners with bound handlers\n svg.addEventListener('wheel', this.boundOnWheel);\n svg.addEventListener('mousedown', this.boundOnSvgMouseDown);\n svg.addEventListener('mousemove', this.boundOnSvgMouseMove);\n svg.addEventListener('mouseup', this.boundOnSvgMouseUp);\n \n container.appendChild(svg);\n }\n \n // Add arrow marker definition\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n const marker = document.createElementNS('http://www.w3.org/2000/svg', 'marker');\n marker.setAttribute('id', 'arrowhead-viz');\n marker.setAttribute('markerWidth', '10');\n marker.setAttribute('markerHeight', '7');\n marker.setAttribute('refX', '9');\n marker.setAttribute('refY', '3.5');\n marker.setAttribute('orient', 'auto');\n \n const polygon = document.createElementNS('http://www.w3.org/2000/svg', 'polygon');\n polygon.setAttribute('points', '0 0, 10 3.5, 0 7');\n polygon.setAttribute('fill', '#4a90e2');\n marker.appendChild(polygon);\n defs.appendChild(marker);\n svg.appendChild(defs);\n \n console.log('SVG initialized successfully');\n }\n \n private async buildVisualization(\n steps: MJAIAgentRunStepEntity[],\n subRuns: MJAIAgentRunEntity[],\n actionLogs: MJActionExecutionLogEntity[],\n promptRuns: MJAIPromptRunEntity[]\n ) {\n console.log('buildVisualization called', { \n steps: steps?.length || 0, \n hasContainer: !!this.svgContainer,\n containerElement: this.svgContainer?.nativeElement\n });\n \n if (!this.svgContainer || !this.svgContainer.nativeElement) {\n console.error('SVG container not available');\n this.loading = false;\n this.error = 'Visualization container not ready';\n return;\n }\n \n // If no steps, show empty state\n if (!steps || steps.length === 0) {\n console.log('No steps to visualize');\n this.loading = false;\n this.error = null;\n return;\n }\n \n this.loading = true;\n this.error = null;\n \n try {\n // Wait a tick for the view to be fully ready\n await new Promise(resolve => {\n const timeoutId = setTimeout(() => {\n this.removeTimeoutFromTracking(timeoutId);\n resolve(undefined);\n }, 0) as any as number;\n this.activeTimeouts.push(timeoutId);\n });\n \n // Clear existing elements\n this.clearVisualization();\n \n // Build nodes and scopes\n await this.buildNodesAndScopes(steps, subRuns, promptRuns);\n \n // Arrange layout\n this.arrangeLayout();\n \n // Draw connections\n this.drawConnections();\n \n // Fit to view\n this.fitToView();\n \n this.loading = false;\n console.log('Visualization built successfully');\n \n // Trigger change detection since we're using OnPush\n this.cdr.markForCheck();\n } catch (error) {\n this.error = 'Failed to build visualization';\n console.error('Visualization error:', error);\n this.loading = false;\n \n // Trigger change detection since we're using OnPush\n this.cdr.markForCheck();\n }\n }\n \n private clearVisualization() {\n const svg = this.svgContainer?.nativeElement?.querySelector('svg');\n if (!svg) return;\n \n const mainGroup = svg.querySelector('.main-group');\n if (mainGroup) {\n // Remove all child elements except defs\n while (mainGroup.firstChild) {\n mainGroup.removeChild(mainGroup.firstChild);\n }\n }\n \n this.nodes.clear();\n this.scopes.clear();\n this.connections = [];\n }\n \n private async buildNodesAndScopes(\n steps: MJAIAgentRunStepEntity[],\n subRuns: MJAIAgentRunEntity[],\n promptRuns: MJAIPromptRunEntity[]\n ) {\n const svg = this.svgContainer?.nativeElement?.querySelector('svg');\n if (!svg) return;\n \n let mainGroup = svg.querySelector('.main-group') as SVGGElement;\n if (!mainGroup) {\n mainGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n mainGroup.setAttribute('class', 'main-group');\n svg.appendChild(mainGroup);\n }\n \n // Create nodes for each step\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i];\n \n if (step.StepType === 'Sub-Agent' && step.TargetLogID) {\n // Create a scope for sub-agent\n const subRun = subRuns.find(sr => UUIDsEqual(sr.ID, step.TargetLogID));\n const scopeElement = await this.createScopeElement(step, subRun);\n mainGroup.appendChild(scopeElement);\n \n const scope: ScopeData = {\n id: step.ID,\n name: subRun?.Agent || 'Sub-Agent',\n x: 0,\n y: 0,\n width: 300,\n height: 200,\n expanded: false,\n nodes: [],\n element: scopeElement\n };\n \n this.scopes.set(step.ID, scope);\n } else {\n // Create regular node\n const nodeElement = this.createNodeElement(step, promptRuns);\n mainGroup.appendChild(nodeElement);\n \n const nodeData: NodeData = {\n step: step,\n x: 0,\n y: 0,\n width: 180,\n height: 80,\n element: nodeElement\n };\n \n this.nodes.set(step.ID, nodeData);\n }\n \n // Add connection info\n if (i > 0) {\n this.connections.push({\n from: steps[i - 1].ID,\n to: step.ID\n });\n }\n }\n }\n \n private createNodeElement(step: MJAIAgentRunStepEntity, promptRuns: MJAIPromptRunEntity[]): SVGGElement {\n const g = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n g.setAttribute('class', 'step-node');\n g.setAttribute('data-step-id', step.ID);\n \n // Add event handlers\n g.addEventListener('click', (e) => this.onNodeClick(e, step));\n g.addEventListener('mousedown', (e) => this.onNodeMouseDown(e, step.ID));\n g.style.cursor = 'pointer';\n \n const nodeWidth = 180;\n const nodeHeight = 80;\n \n // Background rectangle\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n rect.setAttribute('width', nodeWidth.toString());\n rect.setAttribute('height', nodeHeight.toString());\n rect.setAttribute('rx', '8');\n rect.setAttribute('fill', 'white');\n rect.setAttribute('stroke', this.getStepColor(step));\n rect.setAttribute('stroke-width', '2');\n g.appendChild(rect);\n \n // Status indicator\n const statusCircle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n statusCircle.setAttribute('cx', '12');\n statusCircle.setAttribute('cy', '12');\n statusCircle.setAttribute('r', '6');\n statusCircle.setAttribute('fill', this.getStatusColor(step.Status));\n g.appendChild(statusCircle);\n \n // Icon\n const icon = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n icon.setAttribute('x', '35');\n icon.setAttribute('y', '20');\n icon.setAttribute('font-size', '18');\n icon.setAttribute('fill', this.getStepColor(step));\n icon.textContent = this.getStepEmoji(step.StepType);\n g.appendChild(icon);\n \n // Title\n const title = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n title.setAttribute('x', '60');\n title.setAttribute('y', '20');\n title.setAttribute('font-size', '14');\n title.setAttribute('font-weight', '600');\n title.setAttribute('fill', '#2c3e50');\n title.textContent = this.truncateText(step.StepName || `Step ${step.StepNumber}`, 15);\n g.appendChild(title);\n \n // Step type\n const type = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n type.setAttribute('x', '12');\n type.setAttribute('y', '40');\n type.setAttribute('font-size', '12');\n type.setAttribute('fill', '#6c757d');\n type.textContent = step.StepType;\n g.appendChild(type);\n \n // Model info for prompts\n if (step.StepType === 'Prompt' && step.TargetLogID && promptRuns) {\n const promptRun = promptRuns.find(pr => UUIDsEqual(pr.ID, step.TargetLogID));\n if (promptRun) {\n const model = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n model.setAttribute('x', '12');\n model.setAttribute('y', '55');\n model.setAttribute('font-size', '11');\n model.setAttribute('fill', '#868e96');\n model.textContent = `${promptRun.Model || 'Unknown'}`;\n g.appendChild(model);\n }\n }\n \n // Duration\n if (step.CompletedAt) {\n const duration = this.calculateDuration(step.StartedAt, step.CompletedAt);\n const durationText = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n durationText.setAttribute('x', '12');\n durationText.setAttribute('y', '70');\n durationText.setAttribute('font-size', '11');\n durationText.setAttribute('fill', '#868e96');\n durationText.textContent = `⏱️ ${duration}`;\n g.appendChild(durationText);\n }\n \n return g;\n }\n \n private async createScopeElement(step: MJAIAgentRunStepEntity, subRun?: MJAIAgentRunEntity): Promise<SVGGElement> {\n const g = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n g.setAttribute('class', 'scope-container');\n g.setAttribute('data-scope-id', step.ID);\n \n const scopeWidth = 300;\n const scopeHeight = 200;\n const headerHeight = 40;\n \n // Background\n const bg = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n bg.setAttribute('width', scopeWidth.toString());\n bg.setAttribute('height', scopeHeight.toString());\n bg.setAttribute('rx', '12');\n bg.setAttribute('fill', '#f8f9fa');\n bg.setAttribute('stroke', '#4a90e2');\n bg.setAttribute('stroke-width', '2');\n bg.setAttribute('stroke-dasharray', '5,5');\n g.appendChild(bg);\n \n // Header background\n const headerBg = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n headerBg.setAttribute('width', scopeWidth.toString());\n headerBg.setAttribute('height', headerHeight.toString());\n headerBg.setAttribute('rx', '12');\n headerBg.setAttribute('fill', '#e3f2fd');\n g.appendChild(headerBg);\n \n // Fix bottom corners\n const headerFix = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n headerFix.setAttribute('y', (headerHeight - 12).toString());\n headerFix.setAttribute('width', scopeWidth.toString());\n headerFix.setAttribute('height', '12');\n headerFix.setAttribute('fill', '#e3f2fd');\n g.appendChild(headerFix);\n \n // Robot icon\n const icon = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n icon.setAttribute('x', '12');\n icon.setAttribute('y', '26');\n icon.setAttribute('font-size', '20');\n icon.textContent = '🤖';\n g.appendChild(icon);\n \n // Title\n const title = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n title.setAttribute('x', '40');\n title.setAttribute('y', '26');\n title.setAttribute('font-size', '14');\n title.setAttribute('font-weight', '600');\n title.setAttribute('fill', '#1976d2');\n title.textContent = subRun?.Agent || 'Sub-Agent';\n g.appendChild(title);\n \n // Expand/collapse button\n const expandBtn = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n expandBtn.setAttribute('class', 'expand-button');\n expandBtn.style.cursor = 'pointer';\n expandBtn.setAttribute('transform', `translate(${scopeWidth - 30}, 10)`);\n \n const expandBg = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n expandBg.setAttribute('cx', '10');\n expandBg.setAttribute('cy', '10');\n expandBg.setAttribute('r', '10');\n expandBg.setAttribute('fill', 'white');\n expandBg.setAttribute('stroke', '#4a90e2');\n expandBtn.appendChild(expandBg);\n \n const expandIcon = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n expandIcon.setAttribute('x', '10');\n expandIcon.setAttribute('y', '15');\n expandIcon.setAttribute('text-anchor', 'middle');\n expandIcon.setAttribute('font-size', '12');\n expandIcon.setAttribute('fill', '#4a90e2');\n expandIcon.textContent = '+';\n expandBtn.appendChild(expandIcon);\n \n expandBtn.addEventListener('click', (e) => this.onScopeExpandClick(e, step.ID));\n g.appendChild(expandBtn);\n \n // Click handler for scope\n g.addEventListener('click', (e) => {\n if (!(e.target as Element).closest('.expand-button')) {\n this.onNodeClick(e, step);\n }\n });\n \n return g;\n }\n \n private arrangeLayout() {\n const nodeSpacingX = 250;\n const nodeSpacingY = 120;\n const startX = 50;\n const startY = 50;\n \n let currentY = startY;\n let index = 0;\n \n // Arrange nodes and scopes sequentially\n const allItems = [...this.nodes.values(), ...Array.from(this.scopes.values()).map(s => ({ \n step: { ID: s.id } as MJAIAgentRunStepEntity, \n x: 0, \n y: 0, \n width: s.width, \n height: s.height \n }))];\n \n // Sort by step number if available\n allItems.sort((a, b) => {\n const aStep = a.step as MJAIAgentRunStepEntity;\n const bStep = b.step as MJAIAgentRunStepEntity;\n return (aStep.StepNumber || 0) - (bStep.StepNumber || 0);\n });\n \n for (const item of allItems) {\n const nodeData = this.nodes.get(item.step.ID);\n const scopeData = this.scopes.get(item.step.ID);\n \n if (nodeData) {\n nodeData.x = startX;\n nodeData.y = currentY;\n \n if (nodeData.element) {\n nodeData.element.setAttribute('transform', `translate(${nodeData.x}, ${nodeData.y})`);\n }\n \n currentY += nodeSpacingY;\n } else if (scopeData) {\n scopeData.x = startX;\n scopeData.y = currentY;\n \n if (scopeData.element) {\n scopeData.element.setAttribute('transform', `translate(${scopeData.x}, ${scopeData.y})`);\n }\n \n currentY += scopeData.height + nodeSpacingY;\n }\n }\n }\n \n private drawConnections() {\n const svg = this.svgContainer?.nativeElement?.querySelector('svg');\n if (!svg) return;\n \n const mainGroup = svg.querySelector('.main-group');\n if (!mainGroup) return;\n \n // Create connections group if not exists\n let connectionsGroup = mainGroup.querySelector('.connections-group') as SVGGElement;\n if (!connectionsGroup) {\n connectionsGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n connectionsGroup.setAttribute('class', 'connections-group');\n mainGroup.insertBefore(connectionsGroup, mainGroup.firstChild);\n }\n \n // Clear existing connections\n while (connectionsGroup.firstChild) {\n connectionsGroup.removeChild(connectionsGroup.firstChild);\n }\n \n // Draw each connection\n for (const conn of this.connections) {\n const fromNode = this.nodes.get(conn.from);\n const fromScope = this.scopes.get(conn.from);\n const toNode = this.nodes.get(conn.to);\n const toScope = this.scopes.get(conn.to);\n \n let fromX = 0, fromY = 0, toX = 0, toY = 0;\n \n if (fromNode) {\n fromX = fromNode.x + fromNode.width / 2;\n fromY = fromNode.y + fromNode.height;\n } else if (fromScope) {\n fromX = fromScope.x + fromScope.width / 2;\n fromY = fromScope.y + fromScope.height;\n }\n \n if (toNode) {\n toX = toNode.x + toNode.width / 2;\n toY = toNode.y;\n } else if (toScope) {\n toX = toScope.x + toScope.width / 2;\n toY = toScope.y;\n }\n \n if (fromX && fromY && toX && toY) {\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n const d = `M ${fromX} ${fromY} L ${toX} ${toY}`;\n path.setAttribute('d', d);\n path.setAttribute('fill', 'none');\n path.setAttribute('stroke', '#4a90e2');\n path.setAttribute('stroke-width', '2');\n path.setAttribute('marker-end', 'url(#arrowhead-viz)');\n path.setAttribute('opacity', '0.6');\n \n connectionsGroup.appendChild(path);\n conn.path = path;\n }\n }\n }\n \n private fitToView() {\n const svg = this.svgContainer?.nativeElement?.querySelector('svg') as SVGSVGElement;\n const mainGroup = svg?.querySelector('.main-group') as SVGGElement;\n if (!svg || !mainGroup) return;\n \n const bbox = mainGroup.getBBox();\n const padding = 50;\n \n const viewBox = `${bbox.x - padding} ${bbox.y - padding} ${bbox.width + 2 * padding} ${bbox.height + 2 * padding}`;\n svg.setAttribute('viewBox', viewBox);\n }\n \n private getStepColor(step: MJAIAgentRunStepEntity): string {\n const colorMap: Record<string, string> = {\n 'Prompt': '#2196f3',\n 'Actions': '#4caf50',\n 'Sub-Agent': '#ff9800',\n 'Tool': '#9c27b0',\n 'Decision': '#f44336'\n };\n return colorMap[step.StepType] || '#757575';\n }\n \n private getStepEmoji(stepType: string): string {\n const emojiMap: Record<string, string> = {\n 'Prompt': '💬',\n 'Actions': '⚙️',\n 'Sub-Agent': '🤖',\n 'Tool': '🔧',\n 'Decision': '🔀',\n 'ForEach': '🔁',\n 'While': '🔄'\n };\n return emojiMap[stepType] || '⚪';\n }\n \n private getStatusColor(status: string): string {\n const colorMap: Record<string, string> = {\n 'Running': '#1976d2',\n 'Completed': '#388e3c',\n 'Failed': '#d32f2f',\n 'Cancelled': '#f57c00',\n 'Paused': '#757575'\n };\n return colorMap[status] || '#9e9e9e';\n }\n \n private truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.substring(0, maxLength - 3) + '...';\n }\n \n private calculateDuration(start: Date, end?: Date | null): string {\n if (!end) return 'Running...';\n \n const ms = new Date(end).getTime() - new Date(start).getTime();\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3600000) return `${Math.floor(ms / 60000)}m ${Math.floor((ms % 60000) / 1000)}s`;\n return `${Math.floor(ms / 3600000)}h ${Math.floor((ms % 3600000) / 60000)}m`;\n }\n \n // Event handlers\n private onNodeClick(event: MouseEvent, step: MJAIAgentRunStepEntity) {\n event.stopPropagation();\n \n // Create timeline item from step\n const item: TimelineItem = {\n id: step.ID,\n type: 'step',\n title: step.StepName || `Step ${step.StepNumber}`,\n subtitle: `Type: ${step.StepType}`,\n status: step.Status,\n startTime: step.StartedAt,\n endTime: step.CompletedAt || undefined,\n duration: this.calculateDuration(step.StartedAt, step.CompletedAt),\n icon: this.getStepIcon(step.StepType),\n color: this.getStatusColorName(step.Status),\n data: step,\n level: 0\n };\n \n this.selectedItem = item;\n this.cdr.detectChanges();\n }\n \n private getStepIcon(stepType: string): string {\n const iconMap: Record<string, string> = {\n 'Prompt': 'fa-microchip',\n 'Tool': 'fa-tools',\n 'Sub-Agent': 'fa-robot',\n 'Decision': 'fa-code-branch',\n 'Actions': 'fa-cog',\n 'ForEach': 'fa-repeat',\n 'While': 'fa-rotate'\n };\n return iconMap[stepType] || 'fa-circle';\n }\n \n private getStatusColorName(status: string): string {\n const colorMap: Record<string, string> = {\n 'Running': 'info',\n 'Completed': 'success',\n 'Failed': 'error',\n 'Cancelled': 'warning',\n 'Paused': 'secondary'\n };\n return colorMap[status] || 'secondary';\n }\n \n private async onScopeExpandClick(event: MouseEvent, scopeId: string) {\n event.stopPropagation();\n \n const scope = this.scopes.get(scopeId);\n if (!scope) return;\n \n scope.expanded = !scope.expanded;\n \n if (scope.expanded) {\n // Load sub-agent steps\n await this.loadScopeContents(scopeId);\n }\n \n // Update UI\n this.updateScopeVisual(scope);\n this.arrangeLayout();\n this.drawConnections();\n }\n \n private async loadScopeContents(scopeId: string) {\n const scope = this.scopes.get(scopeId);\n if (!scope) return;\n \n // Find the step\n const step = Array.from(this.nodes.values()).find(n => UUIDsEqual(n.step.ID, scopeId))?.step\n || Array.from(this.scopes.values()).find(s => s.id === scopeId);\n \n if (!step || !(step as any).TargetLogID) return;\n \n const targetLogId = (step as any).TargetLogID;\n \n try {\n // Load sub-agent data through service\n const data = await this.dataHelper.loadSubAgentData(targetLogId);\n \n if (data.steps && data.steps.length > 0) {\n // Create nodes from data\n this.createScopeNodes(scope, data.steps, data.promptRuns);\n }\n } catch (error) {\n console.error('Failed to load scope contents:', error);\n }\n }\n \n private createScopeNodes(scope: ScopeData, steps: MJAIAgentRunStepEntity[], promptRuns: MJAIPromptRunEntity[]) {\n const svg = this.svgContainer?.nativeElement?.querySelector('svg');\n if (!svg) return;\n \n const mainGroup = svg.querySelector('.main-group');\n if (!mainGroup || !scope.element) return;\n \n // Create nodes inside scope\n const nodeSpacingY = 60;\n const startX = 20;\n const startY = 60;\n \n for (let i = 0; i < steps.length; i++) {\n const step = steps[i];\n const nodeElement = this.createNodeElement(step, promptRuns);\n \n // Add node to scope group\n scope.element.appendChild(nodeElement);\n \n const nodeData: NodeData = {\n step: step,\n x: startX,\n y: startY + i * nodeSpacingY,\n width: 160,\n height: 60,\n element: nodeElement\n };\n \n nodeElement.setAttribute('transform', `translate(${nodeData.x}, ${nodeData.y})`);\n \n scope.nodes.push(nodeData);\n this.nodes.set(step.ID, nodeData);\n }\n \n // Update scope height\n scope.height = Math.max(200, startY + steps.length * nodeSpacingY + 20);\n }\n \n private updateScopeVisual(scope: ScopeData) {\n if (!scope.element) return;\n \n // Update background height\n const bg = scope.element.querySelector('rect');\n if (bg) {\n bg.setAttribute('height', scope.height.toString());\n }\n \n // Update expand button\n const expandIcon = scope.element.querySelector('.expand-button text');\n if (expandIcon) {\n expandIcon.textContent = scope.expanded ? '−' : '+';\n }\n }\n \n // Drag handling\n private onNodeMouseDown(event: MouseEvent, nodeId: string) {\n event.preventDefault();\n event.stopPropagation();\n \n const node = this.nodes.get(nodeId);\n if (!node || !node.element) return;\n \n // Get current transform\n const transform = node.element.getAttribute('transform');\n const match = transform?.match(/translate\\(([-\\d.]+),\\s*([-\\d.]+)\\)/);\n if (!match) return;\n \n // Get SVG coordinates\n const svg = node.element.ownerSVGElement;\n if (!svg) return;\n \n const pt = svg.createSVGPoint();\n pt.x = event.clientX;\n pt.y = event.clientY;\n const svgP = pt.matrixTransform(svg.getScreenCTM()?.inverse());\n \n this.dragState = {\n isDragging: true,\n element: node.element,\n nodeId: nodeId,\n startX: svgP.x,\n startY: svgP.y,\n startTransform: {\n x: parseFloat(match[1]),\n y: parseFloat(match[2])\n }\n };\n \n node.element.classList.add('dragging');\n \n // Add document-level event listeners\n document.addEventListener('mousemove', this.onMouseMove);\n document.addEventListener('mouseup', this.onMouseUp);\n }\n \n private onMouseMove = (event: MouseEvent) => {\n if (!this.dragState.isDragging || !this.dragState.element) return;\n \n const svg = this.dragState.element.ownerSVGElement;\n if (!svg) return;\n \n const pt = svg.createSVGPoint();\n pt.x = event.clientX;\n pt.y = event.clientY;\n const svgP = pt.matrixTransform(svg.getScreenCTM()?.inverse());\n \n const dx = svgP.x - this.dragState.startX;\n const dy = svgP.y - this.dragState.startY;\n \n const newX = this.dragState.startTransform.x + dx;\n const newY = this.dragState.startTransform.y + dy;\n \n // Update element position\n this.dragState.element.setAttribute('transform', `translate(${newX}, ${newY})`);\n \n // Update node data\n const node = this.nodes.get(this.dragState.nodeId!);\n if (node) {\n node.x = newX;\n node.y = newY;\n }\n \n // Update connections\n this.drawConnections();\n }\n \n private onMouseUp = (event: MouseEvent) => {\n if (!this.dragState.isDragging || !this.dragState.element) return;\n \n this.dragState.element.classList.remove('dragging');\n \n // Clean up\n this.dragState = {\n isDragging: false,\n element: null,\n nodeId: null,\n startX: 0,\n startY: 0,\n startTransform: { x: 0, y: 0 }\n };\n \n document.removeEventListener('mousemove', this.onMouseMove);\n document.removeEventListener('mouseup', this.onMouseUp);\n }\n \n // Pan and zoom\n onWheel(event: WheelEvent) {\n event.preventDefault();\n const delta = event.deltaY > 0 ? 0.9 : 1.1;\n this.panZoom.scale = Math.max(0.3, Math.min(3, this.panZoom.scale * delta));\n this.updateTransform();\n }\n \n onSvgMouseDown(event: MouseEvent) {\n if (event.button === 0 && event.target === event.currentTarget) {\n this.panZoom.isPanning = true;\n this.panZoom.startX = event.clientX - this.panZoom.translateX;\n this.panZoom.startY = event.clientY - this.panZoom.translateY;\n event.preventDefault();\n }\n }\n \n onSvgMouseMove(event: MouseEvent) {\n if (this.panZoom.isPanning) {\n this.panZoom.translateX = event.clientX - this.panZoom.startX;\n this.panZoom.translateY = event.clientY - this.panZoom.startY;\n this.updateTransform();\n }\n }\n \n onSvgMouseUp(event: MouseEvent) {\n this.panZoom.isPanning = false;\n }\n \n private updateTransform() {\n const svg = this.svgContainer?.nativeElement?.querySelector('svg');\n if (svg) {\n const mainGroup = svg.querySelector('.main-group');\n if (mainGroup) {\n mainGroup.setAttribute('transform', \n `translate(${this.panZoom.translateX}, ${this.panZoom.translateY}) scale(${this.panZoom.scale})`);\n }\n }\n }\n \n // Toolbar actions\n zoomIn() {\n this.panZoom.scale = Math.min(this.panZoom.scale * 1.2, 3);\n this.updateTransform();\n }\n \n zoomOut() {\n this.panZoom.scale = Math.max(this.panZoom.scale / 1.2, 0.3);\n this.updateTransform();\n }\n \n resetZoom() {\n this.panZoom.scale = 1;\n this.panZoom.translateX = 0;\n this.panZoom.translateY = 0;\n this.updateTransform();\n }\n \n // Detail pane handlers\n closeDetailPane() {\n this.selectedItem = null;\n this.cdr.detectChanges();\n }\n \n navigateToActionLog(logId: string) {\n // Emit event to parent component\n // Parent will handle navigation\n }\n \n async copyToClipboard(text: string) {\n try {\n await navigator.clipboard.writeText(text);\n } catch (err) {\n console.error('Failed to copy to clipboard:', err);\n }\n }\n}","<div class=\"visualization-container\">\n @if (error) {\n <div class=\"error-state\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>{{ error }}</span>\n </div>\n } @else {\n <kendo-splitter orientation=\"horizontal\" style=\"height: 100%;\">\n <!-- Diagram Pane -->\n <kendo-splitter-pane [collapsible]=\"false\">\n <div class=\"diagram-container\" #svgContainer>\n <div class=\"diagram-toolbar\">\n <div class=\"toolbar-title\">\n <i class=\"fa-solid fa-diagram-project\"></i>\n Agent Execution Flow\n </div>\n <div class=\"zoom-controls\">\n <button (click)=\"zoomIn()\" title=\"Zoom in\">\n <i class=\"fa-solid fa-search-plus\"></i>\n </button>\n <button (click)=\"zoomOut()\" title=\"Zoom out\">\n <i class=\"fa-solid fa-search-minus\"></i>\n </button>\n <button (click)=\"resetZoom()\" title=\"Reset zoom\">\n <i class=\"fa-solid fa-compress\"></i>\n </button>\n <span class=\"zoom-level\">{{ (panZoom.scale * 100).toFixed(0) }}%</span>\n </div>\n </div>\n @if (loading) {\n <div class=\"loading-overlay\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading visualization...</span>\n </div>\n }\n </div>\n </kendo-splitter-pane>\n \n <!-- Detail Pane -->\n @if (selectedItem) {\n <kendo-splitter-pane [size]=\"'400px'\" [min]=\"'300px'\" [max]=\"'600px'\" [collapsible]=\"true\">\n <mj-ai-agent-run-step-detail\n [selectedTimelineItem]=\"selectedItem\"\n (closePanel)=\"closeDetailPane()\"\n (navigateToActionLog)=\"navigateToActionLog($event)\"\n (copyToClipboard)=\"copyToClipboard($event)\">\n </mj-ai-agent-run-step-detail>\n </kendo-splitter-pane>\n }\n </kendo-splitter>\n }\n</div>"]}
|
|
1
|
+
{"version":3,"file":"ai-agent-run-visualization.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-visualization.component.ts","../../../../src/lib/custom/ai-agent-run/ai-agent-run-visualization.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnInit, OnDestroy, ViewChild, ElementRef, AfterViewInit, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { Subject, combineLatest } from 'rxjs';\nimport { takeUntil, take } from 'rxjs/operators';\nimport { MJAIAgentRunEntity, MJAIAgentRunStepEntity, MJActionExecutionLogEntity, MJAIPromptRunEntity } from '@memberjunction/core-entities';\nimport { TimelineItem } from './ai-agent-run-timeline.component';\nimport { AIAgentRunDataHelper } from './ai-agent-run-data.service';\nimport { UUIDsEqual } from '@memberjunction/global';\n\ninterface NodeData {\n step: MJAIAgentRunStepEntity;\n x: number;\n y: number;\n width: number;\n height: number;\n element?: SVGGElement;\n}\n\ninterface ScopeData {\n id: string;\n name: string;\n x: number;\n y: number;\n width: number;\n height: number;\n expanded: boolean;\n nodes: NodeData[];\n element?: SVGGElement;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-ai-agent-run-visualization',\n templateUrl: './ai-agent-run-visualization.component.html',\n styleUrls: ['./ai-agent-run-visualization.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AIAgentRunVisualizationComponent implements OnInit, OnDestroy, AfterViewInit {\n @ViewChild('svgContainer', { static: false }) svgContainer!: ElementRef<HTMLDivElement>;\n @Input() aiAgentRunId!: string;\n @Input() dataHelper!: AIAgentRunDataHelper;\n \n private destroy$ = new Subject<void>();\n private viewInitialized = false;\n \n /** Track active timeouts for cleanup */\n private activeTimeouts: number[] = [];\n \n /** Remove timeout from tracking array */\n private removeTimeoutFromTracking(timeoutId: number): void {\n const index = this.activeTimeouts.indexOf(timeoutId);\n if (index > -1) {\n this.activeTimeouts.splice(index, 1);\n }\n }\n private pendingData: { steps: MJAIAgentRunStepEntity[], subRuns: MJAIAgentRunEntity[], actionLogs: MJActionExecutionLogEntity[], promptRuns: MJAIPromptRunEntity[] } | null = null;\n \n loading = false; // Start with false so the container renders\n error: string | null = null;\n private dataLoading = false; // Track data loading state from service\n \n selectedItem: TimelineItem | null = null;\n \n // Node management\n private nodes = new Map<string, NodeData>();\n private scopes = new Map<string, ScopeData>();\n private connections: Array<{from: string, to: string, path?: SVGPathElement}> = [];\n \n // Pan and zoom state\n panZoom = {\n scale: 1,\n translateX: 0,\n translateY: 0,\n isPanning: false,\n startX: 0,\n startY: 0\n };\n \n // Drag state\n private dragState: {\n isDragging: boolean;\n element: SVGGElement | null;\n nodeId: string | null;\n startX: number;\n startY: number;\n startTransform: { x: number; y: number };\n initialX?: number;\n initialY?: number;\n } = {\n isDragging: false,\n element: null,\n nodeId: null,\n startX: 0,\n startY: 0,\n startTransform: { x: 0, y: 0 }\n };\n \n // Pan state\n private panState = {\n isPanning: false,\n startX: 0,\n startY: 0,\n initialTranslateX: 0,\n initialTranslateY: 0\n };\n \n // Animation frame ID for cleanup\n private animationFrameId: number | null = null;\n \n // Bound event handlers for proper cleanup\n private boundOnWheel = this.onWheel.bind(this);\n private boundOnSvgMouseDown = this.onSvgMouseDown.bind(this);\n private boundOnSvgMouseMove = this.onSvgMouseMove.bind(this);\n private boundOnSvgMouseUp = this.onSvgMouseUp.bind(this);\n \n constructor(\n private cdr: ChangeDetectorRef\n ) {}\n \n ngOnInit() {\n if (this.aiAgentRunId) {\n // Subscribe to data from helper\n combineLatest([\n this.dataHelper.steps$,\n this.dataHelper.subRuns$,\n this.dataHelper.actionLogs$,\n this.dataHelper.promptRuns$,\n this.dataHelper.loading$\n ]).pipe(\n takeUntil(this.destroy$)\n ).subscribe(([steps, subRuns, actionLogs, promptRuns, loading]) => {\n this.dataLoading = loading;\n \n if (!loading && steps && steps.length > 0) {\n console.log('Visualization: Received data from service', {\n steps: steps.length,\n subRuns: subRuns.length,\n viewInitialized: this.viewInitialized\n });\n \n if (this.viewInitialized && this.svgContainer?.nativeElement) {\n // View is ready, build immediately\n this.buildVisualization(steps, subRuns, actionLogs, promptRuns);\n } else {\n // Store data for when view is ready\n console.log('View not ready, storing data for later');\n this.pendingData = { steps, subRuns, actionLogs, promptRuns };\n }\n } else if (!loading && (!steps || steps.length === 0)) {\n console.log('Visualization: No steps available');\n this.error = null;\n }\n });\n \n // Subscribe to error state\n this.dataHelper.error$.pipe(takeUntil(this.destroy$)).subscribe((error: string | null) => {\n if (error) {\n this.error = error;\n this.loading = false;\n }\n });\n } else {\n console.error('Visualization: No agent run ID provided');\n this.error = 'No agent run ID provided';\n }\n }\n \n ngAfterViewInit() {\n console.log('Visualization ngAfterViewInit');\n this.viewInitialized = true;\n \n // Initialize SVG\n if (this.svgContainer && this.svgContainer.nativeElement) {\n this.initializeSVG();\n \n // If we have pending data, process it now\n if (this.pendingData) {\n console.log('Processing pending data after view init');\n this.buildVisualization(\n this.pendingData.steps,\n this.pendingData.subRuns,\n this.pendingData.actionLogs,\n this.pendingData.promptRuns\n );\n this.pendingData = null;\n }\n \n this.cdr.detectChanges();\n } else {\n console.error('SVG container not found in ngAfterViewInit');\n }\n }\n \n ngOnDestroy() {\n // Signal all subscriptions to complete\n this.destroy$.next();\n this.destroy$.complete();\n \n // Clear all active timeouts\n this.activeTimeouts.forEach(timeoutId => {\n clearTimeout(timeoutId);\n });\n this.activeTimeouts.length = 0;\n \n // Clean up document-level event listeners\n document.removeEventListener('mousemove', this.onMouseMove);\n document.removeEventListener('mouseup', this.onMouseUp);\n \n // Clean up SVG and all its event listeners\n if (this.svgContainer?.nativeElement) {\n const svg = this.svgContainer.nativeElement.querySelector('svg');\n if (svg) {\n // Remove all SVG event listeners with bound handlers\n svg.removeEventListener('wheel', this.boundOnWheel);\n svg.removeEventListener('mousedown', this.boundOnSvgMouseDown);\n svg.removeEventListener('mousemove', this.boundOnSvgMouseMove);\n svg.removeEventListener('mouseup', this.boundOnSvgMouseUp);\n \n // Remove all node and scope event listeners\n // We can't remove specific listeners if we don't have references to them\n // The best approach is to clone and replace the elements, which removes all listeners\n svg.querySelectorAll('g[id^=\"node-\"], g[id^=\"scope-\"]').forEach(element => {\n const clone = element.cloneNode(true);\n element.parentNode?.replaceChild(clone, element);\n });\n \n // Remove expand button listeners\n svg.querySelectorAll('.expand-button').forEach(button => {\n const clone = button.cloneNode(true);\n button.parentNode?.replaceChild(clone, button);\n });\n \n // Clear all SVG content\n while (svg.firstChild) {\n svg.removeChild(svg.firstChild);\n }\n }\n }\n \n // Clear data structures\n this.nodes.clear();\n this.scopes.clear();\n this.connections = [];\n \n // Clear any pending animation frames\n if (this.animationFrameId) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n \n // Reset state\n this.dragState = {\n isDragging: false,\n element: null,\n nodeId: null,\n startX: 0,\n startY: 0,\n startTransform: { x: 0, y: 0 }\n };\n \n this.panState = {\n isPanning: false,\n startX: 0,\n startY: 0,\n initialTranslateX: 0,\n initialTranslateY: 0\n };\n }\n \n private initializeSVG() {\n const container = this.svgContainer?.nativeElement;\n if (!container) {\n console.error('SVG container element not found');\n return;\n }\n \n // Create SVG element if it doesn't exist\n let svg = container.querySelector('svg');\n if (!svg) {\n svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('class', 'visualization-svg');\n svg.setAttribute('width', '100%');\n svg.setAttribute('height', '100%');\n \n // Add event listeners with bound handlers\n svg.addEventListener('wheel', this.boundOnWheel);\n svg.addEventListener('mousedown', this.boundOnSvgMouseDown);\n svg.addEventListener('mousemove', this.boundOnSvgMouseMove);\n svg.addEventListener('mouseup', this.boundOnSvgMouseUp);\n \n container.appendChild(svg);\n }\n \n // Add arrow marker definition\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n const marker = document.createElementNS('http://www.w3.org/2000/svg', 'marker');\n marker.setAttribute('id', 'arrowhead-viz');\n marker.setAttribute('markerWidth', '10');\n marker.setAttribute('markerHeight', '7');\n marker.setAttribute('refX', '9');\n marker.setAttribute('refY', '3.5');\n marker.setAttribute('orient', 'auto');\n \n const polygon = document.createElementNS('http://www.w3.org/2000/svg', 'polygon');\n polygon.setAttribute('points', '0 0, 10 3.5, 0 7');\n polygon.setAttribute('class', 'arrowhead-polygon');\n marker.appendChild(polygon);\n defs.appendChild(marker);\n svg.appendChild(defs);\n \n console.log('SVG initialized successfully');\n }\n \n private async buildVisualization(\n steps: MJAIAgentRunStepEntity[],\n subRuns: MJAIAgentRunEntity[],\n actionLogs: MJActionExecutionLogEntity[],\n promptRuns: MJAIPromptRunEntity[]\n ) {\n console.log('buildVisualization called', { \n steps: steps?.length || 0, \n hasContainer: !!this.svgContainer,\n containerElement: this.svgContainer?.nativeElement\n });\n \n if (!this.svgContainer || !this.svgContainer.nativeElement) {\n console.error('SVG container not available');\n this.loading = false;\n this.error = 'Visualization container not ready';\n return;\n }\n \n // If no steps, show empty state\n if (!steps || steps.length === 0) {\n console.log('No steps to visualize');\n this.loading = false;\n this.error = null;\n return;\n }\n \n this.loading = true;\n this.error = null;\n \n try {\n // Wait a tick for the view to be fully ready\n await new Promise(resolve => {\n const timeoutId = setTimeout(() => {\n this.removeTimeoutFromTracking(timeoutId);\n resolve(undefined);\n }, 0) as any as number;\n this.activeTimeouts.push(timeoutId);\n });\n \n // Clear existing elements\n this.clearVisualization();\n \n // Build nodes and scopes\n await this.buildNodesAndScopes(steps, subRuns, promptRuns);\n \n // Arrange layout\n this.arrangeLayout();\n \n // Draw connections\n this.drawConnections();\n \n // Fit to view\n this.fitToView();\n \n this.loading = false;\n console.log('Visualization built successfully');\n \n // Trigger change detection since we're using OnPush\n this.cdr.markForCheck();\n } catch (error) {\n this.error = 'Failed to build visualization';\n console.error('Visualization error:', error);\n this.loading = false;\n \n // Trigger change detection since we're using OnPush\n this.cdr.markForCheck();\n }\n }\n \n private clearVisualization() {\n const svg = this.svgContainer?.nativeElement?.querySelector('svg');\n if (!svg) return;\n \n const mainGroup = svg.querySelector('.main-group');\n if (mainGroup) {\n // Remove all child elements except defs\n while (mainGroup.firstChild) {\n mainGroup.removeChild(mainGroup.firstChild);\n }\n }\n \n this.nodes.clear();\n this.scopes.clear();\n this.connections = [];\n }\n \n private async buildNodesAndScopes(\n steps: MJAIAgentRunStepEntity[],\n subRuns: MJAIAgentRunEntity[],\n promptRuns: MJAIPromptRunEntity[]\n ) {\n const svg = this.svgContainer?.nativeElement?.querySelector('svg');\n if (!svg) return;\n \n let mainGroup = svg.querySelector('.main-group') as SVGGElement;\n if (!mainGroup) {\n mainGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n mainGroup.setAttribute('class', 'main-group');\n svg.appendChild(mainGroup);\n }\n \n // Create nodes for each step\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i];\n \n if (step.StepType === 'Sub-Agent' && step.TargetLogID) {\n // Create a scope for sub-agent\n const subRun = subRuns.find(sr => UUIDsEqual(sr.ID, step.TargetLogID));\n const scopeElement = await this.createScopeElement(step, subRun);\n mainGroup.appendChild(scopeElement);\n \n const scope: ScopeData = {\n id: step.ID,\n name: subRun?.Agent || 'Sub-Agent',\n x: 0,\n y: 0,\n width: 300,\n height: 200,\n expanded: false,\n nodes: [],\n element: scopeElement\n };\n \n this.scopes.set(step.ID, scope);\n } else {\n // Create regular node\n const nodeElement = this.createNodeElement(step, promptRuns);\n mainGroup.appendChild(nodeElement);\n \n const nodeData: NodeData = {\n step: step,\n x: 0,\n y: 0,\n width: 180,\n height: 80,\n element: nodeElement\n };\n \n this.nodes.set(step.ID, nodeData);\n }\n \n // Add connection info\n if (i > 0) {\n this.connections.push({\n from: steps[i - 1].ID,\n to: step.ID\n });\n }\n }\n }\n \n private createNodeElement(step: MJAIAgentRunStepEntity, promptRuns: MJAIPromptRunEntity[]): SVGGElement {\n const g = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n g.setAttribute('class', 'step-node');\n g.setAttribute('data-step-id', step.ID);\n g.setAttribute('data-type', this.getStepDataType(step.StepType));\n\n // Add event handlers\n g.addEventListener('click', (e) => this.onNodeClick(e, step));\n g.addEventListener('mousedown', (e) => this.onNodeMouseDown(e, step.ID));\n g.style.cursor = 'pointer';\n \n const nodeWidth = 180;\n const nodeHeight = 80;\n \n // Background rectangle\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n rect.setAttribute('width', nodeWidth.toString());\n rect.setAttribute('height', nodeHeight.toString());\n rect.setAttribute('rx', '8');\n rect.setAttribute('class', 'node-bg');\n rect.setAttribute('stroke', this.getStepColor(step));\n rect.setAttribute('stroke-width', '2');\n g.appendChild(rect);\n \n // Status indicator\n const statusCircle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n statusCircle.setAttribute('cx', '12');\n statusCircle.setAttribute('cy', '12');\n statusCircle.setAttribute('r', '6');\n statusCircle.setAttribute('fill', this.getStatusColor(step.Status));\n g.appendChild(statusCircle);\n \n // Icon\n const icon = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n icon.setAttribute('x', '35');\n icon.setAttribute('y', '20');\n icon.setAttribute('font-size', '18');\n icon.setAttribute('fill', this.getStepColor(step));\n icon.textContent = this.getStepEmoji(step.StepType);\n g.appendChild(icon);\n \n // Title\n const title = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n title.setAttribute('x', '60');\n title.setAttribute('y', '20');\n title.setAttribute('font-size', '14');\n title.setAttribute('font-weight', '600');\n title.setAttribute('class', 'node-title');\n title.textContent = this.truncateText(step.StepName || `Step ${step.StepNumber}`, 15);\n g.appendChild(title);\n \n // Step type\n const type = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n type.setAttribute('x', '12');\n type.setAttribute('y', '40');\n type.setAttribute('font-size', '12');\n type.setAttribute('class', 'node-subtitle');\n type.textContent = step.StepType;\n g.appendChild(type);\n \n // Model info for prompts\n if (step.StepType === 'Prompt' && step.TargetLogID && promptRuns) {\n const promptRun = promptRuns.find(pr => UUIDsEqual(pr.ID, step.TargetLogID));\n if (promptRun) {\n const model = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n model.setAttribute('x', '12');\n model.setAttribute('y', '55');\n model.setAttribute('font-size', '11');\n model.setAttribute('class', 'node-meta');\n model.textContent = `${promptRun.Model || 'Unknown'}`;\n g.appendChild(model);\n }\n }\n \n // Duration\n if (step.CompletedAt) {\n const duration = this.calculateDuration(step.StartedAt, step.CompletedAt);\n const durationText = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n durationText.setAttribute('x', '12');\n durationText.setAttribute('y', '70');\n durationText.setAttribute('font-size', '11');\n durationText.setAttribute('class', 'node-meta');\n durationText.textContent = `⏱️ ${duration}`;\n g.appendChild(durationText);\n }\n \n return g;\n }\n \n private async createScopeElement(step: MJAIAgentRunStepEntity, subRun?: MJAIAgentRunEntity): Promise<SVGGElement> {\n const g = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n g.setAttribute('class', 'scope-container');\n g.setAttribute('data-scope-id', step.ID);\n \n const scopeWidth = 300;\n const scopeHeight = 200;\n const headerHeight = 40;\n \n // Background\n const bg = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n bg.setAttribute('width', scopeWidth.toString());\n bg.setAttribute('height', scopeHeight.toString());\n bg.setAttribute('rx', '12');\n bg.setAttribute('class', 'scope-bg');\n bg.setAttribute('stroke-width', '2');\n bg.setAttribute('stroke-dasharray', '5,5');\n g.appendChild(bg);\n \n // Header background\n const headerBg = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n headerBg.setAttribute('width', scopeWidth.toString());\n headerBg.setAttribute('height', headerHeight.toString());\n headerBg.setAttribute('rx', '12');\n headerBg.setAttribute('class', 'scope-header');\n g.appendChild(headerBg);\n \n // Fix bottom corners\n const headerFix = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n headerFix.setAttribute('y', (headerHeight - 12).toString());\n headerFix.setAttribute('width', scopeWidth.toString());\n headerFix.setAttribute('height', '12');\n headerFix.setAttribute('class', 'scope-header');\n g.appendChild(headerFix);\n \n // Robot icon\n const icon = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n icon.setAttribute('x', '12');\n icon.setAttribute('y', '26');\n icon.setAttribute('font-size', '20');\n icon.textContent = '🤖';\n g.appendChild(icon);\n \n // Title\n const title = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n title.setAttribute('x', '40');\n title.setAttribute('y', '26');\n title.setAttribute('font-size', '14');\n title.setAttribute('font-weight', '600');\n title.setAttribute('class', 'scope-title');\n title.textContent = subRun?.Agent || 'Sub-Agent';\n g.appendChild(title);\n \n // Expand/collapse button\n const expandBtn = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n expandBtn.setAttribute('class', 'expand-button');\n expandBtn.style.cursor = 'pointer';\n expandBtn.setAttribute('transform', `translate(${scopeWidth - 30}, 10)`);\n \n const expandBg = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n expandBg.setAttribute('cx', '10');\n expandBg.setAttribute('cy', '10');\n expandBg.setAttribute('r', '10');\n expandBg.setAttribute('class', 'expand-bg');\n expandBtn.appendChild(expandBg);\n \n const expandIcon = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n expandIcon.setAttribute('x', '10');\n expandIcon.setAttribute('y', '15');\n expandIcon.setAttribute('text-anchor', 'middle');\n expandIcon.setAttribute('font-size', '12');\n expandIcon.setAttribute('class', 'expand-icon');\n expandIcon.textContent = '+';\n expandBtn.appendChild(expandIcon);\n \n expandBtn.addEventListener('click', (e) => this.onScopeExpandClick(e, step.ID));\n g.appendChild(expandBtn);\n \n // Click handler for scope\n g.addEventListener('click', (e) => {\n if (!(e.target as Element).closest('.expand-button')) {\n this.onNodeClick(e, step);\n }\n });\n \n return g;\n }\n \n private arrangeLayout() {\n const nodeSpacingX = 250;\n const nodeSpacingY = 120;\n const startX = 50;\n const startY = 50;\n \n let currentY = startY;\n let index = 0;\n \n // Arrange nodes and scopes sequentially\n const allItems = [...this.nodes.values(), ...Array.from(this.scopes.values()).map(s => ({ \n step: { ID: s.id } as MJAIAgentRunStepEntity, \n x: 0, \n y: 0, \n width: s.width, \n height: s.height \n }))];\n \n // Sort by step number if available\n allItems.sort((a, b) => {\n const aStep = a.step as MJAIAgentRunStepEntity;\n const bStep = b.step as MJAIAgentRunStepEntity;\n return (aStep.StepNumber || 0) - (bStep.StepNumber || 0);\n });\n \n for (const item of allItems) {\n const nodeData = this.nodes.get(item.step.ID);\n const scopeData = this.scopes.get(item.step.ID);\n \n if (nodeData) {\n nodeData.x = startX;\n nodeData.y = currentY;\n \n if (nodeData.element) {\n nodeData.element.setAttribute('transform', `translate(${nodeData.x}, ${nodeData.y})`);\n }\n \n currentY += nodeSpacingY;\n } else if (scopeData) {\n scopeData.x = startX;\n scopeData.y = currentY;\n \n if (scopeData.element) {\n scopeData.element.setAttribute('transform', `translate(${scopeData.x}, ${scopeData.y})`);\n }\n \n currentY += scopeData.height + nodeSpacingY;\n }\n }\n }\n \n private drawConnections() {\n const svg = this.svgContainer?.nativeElement?.querySelector('svg');\n if (!svg) return;\n \n const mainGroup = svg.querySelector('.main-group');\n if (!mainGroup) return;\n \n // Create connections group if not exists\n let connectionsGroup = mainGroup.querySelector('.connections-group') as SVGGElement;\n if (!connectionsGroup) {\n connectionsGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n connectionsGroup.setAttribute('class', 'connections-group');\n mainGroup.insertBefore(connectionsGroup, mainGroup.firstChild);\n }\n \n // Clear existing connections\n while (connectionsGroup.firstChild) {\n connectionsGroup.removeChild(connectionsGroup.firstChild);\n }\n \n // Draw each connection\n for (const conn of this.connections) {\n const fromNode = this.nodes.get(conn.from);\n const fromScope = this.scopes.get(conn.from);\n const toNode = this.nodes.get(conn.to);\n const toScope = this.scopes.get(conn.to);\n \n let fromX = 0, fromY = 0, toX = 0, toY = 0;\n \n if (fromNode) {\n fromX = fromNode.x + fromNode.width / 2;\n fromY = fromNode.y + fromNode.height;\n } else if (fromScope) {\n fromX = fromScope.x + fromScope.width / 2;\n fromY = fromScope.y + fromScope.height;\n }\n \n if (toNode) {\n toX = toNode.x + toNode.width / 2;\n toY = toNode.y;\n } else if (toScope) {\n toX = toScope.x + toScope.width / 2;\n toY = toScope.y;\n }\n \n if (fromX && fromY && toX && toY) {\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n const d = `M ${fromX} ${fromY} L ${toX} ${toY}`;\n path.setAttribute('d', d);\n path.setAttribute('fill', 'none');\n path.setAttribute('class', 'connection-line');\n path.setAttribute('stroke-width', '2');\n path.setAttribute('marker-end', 'url(#arrowhead-viz)');\n \n connectionsGroup.appendChild(path);\n conn.path = path;\n }\n }\n }\n \n private fitToView() {\n const svg = this.svgContainer?.nativeElement?.querySelector('svg') as SVGSVGElement;\n const mainGroup = svg?.querySelector('.main-group') as SVGGElement;\n if (!svg || !mainGroup) return;\n \n const bbox = mainGroup.getBBox();\n const padding = 50;\n \n const viewBox = `${bbox.x - padding} ${bbox.y - padding} ${bbox.width + 2 * padding} ${bbox.height + 2 * padding}`;\n svg.setAttribute('viewBox', viewBox);\n }\n \n private getStepColor(step: MJAIAgentRunStepEntity): string {\n const colorMap: Record<string, string> = {\n 'Prompt': '#2196f3',\n 'Actions': '#4caf50',\n 'Sub-Agent': '#ff9800',\n 'Tool': '#9c27b0',\n 'Decision': '#f44336'\n };\n return colorMap[step.StepType] || '#757575';\n }\n \n private getStepEmoji(stepType: string): string {\n const emojiMap: Record<string, string> = {\n 'Prompt': '💬',\n 'Actions': '⚙️',\n 'Sub-Agent': '🤖',\n 'Tool': '🔧',\n 'Decision': '🔀',\n 'ForEach': '🔁',\n 'While': '🔄'\n };\n return emojiMap[stepType] || '⚪';\n }\n \n private getStatusColor(status: string): string {\n const colorMap: Record<string, string> = {\n 'Running': '#1976d2',\n 'Completed': '#388e3c',\n 'Failed': '#d32f2f',\n 'Cancelled': '#f57c00',\n 'Paused': '#757575'\n };\n return colorMap[status] || '#9e9e9e';\n }\n\n private getStepDataType(stepType: string): string {\n const typeMap: Record<string, string> = {\n 'Prompt': 'prompt',\n 'Actions': 'action',\n 'Sub-Agent': 'subagent',\n 'Tool': 'tool',\n 'Decision': 'decision',\n 'ForEach': 'foreach',\n 'While': 'while'\n };\n return typeMap[stepType] || 'default';\n }\n\n private truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.substring(0, maxLength - 3) + '...';\n }\n \n private calculateDuration(start: Date, end?: Date | null): string {\n if (!end) return 'Running...';\n \n const ms = new Date(end).getTime() - new Date(start).getTime();\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3600000) return `${Math.floor(ms / 60000)}m ${Math.floor((ms % 60000) / 1000)}s`;\n return `${Math.floor(ms / 3600000)}h ${Math.floor((ms % 3600000) / 60000)}m`;\n }\n \n // Event handlers\n private onNodeClick(event: MouseEvent, step: MJAIAgentRunStepEntity) {\n event.stopPropagation();\n \n // Create timeline item from step\n const item: TimelineItem = {\n id: step.ID,\n type: 'step',\n title: step.StepName || `Step ${step.StepNumber}`,\n subtitle: `Type: ${step.StepType}`,\n status: step.Status,\n startTime: step.StartedAt,\n endTime: step.CompletedAt || undefined,\n duration: this.calculateDuration(step.StartedAt, step.CompletedAt),\n icon: this.getStepIcon(step.StepType),\n color: this.getStatusColorName(step.Status),\n data: step,\n level: 0\n };\n \n this.selectedItem = item;\n this.cdr.detectChanges();\n }\n \n private getStepIcon(stepType: string): string {\n const iconMap: Record<string, string> = {\n 'Prompt': 'fa-microchip',\n 'Tool': 'fa-tools',\n 'Sub-Agent': 'fa-robot',\n 'Decision': 'fa-code-branch',\n 'Actions': 'fa-cog',\n 'ForEach': 'fa-repeat',\n 'While': 'fa-rotate'\n };\n return iconMap[stepType] || 'fa-circle';\n }\n \n private getStatusColorName(status: string): string {\n const colorMap: Record<string, string> = {\n 'Running': 'info',\n 'Completed': 'success',\n 'Failed': 'error',\n 'Cancelled': 'warning',\n 'Paused': 'secondary'\n };\n return colorMap[status] || 'secondary';\n }\n \n private async onScopeExpandClick(event: MouseEvent, scopeId: string) {\n event.stopPropagation();\n \n const scope = this.scopes.get(scopeId);\n if (!scope) return;\n \n scope.expanded = !scope.expanded;\n \n if (scope.expanded) {\n // Load sub-agent steps\n await this.loadScopeContents(scopeId);\n }\n \n // Update UI\n this.updateScopeVisual(scope);\n this.arrangeLayout();\n this.drawConnections();\n }\n \n private async loadScopeContents(scopeId: string) {\n const scope = this.scopes.get(scopeId);\n if (!scope) return;\n \n // Find the step\n const step = Array.from(this.nodes.values()).find(n => UUIDsEqual(n.step.ID, scopeId))?.step\n || Array.from(this.scopes.values()).find(s => s.id === scopeId);\n \n if (!step || !(step as any).TargetLogID) return;\n \n const targetLogId = (step as any).TargetLogID;\n \n try {\n // Load sub-agent data through service\n const data = await this.dataHelper.loadSubAgentData(targetLogId);\n \n if (data.steps && data.steps.length > 0) {\n // Create nodes from data\n this.createScopeNodes(scope, data.steps, data.promptRuns);\n }\n } catch (error) {\n console.error('Failed to load scope contents:', error);\n }\n }\n \n private createScopeNodes(scope: ScopeData, steps: MJAIAgentRunStepEntity[], promptRuns: MJAIPromptRunEntity[]) {\n const svg = this.svgContainer?.nativeElement?.querySelector('svg');\n if (!svg) return;\n \n const mainGroup = svg.querySelector('.main-group');\n if (!mainGroup || !scope.element) return;\n \n // Create nodes inside scope\n const nodeSpacingY = 60;\n const startX = 20;\n const startY = 60;\n \n for (let i = 0; i < steps.length; i++) {\n const step = steps[i];\n const nodeElement = this.createNodeElement(step, promptRuns);\n \n // Add node to scope group\n scope.element.appendChild(nodeElement);\n \n const nodeData: NodeData = {\n step: step,\n x: startX,\n y: startY + i * nodeSpacingY,\n width: 160,\n height: 60,\n element: nodeElement\n };\n \n nodeElement.setAttribute('transform', `translate(${nodeData.x}, ${nodeData.y})`);\n \n scope.nodes.push(nodeData);\n this.nodes.set(step.ID, nodeData);\n }\n \n // Update scope height\n scope.height = Math.max(200, startY + steps.length * nodeSpacingY + 20);\n }\n \n private updateScopeVisual(scope: ScopeData) {\n if (!scope.element) return;\n \n // Update background height\n const bg = scope.element.querySelector('rect');\n if (bg) {\n bg.setAttribute('height', scope.height.toString());\n }\n \n // Update expand button\n const expandIcon = scope.element.querySelector('.expand-button text');\n if (expandIcon) {\n expandIcon.textContent = scope.expanded ? '−' : '+';\n }\n }\n \n // Drag handling\n private onNodeMouseDown(event: MouseEvent, nodeId: string) {\n event.preventDefault();\n event.stopPropagation();\n \n const node = this.nodes.get(nodeId);\n if (!node || !node.element) return;\n \n // Get current transform\n const transform = node.element.getAttribute('transform');\n const match = transform?.match(/translate\\(([-\\d.]+),\\s*([-\\d.]+)\\)/);\n if (!match) return;\n \n // Get SVG coordinates\n const svg = node.element.ownerSVGElement;\n if (!svg) return;\n \n const pt = svg.createSVGPoint();\n pt.x = event.clientX;\n pt.y = event.clientY;\n const svgP = pt.matrixTransform(svg.getScreenCTM()?.inverse());\n \n this.dragState = {\n isDragging: true,\n element: node.element,\n nodeId: nodeId,\n startX: svgP.x,\n startY: svgP.y,\n startTransform: {\n x: parseFloat(match[1]),\n y: parseFloat(match[2])\n }\n };\n \n node.element.classList.add('dragging');\n \n // Add document-level event listeners\n document.addEventListener('mousemove', this.onMouseMove);\n document.addEventListener('mouseup', this.onMouseUp);\n }\n \n private onMouseMove = (event: MouseEvent) => {\n if (!this.dragState.isDragging || !this.dragState.element) return;\n \n const svg = this.dragState.element.ownerSVGElement;\n if (!svg) return;\n \n const pt = svg.createSVGPoint();\n pt.x = event.clientX;\n pt.y = event.clientY;\n const svgP = pt.matrixTransform(svg.getScreenCTM()?.inverse());\n \n const dx = svgP.x - this.dragState.startX;\n const dy = svgP.y - this.dragState.startY;\n \n const newX = this.dragState.startTransform.x + dx;\n const newY = this.dragState.startTransform.y + dy;\n \n // Update element position\n this.dragState.element.setAttribute('transform', `translate(${newX}, ${newY})`);\n \n // Update node data\n const node = this.nodes.get(this.dragState.nodeId!);\n if (node) {\n node.x = newX;\n node.y = newY;\n }\n \n // Update connections\n this.drawConnections();\n }\n \n private onMouseUp = (event: MouseEvent) => {\n if (!this.dragState.isDragging || !this.dragState.element) return;\n \n this.dragState.element.classList.remove('dragging');\n \n // Clean up\n this.dragState = {\n isDragging: false,\n element: null,\n nodeId: null,\n startX: 0,\n startY: 0,\n startTransform: { x: 0, y: 0 }\n };\n \n document.removeEventListener('mousemove', this.onMouseMove);\n document.removeEventListener('mouseup', this.onMouseUp);\n }\n \n // Pan and zoom\n onWheel(event: WheelEvent) {\n event.preventDefault();\n const delta = event.deltaY > 0 ? 0.9 : 1.1;\n this.panZoom.scale = Math.max(0.3, Math.min(3, this.panZoom.scale * delta));\n this.updateTransform();\n }\n \n onSvgMouseDown(event: MouseEvent) {\n if (event.button === 0 && event.target === event.currentTarget) {\n this.panZoom.isPanning = true;\n this.panZoom.startX = event.clientX - this.panZoom.translateX;\n this.panZoom.startY = event.clientY - this.panZoom.translateY;\n event.preventDefault();\n }\n }\n \n onSvgMouseMove(event: MouseEvent) {\n if (this.panZoom.isPanning) {\n this.panZoom.translateX = event.clientX - this.panZoom.startX;\n this.panZoom.translateY = event.clientY - this.panZoom.startY;\n this.updateTransform();\n }\n }\n \n onSvgMouseUp(event: MouseEvent) {\n this.panZoom.isPanning = false;\n }\n \n private updateTransform() {\n const svg = this.svgContainer?.nativeElement?.querySelector('svg');\n if (svg) {\n const mainGroup = svg.querySelector('.main-group');\n if (mainGroup) {\n mainGroup.setAttribute('transform', \n `translate(${this.panZoom.translateX}, ${this.panZoom.translateY}) scale(${this.panZoom.scale})`);\n }\n }\n }\n \n // Toolbar actions\n zoomIn() {\n this.panZoom.scale = Math.min(this.panZoom.scale * 1.2, 3);\n this.updateTransform();\n }\n \n zoomOut() {\n this.panZoom.scale = Math.max(this.panZoom.scale / 1.2, 0.3);\n this.updateTransform();\n }\n \n resetZoom() {\n this.panZoom.scale = 1;\n this.panZoom.translateX = 0;\n this.panZoom.translateY = 0;\n this.updateTransform();\n }\n \n // Detail pane handlers\n closeDetailPane() {\n this.selectedItem = null;\n this.cdr.detectChanges();\n }\n \n navigateToActionLog(logId: string) {\n // Emit event to parent component\n // Parent will handle navigation\n }\n \n async copyToClipboard(text: string) {\n try {\n await navigator.clipboard.writeText(text);\n } catch (err) {\n console.error('Failed to copy to clipboard:', err);\n }\n }\n}","<div class=\"visualization-container\">\n @if (error) {\n <div class=\"error-state\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>{{ error }}</span>\n </div>\n } @else {\n <kendo-splitter orientation=\"horizontal\" style=\"height: 100%;\">\n <!-- Diagram Pane -->\n <kendo-splitter-pane [collapsible]=\"false\">\n <div class=\"diagram-container\" #svgContainer>\n <div class=\"diagram-toolbar\">\n <div class=\"toolbar-title\">\n <i class=\"fa-solid fa-diagram-project\"></i>\n Agent Execution Flow\n </div>\n <div class=\"zoom-controls\">\n <button (click)=\"zoomIn()\" title=\"Zoom in\">\n <i class=\"fa-solid fa-search-plus\"></i>\n </button>\n <button (click)=\"zoomOut()\" title=\"Zoom out\">\n <i class=\"fa-solid fa-search-minus\"></i>\n </button>\n <button (click)=\"resetZoom()\" title=\"Reset zoom\">\n <i class=\"fa-solid fa-compress\"></i>\n </button>\n <span class=\"zoom-level\">{{ (panZoom.scale * 100).toFixed(0) }}%</span>\n </div>\n </div>\n @if (loading) {\n <div class=\"loading-overlay\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading visualization...</span>\n </div>\n }\n </div>\n </kendo-splitter-pane>\n \n <!-- Detail Pane -->\n @if (selectedItem) {\n <kendo-splitter-pane [size]=\"'400px'\" [min]=\"'300px'\" [max]=\"'600px'\" [collapsible]=\"true\">\n <mj-ai-agent-run-step-detail\n [selectedTimelineItem]=\"selectedItem\"\n (closePanel)=\"closeDetailPane()\"\n (navigateToActionLog)=\"navigateToActionLog($event)\"\n (copyToClipboard)=\"copyToClipboard($event)\">\n </mj-ai-agent-run-step-detail>\n </kendo-splitter-pane>\n }\n </kendo-splitter>\n }\n</div>"]}
|