@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
@@ -0,0 +1,98 @@
1
+ import { EventEmitter, OnInit, ChangeDetectorRef, AfterViewInit } from '@angular/core';
2
+ import { AIAgentEntity, AIPromptEntity } from '@memberjunction/core-entities';
3
+ import { AITestHarnessComponent } from './ai-test-harness.component';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Configuration data interface for the AI Test Harness Dialog.
7
+ * Provides all necessary options for initializing the dialog with appropriate
8
+ * agent/prompt data, dimensions, and initial variable configurations.
9
+ */
10
+ export interface AITestHarnessDialogData {
11
+ /** ID of the AI agent to load (alternative to providing agent entity) */
12
+ agentId?: string;
13
+ /** Pre-loaded AI agent entity (alternative to providing agentId) */
14
+ agent?: AIAgentEntity;
15
+ /** ID of the AI prompt to load (alternative to providing prompt entity) */
16
+ promptId?: string;
17
+ /** Pre-loaded AI prompt entity (alternative to providing promptId) */
18
+ prompt?: AIPromptEntity;
19
+ /** Custom dialog title (defaults to agent/prompt name) */
20
+ title?: string;
21
+ /** Dialog width in CSS units or viewport percentage */
22
+ width?: string | number;
23
+ /** Dialog height in CSS units or viewport percentage */
24
+ height?: string | number;
25
+ /** Initial data context variables for agent execution */
26
+ initialDataContext?: Record<string, any>;
27
+ /** Initial template data variables for prompt rendering */
28
+ initialTemplateData?: Record<string, any>;
29
+ /** Initial template variables for prompt execution */
30
+ initialTemplateVariables?: Record<string, any>;
31
+ /** Pre-selected AI model ID for prompt execution */
32
+ selectedModelId?: string;
33
+ /** Mode of operation - 'agent' or 'prompt' */
34
+ mode?: 'agent' | 'prompt';
35
+ }
36
+ /**
37
+ * Dialog wrapper component for the AI Agent Test Harness.
38
+ * Provides a modal dialog interface with proper sizing, header, and close functionality.
39
+ * Automatically loads agent data and initializes the test harness with provided configuration.
40
+ *
41
+ * ## Features:
42
+ * - **Automatic Agent Loading**: Loads agent by ID or uses provided entity
43
+ * - **Configurable Dimensions**: Supports custom dialog sizing
44
+ * - **Initial Data Setup**: Pre-populates data context and template variables
45
+ * - **Clean Dialog Interface**: Professional header with close button
46
+ * - **Responsive Layout**: Adapts to content and screen size
47
+ *
48
+ * ## Usage:
49
+ * This component is typically opened through the `TestHarnessDialogService` rather than directly:
50
+ * ```typescript
51
+ * const dialogRef = this.testHarnessService.openAgentTestHarness({
52
+ * agentId: 'agent-123',
53
+ * initialDataContext: { userId: 'user-456' }
54
+ * });
55
+ * ```
56
+ */
57
+ export declare class AITestHarnessDialogComponent implements OnInit, AfterViewInit {
58
+ private cdr;
59
+ /** Reference to the embedded test harness component */
60
+ testHarness: AITestHarnessComponent;
61
+ /** The loaded AI agent entity for testing */
62
+ agent: AIAgentEntity | null;
63
+ /** The loaded AI prompt entity for testing */
64
+ prompt: AIPromptEntity | null;
65
+ /** The mode of operation - either 'agent' or 'prompt' */
66
+ mode: 'agent' | 'prompt';
67
+ /** Display title for the dialog header */
68
+ title: string;
69
+ /** Configuration data passed from the dialog service */
70
+ data: AITestHarnessDialogData;
71
+ /** Event emitted when the dialog should be closed */
72
+ closeDialog: EventEmitter<void>;
73
+ constructor(cdr: ChangeDetectorRef);
74
+ /**
75
+ * Initializes the dialog component by loading agent/prompt data and configuring
76
+ * the embedded test harness with initial variables and settings.
77
+ */
78
+ ngOnInit(): Promise<void>;
79
+ /**
80
+ * AfterViewInit lifecycle hook to set initial data after view is initialized
81
+ */
82
+ ngAfterViewInit(): void;
83
+ /**
84
+ * Determines the appropriate variable type for initial data configuration.
85
+ * @param value - The value to analyze for type detection
86
+ * @returns The detected variable type
87
+ * @private
88
+ */
89
+ private detectVariableType;
90
+ /**
91
+ * Closes the dialog by emitting the close event.
92
+ * This method is called by the close button in the header.
93
+ */
94
+ close(): void;
95
+ static ɵfac: i0.ɵɵFactoryDeclaration<AITestHarnessDialogComponent, never>;
96
+ static ɵcmp: i0.ɵɵComponentDeclaration<AITestHarnessDialogComponent, "mj-ai-test-harness-dialog", never, { "data": { "alias": "data"; "required": false; }; }, { "closeDialog": "closeDialog"; }, never, never, false, never>;
97
+ }
98
+ //# sourceMappingURL=ai-test-harness-dialog.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-test-harness-dialog.component.d.ts","sourceRoot":"","sources":["../../src/lib/ai-test-harness-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAa,iBAAiB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5H,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;;AAErE;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACpC,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,yDAAyD;IACzD,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACzC,2DAA2D;IAC3D,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1C,sDAAsD;IACtD,wBAAwB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/C,oDAAoD;IACpD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAwEa,4BAA6B,YAAW,MAAM,EAAE,aAAa;IAsB1D,OAAO,CAAC,GAAG;IArBvB,uDAAuD;IACV,WAAW,EAAG,sBAAsB,CAAC;IAElF,6CAA6C;IAC7C,KAAK,EAAE,aAAa,GAAG,IAAI,CAAQ;IAEnC,8CAA8C;IAC9C,MAAM,EAAE,cAAc,GAAG,IAAI,CAAQ;IAErC,yDAAyD;IACzD,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAW;IAEnC,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAqB;IAElC,wDAAwD;IAC/C,IAAI,EAAE,uBAAuB,CAAM;IAE5C,qDAAqD;IAC3C,WAAW,qBAA4B;gBAE7B,GAAG,EAAE,iBAAiB;IAE1C;;;OAGG;IACG,QAAQ;IA2Cd;;OAEG;IACH,eAAe,IAAI,IAAI;IA2CvB;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IAO1B;;;OAGG;IACH,KAAK,IAAI,IAAI;yCAtIJ,4BAA4B;2CAA5B,4BAA4B;CAyIxC"}
@@ -0,0 +1,206 @@
1
+ import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
2
+ import { Metadata } from '@memberjunction/core';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./ai-test-harness.component";
5
+ const _c0 = ["testHarness"];
6
+ /**
7
+ * Dialog wrapper component for the AI Agent Test Harness.
8
+ * Provides a modal dialog interface with proper sizing, header, and close functionality.
9
+ * Automatically loads agent data and initializes the test harness with provided configuration.
10
+ *
11
+ * ## Features:
12
+ * - **Automatic Agent Loading**: Loads agent by ID or uses provided entity
13
+ * - **Configurable Dimensions**: Supports custom dialog sizing
14
+ * - **Initial Data Setup**: Pre-populates data context and template variables
15
+ * - **Clean Dialog Interface**: Professional header with close button
16
+ * - **Responsive Layout**: Adapts to content and screen size
17
+ *
18
+ * ## Usage:
19
+ * This component is typically opened through the `TestHarnessDialogService` rather than directly:
20
+ * ```typescript
21
+ * const dialogRef = this.testHarnessService.openAgentTestHarness({
22
+ * agentId: 'agent-123',
23
+ * initialDataContext: { userId: 'user-456' }
24
+ * });
25
+ * ```
26
+ */
27
+ export class AITestHarnessDialogComponent {
28
+ constructor(cdr) {
29
+ this.cdr = cdr;
30
+ /** The loaded AI agent entity for testing */
31
+ this.agent = null;
32
+ /** The loaded AI prompt entity for testing */
33
+ this.prompt = null;
34
+ /** The mode of operation - either 'agent' or 'prompt' */
35
+ this.mode = 'agent';
36
+ /** Display title for the dialog header */
37
+ this.title = 'AI Test Harness';
38
+ /** Configuration data passed from the dialog service */
39
+ this.data = {};
40
+ /** Event emitted when the dialog should be closed */
41
+ this.closeDialog = new EventEmitter();
42
+ }
43
+ /**
44
+ * Initializes the dialog component by loading agent/prompt data and configuring
45
+ * the embedded test harness with initial variables and settings.
46
+ */
47
+ async ngOnInit() {
48
+ // Set mode from data
49
+ if (this.data.mode) {
50
+ this.mode = this.data.mode;
51
+ }
52
+ if (this.data.title) {
53
+ this.title = this.data.title;
54
+ }
55
+ const md = new Metadata();
56
+ // Load entity based on mode
57
+ if (this.mode === 'agent' || (!this.data.promptId && !this.data.prompt)) {
58
+ // Agent mode
59
+ if (this.data.agentId && !this.data.agent) {
60
+ this.agent = await md.GetEntityObject('AI Agents');
61
+ await this.agent.Load(this.data.agentId);
62
+ if (this.agent) {
63
+ this.title = this.title || `Test Harness: ${this.agent.Name}`;
64
+ }
65
+ }
66
+ else if (this.data.agent) {
67
+ this.agent = this.data.agent;
68
+ this.title = this.title || `Test Harness: ${this.agent.Name}`;
69
+ }
70
+ }
71
+ else {
72
+ // Prompt mode
73
+ this.mode = 'prompt';
74
+ if (this.data.promptId && !this.data.prompt) {
75
+ this.prompt = await md.GetEntityObject('AI Prompts');
76
+ await this.prompt.Load(this.data.promptId);
77
+ if (this.prompt) {
78
+ this.title = this.title || `Test Harness: ${this.prompt.Name}`;
79
+ }
80
+ }
81
+ else if (this.data.prompt) {
82
+ this.prompt = this.data.prompt;
83
+ this.title = this.title || `Test Harness: ${this.prompt.Name}`;
84
+ }
85
+ }
86
+ }
87
+ /**
88
+ * AfterViewInit lifecycle hook to set initial data after view is initialized
89
+ */
90
+ ngAfterViewInit() {
91
+ if (this.testHarness) {
92
+ if (this.mode === 'agent') {
93
+ // Agent mode: set agent variables
94
+ if (this.data.initialDataContext) {
95
+ const variables = Object.entries(this.data.initialDataContext).map(([name, value]) => ({
96
+ name,
97
+ value: typeof value === 'object' ? JSON.stringify(value) : String(value),
98
+ type: this.detectVariableType(value)
99
+ }));
100
+ this.testHarness.agentVariables = variables;
101
+ }
102
+ if (this.data.initialTemplateData) {
103
+ const templateVariables = Object.entries(this.data.initialTemplateData).map(([name, value]) => ({
104
+ name,
105
+ value: typeof value === 'object' ? JSON.stringify(value) : String(value),
106
+ type: this.detectVariableType(value)
107
+ }));
108
+ this.testHarness.agentVariables = [...this.testHarness.agentVariables, ...templateVariables];
109
+ }
110
+ }
111
+ else {
112
+ // Prompt mode: set template variables
113
+ if (this.data.initialTemplateVariables) {
114
+ const variables = Object.entries(this.data.initialTemplateVariables).map(([name, value]) => ({
115
+ name,
116
+ value: typeof value === 'object' ? JSON.stringify(value) : String(value),
117
+ type: this.detectVariableType(value)
118
+ }));
119
+ this.testHarness.templateVariables = variables;
120
+ }
121
+ // Set selected model if provided
122
+ if (this.data.selectedModelId) {
123
+ this.testHarness.selectedModelId = this.data.selectedModelId;
124
+ }
125
+ }
126
+ // Trigger change detection to ensure view updates
127
+ this.cdr.detectChanges();
128
+ }
129
+ }
130
+ /**
131
+ * Determines the appropriate variable type for initial data configuration.
132
+ * @param value - The value to analyze for type detection
133
+ * @returns The detected variable type
134
+ * @private
135
+ */
136
+ detectVariableType(value) {
137
+ if (typeof value === 'boolean')
138
+ return 'boolean';
139
+ if (typeof value === 'number')
140
+ return 'number';
141
+ if (typeof value === 'object')
142
+ return 'object';
143
+ return 'string';
144
+ }
145
+ /**
146
+ * Closes the dialog by emitting the close event.
147
+ * This method is called by the close button in the header.
148
+ */
149
+ close() {
150
+ this.closeDialog.emit();
151
+ }
152
+ static { this.ɵfac = function AITestHarnessDialogComponent_Factory(t) { return new (t || AITestHarnessDialogComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; }
153
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AITestHarnessDialogComponent, selectors: [["mj-ai-test-harness-dialog"]], viewQuery: function AITestHarnessDialogComponent_Query(rf, ctx) { if (rf & 1) {
154
+ i0.ɵɵviewQuery(_c0, 5);
155
+ } if (rf & 2) {
156
+ let _t;
157
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.testHarness = _t.first);
158
+ } }, inputs: { data: "data" }, outputs: { closeDialog: "closeDialog" }, decls: 9, vars: 4, consts: [["testHarness", ""], [1, "test-harness-dialog"], [1, "dialog-header"], [1, "close-button", 3, "click"], [1, "fa-solid", "fa-times"], [1, "dialog-content"], [3, "mode", "entity", "isVisible"]], template: function AITestHarnessDialogComponent_Template(rf, ctx) { if (rf & 1) {
159
+ const _r1 = i0.ɵɵgetCurrentView();
160
+ i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "h2");
161
+ i0.ɵɵtext(3);
162
+ i0.ɵɵelementEnd();
163
+ i0.ɵɵelementStart(4, "button", 3);
164
+ i0.ɵɵlistener("click", function AITestHarnessDialogComponent_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.close()); });
165
+ i0.ɵɵelement(5, "i", 4);
166
+ i0.ɵɵelementEnd()();
167
+ i0.ɵɵelementStart(6, "div", 5);
168
+ i0.ɵɵelement(7, "mj-ai-test-harness", 6, 0);
169
+ i0.ɵɵelementEnd()();
170
+ } if (rf & 2) {
171
+ i0.ɵɵadvance(3);
172
+ i0.ɵɵtextInterpolate(ctx.title);
173
+ i0.ɵɵadvance(4);
174
+ i0.ɵɵproperty("mode", ctx.mode)("entity", ctx.mode === "agent" ? ctx.agent : ctx.prompt)("isVisible", true);
175
+ } }, dependencies: [i1.AITestHarnessComponent], styles: [".test-harness-dialog[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n }\n\n .dialog-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 24px;\n border-bottom: 1px solid #e0e0e0;\n background-color: #f5f5f5;\n }\n\n .dialog-header[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 500;\n }\n\n .close-button[_ngcontent-%COMP%] {\n position: relative;\n top: -4px;\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: background-color 0.2s;\n }\n \n .close-button[_ngcontent-%COMP%]:hover {\n background-color: rgba(0, 0, 0, 0.04);\n }\n\n .dialog-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n padding: 0;\n }\n\n [_nghost-%COMP%] .test-harness-container {\n height: 100%;\n }"] }); }
176
+ }
177
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AITestHarnessDialogComponent, [{
178
+ type: Component,
179
+ args: [{ selector: 'mj-ai-test-harness-dialog', template: `
180
+ <div class="test-harness-dialog">
181
+ <div class="dialog-header">
182
+ <h2>{{ title }}</h2>
183
+ <button class="close-button" (click)="close()">
184
+ <i class="fa-solid fa-times"></i>
185
+ </button>
186
+ </div>
187
+ <div class="dialog-content">
188
+ <mj-ai-test-harness
189
+ #testHarness
190
+ [mode]="mode"
191
+ [entity]="mode === 'agent' ? agent : prompt"
192
+ [isVisible]="true">
193
+ </mj-ai-test-harness>
194
+ </div>
195
+ </div>
196
+ `, styles: ["\n .test-harness-dialog {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n }\n\n .dialog-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 24px;\n border-bottom: 1px solid #e0e0e0;\n background-color: #f5f5f5;\n }\n\n .dialog-header h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 500;\n }\n\n .close-button {\n position: relative;\n top: -4px;\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: background-color 0.2s;\n }\n \n .close-button:hover {\n background-color: rgba(0, 0, 0, 0.04);\n }\n\n .dialog-content {\n flex: 1;\n overflow: hidden;\n padding: 0;\n }\n\n :host ::ng-deep .test-harness-container {\n height: 100%;\n }\n "] }]
197
+ }], () => [{ type: i0.ChangeDetectorRef }], { testHarness: [{
198
+ type: ViewChild,
199
+ args: ['testHarness', { static: false }]
200
+ }], data: [{
201
+ type: Input
202
+ }], closeDialog: [{
203
+ type: Output
204
+ }] }); })();
205
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AITestHarnessDialogComponent, { className: "AITestHarnessDialogComponent", filePath: "lib/ai-test-harness-dialog.component.ts", lineNumber: 131 }); })();
206
+ //# sourceMappingURL=ai-test-harness-dialog.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-test-harness-dialog.component.js","sourceRoot":"","sources":["../../src/lib/ai-test-harness-dialog.component.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { ViewContainerRef } from '@angular/core';
2
+ import { Observable } from 'rxjs';
3
+ import { TestHarnessDialogService } from './test-harness-dialog.service';
4
+ import * as i0 from "@angular/core";
5
+ export interface TestResult {
6
+ success: boolean;
7
+ result?: any;
8
+ error?: string;
9
+ executionTime?: number;
10
+ tokensUsed?: number;
11
+ cost?: number;
12
+ }
13
+ /**
14
+ * Service for opening AI test harness dialogs for agents and prompts.
15
+ * This service wraps the TestHarnessDialogService to provide a simpler API
16
+ * that matches the expected interface in consuming components.
17
+ */
18
+ export declare class AITestHarnessDialogService {
19
+ private testHarnessService;
20
+ constructor(testHarnessService: TestHarnessDialogService);
21
+ /**
22
+ * Opens the test harness dialog for an AI Agent
23
+ */
24
+ openForAgent(agentId: string, viewContainerRef?: ViewContainerRef): Observable<TestResult>;
25
+ /**
26
+ * Opens the test harness dialog for an AI Prompt
27
+ */
28
+ openForPrompt(promptId: string, viewContainerRef?: ViewContainerRef): Observable<TestResult>;
29
+ static ɵfac: i0.ɵɵFactoryDeclaration<AITestHarnessDialogService, never>;
30
+ static ɵprov: i0.ɵɵInjectableDeclaration<AITestHarnessDialogService>;
31
+ }
32
+ //# sourceMappingURL=ai-test-harness-dialog.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-test-harness-dialog.service.d.ts","sourceRoot":"","sources":["../../src/lib/ai-test-harness-dialog.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAE7D,OAAO,EAAE,UAAU,EAAW,MAAM,MAAM,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;;AAEzE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,qBAGa,0BAA0B;IACzB,OAAO,CAAC,kBAAkB;gBAAlB,kBAAkB,EAAE,wBAAwB;IAEhE;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,UAAU,CAAC,UAAU,CAAC;IA+C1F;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,UAAU,CAAC,UAAU,CAAC;yCAxDjF,0BAA0B;6CAA1B,0BAA0B;CAuGtC"}
@@ -0,0 +1,120 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./test-harness-dialog.service";
5
+ /**
6
+ * Service for opening AI test harness dialogs for agents and prompts.
7
+ * This service wraps the TestHarnessDialogService to provide a simpler API
8
+ * that matches the expected interface in consuming components.
9
+ */
10
+ export class AITestHarnessDialogService {
11
+ constructor(testHarnessService) {
12
+ this.testHarnessService = testHarnessService;
13
+ }
14
+ /**
15
+ * Opens the test harness dialog for an AI Agent
16
+ */
17
+ openForAgent(agentId, viewContainerRef) {
18
+ const resultSubject = new Subject();
19
+ try {
20
+ const dialogRef = this.testHarnessService.openAgentTestHarness({
21
+ agentId: agentId,
22
+ title: 'Test AI Agent',
23
+ width: '80vw',
24
+ height: '80vh'
25
+ });
26
+ // Convert dialog close to test result
27
+ dialogRef.result.subscribe({
28
+ next: (result) => {
29
+ if (result) {
30
+ resultSubject.next({
31
+ success: true,
32
+ result: result,
33
+ executionTime: 0
34
+ });
35
+ }
36
+ else {
37
+ resultSubject.next({
38
+ success: false,
39
+ error: 'Test cancelled'
40
+ });
41
+ }
42
+ resultSubject.complete();
43
+ },
44
+ error: (error) => {
45
+ resultSubject.next({
46
+ success: false,
47
+ error: error.message || 'Test failed'
48
+ });
49
+ resultSubject.complete();
50
+ }
51
+ });
52
+ }
53
+ catch (error) {
54
+ resultSubject.next({
55
+ success: false,
56
+ error: error.message || 'Failed to open test harness'
57
+ });
58
+ resultSubject.complete();
59
+ }
60
+ return resultSubject.asObservable();
61
+ }
62
+ /**
63
+ * Opens the test harness dialog for an AI Prompt
64
+ */
65
+ openForPrompt(promptId, viewContainerRef) {
66
+ const resultSubject = new Subject();
67
+ try {
68
+ // Use the prompt-specific test harness method
69
+ const dialogRef = this.testHarnessService.openPromptTestHarness({
70
+ promptId: promptId,
71
+ title: 'Test AI Prompt',
72
+ width: '80vw',
73
+ height: '80vh'
74
+ });
75
+ // Convert dialog close to test result
76
+ dialogRef.result.subscribe({
77
+ next: (result) => {
78
+ if (result) {
79
+ resultSubject.next({
80
+ success: true,
81
+ result: result,
82
+ executionTime: 0
83
+ });
84
+ }
85
+ else {
86
+ resultSubject.next({
87
+ success: false,
88
+ error: 'Test cancelled'
89
+ });
90
+ }
91
+ resultSubject.complete();
92
+ },
93
+ error: (error) => {
94
+ resultSubject.next({
95
+ success: false,
96
+ error: error.message || 'Test failed'
97
+ });
98
+ resultSubject.complete();
99
+ }
100
+ });
101
+ }
102
+ catch (error) {
103
+ resultSubject.next({
104
+ success: false,
105
+ error: error.message || 'Failed to open test harness'
106
+ });
107
+ resultSubject.complete();
108
+ }
109
+ return resultSubject.asObservable();
110
+ }
111
+ static { this.ɵfac = function AITestHarnessDialogService_Factory(t) { return new (t || AITestHarnessDialogService)(i0.ɵɵinject(i1.TestHarnessDialogService)); }; }
112
+ static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: AITestHarnessDialogService, factory: AITestHarnessDialogService.ɵfac, providedIn: 'root' }); }
113
+ }
114
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AITestHarnessDialogService, [{
115
+ type: Injectable,
116
+ args: [{
117
+ providedIn: 'root'
118
+ }]
119
+ }], () => [{ type: i1.TestHarnessDialogService }], null); })();
120
+ //# sourceMappingURL=ai-test-harness-dialog.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-test-harness-dialog.service.js","sourceRoot":"","sources":["../../src/lib/ai-test-harness-dialog.service.ts"],"names":[],"mappings":"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"}