@memberjunction/ng-ai-test-harness 2.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +187 -0
  2. package/dist/lib/agent-execution-monitor.component.d.ts +273 -0
  3. package/dist/lib/agent-execution-monitor.component.d.ts.map +1 -0
  4. package/dist/lib/agent-execution-monitor.component.js +1429 -0
  5. package/dist/lib/agent-execution-monitor.component.js.map +1 -0
  6. package/dist/lib/agent-execution-node.component.d.ts +19 -0
  7. package/dist/lib/agent-execution-node.component.d.ts.map +1 -0
  8. package/dist/lib/agent-execution-node.component.js +458 -0
  9. package/dist/lib/agent-execution-node.component.js.map +1 -0
  10. package/dist/lib/ai-test-harness-dialog.component.d.ts +98 -0
  11. package/dist/lib/ai-test-harness-dialog.component.d.ts.map +1 -0
  12. package/dist/lib/ai-test-harness-dialog.component.js +206 -0
  13. package/dist/lib/ai-test-harness-dialog.component.js.map +1 -0
  14. package/dist/lib/ai-test-harness-dialog.service.d.ts +32 -0
  15. package/dist/lib/ai-test-harness-dialog.service.d.ts.map +1 -0
  16. package/dist/lib/ai-test-harness-dialog.service.js +120 -0
  17. package/dist/lib/ai-test-harness-dialog.service.js.map +1 -0
  18. package/dist/lib/ai-test-harness.component.d.ts +631 -0
  19. package/dist/lib/ai-test-harness.component.d.ts.map +1 -0
  20. package/dist/lib/ai-test-harness.component.js +3380 -0
  21. package/dist/lib/ai-test-harness.component.js.map +1 -0
  22. package/dist/lib/json-viewer-window.component.d.ts +8 -0
  23. package/dist/lib/json-viewer-window.component.d.ts.map +1 -0
  24. package/dist/lib/json-viewer-window.component.js +57 -0
  25. package/dist/lib/json-viewer-window.component.js.map +1 -0
  26. package/dist/lib/test-harness-dialog.service.d.ts +151 -0
  27. package/dist/lib/test-harness-dialog.service.d.ts.map +1 -0
  28. package/dist/lib/test-harness-dialog.service.js +234 -0
  29. package/dist/lib/test-harness-dialog.service.js.map +1 -0
  30. package/dist/module.d.ts +25 -0
  31. package/dist/module.d.ts.map +1 -0
  32. package/dist/module.js +120 -0
  33. package/dist/module.js.map +1 -0
  34. package/dist/public-api.d.ts +11 -0
  35. package/dist/public-api.d.ts.map +1 -0
  36. package/dist/public-api.js +13 -0
  37. package/dist/public-api.js.map +1 -0
  38. package/package.json +55 -0
package/README.md ADDED
@@ -0,0 +1,187 @@
1
+ # @memberjunction/ng-ai-test-harness
2
+
3
+ A beautiful, reusable Angular component for testing AI agents, prompts, and actions in MemberJunction applications.
4
+
5
+ ## Overview
6
+
7
+ The AI Test Harness provides a comprehensive testing interface supporting three modes:
8
+ - **Agent Mode**: Test AI agents with conversational inputs
9
+ - **Prompt Mode**: Test AI prompts with user messages
10
+ - **Action Mode**: Test actions with parameter inputs
11
+
12
+ ## Features
13
+
14
+ - 🎨 Beautiful, modern UI with smooth animations
15
+ - 🔄 Three testing modes with easy switching
16
+ - ⚙️ Advanced settings (temperature, max tokens, streaming)
17
+ - 📊 Execution history tracking
18
+ - 💬 Real-time streaming responses
19
+ - 💰 Token usage and cost tracking
20
+ - 🔌 Dialog service for programmatic access
21
+ - 🎯 TypeScript support with full type safety
22
+
23
+ ## Installation
24
+
25
+ ```bash
26
+ npm install @memberjunction/ng-ai-test-harness
27
+ ```
28
+
29
+ ## Usage
30
+
31
+ ### Module Import
32
+
33
+ ```typescript
34
+ import { AITestHarnessModule } from '@memberjunction/ng-ai-test-harness';
35
+
36
+ @NgModule({
37
+ imports: [
38
+ AITestHarnessModule,
39
+ // ... other imports
40
+ ]
41
+ })
42
+ export class YourModule { }
43
+ ```
44
+
45
+ ### Component Usage
46
+
47
+ #### Embedded Mode
48
+
49
+ ```html
50
+ <mj-ai-test-harness
51
+ [config]="testConfig"
52
+ [embedded]="true"
53
+ (executionComplete)="onTestComplete($event)"
54
+ (modeChanged)="onModeChanged($event)">
55
+ </mj-ai-test-harness>
56
+ ```
57
+
58
+ ```typescript
59
+ testConfig: TestHarnessConfig = {
60
+ mode: 'agent',
61
+ entityId: 'agent-id-here',
62
+ showHistory: true,
63
+ showAdvancedOptions: false,
64
+ theme: 'light',
65
+ maxHistoryItems: 10
66
+ };
67
+
68
+ onTestComplete(result: TestExecutionResult) {
69
+ console.log('Test completed:', result);
70
+ }
71
+ ```
72
+
73
+ #### Dialog Mode
74
+
75
+ ```typescript
76
+ import { AITestHarnessDialogService } from '@memberjunction/ng-ai-test-harness';
77
+
78
+ constructor(private testHarness: AITestHarnessDialogService) {}
79
+
80
+ // Test an agent
81
+ testAgent() {
82
+ this.testHarness.openForAgent('agent-id').subscribe(result => {
83
+ if (result.success) {
84
+ console.log('Agent test successful:', result);
85
+ }
86
+ });
87
+ }
88
+
89
+ // Test a prompt
90
+ testPrompt() {
91
+ this.testHarness.openForPrompt('prompt-id').subscribe(result => {
92
+ console.log('Prompt test result:', result);
93
+ });
94
+ }
95
+
96
+ // Test an action
97
+ testAction() {
98
+ this.testHarness.openForAction('action-id').subscribe(result => {
99
+ console.log('Action test result:', result);
100
+ });
101
+ }
102
+ ```
103
+
104
+ ## Configuration
105
+
106
+ ### TestHarnessConfig
107
+
108
+ | Property | Type | Default | Description |
109
+ |----------|------|---------|-------------|
110
+ | mode | `'agent' \| 'prompt' \| 'action'` | `'agent'` | Testing mode |
111
+ | entityId | `string` | - | Pre-selected entity ID |
112
+ | showHistory | `boolean` | `true` | Show execution history |
113
+ | showAdvancedOptions | `boolean` | `false` | Show advanced settings |
114
+ | theme | `'light' \| 'dark'` | `'light'` | Visual theme |
115
+ | maxHistoryItems | `number` | `10` | Max history items to display |
116
+
117
+ ### TestExecutionResult
118
+
119
+ ```typescript
120
+ interface TestExecutionResult {
121
+ success: boolean;
122
+ result?: any;
123
+ error?: string;
124
+ executionTime?: number;
125
+ tokensUsed?: number;
126
+ cost?: number;
127
+ }
128
+ ```
129
+
130
+ ## Advanced Features
131
+
132
+ ### Custom Entity Filtering
133
+
134
+ ```typescript
135
+ this.testHarness.open({
136
+ mode: 'agent',
137
+ entityFilter: "Status='Active' AND Category='Customer Service'",
138
+ defaultInput: 'Hello, how can you help me?'
139
+ });
140
+ ```
141
+
142
+ ### Streaming Responses
143
+
144
+ The test harness supports real-time streaming for compatible AI models. Enable streaming in the advanced options panel or programmatically:
145
+
146
+ ```typescript
147
+ this.testHarness.open({
148
+ mode: 'prompt',
149
+ streamResponse: true,
150
+ temperature: 0.7,
151
+ maxTokens: 2000
152
+ });
153
+ ```
154
+
155
+ ## Styling
156
+
157
+ The component uses CSS custom properties for theming:
158
+
159
+ ```scss
160
+ :root {
161
+ --harness-primary: #007bff;
162
+ --harness-success: #28a745;
163
+ --harness-error: #dc3545;
164
+ --harness-background: #f8f9fa;
165
+ --harness-text: #212529;
166
+ }
167
+ ```
168
+
169
+ ## Dependencies
170
+
171
+ - Angular 18.0.2+
172
+ - @memberjunction/core
173
+ - @memberjunction/core-entities
174
+ - @memberjunction/graphql-dataprovider
175
+ - Kendo UI for Angular
176
+
177
+ ## License
178
+
179
+ ISC
180
+
181
+ ## Contributing
182
+
183
+ Contributions are welcome! Please submit pull requests to the MemberJunction repository.
184
+
185
+ ## Support
186
+
187
+ For issues and questions, please use the MemberJunction GitHub repository.
@@ -0,0 +1,273 @@
1
+ import { OnChanges, SimpleChanges, OnDestroy, ElementRef, AfterViewInit, ChangeDetectorRef, ViewContainerRef, EventEmitter } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Progress message with display mode
5
+ */
6
+ export interface ProgressMessage {
7
+ id: string;
8
+ message: string;
9
+ timestamp: Date;
10
+ displayMode: 'live' | 'historical' | 'both';
11
+ metadata?: Record<string, unknown>;
12
+ }
13
+ /**
14
+ * Represents a node in the execution tree with all necessary display information
15
+ */
16
+ export interface ExecutionTreeNode {
17
+ id: string;
18
+ name: string;
19
+ type: 'validation' | 'prompt' | 'action' | 'sub-agent' | 'decision' | 'chat';
20
+ status: 'pending' | 'running' | 'completed' | 'failed';
21
+ startTime?: Date;
22
+ endTime?: Date;
23
+ duration?: number;
24
+ agentPath: string[];
25
+ inputPreview?: string;
26
+ outputPreview?: string;
27
+ error?: string;
28
+ children?: ExecutionTreeNode[];
29
+ expanded?: boolean;
30
+ depth: number;
31
+ tokensUsed?: number;
32
+ cost?: number;
33
+ detailsMarkdown?: string;
34
+ detailsExpanded?: boolean;
35
+ promptCount?: number;
36
+ displayMode?: 'live' | 'historical' | 'both';
37
+ }
38
+ /**
39
+ * Mode for the execution monitor component
40
+ */
41
+ export type ExecutionMonitorMode = 'live' | 'historical';
42
+ /**
43
+ * Execution statistics for display
44
+ */
45
+ export interface ExecutionStats {
46
+ totalSteps: number;
47
+ completedSteps: number;
48
+ failedSteps: number;
49
+ totalTokens: number;
50
+ totalCost: number;
51
+ stepsByType: Record<string, number>;
52
+ totalDuration?: number;
53
+ totalPrompts: number;
54
+ }
55
+ /**
56
+ * AgentExecutionMonitor Component
57
+ *
58
+ * A reusable component for visualizing AI agent execution flow in real-time or historically.
59
+ * Displays a hierarchical tree of execution steps with status, timing, and preview information.
60
+ *
61
+ * Features:
62
+ * - Real-time updates for live executions
63
+ * - Historical playback for completed executions
64
+ * - Collapsible tree structure
65
+ * - Step status indicators with animations
66
+ * - Execution statistics
67
+ * - Token usage and cost tracking
68
+ * - Error display
69
+ * - Input/output preview
70
+ */
71
+ export declare class AgentExecutionMonitorComponent implements OnChanges, OnDestroy, AfterViewInit {
72
+ private cdr;
73
+ mode: ExecutionMonitorMode;
74
+ executionData: any;
75
+ autoExpand: boolean;
76
+ runId: string | null;
77
+ runType: 'agent' | 'prompt';
78
+ viewRunClick: EventEmitter<{
79
+ runId: string;
80
+ runType: 'agent' | 'prompt';
81
+ }>;
82
+ executionTreeContainer: ElementRef<HTMLDivElement>;
83
+ executionNodesContainer: ViewContainerRef;
84
+ executionTree: ExecutionTreeNode[];
85
+ currentStep: ExecutionTreeNode | null;
86
+ private nodeComponentMap;
87
+ stats: ExecutionStats;
88
+ private userHasInteracted;
89
+ private userHasScrolled;
90
+ private isAutoScrolling;
91
+ private lastScrollPosition;
92
+ private scrollThreshold;
93
+ private viewInitialized;
94
+ private processedStepIds;
95
+ private newlyAddedNodeIds;
96
+ private destroy$;
97
+ private updateSubscription?;
98
+ constructor(cdr: ChangeDetectorRef);
99
+ ngOnChanges(changes: SimpleChanges): void;
100
+ ngAfterViewInit(): void;
101
+ ngOnDestroy(): void;
102
+ /**
103
+ * Clear all dynamically created components
104
+ */
105
+ private clearNodeComponents;
106
+ /**
107
+ * Process execution data based on mode
108
+ */
109
+ private processExecutionData;
110
+ /**
111
+ * Build tree from historical execution data
112
+ */
113
+ private buildTreeFromHistoricalData;
114
+ /**
115
+ * Render the execution tree using dynamic components
116
+ */
117
+ private renderTree;
118
+ /**
119
+ * Create a component for a node and its children
120
+ */
121
+ private createNodeComponent;
122
+ /**
123
+ * Convert new execution tree format to display nodes
124
+ */
125
+ private convertExecutionTree;
126
+ /**
127
+ * Convert legacy step format to tree nodes
128
+ */
129
+ private convertLegacySteps;
130
+ /**
131
+ * Map step type strings to our type enum
132
+ */
133
+ private mapStepType;
134
+ /**
135
+ * Map status strings to our status enum
136
+ */
137
+ private mapStepStatus;
138
+ /**
139
+ * Create a preview string from data
140
+ */
141
+ private createPreview;
142
+ /**
143
+ * Extract token count from output data
144
+ */
145
+ private extractTokens;
146
+ /**
147
+ * Extract cost from output data
148
+ */
149
+ private extractCost;
150
+ /**
151
+ * Calculate duration from timestamps
152
+ */
153
+ private calculateDuration;
154
+ /**
155
+ * Set up live updates for real-time execution
156
+ */
157
+ private setupLiveUpdates;
158
+ /**
159
+ * Convert live steps format to execution tree format
160
+ */
161
+ private convertLiveStepsToTree;
162
+ /**
163
+ * Update current step indicator
164
+ */
165
+ private updateCurrentStep;
166
+ /**
167
+ * Mark previously new nodes as completed
168
+ */
169
+ private markPreviouslyNewNodesAsComplete;
170
+ /**
171
+ * Find a node by ID in the tree
172
+ */
173
+ private findNodeById;
174
+ /**
175
+ * Calculate execution statistics
176
+ */
177
+ private calculateStats;
178
+ /**
179
+ * Toggle node expansion
180
+ */
181
+ toggleNode(node: ExecutionTreeNode): void;
182
+ /**
183
+ * Check if node has expandable content
184
+ */
185
+ private hasExpandableContent;
186
+ /**
187
+ * Handle scroll events
188
+ */
189
+ onScroll(event: Event): void;
190
+ /**
191
+ * Handle user clicks (interaction detection)
192
+ */
193
+ onUserInteraction(): void;
194
+ /**
195
+ * Check if scroll is at bottom
196
+ */
197
+ private isScrolledToBottom;
198
+ /**
199
+ * Check if user is at bottom (for initial setup)
200
+ */
201
+ private checkIfUserAtBottom;
202
+ /**
203
+ * Auto-scroll to bottom if user hasn't interacted
204
+ */
205
+ private autoScrollToBottom;
206
+ /**
207
+ * Format agent path for display
208
+ */
209
+ formatAgentPath(path: string[]): string;
210
+ /**
211
+ * Format duration for display
212
+ */
213
+ formatDuration(ms: number): string;
214
+ /**
215
+ * Get step types for display
216
+ */
217
+ getStepTypes(): string[];
218
+ /**
219
+ * Format markdown content for display
220
+ */
221
+ formatMarkdown(markdown: string): string;
222
+ /**
223
+ * Append new live steps without re-rendering entire tree
224
+ */
225
+ private appendNewLiveSteps;
226
+ /**
227
+ * Generate a stable ID for a step based on its content
228
+ */
229
+ private generateStepId;
230
+ /**
231
+ * Find parent node based on depth
232
+ */
233
+ private findParentNode;
234
+ /**
235
+ * Filter nodes based on display mode
236
+ */
237
+ private filterNodesForMode;
238
+ /**
239
+ * Build a map of nodes by ID for quick lookup
240
+ */
241
+ private buildNodeMap;
242
+ /**
243
+ * Create a single node from a live step
244
+ */
245
+ private createNodeFromLiveStep;
246
+ /**
247
+ * Collect all node IDs in the tree
248
+ */
249
+ private collectNodeIds;
250
+ /**
251
+ * Preserve expanded state of all nodes
252
+ */
253
+ private preserveExpandedState;
254
+ /**
255
+ * Restore expanded state of all nodes
256
+ */
257
+ private restoreExpandedState;
258
+ /**
259
+ * Check if execution is complete
260
+ */
261
+ isExecutionComplete(): boolean;
262
+ /**
263
+ * Handle view run button click
264
+ */
265
+ onViewRunClick(): void;
266
+ /**
267
+ * Append a node to its parent based on depth
268
+ */
269
+ private appendToParent;
270
+ static ɵfac: i0.ɵɵFactoryDeclaration<AgentExecutionMonitorComponent, never>;
271
+ static ɵcmp: i0.ɵɵComponentDeclaration<AgentExecutionMonitorComponent, "mj-agent-execution-monitor", never, { "mode": { "alias": "mode"; "required": false; }; "executionData": { "alias": "executionData"; "required": false; }; "autoExpand": { "alias": "autoExpand"; "required": false; }; "runId": { "alias": "runId"; "required": false; }; "runType": { "alias": "runType"; "required": false; }; }, { "viewRunClick": "viewRunClick"; }, never, never, true, never>;
272
+ }
273
+ //# sourceMappingURL=agent-execution-monitor.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-execution-monitor.component.d.ts","sourceRoot":"","sources":["../../src/lib/agent-execution-monitor.component.ts"],"names":[],"mappings":"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"}