@memberjunction/ng-core-entity-forms 2.75.0 → 2.77.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 (87) hide show
  1. package/README.md +124 -0
  2. package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-diagram.component.d.ts +109 -0
  3. package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-diagram.component.d.ts.map +1 -0
  4. package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-diagram.component.js +2020 -0
  5. package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-diagram.component.js.map +1 -0
  6. package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.d.ts +32 -0
  7. package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.d.ts.map +1 -0
  8. package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.js +413 -0
  9. package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.js.map +1 -0
  10. package/dist/lib/custom/AIAgents/FlowAgentType/step-info-control.component.d.ts +9 -0
  11. package/dist/lib/custom/AIAgents/FlowAgentType/step-info-control.component.d.ts.map +1 -0
  12. package/dist/lib/custom/AIAgents/FlowAgentType/step-info-control.component.js +84 -0
  13. package/dist/lib/custom/AIAgents/FlowAgentType/step-info-control.component.js.map +1 -0
  14. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +34 -6
  15. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  16. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +656 -520
  17. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  18. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +223 -221
  19. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  20. package/dist/lib/custom/Actions/action-execution-log-form.component.js +51 -49
  21. package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
  22. package/dist/lib/custom/Actions/action-test-harness.component.d.ts.map +1 -1
  23. package/dist/lib/custom/Actions/action-test-harness.component.js +5 -3
  24. package/dist/lib/custom/Actions/action-test-harness.component.js.map +1 -1
  25. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +160 -158
  26. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
  27. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts.map +1 -1
  28. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js +3 -6
  29. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js.map +1 -1
  30. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts +49 -0
  31. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -0
  32. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +211 -0
  33. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -0
  34. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts +33 -0
  35. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts.map +1 -0
  36. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +265 -0
  37. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js.map +1 -0
  38. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +4 -8
  39. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
  40. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +47 -163
  41. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  42. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts +71 -0
  43. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts.map +1 -0
  44. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js +931 -0
  45. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js.map +1 -0
  46. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +6 -4
  47. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
  48. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +202 -297
  49. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  50. package/dist/lib/custom/custom-forms.module.d.ts +30 -25
  51. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  52. package/dist/lib/custom/custom-forms.module.js +31 -4
  53. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  54. package/dist/lib/generated/Entities/AIAgent/aiagent.form.component.js +34 -14
  55. package/dist/lib/generated/Entities/AIAgent/aiagent.form.component.js.map +1 -1
  56. package/dist/lib/generated/Entities/AIAgentStep/aiagentstep.form.component.d.ts +10 -0
  57. package/dist/lib/generated/Entities/AIAgentStep/aiagentstep.form.component.d.ts.map +1 -0
  58. package/dist/lib/generated/Entities/AIAgentStep/aiagentstep.form.component.js +80 -0
  59. package/dist/lib/generated/Entities/AIAgentStep/aiagentstep.form.component.js.map +1 -0
  60. package/dist/lib/generated/Entities/AIAgentStep/sections/details.component.d.ts +11 -0
  61. package/dist/lib/generated/Entities/AIAgentStep/sections/details.component.d.ts.map +1 -0
  62. package/dist/lib/generated/Entities/AIAgentStep/sections/details.component.js +277 -0
  63. package/dist/lib/generated/Entities/AIAgentStep/sections/details.component.js.map +1 -0
  64. package/dist/lib/generated/Entities/AIAgentStepPath/aiagentsteppath.form.component.d.ts +10 -0
  65. package/dist/lib/generated/Entities/AIAgentStepPath/aiagentsteppath.form.component.d.ts.map +1 -0
  66. package/dist/lib/generated/Entities/AIAgentStepPath/aiagentsteppath.form.component.js +59 -0
  67. package/dist/lib/generated/Entities/AIAgentStepPath/aiagentsteppath.form.component.js.map +1 -0
  68. package/dist/lib/generated/Entities/AIAgentStepPath/sections/details.component.d.ts +11 -0
  69. package/dist/lib/generated/Entities/AIAgentStepPath/sections/details.component.d.ts.map +1 -0
  70. package/dist/lib/generated/Entities/AIAgentStepPath/sections/details.component.js +147 -0
  71. package/dist/lib/generated/Entities/AIAgentStepPath/sections/details.component.js.map +1 -0
  72. package/dist/lib/generated/Entities/AIAgentType/sections/details.component.d.ts.map +1 -1
  73. package/dist/lib/generated/Entities/AIAgentType/sections/details.component.js +31 -4
  74. package/dist/lib/generated/Entities/AIAgentType/sections/details.component.js.map +1 -1
  75. package/dist/lib/generated/Entities/AIPrompt/aiprompt.form.component.js +16 -6
  76. package/dist/lib/generated/Entities/AIPrompt/aiprompt.form.component.js.map +1 -1
  77. package/dist/lib/generated/Entities/Action/action.form.component.js +19 -9
  78. package/dist/lib/generated/Entities/Action/action.form.component.js.map +1 -1
  79. package/dist/lib/generated/generated-forms.module.d.ts +294 -285
  80. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  81. package/dist/lib/generated/generated-forms.module.js +183 -110
  82. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  83. package/dist/public-api.d.ts +2 -0
  84. package/dist/public-api.d.ts.map +1 -1
  85. package/dist/public-api.js +3 -0
  86. package/dist/public-api.js.map +1 -1
  87. package/package.json +21 -17
package/README.md CHANGED
@@ -252,3 +252,127 @@ Each entity form typically follows this structure:
252
252
  - @memberjunction/ng-notifications
253
253
  - @memberjunction/graphql-dataprovider
254
254
 
255
+ ## AI Agent Type UI Customization
256
+
257
+ ### Overview
258
+
259
+ The AI Agent Type UI Customization feature allows AI Agent Types to define custom form sections or complete form overrides in the AI Agent form UI. This enables different agent types (like Flow, Analysis, Support, etc.) to have specialized UI components tailored to their specific configuration needs.
260
+
261
+ ### Database Schema
262
+
263
+ The `AIAgentType` table includes three columns for UI customization (added in v2.76):
264
+
265
+ - `UIFormSectionKey` (NVARCHAR(500) NULL) - Registration key for custom form section component
266
+ - `UIFormKey` (NVARCHAR(500) NULL) - Registration key for complete form override component
267
+ - `UIFormSectionExpandedByDefault` (BIT NOT NULL DEFAULT 1) - Whether custom section starts expanded
268
+
269
+ ### Implementation Details
270
+
271
+ #### Dynamic Component Loading
272
+
273
+ The AI Agent form (`ai-agent-form.component.ts`) implements dynamic loading:
274
+ - Loads the agent type when the form initializes
275
+ - Checks for `UIFormSectionKey` on the agent type
276
+ - Dynamically loads and instantiates the custom section component
277
+ - Propagates `EditMode` changes to the custom section
278
+
279
+ #### Component Registration
280
+
281
+ Custom form sections must:
282
+ - Extend `BaseFormSectionComponent`
283
+ - Use `@RegisterClass` decorator with key pattern: `AI Agents.{SectionKey}`
284
+ - Implement standard form section lifecycle
285
+
286
+ Example:
287
+ ```typescript
288
+ @RegisterClass(BaseFormSectionComponent, 'AI Agents.FlowAgentSection')
289
+ export class FlowAgentFormSectionComponent extends BaseFormSectionComponent {
290
+ // Implementation
291
+ }
292
+ ```
293
+
294
+ #### Flow Agent Example
295
+
296
+ The `FlowAgentFormSectionComponent` demonstrates a complete implementation:
297
+ - Loads AIAgentStep and AIAgentStepPath entities for the agent
298
+ - Displays workflow steps and paths in a structured view
299
+ - Shows starting steps with special highlighting
300
+ - Provides refresh functionality in edit mode
301
+ - Includes status indicators (Active/Pending/Disabled)
302
+ - Shows action input/output mappings
303
+
304
+ ### Usage Guide
305
+
306
+ #### Creating a Custom Form Section
307
+
308
+ 1. **Create the Component**
309
+ ```typescript
310
+ @Component({
311
+ selector: 'mj-custom-agent-section',
312
+ template: `...`,
313
+ styles: [`...`]
314
+ })
315
+ @RegisterClass(BaseFormSectionComponent, 'AI Agents.CustomSection')
316
+ export class CustomAgentSectionComponent extends BaseFormSectionComponent {
317
+ // Access this.record for the current AIAgentEntity
318
+ // Use this.EditMode to determine read/write state
319
+ }
320
+ ```
321
+
322
+ 2. **Register in Module**
323
+ - Add to declarations and exports in `custom-forms.module.ts`
324
+ - Export from `public-api.ts` if needed externally
325
+
326
+ 3. **Update Agent Type**
327
+ ```sql
328
+ UPDATE AIAgentType
329
+ SET UIFormSectionKey = 'CustomSection',
330
+ UIFormSectionExpandedByDefault = 1
331
+ WHERE Name = 'YourAgentType';
332
+ ```
333
+
334
+ #### Complete Form Override
335
+
336
+ For complete form replacement (not just a section), use `UIFormKey`:
337
+ ```sql
338
+ UPDATE AIAgentType
339
+ SET UIFormKey = 'CustomCompleteForm'
340
+ WHERE Name = 'YourAgentType';
341
+ ```
342
+
343
+ The custom form component should extend `BaseFormComponent` instead.
344
+
345
+ ### Architecture
346
+
347
+ #### Component Hierarchy
348
+ ```
349
+ AIAgentFormComponent (generated)
350
+ └── AIAgentFormComponentExtended (custom)
351
+ └── Dynamic Custom Section (via ViewContainerRef)
352
+ └── FlowAgentFormSectionComponent (or other custom section)
353
+ ```
354
+
355
+ #### Data Flow
356
+ 1. Form loads agent record
357
+ 2. Form queries agent type for UI customization keys
358
+ 3. Form uses MJGlobal.ClassFactory to resolve component class
359
+ 4. Form creates component instance in ViewContainerRef
360
+ 5. Form passes record and EditMode to custom component
361
+ 6. Custom component manages its own UI and data loading
362
+
363
+ ### Best Practices
364
+
365
+ 1. **Lazy Loading**: Custom sections should load their data only when needed
366
+ 2. **Error Handling**: Handle data loading errors gracefully with user feedback
367
+ 3. **Edit Mode**: Respect EditMode for read-only vs editable states
368
+ 4. **Performance**: Use batch queries (RunViews) for loading related data
369
+ 5. **Styling**: Follow existing MJ UI patterns and styles
370
+ 6. **Type Safety**: Always use proper entity types, never `any`
371
+
372
+ ### Future Enhancements
373
+
374
+ 1. **Visual Flow Editor**: Integrate a proper flow visualization library (when Angular 18 compatible)
375
+ 2. **Drag & Drop**: Allow visual workflow editing with drag and drop
376
+ 3. **Conditional UI**: Show/hide sections based on agent configuration
377
+ 4. **Template Library**: Pre-built custom sections for common agent types
378
+
@@ -0,0 +1,109 @@
1
+ import { OnInit, OnDestroy, ElementRef, SimpleChanges, OnChanges, AfterViewInit, EventEmitter } from '@angular/core';
2
+ import { AIAgentStepEntity, AIAgentStepPathEntity } from '@memberjunction/core-entities';
3
+ import { DialogService } from '@progress/kendo-angular-dialog';
4
+ import * as i0 from "@angular/core";
5
+ export declare class FlowAgentDiagramComponent implements OnInit, OnDestroy, OnChanges, AfterViewInit {
6
+ private dialogService;
7
+ reteContainer: ElementRef<HTMLDivElement>;
8
+ constructor(dialogService: DialogService);
9
+ agentId: string | null;
10
+ steps: AIAgentStepEntity[];
11
+ paths: AIAgentStepPathEntity[];
12
+ EditMode: boolean;
13
+ stepsChanged: EventEmitter<void>;
14
+ pathsChanged: EventEmitter<void>;
15
+ loading: boolean;
16
+ error: string | null;
17
+ selectedItem: {
18
+ type: 'step' | 'path';
19
+ id: string;
20
+ } | null;
21
+ selectedStep: AIAgentStepEntity | null;
22
+ selectedPath: AIAgentStepPathEntity | null;
23
+ connectionMode: boolean;
24
+ connectionSourceStepId: string | null;
25
+ tempConnection: {
26
+ path: string;
27
+ } | null;
28
+ contextMenu: {
29
+ visible: boolean;
30
+ x: number;
31
+ y: number;
32
+ type: "path" | "step" | null;
33
+ targetId: string | null;
34
+ };
35
+ stepTypes: string[];
36
+ stepStatuses: string[];
37
+ panZoom: {
38
+ scale: number;
39
+ translateX: number;
40
+ translateY: number;
41
+ isPanning: boolean;
42
+ startX: number;
43
+ startY: number;
44
+ };
45
+ private destroy$;
46
+ private nodeElements;
47
+ private connectionElements;
48
+ private positionChanges$;
49
+ private dragState;
50
+ ngOnInit(): void;
51
+ ngAfterViewInit(): void;
52
+ ngOnChanges(changes: SimpleChanges): void;
53
+ ngOnDestroy(): void;
54
+ private initializeDiagram;
55
+ private createNodeElement;
56
+ private createConnectionElement;
57
+ private createNodesAndConnections;
58
+ private arrangeNodes;
59
+ private updateConnections;
60
+ private fitToView;
61
+ private truncateText;
62
+ private cleanup;
63
+ private onNodeMouseDown;
64
+ private onMouseMove;
65
+ private onMouseUp;
66
+ private saveStepPosition;
67
+ addNewStep(): Promise<void>;
68
+ autoArrange(): Promise<void>;
69
+ private onNodeClick;
70
+ private onPathClick;
71
+ private selectStep;
72
+ private selectPath;
73
+ private clearSelection;
74
+ closeProperties(): void;
75
+ connectFromStep(): void;
76
+ cancelConnectionMode(): void;
77
+ private handleConnectionCreation;
78
+ onSvgClick(event: MouseEvent): void;
79
+ onSvgContextMenu(event: MouseEvent): void;
80
+ onDocumentClick(event: MouseEvent): void;
81
+ onDocumentMouseMove(event: MouseEvent): void;
82
+ private updateTempConnection;
83
+ saveStepProperties(): Promise<void>;
84
+ savePathProperties(): Promise<void>;
85
+ private showConfirmDialog;
86
+ deleteSelectedStep(): Promise<void>;
87
+ deleteSelectedPath(): Promise<void>;
88
+ getStepName(stepId: string): string;
89
+ zoomIn(): void;
90
+ zoomOut(): void;
91
+ resetZoom(): void;
92
+ onWheel(event: WheelEvent): void;
93
+ onSvgMouseDown(event: MouseEvent): void;
94
+ onSvgMouseMove(event: MouseEvent): void;
95
+ onSvgMouseUp(event: MouseEvent): void;
96
+ private updateTransform;
97
+ private onNodeContextMenu;
98
+ private onPathContextMenu;
99
+ connectFromContextMenu(): void;
100
+ deleteFromContextMenu(): void;
101
+ deletePathFromContextMenu(): void;
102
+ private onSocketMouseDown;
103
+ private onSocketMouseEnter;
104
+ private onSocketMouseLeave;
105
+ private onSocketMouseUp;
106
+ static ɵfac: i0.ɵɵFactoryDeclaration<FlowAgentDiagramComponent, never>;
107
+ static ɵcmp: i0.ɵɵComponentDeclaration<FlowAgentDiagramComponent, "mj-flow-agent-diagram", never, { "agentId": { "alias": "agentId"; "required": false; }; "steps": { "alias": "steps"; "required": false; }; "paths": { "alias": "paths"; "required": false; }; "EditMode": { "alias": "EditMode"; "required": false; }; }, { "stepsChanged": "stepsChanged"; "pathsChanged": "pathsChanged"; }, never, never, false, never>;
108
+ }
109
+ //# sourceMappingURL=flow-agent-diagram.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-agent-diagram.component.d.ts","sourceRoot":"","sources":["../../../../../src/lib/custom/AIAgents/FlowAgentType/flow-agent-diagram.component.ts"],"names":[],"mappings":"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"}