@memberjunction/ng-core-entity-forms 2.70.0 → 2.71.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/add-action-dialog.component.d.ts +65 -0
- package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts.map +1 -0
- package/dist/lib/custom/AIAgents/add-action-dialog.component.js +578 -0
- package/dist/lib/custom/AIAgents/add-action-dialog.component.js.map +1 -0
- package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.d.ts +1 -0
- package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.d.ts.map +1 -0
- package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js +282 -0
- package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js.map +1 -0
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts +58 -0
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts.map +1 -0
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +400 -0
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js.map +1 -0
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +119 -23
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js +1815 -924
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts +159 -0
- package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts.map +1 -0
- package/dist/lib/custom/AIAgents/ai-agent-management.service.js +315 -0
- package/dist/lib/custom/AIAgents/ai-agent-management.service.js.map +1 -0
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts +67 -0
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts.map +1 -0
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +463 -0
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js.map +1 -0
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts +82 -0
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts.map +1 -0
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +708 -0
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -0
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts +65 -0
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts.map +1 -0
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +379 -0
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -0
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts +58 -0
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts.map +1 -0
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +373 -0
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js.map +1 -0
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +61 -0
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -0
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +459 -0
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -0
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +90 -10
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +1159 -687
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts +27 -0
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts.map +1 -0
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js +88 -0
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js.map +1 -0
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts +69 -0
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts.map +1 -0
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +442 -0
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js.map +1 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +2 -2
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
- package/dist/lib/custom/custom-forms.module.d.ts +40 -33
- package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
- package/dist/lib/custom/custom-forms.module.js +26 -2
- package/dist/lib/custom/custom-forms.module.js.map +1 -1
- package/dist/lib/shared/components/template-editor.component.d.ts +8 -2
- package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
- package/dist/lib/shared/components/template-editor.component.js +58 -23
- package/dist/lib/shared/components/template-editor.component.js.map +1 -1
- package/package.json +16 -16
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
import { Component, ViewChild } from '@angular/core';
|
|
2
|
+
import { FormControl, FormGroup, Validators } from '@angular/forms';
|
|
3
|
+
import { Subject, BehaviorSubject, takeUntil } from 'rxjs';
|
|
4
|
+
import { Metadata, RunView } from '@memberjunction/core';
|
|
5
|
+
import { MJNotificationService } from '@memberjunction/ng-notifications';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@progress/kendo-angular-dialog";
|
|
8
|
+
import * as i2 from "../AIPrompts/ai-prompt-management.service";
|
|
9
|
+
import * as i3 from "@angular/forms";
|
|
10
|
+
import * as i4 from "@progress/kendo-angular-inputs";
|
|
11
|
+
import * as i5 from "@progress/kendo-angular-dropdowns";
|
|
12
|
+
import * as i6 from "@progress/kendo-angular-buttons";
|
|
13
|
+
import * as i7 from "../../shared/components/template-editor.component";
|
|
14
|
+
import * as i8 from "@angular/common";
|
|
15
|
+
const _c0 = ["templateEditor"];
|
|
16
|
+
const _c1 = () => ["Pending", "Active", "Disabled"];
|
|
17
|
+
const _c2 = () => ["string", "object"];
|
|
18
|
+
function CreatePromptDialogComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
19
|
+
i0.ɵɵelementStart(0, "div", 2)(1, "div", 11);
|
|
20
|
+
i0.ɵɵelement(2, "i", 12);
|
|
21
|
+
i0.ɵɵelementEnd();
|
|
22
|
+
i0.ɵɵelementStart(3, "p");
|
|
23
|
+
i0.ɵɵtext(4, "Loading prompt creation form...");
|
|
24
|
+
i0.ɵɵelementEnd()();
|
|
25
|
+
} }
|
|
26
|
+
function CreatePromptDialogComponent_Conditional_3_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
27
|
+
i0.ɵɵelementStart(0, "div", 20);
|
|
28
|
+
i0.ɵɵelement(1, "i", 48);
|
|
29
|
+
i0.ɵɵtext(2, " Name is required ");
|
|
30
|
+
i0.ɵɵelementEnd();
|
|
31
|
+
} }
|
|
32
|
+
function CreatePromptDialogComponent_Conditional_3_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
33
|
+
i0.ɵɵelementStart(0, "div", 20);
|
|
34
|
+
i0.ɵɵelement(1, "i", 48);
|
|
35
|
+
i0.ɵɵtext(2, " Type is required ");
|
|
36
|
+
i0.ɵɵelementEnd();
|
|
37
|
+
} }
|
|
38
|
+
function CreatePromptDialogComponent_Conditional_3_Conditional_53_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
39
|
+
i0.ɵɵelementStart(0, "p", 51);
|
|
40
|
+
i0.ɵɵtext(1);
|
|
41
|
+
i0.ɵɵelementEnd();
|
|
42
|
+
} if (rf & 2) {
|
|
43
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
44
|
+
i0.ɵɵadvance();
|
|
45
|
+
i0.ɵɵtextInterpolate(ctx_r1.templateEntity.Description);
|
|
46
|
+
} }
|
|
47
|
+
function CreatePromptDialogComponent_Conditional_3_Conditional_53_Template(rf, ctx) { if (rf & 1) {
|
|
48
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
49
|
+
i0.ɵɵelementStart(0, "div", 46)(1, "div", 49)(2, "h5", 50);
|
|
50
|
+
i0.ɵɵelement(3, "i", 28);
|
|
51
|
+
i0.ɵɵtext(4);
|
|
52
|
+
i0.ɵɵelementEnd();
|
|
53
|
+
i0.ɵɵtemplate(5, CreatePromptDialogComponent_Conditional_3_Conditional_53_Conditional_5_Template, 2, 1, "p", 51);
|
|
54
|
+
i0.ɵɵelementEnd();
|
|
55
|
+
i0.ɵɵelementStart(6, "div", 52)(7, "mj-template-editor", 53, 0);
|
|
56
|
+
i0.ɵɵlistener("contentChange", function CreatePromptDialogComponent_Conditional_3_Conditional_53_Template_mj_template_editor_contentChange_7_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onTemplateContentChange($event)); });
|
|
57
|
+
i0.ɵɵelementEnd()()();
|
|
58
|
+
} if (rf & 2) {
|
|
59
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
60
|
+
i0.ɵɵadvance(4);
|
|
61
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.templateEntity.Name, " ");
|
|
62
|
+
i0.ɵɵadvance();
|
|
63
|
+
i0.ɵɵconditional(ctx_r1.templateEntity.Description ? 5 : -1);
|
|
64
|
+
i0.ɵɵadvance(2);
|
|
65
|
+
i0.ɵɵproperty("template", ctx_r1.templateEntity)("config", ctx_r1.templateEditorConfig);
|
|
66
|
+
} }
|
|
67
|
+
function CreatePromptDialogComponent_Conditional_3_Conditional_54_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
68
|
+
i0.ɵɵelementStart(0, "p", 51);
|
|
69
|
+
i0.ɵɵtext(1);
|
|
70
|
+
i0.ɵɵelementEnd();
|
|
71
|
+
} if (rf & 2) {
|
|
72
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
73
|
+
i0.ɵɵadvance();
|
|
74
|
+
i0.ɵɵtextInterpolate(ctx_r1.templateEntity.Description);
|
|
75
|
+
} }
|
|
76
|
+
function CreatePromptDialogComponent_Conditional_3_Conditional_54_Template(rf, ctx) { if (rf & 1) {
|
|
77
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
78
|
+
i0.ɵɵelementStart(0, "div", 47)(1, "div", 54)(2, "div", 55)(3, "h5", 50);
|
|
79
|
+
i0.ɵɵelement(4, "i", 45);
|
|
80
|
+
i0.ɵɵtext(5);
|
|
81
|
+
i0.ɵɵelementEnd();
|
|
82
|
+
i0.ɵɵelementStart(6, "span", 56);
|
|
83
|
+
i0.ɵɵelement(7, "i", 18);
|
|
84
|
+
i0.ɵɵtext(8, " Existing Template ");
|
|
85
|
+
i0.ɵɵelementEnd()();
|
|
86
|
+
i0.ɵɵtemplate(9, CreatePromptDialogComponent_Conditional_3_Conditional_54_Conditional_9_Template, 2, 1, "p", 51);
|
|
87
|
+
i0.ɵɵelementStart(10, "div", 57)(11, "button", 58);
|
|
88
|
+
i0.ɵɵlistener("click", function CreatePromptDialogComponent_Conditional_3_Conditional_54_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.handleTemplateModeChange("existing")); });
|
|
89
|
+
i0.ɵɵelement(12, "i", 59);
|
|
90
|
+
i0.ɵɵtext(13, " Change Template ");
|
|
91
|
+
i0.ɵɵelementEnd()()()();
|
|
92
|
+
} if (rf & 2) {
|
|
93
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
94
|
+
i0.ɵɵadvance(5);
|
|
95
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.templateEntity.Name, " ");
|
|
96
|
+
i0.ɵɵadvance(4);
|
|
97
|
+
i0.ɵɵconditional(ctx_r1.templateEntity.Description ? 9 : -1);
|
|
98
|
+
} }
|
|
99
|
+
function CreatePromptDialogComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
100
|
+
i0.ɵɵelementStart(0, "form", 3)(1, "div", 13)(2, "h4", 14);
|
|
101
|
+
i0.ɵɵelement(3, "i", 7);
|
|
102
|
+
i0.ɵɵtext(4, " Basic Information ");
|
|
103
|
+
i0.ɵɵelementEnd();
|
|
104
|
+
i0.ɵɵelementStart(5, "div", 15)(6, "div", 16)(7, "label", 17);
|
|
105
|
+
i0.ɵɵelement(8, "i", 18);
|
|
106
|
+
i0.ɵɵtext(9, " Name ");
|
|
107
|
+
i0.ɵɵelementEnd();
|
|
108
|
+
i0.ɵɵelement(10, "kendo-textbox", 19);
|
|
109
|
+
i0.ɵɵtemplate(11, CreatePromptDialogComponent_Conditional_3_Conditional_11_Template, 3, 0, "div", 20);
|
|
110
|
+
i0.ɵɵelementEnd();
|
|
111
|
+
i0.ɵɵelementStart(12, "div", 16)(13, "label", 21);
|
|
112
|
+
i0.ɵɵelement(14, "i", 22);
|
|
113
|
+
i0.ɵɵtext(15, " Type ");
|
|
114
|
+
i0.ɵɵelementEnd();
|
|
115
|
+
i0.ɵɵelement(16, "kendo-dropdownlist", 23);
|
|
116
|
+
i0.ɵɵpipe(17, "async");
|
|
117
|
+
i0.ɵɵtemplate(18, CreatePromptDialogComponent_Conditional_3_Conditional_18_Template, 3, 0, "div", 20);
|
|
118
|
+
i0.ɵɵelementEnd();
|
|
119
|
+
i0.ɵɵelementStart(19, "div", 16)(20, "label", 24);
|
|
120
|
+
i0.ɵɵelement(21, "i", 25);
|
|
121
|
+
i0.ɵɵtext(22, " Status ");
|
|
122
|
+
i0.ɵɵelementEnd();
|
|
123
|
+
i0.ɵɵelement(23, "kendo-dropdownlist", 26);
|
|
124
|
+
i0.ɵɵelementEnd();
|
|
125
|
+
i0.ɵɵelementStart(24, "div", 16)(25, "label", 27);
|
|
126
|
+
i0.ɵɵelement(26, "i", 28);
|
|
127
|
+
i0.ɵɵtext(27, " Output Type ");
|
|
128
|
+
i0.ɵɵelementEnd();
|
|
129
|
+
i0.ɵɵelement(28, "kendo-dropdownlist", 29);
|
|
130
|
+
i0.ɵɵelementEnd()();
|
|
131
|
+
i0.ɵɵelementStart(29, "div", 30)(30, "label", 31);
|
|
132
|
+
i0.ɵɵelement(31, "i", 32);
|
|
133
|
+
i0.ɵɵtext(32, " Description ");
|
|
134
|
+
i0.ɵɵelementEnd();
|
|
135
|
+
i0.ɵɵelement(33, "kendo-textarea", 33);
|
|
136
|
+
i0.ɵɵelementEnd()();
|
|
137
|
+
i0.ɵɵelementStart(34, "div", 13)(35, "h4", 14);
|
|
138
|
+
i0.ɵɵelement(36, "i", 34);
|
|
139
|
+
i0.ɵɵtext(37, " Template Configuration ");
|
|
140
|
+
i0.ɵɵelementEnd();
|
|
141
|
+
i0.ɵɵelementStart(38, "div", 35)(39, "label", 36);
|
|
142
|
+
i0.ɵɵelement(40, "i", 37);
|
|
143
|
+
i0.ɵɵtext(41, " Template Mode ");
|
|
144
|
+
i0.ɵɵelementEnd();
|
|
145
|
+
i0.ɵɵelementStart(42, "div", 38)(43, "div", 39);
|
|
146
|
+
i0.ɵɵelement(44, "input", 40);
|
|
147
|
+
i0.ɵɵelementStart(45, "label", 41);
|
|
148
|
+
i0.ɵɵelement(46, "i", 42);
|
|
149
|
+
i0.ɵɵtext(47, " Create New Template ");
|
|
150
|
+
i0.ɵɵelementEnd()();
|
|
151
|
+
i0.ɵɵelementStart(48, "div", 39);
|
|
152
|
+
i0.ɵɵelement(49, "input", 43);
|
|
153
|
+
i0.ɵɵelementStart(50, "label", 44);
|
|
154
|
+
i0.ɵɵelement(51, "i", 45);
|
|
155
|
+
i0.ɵɵtext(52, " Link Existing Template ");
|
|
156
|
+
i0.ɵɵelementEnd()()()();
|
|
157
|
+
i0.ɵɵtemplate(53, CreatePromptDialogComponent_Conditional_3_Conditional_53_Template, 9, 4, "div", 46)(54, CreatePromptDialogComponent_Conditional_3_Conditional_54_Template, 14, 2, "div", 47);
|
|
158
|
+
i0.ɵɵelementEnd()();
|
|
159
|
+
} if (rf & 2) {
|
|
160
|
+
let tmp_2_0;
|
|
161
|
+
let tmp_5_0;
|
|
162
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
163
|
+
i0.ɵɵproperty("formGroup", ctx_r1.promptForm);
|
|
164
|
+
i0.ɵɵadvance(11);
|
|
165
|
+
i0.ɵɵconditional(((tmp_2_0 = ctx_r1.promptForm.get("name")) == null ? null : tmp_2_0.invalid) && ((tmp_2_0 = ctx_r1.promptForm.get("name")) == null ? null : tmp_2_0.touched) ? 11 : -1);
|
|
166
|
+
i0.ɵɵadvance(5);
|
|
167
|
+
i0.ɵɵproperty("data", i0.ɵɵpipeBind1(17, 12, ctx_r1.availablePromptTypes$))("valuePrimitive", true);
|
|
168
|
+
i0.ɵɵadvance(2);
|
|
169
|
+
i0.ɵɵconditional(((tmp_5_0 = ctx_r1.promptForm.get("typeID")) == null ? null : tmp_5_0.invalid) && ((tmp_5_0 = ctx_r1.promptForm.get("typeID")) == null ? null : tmp_5_0.touched) ? 18 : -1);
|
|
170
|
+
i0.ɵɵadvance(5);
|
|
171
|
+
i0.ɵɵproperty("data", i0.ɵɵpureFunction0(14, _c1))("valuePrimitive", true);
|
|
172
|
+
i0.ɵɵadvance(5);
|
|
173
|
+
i0.ɵɵproperty("data", i0.ɵɵpureFunction0(15, _c2))("valuePrimitive", true);
|
|
174
|
+
i0.ɵɵadvance(5);
|
|
175
|
+
i0.ɵɵproperty("rows", 3);
|
|
176
|
+
i0.ɵɵadvance(20);
|
|
177
|
+
i0.ɵɵconditional(ctx_r1.showTemplateEditor && ctx_r1.templateEntity && ctx_r1.templateMode === "new" ? 53 : -1);
|
|
178
|
+
i0.ɵɵadvance();
|
|
179
|
+
i0.ɵɵconditional(ctx_r1.templateEntity && ctx_r1.templateMode === "existing" ? 54 : -1);
|
|
180
|
+
} }
|
|
181
|
+
function CreatePromptDialogComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
182
|
+
i0.ɵɵtext(0, " Created prompts and templates will be saved when you save the AI Agent ");
|
|
183
|
+
} }
|
|
184
|
+
function CreatePromptDialogComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
185
|
+
i0.ɵɵtext(0, " Created prompt will be linked to existing template when you save the AI Agent ");
|
|
186
|
+
} }
|
|
187
|
+
function CreatePromptDialogComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
188
|
+
i0.ɵɵelement(0, "i", 60);
|
|
189
|
+
i0.ɵɵtext(1, " Creating... ");
|
|
190
|
+
} }
|
|
191
|
+
function CreatePromptDialogComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
192
|
+
i0.ɵɵelement(0, "i", 61);
|
|
193
|
+
i0.ɵɵtext(1, " Create Prompt ");
|
|
194
|
+
} }
|
|
195
|
+
/**
|
|
196
|
+
* Dialog for creating new AI Prompts with essential fields and basic template editing.
|
|
197
|
+
* Creates entities but does not save them - returns entities for parent to add to PendingRecords.
|
|
198
|
+
* This ensures atomicity with the parent form's save operation.
|
|
199
|
+
*/
|
|
200
|
+
export class CreatePromptDialogComponent {
|
|
201
|
+
constructor(dialogRef, cdr, aiPromptManagementService) {
|
|
202
|
+
this.dialogRef = dialogRef;
|
|
203
|
+
this.cdr = cdr;
|
|
204
|
+
this.aiPromptManagementService = aiPromptManagementService;
|
|
205
|
+
// Configuration
|
|
206
|
+
this.config = {};
|
|
207
|
+
// State management
|
|
208
|
+
this.destroy$ = new Subject();
|
|
209
|
+
this.result = new Subject();
|
|
210
|
+
this.isLoading$ = new BehaviorSubject(false);
|
|
211
|
+
this.isSaving$ = new BehaviorSubject(false);
|
|
212
|
+
// Data
|
|
213
|
+
this.availablePromptTypes$ = new BehaviorSubject([]);
|
|
214
|
+
// Entities (not saved to database)
|
|
215
|
+
this.promptEntity = null;
|
|
216
|
+
this.templateEntity = null;
|
|
217
|
+
this.templateContents = [];
|
|
218
|
+
this.showTemplateEditor = false;
|
|
219
|
+
this.templateEditorConfig = {
|
|
220
|
+
allowEdit: true,
|
|
221
|
+
showRunButton: false,
|
|
222
|
+
compactMode: true // Compact mode for dialog
|
|
223
|
+
};
|
|
224
|
+
// Template state
|
|
225
|
+
this.templateMode = 'new';
|
|
226
|
+
this.promptForm = this.createForm();
|
|
227
|
+
}
|
|
228
|
+
ngOnInit() {
|
|
229
|
+
this.loadInitialData();
|
|
230
|
+
this.setupFormWatching();
|
|
231
|
+
}
|
|
232
|
+
ngOnDestroy() {
|
|
233
|
+
this.destroy$.next();
|
|
234
|
+
this.destroy$.complete();
|
|
235
|
+
}
|
|
236
|
+
createForm() {
|
|
237
|
+
return new FormGroup({
|
|
238
|
+
name: new FormControl(this.config.initialName || '', [Validators.required]),
|
|
239
|
+
description: new FormControl(''),
|
|
240
|
+
typeID: new FormControl(this.config.initialTypeID || '', [Validators.required]),
|
|
241
|
+
status: new FormControl('Pending'),
|
|
242
|
+
outputType: new FormControl('string'),
|
|
243
|
+
templateMode: new FormControl('new')
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
setupFormWatching() {
|
|
247
|
+
// Watch template mode changes
|
|
248
|
+
this.promptForm.get('templateMode')?.valueChanges
|
|
249
|
+
.pipe(takeUntil(this.destroy$))
|
|
250
|
+
.subscribe(mode => {
|
|
251
|
+
this.templateMode = mode;
|
|
252
|
+
this.handleTemplateModeChange(mode);
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
async loadInitialData() {
|
|
256
|
+
this.isLoading$.next(true);
|
|
257
|
+
try {
|
|
258
|
+
// Load prompt types
|
|
259
|
+
const rv = new RunView();
|
|
260
|
+
const typesResult = await rv.RunView({
|
|
261
|
+
EntityName: 'AI Prompt Types',
|
|
262
|
+
OrderBy: 'Name ASC',
|
|
263
|
+
ResultType: 'entity_object'
|
|
264
|
+
});
|
|
265
|
+
if (typesResult.Success && typesResult.Results) {
|
|
266
|
+
this.availablePromptTypes$.next(typesResult.Results);
|
|
267
|
+
// Set default type if not specified
|
|
268
|
+
if (!this.config.initialTypeID && typesResult.Results.length > 0) {
|
|
269
|
+
this.promptForm.patchValue({ typeID: typesResult.Results[0].ID });
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Create the prompt entity
|
|
273
|
+
const md = new Metadata();
|
|
274
|
+
this.promptEntity = await md.GetEntityObject('AI Prompts');
|
|
275
|
+
this.promptEntity.NewRecord();
|
|
276
|
+
// Set default values
|
|
277
|
+
this.promptEntity.Status = 'Pending';
|
|
278
|
+
this.promptEntity.OutputType = 'string';
|
|
279
|
+
this.promptEntity.ValidationBehavior = 'None';
|
|
280
|
+
this.promptEntity.EnableCaching = false;
|
|
281
|
+
// Create default template since it's required
|
|
282
|
+
await this.createNewTemplate();
|
|
283
|
+
this.showTemplateEditor = true;
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
console.error('Error loading prompt creation data:', error);
|
|
287
|
+
MJNotificationService.Instance.CreateSimpleNotification('Error loading data for prompt creation', 'error', 3000);
|
|
288
|
+
}
|
|
289
|
+
finally {
|
|
290
|
+
this.isLoading$.next(false);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
async handleTemplateModeChange(mode) {
|
|
294
|
+
if (mode === 'new') {
|
|
295
|
+
await this.createNewTemplate();
|
|
296
|
+
this.showTemplateEditor = true;
|
|
297
|
+
}
|
|
298
|
+
else if (mode === 'existing') {
|
|
299
|
+
await this.openTemplateSelector();
|
|
300
|
+
}
|
|
301
|
+
this.cdr.detectChanges();
|
|
302
|
+
}
|
|
303
|
+
async createNewTemplate() {
|
|
304
|
+
if (!this.promptEntity)
|
|
305
|
+
return;
|
|
306
|
+
try {
|
|
307
|
+
const md = new Metadata();
|
|
308
|
+
// Create template entity
|
|
309
|
+
this.templateEntity = await md.GetEntityObject('Templates');
|
|
310
|
+
this.templateEntity.NewRecord();
|
|
311
|
+
const promptName = this.promptForm.get('name')?.value || 'New Prompt';
|
|
312
|
+
this.templateEntity.Name = `${promptName} Template`;
|
|
313
|
+
this.templateEntity.Description = `Template for ${promptName}`;
|
|
314
|
+
// Set UserID on template (required field)
|
|
315
|
+
this.templateEntity.UserID = md.CurrentUser.ID;
|
|
316
|
+
// Link template to prompt
|
|
317
|
+
this.promptEntity.TemplateID = this.templateEntity.ID;
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
console.error('Error creating new template:', error);
|
|
321
|
+
MJNotificationService.Instance.CreateSimpleNotification('Error creating template', 'error', 3000);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
onTemplateContentChange(contents) {
|
|
325
|
+
this.templateContents = contents || [];
|
|
326
|
+
}
|
|
327
|
+
async save() {
|
|
328
|
+
if (!this.promptForm.valid || !this.promptEntity) {
|
|
329
|
+
MJNotificationService.Instance.CreateSimpleNotification('Please fill in all required fields', 'warning', 3000);
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
this.isSaving$.next(true);
|
|
333
|
+
try {
|
|
334
|
+
// Update prompt entity with form values
|
|
335
|
+
const formValue = this.promptForm.value;
|
|
336
|
+
this.promptEntity.Name = formValue.name;
|
|
337
|
+
this.promptEntity.Description = formValue.description || '';
|
|
338
|
+
this.promptEntity.TypeID = formValue.typeID;
|
|
339
|
+
this.promptEntity.Status = formValue.status;
|
|
340
|
+
this.promptEntity.OutputType = formValue.outputType;
|
|
341
|
+
// Get template contents if template editor is active
|
|
342
|
+
if (this.templateEditor && this.showTemplateEditor) {
|
|
343
|
+
// Get the template contents from the editor without saving
|
|
344
|
+
// The parent form will handle saving in the proper order
|
|
345
|
+
this.templateContents = this.templateEditor.templateContents || [];
|
|
346
|
+
// Ensure the template contents have the correct TemplateID
|
|
347
|
+
if (this.templateContents && this.templateEntity) {
|
|
348
|
+
this.templateContents.forEach(content => {
|
|
349
|
+
content.TemplateID = this.templateEntity.ID;
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
// Return the created entities (not saved to database)
|
|
354
|
+
const result = {
|
|
355
|
+
prompt: this.promptEntity,
|
|
356
|
+
template: this.templateEntity || undefined,
|
|
357
|
+
templateContents: this.templateContents.length > 0 ? this.templateContents : undefined
|
|
358
|
+
};
|
|
359
|
+
this.result.next(result);
|
|
360
|
+
this.dialogRef.close();
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
console.error('Error preparing prompt for creation:', error);
|
|
364
|
+
MJNotificationService.Instance.CreateSimpleNotification('Error preparing prompt for creation', 'error', 3000);
|
|
365
|
+
}
|
|
366
|
+
finally {
|
|
367
|
+
this.isSaving$.next(false);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
cancel() {
|
|
371
|
+
this.result.next(null);
|
|
372
|
+
this.dialogRef.close();
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Opens the template selector dialog to link an existing template
|
|
376
|
+
*/
|
|
377
|
+
async openTemplateSelector() {
|
|
378
|
+
const config = {
|
|
379
|
+
title: 'Select Template for AI Prompt',
|
|
380
|
+
showCreateNew: false,
|
|
381
|
+
multiSelect: false,
|
|
382
|
+
showActiveOnly: true
|
|
383
|
+
};
|
|
384
|
+
try {
|
|
385
|
+
const result = await this.aiPromptManagementService.openTemplateSelectorDialog(config).toPromise();
|
|
386
|
+
if (result && result.selectedTemplates && result.selectedTemplates.length > 0) {
|
|
387
|
+
// Link the selected template
|
|
388
|
+
this.templateEntity = result.selectedTemplates[0];
|
|
389
|
+
this.promptEntity.TemplateID = this.templateEntity.ID;
|
|
390
|
+
// Update UI to show selected template info
|
|
391
|
+
this.showTemplateEditor = false;
|
|
392
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Template "${this.templateEntity.Name}" linked successfully`, 'success', 3000);
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
// User cancelled, revert to new template mode
|
|
396
|
+
this.promptForm.patchValue({ templateMode: 'new' });
|
|
397
|
+
await this.createNewTemplate();
|
|
398
|
+
this.showTemplateEditor = true;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
catch (error) {
|
|
402
|
+
console.error('Error opening template selector:', error);
|
|
403
|
+
MJNotificationService.Instance.CreateSimpleNotification('Error opening template selector', 'error', 3000);
|
|
404
|
+
// Revert to new template mode
|
|
405
|
+
this.promptForm.patchValue({ templateMode: 'new' });
|
|
406
|
+
await this.createNewTemplate();
|
|
407
|
+
this.showTemplateEditor = true;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
// Getter for template debugging
|
|
411
|
+
get currentTemplate() {
|
|
412
|
+
return this.templateEntity;
|
|
413
|
+
}
|
|
414
|
+
static { this.ɵfac = function CreatePromptDialogComponent_Factory(t) { return new (t || CreatePromptDialogComponent)(i0.ɵɵdirectiveInject(i1.DialogRef), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i2.AIPromptManagementService)); }; }
|
|
415
|
+
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CreatePromptDialogComponent, selectors: [["mj-create-prompt-dialog"]], viewQuery: function CreatePromptDialogComponent_Query(rf, ctx) { if (rf & 1) {
|
|
416
|
+
i0.ɵɵviewQuery(_c0, 5);
|
|
417
|
+
} if (rf & 2) {
|
|
418
|
+
let _t;
|
|
419
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.templateEditor = _t.first);
|
|
420
|
+
} }, decls: 19, vars: 13, consts: [["templateEditor", ""], [1, "create-prompt-dialog"], [1, "loading-state"], [1, "dialog-content", 3, "formGroup"], [1, "dialog-footer"], [1, "footer-left"], [1, "form-hint"], [1, "fa-solid", "fa-info-circle"], [1, "footer-right"], ["kendoButton", "", "look", "outline", 3, "click", "disabled"], ["kendoButton", "", "themeColor", "primary", 3, "click", "disabled"], [1, "loading-spinner"], [1, "fa-solid", "fa-spinner", "fa-spin", "fa-2x"], [1, "form-section"], [1, "section-title"], [1, "form-grid"], [1, "form-field"], ["for", "promptName", 1, "field-label", "required"], [1, "fa-solid", "fa-tag"], ["id", "promptName", "formControlName", "name", "placeholder", "Enter prompt name...", 1, "full-width"], [1, "field-error"], ["for", "promptType", 1, "field-label", "required"], [1, "fa-solid", "fa-category"], ["id", "promptType", "formControlName", "typeID", "textField", "Name", "valueField", "ID", "placeholder", "Select prompt type...", 1, "full-width", 3, "data", "valuePrimitive"], ["for", "promptStatus", 1, "field-label"], [1, "fa-solid", "fa-toggle-on"], ["id", "promptStatus", "formControlName", "status", 1, "full-width", 3, "data", "valuePrimitive"], ["for", "outputType", 1, "field-label"], [1, "fa-solid", "fa-file-code"], ["id", "outputType", "formControlName", "outputType", 1, "full-width", 3, "data", "valuePrimitive"], [1, "form-field", "full-width"], ["for", "promptDescription", 1, "field-label"], [1, "fa-solid", "fa-align-left"], ["id", "promptDescription", "formControlName", "description", "placeholder", "Enter prompt description (optional)...", 1, "full-width", 3, "rows"], [1, "fa-solid", "fa-file-alt"], [1, "template-mode-section"], [1, "field-label"], [1, "fa-solid", "fa-cog"], [1, "template-mode-options"], [1, "radio-option"], ["type", "radio", "id", "templateNew", "value", "new", "formControlName", "templateMode", 1, "radio-input"], ["for", "templateNew", 1, "radio-label"], [1, "fa-solid", "fa-plus-circle"], ["type", "radio", "id", "templateExisting", "value", "existing", "formControlName", "templateMode", 1, "radio-input"], ["for", "templateExisting", 1, "radio-label"], [1, "fa-solid", "fa-link"], [1, "template-editor-section"], [1, "existing-template-section"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "template-info"], [1, "template-name"], [1, "template-description"], [1, "template-editor-container"], [3, "contentChange", "template", "config"], [1, "existing-template-info"], [1, "template-header"], [1, "template-type-badge"], [1, "template-actions"], ["kendoButton", "", "look", "outline", "size", "small", 3, "click"], [1, "fa-solid", "fa-sync"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-plus"]], template: function CreatePromptDialogComponent_Template(rf, ctx) { if (rf & 1) {
|
|
421
|
+
i0.ɵɵelementStart(0, "div", 1);
|
|
422
|
+
i0.ɵɵtemplate(1, CreatePromptDialogComponent_Conditional_1_Template, 5, 0, "div", 2);
|
|
423
|
+
i0.ɵɵpipe(2, "async");
|
|
424
|
+
i0.ɵɵtemplate(3, CreatePromptDialogComponent_Conditional_3_Template, 55, 16, "form", 3);
|
|
425
|
+
i0.ɵɵelementEnd();
|
|
426
|
+
i0.ɵɵelementStart(4, "div", 4)(5, "div", 5)(6, "span", 6);
|
|
427
|
+
i0.ɵɵelement(7, "i", 7);
|
|
428
|
+
i0.ɵɵtemplate(8, CreatePromptDialogComponent_Conditional_8_Template, 1, 0)(9, CreatePromptDialogComponent_Conditional_9_Template, 1, 0);
|
|
429
|
+
i0.ɵɵelementEnd()();
|
|
430
|
+
i0.ɵɵelementStart(10, "div", 8)(11, "button", 9);
|
|
431
|
+
i0.ɵɵpipe(12, "async");
|
|
432
|
+
i0.ɵɵlistener("click", function CreatePromptDialogComponent_Template_button_click_11_listener() { return ctx.cancel(); });
|
|
433
|
+
i0.ɵɵtext(13, " Cancel ");
|
|
434
|
+
i0.ɵɵelementEnd();
|
|
435
|
+
i0.ɵɵelementStart(14, "button", 10);
|
|
436
|
+
i0.ɵɵpipe(15, "async");
|
|
437
|
+
i0.ɵɵlistener("click", function CreatePromptDialogComponent_Template_button_click_14_listener() { return ctx.save(); });
|
|
438
|
+
i0.ɵɵtemplate(16, CreatePromptDialogComponent_Conditional_16_Template, 2, 0);
|
|
439
|
+
i0.ɵɵpipe(17, "async");
|
|
440
|
+
i0.ɵɵtemplate(18, CreatePromptDialogComponent_Conditional_18_Template, 2, 0);
|
|
441
|
+
i0.ɵɵelementEnd()()();
|
|
442
|
+
} if (rf & 2) {
|
|
443
|
+
i0.ɵɵadvance();
|
|
444
|
+
i0.ɵɵconditional(i0.ɵɵpipeBind1(2, 5, ctx.isLoading$) ? 1 : 3);
|
|
445
|
+
i0.ɵɵadvance(7);
|
|
446
|
+
i0.ɵɵconditional(ctx.templateMode === "new" ? 8 : 9);
|
|
447
|
+
i0.ɵɵadvance(3);
|
|
448
|
+
i0.ɵɵproperty("disabled", i0.ɵɵpipeBind1(12, 7, ctx.isSaving$) || false);
|
|
449
|
+
i0.ɵɵadvance(3);
|
|
450
|
+
i0.ɵɵproperty("disabled", !ctx.promptForm.valid || (i0.ɵɵpipeBind1(15, 9, ctx.isSaving$) || false));
|
|
451
|
+
i0.ɵɵadvance(2);
|
|
452
|
+
i0.ɵɵconditional(i0.ɵɵpipeBind1(17, 11, ctx.isSaving$) ? 16 : 18);
|
|
453
|
+
} }, dependencies: [i3.ɵNgNoValidate, i3.DefaultValueAccessor, i3.RadioControlValueAccessor, i3.NgControlStatus, i3.NgControlStatusGroup, i3.FormGroupDirective, i3.FormControlName, i4.TextAreaComponent, i4.TextBoxComponent, i5.DropDownListComponent, i6.ButtonComponent, i7.TemplateEditorComponent, i8.AsyncPipe], styles: ["\n\n.create-prompt-dialog[_ngcontent-%COMP%] {\n padding: 0;\n min-height: 400px;\n display: flex;\n flex-direction: column;\n}\n\n\n\n.loading-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n color: var(--kendo-color-primary, #0078d4);\n}\n\n\n\n.dialog-content[_ngcontent-%COMP%] {\n flex: 1;\n padding: 20px;\n overflow-y: auto;\n max-height: 70vh;\n}\n\n\n\n.form-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n border: 1px solid var(--kendo-color-border, #e0e0e0);\n border-radius: 6px;\n padding: 16px;\n background: var(--kendo-color-surface-alt, #fafafa);\n}\n\n.section-title[_ngcontent-%COMP%] {\n margin: 0 0 16px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--kendo-color-on-app-surface, #323130);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--kendo-color-primary, #0078d4);\n}\n\n\n\n.form-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.form-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.form-field.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n\n\n.field-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--kendo-color-on-app-surface, #323130);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.field-label.required[_ngcontent-%COMP%]::after {\n content: '*';\n color: var(--kendo-color-error, #d13438);\n margin-left: 2px;\n}\n\n.field-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--kendo-color-subtle, #605e5c);\n}\n\n\n\n.full-width[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n\n\n.field-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--kendo-color-error, #d13438);\n margin-top: 4px;\n}\n\n.field-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n\n\n.template-mode-section[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.template-mode-options[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n margin-top: 8px;\n flex-wrap: wrap;\n}\n\n.radio-option[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.radio-input[_ngcontent-%COMP%] {\n margin: 0;\n}\n\n.radio-label[_ngcontent-%COMP%] {\n font-size: 13px;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background-color 0.2s ease;\n}\n\n.radio-label[_ngcontent-%COMP%]:hover {\n background-color: var(--kendo-color-base-hover, #f3f2f1);\n}\n\n.radio-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--kendo-color-subtle, #605e5c);\n}\n\n\n\n.template-editor-section[_ngcontent-%COMP%] {\n margin-top: 16px;\n padding: 16px;\n border: 1px solid var(--kendo-color-border, #e0e0e0);\n border-radius: 4px;\n background: var(--kendo-color-app-surface, #ffffff);\n}\n\n.template-info[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n.template-name[_ngcontent-%COMP%] {\n margin: 0 0 4px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--kendo-color-on-app-surface, #323130);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.template-description[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 12px;\n color: var(--kendo-color-subtle, #605e5c);\n}\n\n.template-editor-container[_ngcontent-%COMP%] {\n border: 1px solid var(--kendo-color-border, #e0e0e0);\n border-radius: 4px;\n overflow: hidden;\n min-height: 200px;\n}\n\n\n\n.existing-template-section[_ngcontent-%COMP%] {\n margin-top: 16px;\n padding: 16px;\n border: 1px solid var(--kendo-color-border, #e0e0e0);\n border-radius: 4px;\n background: var(--kendo-color-app-surface, #ffffff);\n}\n\n.existing-template-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.template-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n}\n\n.template-type-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n background-color: var(--kendo-color-primary, #0078d4);\n color: white;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 500;\n}\n\n.template-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n\n\n.dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-top: 1px solid var(--kendo-color-border, #e0e0e0);\n background: var(--kendo-color-surface-alt, #fafafa);\n gap: 16px;\n}\n\n.footer-left[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.footer-right[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.form-hint[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--kendo-color-subtle, #605e5c);\n}\n\n.form-hint[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--kendo-color-primary, #0078d4);\n}\n\n\n\n@media (max-width: 768px) {\n .form-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n \n .template-mode-options[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 8px;\n }\n \n .dialog-footer[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n gap: 12px;\n }\n \n .footer-right[_ngcontent-%COMP%] {\n justify-content: stretch;\n }\n \n .footer-right[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n flex: 1;\n }\n}\n\n\n\n[_nghost-%COMP%] .template-editor-container mj-template-editor {\n --template-editor-min-height: 200px;\n}\n\n[_nghost-%COMP%] .template-editor-container .template-editor-help {\n display: none; \n\n}"] }); }
|
|
454
|
+
}
|
|
455
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CreatePromptDialogComponent, [{
|
|
456
|
+
type: Component,
|
|
457
|
+
args: [{ selector: 'mj-create-prompt-dialog', template: "<!-- Create Prompt Dialog -->\n<div class=\"create-prompt-dialog\">\n \n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-state\">\n <div class=\"loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin fa-2x\"></i>\n </div>\n <p>Loading prompt creation form...</p>\n </div>\n } @else {\n \n <!-- Form Content -->\n <form [formGroup]=\"promptForm\" class=\"dialog-content\">\n \n <!-- Basic Prompt Information -->\n <div class=\"form-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Basic Information\n </h4>\n \n <div class=\"form-grid\">\n \n <!-- Name Field -->\n <div class=\"form-field\">\n <label for=\"promptName\" class=\"field-label required\">\n <i class=\"fa-solid fa-tag\"></i>\n Name\n </label>\n <kendo-textbox \n id=\"promptName\"\n formControlName=\"name\"\n placeholder=\"Enter prompt name...\"\n class=\"full-width\">\n </kendo-textbox>\n @if (promptForm.get('name')?.invalid && promptForm.get('name')?.touched) {\n <div class=\"field-error\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n Name is required\n </div>\n }\n </div>\n\n <!-- Type Field -->\n <div class=\"form-field\">\n <label for=\"promptType\" class=\"field-label required\">\n <i class=\"fa-solid fa-category\"></i>\n Type\n </label>\n <kendo-dropdownlist \n id=\"promptType\"\n formControlName=\"typeID\"\n [data]=\"availablePromptTypes$ | async\"\n textField=\"Name\"\n valueField=\"ID\"\n [valuePrimitive]=\"true\"\n placeholder=\"Select prompt type...\"\n class=\"full-width\">\n </kendo-dropdownlist>\n @if (promptForm.get('typeID')?.invalid && promptForm.get('typeID')?.touched) {\n <div class=\"field-error\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n Type is required\n </div>\n }\n </div>\n\n <!-- Status Field -->\n <div class=\"form-field\">\n <label for=\"promptStatus\" class=\"field-label\">\n <i class=\"fa-solid fa-toggle-on\"></i>\n Status\n </label>\n <kendo-dropdownlist \n id=\"promptStatus\"\n formControlName=\"status\"\n [data]=\"['Pending', 'Active', 'Disabled']\"\n [valuePrimitive]=\"true\"\n class=\"full-width\">\n </kendo-dropdownlist>\n </div>\n\n <!-- Output Type Field -->\n <div class=\"form-field\">\n <label for=\"outputType\" class=\"field-label\">\n <i class=\"fa-solid fa-file-code\"></i>\n Output Type\n </label>\n <kendo-dropdownlist \n id=\"outputType\"\n formControlName=\"outputType\"\n [data]=\"['string', 'object']\"\n [valuePrimitive]=\"true\"\n class=\"full-width\">\n </kendo-dropdownlist>\n </div>\n\n </div>\n\n <!-- Description Field -->\n <div class=\"form-field full-width\">\n <label for=\"promptDescription\" class=\"field-label\">\n <i class=\"fa-solid fa-align-left\"></i>\n Description\n </label>\n <kendo-textarea \n id=\"promptDescription\"\n formControlName=\"description\"\n placeholder=\"Enter prompt description (optional)...\"\n [rows]=\"3\"\n class=\"full-width\">\n </kendo-textarea>\n </div>\n\n </div>\n\n <!-- Template Configuration -->\n <div class=\"form-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-file-alt\"></i>\n Template Configuration\n </h4>\n \n <div class=\"template-mode-section\">\n <label class=\"field-label\">\n <i class=\"fa-solid fa-cog\"></i>\n Template Mode\n </label>\n \n <div class=\"template-mode-options\">\n <div class=\"radio-option\">\n <input type=\"radio\" \n id=\"templateNew\" \n value=\"new\" \n formControlName=\"templateMode\"\n class=\"radio-input\">\n <label for=\"templateNew\" class=\"radio-label\">\n <i class=\"fa-solid fa-plus-circle\"></i>\n Create New Template\n </label>\n </div>\n \n <div class=\"radio-option\">\n <input type=\"radio\" \n id=\"templateExisting\" \n value=\"existing\" \n formControlName=\"templateMode\"\n class=\"radio-input\">\n <label for=\"templateExisting\" class=\"radio-label\">\n <i class=\"fa-solid fa-link\"></i>\n Link Existing Template\n </label>\n </div>\n </div>\n </div>\n\n <!-- Template Editor Section (New Template) -->\n @if (showTemplateEditor && templateEntity && templateMode === 'new') {\n <div class=\"template-editor-section\">\n <div class=\"template-info\">\n <h5 class=\"template-name\">\n <i class=\"fa-solid fa-file-code\"></i>\n {{ templateEntity.Name }}\n </h5>\n @if (templateEntity.Description) {\n <p class=\"template-description\">{{ templateEntity.Description }}</p>\n }\n </div>\n \n <div class=\"template-editor-container\">\n <mj-template-editor \n #templateEditor\n [template]=\"templateEntity\"\n [config]=\"templateEditorConfig\"\n (contentChange)=\"onTemplateContentChange($event)\">\n </mj-template-editor>\n </div>\n </div>\n }\n \n <!-- Existing Template Display -->\n @if (templateEntity && templateMode === 'existing') {\n <div class=\"existing-template-section\">\n <div class=\"existing-template-info\">\n <div class=\"template-header\">\n <h5 class=\"template-name\">\n <i class=\"fa-solid fa-link\"></i>\n {{ templateEntity.Name }}\n </h5>\n <span class=\"template-type-badge\">\n <i class=\"fa-solid fa-tag\"></i>\n Existing Template\n </span>\n </div>\n \n @if (templateEntity.Description) {\n <p class=\"template-description\">{{ templateEntity.Description }}</p>\n }\n \n <div class=\"template-actions\">\n <button kendoButton \n look=\"outline\" \n size=\"small\"\n (click)=\"handleTemplateModeChange('existing')\">\n <i class=\"fa-solid fa-sync\"></i>\n Change Template\n </button>\n </div>\n </div>\n </div>\n }\n\n </div>\n\n </form>\n\n }\n\n</div>\n\n<!-- Dialog Footer -->\n<div class=\"dialog-footer\">\n <div class=\"footer-left\">\n <span class=\"form-hint\">\n <i class=\"fa-solid fa-info-circle\"></i>\n @if (templateMode === 'new') {\n Created prompts and templates will be saved when you save the AI Agent\n } @else {\n Created prompt will be linked to existing template when you save the AI Agent\n }\n </span>\n </div>\n \n <div class=\"footer-right\">\n <button kendoButton \n look=\"outline\"\n (click)=\"cancel()\"\n [disabled]=\"(isSaving$ | async) || false\">\n Cancel\n </button>\n \n <button kendoButton \n themeColor=\"primary\"\n (click)=\"save()\"\n [disabled]=\"!promptForm.valid || ((isSaving$ | async) || false)\">\n @if (isSaving$ | async) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Creating...\n } @else {\n <i class=\"fa-solid fa-plus\"></i>\n Create Prompt\n }\n </button>\n </div>\n</div>", styles: ["/* Create Prompt Dialog Styles */\n.create-prompt-dialog {\n padding: 0;\n min-height: 400px;\n display: flex;\n flex-direction: column;\n}\n\n/* Loading State */\n.loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n}\n\n.loading-spinner {\n margin-bottom: 16px;\n color: var(--kendo-color-primary, #0078d4);\n}\n\n/* Dialog Content */\n.dialog-content {\n flex: 1;\n padding: 20px;\n overflow-y: auto;\n max-height: 70vh;\n}\n\n/* Form Sections */\n.form-section {\n margin-bottom: 24px;\n border: 1px solid var(--kendo-color-border, #e0e0e0);\n border-radius: 6px;\n padding: 16px;\n background: var(--kendo-color-surface-alt, #fafafa);\n}\n\n.section-title {\n margin: 0 0 16px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--kendo-color-on-app-surface, #323130);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.section-title i {\n color: var(--kendo-color-primary, #0078d4);\n}\n\n/* Form Grid Layout */\n.form-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.form-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.form-field.full-width {\n grid-column: 1 / -1;\n}\n\n/* Field Labels */\n.field-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--kendo-color-on-app-surface, #323130);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.field-label.required::after {\n content: '*';\n color: var(--kendo-color-error, #d13438);\n margin-left: 2px;\n}\n\n.field-label i {\n font-size: 11px;\n color: var(--kendo-color-subtle, #605e5c);\n}\n\n/* Form Controls */\n.full-width {\n width: 100%;\n}\n\n/* Field Errors */\n.field-error {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--kendo-color-error, #d13438);\n margin-top: 4px;\n}\n\n.field-error i {\n font-size: 11px;\n}\n\n/* Template Mode Section */\n.template-mode-section {\n margin-bottom: 16px;\n}\n\n.template-mode-options {\n display: flex;\n gap: 16px;\n margin-top: 8px;\n flex-wrap: wrap;\n}\n\n.radio-option {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.radio-input {\n margin: 0;\n}\n\n.radio-label {\n font-size: 13px;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background-color 0.2s ease;\n}\n\n.radio-label:hover {\n background-color: var(--kendo-color-base-hover, #f3f2f1);\n}\n\n.radio-label i {\n font-size: 12px;\n color: var(--kendo-color-subtle, #605e5c);\n}\n\n/* Template Editor Section */\n.template-editor-section {\n margin-top: 16px;\n padding: 16px;\n border: 1px solid var(--kendo-color-border, #e0e0e0);\n border-radius: 4px;\n background: var(--kendo-color-app-surface, #ffffff);\n}\n\n.template-info {\n margin-bottom: 12px;\n}\n\n.template-name {\n margin: 0 0 4px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--kendo-color-on-app-surface, #323130);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.template-description {\n margin: 0;\n font-size: 12px;\n color: var(--kendo-color-subtle, #605e5c);\n}\n\n.template-editor-container {\n border: 1px solid var(--kendo-color-border, #e0e0e0);\n border-radius: 4px;\n overflow: hidden;\n min-height: 200px;\n}\n\n/* Existing Template Section */\n.existing-template-section {\n margin-top: 16px;\n padding: 16px;\n border: 1px solid var(--kendo-color-border, #e0e0e0);\n border-radius: 4px;\n background: var(--kendo-color-app-surface, #ffffff);\n}\n\n.existing-template-info {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.template-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n}\n\n.template-type-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n background-color: var(--kendo-color-primary, #0078d4);\n color: white;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 500;\n}\n\n.template-actions {\n display: flex;\n gap: 8px;\n}\n\n/* Dialog Footer */\n.dialog-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-top: 1px solid var(--kendo-color-border, #e0e0e0);\n background: var(--kendo-color-surface-alt, #fafafa);\n gap: 16px;\n}\n\n.footer-left {\n flex: 1;\n}\n\n.footer-right {\n display: flex;\n gap: 8px;\n}\n\n.form-hint {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--kendo-color-subtle, #605e5c);\n}\n\n.form-hint i {\n color: var(--kendo-color-primary, #0078d4);\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .form-grid {\n grid-template-columns: 1fr;\n }\n \n .template-mode-options {\n flex-direction: column;\n gap: 8px;\n }\n \n .dialog-footer {\n flex-direction: column;\n align-items: stretch;\n gap: 12px;\n }\n \n .footer-right {\n justify-content: stretch;\n }\n \n .footer-right button {\n flex: 1;\n }\n}\n\n/* Compact Template Editor Styles */\n:host ::ng-deep .template-editor-container mj-template-editor {\n --template-editor-min-height: 200px;\n}\n\n:host ::ng-deep .template-editor-container .template-editor-help {\n display: none; /* Hide help section in compact mode */\n}"] }]
|
|
458
|
+
}], () => [{ type: i1.DialogRef }, { type: i0.ChangeDetectorRef }, { type: i2.AIPromptManagementService }], { templateEditor: [{
|
|
459
|
+
type: ViewChild,
|
|
460
|
+
args: ['templateEditor']
|
|
461
|
+
}] }); })();
|
|
462
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CreatePromptDialogComponent, { className: "CreatePromptDialogComponent", filePath: "src/lib/custom/AIAgents/create-prompt-dialog.component.ts", lineNumber: 40 }); })();
|
|
463
|
+
//# sourceMappingURL=create-prompt-dialog.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-prompt-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgents/create-prompt-dialog.component.ts","../../../../src/lib/custom/AIAgents/create-prompt-dialog.component.html"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';
|
|
2
|
+
import { FormGroup } from '@angular/forms';
|
|
3
|
+
import { DialogRef } from '@progress/kendo-angular-dialog';
|
|
4
|
+
import { Subject, BehaviorSubject } from 'rxjs';
|
|
5
|
+
import { AIAgentEntity, AIAgentTypeEntity, AIAgentPromptEntity, AIAgentActionEntity, AIPromptEntity, ActionEntity } from '@memberjunction/core-entities';
|
|
6
|
+
import { AIAgentManagementService } from './ai-agent-management.service';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
export interface CreateSubAgentConfig {
|
|
9
|
+
/** Title for the dialog */
|
|
10
|
+
title?: string;
|
|
11
|
+
/** Initial name for the sub-agent */
|
|
12
|
+
initialName?: string;
|
|
13
|
+
/** Pre-selected agent type ID */
|
|
14
|
+
initialTypeID?: string;
|
|
15
|
+
/** Parent agent ID for relationship */
|
|
16
|
+
parentAgentId: string;
|
|
17
|
+
/** Parent agent name for display */
|
|
18
|
+
parentAgentName?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface CreateSubAgentResult {
|
|
21
|
+
/** Created sub-agent entity (not saved to database) */
|
|
22
|
+
subAgent: AIAgentEntity;
|
|
23
|
+
/** Agent prompt link entities (not saved to database) */
|
|
24
|
+
agentPrompts?: AIAgentPromptEntity[];
|
|
25
|
+
/** Agent action link entities (not saved to database) */
|
|
26
|
+
agentActions?: AIAgentActionEntity[];
|
|
27
|
+
/** Any new prompts created within the dialog */
|
|
28
|
+
newPrompts?: AIPromptEntity[];
|
|
29
|
+
/** Any new prompt templates created within the dialog */
|
|
30
|
+
newPromptTemplates?: any[];
|
|
31
|
+
/** Any new template contents created within the dialog */
|
|
32
|
+
newTemplateContents?: any[];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Dialog for creating new AI Sub-Agents with essential fields, actions, and prompts management.
|
|
36
|
+
* Creates entities but does not save them - returns entities for parent to add to PendingRecords.
|
|
37
|
+
* This ensures atomicity with the parent form's save operation.
|
|
38
|
+
*/
|
|
39
|
+
export declare class CreateSubAgentDialogComponent implements OnInit, OnDestroy {
|
|
40
|
+
private dialogRef;
|
|
41
|
+
private cdr;
|
|
42
|
+
private agentManagementService;
|
|
43
|
+
config: CreateSubAgentConfig;
|
|
44
|
+
private destroy$;
|
|
45
|
+
result: Subject<CreateSubAgentResult | null>;
|
|
46
|
+
subAgentForm: FormGroup;
|
|
47
|
+
isLoading$: BehaviorSubject<boolean>;
|
|
48
|
+
isSaving$: BehaviorSubject<boolean>;
|
|
49
|
+
availableAgentTypes$: BehaviorSubject<AIAgentTypeEntity[]>;
|
|
50
|
+
availablePrompts$: BehaviorSubject<AIPromptEntity[]>;
|
|
51
|
+
availableActions$: BehaviorSubject<ActionEntity[]>;
|
|
52
|
+
subAgentEntity: AIAgentEntity | null;
|
|
53
|
+
linkedPrompts: AIPromptEntity[];
|
|
54
|
+
linkedActions: ActionEntity[];
|
|
55
|
+
agentPromptLinks: AIAgentPromptEntity[];
|
|
56
|
+
agentActionLinks: AIAgentActionEntity[];
|
|
57
|
+
newlyCreatedPrompts: AIPromptEntity[];
|
|
58
|
+
newlyCreatedPromptTemplates: any[];
|
|
59
|
+
newlyCreatedTemplateContents: any[];
|
|
60
|
+
constructor(dialogRef: DialogRef, cdr: ChangeDetectorRef, agentManagementService: AIAgentManagementService);
|
|
61
|
+
ngOnInit(): void;
|
|
62
|
+
ngOnDestroy(): void;
|
|
63
|
+
private createForm;
|
|
64
|
+
private setupFormWatching;
|
|
65
|
+
private loadInitialData;
|
|
66
|
+
private updateSubAgentEntity;
|
|
67
|
+
addPrompt(): Promise<void>;
|
|
68
|
+
createNewPrompt(): Promise<void>;
|
|
69
|
+
addAction(): Promise<void>;
|
|
70
|
+
removePrompt(prompt: AIPromptEntity): void;
|
|
71
|
+
removeAction(action: ActionEntity): void;
|
|
72
|
+
save(): Promise<void>;
|
|
73
|
+
cancel(): void;
|
|
74
|
+
getAgentIcon(): string;
|
|
75
|
+
getPromptIcon(): string;
|
|
76
|
+
getActionIcon(): string;
|
|
77
|
+
get linkedPromptCount(): number;
|
|
78
|
+
get linkedActionCount(): number;
|
|
79
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CreateSubAgentDialogComponent, never>;
|
|
80
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<CreateSubAgentDialogComponent, "mj-create-sub-agent-dialog", never, {}, {}, never, never, false, never>;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=create-sub-agent-dialog.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-sub-agent-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgents/create-sub-agent-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAa,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAe,SAAS,EAAc,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,eAAe,EAAa,MAAM,MAAM,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAEzJ,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;;AAEzE,MAAM,WAAW,oBAAoB;IACnC,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,uDAAuD;IACvD,QAAQ,EAAE,aAAa,CAAC;IACxB,yDAAyD;IACzD,YAAY,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACrC,yDAAyD;IACzD,YAAY,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACrC,gDAAgD;IAChD,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,yDAAyD;IACzD,kBAAkB,CAAC,EAAE,GAAG,EAAE,CAAC;IAC3B,0DAA0D;IAC1D,mBAAmB,CAAC,EAAE,GAAG,EAAE,CAAC;CAC7B;AAED;;;;GAIG;AACH,qBAKa,6BAA8B,YAAW,MAAM,EAAE,SAAS;IAkCnE,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,sBAAsB;IAjChC,MAAM,EAAE,oBAAoB,CAA8B;IAG1D,OAAO,CAAC,QAAQ,CAAuB;IAChC,MAAM,uCAA8C;IAG3D,YAAY,EAAE,SAAS,CAAC;IACxB,UAAU,2BAAuC;IACjD,SAAS,2BAAuC;IAGhD,oBAAoB,uCAAgD;IACpE,iBAAiB,oCAA6C;IAC9D,iBAAiB,kCAA2C;IAG5D,cAAc,EAAE,aAAa,GAAG,IAAI,CAAQ;IAC5C,aAAa,EAAE,cAAc,EAAE,CAAM;IACrC,aAAa,EAAE,YAAY,EAAE,CAAM;IAGnC,gBAAgB,EAAE,mBAAmB,EAAE,CAAM;IAC7C,gBAAgB,EAAE,mBAAmB,EAAE,CAAM;IAG7C,mBAAmB,EAAE,cAAc,EAAE,CAAM;IAC3C,2BAA2B,EAAE,GAAG,EAAE,CAAM;IACxC,4BAA4B,EAAE,GAAG,EAAE,CAAM;gBAG/B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,iBAAiB,EACtB,sBAAsB,EAAE,wBAAwB;IAK1D,QAAQ;IAKR,WAAW;IAKX,OAAO,CAAC,UAAU;IAoBlB,OAAO,CAAC,iBAAiB;YASX,eAAe;IAiF7B,OAAO,CAAC,oBAAoB;IAqBf,SAAS;IAsET,eAAe;IAwEf,SAAS;IAgEf,YAAY,CAAC,MAAM,EAAE,cAAc;IA4BnC,YAAY,CAAC,MAAM,EAAE,YAAY;IAsB3B,IAAI;IAyCV,MAAM;IAMN,YAAY,IAAI,MAAM;IAItB,aAAa,IAAI,MAAM;IAIvB,aAAa,IAAI,MAAM;IAI9B,IAAW,iBAAiB,IAAI,MAAM,CAErC;IAED,IAAW,iBAAiB,IAAI,MAAM,CAErC;yCAvfU,6BAA6B;2CAA7B,6BAA6B;CAwfzC"}
|