@memberjunction/ng-core-entity-forms 6.2.0-edge.4 → 6.2.0-edge.5

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 (132) hide show
  1. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +7 -0
  2. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  3. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +31 -17
  4. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  5. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +7 -1
  6. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
  7. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +191 -178
  8. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  9. package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.d.ts +48 -0
  10. package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.d.ts.map +1 -0
  11. package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.js +195 -0
  12. package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.js.map +1 -0
  13. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +324 -322
  14. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  15. package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts.map +1 -1
  16. package/dist/lib/custom/RecordProcesses/record-process-form.component.js +6 -3
  17. package/dist/lib/custom/RecordProcesses/record-process-form.component.js.map +1 -1
  18. package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts +3 -3
  19. package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts.map +1 -1
  20. package/dist/lib/custom/SearchScopes/searchscope-form.component.js +5 -7
  21. package/dist/lib/custom/SearchScopes/searchscope-form.component.js.map +1 -1
  22. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
  23. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +8 -8
  24. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
  25. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts +37 -5
  26. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts.map +1 -1
  27. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +155 -79
  28. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js.map +1 -1
  29. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +8 -0
  30. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
  31. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +59 -8
  32. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  33. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +34 -9
  34. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
  35. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +164 -43
  36. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  37. package/dist/lib/custom/ai-agent-run/run-tree-timeline-projection.js +3 -1
  38. package/dist/lib/custom/ai-agent-run/run-tree-timeline-projection.js.map +1 -1
  39. package/dist/lib/custom/custom-forms.module.d.ts +82 -80
  40. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  41. package/dist/lib/custom/custom-forms.module.js +10 -0
  42. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  43. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
  44. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +65 -47
  45. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
  46. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +115 -117
  47. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
  48. package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.d.ts.map +1 -1
  49. package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js +64 -24
  50. package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js.map +1 -1
  51. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js +74 -52
  52. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js.map +1 -1
  53. package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.d.ts +10 -0
  54. package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.d.ts.map +1 -0
  55. package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.js +86 -0
  56. package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.js.map +1 -0
  57. package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.d.ts +10 -0
  58. package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.d.ts.map +1 -0
  59. package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.js +132 -0
  60. package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.js.map +1 -0
  61. package/dist/lib/generated/Entities/MJAIBridgeAgentIdentity/mjaibridgeagentidentity.form.component.js +12 -10
  62. package/dist/lib/generated/Entities/MJAIBridgeAgentIdentity/mjaibridgeagentidentity.form.component.js.map +1 -1
  63. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.d.ts.map +1 -1
  64. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js +86 -32
  65. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js.map +1 -1
  66. package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.d.ts.map +1 -1
  67. package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.js +25 -7
  68. package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.js.map +1 -1
  69. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.d.ts.map +1 -1
  70. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js +180 -160
  71. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js.map +1 -1
  72. package/dist/lib/generated/Entities/MJActionParam/mjactionparam.form.component.js +16 -14
  73. package/dist/lib/generated/Entities/MJActionParam/mjactionparam.form.component.js.map +1 -1
  74. package/dist/lib/generated/Entities/MJArchiveConfiguration/mjarchiveconfiguration.form.component.js +23 -21
  75. package/dist/lib/generated/Entities/MJArchiveConfiguration/mjarchiveconfiguration.form.component.js.map +1 -1
  76. package/dist/lib/generated/Entities/MJArchiveRun/mjarchiverun.form.component.js +21 -19
  77. package/dist/lib/generated/Entities/MJArchiveRun/mjarchiverun.form.component.js.map +1 -1
  78. package/dist/lib/generated/Entities/MJCommunicationProvider/mjcommunicationprovider.form.component.js +30 -20
  79. package/dist/lib/generated/Entities/MJCommunicationProvider/mjcommunicationprovider.form.component.js.map +1 -1
  80. package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js +69 -75
  81. package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js.map +1 -1
  82. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.d.ts.map +1 -1
  83. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js +35 -17
  84. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js.map +1 -1
  85. package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.d.ts +10 -0
  86. package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.d.ts.map +1 -0
  87. package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.js +130 -0
  88. package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.js.map +1 -0
  89. package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js +26 -14
  90. package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js.map +1 -1
  91. package/dist/lib/generated/Entities/MJFeatureValueCache/mjfeaturevaluecache.form.component.js +23 -19
  92. package/dist/lib/generated/Entities/MJFeatureValueCache/mjfeaturevaluecache.form.component.js.map +1 -1
  93. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js +29 -27
  94. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js.map +1 -1
  95. package/dist/lib/generated/Entities/MJProcessRunDetail/mjprocessrundetail.form.component.js +17 -15
  96. package/dist/lib/generated/Entities/MJProcessRunDetail/mjprocessrundetail.form.component.js.map +1 -1
  97. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.d.ts.map +1 -1
  98. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js +27 -9
  99. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js.map +1 -1
  100. package/dist/lib/generated/Entities/MJTest/mjtest.form.component.d.ts.map +1 -1
  101. package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js +24 -6
  102. package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js.map +1 -1
  103. package/dist/lib/generated/Entities/MJTestRun/mjtestrun.form.component.d.ts.map +1 -1
  104. package/dist/lib/generated/Entities/MJTestRun/mjtestrun.form.component.js +29 -11
  105. package/dist/lib/generated/Entities/MJTestRun/mjtestrun.form.component.js.map +1 -1
  106. package/dist/lib/generated/Entities/MJTheme/mjtheme.form.component.d.ts.map +1 -1
  107. package/dist/lib/generated/Entities/MJTheme/mjtheme.form.component.js +13 -3
  108. package/dist/lib/generated/Entities/MJTheme/mjtheme.form.component.js.map +1 -1
  109. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  110. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +176 -122
  111. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  112. package/dist/lib/generated/Entities/MJUserRoutine/mjuserroutine.form.component.js +31 -25
  113. package/dist/lib/generated/Entities/MJUserRoutine/mjuserroutine.form.component.js.map +1 -1
  114. package/dist/lib/generated/generated-forms.module.d.ts +129 -126
  115. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  116. package/dist/lib/generated/generated-forms.module.js +9 -0
  117. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  118. package/dist/lib/panels/feature-values/feature-values.logic.d.ts +55 -0
  119. package/dist/lib/panels/feature-values/feature-values.logic.d.ts.map +1 -0
  120. package/dist/lib/panels/feature-values/feature-values.logic.js +88 -0
  121. package/dist/lib/panels/feature-values/feature-values.logic.js.map +1 -0
  122. package/dist/lib/panels/feature-values/feature-values.panel.d.ts +39 -0
  123. package/dist/lib/panels/feature-values/feature-values.panel.d.ts.map +1 -0
  124. package/dist/lib/panels/feature-values/feature-values.panel.js +303 -0
  125. package/dist/lib/panels/feature-values/feature-values.panel.js.map +1 -0
  126. package/dist/lib/shared/components/template-editor.component.js +2 -2
  127. package/dist/lib/shared/components/template-editor.component.js.map +1 -1
  128. package/dist/public-api.d.ts +1 -0
  129. package/dist/public-api.d.ts.map +1 -1
  130. package/dist/public-api.js +1 -0
  131. package/dist/public-api.js.map +1 -1
  132. package/package.json +48 -48
@@ -35,7 +35,7 @@ function _forTrack0($index, $item) { return this.getModelTrackId($item) || $inde
35
35
  const _forTrack1 = ($index, $item) => $item.ID;
36
36
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_9_Template(rf, ctx) { if (rf & 1) {
37
37
  const _r3 = i0.ɵɵgetCurrentView();
38
- i0.ɵɵelementStart(0, "input", 51);
38
+ i0.ɵɵelementStart(0, "input", 52);
39
39
  i0.ɵɵtwoWayListener("ngModelChange", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_9_Template_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.record.Name, $event) || (ctx_r1.record.Name = $event); return i0.ɵɵresetView($event); });
40
40
  i0.ɵɵelementEnd();
41
41
  } if (rf & 2) {
@@ -43,10 +43,10 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_9_Template(rf
43
43
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.record.Name);
44
44
  } }
45
45
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_10_Template(rf, ctx) { if (rf & 1) {
46
- i0.ɵɵelementStart(0, "h4", 52);
46
+ i0.ɵɵelementStart(0, "h4", 53);
47
47
  i0.ɵɵtext(1);
48
48
  i0.ɵɵelementEnd();
49
- i0.ɵɵelementStart(2, "span", 53);
49
+ i0.ɵɵelementStart(2, "span", 54);
50
50
  i0.ɵɵtext(3);
51
51
  i0.ɵɵelementEnd();
52
52
  } if (rf & 2) {
@@ -59,14 +59,14 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_10_Template(r
59
59
  i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Status, " ");
60
60
  } }
61
61
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_11_Conditional_10_Template(rf, ctx) { if (rf & 1) {
62
- i0.ɵɵelementStart(0, "div", 56);
63
- i0.ɵɵelement(1, "i", 58);
62
+ i0.ɵɵelementStart(0, "div", 57);
63
+ i0.ɵɵelement(1, "i", 59);
64
64
  i0.ɵɵtext(2, " Loading types... ");
65
65
  i0.ɵɵelementEnd();
66
66
  } }
67
67
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_11_Conditional_11_Template(rf, ctx) { if (rf & 1) {
68
68
  const _r5 = i0.ɵɵgetCurrentView();
69
- i0.ɵɵelementStart(0, "mj-dropdown", 59);
69
+ i0.ɵɵelementStart(0, "mj-dropdown", 60);
70
70
  i0.ɵɵtwoWayListener("ngModelChange", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_11_Conditional_11_Template_mj_dropdown_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.record.TypeID, $event) || (ctx_r1.record.TypeID = $event); return i0.ɵɵresetView($event); });
71
71
  i0.ɵɵelementEnd();
72
72
  } if (rf & 2) {
@@ -76,18 +76,18 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_11_Conditiona
76
76
  } }
77
77
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_11_Template(rf, ctx) { if (rf & 1) {
78
78
  const _r4 = i0.ɵɵgetCurrentView();
79
- i0.ɵɵelementStart(0, "div", 13)(1, "div")(2, "label", 45);
79
+ i0.ɵɵelementStart(0, "div", 13)(1, "div")(2, "label", 46);
80
80
  i0.ɵɵtext(3, "Status");
81
81
  i0.ɵɵelementEnd();
82
- i0.ɵɵelementStart(4, "mj-dropdown", 54);
82
+ i0.ɵɵelementStart(4, "mj-dropdown", 55);
83
83
  i0.ɵɵtwoWayListener("ngModelChange", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_11_Template_mj_dropdown_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.record.Status, $event) || (ctx_r1.record.Status = $event); return i0.ɵɵresetView($event); });
84
84
  i0.ɵɵelementEnd()();
85
- i0.ɵɵelementStart(5, "div")(6, "label", 45);
85
+ i0.ɵɵelementStart(5, "div")(6, "label", 46);
86
86
  i0.ɵɵtext(7, " Type ");
87
- i0.ɵɵelementStart(8, "span", 55);
87
+ i0.ɵɵelementStart(8, "span", 56);
88
88
  i0.ɵɵtext(9, "*");
89
89
  i0.ɵɵelementEnd()();
90
- i0.ɵɵconditionalCreate(10, MJAIPromptFormComponentExtended_Conditional_1_Conditional_11_Conditional_10_Template, 3, 0, "div", 56)(11, MJAIPromptFormComponentExtended_Conditional_1_Conditional_11_Conditional_11_Template, 1, 4, "mj-dropdown", 57);
90
+ i0.ɵɵconditionalCreate(10, MJAIPromptFormComponentExtended_Conditional_1_Conditional_11_Conditional_10_Template, 3, 0, "div", 57)(11, MJAIPromptFormComponentExtended_Conditional_1_Conditional_11_Conditional_11_Template, 1, 4, "mj-dropdown", 58);
91
91
  i0.ɵɵelementEnd()();
92
92
  } if (rf & 2) {
93
93
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -99,7 +99,7 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_11_Template(r
99
99
  } }
100
100
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_12_Template(rf, ctx) { if (rf & 1) {
101
101
  const _r6 = i0.ɵɵgetCurrentView();
102
- i0.ɵɵelementStart(0, "textarea", 60);
102
+ i0.ɵɵelementStart(0, "textarea", 61);
103
103
  i0.ɵɵtwoWayListener("ngModelChange", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_12_Template_textarea_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.record.Description, $event) || (ctx_r1.record.Description = $event); return i0.ɵɵresetView($event); });
104
104
  i0.ɵɵelementEnd();
105
105
  } if (rf & 2) {
@@ -118,7 +118,7 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_13_Template(r
118
118
  } }
119
119
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_15_Template(rf, ctx) { if (rf & 1) {
120
120
  i0.ɵɵelementStart(0, "div", 17);
121
- i0.ɵɵelement(1, "i", 61);
121
+ i0.ɵɵelement(1, "i", 62);
122
122
  i0.ɵɵelementStart(2, "span", 19);
123
123
  i0.ɵɵtext(3, "Type:");
124
124
  i0.ɵɵelementEnd();
@@ -132,14 +132,14 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_15_Template(r
132
132
  } }
133
133
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_28_Template(rf, ctx) { if (rf & 1) {
134
134
  i0.ɵɵelementStart(0, "div", 17);
135
- i0.ɵɵelement(1, "i", 62);
136
- i0.ɵɵelementStart(2, "span", 63);
135
+ i0.ɵɵelement(1, "i", 63);
136
+ i0.ɵɵelementStart(2, "span", 64);
137
137
  i0.ɵɵtext(3, "Caching Enabled");
138
138
  i0.ɵɵelementEnd()();
139
139
  } }
140
140
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_29_Template(rf, ctx) { if (rf & 1) {
141
141
  i0.ɵɵelementStart(0, "div", 17);
142
- i0.ɵɵelement(1, "i", 64);
142
+ i0.ɵɵelement(1, "i", 65);
143
143
  i0.ɵɵelementStart(2, "span", 19);
144
144
  i0.ɵɵtext(3, "Effort Level:");
145
145
  i0.ɵɵelementEnd();
@@ -153,9 +153,9 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_29_Template(r
153
153
  } }
154
154
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_32_Template(rf, ctx) { if (rf & 1) {
155
155
  const _r7 = i0.ɵɵgetCurrentView();
156
- i0.ɵɵelementStart(0, "button", 65);
156
+ i0.ɵɵelementStart(0, "button", 66);
157
157
  i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_32_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.openTestHarness()); });
158
- i0.ɵɵelement(1, "i", 66);
158
+ i0.ɵɵelement(1, "i", 67);
159
159
  i0.ɵɵtext(2, " Run ");
160
160
  i0.ɵɵelementEnd();
161
161
  } }
@@ -187,7 +187,7 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_33_Template(r
187
187
  i0.ɵɵconditional(!ctx_r1.template && ctx_r1.record.TemplateID ? 3 : -1);
188
188
  } }
189
189
  function MJAIPromptFormComponentExtended_Conditional_1_ng_template_36_Conditional_3_Template(rf, ctx) { if (rf & 1) {
190
- i0.ɵɵelementStart(0, "span", 68);
190
+ i0.ɵɵelementStart(0, "span", 69);
191
191
  i0.ɵɵtext(1);
192
192
  i0.ɵɵelementEnd();
193
193
  } if (rf & 2) {
@@ -196,10 +196,10 @@ function MJAIPromptFormComponentExtended_Conditional_1_ng_template_36_Conditiona
196
196
  i0.ɵɵtextInterpolate1("\u2022 ", ctx_r1.template.Name);
197
197
  } }
198
198
  function MJAIPromptFormComponentExtended_Conditional_1_ng_template_36_Template(rf, ctx) { if (rf & 1) {
199
- i0.ɵɵelementStart(0, "span", 67);
199
+ i0.ɵɵelementStart(0, "span", 68);
200
200
  i0.ɵɵelement(1, "i", 21);
201
201
  i0.ɵɵtext(2, " Template Editor ");
202
- i0.ɵɵconditionalCreate(3, MJAIPromptFormComponentExtended_Conditional_1_ng_template_36_Conditional_3_Template, 2, 1, "span", 68);
202
+ i0.ɵɵconditionalCreate(3, MJAIPromptFormComponentExtended_Conditional_1_ng_template_36_Conditional_3_Template, 2, 1, "span", 69);
203
203
  i0.ɵɵelementEnd();
204
204
  } if (rf & 2) {
205
205
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -208,30 +208,30 @@ function MJAIPromptFormComponentExtended_Conditional_1_ng_template_36_Template(r
208
208
  } }
209
209
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_38_Template(rf, ctx) { if (rf & 1) {
210
210
  i0.ɵɵelementStart(0, "div", 31);
211
- i0.ɵɵelement(1, "i", 69);
211
+ i0.ɵɵelement(1, "i", 70);
212
212
  i0.ɵɵtext(2, " Loading template... ");
213
213
  i0.ɵɵelementEnd();
214
214
  } }
215
215
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_39_Conditional_2_Template(rf, ctx) { if (rf & 1) {
216
216
  const _r8 = i0.ɵɵgetCurrentView();
217
- i0.ɵɵelementStart(0, "button", 73);
217
+ i0.ɵɵelementStart(0, "button", 74);
218
218
  i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_39_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.createNewTemplate()); });
219
- i0.ɵɵelement(1, "i", 74);
219
+ i0.ɵɵelement(1, "i", 75);
220
220
  i0.ɵɵtext(2, " Create New Template ");
221
221
  i0.ɵɵelementEnd();
222
222
  } }
223
223
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_39_Conditional_3_Template(rf, ctx) { if (rf & 1) {
224
224
  const _r9 = i0.ɵɵgetCurrentView();
225
- i0.ɵɵelementStart(0, "button", 75);
225
+ i0.ɵɵelementStart(0, "button", 76);
226
226
  i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_39_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.linkExistingTemplate()); });
227
- i0.ɵɵelement(1, "i", 76);
227
+ i0.ɵɵelement(1, "i", 77);
228
228
  i0.ɵɵtext(2, " Link Existing Template ");
229
229
  i0.ɵɵelementEnd();
230
230
  } }
231
231
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_39_Template(rf, ctx) { if (rf & 1) {
232
- i0.ɵɵelementStart(0, "mj-empty-state", 32)(1, "div", 70);
233
- i0.ɵɵconditionalCreate(2, MJAIPromptFormComponentExtended_Conditional_1_Conditional_39_Conditional_2_Template, 3, 0, "button", 71);
234
- i0.ɵɵconditionalCreate(3, MJAIPromptFormComponentExtended_Conditional_1_Conditional_39_Conditional_3_Template, 3, 0, "button", 72);
232
+ i0.ɵɵelementStart(0, "mj-empty-state", 32)(1, "div", 71);
233
+ i0.ɵɵconditionalCreate(2, MJAIPromptFormComponentExtended_Conditional_1_Conditional_39_Conditional_2_Template, 3, 0, "button", 72);
234
+ i0.ɵɵconditionalCreate(3, MJAIPromptFormComponentExtended_Conditional_1_Conditional_39_Conditional_3_Template, 3, 0, "button", 73);
235
235
  i0.ɵɵelementEnd()();
236
236
  } if (rf & 2) {
237
237
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -242,20 +242,20 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_39_Template(r
242
242
  } }
243
243
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_40_Conditional_5_Template(rf, ctx) { if (rf & 1) {
244
244
  const _r11 = i0.ɵɵgetCurrentView();
245
- i0.ɵɵelementStart(0, "button", 73);
245
+ i0.ɵɵelementStart(0, "button", 74);
246
246
  i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_40_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.createNewTemplate()); });
247
- i0.ɵɵelement(1, "i", 74);
247
+ i0.ɵɵelement(1, "i", 75);
248
248
  i0.ɵɵtext(2, " Create New Template ");
249
249
  i0.ɵɵelementEnd();
250
250
  } }
251
251
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_40_Template(rf, ctx) { if (rf & 1) {
252
252
  const _r10 = i0.ɵɵgetCurrentView();
253
- i0.ɵɵelementStart(0, "mj-empty-state", 33)(1, "div", 70)(2, "button", 75);
253
+ i0.ɵɵelementStart(0, "mj-empty-state", 33)(1, "div", 71)(2, "button", 76);
254
254
  i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_40_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.loadTemplate()); });
255
- i0.ɵɵelement(3, "i", 77);
255
+ i0.ɵɵelement(3, "i", 78);
256
256
  i0.ɵɵtext(4, " Retry Loading ");
257
257
  i0.ɵɵelementEnd();
258
- i0.ɵɵconditionalCreate(5, MJAIPromptFormComponentExtended_Conditional_1_Conditional_40_Conditional_5_Template, 3, 0, "button", 71);
258
+ i0.ɵɵconditionalCreate(5, MJAIPromptFormComponentExtended_Conditional_1_Conditional_40_Conditional_5_Template, 3, 0, "button", 72);
259
259
  i0.ɵɵelementEnd()();
260
260
  } if (rf & 2) {
261
261
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -264,24 +264,24 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_40_Template(r
264
264
  } }
265
265
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_41_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
266
266
  const _r13 = i0.ɵɵgetCurrentView();
267
- i0.ɵɵelementStart(0, "button", 83);
267
+ i0.ɵɵelementStart(0, "button", 84);
268
268
  i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_41_Conditional_1_Conditional_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.linkExistingTemplate()); });
269
- i0.ɵɵelement(1, "i", 84);
269
+ i0.ɵɵelement(1, "i", 85);
270
270
  i0.ɵɵtext(2, " Change Template ");
271
271
  i0.ɵɵelementEnd();
272
272
  } }
273
273
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_41_Conditional_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
274
274
  const _r14 = i0.ɵɵgetCurrentView();
275
- i0.ɵɵelementStart(0, "button", 85);
275
+ i0.ɵɵelementStart(0, "button", 86);
276
276
  i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_41_Conditional_1_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.openTemplateInNewWindow()); });
277
- i0.ɵɵelement(1, "i", 86);
277
+ i0.ɵɵelement(1, "i", 87);
278
278
  i0.ɵɵtext(2, " Open in New Window ");
279
279
  i0.ɵɵelementEnd();
280
280
  } }
281
281
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_41_Conditional_1_Template(rf, ctx) { if (rf & 1) {
282
- i0.ɵɵelementStart(0, "div", 78);
283
- i0.ɵɵconditionalCreate(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_41_Conditional_1_Conditional_1_Template, 3, 0, "button", 81);
284
- i0.ɵɵconditionalCreate(2, MJAIPromptFormComponentExtended_Conditional_1_Conditional_41_Conditional_1_Conditional_2_Template, 3, 0, "button", 82);
282
+ i0.ɵɵelementStart(0, "div", 79);
283
+ i0.ɵɵconditionalCreate(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_41_Conditional_1_Conditional_1_Template, 3, 0, "button", 82);
284
+ i0.ɵɵconditionalCreate(2, MJAIPromptFormComponentExtended_Conditional_1_Conditional_41_Conditional_1_Conditional_2_Template, 3, 0, "button", 83);
285
285
  i0.ɵɵelementEnd();
286
286
  } if (rf & 2) {
287
287
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -293,8 +293,8 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_41_Conditiona
293
293
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_41_Template(rf, ctx) { if (rf & 1) {
294
294
  const _r12 = i0.ɵɵgetCurrentView();
295
295
  i0.ɵɵelementStart(0, "div", 34);
296
- i0.ɵɵconditionalCreate(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_41_Conditional_1_Template, 3, 2, "div", 78);
297
- i0.ɵɵelementStart(2, "div", 79)(3, "mj-template-editor", 80, 1);
296
+ i0.ɵɵconditionalCreate(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_41_Conditional_1_Template, 3, 2, "div", 79);
297
+ i0.ɵɵelementStart(2, "div", 80)(3, "mj-template-editor", 81, 1);
298
298
  i0.ɵɵlistener("contentChange", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_41_Template_mj_template_editor_contentChange_3_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onTemplateContentChange($event)); })("runTemplate", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_41_Template_mj_template_editor_runTemplate_3_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onTemplateRun($event)); });
299
299
  i0.ɵɵelementEnd()()();
300
300
  } if (rf & 2) {
@@ -305,7 +305,7 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_41_Template(r
305
305
  i0.ɵɵproperty("template", ctx_r1.template)("config", ctx_r1.templateEditorConfig);
306
306
  } }
307
307
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_ng_template_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
308
- i0.ɵɵelementStart(0, "span", 90);
308
+ i0.ɵɵelementStart(0, "span", 91);
309
309
  i0.ɵɵtext(1);
310
310
  i0.ɵɵelementEnd();
311
311
  } if (rf & 2) {
@@ -314,12 +314,12 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_ng_templat
314
314
  i0.ɵɵtextInterpolate(ctx_r1.promptModels.length);
315
315
  } }
316
316
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_ng_template_1_Template(rf, ctx) { if (rf & 1) {
317
- i0.ɵɵelementStart(0, "span", 67);
318
- i0.ɵɵelement(1, "i", 89);
317
+ i0.ɵɵelementStart(0, "span", 68);
318
+ i0.ɵɵelement(1, "i", 90);
319
319
  i0.ɵɵtext(2, " Models ");
320
- i0.ɵɵconditionalCreate(3, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_ng_template_1_Conditional_3_Template, 2, 1, "span", 90);
321
- i0.ɵɵelementStart(4, "span", 91);
322
- i0.ɵɵelement(5, "i", 92);
320
+ i0.ɵɵconditionalCreate(3, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_ng_template_1_Conditional_3_Template, 2, 1, "span", 91);
321
+ i0.ɵɵelementStart(4, "span", 92);
322
+ i0.ɵɵelement(5, "i", 93);
323
323
  i0.ɵɵtext(6, " Priority order (first available model will be used) ");
324
324
  i0.ɵɵelementEnd()();
325
325
  } if (rf & 2) {
@@ -328,22 +328,22 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_ng_templat
328
328
  i0.ɵɵconditional(ctx_r1.promptModels.length > 0 ? 3 : -1);
329
329
  } }
330
330
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_4_Template(rf, ctx) { if (rf & 1) {
331
- i0.ɵɵelementStart(0, "div", 88);
332
- i0.ɵɵelement(1, "i", 58);
331
+ i0.ɵɵelementStart(0, "div", 89);
332
+ i0.ɵɵelement(1, "i", 59);
333
333
  i0.ɵɵtext(2, " Loading models... ");
334
334
  i0.ɵɵelementEnd();
335
335
  } }
336
336
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
337
337
  const _r15 = i0.ɵɵgetCurrentView();
338
- i0.ɵɵelementStart(0, "button", 95);
338
+ i0.ɵɵelementStart(0, "button", 96);
339
339
  i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_0_Conditional_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.addNewModel()); });
340
- i0.ɵɵelement(1, "i", 74);
340
+ i0.ɵɵelement(1, "i", 75);
341
341
  i0.ɵɵtext(2, " Add Model ");
342
342
  i0.ɵɵelementEnd();
343
343
  } }
344
344
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_0_Template(rf, ctx) { if (rf & 1) {
345
- i0.ɵɵelementStart(0, "mj-empty-state", 93);
346
- i0.ɵɵconditionalCreate(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_0_Conditional_1_Template, 3, 0, "button", 94);
345
+ i0.ɵɵelementStart(0, "mj-empty-state", 94);
346
+ i0.ɵɵconditionalCreate(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_0_Conditional_1_Template, 3, 0, "button", 95);
347
347
  i0.ɵɵelementEnd();
348
348
  } if (rf & 2) {
349
349
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -351,14 +351,14 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
351
351
  i0.ɵɵconditional(ctx_r1.EditMode && ctx_r1.UserCanCreatePromptModels ? 1 : -1);
352
352
  } }
353
353
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_Conditional_0_Template(rf, ctx) { if (rf & 1) {
354
- i0.ɵɵelementStart(0, "div", 96);
355
- i0.ɵɵelement(1, "i", 101);
354
+ i0.ɵɵelementStart(0, "div", 97);
355
+ i0.ɵɵelement(1, "i", 102);
356
356
  i0.ɵɵtext(2, " Models are tried in priority order (highest priority first). The first available model that meets requirements will be used for execution. ");
357
357
  i0.ɵɵelementEnd();
358
358
  } }
359
359
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_2_Template(rf, ctx) { if (rf & 1) {
360
- i0.ɵɵelement(0, "i", 117);
361
- i0.ɵɵelementStart(1, "span", 118);
360
+ i0.ɵɵelement(0, "i", 118);
361
+ i0.ɵɵelementStart(1, "span", 119);
362
362
  i0.ɵɵtext(2);
363
363
  i0.ɵɵelementEnd();
364
364
  } if (rf & 2) {
@@ -367,7 +367,7 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
367
367
  i0.ɵɵtextInterpolate1("#", ɵ$index_289_r17 + 1);
368
368
  } }
369
369
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_3_Template(rf, ctx) { if (rf & 1) {
370
- i0.ɵɵelementStart(0, "span", 104);
370
+ i0.ɵɵelementStart(0, "span", 105);
371
371
  i0.ɵɵtext(1);
372
372
  i0.ɵɵelementEnd();
373
373
  } if (rf & 2) {
@@ -380,7 +380,7 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
380
380
  } }
381
381
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_5_Template(rf, ctx) { if (rf & 1) {
382
382
  const _r20 = i0.ɵɵgetCurrentView();
383
- i0.ɵɵelementStart(0, "mj-dropdown", 119);
383
+ i0.ɵɵelementStart(0, "mj-dropdown", 120);
384
384
  i0.ɵɵtwoWayListener("ngModelChange", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_5_Template_mj_dropdown_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r20); const model_r19 = i0.ɵɵnextContext().$implicit; i0.ɵɵtwoWayBindingSet(model_r19.ModelID, $event) || (model_r19.ModelID = $event); return i0.ɵɵresetView($event); });
385
385
  i0.ɵɵlistener("ValueChange", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_5_Template_mj_dropdown_ValueChange_0_listener($event) { i0.ɵɵrestoreView(_r20); const ɵ$index_289_r17 = i0.ɵɵnextContext().$index; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.onModelChange($event, ɵ$index_289_r17)); });
386
386
  i0.ɵɵelementEnd();
@@ -402,7 +402,7 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
402
402
  } }
403
403
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_0_Conditional_0_Template(rf, ctx) { if (rf & 1) {
404
404
  const _r21 = i0.ɵɵgetCurrentView();
405
- i0.ɵɵelementStart(0, "mj-dropdown", 122);
405
+ i0.ɵɵelementStart(0, "mj-dropdown", 123);
406
406
  i0.ɵɵtwoWayListener("ngModelChange", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_0_Conditional_0_Template_mj_dropdown_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r21); const model_r19 = i0.ɵɵnextContext(3).$implicit; i0.ɵɵtwoWayBindingSet(model_r19.VendorID, $event) || (model_r19.VendorID = $event); return i0.ɵɵresetView($event); });
407
407
  i0.ɵɵelementEnd();
408
408
  } if (rf & 2) {
@@ -412,7 +412,7 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
412
412
  i0.ɵɵproperty("name", "vendorId_" + ctx_r1.getModelTrackId(model_r19))("Data", ctx_r1.getVendorsForModelSync(model_r19.ModelID))("ValuePrimitive", true)("Filterable", true);
413
413
  } }
414
414
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_0_Conditional_1_Conditional_0_Conditional_2_Template(rf, ctx) { if (rf & 1) {
415
- i0.ɵɵelementStart(0, "span", 125);
415
+ i0.ɵɵelementStart(0, "span", 126);
416
416
  i0.ɵɵtext(1);
417
417
  i0.ɵɵelementEnd();
418
418
  } if (rf & 2) {
@@ -422,9 +422,9 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
422
422
  i0.ɵɵtextInterpolate1("(", ctx_r1.getModelVendorStatus(model_r19.ModelID, ctx_r1.getVendorsForModelSync(model_r19.ModelID)[0].ID), ")");
423
423
  } }
424
424
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_0_Conditional_1_Conditional_0_Template(rf, ctx) { if (rf & 1) {
425
- i0.ɵɵelementStart(0, "span", 124);
425
+ i0.ɵɵelementStart(0, "span", 125);
426
426
  i0.ɵɵtext(1);
427
- i0.ɵɵconditionalCreate(2, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_0_Conditional_1_Conditional_0_Conditional_2_Template, 2, 1, "span", 125);
427
+ i0.ɵɵconditionalCreate(2, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_0_Conditional_1_Conditional_0_Conditional_2_Template, 2, 1, "span", 126);
428
428
  i0.ɵɵelementEnd();
429
429
  } if (rf & 2) {
430
430
  const model_r19 = i0.ɵɵnextContext(4).$implicit;
@@ -436,37 +436,37 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
436
436
  i0.ɵɵconditional(ctx_r1.getModelVendorStatus(model_r19.ModelID, ctx_r1.getVendorsForModelSync(model_r19.ModelID)[0].ID) !== "Active" ? 2 : -1);
437
437
  } }
438
438
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_0_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
439
- i0.ɵɵelementStart(0, "span", 120);
439
+ i0.ɵɵelementStart(0, "span", 121);
440
440
  i0.ɵɵtext(1, "No vendors available");
441
441
  i0.ɵɵelementEnd();
442
442
  } }
443
443
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
444
- i0.ɵɵconditionalCreate(0, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_0_Conditional_1_Conditional_0_Template, 3, 4, "span", 123)(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_0_Conditional_1_Conditional_1_Template, 2, 0, "span", 120);
444
+ i0.ɵɵconditionalCreate(0, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_0_Conditional_1_Conditional_0_Template, 3, 4, "span", 124)(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_0_Conditional_1_Conditional_1_Template, 2, 0, "span", 121);
445
445
  } if (rf & 2) {
446
446
  const model_r19 = i0.ɵɵnextContext(3).$implicit;
447
447
  const ctx_r1 = i0.ɵɵnextContext(5);
448
448
  i0.ɵɵconditional(ctx_r1.getVendorsForModelSync(model_r19.ModelID).length === 1 ? 0 : 1);
449
449
  } }
450
450
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_0_Template(rf, ctx) { if (rf & 1) {
451
- i0.ɵɵconditionalCreate(0, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_0_Conditional_0_Template, 1, 5, "mj-dropdown", 121)(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_0_Conditional_1_Template, 2, 1);
451
+ i0.ɵɵconditionalCreate(0, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_0_Conditional_0_Template, 1, 5, "mj-dropdown", 122)(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_0_Conditional_1_Template, 2, 1);
452
452
  } if (rf & 2) {
453
453
  const model_r19 = i0.ɵɵnextContext(2).$implicit;
454
454
  const ctx_r1 = i0.ɵɵnextContext(5);
455
455
  i0.ɵɵconditional(ctx_r1.shouldShowVendorDropdown(model_r19.ModelID) ? 0 : 1);
456
456
  } }
457
457
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_1_Template(rf, ctx) { if (rf & 1) {
458
- i0.ɵɵelementStart(0, "span", 120);
458
+ i0.ɵɵelementStart(0, "span", 121);
459
459
  i0.ɵɵtext(1, "Select model first");
460
460
  i0.ɵɵelementEnd();
461
461
  } }
462
462
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Template(rf, ctx) { if (rf & 1) {
463
- i0.ɵɵconditionalCreate(0, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_0_Template, 2, 1)(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_1_Template, 2, 0, "span", 120);
463
+ i0.ɵɵconditionalCreate(0, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_0_Template, 2, 1)(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Conditional_1_Template, 2, 0, "span", 121);
464
464
  } if (rf & 2) {
465
465
  const model_r19 = i0.ɵɵnextContext().$implicit;
466
466
  i0.ɵɵconditional(model_r19.ModelID ? 0 : 1);
467
467
  } }
468
468
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_9_Conditional_0_Conditional_2_Template(rf, ctx) { if (rf & 1) {
469
- i0.ɵɵelementStart(0, "span", 125);
469
+ i0.ɵɵelementStart(0, "span", 126);
470
470
  i0.ɵɵtext(1);
471
471
  i0.ɵɵelementEnd();
472
472
  } if (rf & 2) {
@@ -476,9 +476,9 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
476
476
  i0.ɵɵtextInterpolate1("(", ctx_r1.getModelVendorStatus(model_r19.ModelID, model_r19.VendorID), ")");
477
477
  } }
478
478
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_9_Conditional_0_Template(rf, ctx) { if (rf & 1) {
479
- i0.ɵɵelementStart(0, "span", 109);
479
+ i0.ɵɵelementStart(0, "span", 110);
480
480
  i0.ɵɵtext(1);
481
- i0.ɵɵconditionalCreate(2, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_9_Conditional_0_Conditional_2_Template, 2, 1, "span", 125);
481
+ i0.ɵɵconditionalCreate(2, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_9_Conditional_0_Conditional_2_Template, 2, 1, "span", 126);
482
482
  i0.ɵɵelementEnd();
483
483
  } if (rf & 2) {
484
484
  const model_r19 = i0.ɵɵnextContext(2).$implicit;
@@ -490,25 +490,25 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
490
490
  i0.ɵɵconditional(ctx_r1.getModelVendorStatus(model_r19.ModelID, model_r19.VendorID) !== "Active" ? 2 : -1);
491
491
  } }
492
492
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_9_Conditional_1_Template(rf, ctx) { if (rf & 1) {
493
- i0.ɵɵelementStart(0, "span", 127);
493
+ i0.ɵɵelementStart(0, "span", 128);
494
494
  i0.ɵɵtext(1, "-");
495
495
  i0.ɵɵelementEnd();
496
496
  } }
497
497
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_9_Template(rf, ctx) { if (rf & 1) {
498
- i0.ɵɵconditionalCreate(0, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_9_Conditional_0_Template, 3, 4, "span", 126)(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_9_Conditional_1_Template, 2, 0, "span", 127);
498
+ i0.ɵɵconditionalCreate(0, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_9_Conditional_0_Template, 3, 4, "span", 127)(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_9_Conditional_1_Template, 2, 0, "span", 128);
499
499
  } if (rf & 2) {
500
500
  const model_r19 = i0.ɵɵnextContext().$implicit;
501
501
  i0.ɵɵconditional(model_r19.VendorID && model_r19.ModelID ? 0 : 1);
502
502
  } }
503
503
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_11_Conditional_0_Template(rf, ctx) { if (rf & 1) {
504
- i0.ɵɵelementStart(0, "div", 128);
505
- i0.ɵɵelement(1, "i", 58);
504
+ i0.ɵɵelementStart(0, "div", 129);
505
+ i0.ɵɵelement(1, "i", 59);
506
506
  i0.ɵɵtext(2, " Loading... ");
507
507
  i0.ɵɵelementEnd();
508
508
  } }
509
509
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_11_Conditional_1_Template(rf, ctx) { if (rf & 1) {
510
510
  const _r22 = i0.ɵɵgetCurrentView();
511
- i0.ɵɵelementStart(0, "mj-dropdown", 130);
511
+ i0.ɵɵelementStart(0, "mj-dropdown", 131);
512
512
  i0.ɵɵtwoWayListener("ngModelChange", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_11_Conditional_1_Template_mj_dropdown_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r22); const model_r19 = i0.ɵɵnextContext(2).$implicit; i0.ɵɵtwoWayBindingSet(model_r19.ConfigurationID, $event) || (model_r19.ConfigurationID = $event); return i0.ɵɵresetView($event); });
513
513
  i0.ɵɵlistener("ValueChange", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_11_Conditional_1_Template_mj_dropdown_ValueChange_0_listener($event) { i0.ɵɵrestoreView(_r22); const ɵ$index_289_r17 = i0.ɵɵnextContext(2).$index; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.onConfigurationChange($event, ɵ$index_289_r17)); });
514
514
  i0.ɵɵelementEnd();
@@ -519,13 +519,13 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
519
519
  i0.ɵɵproperty("name", "configurationId_" + ctx_r1.getModelTrackId(model_r19))("Data", ctx_r1.availableConfigurations)("ValuePrimitive", true)("Filterable", true);
520
520
  } }
521
521
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_11_Template(rf, ctx) { if (rf & 1) {
522
- i0.ɵɵconditionalCreate(0, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_11_Conditional_0_Template, 3, 0, "div", 128)(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_11_Conditional_1_Template, 1, 5, "mj-dropdown", 129);
522
+ i0.ɵɵconditionalCreate(0, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_11_Conditional_0_Template, 3, 0, "div", 129)(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_11_Conditional_1_Template, 1, 5, "mj-dropdown", 130);
523
523
  } if (rf & 2) {
524
524
  const ctx_r1 = i0.ɵɵnextContext(6);
525
525
  i0.ɵɵconditional(ctx_r1.isLoadingConfigurations ? 0 : 1);
526
526
  } }
527
527
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_12_Template(rf, ctx) { if (rf & 1) {
528
- i0.ɵɵelementStart(0, "span", 109);
528
+ i0.ɵɵelementStart(0, "span", 110);
529
529
  i0.ɵɵtext(1);
530
530
  i0.ɵɵelementEnd();
531
531
  } if (rf & 2) {
@@ -535,7 +535,7 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
535
535
  i0.ɵɵtextInterpolate(ctx_r1.getConfigurationDisplayName(model_r19.ConfigurationID));
536
536
  } }
537
537
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_14_Template(rf, ctx) { if (rf & 1) {
538
- i0.ɵɵelementStart(0, "span", 111);
538
+ i0.ɵɵelementStart(0, "span", 112);
539
539
  i0.ɵɵtext(1);
540
540
  i0.ɵɵpipe(2, "date");
541
541
  i0.ɵɵelementEnd();
@@ -545,19 +545,19 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
545
545
  i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(2, 1, model_r19.__mj_CreatedAt, "short"));
546
546
  } }
547
547
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_15_Template(rf, ctx) { if (rf & 1) {
548
- i0.ɵɵelementStart(0, "span", 112);
548
+ i0.ɵɵelementStart(0, "span", 113);
549
549
  i0.ɵɵtext(1, "New");
550
550
  i0.ɵɵelementEnd();
551
551
  } }
552
552
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_17_Conditional_1_Template(rf, ctx) { if (rf & 1) {
553
553
  const _r23 = i0.ɵɵgetCurrentView();
554
- i0.ɵɵelementStart(0, "button", 133);
554
+ i0.ɵɵelementStart(0, "button", 134);
555
555
  i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_17_Conditional_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r23); const ɵ$index_289_r17 = i0.ɵɵnextContext(2).$index; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.moveModelUp(ɵ$index_289_r17)); });
556
- i0.ɵɵelement(1, "i", 134);
556
+ i0.ɵɵelement(1, "i", 135);
557
557
  i0.ɵɵelementEnd();
558
- i0.ɵɵelementStart(2, "button", 135);
558
+ i0.ɵɵelementStart(2, "button", 136);
559
559
  i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_17_Conditional_1_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r23); const ɵ$index_289_r17 = i0.ɵɵnextContext(2).$index; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.moveModelDown(ɵ$index_289_r17)); });
560
- i0.ɵɵelement(3, "i", 136);
560
+ i0.ɵɵelement(3, "i", 137);
561
561
  i0.ɵɵelementEnd();
562
562
  } if (rf & 2) {
563
563
  const ɵ$index_289_r17 = i0.ɵɵnextContext(2).$index;
@@ -568,16 +568,16 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
568
568
  } }
569
569
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_17_Conditional_2_Template(rf, ctx) { if (rf & 1) {
570
570
  const _r24 = i0.ɵɵgetCurrentView();
571
- i0.ɵɵelementStart(0, "button", 137);
571
+ i0.ɵɵelementStart(0, "button", 138);
572
572
  i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_17_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r24); const ɵ$index_289_r17 = i0.ɵɵnextContext(2).$index; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.removePromptModel(ɵ$index_289_r17)); });
573
- i0.ɵɵelement(1, "i", 138);
573
+ i0.ɵɵelement(1, "i", 139);
574
574
  i0.ɵɵelementEnd();
575
575
  } }
576
576
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_17_Template(rf, ctx) { if (rf & 1) {
577
- i0.ɵɵelementStart(0, "div", 131);
577
+ i0.ɵɵelementStart(0, "div", 132);
578
578
  i0.ɵɵconditionalCreate(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_17_Conditional_1_Template, 4, 2);
579
579
  i0.ɵɵelementEnd();
580
- i0.ɵɵconditionalCreate(2, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_17_Conditional_2_Template, 2, 0, "button", 132);
580
+ i0.ɵɵconditionalCreate(2, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_17_Conditional_2_Template, 2, 0, "button", 133);
581
581
  } if (rf & 2) {
582
582
  const ctx_r1 = i0.ɵɵnextContext(6);
583
583
  i0.ɵɵadvance();
@@ -598,10 +598,10 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
598
598
  } }
599
599
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_23_Conditional_4_Conditional_5_Template(rf, ctx) { if (rf & 1) {
600
600
  const _r26 = i0.ɵɵgetCurrentView();
601
- i0.ɵɵelementStart(0, "div")(1, "label", 143);
601
+ i0.ɵɵelementStart(0, "div")(1, "label", 144);
602
602
  i0.ɵɵtext(2, "Parallel Count");
603
603
  i0.ɵɵelementEnd();
604
- i0.ɵɵelementStart(3, "mj-numeric-input", 145);
604
+ i0.ɵɵelementStart(3, "mj-numeric-input", 146);
605
605
  i0.ɵɵtwoWayListener("ngModelChange", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_23_Conditional_4_Conditional_5_Template_mj_numeric_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r26); const model_r19 = i0.ɵɵnextContext(3).$implicit; i0.ɵɵtwoWayBindingSet(model_r19.ParallelCount, $event) || (model_r19.ParallelCount = $event); return i0.ɵɵresetView($event); });
606
606
  i0.ɵɵelementEnd()();
607
607
  } if (rf & 2) {
@@ -614,10 +614,10 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
614
614
  } }
615
615
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_23_Conditional_4_Conditional_6_Template(rf, ctx) { if (rf & 1) {
616
616
  const _r27 = i0.ɵɵgetCurrentView();
617
- i0.ɵɵelementStart(0, "div")(1, "label", 143);
617
+ i0.ɵɵelementStart(0, "div")(1, "label", 144);
618
618
  i0.ɵɵtext(2, "Config Parameter");
619
619
  i0.ɵɵelementEnd();
620
- i0.ɵɵelementStart(3, "input", 146);
620
+ i0.ɵɵelementStart(3, "input", 147);
621
621
  i0.ɵɵtwoWayListener("ngModelChange", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_23_Conditional_4_Conditional_6_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r27); const model_r19 = i0.ɵɵnextContext(3).$implicit; i0.ɵɵtwoWayBindingSet(model_r19.ParallelConfigParam, $event) || (model_r19.ParallelConfigParam = $event); return i0.ɵɵresetView($event); });
622
622
  i0.ɵɵelementEnd()();
623
623
  } if (rf & 2) {
@@ -630,10 +630,10 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
630
630
  } }
631
631
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_23_Conditional_4_Template(rf, ctx) { if (rf & 1) {
632
632
  const _r25 = i0.ɵɵgetCurrentView();
633
- i0.ɵɵelementStart(0, "div", 141)(1, "div")(2, "label", 143);
633
+ i0.ɵɵelementStart(0, "div", 142)(1, "div")(2, "label", 144);
634
634
  i0.ɵɵtext(3, "Parallel Mode");
635
635
  i0.ɵɵelementEnd();
636
- i0.ɵɵelementStart(4, "mj-dropdown", 144);
636
+ i0.ɵɵelementStart(4, "mj-dropdown", 145);
637
637
  i0.ɵɵtwoWayListener("ngModelChange", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_23_Conditional_4_Template_mj_dropdown_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r25); const model_r19 = i0.ɵɵnextContext(2).$implicit; i0.ɵɵtwoWayBindingSet(model_r19.ParallelizationMode, $event) || (model_r19.ParallelizationMode = $event); return i0.ɵɵresetView($event); });
638
638
  i0.ɵɵelementEnd()();
639
639
  i0.ɵɵconditionalCreate(5, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_23_Conditional_4_Conditional_5_Template, 4, 5, "div");
@@ -685,7 +685,7 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
685
685
  i0.ɵɵtextInterpolate1(" ", model_r19.ParallelConfigParam);
686
686
  } }
687
687
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_23_Conditional_5_Template(rf, ctx) { if (rf & 1) {
688
- i0.ɵɵelementStart(0, "div", 142);
688
+ i0.ɵɵelementStart(0, "div", 143);
689
689
  i0.ɵɵconditionalCreate(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_23_Conditional_5_Conditional_1_Template, 4, 1, "span");
690
690
  i0.ɵɵconditionalCreate(2, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_23_Conditional_5_Conditional_2_Template, 4, 1, "span");
691
691
  i0.ɵɵconditionalCreate(3, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_23_Conditional_5_Conditional_3_Template, 4, 1, "span");
@@ -700,11 +700,11 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
700
700
  i0.ɵɵconditional(model_r19.ParallelConfigParam ? 3 : -1);
701
701
  } }
702
702
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_23_Template(rf, ctx) { if (rf & 1) {
703
- i0.ɵɵelementStart(0, "div", 116)(1, "div", 139);
704
- i0.ɵɵelement(2, "i", 140);
703
+ i0.ɵɵelementStart(0, "div", 117)(1, "div", 140);
704
+ i0.ɵɵelement(2, "i", 141);
705
705
  i0.ɵɵtext(3, " Model-Specific Parallel Execution ");
706
706
  i0.ɵɵelementEnd();
707
- i0.ɵɵconditionalCreate(4, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_23_Conditional_4_Template, 7, 13, "div", 141)(5, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_23_Conditional_5_Template, 4, 3, "div", 142);
707
+ i0.ɵɵconditionalCreate(4, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_23_Conditional_4_Template, 7, 13, "div", 142)(5, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_23_Conditional_5_Template, 4, 3, "div", 143);
708
708
  i0.ɵɵelementEnd();
709
709
  } if (rf & 2) {
710
710
  const ctx_r1 = i0.ɵɵnextContext(6);
@@ -713,32 +713,32 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
713
713
  } }
714
714
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Template(rf, ctx) { if (rf & 1) {
715
715
  const _r16 = i0.ɵɵgetCurrentView();
716
- i0.ɵɵelementStart(0, "div", 102);
716
+ i0.ɵɵelementStart(0, "div", 103);
717
717
  i0.ɵɵlistener("dragstart", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Template_div_dragstart_0_listener($event) { const ɵ$index_289_r17 = i0.ɵɵrestoreView(_r16).$index; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.onDragStart($event, ɵ$index_289_r17)); })("dragover", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Template_div_dragover_0_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.onDragOver($event)); })("drop", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Template_div_drop_0_listener($event) { const ɵ$index_289_r17 = i0.ɵɵrestoreView(_r16).$index; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.onDrop($event, ɵ$index_289_r17)); })("dragend", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Template_div_dragend_0_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.onDragEnd($event)); });
718
- i0.ɵɵelementStart(1, "div", 103);
719
- i0.ɵɵconditionalCreate(2, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_2_Template, 3, 1)(3, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_3_Template, 2, 3, "span", 104);
718
+ i0.ɵɵelementStart(1, "div", 104);
719
+ i0.ɵɵconditionalCreate(2, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_2_Template, 3, 1)(3, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_3_Template, 2, 3, "span", 105);
720
720
  i0.ɵɵelementEnd();
721
- i0.ɵɵelementStart(4, "div", 105);
722
- i0.ɵɵconditionalCreate(5, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_5_Template, 1, 5, "mj-dropdown", 106)(6, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_6_Template, 2, 1, "span", 22);
721
+ i0.ɵɵelementStart(4, "div", 106);
722
+ i0.ɵɵconditionalCreate(5, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_5_Template, 1, 5, "mj-dropdown", 107)(6, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_6_Template, 2, 1, "span", 22);
723
723
  i0.ɵɵelementEnd();
724
- i0.ɵɵelementStart(7, "div", 107);
724
+ i0.ɵɵelementStart(7, "div", 108);
725
725
  i0.ɵɵconditionalCreate(8, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_8_Template, 2, 1)(9, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_9_Template, 2, 1);
726
726
  i0.ɵɵelementEnd();
727
- i0.ɵɵelementStart(10, "div", 108);
728
- i0.ɵɵconditionalCreate(11, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_11_Template, 2, 1)(12, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_12_Template, 2, 1, "span", 109);
727
+ i0.ɵɵelementStart(10, "div", 109);
728
+ i0.ɵɵconditionalCreate(11, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_11_Template, 2, 1)(12, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_12_Template, 2, 1, "span", 110);
729
729
  i0.ɵɵelementEnd();
730
- i0.ɵɵelementStart(13, "div", 110);
731
- i0.ɵɵconditionalCreate(14, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_14_Template, 3, 4, "span", 111)(15, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_15_Template, 2, 0, "span", 112);
730
+ i0.ɵɵelementStart(13, "div", 111);
731
+ i0.ɵɵconditionalCreate(14, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_14_Template, 3, 4, "span", 112)(15, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_15_Template, 2, 0, "span", 113);
732
732
  i0.ɵɵelementEnd();
733
- i0.ɵɵelementStart(16, "div", 113);
733
+ i0.ɵɵelementStart(16, "div", 114);
734
734
  i0.ɵɵconditionalCreate(17, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_17_Template, 3, 2);
735
735
  i0.ɵɵelementEnd()();
736
- i0.ɵɵelementStart(18, "div", 114);
736
+ i0.ɵɵelementStart(18, "div", 115);
737
737
  i0.ɵɵelement(19, "div");
738
- i0.ɵɵelementStart(20, "div")(21, "div", 115);
738
+ i0.ɵɵelementStart(20, "div")(21, "div", 116);
739
739
  i0.ɵɵconditionalCreate(22, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_22_Template, 4, 1, "span");
740
740
  i0.ɵɵelementEnd();
741
- i0.ɵɵconditionalCreate(23, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_23_Template, 6, 1, "div", 116);
741
+ i0.ɵɵconditionalCreate(23, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Conditional_23_Template, 6, 1, "div", 117);
742
742
  i0.ɵɵelementEnd()();
743
743
  } if (rf & 2) {
744
744
  const model_r19 = ctx.$implicit;
@@ -765,20 +765,20 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
765
765
  } }
766
766
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_Conditional_18_Template(rf, ctx) { if (rf & 1) {
767
767
  const _r28 = i0.ɵɵgetCurrentView();
768
- i0.ɵɵelementStart(0, "div", 100)(1, "button", 147);
768
+ i0.ɵɵelementStart(0, "div", 101)(1, "button", 148);
769
769
  i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_Conditional_18_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.addNewModel()); });
770
- i0.ɵɵelement(2, "i", 74);
770
+ i0.ɵɵelement(2, "i", 75);
771
771
  i0.ɵɵtext(3, " Add Model ");
772
772
  i0.ɵɵelementEnd()();
773
773
  } }
774
774
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_Template(rf, ctx) { if (rf & 1) {
775
- i0.ɵɵconditionalCreate(0, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_Conditional_0_Template, 3, 0, "div", 96);
776
- i0.ɵɵelementStart(1, "div", 97)(2, "div", 98);
777
- i0.ɵɵelement(3, "i", 99);
775
+ i0.ɵɵconditionalCreate(0, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_Conditional_0_Template, 3, 0, "div", 97);
776
+ i0.ɵɵelementStart(1, "div", 98)(2, "div", 99);
777
+ i0.ɵɵelement(3, "i", 100);
778
778
  i0.ɵɵelementEnd();
779
779
  i0.ɵɵelementStart(4, "div");
780
780
  i0.ɵɵtext(5, "AI Model ");
781
- i0.ɵɵelementStart(6, "span", 55);
781
+ i0.ɵɵelementStart(6, "span", 56);
782
782
  i0.ɵɵtext(7, "*");
783
783
  i0.ɵɵelementEnd()();
784
784
  i0.ɵɵelementStart(8, "div");
@@ -794,7 +794,7 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
794
794
  i0.ɵɵtext(15, "Actions");
795
795
  i0.ɵɵelementEnd()();
796
796
  i0.ɵɵrepeaterCreate(16, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_For_17_Template, 24, 15, null, null, _forTrack0, true);
797
- i0.ɵɵconditionalCreate(18, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_Conditional_18_Template, 4, 0, "div", 100);
797
+ i0.ɵɵconditionalCreate(18, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_Conditional_18_Template, 4, 0, "div", 101);
798
798
  } if (rf & 2) {
799
799
  const ctx_r1 = i0.ɵɵnextContext(4);
800
800
  i0.ɵɵconditional(ctx_r1.promptModels.length > 1 ? 0 : -1);
@@ -804,7 +804,7 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
804
804
  i0.ɵɵconditional(ctx_r1.EditMode && ctx_r1.UserCanCreatePromptModels ? 18 : -1);
805
805
  } }
806
806
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Template(rf, ctx) { if (rf & 1) {
807
- i0.ɵɵconditionalCreate(0, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_0_Template, 2, 1, "mj-empty-state", 93)(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_Template, 19, 2);
807
+ i0.ɵɵconditionalCreate(0, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_0_Template, 2, 1, "mj-empty-state", 94)(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Conditional_1_Template, 19, 2);
808
808
  } if (rf & 2) {
809
809
  const ctx_r1 = i0.ɵɵnextContext(3);
810
810
  i0.ɵɵconditional(ctx_r1.promptModels.length === 0 ? 0 : 1);
@@ -812,8 +812,8 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditiona
812
812
  function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Template(rf, ctx) { if (rf & 1) {
813
813
  i0.ɵɵelementStart(0, "mj-accordion-panel", 28);
814
814
  i0.ɵɵtemplate(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_ng_template_1_Template, 7, 1, "ng-template", 29);
815
- i0.ɵɵelementStart(2, "div", 35)(3, "div", 87);
816
- i0.ɵɵconditionalCreate(4, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_4_Template, 3, 0, "div", 88)(5, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Template, 2, 1);
815
+ i0.ɵɵelementStart(2, "div", 35)(3, "div", 88);
816
+ i0.ɵɵconditionalCreate(4, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_4_Template, 3, 0, "div", 89)(5, MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Conditional_5_Template, 2, 1);
817
817
  i0.ɵɵelementEnd()()();
818
818
  } if (rf & 2) {
819
819
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -822,8 +822,8 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_42_Template(r
822
822
  i0.ɵɵconditional(ctx_r1.isLoadingModels ? 4 : 5);
823
823
  } }
824
824
  function MJAIPromptFormComponentExtended_Conditional_1_ng_template_44_Template(rf, ctx) { if (rf & 1) {
825
- i0.ɵɵelementStart(0, "span", 67);
826
- i0.ɵɵelement(1, "i", 148);
825
+ i0.ɵɵelementStart(0, "span", 68);
826
+ i0.ɵɵelement(1, "i", 149);
827
827
  i0.ɵɵtext(2, " Advanced Configuration ");
828
828
  i0.ɵɵelementEnd();
829
829
  } }
@@ -839,31 +839,31 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_50_Template(r
839
839
  const ctx_r1 = i0.ɵɵnextContext(2);
840
840
  i0.ɵɵproperty("Record", ctx_r1.record)("ShowLabel", true)("EditMode", ctx_r1.EditMode);
841
841
  } }
842
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_59_Conditional_0_Template(rf, ctx) { if (rf & 1) {
843
- i0.ɵɵelementStart(0, "div", 149);
844
- i0.ɵɵelement(1, "i", 58);
842
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_60_Conditional_0_Template(rf, ctx) { if (rf & 1) {
843
+ i0.ɵɵelementStart(0, "div", 150);
844
+ i0.ɵɵelement(1, "i", 59);
845
845
  i0.ɵɵtext(2, " Loading prompts... ");
846
846
  i0.ɵɵelementEnd();
847
847
  } }
848
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_59_Conditional_1_Template(rf, ctx) { if (rf & 1) {
848
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_60_Conditional_1_Template(rf, ctx) { if (rf & 1) {
849
849
  const _r29 = i0.ɵɵgetCurrentView();
850
- i0.ɵɵelementStart(0, "mj-dropdown", 151);
851
- i0.ɵɵtwoWayListener("ngModelChange", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_59_Conditional_1_Template_mj_dropdown_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.record.ResultSelectorPromptID, $event) || (ctx_r1.record.ResultSelectorPromptID = $event); return i0.ɵɵresetView($event); });
852
- i0.ɵɵlistener("ValueChange", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_59_Conditional_1_Template_mj_dropdown_ValueChange_0_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onResultSelectorChange($event)); });
850
+ i0.ɵɵelementStart(0, "mj-dropdown", 152);
851
+ i0.ɵɵtwoWayListener("ngModelChange", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_60_Conditional_1_Template_mj_dropdown_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.record.ResultSelectorPromptID, $event) || (ctx_r1.record.ResultSelectorPromptID = $event); return i0.ɵɵresetView($event); });
852
+ i0.ɵɵlistener("ValueChange", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_60_Conditional_1_Template_mj_dropdown_ValueChange_0_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onResultSelectorChange($event)); });
853
853
  i0.ɵɵelementEnd();
854
854
  } if (rf & 2) {
855
855
  const ctx_r1 = i0.ɵɵnextContext(3);
856
856
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.record.ResultSelectorPromptID);
857
857
  i0.ɵɵproperty("Data", ctx_r1.resultSelectorTreeData)("ValuePrimitive", true)("Filterable", true);
858
858
  } }
859
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_59_Template(rf, ctx) { if (rf & 1) {
860
- i0.ɵɵconditionalCreate(0, MJAIPromptFormComponentExtended_Conditional_1_Conditional_59_Conditional_0_Template, 3, 0, "div", 149)(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_59_Conditional_1_Template, 1, 4, "mj-dropdown", 150);
859
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_60_Template(rf, ctx) { if (rf & 1) {
860
+ i0.ɵɵconditionalCreate(0, MJAIPromptFormComponentExtended_Conditional_1_Conditional_60_Conditional_0_Template, 3, 0, "div", 150)(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_60_Conditional_1_Template, 1, 4, "mj-dropdown", 151);
861
861
  } if (rf & 2) {
862
862
  const ctx_r1 = i0.ɵɵnextContext(2);
863
863
  i0.ɵɵconditional(ctx_r1.isLoadingResultSelectorData ? 0 : 1);
864
864
  } }
865
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_60_Template(rf, ctx) { if (rf & 1) {
866
- i0.ɵɵelementStart(0, "span", 46);
865
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_61_Template(rf, ctx) { if (rf & 1) {
866
+ i0.ɵɵelementStart(0, "span", 47);
867
867
  i0.ɵɵtext(1);
868
868
  i0.ɵɵelementEnd();
869
869
  } if (rf & 2) {
@@ -871,21 +871,21 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_60_Template(r
871
871
  i0.ɵɵadvance();
872
872
  i0.ɵɵtextInterpolate(ctx_r1.getPromptDisplayName(ctx_r1.record.ResultSelectorPromptID || "") || "None selected");
873
873
  } }
874
- function MJAIPromptFormComponentExtended_Conditional_1_ng_template_62_Template(rf, ctx) { if (rf & 1) {
875
- i0.ɵɵelementStart(0, "span", 67);
876
- i0.ɵɵelement(1, "i", 152);
874
+ function MJAIPromptFormComponentExtended_Conditional_1_ng_template_63_Template(rf, ctx) { if (rf & 1) {
875
+ i0.ɵɵelementStart(0, "span", 68);
876
+ i0.ɵɵelement(1, "i", 153);
877
877
  i0.ɵɵtext(2, " Prefill & Output Control ");
878
878
  i0.ɵɵelementEnd();
879
879
  } }
880
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_ng_template_1_Template(rf, ctx) { if (rf & 1) {
881
- i0.ɵɵelementStart(0, "span", 67);
882
- i0.ɵɵelement(1, "i", 154);
880
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_ng_template_1_Template(rf, ctx) { if (rf & 1) {
881
+ i0.ɵɵelementStart(0, "span", 68);
882
+ i0.ɵɵelement(1, "i", 155);
883
883
  i0.ɵɵtext(2, " Template Parameters ");
884
- i0.ɵɵelementStart(3, "span", 90);
884
+ i0.ɵɵelementStart(3, "span", 91);
885
885
  i0.ɵɵtext(4);
886
886
  i0.ɵɵelementEnd();
887
- i0.ɵɵelementStart(5, "span", 91);
888
- i0.ɵɵelement(6, "i", 155);
887
+ i0.ɵɵelementStart(5, "span", 92);
888
+ i0.ɵɵelement(6, "i", 156);
889
889
  i0.ɵɵtext(7, " Parameters defined in the template ");
890
890
  i0.ɵɵelementEnd()();
891
891
  } if (rf & 2) {
@@ -893,32 +893,32 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_ng_templat
893
893
  i0.ɵɵadvance(4);
894
894
  i0.ɵɵtextInterpolate(ctx_r1.templateParams.length);
895
895
  } }
896
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_3_Template(rf, ctx) { if (rf & 1) {
897
- i0.ɵɵelementStart(0, "div", 88);
898
- i0.ɵɵelement(1, "i", 58);
896
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_3_Template(rf, ctx) { if (rf & 1) {
897
+ i0.ɵɵelementStart(0, "div", 89);
898
+ i0.ɵɵelement(1, "i", 59);
899
899
  i0.ɵɵtext(2, " Loading template parameters... ");
900
900
  i0.ɵɵelementEnd();
901
901
  } }
902
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_4_Template(rf, ctx) { if (rf & 1) {
903
- i0.ɵɵelement(0, "mj-empty-state", 153);
902
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_4_Template(rf, ctx) { if (rf & 1) {
903
+ i0.ɵɵelement(0, "mj-empty-state", 154);
904
904
  } }
905
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
906
- i0.ɵɵelementStart(0, "span", 167);
905
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
906
+ i0.ɵɵelementStart(0, "span", 168);
907
907
  i0.ɵɵtext(1, "*");
908
908
  i0.ɵɵelementEnd();
909
909
  } }
910
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Conditional_10_Template(rf, ctx) { if (rf & 1) {
911
- i0.ɵɵelementStart(0, "span", 169);
910
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Conditional_10_Template(rf, ctx) { if (rf & 1) {
911
+ i0.ɵɵelementStart(0, "span", 170);
912
912
  i0.ɵɵtext(1, "Required");
913
913
  i0.ɵɵelementEnd();
914
914
  } }
915
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Conditional_11_Template(rf, ctx) { if (rf & 1) {
916
- i0.ɵɵelementStart(0, "span", 170);
915
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Conditional_11_Template(rf, ctx) { if (rf & 1) {
916
+ i0.ɵɵelementStart(0, "span", 171);
917
917
  i0.ɵɵtext(1, "Optional");
918
918
  i0.ɵɵelementEnd();
919
919
  } }
920
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Conditional_12_Template(rf, ctx) { if (rf & 1) {
921
- i0.ɵɵelementStart(0, "p", 171);
920
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Conditional_12_Template(rf, ctx) { if (rf & 1) {
921
+ i0.ɵɵelementStart(0, "p", 172);
922
922
  i0.ɵɵtext(1);
923
923
  i0.ɵɵelementEnd();
924
924
  } if (rf & 2) {
@@ -926,11 +926,11 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditiona
926
926
  i0.ɵɵadvance();
927
927
  i0.ɵɵtextInterpolate1(" ", param_r30.Description, " ");
928
928
  } }
929
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Conditional_18_Template(rf, ctx) { if (rf & 1) {
930
- i0.ɵɵelementStart(0, "div", 176)(1, "label", 177);
929
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Conditional_18_Template(rf, ctx) { if (rf & 1) {
930
+ i0.ɵɵelementStart(0, "div", 177)(1, "label", 178);
931
931
  i0.ɵɵtext(2, "Default Value");
932
932
  i0.ɵɵelementEnd();
933
- i0.ɵɵelementStart(3, "code", 178);
933
+ i0.ɵɵelementStart(3, "code", 179);
934
934
  i0.ɵɵtext(4);
935
935
  i0.ɵɵelementEnd()();
936
936
  } if (rf & 2) {
@@ -938,11 +938,11 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditiona
938
938
  i0.ɵɵadvance(4);
939
939
  i0.ɵɵtextInterpolate(param_r30.DefaultValue);
940
940
  } }
941
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Conditional_19_Template(rf, ctx) { if (rf & 1) {
942
- i0.ɵɵelementStart(0, "div", 176)(1, "label", 177);
941
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Conditional_19_Template(rf, ctx) { if (rf & 1) {
942
+ i0.ɵɵelementStart(0, "div", 177)(1, "label", 178);
943
943
  i0.ɵɵtext(2, "Entity");
944
944
  i0.ɵɵelementEnd();
945
- i0.ɵɵelementStart(3, "span", 172);
945
+ i0.ɵɵelementStart(3, "span", 173);
946
946
  i0.ɵɵtext(4);
947
947
  i0.ɵɵelementEnd()();
948
948
  } if (rf & 2) {
@@ -950,19 +950,19 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditiona
950
950
  i0.ɵɵadvance(4);
951
951
  i0.ɵɵtextInterpolate(param_r30.Entity || "Entity ID: " + param_r30.EntityID);
952
952
  } }
953
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Conditional_20_Conditional_5_Template(rf, ctx) { if (rf & 1) {
953
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Conditional_20_Conditional_5_Template(rf, ctx) { if (rf & 1) {
954
954
  i0.ɵɵtext(0);
955
955
  } if (rf & 2) {
956
956
  const param_r30 = i0.ɵɵnextContext(2).$implicit;
957
957
  i0.ɵɵtextInterpolate1(" (", param_r30.LinkedParameterField, ") ");
958
958
  } }
959
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Conditional_20_Template(rf, ctx) { if (rf & 1) {
960
- i0.ɵɵelementStart(0, "div", 176)(1, "label", 177);
959
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Conditional_20_Template(rf, ctx) { if (rf & 1) {
960
+ i0.ɵɵelementStart(0, "div", 177)(1, "label", 178);
961
961
  i0.ɵɵtext(2, "Linked To");
962
962
  i0.ɵɵelementEnd();
963
- i0.ɵɵelementStart(3, "span", 172);
963
+ i0.ɵɵelementStart(3, "span", 173);
964
964
  i0.ɵɵtext(4);
965
- i0.ɵɵconditionalCreate(5, MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Conditional_20_Conditional_5_Template, 1, 1);
965
+ i0.ɵɵconditionalCreate(5, MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Conditional_20_Conditional_5_Template, 1, 1);
966
966
  i0.ɵɵelementEnd()();
967
967
  } if (rf & 2) {
968
968
  const param_r30 = i0.ɵɵnextContext().$implicit;
@@ -971,11 +971,11 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditiona
971
971
  i0.ɵɵadvance();
972
972
  i0.ɵɵconditional(param_r30.LinkedParameterField ? 5 : -1);
973
973
  } }
974
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
975
- i0.ɵɵelementStart(0, "div", 176)(1, "label", 177);
974
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
975
+ i0.ɵɵelementStart(0, "div", 177)(1, "label", 178);
976
976
  i0.ɵɵtext(2, "Filter");
977
977
  i0.ɵɵelementEnd();
978
- i0.ɵɵelementStart(3, "code", 179);
978
+ i0.ɵɵelementStart(3, "code", 180);
979
979
  i0.ɵɵtext(4);
980
980
  i0.ɵɵelementEnd()();
981
981
  } if (rf & 2) {
@@ -983,11 +983,11 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditiona
983
983
  i0.ɵɵadvance(4);
984
984
  i0.ɵɵtextInterpolate(param_r30.ExtraFilter);
985
985
  } }
986
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Conditional_22_Template(rf, ctx) { if (rf & 1) {
987
- i0.ɵɵelementStart(0, "div", 176)(1, "label", 177);
986
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Conditional_22_Template(rf, ctx) { if (rf & 1) {
987
+ i0.ɵɵelementStart(0, "div", 177)(1, "label", 178);
988
988
  i0.ɵɵtext(2, "Record ID");
989
989
  i0.ɵɵelementEnd();
990
- i0.ɵɵelementStart(3, "code", 172);
990
+ i0.ɵɵelementStart(3, "code", 173);
991
991
  i0.ɵɵtext(4);
992
992
  i0.ɵɵelementEnd()();
993
993
  } if (rf & 2) {
@@ -995,29 +995,29 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditiona
995
995
  i0.ɵɵadvance(4);
996
996
  i0.ɵɵtextInterpolate(param_r30.RecordID);
997
997
  } }
998
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Template(rf, ctx) { if (rf & 1) {
999
- i0.ɵɵelementStart(0, "div", 162)(1, "div", 163)(2, "div", 164);
1000
- i0.ɵɵelement(3, "i", 165);
1001
- i0.ɵɵelementStart(4, "h6", 166);
998
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Template(rf, ctx) { if (rf & 1) {
999
+ i0.ɵɵelementStart(0, "div", 163)(1, "div", 164)(2, "div", 165);
1000
+ i0.ɵɵelement(3, "i", 166);
1001
+ i0.ɵɵelementStart(4, "h6", 167);
1002
1002
  i0.ɵɵtext(5);
1003
- i0.ɵɵconditionalCreate(6, MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Conditional_6_Template, 2, 0, "span", 167);
1003
+ i0.ɵɵconditionalCreate(6, MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Conditional_6_Template, 2, 0, "span", 168);
1004
1004
  i0.ɵɵelementEnd()();
1005
- i0.ɵɵelementStart(7, "div", 164)(8, "span", 168);
1005
+ i0.ɵɵelementStart(7, "div", 165)(8, "span", 169);
1006
1006
  i0.ɵɵtext(9);
1007
1007
  i0.ɵɵelementEnd();
1008
- i0.ɵɵconditionalCreate(10, MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Conditional_10_Template, 2, 0, "span", 169)(11, MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Conditional_11_Template, 2, 0, "span", 170);
1008
+ i0.ɵɵconditionalCreate(10, MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Conditional_10_Template, 2, 0, "span", 170)(11, MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Conditional_11_Template, 2, 0, "span", 171);
1009
1009
  i0.ɵɵelementEnd()();
1010
- i0.ɵɵconditionalCreate(12, MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Conditional_12_Template, 2, 1, "p", 171);
1011
- i0.ɵɵelementStart(13, "div", 172)(14, "span", 173);
1012
- i0.ɵɵelement(15, "i", 174);
1010
+ i0.ɵɵconditionalCreate(12, MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Conditional_12_Template, 2, 1, "p", 172);
1011
+ i0.ɵɵelementStart(13, "div", 173)(14, "span", 174);
1012
+ i0.ɵɵelement(15, "i", 175);
1013
1013
  i0.ɵɵtext(16);
1014
1014
  i0.ɵɵelementEnd()();
1015
- i0.ɵɵelementStart(17, "div", 175);
1016
- i0.ɵɵconditionalCreate(18, MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Conditional_18_Template, 5, 1, "div", 176);
1017
- i0.ɵɵconditionalCreate(19, MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Conditional_19_Template, 5, 1, "div", 176);
1018
- i0.ɵɵconditionalCreate(20, MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Conditional_20_Template, 6, 2, "div", 176);
1019
- i0.ɵɵconditionalCreate(21, MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Conditional_21_Template, 5, 1, "div", 176);
1020
- i0.ɵɵconditionalCreate(22, MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Conditional_22_Template, 5, 1, "div", 176);
1015
+ i0.ɵɵelementStart(17, "div", 176);
1016
+ i0.ɵɵconditionalCreate(18, MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Conditional_18_Template, 5, 1, "div", 177);
1017
+ i0.ɵɵconditionalCreate(19, MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Conditional_19_Template, 5, 1, "div", 177);
1018
+ i0.ɵɵconditionalCreate(20, MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Conditional_20_Template, 6, 2, "div", 177);
1019
+ i0.ɵɵconditionalCreate(21, MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Conditional_21_Template, 5, 1, "div", 177);
1020
+ i0.ɵɵconditionalCreate(22, MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Conditional_22_Template, 5, 1, "div", 177);
1021
1021
  i0.ɵɵelementEnd()();
1022
1022
  } if (rf & 2) {
1023
1023
  const param_r30 = ctx.$implicit;
@@ -1051,13 +1051,13 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditiona
1051
1051
  i0.ɵɵadvance();
1052
1052
  i0.ɵɵconditional(param_r30.RecordID ? 22 : -1);
1053
1053
  } }
1054
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_Template(rf, ctx) { if (rf & 1) {
1055
- i0.ɵɵelementStart(0, "div", 156);
1056
- i0.ɵɵrepeaterCreate(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_For_2_Template, 23, 19, "div", 157, _forTrack1);
1054
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_Template(rf, ctx) { if (rf & 1) {
1055
+ i0.ɵɵelementStart(0, "div", 157);
1056
+ i0.ɵɵrepeaterCreate(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_For_2_Template, 23, 19, "div", 158, _forTrack1);
1057
1057
  i0.ɵɵelementEnd();
1058
- i0.ɵɵelementStart(3, "div", 158)(4, "div", 159);
1059
- i0.ɵɵelement(5, "i", 160);
1060
- i0.ɵɵelementStart(6, "div", 161)(7, "strong");
1058
+ i0.ɵɵelementStart(3, "div", 159)(4, "div", 160);
1059
+ i0.ɵɵelement(5, "i", 161);
1060
+ i0.ɵɵelementStart(6, "div", 162)(7, "strong");
1061
1061
  i0.ɵɵtext(8, "Using Template Parameters:");
1062
1062
  i0.ɵɵelementEnd();
1063
1063
  i0.ɵɵtext(9, " When executing this prompt, you'll be prompted to provide values for all required parameters. Parameters can be simple values (text, numbers) or complex data structures (JSON objects, database records, or entire entity collections). The template will use these parameters to generate dynamic content based on the values provided at execution time. ");
@@ -1067,11 +1067,11 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditiona
1067
1067
  i0.ɵɵadvance();
1068
1068
  i0.ɵɵrepeater(ctx_r1.templateParams);
1069
1069
  } }
1070
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Template(rf, ctx) { if (rf & 1) {
1070
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Template(rf, ctx) { if (rf & 1) {
1071
1071
  i0.ɵɵelementStart(0, "mj-accordion-panel", 28);
1072
- i0.ɵɵtemplate(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_ng_template_1_Template, 8, 1, "ng-template", 29);
1072
+ i0.ɵɵtemplate(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_ng_template_1_Template, 8, 1, "ng-template", 29);
1073
1073
  i0.ɵɵelementStart(2, "div", 35);
1074
- i0.ɵɵconditionalCreate(3, MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_3_Template, 3, 0, "div", 88)(4, MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_4_Template, 1, 0, "mj-empty-state", 153)(5, MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Conditional_5_Template, 10, 0);
1074
+ i0.ɵɵconditionalCreate(3, MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_3_Template, 3, 0, "div", 89)(4, MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_4_Template, 1, 0, "mj-empty-state", 154)(5, MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_Template, 10, 0);
1075
1075
  i0.ɵɵelementEnd()();
1076
1076
  } if (rf & 2) {
1077
1077
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -1079,29 +1079,29 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Template(r
1079
1079
  i0.ɵɵadvance(3);
1080
1080
  i0.ɵɵconditional(ctx_r1.isLoadingTemplateParams ? 3 : ctx_r1.templateParams.length === 0 ? 4 : 5);
1081
1081
  } }
1082
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_ng_template_1_Template(rf, ctx) { if (rf & 1) {
1083
- i0.ɵɵelementStart(0, "span", 67);
1082
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_ng_template_1_Template(rf, ctx) { if (rf & 1) {
1083
+ i0.ɵɵelementStart(0, "span", 68);
1084
1084
  i0.ɵɵelement(1, "i", 21);
1085
1085
  i0.ɵɵtext(2, " Output Example (JSON) ");
1086
- i0.ɵɵelementStart(3, "span", 183);
1086
+ i0.ɵɵelementStart(3, "span", 184);
1087
1087
  i0.ɵɵtext(4, "\u2022 Required for object output type");
1088
1088
  i0.ɵɵelementEnd()();
1089
1089
  } }
1090
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1090
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1091
1091
  const _r31 = i0.ɵɵgetCurrentView();
1092
- i0.ɵɵelementStart(0, "mj-code-editor", 184);
1093
- i0.ɵɵtwoWayListener("ngModelChange", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_3_Template_mj_code_editor_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.record.OutputExample, $event) || (ctx_r1.record.OutputExample = $event); return i0.ɵɵresetView($event); });
1092
+ i0.ɵɵelementStart(0, "mj-code-editor", 185);
1093
+ i0.ɵɵtwoWayListener("ngModelChange", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_3_Template_mj_code_editor_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.record.OutputExample, $event) || (ctx_r1.record.OutputExample = $event); return i0.ɵɵresetView($event); });
1094
1094
  i0.ɵɵelementEnd();
1095
- i0.ɵɵelementStart(1, "div", 185);
1096
- i0.ɵɵelement(2, "i", 186);
1095
+ i0.ɵɵelementStart(1, "div", 186);
1096
+ i0.ɵɵelement(2, "i", 187);
1097
1097
  i0.ɵɵtext(3, " Provide a JSON example that defines the expected structure for object output validation. ");
1098
1098
  i0.ɵɵelementEnd();
1099
1099
  } if (rf & 2) {
1100
1100
  const ctx_r1 = i0.ɵɵnextContext(3);
1101
1101
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.record.OutputExample);
1102
1102
  } }
1103
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_4_Template(rf, ctx) { if (rf & 1) {
1104
- i0.ɵɵelementStart(0, "div", 181);
1103
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_4_Template(rf, ctx) { if (rf & 1) {
1104
+ i0.ɵɵelementStart(0, "div", 182);
1105
1105
  i0.ɵɵtext(1);
1106
1106
  i0.ɵɵelementEnd();
1107
1107
  } if (rf & 2) {
@@ -1109,16 +1109,16 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditiona
1109
1109
  i0.ɵɵadvance();
1110
1110
  i0.ɵɵtextInterpolate(ctx_r1.record.OutputExample);
1111
1111
  } }
1112
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_Template(rf, ctx) { if (rf & 1) {
1113
- i0.ɵɵelementStart(0, "mj-alert", 182);
1112
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_5_Template(rf, ctx) { if (rf & 1) {
1113
+ i0.ɵɵelementStart(0, "mj-alert", 183);
1114
1114
  i0.ɵɵtext(1, "Output example is required when output type is 'object'");
1115
1115
  i0.ɵɵelementEnd();
1116
1116
  } }
1117
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Template(rf, ctx) { if (rf & 1) {
1117
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Template(rf, ctx) { if (rf & 1) {
1118
1118
  i0.ɵɵelementStart(0, "mj-accordion-panel", 28);
1119
- i0.ɵɵtemplate(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_ng_template_1_Template, 5, 0, "ng-template", 29);
1120
- i0.ɵɵelementStart(2, "div", 180);
1121
- i0.ɵɵconditionalCreate(3, MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_3_Template, 4, 1)(4, MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_4_Template, 2, 1, "div", 181)(5, MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Conditional_5_Template, 2, 0, "mj-alert", 182);
1119
+ i0.ɵɵtemplate(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_ng_template_1_Template, 5, 0, "ng-template", 29);
1120
+ i0.ɵɵelementStart(2, "div", 181);
1121
+ i0.ɵɵconditionalCreate(3, MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_3_Template, 4, 1)(4, MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_4_Template, 2, 1, "div", 182)(5, MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_5_Template, 2, 0, "mj-alert", 183);
1122
1122
  i0.ɵɵelementEnd()();
1123
1123
  } if (rf & 2) {
1124
1124
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -1126,8 +1126,8 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Template(r
1126
1126
  i0.ɵɵadvance(3);
1127
1127
  i0.ɵɵconditional(ctx_r1.EditMode ? 3 : ctx_r1.record.OutputExample ? 4 : 5);
1128
1128
  } }
1129
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_ng_template_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1130
- i0.ɵɵelementStart(0, "span", 190);
1129
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_ng_template_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1130
+ i0.ɵɵelementStart(0, "span", 191);
1131
1131
  i0.ɵɵtext(1);
1132
1132
  i0.ɵɵelementEnd();
1133
1133
  } if (rf & 2) {
@@ -1135,53 +1135,53 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_ng_templat
1135
1135
  i0.ɵɵadvance();
1136
1136
  i0.ɵɵtextInterpolate1("(", ctx_r1.executionHistory.length, ")");
1137
1137
  } }
1138
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_ng_template_1_Template(rf, ctx) { if (rf & 1) {
1139
- i0.ɵɵelementStart(0, "span", 67);
1140
- i0.ɵɵelement(1, "i", 189);
1138
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_ng_template_1_Template(rf, ctx) { if (rf & 1) {
1139
+ i0.ɵɵelementStart(0, "span", 68);
1140
+ i0.ɵɵelement(1, "i", 190);
1141
1141
  i0.ɵɵtext(2, " Execution History ");
1142
- i0.ɵɵconditionalCreate(3, MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_ng_template_1_Conditional_3_Template, 2, 1, "span", 190);
1142
+ i0.ɵɵconditionalCreate(3, MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_ng_template_1_Conditional_3_Template, 2, 1, "span", 191);
1143
1143
  i0.ɵɵelementEnd();
1144
1144
  } if (rf & 2) {
1145
1145
  const ctx_r1 = i0.ɵɵnextContext(3);
1146
1146
  i0.ɵɵadvance(3);
1147
1147
  i0.ɵɵconditional(ctx_r1.executionHistory.length > 0 ? 3 : -1);
1148
1148
  } }
1149
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1150
- i0.ɵɵelementStart(0, "div", 187);
1151
- i0.ɵɵelement(1, "i", 191);
1149
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1150
+ i0.ɵɵelementStart(0, "div", 188);
1151
+ i0.ɵɵelement(1, "i", 192);
1152
1152
  i0.ɵɵelementStart(2, "p");
1153
1153
  i0.ɵɵtext(3, "Loading execution history...");
1154
1154
  i0.ɵɵelementEnd()();
1155
1155
  } }
1156
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_4_Template(rf, ctx) { if (rf & 1) {
1157
- i0.ɵɵelement(0, "mj-empty-state", 188);
1156
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_4_Template(rf, ctx) { if (rf & 1) {
1157
+ i0.ɵɵelement(0, "mj-empty-state", 189);
1158
1158
  } }
1159
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_5_Conditional_9_Template(rf, ctx) { if (rf & 1) {
1160
- i0.ɵɵelement(0, "i", 204);
1159
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_5_Conditional_9_Template(rf, ctx) { if (rf & 1) {
1160
+ i0.ɵɵelement(0, "i", 205);
1161
1161
  } if (rf & 2) {
1162
1162
  const ctx_r1 = i0.ɵɵnextContext(4);
1163
1163
  i0.ɵɵclassMap("fa-solid fa-sort-" + (ctx_r1.historySortDirection === "asc" ? "up" : "down"));
1164
1164
  } }
1165
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_5_Conditional_12_Template(rf, ctx) { if (rf & 1) {
1166
- i0.ɵɵelement(0, "i", 204);
1165
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_5_Conditional_12_Template(rf, ctx) { if (rf & 1) {
1166
+ i0.ɵɵelement(0, "i", 205);
1167
1167
  } if (rf & 2) {
1168
1168
  const ctx_r1 = i0.ɵɵnextContext(4);
1169
1169
  i0.ɵɵclassMap("fa-solid fa-sort-" + (ctx_r1.historySortDirection === "asc" ? "up" : "down"));
1170
1170
  } }
1171
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_5_Conditional_15_Template(rf, ctx) { if (rf & 1) {
1172
- i0.ɵɵelement(0, "i", 204);
1171
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_5_Conditional_15_Template(rf, ctx) { if (rf & 1) {
1172
+ i0.ɵɵelement(0, "i", 205);
1173
1173
  } if (rf & 2) {
1174
1174
  const ctx_r1 = i0.ɵɵnextContext(4);
1175
1175
  i0.ɵɵclassMap("fa-solid fa-sort-" + (ctx_r1.historySortDirection === "asc" ? "up" : "down"));
1176
1176
  } }
1177
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_5_Conditional_18_Template(rf, ctx) { if (rf & 1) {
1178
- i0.ɵɵelement(0, "i", 204);
1177
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_5_Conditional_18_Template(rf, ctx) { if (rf & 1) {
1178
+ i0.ɵɵelement(0, "i", 205);
1179
1179
  } if (rf & 2) {
1180
1180
  const ctx_r1 = i0.ɵɵnextContext(4);
1181
1181
  i0.ɵɵclassMap("fa-solid fa-sort-" + (ctx_r1.historySortDirection === "asc" ? "up" : "down"));
1182
1182
  } }
1183
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_5_For_41_Conditional_20_Template(rf, ctx) { if (rf & 1) {
1184
- i0.ɵɵelementStart(0, "span", 211);
1183
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_5_For_41_Conditional_20_Template(rf, ctx) { if (rf & 1) {
1184
+ i0.ɵɵelementStart(0, "span", 212);
1185
1185
  i0.ɵɵtext(1);
1186
1186
  i0.ɵɵelementEnd();
1187
1187
  } if (rf & 2) {
@@ -1189,42 +1189,42 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditiona
1189
1189
  i0.ɵɵadvance();
1190
1190
  i0.ɵɵtextInterpolate1(" ", run_r34.RunType, " ");
1191
1191
  } }
1192
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_5_For_41_Template(rf, ctx) { if (rf & 1) {
1192
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_5_For_41_Template(rf, ctx) { if (rf & 1) {
1193
1193
  const _r33 = i0.ɵɵgetCurrentView();
1194
- i0.ɵɵelementStart(0, "tr", 205)(1, "td", 206)(2, "span", 207);
1194
+ i0.ɵɵelementStart(0, "tr", 206)(1, "td", 207)(2, "span", 208);
1195
1195
  i0.ɵɵelement(3, "i");
1196
1196
  i0.ɵɵelementStart(4, "span", 22);
1197
1197
  i0.ɵɵtext(5);
1198
1198
  i0.ɵɵelementEnd()()();
1199
- i0.ɵɵelementStart(6, "td", 208);
1199
+ i0.ɵɵelementStart(6, "td", 209);
1200
1200
  i0.ɵɵtext(7);
1201
1201
  i0.ɵɵpipe(8, "date");
1202
1202
  i0.ɵɵelementEnd();
1203
- i0.ɵɵelementStart(9, "td", 208)(10, "span", 207);
1204
- i0.ɵɵelement(11, "i", 89);
1203
+ i0.ɵɵelementStart(9, "td", 209)(10, "span", 208);
1204
+ i0.ɵɵelement(11, "i", 90);
1205
1205
  i0.ɵɵtext(12);
1206
1206
  i0.ɵɵelementEnd()();
1207
- i0.ɵɵelementStart(13, "td", 208);
1207
+ i0.ɵɵelementStart(13, "td", 209);
1208
1208
  i0.ɵɵtext(14);
1209
1209
  i0.ɵɵelementEnd();
1210
- i0.ɵɵelementStart(15, "td", 209);
1210
+ i0.ɵɵelementStart(15, "td", 210);
1211
1211
  i0.ɵɵtext(16);
1212
1212
  i0.ɵɵelementEnd();
1213
- i0.ɵɵelementStart(17, "td", 209);
1213
+ i0.ɵɵelementStart(17, "td", 210);
1214
1214
  i0.ɵɵtext(18);
1215
1215
  i0.ɵɵelementEnd();
1216
- i0.ɵɵelementStart(19, "td", 210);
1217
- i0.ɵɵconditionalCreate(20, MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_5_For_41_Conditional_20_Template, 2, 1, "span", 211);
1216
+ i0.ɵɵelementStart(19, "td", 211);
1217
+ i0.ɵɵconditionalCreate(20, MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_5_For_41_Conditional_20_Template, 2, 1, "span", 212);
1218
1218
  i0.ɵɵelementEnd();
1219
- i0.ɵɵelementStart(21, "td", 210)(22, "button", 212);
1220
- i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_5_For_41_Template_button_click_22_listener() { const run_r34 = i0.ɵɵrestoreView(_r33).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.navigateToPromptRun(run_r34.ID)); });
1221
- i0.ɵɵelement(23, "i", 213);
1219
+ i0.ɵɵelementStart(21, "td", 211)(22, "button", 213);
1220
+ i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_5_For_41_Template_button_click_22_listener() { const run_r34 = i0.ɵɵrestoreView(_r33).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.navigateToPromptRun(run_r34.ID)); });
1221
+ i0.ɵɵelement(23, "i", 214);
1222
1222
  i0.ɵɵelementEnd()()();
1223
1223
  } if (rf & 2) {
1224
1224
  const run_r34 = ctx.$implicit;
1225
- const ɵ$index_817_r35 = ctx.$index;
1225
+ const ɵ$index_819_r35 = ctx.$index;
1226
1226
  const ctx_r1 = i0.ɵɵnextContext(4);
1227
- i0.ɵɵclassProp("even-row", ɵ$index_817_r35 % 2 === 0);
1227
+ i0.ɵɵclassProp("even-row", ɵ$index_819_r35 % 2 === 0);
1228
1228
  i0.ɵɵadvance(3);
1229
1229
  i0.ɵɵclassMap("fa-solid " + ctx_r1.getExecutionStatusIcon(run_r34.Success));
1230
1230
  i0.ɵɵstyleProp("color", ctx_r1.getExecutionStatusColor(run_r34.Success));
@@ -1245,60 +1245,60 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditiona
1245
1245
  i0.ɵɵadvance(2);
1246
1246
  i0.ɵɵconditional(run_r34.RunType ? 20 : -1);
1247
1247
  } }
1248
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_5_Template(rf, ctx) { if (rf & 1) {
1248
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_5_Template(rf, ctx) { if (rf & 1) {
1249
1249
  const _r32 = i0.ɵɵgetCurrentView();
1250
- i0.ɵɵelementStart(0, "div", 192)(1, "div", 127);
1250
+ i0.ɵɵelementStart(0, "div", 193)(1, "div", 128);
1251
1251
  i0.ɵɵtext(2);
1252
1252
  i0.ɵɵelementEnd();
1253
- i0.ɵɵelementStart(3, "div", 193)(4, "span", 170);
1253
+ i0.ɵɵelementStart(3, "div", 194)(4, "span", 171);
1254
1254
  i0.ɵɵtext(5, "Sort by:");
1255
1255
  i0.ɵɵelementEnd();
1256
- i0.ɵɵelementStart(6, "div", 194)(7, "button", 195);
1257
- i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_5_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.changeHistorySort("runAt")); });
1256
+ i0.ɵɵelementStart(6, "div", 195)(7, "button", 196);
1257
+ i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_5_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.changeHistorySort("runAt")); });
1258
1258
  i0.ɵɵtext(8, " Date ");
1259
- i0.ɵɵconditionalCreate(9, MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_5_Conditional_9_Template, 1, 2, "i", 196);
1259
+ i0.ɵɵconditionalCreate(9, MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_5_Conditional_9_Template, 1, 2, "i", 197);
1260
1260
  i0.ɵɵelementEnd();
1261
- i0.ɵɵelementStart(10, "button", 195);
1262
- i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_5_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.changeHistorySort("executionTime")); });
1261
+ i0.ɵɵelementStart(10, "button", 196);
1262
+ i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_5_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.changeHistorySort("executionTime")); });
1263
1263
  i0.ɵɵtext(11, " Duration ");
1264
- i0.ɵɵconditionalCreate(12, MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_5_Conditional_12_Template, 1, 2, "i", 196);
1264
+ i0.ɵɵconditionalCreate(12, MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_5_Conditional_12_Template, 1, 2, "i", 197);
1265
1265
  i0.ɵɵelementEnd();
1266
- i0.ɵɵelementStart(13, "button", 195);
1267
- i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_5_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.changeHistorySort("tokens")); });
1266
+ i0.ɵɵelementStart(13, "button", 196);
1267
+ i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_5_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.changeHistorySort("tokens")); });
1268
1268
  i0.ɵɵtext(14, " Tokens ");
1269
- i0.ɵɵconditionalCreate(15, MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_5_Conditional_15_Template, 1, 2, "i", 196);
1269
+ i0.ɵɵconditionalCreate(15, MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_5_Conditional_15_Template, 1, 2, "i", 197);
1270
1270
  i0.ɵɵelementEnd();
1271
- i0.ɵɵelementStart(16, "button", 195);
1272
- i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_5_Template_button_click_16_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.changeHistorySort("cost")); });
1271
+ i0.ɵɵelementStart(16, "button", 196);
1272
+ i0.ɵɵlistener("click", function MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_5_Template_button_click_16_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.changeHistorySort("cost")); });
1273
1273
  i0.ɵɵtext(17, " Cost ");
1274
- i0.ɵɵconditionalCreate(18, MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_5_Conditional_18_Template, 1, 2, "i", 196);
1274
+ i0.ɵɵconditionalCreate(18, MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_5_Conditional_18_Template, 1, 2, "i", 197);
1275
1275
  i0.ɵɵelementEnd()()()();
1276
- i0.ɵɵelementStart(19, "div", 197)(20, "table", 198)(21, "thead")(22, "tr", 199)(23, "th", 200);
1276
+ i0.ɵɵelementStart(19, "div", 198)(20, "table", 199)(21, "thead")(22, "tr", 200)(23, "th", 201);
1277
1277
  i0.ɵɵtext(24, "Status");
1278
1278
  i0.ɵɵelementEnd();
1279
- i0.ɵɵelementStart(25, "th", 200);
1279
+ i0.ɵɵelementStart(25, "th", 201);
1280
1280
  i0.ɵɵtext(26, "Date & Time");
1281
1281
  i0.ɵɵelementEnd();
1282
- i0.ɵɵelementStart(27, "th", 200);
1282
+ i0.ɵɵelementStart(27, "th", 201);
1283
1283
  i0.ɵɵtext(28, "Model");
1284
1284
  i0.ɵɵelementEnd();
1285
- i0.ɵɵelementStart(29, "th", 200);
1285
+ i0.ɵɵelementStart(29, "th", 201);
1286
1286
  i0.ɵɵtext(30, "Duration");
1287
1287
  i0.ɵɵelementEnd();
1288
- i0.ɵɵelementStart(31, "th", 201);
1288
+ i0.ɵɵelementStart(31, "th", 202);
1289
1289
  i0.ɵɵtext(32, "Tokens");
1290
1290
  i0.ɵɵelementEnd();
1291
- i0.ɵɵelementStart(33, "th", 201);
1291
+ i0.ɵɵelementStart(33, "th", 202);
1292
1292
  i0.ɵɵtext(34, "Cost");
1293
1293
  i0.ɵɵelementEnd();
1294
- i0.ɵɵelementStart(35, "th", 202);
1294
+ i0.ɵɵelementStart(35, "th", 203);
1295
1295
  i0.ɵɵtext(36, "Type");
1296
1296
  i0.ɵɵelementEnd();
1297
- i0.ɵɵelementStart(37, "th", 202);
1297
+ i0.ɵɵelementStart(37, "th", 203);
1298
1298
  i0.ɵɵtext(38, "Actions");
1299
1299
  i0.ɵɵelementEnd()()();
1300
1300
  i0.ɵɵelementStart(39, "tbody");
1301
- i0.ɵɵrepeaterCreate(40, MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_5_For_41_Template, 24, 18, "tr", 203, _forTrack1);
1301
+ i0.ɵɵrepeaterCreate(40, MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_5_For_41_Template, 24, 18, "tr", 204, _forTrack1);
1302
1302
  i0.ɵɵelementEnd()()();
1303
1303
  } if (rf & 2) {
1304
1304
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -1323,11 +1323,11 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditiona
1323
1323
  i0.ɵɵadvance(22);
1324
1324
  i0.ɵɵrepeater(ctx_r1.executionHistory);
1325
1325
  } }
1326
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Template(rf, ctx) { if (rf & 1) {
1326
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Template(rf, ctx) { if (rf & 1) {
1327
1327
  i0.ɵɵelementStart(0, "mj-accordion-panel", 28);
1328
- i0.ɵɵtemplate(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_ng_template_1_Template, 4, 1, "ng-template", 29);
1329
- i0.ɵɵelementStart(2, "div", 180);
1330
- i0.ɵɵconditionalCreate(3, MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_3_Template, 4, 0, "div", 187)(4, MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_4_Template, 1, 0, "mj-empty-state", 188)(5, MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Conditional_5_Template, 42, 13);
1328
+ i0.ɵɵtemplate(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_ng_template_1_Template, 4, 1, "ng-template", 29);
1329
+ i0.ɵɵelementStart(2, "div", 181);
1330
+ i0.ɵɵconditionalCreate(3, MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_3_Template, 4, 0, "div", 188)(4, MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_4_Template, 1, 0, "mj-empty-state", 189)(5, MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Conditional_5_Template, 42, 13);
1331
1331
  i0.ɵɵelementEnd()();
1332
1332
  } if (rf & 2) {
1333
1333
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -1335,17 +1335,17 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Template(r
1335
1335
  i0.ɵɵadvance(3);
1336
1336
  i0.ɵɵconditional(ctx_r1.isLoadingHistory ? 3 : ctx_r1.executionHistory.length === 0 ? 4 : 5);
1337
1337
  } }
1338
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_ng_template_1_Template(rf, ctx) { if (rf & 1) {
1339
- i0.ɵɵelementStart(0, "span", 67);
1340
- i0.ɵɵelement(1, "i", 215);
1338
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_76_ng_template_1_Template(rf, ctx) { if (rf & 1) {
1339
+ i0.ɵɵelementStart(0, "span", 68);
1340
+ i0.ɵɵelement(1, "i", 216);
1341
1341
  i0.ɵɵtext(2, " Result Cache ");
1342
1342
  i0.ɵɵelementEnd();
1343
1343
  } }
1344
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Template(rf, ctx) { if (rf & 1) {
1344
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_76_Template(rf, ctx) { if (rf & 1) {
1345
1345
  i0.ɵɵelementStart(0, "mj-accordion-panel", 28);
1346
- i0.ɵɵtemplate(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_ng_template_1_Template, 3, 0, "ng-template", 29);
1346
+ i0.ɵɵtemplate(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_76_ng_template_1_Template, 3, 0, "ng-template", 29);
1347
1347
  i0.ɵɵelementStart(2, "div", 35);
1348
- i0.ɵɵelement(3, "mj-explorer-entity-data-grid", 214);
1348
+ i0.ɵɵelement(3, "mj-explorer-entity-data-grid", 215);
1349
1349
  i0.ɵɵelementEnd()();
1350
1350
  } if (rf & 2) {
1351
1351
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -1353,24 +1353,24 @@ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Template(r
1353
1353
  i0.ɵɵadvance(3);
1354
1354
  i0.ɵɵproperty("Params", ctx_r1.BuildRelationshipViewParamsByEntityName("MJ: AI Result Cache", "AIPromptID"))("NewRecordValues", ctx_r1.NewRecordValues("MJ: AI Result Cache"))("AllowLoad", true)("ShowToolbar", false);
1355
1355
  } }
1356
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_76_ng_template_1_Template(rf, ctx) { if (rf & 1) {
1357
- i0.ɵɵelementStart(0, "span", 67);
1358
- i0.ɵɵelement(1, "i", 217);
1356
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_77_ng_template_1_Template(rf, ctx) { if (rf & 1) {
1357
+ i0.ɵɵelementStart(0, "span", 68);
1358
+ i0.ɵɵelement(1, "i", 218);
1359
1359
  i0.ɵɵtext(2, " Related Items ");
1360
1360
  i0.ɵɵelementEnd();
1361
1361
  } }
1362
- function MJAIPromptFormComponentExtended_Conditional_1_Conditional_76_Template(rf, ctx) { if (rf & 1) {
1362
+ function MJAIPromptFormComponentExtended_Conditional_1_Conditional_77_Template(rf, ctx) { if (rf & 1) {
1363
1363
  i0.ɵɵelementStart(0, "mj-accordion-panel", 28);
1364
- i0.ɵɵtemplate(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_76_ng_template_1_Template, 3, 0, "ng-template", 29);
1365
- i0.ɵɵelementStart(2, "div", 35)(3, "div", 36)(4, "div")(5, "h6", 216);
1364
+ i0.ɵɵtemplate(1, MJAIPromptFormComponentExtended_Conditional_1_Conditional_77_ng_template_1_Template, 3, 0, "ng-template", 29);
1365
+ i0.ɵɵelementStart(2, "div", 35)(3, "div", 36)(4, "div")(5, "h6", 217);
1366
1366
  i0.ɵɵtext(6, "AI Agents Using This Prompt");
1367
1367
  i0.ɵɵelementEnd();
1368
- i0.ɵɵelement(7, "mj-explorer-entity-data-grid", 214);
1368
+ i0.ɵɵelement(7, "mj-explorer-entity-data-grid", 215);
1369
1369
  i0.ɵɵelementEnd();
1370
- i0.ɵɵelementStart(8, "div")(9, "h6", 216);
1370
+ i0.ɵɵelementStart(8, "div")(9, "h6", 217);
1371
1371
  i0.ɵɵtext(10, "Prompts Using This as Result Selector");
1372
1372
  i0.ɵɵelementEnd();
1373
- i0.ɵɵelement(11, "mj-explorer-entity-data-grid", 214);
1373
+ i0.ɵɵelement(11, "mj-explorer-entity-data-grid", 215);
1374
1374
  i0.ɵɵelementEnd()()()();
1375
1375
  } if (rf & 2) {
1376
1376
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -1431,28 +1431,28 @@ function MJAIPromptFormComponentExtended_Conditional_1_Template(rf, ctx) { if (r
1431
1431
  i0.ɵɵelement(51, "mj-form-field", 40)(52, "mj-form-field", 41);
1432
1432
  i0.ɵɵelementEnd();
1433
1433
  i0.ɵɵelementStart(53, "div");
1434
- i0.ɵɵelement(54, "mj-form-field", 42)(55, "mj-form-field", 43);
1435
- i0.ɵɵelementStart(56, "div", 44)(57, "label", 45);
1436
- i0.ɵɵtext(58, " Result Selector Prompt ");
1434
+ i0.ɵɵelement(54, "mj-form-field", 42)(55, "mj-form-field", 43)(56, "mj-form-field", 44);
1435
+ i0.ɵɵelementStart(57, "div", 45)(58, "label", 46);
1436
+ i0.ɵɵtext(59, " Result Selector Prompt ");
1437
1437
  i0.ɵɵelementEnd();
1438
- i0.ɵɵconditionalCreate(59, MJAIPromptFormComponentExtended_Conditional_1_Conditional_59_Template, 2, 1)(60, MJAIPromptFormComponentExtended_Conditional_1_Conditional_60_Template, 2, 1, "span", 46);
1438
+ i0.ɵɵconditionalCreate(60, MJAIPromptFormComponentExtended_Conditional_1_Conditional_60_Template, 2, 1)(61, MJAIPromptFormComponentExtended_Conditional_1_Conditional_61_Template, 2, 1, "span", 47);
1439
1439
  i0.ɵɵelementEnd()()()()();
1440
- i0.ɵɵelementStart(61, "mj-accordion-panel", 28);
1441
- i0.ɵɵtemplate(62, MJAIPromptFormComponentExtended_Conditional_1_ng_template_62_Template, 3, 0, "ng-template", 29);
1442
- i0.ɵɵelementStart(63, "div", 35)(64, "p", 47);
1443
- i0.ɵɵtext(65, " Assistant prefill seeds the model's response with an initial string, guiding output format and content. Stop sequences terminate generation when encountered. ");
1440
+ i0.ɵɵelementStart(62, "mj-accordion-panel", 28);
1441
+ i0.ɵɵtemplate(63, MJAIPromptFormComponentExtended_Conditional_1_ng_template_63_Template, 3, 0, "ng-template", 29);
1442
+ i0.ɵɵelementStart(64, "div", 35)(65, "p", 48);
1443
+ i0.ɵɵtext(66, " Assistant prefill seeds the model's response with an initial string, guiding output format and content. Stop sequences terminate generation when encountered. ");
1444
1444
  i0.ɵɵelementEnd();
1445
- i0.ɵɵelementStart(66, "div", 36)(67, "div");
1446
- i0.ɵɵelement(68, "mj-form-field", 48)(69, "mj-form-field", 49);
1445
+ i0.ɵɵelementStart(67, "div", 36)(68, "div");
1446
+ i0.ɵɵelement(69, "mj-form-field", 49)(70, "mj-form-field", 50);
1447
1447
  i0.ɵɵelementEnd();
1448
- i0.ɵɵelementStart(70, "div");
1449
- i0.ɵɵelement(71, "mj-form-field", 50);
1448
+ i0.ɵɵelementStart(71, "div");
1449
+ i0.ɵɵelement(72, "mj-form-field", 51);
1450
1450
  i0.ɵɵelementEnd()()()();
1451
- i0.ɵɵconditionalCreate(72, MJAIPromptFormComponentExtended_Conditional_1_Conditional_72_Template, 6, 2, "mj-accordion-panel", 28);
1452
1451
  i0.ɵɵconditionalCreate(73, MJAIPromptFormComponentExtended_Conditional_1_Conditional_73_Template, 6, 2, "mj-accordion-panel", 28);
1453
1452
  i0.ɵɵconditionalCreate(74, MJAIPromptFormComponentExtended_Conditional_1_Conditional_74_Template, 6, 2, "mj-accordion-panel", 28);
1454
- i0.ɵɵconditionalCreate(75, MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Template, 4, 5, "mj-accordion-panel", 28);
1455
- i0.ɵɵconditionalCreate(76, MJAIPromptFormComponentExtended_Conditional_1_Conditional_76_Template, 12, 9, "mj-accordion-panel", 28);
1453
+ i0.ɵɵconditionalCreate(75, MJAIPromptFormComponentExtended_Conditional_1_Conditional_75_Template, 6, 2, "mj-accordion-panel", 28);
1454
+ i0.ɵɵconditionalCreate(76, MJAIPromptFormComponentExtended_Conditional_1_Conditional_76_Template, 4, 5, "mj-accordion-panel", 28);
1455
+ i0.ɵɵconditionalCreate(77, MJAIPromptFormComponentExtended_Conditional_1_Conditional_77_Template, 12, 9, "mj-accordion-panel", 28);
1456
1456
  i0.ɵɵelementEnd()()()();
1457
1457
  } if (rf & 2) {
1458
1458
  const ctx_r1 = i0.ɵɵnextContext();
@@ -1501,8 +1501,10 @@ function MJAIPromptFormComponentExtended_Conditional_1_Template(rf, ctx) { if (r
1501
1501
  i0.ɵɵproperty("Record", ctx_r1.record)("ShowLabel", true)("EditMode", ctx_r1.EditMode);
1502
1502
  i0.ɵɵadvance();
1503
1503
  i0.ɵɵproperty("Record", ctx_r1.record)("ShowLabel", true)("EditMode", ctx_r1.EditMode);
1504
+ i0.ɵɵadvance();
1505
+ i0.ɵɵproperty("Record", ctx_r1.record)("ShowLabel", true)("EditMode", ctx_r1.EditMode);
1504
1506
  i0.ɵɵadvance(4);
1505
- i0.ɵɵconditional(ctx_r1.EditMode ? 59 : 60);
1507
+ i0.ɵɵconditional(ctx_r1.EditMode ? 60 : 61);
1506
1508
  i0.ɵɵadvance(2);
1507
1509
  i0.ɵɵproperty("Expanded", false);
1508
1510
  i0.ɵɵadvance(7);
@@ -1512,21 +1514,21 @@ function MJAIPromptFormComponentExtended_Conditional_1_Template(rf, ctx) { if (r
1512
1514
  i0.ɵɵadvance(2);
1513
1515
  i0.ɵɵproperty("Record", ctx_r1.record)("ShowLabel", true)("EditMode", ctx_r1.EditMode);
1514
1516
  i0.ɵɵadvance();
1515
- i0.ɵɵconditional(ctx_r1.template && ctx_r1.templateParams.length > 0 ? 72 : -1);
1517
+ i0.ɵɵconditional(ctx_r1.template && ctx_r1.templateParams.length > 0 ? 73 : -1);
1516
1518
  i0.ɵɵadvance();
1517
- i0.ɵɵconditional(ctx_r1.showOutputExample ? 73 : -1);
1519
+ i0.ɵɵconditional(ctx_r1.showOutputExample ? 74 : -1);
1518
1520
  i0.ɵɵadvance();
1519
- i0.ɵɵconditional(ctx_r1.record.IsSaved ? 74 : -1);
1521
+ i0.ɵɵconditional(ctx_r1.record.IsSaved ? 75 : -1);
1520
1522
  i0.ɵɵadvance();
1521
- i0.ɵɵconditional(ctx_r1.record.IsSaved && ctx_r1.record.EnableCaching ? 75 : -1);
1523
+ i0.ɵɵconditional(ctx_r1.record.IsSaved && ctx_r1.record.EnableCaching ? 76 : -1);
1522
1524
  i0.ɵɵadvance();
1523
- i0.ɵɵconditional(ctx_r1.record.IsSaved ? 76 : -1);
1525
+ i0.ɵɵconditional(ctx_r1.record.IsSaved ? 77 : -1);
1524
1526
  } }
1525
1527
  function MJAIPromptFormComponentExtended_Conditional_2_Template(rf, ctx) { if (rf & 1) {
1526
1528
  const _r36 = i0.ɵɵgetCurrentView();
1527
- i0.ɵɵelementStart(0, "mj-window", 218);
1529
+ i0.ɵɵelementStart(0, "mj-window", 219);
1528
1530
  i0.ɵɵlistener("Close", function MJAIPromptFormComponentExtended_Conditional_2_Template_mj_window_Close_0_listener() { i0.ɵɵrestoreView(_r36); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onTestHarnessVisibilityChanged(false)); });
1529
- i0.ɵɵelementStart(1, "mj-ai-test-harness", 219);
1531
+ i0.ɵɵelementStart(1, "mj-ai-test-harness", 220);
1530
1532
  i0.ɵɵlistener("visibilityChange", function MJAIPromptFormComponentExtended_Conditional_2_Template_mj_ai_test_harness_visibilityChange_1_listener($event) { i0.ɵɵrestoreView(_r36); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onTestHarnessVisibilityChanged($event)); });
1531
1533
  i0.ɵɵelementEnd()();
1532
1534
  } if (rf & 2) {
@@ -3451,9 +3453,9 @@ let MJAIPromptFormComponentExtended = class MJAIPromptFormComponentExtended exte
3451
3453
  } if (rf & 2) {
3452
3454
  let _t;
3453
3455
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.TemplateEditor = _t.first);
3454
- } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 2, consts: [["form", "ngForm"], ["templateEditor", ""], [3, "Record", "FormComponent", "ToolbarConfig", "WidthMode"], [3, "Width", "Height", "MinWidth", "MinHeight", "Draggable", "Resizable", "Visible", "Title"], [3, "Navigate", "DeleteRequested", "FavoriteToggled", "HistoryRequested", "ListManagementRequested", "Record", "FormComponent", "ToolbarConfig", "WidthMode"], [1, "record-form", 2, "display", "flex", "flex-direction", "column", "height", "100%", "overflow", "hidden"], [1, "prompt-main-area", 2, "display", "flex", "flex-direction", "column", "flex", "1", "min-height", "0", "overflow-y", "auto"], [1, "prompt-header", 2, "flex-shrink", "0", "padding", "20px", "background", "var(--mj-bg-surface-sunken)", "border-bottom", "2px solid var(--mj-border-default)"], [2, "display", "flex", "justify-content", "space-between", "align-items", "flex-start", "gap", "20px"], [2, "flex", "1", "min-width", "0"], [2, "display", "flex", "align-items", "center", "gap", "12px", "margin-bottom", "8px"], [1, "fa-solid", "fa-robot", 2, "color", "var(--mj-brand-primary)", "font-size", "1.4em"], ["type", "text", "name", "promptName", "placeholder", "Enter prompt name...", 1, "mj-input", 2, "font-size", "1.2em", "font-weight", "600", "min-width", "300px", "flex", "1", 3, "ngModel"], [2, "display", "flex", "gap", "16px", "margin-bottom", "12px", "flex-wrap", "wrap"], ["name", "promptDescription", "placeholder", "Enter prompt description...", 1, "mj-textarea", 2, "width", "100%", "max-width", "600px", "margin-bottom", "12px", 3, "ngModel", "rows"], [2, "margin", "0 0 12px 0", "color", "var(--mj-text-muted)", "font-size", "0.9em", "line-height", "1.4"], [1, "quick-config", 2, "display", "flex", "align-items", "center", "gap", "16px", "flex-wrap", "wrap"], [1, "config-item", 2, "display", "flex", "align-items", "center", "gap", "6px", "font-size", "0.85em"], [1, "fa-solid", "fa-layer-group", 2, "color", "var(--mj-text-muted)"], [2, "color", "var(--mj-text-muted)"], [2, "color", "var(--mj-text-secondary)", "font-weight", "500"], [1, "fa-solid", "fa-code", 2, "color", "var(--mj-text-muted)"], [2, "font-weight", "500"], [1, "action-buttons", 2, "display", "flex", "flex-direction", "column", "gap", "8px", "align-items", "flex-end"], [2, "display", "flex", "gap", "8px"], ["mjButton", "", "variant", "primary", "size", "lg", "title", "Run AI Prompt Test Harness"], [2, "font-size", "0.75em", "color", "#dc3545", "text-align", "right", "max-width", "200px"], [1, "configuration-sections", 2, "flex", "1", "background", "var(--mj-bg-surface-card)", "border-top", "2px solid var(--mj-border-default)", "padding", "16px", "min-height", "0"], [2, "margin-bottom", "12px", 3, "Expanded"], ["mjAccordionTitle", ""], [1, "template-section", 2, "display", "flex", "flex-direction", "column", "min-height", "400px", "padding", "8px"], [1, "loading-state", 2, "flex", "1", "display", "flex", "align-items", "center", "justify-content", "center", "color", "var(--mj-text-muted)"], ["Size", "large", "Icon", "fa-solid fa-code", "Title", "No Template Associated", "Message", "This AI prompt needs a template to define its structure and parameters. Create a new template or link to an existing one.", 1, "no-template-state"], ["Variant", "warning", "Title", "Template Not Found", "Message", "The referenced template could not be loaded. It may have been deleted or moved.", 1, "invalid-template-state"], [1, "template-editor-container", 2, "flex", "1", "display", "flex", "flex-direction", "column", "min-height", "350px"], [2, "padding", "16px 0"], [2, "display", "grid", "grid-template-columns", "1fr 1fr", "gap", "20px"], ["FieldName", "ParallelizationMode", "Type", "dropdownlist", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "ParallelCount", "Type", "numerictextbox", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "ParallelConfigParam", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "OutputType", "Type", "dropdownlist", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "EffortLevel", "Type", "numerictextbox", "Caption", "Effort Level (1-100)", "Description", "Higher values request more thorough reasoning", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "ValidationBehavior", "Type", "dropdownlist", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "EnableCaching", "Type", "checkbox", 3, "Record", "ShowLabel", "EditMode"], [2, "margin-bottom", "16px"], [2, "display", "block", "margin-bottom", "4px", "font-weight", "600", "color", "var(--mj-text-secondary)", "font-size", "0.9em"], [2, "color", "var(--mj-text-secondary)"], [2, "margin", "0 0 12px 0", "font-size", "0.85em", "color", "var(--mj-text-muted)"], ["FieldName", "AssistantPrefill", "Type", "textarea", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "StopSequences", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "PrefillFallbackMode", "Type", "dropdownlist", 3, "Record", "ShowLabel", "EditMode"], ["type", "text", "name", "promptName", "placeholder", "Enter prompt name...", 1, "mj-input", 2, "font-size", "1.2em", "font-weight", "600", "min-width", "300px", "flex", "1", 3, "ngModelChange", "ngModel"], [2, "margin", "0", "color", "var(--mj-text-secondary)", "font-weight", "600", "flex", "1"], [1, "status-badge", 2, "color", "white", "padding", "4px 10px", "border-radius", "12px", "font-size", "0.75em", "font-weight", "500"], ["name", "promptStatus", "TextField", "text", "ValueField", "value", 2, "width", "150px", 3, "ngModelChange", "ngModel", "Data", "ValuePrimitive"], [2, "color", "#dc3545"], [2, "padding", "8px", "color", "var(--mj-text-muted)", "font-style", "italic", "width", "200px"], ["name", "promptTypeID", "TextField", "Name", "ValueField", "ID", "Placeholder", "Select prompt type...", 2, "width", "200px", 3, "ngModel", "Data", "ValuePrimitive", "Filterable"], [1, "fa-solid", "fa-spinner", "fa-spin"], ["name", "promptTypeID", "TextField", "Name", "ValueField", "ID", "Placeholder", "Select prompt type...", 2, "width", "200px", 3, "ngModelChange", "ngModel", "Data", "ValuePrimitive", "Filterable"], ["name", "promptDescription", "placeholder", "Enter prompt description...", 1, "mj-textarea", 2, "width", "100%", "max-width", "600px", "margin-bottom", "12px", 3, "ngModelChange", "ngModel", "rows"], [1, "fa-solid", "fa-tag", 2, "color", "var(--mj-text-muted)"], [1, "fa-solid", "fa-database", 2, "color", "#28a745"], [2, "color", "#28a745", "font-weight", "500"], [1, "fa-solid", "fa-tachometer-alt", 2, "color", "var(--mj-text-muted)"], ["mjButton", "", "variant", "primary", "size", "lg", "title", "Run AI Prompt Test Harness", 3, "click"], [1, "fa-solid", "fa-play"], [2, "display", "flex", "align-items", "center", "gap", "8px", "font-weight", "600"], [2, "color", "var(--mj-text-muted)", "font-size", "0.9em", "font-weight", "normal"], [1, "fa-solid", "fa-spinner", "fa-spin", 2, "font-size", "24px", "margin-right", "12px"], ["ngProjectAs", "[actions]", 5, ["", "actions", ""], 2, "display", "flex", "gap", "12px"], ["mjButton", "", "variant", "primary"], ["mjButton", "", "variant", "outline"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "fa-solid", "fa-plus"], ["mjButton", "", "variant", "outline", 3, "click"], [1, "fa-solid", "fa-link"], [1, "fa-solid", "fa-arrows-rotate"], [1, "template-actions", 2, "display", "flex", "gap", "8px", "padding", "8px", "border-bottom", "1px solid var(--mj-border-default)", "background", "var(--mj-bg-surface-sunken)"], [2, "flex", "1", "background", "var(--mj-bg-surface-card)", "border-radius", "6px", "border", "1px solid var(--mj-border-default)"], [2, "display", "block", "min-height", "300px", 3, "contentChange", "runTemplate", "template", "config"], ["mjButton", "", "variant", "outline", "size", "sm", "title", "Change to a different template"], ["mjButton", "", "variant", "outline", "size", "sm", "title", "Open template in new window"], ["mjButton", "", "variant", "outline", "size", "sm", "title", "Change to a different template", 3, "click"], [1, "fa-solid", "fa-exchange-alt"], ["mjButton", "", "variant", "outline", "size", "sm", "title", "Open template in new window", 3, "click"], [1, "fa-solid", "fa-external-link-alt"], [1, "model-management", 2, "border", "1px solid var(--mj-border-default)", "border-radius", "6px", "background", "var(--mj-bg-surface-sunken)"], [1, "loading-state", 2, "padding", "20px", "text-align", "center", "color", "var(--mj-text-muted)"], [1, "fa-solid", "fa-microchip", 2, "color", "var(--mj-text-muted)"], [1, "mj-accordion-badge"], [2, "color", "var(--mj-text-muted)", "font-size", "0.8em", "font-weight", "normal", "margin-left", "8px"], ["title", "Models are tried in order from top to bottom. The first available model will be used.", 1, "fa-solid", "fa-info-circle"], ["Size", "compact", "Icon", "fa-solid fa-circle-info", "Title", "No models configured"], ["ngProjectAs", "[actions]", "mjButton", "", "variant", "outline", "size", "sm", 5, ["", "actions", ""]], ["ngProjectAs", "[actions]", "mjButton", "", "variant", "outline", "size", "sm", 5, ["", "actions", ""], 3, "click"], [2, "padding", "12px 16px", "background", "color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface))", "border-bottom", "1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default))", "color", "var(--mj-brand-primary)", "font-size", "0.85em"], [1, "model-header", 2, "display", "grid", "grid-template-columns", "40px 2fr 1fr 1fr 1fr 60px", "gap", "12px", "padding", "12px 16px", "background", "var(--mj-bg-surface-sunken)", "font-weight", "600", "font-size", "0.85em", "color", "var(--mj-text-secondary)", "border-bottom", "1px solid var(--mj-border-default)"], ["title", "Priority order - models are tried from top to bottom"], [1, "fa-solid", "fa-sort", 2, "color", "var(--mj-text-muted)"], [1, "add-model-row", 2, "padding", "12px 16px", "text-align", "center", "background", "var(--mj-bg-surface-sunken)", "border-top", "1px solid var(--mj-border-default)"], [1, "fa-solid", "fa-info-circle", 2, "margin-right", "6px"], [1, "model-row", 2, "display", "grid", "grid-template-columns", "40px 2fr 1fr 1fr 1fr 60px", "gap", "12px", "padding", "12px 16px", "border-bottom", "1px solid var(--mj-border-default)", "align-items", "start", "transition", "background 0.2s, opacity 0.2s", 3, "dragstart", "dragover", "drop", "dragend", "draggable"], [1, "drag-handle", 2, "display", "flex", "flex-direction", "column", "align-items", "center", "justify-content", "center", "color", "var(--mj-text-muted)"], [2, "font-size", "0.9em", "font-weight", "600", 3, "title"], [1, "model-select"], ["TextField", "Name", "ValueField", "ID", "Placeholder", "Select a model...", 2, "width", "100%", 3, "ngModel", "name", "Data", "ValuePrimitive", "Filterable"], [1, "model-vendor"], [1, "model-configuration"], [2, "font-size", "0.9em"], [1, "model-created"], [2, "color", "var(--mj-text-muted)", "font-size", "0.8em"], [2, "color", "#28a745", "font-size", "0.8em", "font-style", "italic"], [1, "model-actions", 2, "display", "flex", "gap", "2px", "flex-direction", "column"], [2, "display", "grid", "grid-template-columns", "40px 1fr", "gap", "12px", "padding", "8px 16px", "border-bottom", "1px solid var(--mj-border-default)", "background", "var(--mj-bg-surface-sunken)", "font-size", "0.85em", "color", "var(--mj-text-muted)"], [2, "display", "flex", "gap", "16px", "flex-wrap", "wrap", "align-items", "center", "margin-bottom", "8px"], [2, "padding", "8px", "background", "var(--mj-bg-surface-card)", "border", "1px solid var(--mj-border-default)", "border-radius", "4px", "margin-top", "8px"], ["title", "Drag to reorder priority", 1, "fa-solid", "fa-grip-vertical", 2, "cursor", "move"], [2, "font-size", "0.7em", "margin-top", "2px"], ["TextField", "Name", "ValueField", "ID", "Placeholder", "Select a model...", 2, "width", "100%", 3, "ngModelChange", "ValueChange", "ngModel", "name", "Data", "ValuePrimitive", "Filterable"], [2, "color", "var(--mj-text-muted)", "font-style", "italic", "font-size", "0.9em"], ["TextField", "Name", "ValueField", "ID", "Placeholder", "Select vendor...", 2, "width", "100%", 3, "ngModel", "name", "Data", "ValuePrimitive", "Filterable"], ["TextField", "Name", "ValueField", "ID", "Placeholder", "Select vendor...", 2, "width", "100%", 3, "ngModelChange", "ngModel", "name", "Data", "ValuePrimitive", "Filterable"], [2, "font-size", "0.9em", "font-weight", "500", 3, "color"], [2, "font-size", "0.9em", "font-weight", "500"], [2, "font-size", "0.8em", "margin-left", "4px"], [2, "font-size", "0.9em", 3, "color"], [2, "color", "var(--mj-text-muted)", "font-size", "0.9em"], [2, "padding", "4px", "color", "var(--mj-text-muted)", "font-style", "italic", "font-size", "0.85em"], ["TextField", "Name", "ValueField", "ID", "Placeholder", "Default", 2, "width", "100%", 3, "ngModel", "name", "Data", "ValuePrimitive", "Filterable"], ["TextField", "Name", "ValueField", "ID", "Placeholder", "Default", 2, "width", "100%", 3, "ngModelChange", "ValueChange", "ngModel", "name", "Data", "ValuePrimitive", "Filterable"], [2, "display", "flex", "gap", "2px", "margin-bottom", "4px"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Remove model", 2, "color", "var(--mj-status-error)"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Move up", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-up"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Move down", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-down"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Remove model", 2, "color", "var(--mj-status-error)", 3, "click"], [1, "fa-solid", "fa-times"], [2, "margin-bottom", "6px", "font-weight", "600", "color", "var(--mj-text-secondary)", "font-size", "0.9em"], [1, "fa-solid", "fa-layer-group"], [2, "display", "grid", "grid-template-columns", "1fr 1fr 1fr", "gap", "12px", "align-items", "center"], [2, "display", "flex", "gap", "16px", "flex-wrap", "wrap", "align-items", "center"], [2, "display", "block", "margin-bottom", "2px", "font-size", "0.8em", "font-weight", "600", "color", "var(--mj-text-secondary)"], ["TextField", "text", "ValueField", "value", "Placeholder", "Select mode...", 2, "width", "100%", "font-size", "0.85em", 3, "ngModelChange", "ngModel", "name", "Data", "ValuePrimitive"], ["Placeholder", "Count...", 2, "width", "100%", "font-size", "0.85em", 3, "ngModelChange", "ngModel", "name", "Min", "Step", "Format"], ["type", "text", "placeholder", "Parameter name...", 1, "mj-input", 2, "width", "100%", "font-size", "0.85em", 3, "ngModelChange", "ngModel", "name"], ["mjButton", "", "variant", "outline", "size", "sm", 2, "color", "var(--mj-status-success)", "border-color", "var(--mj-status-success)", 3, "click"], [1, "fa-solid", "fa-cogs", 2, "color", "var(--mj-text-muted)"], [2, "padding", "8px", "color", "var(--mj-text-muted)", "font-style", "italic"], ["name", "resultSelectorPromptID", "TextField", "text", "ValueField", "value", "Placeholder", "Select a result selector prompt...", 2, "width", "100%", 3, "ngModel", "Data", "ValuePrimitive", "Filterable"], ["name", "resultSelectorPromptID", "TextField", "text", "ValueField", "value", "Placeholder", "Select a result selector prompt...", 2, "width", "100%", 3, "ngModelChange", "ValueChange", "ngModel", "Data", "ValuePrimitive", "Filterable"], [1, "fa-solid", "fa-wand-magic-sparkles", 2, "color", "var(--mj-text-muted)"], ["Size", "compact", "Icon", "fa-solid fa-circle-info", "Title", "This template has no parameters defined"], [1, "fa-solid", "fa-sliders", 2, "color", "var(--mj-text-muted)"], ["title", "These parameters are defined in the template and will be available when executing this prompt", 1, "fa-solid", "fa-info-circle"], [2, "display", "grid", "gap", "12px"], [1, "parameter-card", 2, "border", "1px solid var(--mj-border-default)", "border-radius", "8px", "padding", "16px", "background", "var(--mj-bg-surface-sunken)", "transition", "all 0.2s", 3, "border-left"], [2, "margin-top", "16px", "padding", "12px", "background", "color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface))", "border-radius", "6px", "border", "1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default))"], [2, "display", "flex", "align-items", "flex-start", "gap", "8px"], [1, "fa-solid", "fa-lightbulb", 2, "color", "var(--mj-brand-primary)", "margin-top", "2px"], [2, "flex", "1", "font-size", "0.85em", "color", "var(--mj-brand-primary)", "line-height", "1.5"], [1, "parameter-card", 2, "border", "1px solid var(--mj-border-default)", "border-radius", "8px", "padding", "16px", "background", "var(--mj-bg-surface-sunken)", "transition", "all 0.2s"], [2, "display", "flex", "justify-content", "space-between", "align-items", "flex-start", "margin-bottom", "8px"], [2, "display", "flex", "align-items", "center", "gap", "8px"], [2, "font-size", "1.2em"], [2, "margin", "0", "color", "var(--mj-text-secondary)", "font-weight", "600"], [2, "color", "#dc3545", "font-size", "0.9em", "margin-left", "4px"], [1, "type-badge", 2, "color", "white", "padding", "4px 8px", "border-radius", "12px", "font-size", "0.75em", "font-weight", "500"], [2, "color", "#dc3545", "font-size", "0.85em", "font-weight", "500"], [2, "color", "var(--mj-text-muted)", "font-size", "0.85em"], [2, "margin", "0 0 8px 0", "color", "var(--mj-text-muted)", "font-size", "0.9em", "line-height", "1.4"], [2, "font-size", "0.85em", "color", "var(--mj-text-secondary)"], [2, "display", "flex", "align-items", "center", "gap", "4px", "margin-bottom", "4px"], [1, "fa-solid", "fa-info-circle", 2, "color", "var(--mj-text-muted)"], [2, "display", "grid", "grid-template-columns", "repeat(auto-fit, minmax(200px, 1fr))", "gap", "12px", "margin-top", "12px"], [2, "background", "var(--mj-bg-surface-card)", "padding", "8px 12px", "border-radius", "4px", "border", "1px solid var(--mj-border-default)"], [2, "display", "block", "font-size", "0.8em", "color", "var(--mj-text-muted)", "margin-bottom", "2px"], [2, "font-size", "0.85em", "color", "var(--mj-text-secondary)", "word-break", "break-all"], [2, "font-size", "0.8em", "color", "var(--mj-text-secondary)", "word-break", "break-all"], [2, "padding", "16px"], [2, "background", "var(--mj-bg-surface-sunken)", "border", "1px solid var(--mj-border-default)", "border-radius", "4px", "padding", "12px", "font-family", "'Courier New', monospace", "font-size", "0.9em", "white-space", "pre-wrap", "overflow", "auto", "max-height", "250px"], ["Variant", "warning"], [2, "color", "#dc3545", "font-size", "0.8em", "font-weight", "normal"], ["name", "outputExample", "language", "json", "placeholder", "Enter JSON example structure...", 2, "width", "100%", "height", "200px", "border", "1px solid var(--mj-border-default)", "border-radius", "4px", 3, "ngModelChange", "ngModel"], [2, "margin-top", "8px", "color", "var(--mj-text-muted)", "font-size", "0.85em"], [1, "fa-solid", "fa-info-circle"], [2, "text-align", "center", "padding", "40px", "color", "var(--mj-text-muted)"], ["Size", "compact", "Icon", "fa-solid fa-clock-rotate-left", "Title", "No execution history yet", "Message", "Run this prompt to see execution history here"], [1, "fa-solid", "fa-history", 2, "color", "var(--mj-text-muted)"], [2, "color", "var(--mj-text-muted)", "font-weight", "normal"], [1, "fa-solid", "fa-spinner", "fa-spin", 2, "font-size", "2em", "margin-bottom", "12px"], [2, "display", "flex", "justify-content", "space-between", "align-items", "center", "margin-bottom", "16px"], [2, "display", "flex", "gap", "8px", "align-items", "center"], [1, "mj-button-group"], ["mjButton", "", "size", "sm", 3, "click"], [2, "margin-left", "4px", "font-size", "0.8em", 3, "class"], [2, "border", "1px solid var(--mj-border-default)", "border-radius", "8px", "overflow", "hidden"], [2, "width", "100%", "border-collapse", "collapse"], [2, "background", "var(--mj-bg-surface-sunken)", "border-bottom", "2px solid var(--mj-border-default)"], [2, "padding", "12px", "text-align", "left", "font-weight", "600", "color", "var(--mj-text-secondary)"], [2, "padding", "12px", "text-align", "right", "font-weight", "600", "color", "var(--mj-text-secondary)"], [2, "padding", "12px", "text-align", "center", "font-weight", "600", "color", "var(--mj-text-secondary)"], [1, "history-row", 2, "border-bottom", "1px solid var(--mj-border-default)", 3, "even-row"], [2, "margin-left", "4px", "font-size", "0.8em"], [1, "history-row", 2, "border-bottom", "1px solid var(--mj-border-default)"], [2, "padding", "12px"], [2, "display", "flex", "align-items", "center", "gap", "6px"], [2, "padding", "12px", "color", "var(--mj-text-secondary)"], [2, "padding", "12px", "text-align", "right", "color", "var(--mj-text-secondary)"], [2, "padding", "12px", "text-align", "center"], [2, "padding", "4px 8px", "border-radius", "12px", "background", "var(--mj-bg-surface-sunken)", "color", "var(--mj-text-secondary)", "font-size", "0.85em", "font-weight", "500"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "View details", 3, "click"], [1, "fa-solid", "fa-external-link"], [3, "Params", "NewRecordValues", "AllowLoad", "ShowToolbar"], [1, "fa-solid", "fa-database", 2, "color", "var(--mj-text-muted)"], [2, "margin", "0 0 12px 0", "color", "var(--mj-text-secondary)"], [1, "fa-solid", "fa-link", 2, "color", "var(--mj-text-muted)"], [3, "Close", "Width", "Height", "MinWidth", "MinHeight", "Draggable", "Resizable", "Visible", "Title"], [3, "visibilityChange", "entity", "mode", "isVisible"]], template: function MJAIPromptFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
3456
+ } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 2, consts: [["form", "ngForm"], ["templateEditor", ""], [3, "Record", "FormComponent", "ToolbarConfig", "WidthMode"], [3, "Width", "Height", "MinWidth", "MinHeight", "Draggable", "Resizable", "Visible", "Title"], [3, "Navigate", "DeleteRequested", "FavoriteToggled", "HistoryRequested", "ListManagementRequested", "Record", "FormComponent", "ToolbarConfig", "WidthMode"], [1, "record-form", 2, "display", "flex", "flex-direction", "column", "height", "100%", "overflow", "hidden"], [1, "prompt-main-area", 2, "display", "flex", "flex-direction", "column", "flex", "1", "min-height", "0", "overflow-y", "auto"], [1, "prompt-header", 2, "flex-shrink", "0", "padding", "20px", "background", "var(--mj-bg-surface-sunken)", "border-bottom", "2px solid var(--mj-border-default)"], [2, "display", "flex", "justify-content", "space-between", "align-items", "flex-start", "gap", "20px"], [2, "flex", "1", "min-width", "0"], [2, "display", "flex", "align-items", "center", "gap", "12px", "margin-bottom", "8px"], [1, "fa-solid", "fa-robot", 2, "color", "var(--mj-brand-primary)", "font-size", "1.4em"], ["type", "text", "name", "promptName", "placeholder", "Enter prompt name...", 1, "mj-input", 2, "font-size", "1.2em", "font-weight", "600", "min-width", "300px", "flex", "1", 3, "ngModel"], [2, "display", "flex", "gap", "16px", "margin-bottom", "12px", "flex-wrap", "wrap"], ["name", "promptDescription", "placeholder", "Enter prompt description...", 1, "mj-textarea", 2, "width", "100%", "max-width", "600px", "margin-bottom", "12px", 3, "ngModel", "rows"], [2, "margin", "0 0 12px 0", "color", "var(--mj-text-muted)", "font-size", "0.9em", "line-height", "1.4"], [1, "quick-config", 2, "display", "flex", "align-items", "center", "gap", "16px", "flex-wrap", "wrap"], [1, "config-item", 2, "display", "flex", "align-items", "center", "gap", "6px", "font-size", "0.85em"], [1, "fa-solid", "fa-layer-group", 2, "color", "var(--mj-text-muted)"], [2, "color", "var(--mj-text-muted)"], [2, "color", "var(--mj-text-secondary)", "font-weight", "500"], [1, "fa-solid", "fa-code", 2, "color", "var(--mj-text-muted)"], [2, "font-weight", "500"], [1, "action-buttons", 2, "display", "flex", "flex-direction", "column", "gap", "8px", "align-items", "flex-end"], [2, "display", "flex", "gap", "8px"], ["mjButton", "", "variant", "primary", "size", "lg", "title", "Run AI Prompt Test Harness"], [2, "font-size", "0.75em", "color", "#dc3545", "text-align", "right", "max-width", "200px"], [1, "configuration-sections", 2, "flex", "1", "background", "var(--mj-bg-surface-card)", "border-top", "2px solid var(--mj-border-default)", "padding", "16px", "min-height", "0"], [2, "margin-bottom", "12px", 3, "Expanded"], ["mjAccordionTitle", ""], [1, "template-section", 2, "display", "flex", "flex-direction", "column", "min-height", "400px", "padding", "8px"], [1, "loading-state", 2, "flex", "1", "display", "flex", "align-items", "center", "justify-content", "center", "color", "var(--mj-text-muted)"], ["Size", "large", "Icon", "fa-solid fa-code", "Title", "No Template Associated", "Message", "This AI prompt needs a template to define its structure and parameters. Create a new template or link to an existing one.", 1, "no-template-state"], ["Variant", "warning", "Title", "Template Not Found", "Message", "The referenced template could not be loaded. It may have been deleted or moved.", 1, "invalid-template-state"], [1, "template-editor-container", 2, "flex", "1", "display", "flex", "flex-direction", "column", "min-height", "350px"], [2, "padding", "16px 0"], [2, "display", "grid", "grid-template-columns", "1fr 1fr", "gap", "20px"], ["FieldName", "ParallelizationMode", "Type", "dropdownlist", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "ParallelCount", "Type", "numerictextbox", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "ParallelConfigParam", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "OutputType", "Type", "dropdownlist", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "EffortLevel", "Type", "numerictextbox", "Caption", "Effort Level (1-100)", "Description", "Higher values request more thorough reasoning", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "ValidationBehavior", "Type", "dropdownlist", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "EnableCaching", "Type", "checkbox", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "TemplateDataCapture", "Type", "select", 3, "Record", "ShowLabel", "EditMode"], [2, "margin-bottom", "16px"], [2, "display", "block", "margin-bottom", "4px", "font-weight", "600", "color", "var(--mj-text-secondary)", "font-size", "0.9em"], [2, "color", "var(--mj-text-secondary)"], [2, "margin", "0 0 12px 0", "font-size", "0.85em", "color", "var(--mj-text-muted)"], ["FieldName", "AssistantPrefill", "Type", "textarea", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "StopSequences", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "PrefillFallbackMode", "Type", "dropdownlist", 3, "Record", "ShowLabel", "EditMode"], ["type", "text", "name", "promptName", "placeholder", "Enter prompt name...", 1, "mj-input", 2, "font-size", "1.2em", "font-weight", "600", "min-width", "300px", "flex", "1", 3, "ngModelChange", "ngModel"], [2, "margin", "0", "color", "var(--mj-text-secondary)", "font-weight", "600", "flex", "1"], [1, "status-badge", 2, "color", "white", "padding", "4px 10px", "border-radius", "12px", "font-size", "0.75em", "font-weight", "500"], ["name", "promptStatus", "TextField", "text", "ValueField", "value", 2, "width", "150px", 3, "ngModelChange", "ngModel", "Data", "ValuePrimitive"], [2, "color", "#dc3545"], [2, "padding", "8px", "color", "var(--mj-text-muted)", "font-style", "italic", "width", "200px"], ["name", "promptTypeID", "TextField", "Name", "ValueField", "ID", "Placeholder", "Select prompt type...", 2, "width", "200px", 3, "ngModel", "Data", "ValuePrimitive", "Filterable"], [1, "fa-solid", "fa-spinner", "fa-spin"], ["name", "promptTypeID", "TextField", "Name", "ValueField", "ID", "Placeholder", "Select prompt type...", 2, "width", "200px", 3, "ngModelChange", "ngModel", "Data", "ValuePrimitive", "Filterable"], ["name", "promptDescription", "placeholder", "Enter prompt description...", 1, "mj-textarea", 2, "width", "100%", "max-width", "600px", "margin-bottom", "12px", 3, "ngModelChange", "ngModel", "rows"], [1, "fa-solid", "fa-tag", 2, "color", "var(--mj-text-muted)"], [1, "fa-solid", "fa-database", 2, "color", "#28a745"], [2, "color", "#28a745", "font-weight", "500"], [1, "fa-solid", "fa-tachometer-alt", 2, "color", "var(--mj-text-muted)"], ["mjButton", "", "variant", "primary", "size", "lg", "title", "Run AI Prompt Test Harness", 3, "click"], [1, "fa-solid", "fa-play"], [2, "display", "flex", "align-items", "center", "gap", "8px", "font-weight", "600"], [2, "color", "var(--mj-text-muted)", "font-size", "0.9em", "font-weight", "normal"], [1, "fa-solid", "fa-spinner", "fa-spin", 2, "font-size", "24px", "margin-right", "12px"], ["ngProjectAs", "[actions]", 5, ["", "actions", ""], 2, "display", "flex", "gap", "12px"], ["mjButton", "", "variant", "primary"], ["mjButton", "", "variant", "outline"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "fa-solid", "fa-plus"], ["mjButton", "", "variant", "outline", 3, "click"], [1, "fa-solid", "fa-link"], [1, "fa-solid", "fa-arrows-rotate"], [1, "template-actions", 2, "display", "flex", "gap", "8px", "padding", "8px", "border-bottom", "1px solid var(--mj-border-default)", "background", "var(--mj-bg-surface-sunken)"], [2, "flex", "1", "background", "var(--mj-bg-surface-card)", "border-radius", "6px", "border", "1px solid var(--mj-border-default)"], [2, "display", "block", "min-height", "300px", 3, "contentChange", "runTemplate", "template", "config"], ["mjButton", "", "variant", "outline", "size", "sm", "title", "Change to a different template"], ["mjButton", "", "variant", "outline", "size", "sm", "title", "Open template in new window"], ["mjButton", "", "variant", "outline", "size", "sm", "title", "Change to a different template", 3, "click"], [1, "fa-solid", "fa-exchange-alt"], ["mjButton", "", "variant", "outline", "size", "sm", "title", "Open template in new window", 3, "click"], [1, "fa-solid", "fa-external-link-alt"], [1, "model-management", 2, "border", "1px solid var(--mj-border-default)", "border-radius", "6px", "background", "var(--mj-bg-surface-sunken)"], [1, "loading-state", 2, "padding", "20px", "text-align", "center", "color", "var(--mj-text-muted)"], [1, "fa-solid", "fa-microchip", 2, "color", "var(--mj-text-muted)"], [1, "mj-accordion-badge"], [2, "color", "var(--mj-text-muted)", "font-size", "0.8em", "font-weight", "normal", "margin-left", "8px"], ["title", "Models are tried in order from top to bottom. The first available model will be used.", 1, "fa-solid", "fa-info-circle"], ["Size", "compact", "Icon", "fa-solid fa-circle-info", "Title", "No models configured"], ["ngProjectAs", "[actions]", "mjButton", "", "variant", "outline", "size", "sm", 5, ["", "actions", ""]], ["ngProjectAs", "[actions]", "mjButton", "", "variant", "outline", "size", "sm", 5, ["", "actions", ""], 3, "click"], [2, "padding", "12px 16px", "background", "color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface))", "border-bottom", "1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default))", "color", "var(--mj-brand-primary)", "font-size", "0.85em"], [1, "model-header", 2, "display", "grid", "grid-template-columns", "40px 2fr 1fr 1fr 1fr 60px", "gap", "12px", "padding", "12px 16px", "background", "var(--mj-bg-surface-sunken)", "font-weight", "600", "font-size", "0.85em", "color", "var(--mj-text-secondary)", "border-bottom", "1px solid var(--mj-border-default)"], ["title", "Priority order - models are tried from top to bottom"], [1, "fa-solid", "fa-sort", 2, "color", "var(--mj-text-muted)"], [1, "add-model-row", 2, "padding", "12px 16px", "text-align", "center", "background", "var(--mj-bg-surface-sunken)", "border-top", "1px solid var(--mj-border-default)"], [1, "fa-solid", "fa-info-circle", 2, "margin-right", "6px"], [1, "model-row", 2, "display", "grid", "grid-template-columns", "40px 2fr 1fr 1fr 1fr 60px", "gap", "12px", "padding", "12px 16px", "border-bottom", "1px solid var(--mj-border-default)", "align-items", "start", "transition", "background 0.2s, opacity 0.2s", 3, "dragstart", "dragover", "drop", "dragend", "draggable"], [1, "drag-handle", 2, "display", "flex", "flex-direction", "column", "align-items", "center", "justify-content", "center", "color", "var(--mj-text-muted)"], [2, "font-size", "0.9em", "font-weight", "600", 3, "title"], [1, "model-select"], ["TextField", "Name", "ValueField", "ID", "Placeholder", "Select a model...", 2, "width", "100%", 3, "ngModel", "name", "Data", "ValuePrimitive", "Filterable"], [1, "model-vendor"], [1, "model-configuration"], [2, "font-size", "0.9em"], [1, "model-created"], [2, "color", "var(--mj-text-muted)", "font-size", "0.8em"], [2, "color", "#28a745", "font-size", "0.8em", "font-style", "italic"], [1, "model-actions", 2, "display", "flex", "gap", "2px", "flex-direction", "column"], [2, "display", "grid", "grid-template-columns", "40px 1fr", "gap", "12px", "padding", "8px 16px", "border-bottom", "1px solid var(--mj-border-default)", "background", "var(--mj-bg-surface-sunken)", "font-size", "0.85em", "color", "var(--mj-text-muted)"], [2, "display", "flex", "gap", "16px", "flex-wrap", "wrap", "align-items", "center", "margin-bottom", "8px"], [2, "padding", "8px", "background", "var(--mj-bg-surface-card)", "border", "1px solid var(--mj-border-default)", "border-radius", "4px", "margin-top", "8px"], ["title", "Drag to reorder priority", 1, "fa-solid", "fa-grip-vertical", 2, "cursor", "move"], [2, "font-size", "0.7em", "margin-top", "2px"], ["TextField", "Name", "ValueField", "ID", "Placeholder", "Select a model...", 2, "width", "100%", 3, "ngModelChange", "ValueChange", "ngModel", "name", "Data", "ValuePrimitive", "Filterable"], [2, "color", "var(--mj-text-muted)", "font-style", "italic", "font-size", "0.9em"], ["TextField", "Name", "ValueField", "ID", "Placeholder", "Select vendor...", 2, "width", "100%", 3, "ngModel", "name", "Data", "ValuePrimitive", "Filterable"], ["TextField", "Name", "ValueField", "ID", "Placeholder", "Select vendor...", 2, "width", "100%", 3, "ngModelChange", "ngModel", "name", "Data", "ValuePrimitive", "Filterable"], [2, "font-size", "0.9em", "font-weight", "500", 3, "color"], [2, "font-size", "0.9em", "font-weight", "500"], [2, "font-size", "0.8em", "margin-left", "4px"], [2, "font-size", "0.9em", 3, "color"], [2, "color", "var(--mj-text-muted)", "font-size", "0.9em"], [2, "padding", "4px", "color", "var(--mj-text-muted)", "font-style", "italic", "font-size", "0.85em"], ["TextField", "Name", "ValueField", "ID", "Placeholder", "Default", 2, "width", "100%", 3, "ngModel", "name", "Data", "ValuePrimitive", "Filterable"], ["TextField", "Name", "ValueField", "ID", "Placeholder", "Default", 2, "width", "100%", 3, "ngModelChange", "ValueChange", "ngModel", "name", "Data", "ValuePrimitive", "Filterable"], [2, "display", "flex", "gap", "2px", "margin-bottom", "4px"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Remove model", 2, "color", "var(--mj-status-error)"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Move up", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-up"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Move down", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-down"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Remove model", 2, "color", "var(--mj-status-error)", 3, "click"], [1, "fa-solid", "fa-times"], [2, "margin-bottom", "6px", "font-weight", "600", "color", "var(--mj-text-secondary)", "font-size", "0.9em"], [1, "fa-solid", "fa-layer-group"], [2, "display", "grid", "grid-template-columns", "1fr 1fr 1fr", "gap", "12px", "align-items", "center"], [2, "display", "flex", "gap", "16px", "flex-wrap", "wrap", "align-items", "center"], [2, "display", "block", "margin-bottom", "2px", "font-size", "0.8em", "font-weight", "600", "color", "var(--mj-text-secondary)"], ["TextField", "text", "ValueField", "value", "Placeholder", "Select mode...", 2, "width", "100%", "font-size", "0.85em", 3, "ngModelChange", "ngModel", "name", "Data", "ValuePrimitive"], ["Placeholder", "Count...", 2, "width", "100%", "font-size", "0.85em", 3, "ngModelChange", "ngModel", "name", "Min", "Step", "Format"], ["type", "text", "placeholder", "Parameter name...", 1, "mj-input", 2, "width", "100%", "font-size", "0.85em", 3, "ngModelChange", "ngModel", "name"], ["mjButton", "", "variant", "outline", "size", "sm", 2, "color", "var(--mj-status-success)", "border-color", "var(--mj-status-success)", 3, "click"], [1, "fa-solid", "fa-cogs", 2, "color", "var(--mj-text-muted)"], [2, "padding", "8px", "color", "var(--mj-text-muted)", "font-style", "italic"], ["name", "resultSelectorPromptID", "TextField", "text", "ValueField", "value", "Placeholder", "Select a result selector prompt...", 2, "width", "100%", 3, "ngModel", "Data", "ValuePrimitive", "Filterable"], ["name", "resultSelectorPromptID", "TextField", "text", "ValueField", "value", "Placeholder", "Select a result selector prompt...", 2, "width", "100%", 3, "ngModelChange", "ValueChange", "ngModel", "Data", "ValuePrimitive", "Filterable"], [1, "fa-solid", "fa-wand-magic-sparkles", 2, "color", "var(--mj-text-muted)"], ["Size", "compact", "Icon", "fa-solid fa-circle-info", "Title", "This template has no parameters defined"], [1, "fa-solid", "fa-sliders", 2, "color", "var(--mj-text-muted)"], ["title", "These parameters are defined in the template and will be available when executing this prompt", 1, "fa-solid", "fa-info-circle"], [2, "display", "grid", "gap", "12px"], [1, "parameter-card", 2, "border", "1px solid var(--mj-border-default)", "border-radius", "8px", "padding", "16px", "background", "var(--mj-bg-surface-sunken)", "transition", "all 0.2s", 3, "border-left"], [2, "margin-top", "16px", "padding", "12px", "background", "color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface))", "border-radius", "6px", "border", "1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default))"], [2, "display", "flex", "align-items", "flex-start", "gap", "8px"], [1, "fa-solid", "fa-lightbulb", 2, "color", "var(--mj-brand-primary)", "margin-top", "2px"], [2, "flex", "1", "font-size", "0.85em", "color", "var(--mj-brand-primary)", "line-height", "1.5"], [1, "parameter-card", 2, "border", "1px solid var(--mj-border-default)", "border-radius", "8px", "padding", "16px", "background", "var(--mj-bg-surface-sunken)", "transition", "all 0.2s"], [2, "display", "flex", "justify-content", "space-between", "align-items", "flex-start", "margin-bottom", "8px"], [2, "display", "flex", "align-items", "center", "gap", "8px"], [2, "font-size", "1.2em"], [2, "margin", "0", "color", "var(--mj-text-secondary)", "font-weight", "600"], [2, "color", "#dc3545", "font-size", "0.9em", "margin-left", "4px"], [1, "type-badge", 2, "color", "white", "padding", "4px 8px", "border-radius", "12px", "font-size", "0.75em", "font-weight", "500"], [2, "color", "#dc3545", "font-size", "0.85em", "font-weight", "500"], [2, "color", "var(--mj-text-muted)", "font-size", "0.85em"], [2, "margin", "0 0 8px 0", "color", "var(--mj-text-muted)", "font-size", "0.9em", "line-height", "1.4"], [2, "font-size", "0.85em", "color", "var(--mj-text-secondary)"], [2, "display", "flex", "align-items", "center", "gap", "4px", "margin-bottom", "4px"], [1, "fa-solid", "fa-info-circle", 2, "color", "var(--mj-text-muted)"], [2, "display", "grid", "grid-template-columns", "repeat(auto-fit, minmax(200px, 1fr))", "gap", "12px", "margin-top", "12px"], [2, "background", "var(--mj-bg-surface-card)", "padding", "8px 12px", "border-radius", "4px", "border", "1px solid var(--mj-border-default)"], [2, "display", "block", "font-size", "0.8em", "color", "var(--mj-text-muted)", "margin-bottom", "2px"], [2, "font-size", "0.85em", "color", "var(--mj-text-secondary)", "word-break", "break-all"], [2, "font-size", "0.8em", "color", "var(--mj-text-secondary)", "word-break", "break-all"], [2, "padding", "16px"], [2, "background", "var(--mj-bg-surface-sunken)", "border", "1px solid var(--mj-border-default)", "border-radius", "4px", "padding", "12px", "font-family", "'Courier New', monospace", "font-size", "0.9em", "white-space", "pre-wrap", "overflow", "auto", "max-height", "250px"], ["Variant", "warning"], [2, "color", "#dc3545", "font-size", "0.8em", "font-weight", "normal"], ["name", "outputExample", "language", "json", "placeholder", "Enter JSON example structure...", 2, "width", "100%", "height", "200px", "border", "1px solid var(--mj-border-default)", "border-radius", "4px", 3, "ngModelChange", "ngModel"], [2, "margin-top", "8px", "color", "var(--mj-text-muted)", "font-size", "0.85em"], [1, "fa-solid", "fa-info-circle"], [2, "text-align", "center", "padding", "40px", "color", "var(--mj-text-muted)"], ["Size", "compact", "Icon", "fa-solid fa-clock-rotate-left", "Title", "No execution history yet", "Message", "Run this prompt to see execution history here"], [1, "fa-solid", "fa-history", 2, "color", "var(--mj-text-muted)"], [2, "color", "var(--mj-text-muted)", "font-weight", "normal"], [1, "fa-solid", "fa-spinner", "fa-spin", 2, "font-size", "2em", "margin-bottom", "12px"], [2, "display", "flex", "justify-content", "space-between", "align-items", "center", "margin-bottom", "16px"], [2, "display", "flex", "gap", "8px", "align-items", "center"], [1, "mj-button-group"], ["mjButton", "", "size", "sm", 3, "click"], [2, "margin-left", "4px", "font-size", "0.8em", 3, "class"], [2, "border", "1px solid var(--mj-border-default)", "border-radius", "8px", "overflow", "hidden"], [2, "width", "100%", "border-collapse", "collapse"], [2, "background", "var(--mj-bg-surface-sunken)", "border-bottom", "2px solid var(--mj-border-default)"], [2, "padding", "12px", "text-align", "left", "font-weight", "600", "color", "var(--mj-text-secondary)"], [2, "padding", "12px", "text-align", "right", "font-weight", "600", "color", "var(--mj-text-secondary)"], [2, "padding", "12px", "text-align", "center", "font-weight", "600", "color", "var(--mj-text-secondary)"], [1, "history-row", 2, "border-bottom", "1px solid var(--mj-border-default)", 3, "even-row"], [2, "margin-left", "4px", "font-size", "0.8em"], [1, "history-row", 2, "border-bottom", "1px solid var(--mj-border-default)"], [2, "padding", "12px"], [2, "display", "flex", "align-items", "center", "gap", "6px"], [2, "padding", "12px", "color", "var(--mj-text-secondary)"], [2, "padding", "12px", "text-align", "right", "color", "var(--mj-text-secondary)"], [2, "padding", "12px", "text-align", "center"], [2, "padding", "4px 8px", "border-radius", "12px", "background", "var(--mj-bg-surface-sunken)", "color", "var(--mj-text-secondary)", "font-size", "0.85em", "font-weight", "500"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "View details", 3, "click"], [1, "fa-solid", "fa-external-link"], [3, "Params", "NewRecordValues", "AllowLoad", "ShowToolbar"], [1, "fa-solid", "fa-database", 2, "color", "var(--mj-text-muted)"], [2, "margin", "0 0 12px 0", "color", "var(--mj-text-secondary)"], [1, "fa-solid", "fa-link", 2, "color", "var(--mj-text-muted)"], [3, "Close", "Width", "Height", "MinWidth", "MinHeight", "Draggable", "Resizable", "Visible", "Title"], [3, "visibilityChange", "entity", "mode", "isVisible"]], template: function MJAIPromptFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
3455
3457
  i0.ɵɵelement(0, "div");
3456
- i0.ɵɵconditionalCreate(1, MJAIPromptFormComponentExtended_Conditional_1_Template, 77, 53, "mj-record-form-container", 2);
3458
+ i0.ɵɵconditionalCreate(1, MJAIPromptFormComponentExtended_Conditional_1_Template, 78, 56, "mj-record-form-container", 2);
3457
3459
  i0.ɵɵconditionalCreate(2, MJAIPromptFormComponentExtended_Conditional_2_Template, 2, 11, "mj-window", 3);
3458
3460
  } if (rf & 2) {
3459
3461
  i0.ɵɵadvance();
@@ -3468,7 +3470,7 @@ MJAIPromptFormComponentExtended = __decorate([
3468
3470
  export { MJAIPromptFormComponentExtended };
3469
3471
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJAIPromptFormComponentExtended, [{
3470
3472
  type: Component,
3471
- args: [{ standalone: false, selector: 'mj-ai-prompt-form', template: "<!-- Dialog container -->\n<div></div>\n@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n [ToolbarConfig]=\"toolbarConfig\"\n [WidthMode]=\"'full-width'\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n <form class=\"record-form\" #form=\"ngForm\" style=\"display: flex; flex-direction: column; height: 100%; overflow: hidden;\">\n <!-- Main Content Area - Template Editor and Configuration -->\n <div class=\"prompt-main-area\" style=\"display: flex; flex-direction: column; flex: 1; min-height: 0; overflow-y: auto;\">\n <!-- Header Section -->\n <div class=\"prompt-header\" style=\"flex-shrink: 0; padding: 20px; background: var(--mj-bg-surface-sunken); border-bottom: 2px solid var(--mj-border-default);\">\n <div style=\"display: flex; justify-content: space-between; align-items: flex-start; gap: 20px;\">\n <!-- Left: Prompt Info -->\n <div style=\"flex: 1; min-width: 0;\">\n <div style=\"display: flex; align-items: center; gap: 12px; margin-bottom: 8px;\">\n <i class=\"fa-solid fa-robot\" style=\"color: var(--mj-brand-primary); font-size: 1.4em;\"></i>\n @if (EditMode) {\n <input type=\"text\" class=\"mj-input\" [(ngModel)]=\"record.Name\"\n name=\"promptName\"\n placeholder=\"Enter prompt name...\"\n style=\"font-size: 1.2em; font-weight: 600; min-width: 300px; flex: 1;\" />\n } @else {\n <h4 style=\"margin: 0; color: var(--mj-text-secondary); font-weight: 600; flex: 1;\">{{ record.Name || 'Untitled AI Prompt' }}</h4>\n <span class=\"status-badge\" [style.background-color]=\"getStatusBadgeColor()\"\n style=\"color: white; padding: 4px 10px; border-radius: 12px; font-size: 0.75em; font-weight: 500;\">\n {{ record.Status }}\n </span>\n }\n </div>\n <!-- Status and Type Editors when in edit mode -->\n @if (EditMode) {\n <div style=\"display: flex; gap: 16px; margin-bottom: 12px; flex-wrap: wrap;\">\n <div>\n <label style=\"display: block; margin-bottom: 4px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">Status</label>\n <mj-dropdown [(ngModel)]=\"record.Status\"\n name=\"promptStatus\"\n [Data]=\"[{text: 'Active', value: 'Active'}, {text: 'Pending', value: 'Pending'}, {text: 'Disabled', value: 'Disabled'}]\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n style=\"width: 150px;\">\n </mj-dropdown>\n </div>\n <div>\n <label style=\"display: block; margin-bottom: 4px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">\n Type <span style=\"color: #dc3545;\">*</span>\n </label>\n @if (isLoadingPromptTypes) {\n <div style=\"padding: 8px; color: var(--mj-text-muted); font-style: italic; width: 200px;\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading types...\n </div>\n } @else {\n <mj-dropdown [(ngModel)]=\"record.TypeID\"\n name=\"promptTypeID\"\n [Data]=\"availablePromptTypes\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n Placeholder=\"Select prompt type...\"\n style=\"width: 200px;\">\n </mj-dropdown>\n }\n </div>\n </div>\n }\n @if (EditMode) {\n <textarea class=\"mj-textarea\" [(ngModel)]=\"record.Description\"\n name=\"promptDescription\"\n [rows]=\"2\"\n placeholder=\"Enter prompt description...\"\n style=\"width: 100%; max-width: 600px; margin-bottom: 12px;\"></textarea>\n } @else if (record.Description) {\n <p style=\"margin: 0 0 12px 0; color: var(--mj-text-muted); font-size: 0.9em; line-height: 1.4;\">{{ record.Description }}</p>\n }\n <!-- Quick Config Row -->\n <div class=\"quick-config\" style=\"display: flex; align-items: center; gap: 16px; flex-wrap: wrap;\">\n @if (record.TypeID) {\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-tag\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-muted);\">Type:</span>\n <span style=\"color: var(--mj-text-secondary); font-weight: 500;\">{{ getPromptTypeDisplayName(record.TypeID) }}</span>\n </div>\n }\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-layer-group\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-muted);\">Parallelization:</span>\n <span style=\"color: var(--mj-text-secondary); font-weight: 500;\">{{ getParallelizationModeDisplay() }}</span>\n </div>\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-code\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-muted);\">Output:</span>\n <span [style.color]=\"getValidationColor()\" style=\"font-weight: 500;\">{{ getOutputTypeDisplay() }}</span>\n </div>\n @if (record.EnableCaching) {\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-database\" style=\"color: #28a745;\"></i>\n <span style=\"color: #28a745; font-weight: 500;\">Caching Enabled</span>\n </div>\n }\n @if (record.EffortLevel) {\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-tachometer-alt\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-muted);\">Effort Level:</span>\n <span style=\"color: var(--mj-text-secondary); font-weight: 500;\">{{ record.EffortLevel }}</span>\n </div>\n }\n </div>\n </div>\n <!-- Right: Action Buttons -->\n <div class=\"action-buttons\" style=\"display: flex; flex-direction: column; gap: 8px; align-items: flex-end;\">\n <div style=\"display: flex; gap: 8px;\">\n @if (record.ID) {\n <button mjButton variant=\"primary\" size=\"lg\"\n (click)=\"openTestHarness()\"\n title=\"Run AI Prompt Test Harness\">\n <i class=\"fa-solid fa-play\"></i> Run\n </button>\n }\n </div>\n @if (!canExecute && record.ID) {\n <div style=\"font-size: 0.75em; color: #dc3545; text-align: right; max-width: 200px;\">\n @if (record.Status !== 'Active') {\n \u2022 Prompt must be Active<br>\n }\n @if (!record.TemplateID) {\n \u2022 Template is required<br>\n }\n @if (!template && record.TemplateID) {\n \u2022 Template not found<br>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <!-- Configuration Sections with Expansion Panels -->\n <div class=\"configuration-sections\" style=\"flex: 1; background: var(--mj-bg-surface-card); border-top: 2px solid var(--mj-border-default); padding: 16px; min-height: 0;\">\n <!-- Template Editor Section -->\n <mj-accordion-panel\n [Expanded]=\"true\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-code\" style=\"color: var(--mj-text-muted);\"></i>\n Template Editor\n @if (template) {\n <span style=\"color: var(--mj-text-muted); font-size: 0.9em; font-weight: normal;\">&bull; {{ template.Name }}</span>\n }\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div class=\"template-section\" style=\"display: flex; flex-direction: column; min-height: 400px; padding: 8px;\">\n @if (isLoadingTemplate) {\n <div class=\"loading-state\" style=\"flex: 1; display: flex; align-items: center; justify-content: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 24px; margin-right: 12px;\"></i>\n Loading template...\n </div>\n } @else if (!record.TemplateID) {\n <mj-empty-state class=\"no-template-state\"\n Size=\"large\"\n Icon=\"fa-solid fa-code\"\n Title=\"No Template Associated\"\n Message=\"This AI prompt needs a template to define its structure and parameters. Create a new template or link to an existing one.\">\n <div ngProjectAs=\"[actions]\" style=\"display: flex; gap: 12px;\">\n @if (UserCanCreateTemplates) {\n <button mjButton variant=\"primary\" (click)=\"createNewTemplate()\">\n <i class=\"fa-solid fa-plus\"></i> Create New Template\n </button>\n }\n @if (UserCanReadTemplates) {\n <button mjButton variant=\"outline\" (click)=\"linkExistingTemplate()\">\n <i class=\"fa-solid fa-link\"></i> Link Existing Template\n </button>\n }\n </div>\n </mj-empty-state>\n } @else if (templateNotFoundInDatabase) {\n <mj-empty-state class=\"invalid-template-state\"\n Variant=\"warning\"\n Title=\"Template Not Found\"\n Message=\"The referenced template could not be loaded. It may have been deleted or moved.\">\n <div ngProjectAs=\"[actions]\" style=\"display: flex; gap: 12px;\">\n <button mjButton variant=\"outline\" (click)=\"loadTemplate()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Retry Loading\n </button>\n @if (UserCanCreateTemplates) {\n <button mjButton variant=\"primary\" (click)=\"createNewTemplate()\">\n <i class=\"fa-solid fa-plus\"></i> Create New Template\n </button>\n }\n </div>\n </mj-empty-state>\n } @else {\n <!-- Active Template Editor -->\n <div class=\"template-editor-container\" style=\"flex: 1; display: flex; flex-direction: column; min-height: 350px;\">\n <!-- Template Actions Bar -->\n @if (template && EditMode) {\n <div class=\"template-actions\" style=\"display: flex; gap: 8px; padding: 8px; border-bottom: 1px solid var(--mj-border-default); background: var(--mj-bg-surface-sunken);\">\n @if (UserCanUpdateTemplates) {\n <button mjButton\n variant=\"outline\"\n size=\"sm\"\n (click)=\"linkExistingTemplate()\"\n title=\"Change to a different template\">\n <i class=\"fa-solid fa-exchange-alt\"></i> Change Template\n </button>\n }\n @if (UserCanReadTemplates) {\n <button mjButton\n variant=\"outline\"\n size=\"sm\"\n (click)=\"openTemplateInNewWindow()\"\n title=\"Open template in new window\">\n <i class=\"fa-solid fa-external-link-alt\"></i> Open in New Window\n </button>\n }\n </div>\n }\n <!-- Template Editor -->\n <div style=\"flex: 1; background: var(--mj-bg-surface-card); border-radius: 6px; border: 1px solid var(--mj-border-default);\">\n <mj-template-editor\n #templateEditor\n [template]=\"template\"\n [config]=\"templateEditorConfig\"\n (contentChange)=\"onTemplateContentChange($event)\"\n (runTemplate)=\"onTemplateRun($event)\"\n style=\"display: block; min-height: 300px;\">\n </mj-template-editor>\n </div>\n </div>\n }\n </div>\n </mj-accordion-panel>\n <!-- Model Configuration Expansion Panel -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"true\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-microchip\" style=\"color: var(--mj-text-muted);\"></i>\n Models\n @if (promptModels.length > 0) {\n <span class=\"mj-accordion-badge\">{{ promptModels.length }}</span>\n }\n <span style=\"color: var(--mj-text-muted); font-size: 0.8em; font-weight: normal; margin-left: 8px;\">\n <i class=\"fa-solid fa-info-circle\" title=\"Models are tried in order from top to bottom. The first available model will be used.\"></i>\n Priority order (first available model will be used)\n </span>\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div style=\"padding: 16px 0;\">\n <!-- Model Management Interface -->\n <div class=\"model-management\" style=\"border: 1px solid var(--mj-border-default); border-radius: 6px; background: var(--mj-bg-surface-sunken);\">\n @if (isLoadingModels) {\n <div class=\"loading-state\" style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading models...\n </div>\n } @else {\n @if (promptModels.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No models configured\">\n @if (EditMode && UserCanCreatePromptModels) {\n <button ngProjectAs=\"[actions]\" mjButton variant=\"outline\" size=\"sm\"\n (click)=\"addNewModel()\">\n <i class=\"fa-solid fa-plus\"></i> Add Model\n </button>\n }\n </mj-empty-state>\n } @else {\n <!-- Priority explanation for multiple models -->\n @if (promptModels.length > 1) {\n <div style=\"padding: 12px 16px; background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default)); color: var(--mj-brand-primary); font-size: 0.85em;\">\n <i class=\"fa-solid fa-info-circle\" style=\"margin-right: 6px;\"></i>\n Models are tried in priority order (highest priority first). The first available model that meets requirements will be used for execution.\n </div>\n }\n <!-- Column Headers -->\n <div class=\"model-header\" style=\"display: grid; grid-template-columns: 40px 2fr 1fr 1fr 1fr 60px; gap: 12px; padding: 12px 16px; background: var(--mj-bg-surface-sunken); font-weight: 600; font-size: 0.85em; color: var(--mj-text-secondary); border-bottom: 1px solid var(--mj-border-default);\">\n <div title=\"Priority order - models are tried from top to bottom\">\n <i class=\"fa-solid fa-sort\" style=\"color: var(--mj-text-muted);\"></i>\n </div>\n <div>AI Model <span style=\"color: #dc3545;\">*</span></div>\n <div>Vendor</div>\n <div>Configuration</div>\n <div>Created</div>\n <div>Actions</div>\n </div>\n @for (model of promptModels; track getModelTrackId(model) || $index; let i = $index) {\n <div class=\"model-row\"\n [draggable]=\"EditMode\"\n (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop($event, i)\"\n (dragend)=\"onDragEnd($event)\"\n [style.background]=\"!model.ModelID ? '#fff3cd' : (draggedIndex === i ? 'color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface))' : 'var(--mj-bg-surface-card)')\"\n [style.border-left]=\"!model.ModelID ? '3px solid #ffc107' : 'none'\"\n [style.opacity]=\"draggedIndex === i ? '0.5' : '1'\"\n style=\"display: grid; grid-template-columns: 40px 2fr 1fr 1fr 1fr 60px; gap: 12px; padding: 12px 16px; border-bottom: 1px solid var(--mj-border-default); align-items: start; transition: background 0.2s, opacity 0.2s;\">\n <!-- Drag Handle / Priority -->\n <div class=\"drag-handle\" style=\"display: flex; flex-direction: column; align-items: center; justify-content: center; color: var(--mj-text-muted);\">\n @if (EditMode) {\n <i class=\"fa-solid fa-grip-vertical\" title=\"Drag to reorder priority\" style=\"cursor: move;\"></i>\n <span style=\"font-size: 0.7em; margin-top: 2px;\">#{{ i + 1 }}</span>\n } @else {\n <span style=\"font-size: 0.9em; font-weight: 600;\" title=\"Priority {{ model.Priority }} - Higher priority numbers are tried first\">#{{ i + 1 }}</span>\n }\n </div>\n <!-- Model Selection -->\n <div class=\"model-select\">\n @if (EditMode) {\n <mj-dropdown [(ngModel)]=\"model.ModelID\"\n [name]=\"'modelId_' + getModelTrackId(model)\"\n [Data]=\"availableModels\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n Placeholder=\"Select a model...\"\n (ValueChange)=\"onModelChange($any($event), i)\"\n style=\"width: 100%;\">\n </mj-dropdown>\n } @else {\n <span style=\"font-weight: 500;\">{{ getModelDisplayName(model.ModelID) }}</span>\n }\n </div>\n <!-- Vendor -->\n <div class=\"model-vendor\">\n @if (EditMode) {\n @if (model.ModelID) {\n @if (shouldShowVendorDropdown(model.ModelID)) {\n <mj-dropdown [(ngModel)]=\"model.VendorID\"\n [name]=\"'vendorId_' + getModelTrackId(model)\"\n [Data]=\"getVendorsForModelSync(model.ModelID)\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n Placeholder=\"Select vendor...\"\n style=\"width: 100%;\">\n </mj-dropdown>\n } @else {\n <!-- Single vendor - just show the name -->\n @if (getVendorsForModelSync(model.ModelID).length === 1) {\n <span [style.color]=\"getVendorStatusColor(model.ModelID, getVendorsForModelSync(model.ModelID)[0].ID)\" style=\"font-size: 0.9em; font-weight: 500;\">\n {{ getVendorsForModelSync(model.ModelID)[0].Name }}\n @if (getModelVendorStatus(model.ModelID, getVendorsForModelSync(model.ModelID)[0].ID) !== 'Active') {\n <span style=\"font-size: 0.8em; margin-left: 4px;\">({{ getModelVendorStatus(model.ModelID, getVendorsForModelSync(model.ModelID)[0].ID) }})</span>\n }\n </span>\n } @else {\n <span style=\"color: var(--mj-text-muted); font-style: italic; font-size: 0.9em;\">No vendors available</span>\n }\n }\n } @else {\n <span style=\"color: var(--mj-text-muted); font-style: italic; font-size: 0.9em;\">Select model first</span>\n }\n } @else {\n @if (model.VendorID && model.ModelID) {\n <span [style.color]=\"getVendorStatusColor(model.ModelID, model.VendorID)\" style=\"font-size: 0.9em;\">\n {{ getVendorDisplayName(model.VendorID) }}\n @if (getModelVendorStatus(model.ModelID, model.VendorID) !== 'Active') {\n <span style=\"font-size: 0.8em; margin-left: 4px;\">({{ getModelVendorStatus(model.ModelID, model.VendorID) }})</span>\n }\n </span>\n } @else {\n <span style=\"color: var(--mj-text-muted); font-size: 0.9em;\">-</span>\n }\n }\n </div>\n <!-- Configuration -->\n <div class=\"model-configuration\">\n @if (EditMode) {\n @if (isLoadingConfigurations) {\n <div style=\"padding: 4px; color: var(--mj-text-muted); font-style: italic; font-size: 0.85em;\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading...\n </div>\n } @else {\n <mj-dropdown [(ngModel)]=\"model.ConfigurationID\"\n [name]=\"'configurationId_' + getModelTrackId(model)\"\n [Data]=\"availableConfigurations\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n Placeholder=\"Default\"\n (ValueChange)=\"onConfigurationChange($any($event), i)\"\n style=\"width: 100%;\">\n </mj-dropdown>\n }\n } @else {\n <span style=\"font-size: 0.9em;\">{{ getConfigurationDisplayName(model.ConfigurationID) }}</span>\n }\n </div>\n <!-- Created Date -->\n <div class=\"model-created\">\n @if (model.ID) {\n <span style=\"color: var(--mj-text-muted); font-size: 0.8em;\">{{ model.__mj_CreatedAt | date:'short' }}</span>\n } @else {\n <span style=\"color: #28a745; font-size: 0.8em; font-style: italic;\">New</span>\n }\n </div>\n <!-- Actions -->\n <div class=\"model-actions\" style=\"display: flex; gap: 2px; flex-direction: column;\">\n @if (EditMode) {\n <div style=\"display: flex; gap: 2px; margin-bottom: 4px;\">\n @if (UserCanUpdatePromptModels) {\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"moveModelUp(i)\"\n [disabled]=\"i === 0\"\n title=\"Move up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"moveModelDown(i)\"\n [disabled]=\"i === promptModels.length - 1\"\n title=\"Move down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n }\n </div>\n @if (UserCanDeletePromptModels) {\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"removePromptModel(i)\"\n title=\"Remove model\"\n style=\"color: var(--mj-status-error);\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n }\n </div>\n </div>\n <!-- Second row with additional details -->\n <div style=\"display: grid; grid-template-columns: 40px 1fr; gap: 12px; padding: 8px 16px; border-bottom: 1px solid var(--mj-border-default); background: var(--mj-bg-surface-sunken); font-size: 0.85em; color: var(--mj-text-muted);\">\n <div></div>\n <div>\n <!-- Basic model details -->\n <div style=\"display: flex; gap: 16px; flex-wrap: wrap; align-items: center; margin-bottom: 8px;\">\n @if (model.Status) {\n <span><strong>Status:</strong> {{ model.Status }}</span>\n }\n </div>\n <!-- Parallel execution fields when prompt is ModelSpecific -->\n @if (record.ParallelizationMode === 'ModelSpecific') {\n <div style=\"padding: 8px; background: var(--mj-bg-surface-card); border: 1px solid var(--mj-border-default); border-radius: 4px; margin-top: 8px;\">\n <div style=\"margin-bottom: 6px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">\n <i class=\"fa-solid fa-layer-group\"></i> Model-Specific Parallel Execution\n </div>\n @if (EditMode) {\n <div style=\"display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 12px; align-items: center;\">\n <!-- Parallel Mode -->\n <div>\n <label style=\"display: block; margin-bottom: 2px; font-size: 0.8em; font-weight: 600; color: var(--mj-text-secondary);\">Parallel Mode</label>\n <mj-dropdown [(ngModel)]=\"model.ParallelizationMode\"\n [name]=\"'parallelMode_' + i\"\n [Data]=\"[{text: 'None', value: 'None'}, {text: 'Static Count', value: 'StaticCount'}, {text: 'Config Param', value: 'ConfigParam'}]\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n Placeholder=\"Select mode...\"\n style=\"width: 100%; font-size: 0.85em;\">\n </mj-dropdown>\n </div>\n <!-- Parallel Count (when StaticCount) -->\n @if (model.ParallelizationMode === 'StaticCount') {\n <div>\n <label style=\"display: block; margin-bottom: 2px; font-size: 0.8em; font-weight: 600; color: var(--mj-text-secondary);\">Parallel Count</label>\n <mj-numeric-input [(ngModel)]=\"model.ParallelCount\"\n [name]=\"'parallelCount_' + i\"\n [Min]=\"1\"\n [Step]=\"1\"\n [Format]=\"'n0'\"\n Placeholder=\"Count...\"\n style=\"width: 100%; font-size: 0.85em;\">\n </mj-numeric-input>\n </div>\n }\n <!-- Config Param (when ConfigParam) -->\n @if (model.ParallelizationMode === 'ConfigParam') {\n <div>\n <label style=\"display: block; margin-bottom: 2px; font-size: 0.8em; font-weight: 600; color: var(--mj-text-secondary);\">Config Parameter</label>\n <input type=\"text\" class=\"mj-input\" [(ngModel)]=\"model.ParallelConfigParam\"\n [name]=\"'parallelConfigParam_' + i\"\n placeholder=\"Parameter name...\"\n style=\"width: 100%; font-size: 0.85em;\" />\n </div>\n }\n </div>\n } @else {\n <!-- Read-only display -->\n <div style=\"display: flex; gap: 16px; flex-wrap: wrap; align-items: center;\">\n @if (model.ParallelizationMode) {\n <span><strong>Parallel Mode:</strong> {{ model.ParallelizationMode }}</span>\n }\n @if (model.ParallelCount) {\n <span><strong>Parallel Count:</strong> {{ model.ParallelCount }}</span>\n }\n @if (model.ParallelConfigParam) {\n <span><strong>Config Param:</strong> {{ model.ParallelConfigParam }}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n @if (EditMode && UserCanCreatePromptModels) {\n <div class=\"add-model-row\" style=\"padding: 12px 16px; text-align: center; background: var(--mj-bg-surface-sunken); border-top: 1px solid var(--mj-border-default);\">\n <button mjButton variant=\"outline\" size=\"sm\"\n (click)=\"addNewModel()\"\n style=\"color: var(--mj-status-success); border-color: var(--mj-status-success);\">\n <i class=\"fa-solid fa-plus\"></i> Add Model\n </button>\n </div>\n }\n }\n }\n </div>\n </div>\n </mj-accordion-panel>\n }\n <!-- Advanced Configuration Expansion Panel -->\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-cogs\" style=\"color: var(--mj-text-muted);\"></i>\n Advanced Configuration\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div style=\"padding: 16px 0;\">\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 20px;\">\n <!-- Left Column -->\n <div>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ParallelizationMode\"\n Type=\"dropdownlist\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n @if (showParallelCount) {\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ParallelCount\"\n Type=\"numerictextbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n }\n @if (showParallelConfigParam) {\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ParallelConfigParam\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n }\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"OutputType\"\n Type=\"dropdownlist\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"EffortLevel\"\n Type=\"numerictextbox\"\n Caption=\"Effort Level (1-100)\"\n Description=\"Higher values request more thorough reasoning\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n </div>\n <!-- Right Column -->\n <div>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ValidationBehavior\"\n Type=\"dropdownlist\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"EnableCaching\"\n Type=\"checkbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <!-- Result Selector Prompt with Tree Selector -->\n <div style=\"margin-bottom: 16px;\">\n <label style=\"display: block; margin-bottom: 4px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">\n Result Selector Prompt\n </label>\n @if (EditMode) {\n @if (isLoadingResultSelectorData) {\n <div style=\"padding: 8px; color: var(--mj-text-muted); font-style: italic;\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading prompts...\n </div>\n } @else {\n <mj-dropdown\n [(ngModel)]=\"record.ResultSelectorPromptID\"\n name=\"resultSelectorPromptID\"\n [Data]=\"resultSelectorTreeData\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n Placeholder=\"Select a result selector prompt...\"\n style=\"width: 100%;\"\n (ValueChange)=\"onResultSelectorChange($any($event))\">\n </mj-dropdown>\n }\n } @else {\n <span style=\"color: var(--mj-text-secondary);\">{{ getPromptDisplayName(record.ResultSelectorPromptID || '') || 'None selected' }}</span>\n }\n </div>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Prefill & Output Control Expansion Panel -->\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-wand-magic-sparkles\" style=\"color: var(--mj-text-muted);\"></i>\n Prefill &amp; Output Control\n </span>\n </ng-template>\n <div style=\"padding: 16px 0;\">\n <p style=\"margin: 0 0 12px 0; font-size: 0.85em; color: var(--mj-text-muted);\">\n Assistant prefill seeds the model's response with an initial string, guiding output format and content. Stop sequences terminate generation when encountered.\n </p>\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 20px;\">\n <!-- Left Column -->\n <div>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"AssistantPrefill\"\n Type=\"textarea\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"StopSequences\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n </div>\n <!-- Right Column -->\n <div>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"PrefillFallbackMode\"\n Type=\"dropdownlist\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Template Parameters Expansion Panel -->\n @if (template && templateParams.length > 0) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-sliders\" style=\"color: var(--mj-text-muted);\"></i>\n Template Parameters\n <span class=\"mj-accordion-badge\">{{ templateParams.length }}</span>\n <span style=\"color: var(--mj-text-muted); font-size: 0.8em; font-weight: normal; margin-left: 8px;\">\n <i class=\"fa-solid fa-info-circle\" title=\"These parameters are defined in the template and will be available when executing this prompt\"></i>\n Parameters defined in the template\n </span>\n </span>\n </ng-template>\n <!-- Template Parameters Display -->\n <div style=\"padding: 16px 0;\">\n @if (isLoadingTemplateParams) {\n <div class=\"loading-state\" style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading template parameters...\n </div>\n } @else if (templateParams.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"This template has no parameters defined\" />\n } @else {\n <!-- Parameters Grid -->\n <div style=\"display: grid; gap: 12px;\">\n @for (param of templateParams; track param.ID) {\n <div class=\"parameter-card\"\n style=\"border: 1px solid var(--mj-border-default); border-radius: 8px; padding: 16px; background: var(--mj-bg-surface-sunken); transition: all 0.2s;\"\n [style.border-left]=\"'4px solid ' + getParamTypeColor(param.Type)\">\n <!-- Parameter Header -->\n <div style=\"display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 8px;\">\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <i [class]=\"'fa-solid ' + getParamTypeIcon(param.Type)\"\n [style.color]=\"getParamTypeColor(param.Type)\"\n style=\"font-size: 1.2em;\"></i>\n <h6 style=\"margin: 0; color: var(--mj-text-secondary); font-weight: 600;\">\n {{ param.Name }}\n @if (param.IsRequired) {\n <span style=\"color: #dc3545; font-size: 0.9em; margin-left: 4px;\">*</span>\n }\n </h6>\n </div>\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <span class=\"type-badge\"\n [style.background-color]=\"getParamTypeColor(param.Type)\"\n style=\"color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.75em; font-weight: 500;\">\n {{ param.Type }}\n </span>\n @if (param.IsRequired) {\n <span style=\"color: #dc3545; font-size: 0.85em; font-weight: 500;\">Required</span>\n } @else {\n <span style=\"color: var(--mj-text-muted); font-size: 0.85em;\">Optional</span>\n }\n </div>\n </div>\n <!-- Parameter Description -->\n @if (param.Description) {\n <p style=\"margin: 0 0 8px 0; color: var(--mj-text-muted); font-size: 0.9em; line-height: 1.4;\">\n {{ param.Description }}\n </p>\n }\n <!-- Type-specific Information -->\n <div style=\"font-size: 0.85em; color: var(--mj-text-secondary);\">\n <span style=\"display: flex; align-items: center; gap: 4px; margin-bottom: 4px;\">\n <i class=\"fa-solid fa-info-circle\" style=\"color: var(--mj-text-muted);\"></i>\n {{ getParamTypeDescription(param) }}\n </span>\n </div>\n <!-- Additional Parameter Details -->\n <div style=\"display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px; margin-top: 12px;\">\n @if (param.DefaultValue) {\n <div style=\"background: var(--mj-bg-surface-card); padding: 8px 12px; border-radius: 4px; border: 1px solid var(--mj-border-default);\">\n <label style=\"display: block; font-size: 0.8em; color: var(--mj-text-muted); margin-bottom: 2px;\">Default Value</label>\n <code style=\"font-size: 0.85em; color: var(--mj-text-secondary); word-break: break-all;\">{{ param.DefaultValue }}</code>\n </div>\n }\n @if (param.EntityID) {\n <div style=\"background: var(--mj-bg-surface-card); padding: 8px 12px; border-radius: 4px; border: 1px solid var(--mj-border-default);\">\n <label style=\"display: block; font-size: 0.8em; color: var(--mj-text-muted); margin-bottom: 2px;\">Entity</label>\n <span style=\"font-size: 0.85em; color: var(--mj-text-secondary);\">{{ param.Entity || 'Entity ID: ' + param.EntityID }}</span>\n </div>\n }\n @if (param.LinkedParameterName) {\n <div style=\"background: var(--mj-bg-surface-card); padding: 8px 12px; border-radius: 4px; border: 1px solid var(--mj-border-default);\">\n <label style=\"display: block; font-size: 0.8em; color: var(--mj-text-muted); margin-bottom: 2px;\">Linked To</label>\n <span style=\"font-size: 0.85em; color: var(--mj-text-secondary);\">\n {{ param.LinkedParameterName }}\n @if (param.LinkedParameterField) {\n ({{ param.LinkedParameterField }})\n }\n </span>\n </div>\n }\n @if (param.ExtraFilter) {\n <div style=\"background: var(--mj-bg-surface-card); padding: 8px 12px; border-radius: 4px; border: 1px solid var(--mj-border-default);\">\n <label style=\"display: block; font-size: 0.8em; color: var(--mj-text-muted); margin-bottom: 2px;\">Filter</label>\n <code style=\"font-size: 0.8em; color: var(--mj-text-secondary); word-break: break-all;\">{{ param.ExtraFilter }}</code>\n </div>\n }\n @if (param.RecordID) {\n <div style=\"background: var(--mj-bg-surface-card); padding: 8px 12px; border-radius: 4px; border: 1px solid var(--mj-border-default);\">\n <label style=\"display: block; font-size: 0.8em; color: var(--mj-text-muted); margin-bottom: 2px;\">Record ID</label>\n <code style=\"font-size: 0.85em; color: var(--mj-text-secondary);\">{{ param.RecordID }}</code>\n </div>\n }\n </div>\n </div>\n }\n </div>\n <!-- Help Text -->\n <div style=\"margin-top: 16px; padding: 12px; background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); border-radius: 6px; border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default));\">\n <div style=\"display: flex; align-items: flex-start; gap: 8px;\">\n <i class=\"fa-solid fa-lightbulb\" style=\"color: var(--mj-brand-primary); margin-top: 2px;\"></i>\n <div style=\"flex: 1; font-size: 0.85em; color: var(--mj-brand-primary); line-height: 1.5;\">\n <strong>Using Template Parameters:</strong> When executing this prompt, you'll be prompted to provide values for all required parameters.\n Parameters can be simple values (text, numbers) or complex data structures (JSON objects, database records, or entire entity collections).\n The template will use these parameters to generate dynamic content based on the values provided at execution time.\n </div>\n </div>\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n <!-- Output Example Expansion Panel (when OutputType = object) -->\n @if (showOutputExample) {\n <mj-accordion-panel\n [Expanded]=\"true\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-code\" style=\"color: var(--mj-text-muted);\"></i>\n Output Example (JSON)\n <span style=\"color: #dc3545; font-size: 0.8em; font-weight: normal;\">&bull; Required for object output type</span>\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div style=\"padding: 16px;\">\n @if (EditMode) {\n <mj-code-editor\n [(ngModel)]=\"record.OutputExample\"\n name=\"outputExample\"\n language=\"json\"\n placeholder=\"Enter JSON example structure...\"\n style=\"width: 100%; height: 200px; border: 1px solid var(--mj-border-default); border-radius: 4px;\">\n </mj-code-editor>\n <div style=\"margin-top: 8px; color: var(--mj-text-muted); font-size: 0.85em;\">\n <i class=\"fa-solid fa-info-circle\"></i> Provide a JSON example that defines the expected structure for object output validation.\n </div>\n } @else if (record.OutputExample) {\n <div style=\"background: var(--mj-bg-surface-sunken); border: 1px solid var(--mj-border-default); border-radius: 4px; padding: 12px; font-family: 'Courier New', monospace; font-size: 0.9em; white-space: pre-wrap; overflow: auto; max-height: 250px;\">{{ record.OutputExample }}</div>\n } @else {\n <mj-alert Variant=\"warning\">Output example is required when output type is 'object'</mj-alert>\n }\n </div>\n </mj-accordion-panel>\n }\n <!-- Execution History Expansion Panel -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-history\" style=\"color: var(--mj-text-muted);\"></i>\n Execution History\n @if (executionHistory.length > 0) {\n <span style=\"color: var(--mj-text-muted); font-weight: normal;\">({{ executionHistory.length }})</span>\n }\n </span>\n </ng-template>\n <!-- Custom Execution History Viewer -->\n <div style=\"padding: 16px;\">\n @if (isLoadingHistory) {\n <div style=\"text-align: center; padding: 40px; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 2em; margin-bottom: 12px;\"></i>\n <p>Loading execution history...</p>\n </div>\n } @else if (executionHistory.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-clock-rotate-left\"\n Title=\"No execution history yet\"\n Message=\"Run this prompt to see execution history here\" />\n } @else {\n <!-- Sort Controls -->\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;\">\n <div style=\"color: var(--mj-text-muted); font-size: 0.9em;\">\n Showing {{ executionHistory.length }} executions\n </div>\n <div style=\"display: flex; gap: 8px; align-items: center;\">\n <span style=\"color: var(--mj-text-muted); font-size: 0.85em;\">Sort by:</span>\n <div class=\"mj-button-group\">\n <button mjButton\n [class.active]=\"historySortField === 'runAt'\"\n (click)=\"changeHistorySort('runAt')\"\n size=\"sm\">\n Date\n @if (historySortField === 'runAt') {\n <i [class]=\"'fa-solid fa-sort-' + (historySortDirection === 'asc' ? 'up' : 'down')\"\n style=\"margin-left: 4px; font-size: 0.8em;\"></i>\n }\n </button>\n <button mjButton\n [class.active]=\"historySortField === 'executionTime'\"\n (click)=\"changeHistorySort('executionTime')\"\n size=\"sm\">\n Duration\n @if (historySortField === 'executionTime') {\n <i [class]=\"'fa-solid fa-sort-' + (historySortDirection === 'asc' ? 'up' : 'down')\"\n style=\"margin-left: 4px; font-size: 0.8em;\"></i>\n }\n </button>\n <button mjButton\n [class.active]=\"historySortField === 'tokens'\"\n (click)=\"changeHistorySort('tokens')\"\n size=\"sm\">\n Tokens\n @if (historySortField === 'tokens') {\n <i [class]=\"'fa-solid fa-sort-' + (historySortDirection === 'asc' ? 'up' : 'down')\"\n style=\"margin-left: 4px; font-size: 0.8em;\"></i>\n }\n </button>\n <button mjButton\n [class.active]=\"historySortField === 'cost'\"\n (click)=\"changeHistorySort('cost')\"\n size=\"sm\">\n Cost\n @if (historySortField === 'cost') {\n <i [class]=\"'fa-solid fa-sort-' + (historySortDirection === 'asc' ? 'up' : 'down')\"\n style=\"margin-left: 4px; font-size: 0.8em;\"></i>\n }\n </button>\n </div>\n </div>\n </div>\n <!-- Execution History Table -->\n <div style=\"border: 1px solid var(--mj-border-default); border-radius: 8px; overflow: hidden;\">\n <table style=\"width: 100%; border-collapse: collapse;\">\n <thead>\n <tr style=\"background: var(--mj-bg-surface-sunken); border-bottom: 2px solid var(--mj-border-default);\">\n <th style=\"padding: 12px; text-align: left; font-weight: 600; color: var(--mj-text-secondary);\">Status</th>\n <th style=\"padding: 12px; text-align: left; font-weight: 600; color: var(--mj-text-secondary);\">Date & Time</th>\n <th style=\"padding: 12px; text-align: left; font-weight: 600; color: var(--mj-text-secondary);\">Model</th>\n <th style=\"padding: 12px; text-align: left; font-weight: 600; color: var(--mj-text-secondary);\">Duration</th>\n <th style=\"padding: 12px; text-align: right; font-weight: 600; color: var(--mj-text-secondary);\">Tokens</th>\n <th style=\"padding: 12px; text-align: right; font-weight: 600; color: var(--mj-text-secondary);\">Cost</th>\n <th style=\"padding: 12px; text-align: center; font-weight: 600; color: var(--mj-text-secondary);\">Type</th>\n <th style=\"padding: 12px; text-align: center; font-weight: 600; color: var(--mj-text-secondary);\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (run of executionHistory; track run.ID; let i = $index) {\n <tr class=\"history-row\"\n [class.even-row]=\"i % 2 === 0\"\n style=\"border-bottom: 1px solid var(--mj-border-default);\">\n <td style=\"padding: 12px;\">\n <span style=\"display: flex; align-items: center; gap: 6px;\">\n <i [class]=\"'fa-solid ' + getExecutionStatusIcon(run.Success)\"\n [style.color]=\"getExecutionStatusColor(run.Success)\"></i>\n <span [style.color]=\"getExecutionStatusColor(run.Success)\" style=\"font-weight: 500;\">\n {{ run.Success === true ? 'Success' : run.Success === false ? 'Failed' : 'Running' }}\n </span>\n </span>\n </td>\n <td style=\"padding: 12px; color: var(--mj-text-secondary);\">\n {{ run.RunAt | date:'short' }}\n </td>\n <td style=\"padding: 12px; color: var(--mj-text-secondary);\">\n <span style=\"display: flex; align-items: center; gap: 6px;\">\n <i class=\"fa-solid fa-microchip\" style=\"color: var(--mj-text-muted);\"></i>\n {{ run.Model || 'Unknown' }}\n </span>\n </td>\n <td style=\"padding: 12px; color: var(--mj-text-secondary);\">\n {{ formatDuration(run.ExecutionTimeMS) }}\n </td>\n <td style=\"padding: 12px; text-align: right; color: var(--mj-text-secondary);\">\n {{ formatTokens(run.TokensUsed) }}\n </td>\n <td style=\"padding: 12px; text-align: right; color: var(--mj-text-secondary);\">\n {{ formatCost(run.TotalCost || run.Cost) }}\n </td>\n <td style=\"padding: 12px; text-align: center;\">\n @if (run.RunType) {\n <span style=\"padding: 4px 8px; border-radius: 12px; background: var(--mj-bg-surface-sunken); \n color: var(--mj-text-secondary); font-size: 0.85em; font-weight: 500;\">\n {{ run.RunType }}\n </span>\n }\n </td>\n <td style=\"padding: 12px; text-align: center;\">\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"navigateToPromptRun(run.ID)\"\n title=\"View details\">\n <i class=\"fa-solid fa-external-link\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n <!-- Cache Expansion Panel -->\n @if (record.IsSaved && record.EnableCaching) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-database\" style=\"color: var(--mj-text-muted);\"></i>\n Result Cache\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div style=\"padding: 16px 0;\">\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: AI Result Cache','AIPromptID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: AI Result Cache')\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"false\">\n </mj-explorer-entity-data-grid>\n </div>\n </mj-accordion-panel>\n }\n <!-- Related Items Expansion Panel -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-link\" style=\"color: var(--mj-text-muted);\"></i>\n Related Items\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div style=\"padding: 16px 0;\">\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 20px;\">\n <!-- AI Agents -->\n <div>\n <h6 style=\"margin: 0 0 12px 0; color: var(--mj-text-secondary);\">AI Agents Using This Prompt</h6>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: AI Agent Prompts','PromptID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: AI Agent Prompts')\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"false\">\n </mj-explorer-entity-data-grid>\n </div>\n <!-- Result Selector References -->\n <div>\n <h6 style=\"margin: 0 0 12px 0; color: var(--mj-text-secondary);\">Prompts Using This as Result Selector</h6>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: AI Prompts','ResultSelectorPromptID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: AI Prompts')\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"false\">\n </mj-explorer-entity-data-grid>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n }\n </div>\n </div>\n </form>\n</mj-record-form-container>\n}\n\n\n<!-- AI Prompt Test Harness -->\n@if (showTestHarness) {\n <mj-window\n [Width]=\"1200\"\n [Height]=\"800\"\n [MinWidth]=\"800\"\n [MinHeight]=\"600\"\n [Draggable]=\"true\"\n [Resizable]=\"true\"\n [Visible]=\"true\"\n (Close)=\"onTestHarnessVisibilityChanged(false)\"\n [Title]=\"'Run AI Prompt - ' + (record.Name || 'Untitled')\">\n <mj-ai-test-harness\n [entity]=\"record\"\n [mode]=\"'prompt'\"\n [isVisible]=\"showTestHarness\"\n (visibilityChange)=\"onTestHarnessVisibilityChanged($event)\">\n </mj-ai-test-harness>\n </mj-window>\n}", styles: ["/* Override shared form-styles to enable flex layout */\n:host {\n display: block;\n height: 100%;\n}\n\n.record-form-container {\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n padding: 10px;\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n}\n\n.record-form {\n min-height: 0 !important;\n}\n\n.custom-toolbar-actions {\n margin-left: auto;\n}\n\n.status-badge {\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n font-weight: 500;\n letter-spacing: 0.02em;\n}\n\n.config-summary {\n position: sticky;\n top: 0;\n max-height: 600px;\n overflow-y: auto;\n}\n\n.config-item {\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.config-item:last-child {\n border-bottom: none;\n}\n\n.template-tab-content {\n background: var(--mj-bg-surface);\n}\n\n.template-header h5 {\n font-size: 1.1em;\n}\n\n.loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n}\n\n/* Template-editor placeholders fill the editor pane */\nmj-empty-state.no-template-state,\nmj-empty-state.invalid-template-state {\n flex: 1;\n}\n\n.template-editor-container {\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-md);\n}\n\n/* Grid layout adjustments */\n@media (max-width: 1200px) {\n .record-form-container .mj-tab-body > div {\n grid-template-columns: 1fr !important;\n gap: 20px;\n }\n\n .config-summary {\n order: -1;\n position: static;\n max-height: none;\n }\n}\n\n/* Responsive toolbar */\n@media (max-width: 768px) {\n .custom-toolbar-actions {\n flex-direction: column;\n gap: 4px !important;\n }\n\n .status-badge {\n align-self: flex-start;\n }\n}\n\n/* Ensure proper spacing in form sections */\n.record-form-container mj-form-section {\n padding: 16px;\n}\n\n/* Smooth transitions for better UX */\n.status-badge,\n.config-item,\n.template-header {\n transition: all 0.2s ease;\n}\n\n.config-item:hover {\n background-color: var(--mj-bg-surface-sunken);\n border-radius: var(--mj-radius-sm);\n margin: 0 -8px;\n padding: 8px;\n}\n\n/* Execution History Table Styles */\n.history-row {\n transition: background 0.2s;\n}\n\n.history-row:not(.even-row) {\n background: var(--mj-bg-surface-card);\n}\n\n.history-row.even-row {\n background: var(--mj-bg-surface);\n}\n\n.history-row:hover {\n background: var(--mj-border-default) !important;\n}\n\n/* Template Parameters Styles */\n.parameter-card {\n position: relative;\n overflow: hidden;\n}\n\n.parameter-card::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 4px;\n background: inherit;\n transition: width 0.2s;\n}\n\n.parameter-card:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-md);\n}\n\n.parameter-card:hover::before {\n width: 6px;\n}\n\n.type-badge {\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n transition: transform 0.2s;\n}\n\n.parameter-card:hover .type-badge {\n transform: scale(1.05);\n}\n\n/* Parameter type icons animation */\n.parameter-card i.fa-solid {\n transition: transform 0.3s;\n}\n\n.parameter-card:hover i.fa-solid {\n transform: rotate(360deg);\n}\n\n/* Grid responsive behavior */\n@media (max-width: 768px) {\n .parameter-card {\n margin-bottom: 8px;\n }\n\n .parameter-card h6 {\n font-size: 0.95em;\n }\n\n .type-badge {\n font-size: 0.7em !important;\n }\n}\n"] }]
3473
+ args: [{ standalone: false, selector: 'mj-ai-prompt-form', template: "<!-- Dialog container -->\n<div></div>\n@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n [ToolbarConfig]=\"toolbarConfig\"\n [WidthMode]=\"'full-width'\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n <form class=\"record-form\" #form=\"ngForm\" style=\"display: flex; flex-direction: column; height: 100%; overflow: hidden;\">\n <!-- Main Content Area - Template Editor and Configuration -->\n <div class=\"prompt-main-area\" style=\"display: flex; flex-direction: column; flex: 1; min-height: 0; overflow-y: auto;\">\n <!-- Header Section -->\n <div class=\"prompt-header\" style=\"flex-shrink: 0; padding: 20px; background: var(--mj-bg-surface-sunken); border-bottom: 2px solid var(--mj-border-default);\">\n <div style=\"display: flex; justify-content: space-between; align-items: flex-start; gap: 20px;\">\n <!-- Left: Prompt Info -->\n <div style=\"flex: 1; min-width: 0;\">\n <div style=\"display: flex; align-items: center; gap: 12px; margin-bottom: 8px;\">\n <i class=\"fa-solid fa-robot\" style=\"color: var(--mj-brand-primary); font-size: 1.4em;\"></i>\n @if (EditMode) {\n <input type=\"text\" class=\"mj-input\" [(ngModel)]=\"record.Name\"\n name=\"promptName\"\n placeholder=\"Enter prompt name...\"\n style=\"font-size: 1.2em; font-weight: 600; min-width: 300px; flex: 1;\" />\n } @else {\n <h4 style=\"margin: 0; color: var(--mj-text-secondary); font-weight: 600; flex: 1;\">{{ record.Name || 'Untitled AI Prompt' }}</h4>\n <span class=\"status-badge\" [style.background-color]=\"getStatusBadgeColor()\"\n style=\"color: white; padding: 4px 10px; border-radius: 12px; font-size: 0.75em; font-weight: 500;\">\n {{ record.Status }}\n </span>\n }\n </div>\n <!-- Status and Type Editors when in edit mode -->\n @if (EditMode) {\n <div style=\"display: flex; gap: 16px; margin-bottom: 12px; flex-wrap: wrap;\">\n <div>\n <label style=\"display: block; margin-bottom: 4px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">Status</label>\n <mj-dropdown [(ngModel)]=\"record.Status\"\n name=\"promptStatus\"\n [Data]=\"[{text: 'Active', value: 'Active'}, {text: 'Pending', value: 'Pending'}, {text: 'Disabled', value: 'Disabled'}]\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n style=\"width: 150px;\">\n </mj-dropdown>\n </div>\n <div>\n <label style=\"display: block; margin-bottom: 4px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">\n Type <span style=\"color: #dc3545;\">*</span>\n </label>\n @if (isLoadingPromptTypes) {\n <div style=\"padding: 8px; color: var(--mj-text-muted); font-style: italic; width: 200px;\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading types...\n </div>\n } @else {\n <mj-dropdown [(ngModel)]=\"record.TypeID\"\n name=\"promptTypeID\"\n [Data]=\"availablePromptTypes\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n Placeholder=\"Select prompt type...\"\n style=\"width: 200px;\">\n </mj-dropdown>\n }\n </div>\n </div>\n }\n @if (EditMode) {\n <textarea class=\"mj-textarea\" [(ngModel)]=\"record.Description\"\n name=\"promptDescription\"\n [rows]=\"2\"\n placeholder=\"Enter prompt description...\"\n style=\"width: 100%; max-width: 600px; margin-bottom: 12px;\"></textarea>\n } @else if (record.Description) {\n <p style=\"margin: 0 0 12px 0; color: var(--mj-text-muted); font-size: 0.9em; line-height: 1.4;\">{{ record.Description }}</p>\n }\n <!-- Quick Config Row -->\n <div class=\"quick-config\" style=\"display: flex; align-items: center; gap: 16px; flex-wrap: wrap;\">\n @if (record.TypeID) {\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-tag\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-muted);\">Type:</span>\n <span style=\"color: var(--mj-text-secondary); font-weight: 500;\">{{ getPromptTypeDisplayName(record.TypeID) }}</span>\n </div>\n }\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-layer-group\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-muted);\">Parallelization:</span>\n <span style=\"color: var(--mj-text-secondary); font-weight: 500;\">{{ getParallelizationModeDisplay() }}</span>\n </div>\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-code\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-muted);\">Output:</span>\n <span [style.color]=\"getValidationColor()\" style=\"font-weight: 500;\">{{ getOutputTypeDisplay() }}</span>\n </div>\n @if (record.EnableCaching) {\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-database\" style=\"color: #28a745;\"></i>\n <span style=\"color: #28a745; font-weight: 500;\">Caching Enabled</span>\n </div>\n }\n @if (record.EffortLevel) {\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-tachometer-alt\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-muted);\">Effort Level:</span>\n <span style=\"color: var(--mj-text-secondary); font-weight: 500;\">{{ record.EffortLevel }}</span>\n </div>\n }\n </div>\n </div>\n <!-- Right: Action Buttons -->\n <div class=\"action-buttons\" style=\"display: flex; flex-direction: column; gap: 8px; align-items: flex-end;\">\n <div style=\"display: flex; gap: 8px;\">\n @if (record.ID) {\n <button mjButton variant=\"primary\" size=\"lg\"\n (click)=\"openTestHarness()\"\n title=\"Run AI Prompt Test Harness\">\n <i class=\"fa-solid fa-play\"></i> Run\n </button>\n }\n </div>\n @if (!canExecute && record.ID) {\n <div style=\"font-size: 0.75em; color: #dc3545; text-align: right; max-width: 200px;\">\n @if (record.Status !== 'Active') {\n \u2022 Prompt must be Active<br>\n }\n @if (!record.TemplateID) {\n \u2022 Template is required<br>\n }\n @if (!template && record.TemplateID) {\n \u2022 Template not found<br>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <!-- Configuration Sections with Expansion Panels -->\n <div class=\"configuration-sections\" style=\"flex: 1; background: var(--mj-bg-surface-card); border-top: 2px solid var(--mj-border-default); padding: 16px; min-height: 0;\">\n <!-- Template Editor Section -->\n <mj-accordion-panel\n [Expanded]=\"true\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-code\" style=\"color: var(--mj-text-muted);\"></i>\n Template Editor\n @if (template) {\n <span style=\"color: var(--mj-text-muted); font-size: 0.9em; font-weight: normal;\">&bull; {{ template.Name }}</span>\n }\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div class=\"template-section\" style=\"display: flex; flex-direction: column; min-height: 400px; padding: 8px;\">\n @if (isLoadingTemplate) {\n <div class=\"loading-state\" style=\"flex: 1; display: flex; align-items: center; justify-content: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 24px; margin-right: 12px;\"></i>\n Loading template...\n </div>\n } @else if (!record.TemplateID) {\n <mj-empty-state class=\"no-template-state\"\n Size=\"large\"\n Icon=\"fa-solid fa-code\"\n Title=\"No Template Associated\"\n Message=\"This AI prompt needs a template to define its structure and parameters. Create a new template or link to an existing one.\">\n <div ngProjectAs=\"[actions]\" style=\"display: flex; gap: 12px;\">\n @if (UserCanCreateTemplates) {\n <button mjButton variant=\"primary\" (click)=\"createNewTemplate()\">\n <i class=\"fa-solid fa-plus\"></i> Create New Template\n </button>\n }\n @if (UserCanReadTemplates) {\n <button mjButton variant=\"outline\" (click)=\"linkExistingTemplate()\">\n <i class=\"fa-solid fa-link\"></i> Link Existing Template\n </button>\n }\n </div>\n </mj-empty-state>\n } @else if (templateNotFoundInDatabase) {\n <mj-empty-state class=\"invalid-template-state\"\n Variant=\"warning\"\n Title=\"Template Not Found\"\n Message=\"The referenced template could not be loaded. It may have been deleted or moved.\">\n <div ngProjectAs=\"[actions]\" style=\"display: flex; gap: 12px;\">\n <button mjButton variant=\"outline\" (click)=\"loadTemplate()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Retry Loading\n </button>\n @if (UserCanCreateTemplates) {\n <button mjButton variant=\"primary\" (click)=\"createNewTemplate()\">\n <i class=\"fa-solid fa-plus\"></i> Create New Template\n </button>\n }\n </div>\n </mj-empty-state>\n } @else {\n <!-- Active Template Editor -->\n <div class=\"template-editor-container\" style=\"flex: 1; display: flex; flex-direction: column; min-height: 350px;\">\n <!-- Template Actions Bar -->\n @if (template && EditMode) {\n <div class=\"template-actions\" style=\"display: flex; gap: 8px; padding: 8px; border-bottom: 1px solid var(--mj-border-default); background: var(--mj-bg-surface-sunken);\">\n @if (UserCanUpdateTemplates) {\n <button mjButton\n variant=\"outline\"\n size=\"sm\"\n (click)=\"linkExistingTemplate()\"\n title=\"Change to a different template\">\n <i class=\"fa-solid fa-exchange-alt\"></i> Change Template\n </button>\n }\n @if (UserCanReadTemplates) {\n <button mjButton\n variant=\"outline\"\n size=\"sm\"\n (click)=\"openTemplateInNewWindow()\"\n title=\"Open template in new window\">\n <i class=\"fa-solid fa-external-link-alt\"></i> Open in New Window\n </button>\n }\n </div>\n }\n <!-- Template Editor -->\n <div style=\"flex: 1; background: var(--mj-bg-surface-card); border-radius: 6px; border: 1px solid var(--mj-border-default);\">\n <mj-template-editor\n #templateEditor\n [template]=\"template\"\n [config]=\"templateEditorConfig\"\n (contentChange)=\"onTemplateContentChange($event)\"\n (runTemplate)=\"onTemplateRun($event)\"\n style=\"display: block; min-height: 300px;\">\n </mj-template-editor>\n </div>\n </div>\n }\n </div>\n </mj-accordion-panel>\n <!-- Model Configuration Expansion Panel -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"true\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-microchip\" style=\"color: var(--mj-text-muted);\"></i>\n Models\n @if (promptModels.length > 0) {\n <span class=\"mj-accordion-badge\">{{ promptModels.length }}</span>\n }\n <span style=\"color: var(--mj-text-muted); font-size: 0.8em; font-weight: normal; margin-left: 8px;\">\n <i class=\"fa-solid fa-info-circle\" title=\"Models are tried in order from top to bottom. The first available model will be used.\"></i>\n Priority order (first available model will be used)\n </span>\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div style=\"padding: 16px 0;\">\n <!-- Model Management Interface -->\n <div class=\"model-management\" style=\"border: 1px solid var(--mj-border-default); border-radius: 6px; background: var(--mj-bg-surface-sunken);\">\n @if (isLoadingModels) {\n <div class=\"loading-state\" style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading models...\n </div>\n } @else {\n @if (promptModels.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No models configured\">\n @if (EditMode && UserCanCreatePromptModels) {\n <button ngProjectAs=\"[actions]\" mjButton variant=\"outline\" size=\"sm\"\n (click)=\"addNewModel()\">\n <i class=\"fa-solid fa-plus\"></i> Add Model\n </button>\n }\n </mj-empty-state>\n } @else {\n <!-- Priority explanation for multiple models -->\n @if (promptModels.length > 1) {\n <div style=\"padding: 12px 16px; background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default)); color: var(--mj-brand-primary); font-size: 0.85em;\">\n <i class=\"fa-solid fa-info-circle\" style=\"margin-right: 6px;\"></i>\n Models are tried in priority order (highest priority first). The first available model that meets requirements will be used for execution.\n </div>\n }\n <!-- Column Headers -->\n <div class=\"model-header\" style=\"display: grid; grid-template-columns: 40px 2fr 1fr 1fr 1fr 60px; gap: 12px; padding: 12px 16px; background: var(--mj-bg-surface-sunken); font-weight: 600; font-size: 0.85em; color: var(--mj-text-secondary); border-bottom: 1px solid var(--mj-border-default);\">\n <div title=\"Priority order - models are tried from top to bottom\">\n <i class=\"fa-solid fa-sort\" style=\"color: var(--mj-text-muted);\"></i>\n </div>\n <div>AI Model <span style=\"color: #dc3545;\">*</span></div>\n <div>Vendor</div>\n <div>Configuration</div>\n <div>Created</div>\n <div>Actions</div>\n </div>\n @for (model of promptModels; track getModelTrackId(model) || $index; let i = $index) {\n <div class=\"model-row\"\n [draggable]=\"EditMode\"\n (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop($event, i)\"\n (dragend)=\"onDragEnd($event)\"\n [style.background]=\"!model.ModelID ? '#fff3cd' : (draggedIndex === i ? 'color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface))' : 'var(--mj-bg-surface-card)')\"\n [style.border-left]=\"!model.ModelID ? '3px solid #ffc107' : 'none'\"\n [style.opacity]=\"draggedIndex === i ? '0.5' : '1'\"\n style=\"display: grid; grid-template-columns: 40px 2fr 1fr 1fr 1fr 60px; gap: 12px; padding: 12px 16px; border-bottom: 1px solid var(--mj-border-default); align-items: start; transition: background 0.2s, opacity 0.2s;\">\n <!-- Drag Handle / Priority -->\n <div class=\"drag-handle\" style=\"display: flex; flex-direction: column; align-items: center; justify-content: center; color: var(--mj-text-muted);\">\n @if (EditMode) {\n <i class=\"fa-solid fa-grip-vertical\" title=\"Drag to reorder priority\" style=\"cursor: move;\"></i>\n <span style=\"font-size: 0.7em; margin-top: 2px;\">#{{ i + 1 }}</span>\n } @else {\n <span style=\"font-size: 0.9em; font-weight: 600;\" title=\"Priority {{ model.Priority }} - Higher priority numbers are tried first\">#{{ i + 1 }}</span>\n }\n </div>\n <!-- Model Selection -->\n <div class=\"model-select\">\n @if (EditMode) {\n <mj-dropdown [(ngModel)]=\"model.ModelID\"\n [name]=\"'modelId_' + getModelTrackId(model)\"\n [Data]=\"availableModels\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n Placeholder=\"Select a model...\"\n (ValueChange)=\"onModelChange($any($event), i)\"\n style=\"width: 100%;\">\n </mj-dropdown>\n } @else {\n <span style=\"font-weight: 500;\">{{ getModelDisplayName(model.ModelID) }}</span>\n }\n </div>\n <!-- Vendor -->\n <div class=\"model-vendor\">\n @if (EditMode) {\n @if (model.ModelID) {\n @if (shouldShowVendorDropdown(model.ModelID)) {\n <mj-dropdown [(ngModel)]=\"model.VendorID\"\n [name]=\"'vendorId_' + getModelTrackId(model)\"\n [Data]=\"getVendorsForModelSync(model.ModelID)\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n Placeholder=\"Select vendor...\"\n style=\"width: 100%;\">\n </mj-dropdown>\n } @else {\n <!-- Single vendor - just show the name -->\n @if (getVendorsForModelSync(model.ModelID).length === 1) {\n <span [style.color]=\"getVendorStatusColor(model.ModelID, getVendorsForModelSync(model.ModelID)[0].ID)\" style=\"font-size: 0.9em; font-weight: 500;\">\n {{ getVendorsForModelSync(model.ModelID)[0].Name }}\n @if (getModelVendorStatus(model.ModelID, getVendorsForModelSync(model.ModelID)[0].ID) !== 'Active') {\n <span style=\"font-size: 0.8em; margin-left: 4px;\">({{ getModelVendorStatus(model.ModelID, getVendorsForModelSync(model.ModelID)[0].ID) }})</span>\n }\n </span>\n } @else {\n <span style=\"color: var(--mj-text-muted); font-style: italic; font-size: 0.9em;\">No vendors available</span>\n }\n }\n } @else {\n <span style=\"color: var(--mj-text-muted); font-style: italic; font-size: 0.9em;\">Select model first</span>\n }\n } @else {\n @if (model.VendorID && model.ModelID) {\n <span [style.color]=\"getVendorStatusColor(model.ModelID, model.VendorID)\" style=\"font-size: 0.9em;\">\n {{ getVendorDisplayName(model.VendorID) }}\n @if (getModelVendorStatus(model.ModelID, model.VendorID) !== 'Active') {\n <span style=\"font-size: 0.8em; margin-left: 4px;\">({{ getModelVendorStatus(model.ModelID, model.VendorID) }})</span>\n }\n </span>\n } @else {\n <span style=\"color: var(--mj-text-muted); font-size: 0.9em;\">-</span>\n }\n }\n </div>\n <!-- Configuration -->\n <div class=\"model-configuration\">\n @if (EditMode) {\n @if (isLoadingConfigurations) {\n <div style=\"padding: 4px; color: var(--mj-text-muted); font-style: italic; font-size: 0.85em;\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading...\n </div>\n } @else {\n <mj-dropdown [(ngModel)]=\"model.ConfigurationID\"\n [name]=\"'configurationId_' + getModelTrackId(model)\"\n [Data]=\"availableConfigurations\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n Placeholder=\"Default\"\n (ValueChange)=\"onConfigurationChange($any($event), i)\"\n style=\"width: 100%;\">\n </mj-dropdown>\n }\n } @else {\n <span style=\"font-size: 0.9em;\">{{ getConfigurationDisplayName(model.ConfigurationID) }}</span>\n }\n </div>\n <!-- Created Date -->\n <div class=\"model-created\">\n @if (model.ID) {\n <span style=\"color: var(--mj-text-muted); font-size: 0.8em;\">{{ model.__mj_CreatedAt | date:'short' }}</span>\n } @else {\n <span style=\"color: #28a745; font-size: 0.8em; font-style: italic;\">New</span>\n }\n </div>\n <!-- Actions -->\n <div class=\"model-actions\" style=\"display: flex; gap: 2px; flex-direction: column;\">\n @if (EditMode) {\n <div style=\"display: flex; gap: 2px; margin-bottom: 4px;\">\n @if (UserCanUpdatePromptModels) {\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"moveModelUp(i)\"\n [disabled]=\"i === 0\"\n title=\"Move up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"moveModelDown(i)\"\n [disabled]=\"i === promptModels.length - 1\"\n title=\"Move down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n }\n </div>\n @if (UserCanDeletePromptModels) {\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"removePromptModel(i)\"\n title=\"Remove model\"\n style=\"color: var(--mj-status-error);\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n }\n </div>\n </div>\n <!-- Second row with additional details -->\n <div style=\"display: grid; grid-template-columns: 40px 1fr; gap: 12px; padding: 8px 16px; border-bottom: 1px solid var(--mj-border-default); background: var(--mj-bg-surface-sunken); font-size: 0.85em; color: var(--mj-text-muted);\">\n <div></div>\n <div>\n <!-- Basic model details -->\n <div style=\"display: flex; gap: 16px; flex-wrap: wrap; align-items: center; margin-bottom: 8px;\">\n @if (model.Status) {\n <span><strong>Status:</strong> {{ model.Status }}</span>\n }\n </div>\n <!-- Parallel execution fields when prompt is ModelSpecific -->\n @if (record.ParallelizationMode === 'ModelSpecific') {\n <div style=\"padding: 8px; background: var(--mj-bg-surface-card); border: 1px solid var(--mj-border-default); border-radius: 4px; margin-top: 8px;\">\n <div style=\"margin-bottom: 6px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">\n <i class=\"fa-solid fa-layer-group\"></i> Model-Specific Parallel Execution\n </div>\n @if (EditMode) {\n <div style=\"display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 12px; align-items: center;\">\n <!-- Parallel Mode -->\n <div>\n <label style=\"display: block; margin-bottom: 2px; font-size: 0.8em; font-weight: 600; color: var(--mj-text-secondary);\">Parallel Mode</label>\n <mj-dropdown [(ngModel)]=\"model.ParallelizationMode\"\n [name]=\"'parallelMode_' + i\"\n [Data]=\"[{text: 'None', value: 'None'}, {text: 'Static Count', value: 'StaticCount'}, {text: 'Config Param', value: 'ConfigParam'}]\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n Placeholder=\"Select mode...\"\n style=\"width: 100%; font-size: 0.85em;\">\n </mj-dropdown>\n </div>\n <!-- Parallel Count (when StaticCount) -->\n @if (model.ParallelizationMode === 'StaticCount') {\n <div>\n <label style=\"display: block; margin-bottom: 2px; font-size: 0.8em; font-weight: 600; color: var(--mj-text-secondary);\">Parallel Count</label>\n <mj-numeric-input [(ngModel)]=\"model.ParallelCount\"\n [name]=\"'parallelCount_' + i\"\n [Min]=\"1\"\n [Step]=\"1\"\n [Format]=\"'n0'\"\n Placeholder=\"Count...\"\n style=\"width: 100%; font-size: 0.85em;\">\n </mj-numeric-input>\n </div>\n }\n <!-- Config Param (when ConfigParam) -->\n @if (model.ParallelizationMode === 'ConfigParam') {\n <div>\n <label style=\"display: block; margin-bottom: 2px; font-size: 0.8em; font-weight: 600; color: var(--mj-text-secondary);\">Config Parameter</label>\n <input type=\"text\" class=\"mj-input\" [(ngModel)]=\"model.ParallelConfigParam\"\n [name]=\"'parallelConfigParam_' + i\"\n placeholder=\"Parameter name...\"\n style=\"width: 100%; font-size: 0.85em;\" />\n </div>\n }\n </div>\n } @else {\n <!-- Read-only display -->\n <div style=\"display: flex; gap: 16px; flex-wrap: wrap; align-items: center;\">\n @if (model.ParallelizationMode) {\n <span><strong>Parallel Mode:</strong> {{ model.ParallelizationMode }}</span>\n }\n @if (model.ParallelCount) {\n <span><strong>Parallel Count:</strong> {{ model.ParallelCount }}</span>\n }\n @if (model.ParallelConfigParam) {\n <span><strong>Config Param:</strong> {{ model.ParallelConfigParam }}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n @if (EditMode && UserCanCreatePromptModels) {\n <div class=\"add-model-row\" style=\"padding: 12px 16px; text-align: center; background: var(--mj-bg-surface-sunken); border-top: 1px solid var(--mj-border-default);\">\n <button mjButton variant=\"outline\" size=\"sm\"\n (click)=\"addNewModel()\"\n style=\"color: var(--mj-status-success); border-color: var(--mj-status-success);\">\n <i class=\"fa-solid fa-plus\"></i> Add Model\n </button>\n </div>\n }\n }\n }\n </div>\n </div>\n </mj-accordion-panel>\n }\n <!-- Advanced Configuration Expansion Panel -->\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-cogs\" style=\"color: var(--mj-text-muted);\"></i>\n Advanced Configuration\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div style=\"padding: 16px 0;\">\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 20px;\">\n <!-- Left Column -->\n <div>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ParallelizationMode\"\n Type=\"dropdownlist\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n @if (showParallelCount) {\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ParallelCount\"\n Type=\"numerictextbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n }\n @if (showParallelConfigParam) {\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ParallelConfigParam\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n }\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"OutputType\"\n Type=\"dropdownlist\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"EffortLevel\"\n Type=\"numerictextbox\"\n Caption=\"Effort Level (1-100)\"\n Description=\"Higher values request more thorough reasoning\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n </div>\n <!-- Right Column -->\n <div>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ValidationBehavior\"\n Type=\"dropdownlist\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"EnableCaching\"\n Type=\"checkbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TemplateDataCapture\"\n Type=\"select\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <!-- Result Selector Prompt with Tree Selector -->\n <div style=\"margin-bottom: 16px;\">\n <label style=\"display: block; margin-bottom: 4px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">\n Result Selector Prompt\n </label>\n @if (EditMode) {\n @if (isLoadingResultSelectorData) {\n <div style=\"padding: 8px; color: var(--mj-text-muted); font-style: italic;\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading prompts...\n </div>\n } @else {\n <mj-dropdown\n [(ngModel)]=\"record.ResultSelectorPromptID\"\n name=\"resultSelectorPromptID\"\n [Data]=\"resultSelectorTreeData\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n Placeholder=\"Select a result selector prompt...\"\n style=\"width: 100%;\"\n (ValueChange)=\"onResultSelectorChange($any($event))\">\n </mj-dropdown>\n }\n } @else {\n <span style=\"color: var(--mj-text-secondary);\">{{ getPromptDisplayName(record.ResultSelectorPromptID || '') || 'None selected' }}</span>\n }\n </div>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Prefill & Output Control Expansion Panel -->\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-wand-magic-sparkles\" style=\"color: var(--mj-text-muted);\"></i>\n Prefill &amp; Output Control\n </span>\n </ng-template>\n <div style=\"padding: 16px 0;\">\n <p style=\"margin: 0 0 12px 0; font-size: 0.85em; color: var(--mj-text-muted);\">\n Assistant prefill seeds the model's response with an initial string, guiding output format and content. Stop sequences terminate generation when encountered.\n </p>\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 20px;\">\n <!-- Left Column -->\n <div>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"AssistantPrefill\"\n Type=\"textarea\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"StopSequences\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n </div>\n <!-- Right Column -->\n <div>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"PrefillFallbackMode\"\n Type=\"dropdownlist\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Template Parameters Expansion Panel -->\n @if (template && templateParams.length > 0) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-sliders\" style=\"color: var(--mj-text-muted);\"></i>\n Template Parameters\n <span class=\"mj-accordion-badge\">{{ templateParams.length }}</span>\n <span style=\"color: var(--mj-text-muted); font-size: 0.8em; font-weight: normal; margin-left: 8px;\">\n <i class=\"fa-solid fa-info-circle\" title=\"These parameters are defined in the template and will be available when executing this prompt\"></i>\n Parameters defined in the template\n </span>\n </span>\n </ng-template>\n <!-- Template Parameters Display -->\n <div style=\"padding: 16px 0;\">\n @if (isLoadingTemplateParams) {\n <div class=\"loading-state\" style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading template parameters...\n </div>\n } @else if (templateParams.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"This template has no parameters defined\" />\n } @else {\n <!-- Parameters Grid -->\n <div style=\"display: grid; gap: 12px;\">\n @for (param of templateParams; track param.ID) {\n <div class=\"parameter-card\"\n style=\"border: 1px solid var(--mj-border-default); border-radius: 8px; padding: 16px; background: var(--mj-bg-surface-sunken); transition: all 0.2s;\"\n [style.border-left]=\"'4px solid ' + getParamTypeColor(param.Type)\">\n <!-- Parameter Header -->\n <div style=\"display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 8px;\">\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <i [class]=\"'fa-solid ' + getParamTypeIcon(param.Type)\"\n [style.color]=\"getParamTypeColor(param.Type)\"\n style=\"font-size: 1.2em;\"></i>\n <h6 style=\"margin: 0; color: var(--mj-text-secondary); font-weight: 600;\">\n {{ param.Name }}\n @if (param.IsRequired) {\n <span style=\"color: #dc3545; font-size: 0.9em; margin-left: 4px;\">*</span>\n }\n </h6>\n </div>\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <span class=\"type-badge\"\n [style.background-color]=\"getParamTypeColor(param.Type)\"\n style=\"color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.75em; font-weight: 500;\">\n {{ param.Type }}\n </span>\n @if (param.IsRequired) {\n <span style=\"color: #dc3545; font-size: 0.85em; font-weight: 500;\">Required</span>\n } @else {\n <span style=\"color: var(--mj-text-muted); font-size: 0.85em;\">Optional</span>\n }\n </div>\n </div>\n <!-- Parameter Description -->\n @if (param.Description) {\n <p style=\"margin: 0 0 8px 0; color: var(--mj-text-muted); font-size: 0.9em; line-height: 1.4;\">\n {{ param.Description }}\n </p>\n }\n <!-- Type-specific Information -->\n <div style=\"font-size: 0.85em; color: var(--mj-text-secondary);\">\n <span style=\"display: flex; align-items: center; gap: 4px; margin-bottom: 4px;\">\n <i class=\"fa-solid fa-info-circle\" style=\"color: var(--mj-text-muted);\"></i>\n {{ getParamTypeDescription(param) }}\n </span>\n </div>\n <!-- Additional Parameter Details -->\n <div style=\"display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px; margin-top: 12px;\">\n @if (param.DefaultValue) {\n <div style=\"background: var(--mj-bg-surface-card); padding: 8px 12px; border-radius: 4px; border: 1px solid var(--mj-border-default);\">\n <label style=\"display: block; font-size: 0.8em; color: var(--mj-text-muted); margin-bottom: 2px;\">Default Value</label>\n <code style=\"font-size: 0.85em; color: var(--mj-text-secondary); word-break: break-all;\">{{ param.DefaultValue }}</code>\n </div>\n }\n @if (param.EntityID) {\n <div style=\"background: var(--mj-bg-surface-card); padding: 8px 12px; border-radius: 4px; border: 1px solid var(--mj-border-default);\">\n <label style=\"display: block; font-size: 0.8em; color: var(--mj-text-muted); margin-bottom: 2px;\">Entity</label>\n <span style=\"font-size: 0.85em; color: var(--mj-text-secondary);\">{{ param.Entity || 'Entity ID: ' + param.EntityID }}</span>\n </div>\n }\n @if (param.LinkedParameterName) {\n <div style=\"background: var(--mj-bg-surface-card); padding: 8px 12px; border-radius: 4px; border: 1px solid var(--mj-border-default);\">\n <label style=\"display: block; font-size: 0.8em; color: var(--mj-text-muted); margin-bottom: 2px;\">Linked To</label>\n <span style=\"font-size: 0.85em; color: var(--mj-text-secondary);\">\n {{ param.LinkedParameterName }}\n @if (param.LinkedParameterField) {\n ({{ param.LinkedParameterField }})\n }\n </span>\n </div>\n }\n @if (param.ExtraFilter) {\n <div style=\"background: var(--mj-bg-surface-card); padding: 8px 12px; border-radius: 4px; border: 1px solid var(--mj-border-default);\">\n <label style=\"display: block; font-size: 0.8em; color: var(--mj-text-muted); margin-bottom: 2px;\">Filter</label>\n <code style=\"font-size: 0.8em; color: var(--mj-text-secondary); word-break: break-all;\">{{ param.ExtraFilter }}</code>\n </div>\n }\n @if (param.RecordID) {\n <div style=\"background: var(--mj-bg-surface-card); padding: 8px 12px; border-radius: 4px; border: 1px solid var(--mj-border-default);\">\n <label style=\"display: block; font-size: 0.8em; color: var(--mj-text-muted); margin-bottom: 2px;\">Record ID</label>\n <code style=\"font-size: 0.85em; color: var(--mj-text-secondary);\">{{ param.RecordID }}</code>\n </div>\n }\n </div>\n </div>\n }\n </div>\n <!-- Help Text -->\n <div style=\"margin-top: 16px; padding: 12px; background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); border-radius: 6px; border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default));\">\n <div style=\"display: flex; align-items: flex-start; gap: 8px;\">\n <i class=\"fa-solid fa-lightbulb\" style=\"color: var(--mj-brand-primary); margin-top: 2px;\"></i>\n <div style=\"flex: 1; font-size: 0.85em; color: var(--mj-brand-primary); line-height: 1.5;\">\n <strong>Using Template Parameters:</strong> When executing this prompt, you'll be prompted to provide values for all required parameters.\n Parameters can be simple values (text, numbers) or complex data structures (JSON objects, database records, or entire entity collections).\n The template will use these parameters to generate dynamic content based on the values provided at execution time.\n </div>\n </div>\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n <!-- Output Example Expansion Panel (when OutputType = object) -->\n @if (showOutputExample) {\n <mj-accordion-panel\n [Expanded]=\"true\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-code\" style=\"color: var(--mj-text-muted);\"></i>\n Output Example (JSON)\n <span style=\"color: #dc3545; font-size: 0.8em; font-weight: normal;\">&bull; Required for object output type</span>\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div style=\"padding: 16px;\">\n @if (EditMode) {\n <mj-code-editor\n [(ngModel)]=\"record.OutputExample\"\n name=\"outputExample\"\n language=\"json\"\n placeholder=\"Enter JSON example structure...\"\n style=\"width: 100%; height: 200px; border: 1px solid var(--mj-border-default); border-radius: 4px;\">\n </mj-code-editor>\n <div style=\"margin-top: 8px; color: var(--mj-text-muted); font-size: 0.85em;\">\n <i class=\"fa-solid fa-info-circle\"></i> Provide a JSON example that defines the expected structure for object output validation.\n </div>\n } @else if (record.OutputExample) {\n <div style=\"background: var(--mj-bg-surface-sunken); border: 1px solid var(--mj-border-default); border-radius: 4px; padding: 12px; font-family: 'Courier New', monospace; font-size: 0.9em; white-space: pre-wrap; overflow: auto; max-height: 250px;\">{{ record.OutputExample }}</div>\n } @else {\n <mj-alert Variant=\"warning\">Output example is required when output type is 'object'</mj-alert>\n }\n </div>\n </mj-accordion-panel>\n }\n <!-- Execution History Expansion Panel -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-history\" style=\"color: var(--mj-text-muted);\"></i>\n Execution History\n @if (executionHistory.length > 0) {\n <span style=\"color: var(--mj-text-muted); font-weight: normal;\">({{ executionHistory.length }})</span>\n }\n </span>\n </ng-template>\n <!-- Custom Execution History Viewer -->\n <div style=\"padding: 16px;\">\n @if (isLoadingHistory) {\n <div style=\"text-align: center; padding: 40px; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 2em; margin-bottom: 12px;\"></i>\n <p>Loading execution history...</p>\n </div>\n } @else if (executionHistory.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-clock-rotate-left\"\n Title=\"No execution history yet\"\n Message=\"Run this prompt to see execution history here\" />\n } @else {\n <!-- Sort Controls -->\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;\">\n <div style=\"color: var(--mj-text-muted); font-size: 0.9em;\">\n Showing {{ executionHistory.length }} executions\n </div>\n <div style=\"display: flex; gap: 8px; align-items: center;\">\n <span style=\"color: var(--mj-text-muted); font-size: 0.85em;\">Sort by:</span>\n <div class=\"mj-button-group\">\n <button mjButton\n [class.active]=\"historySortField === 'runAt'\"\n (click)=\"changeHistorySort('runAt')\"\n size=\"sm\">\n Date\n @if (historySortField === 'runAt') {\n <i [class]=\"'fa-solid fa-sort-' + (historySortDirection === 'asc' ? 'up' : 'down')\"\n style=\"margin-left: 4px; font-size: 0.8em;\"></i>\n }\n </button>\n <button mjButton\n [class.active]=\"historySortField === 'executionTime'\"\n (click)=\"changeHistorySort('executionTime')\"\n size=\"sm\">\n Duration\n @if (historySortField === 'executionTime') {\n <i [class]=\"'fa-solid fa-sort-' + (historySortDirection === 'asc' ? 'up' : 'down')\"\n style=\"margin-left: 4px; font-size: 0.8em;\"></i>\n }\n </button>\n <button mjButton\n [class.active]=\"historySortField === 'tokens'\"\n (click)=\"changeHistorySort('tokens')\"\n size=\"sm\">\n Tokens\n @if (historySortField === 'tokens') {\n <i [class]=\"'fa-solid fa-sort-' + (historySortDirection === 'asc' ? 'up' : 'down')\"\n style=\"margin-left: 4px; font-size: 0.8em;\"></i>\n }\n </button>\n <button mjButton\n [class.active]=\"historySortField === 'cost'\"\n (click)=\"changeHistorySort('cost')\"\n size=\"sm\">\n Cost\n @if (historySortField === 'cost') {\n <i [class]=\"'fa-solid fa-sort-' + (historySortDirection === 'asc' ? 'up' : 'down')\"\n style=\"margin-left: 4px; font-size: 0.8em;\"></i>\n }\n </button>\n </div>\n </div>\n </div>\n <!-- Execution History Table -->\n <div style=\"border: 1px solid var(--mj-border-default); border-radius: 8px; overflow: hidden;\">\n <table style=\"width: 100%; border-collapse: collapse;\">\n <thead>\n <tr style=\"background: var(--mj-bg-surface-sunken); border-bottom: 2px solid var(--mj-border-default);\">\n <th style=\"padding: 12px; text-align: left; font-weight: 600; color: var(--mj-text-secondary);\">Status</th>\n <th style=\"padding: 12px; text-align: left; font-weight: 600; color: var(--mj-text-secondary);\">Date & Time</th>\n <th style=\"padding: 12px; text-align: left; font-weight: 600; color: var(--mj-text-secondary);\">Model</th>\n <th style=\"padding: 12px; text-align: left; font-weight: 600; color: var(--mj-text-secondary);\">Duration</th>\n <th style=\"padding: 12px; text-align: right; font-weight: 600; color: var(--mj-text-secondary);\">Tokens</th>\n <th style=\"padding: 12px; text-align: right; font-weight: 600; color: var(--mj-text-secondary);\">Cost</th>\n <th style=\"padding: 12px; text-align: center; font-weight: 600; color: var(--mj-text-secondary);\">Type</th>\n <th style=\"padding: 12px; text-align: center; font-weight: 600; color: var(--mj-text-secondary);\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (run of executionHistory; track run.ID; let i = $index) {\n <tr class=\"history-row\"\n [class.even-row]=\"i % 2 === 0\"\n style=\"border-bottom: 1px solid var(--mj-border-default);\">\n <td style=\"padding: 12px;\">\n <span style=\"display: flex; align-items: center; gap: 6px;\">\n <i [class]=\"'fa-solid ' + getExecutionStatusIcon(run.Success)\"\n [style.color]=\"getExecutionStatusColor(run.Success)\"></i>\n <span [style.color]=\"getExecutionStatusColor(run.Success)\" style=\"font-weight: 500;\">\n {{ run.Success === true ? 'Success' : run.Success === false ? 'Failed' : 'Running' }}\n </span>\n </span>\n </td>\n <td style=\"padding: 12px; color: var(--mj-text-secondary);\">\n {{ run.RunAt | date:'short' }}\n </td>\n <td style=\"padding: 12px; color: var(--mj-text-secondary);\">\n <span style=\"display: flex; align-items: center; gap: 6px;\">\n <i class=\"fa-solid fa-microchip\" style=\"color: var(--mj-text-muted);\"></i>\n {{ run.Model || 'Unknown' }}\n </span>\n </td>\n <td style=\"padding: 12px; color: var(--mj-text-secondary);\">\n {{ formatDuration(run.ExecutionTimeMS) }}\n </td>\n <td style=\"padding: 12px; text-align: right; color: var(--mj-text-secondary);\">\n {{ formatTokens(run.TokensUsed) }}\n </td>\n <td style=\"padding: 12px; text-align: right; color: var(--mj-text-secondary);\">\n {{ formatCost(run.TotalCost || run.Cost) }}\n </td>\n <td style=\"padding: 12px; text-align: center;\">\n @if (run.RunType) {\n <span style=\"padding: 4px 8px; border-radius: 12px; background: var(--mj-bg-surface-sunken); \n color: var(--mj-text-secondary); font-size: 0.85em; font-weight: 500;\">\n {{ run.RunType }}\n </span>\n }\n </td>\n <td style=\"padding: 12px; text-align: center;\">\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"navigateToPromptRun(run.ID)\"\n title=\"View details\">\n <i class=\"fa-solid fa-external-link\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n <!-- Cache Expansion Panel -->\n @if (record.IsSaved && record.EnableCaching) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-database\" style=\"color: var(--mj-text-muted);\"></i>\n Result Cache\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div style=\"padding: 16px 0;\">\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: AI Result Cache','AIPromptID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: AI Result Cache')\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"false\">\n </mj-explorer-entity-data-grid>\n </div>\n </mj-accordion-panel>\n }\n <!-- Related Items Expansion Panel -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-link\" style=\"color: var(--mj-text-muted);\"></i>\n Related Items\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div style=\"padding: 16px 0;\">\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 20px;\">\n <!-- AI Agents -->\n <div>\n <h6 style=\"margin: 0 0 12px 0; color: var(--mj-text-secondary);\">AI Agents Using This Prompt</h6>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: AI Agent Prompts','PromptID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: AI Agent Prompts')\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"false\">\n </mj-explorer-entity-data-grid>\n </div>\n <!-- Result Selector References -->\n <div>\n <h6 style=\"margin: 0 0 12px 0; color: var(--mj-text-secondary);\">Prompts Using This as Result Selector</h6>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: AI Prompts','ResultSelectorPromptID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: AI Prompts')\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"false\">\n </mj-explorer-entity-data-grid>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n }\n </div>\n </div>\n </form>\n</mj-record-form-container>\n}\n\n\n<!-- AI Prompt Test Harness -->\n@if (showTestHarness) {\n <mj-window\n [Width]=\"1200\"\n [Height]=\"800\"\n [MinWidth]=\"800\"\n [MinHeight]=\"600\"\n [Draggable]=\"true\"\n [Resizable]=\"true\"\n [Visible]=\"true\"\n (Close)=\"onTestHarnessVisibilityChanged(false)\"\n [Title]=\"'Run AI Prompt - ' + (record.Name || 'Untitled')\">\n <mj-ai-test-harness\n [entity]=\"record\"\n [mode]=\"'prompt'\"\n [isVisible]=\"showTestHarness\"\n (visibilityChange)=\"onTestHarnessVisibilityChanged($event)\">\n </mj-ai-test-harness>\n </mj-window>\n}", styles: ["/* Override shared form-styles to enable flex layout */\n:host {\n display: block;\n height: 100%;\n}\n\n.record-form-container {\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n padding: 10px;\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n}\n\n.record-form {\n min-height: 0 !important;\n}\n\n.custom-toolbar-actions {\n margin-left: auto;\n}\n\n.status-badge {\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n font-weight: 500;\n letter-spacing: 0.02em;\n}\n\n.config-summary {\n position: sticky;\n top: 0;\n max-height: 600px;\n overflow-y: auto;\n}\n\n.config-item {\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.config-item:last-child {\n border-bottom: none;\n}\n\n.template-tab-content {\n background: var(--mj-bg-surface);\n}\n\n.template-header h5 {\n font-size: 1.1em;\n}\n\n.loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n}\n\n/* Template-editor placeholders fill the editor pane */\nmj-empty-state.no-template-state,\nmj-empty-state.invalid-template-state {\n flex: 1;\n}\n\n.template-editor-container {\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-md);\n}\n\n/* Grid layout adjustments */\n@media (max-width: 1200px) {\n .record-form-container .mj-tab-body > div {\n grid-template-columns: 1fr !important;\n gap: 20px;\n }\n\n .config-summary {\n order: -1;\n position: static;\n max-height: none;\n }\n}\n\n/* Responsive toolbar */\n@media (max-width: 768px) {\n .custom-toolbar-actions {\n flex-direction: column;\n gap: 4px !important;\n }\n\n .status-badge {\n align-self: flex-start;\n }\n}\n\n/* Ensure proper spacing in form sections */\n.record-form-container mj-form-section {\n padding: 16px;\n}\n\n/* Smooth transitions for better UX */\n.status-badge,\n.config-item,\n.template-header {\n transition: all 0.2s ease;\n}\n\n.config-item:hover {\n background-color: var(--mj-bg-surface-sunken);\n border-radius: var(--mj-radius-sm);\n margin: 0 -8px;\n padding: 8px;\n}\n\n/* Execution History Table Styles */\n.history-row {\n transition: background 0.2s;\n}\n\n.history-row:not(.even-row) {\n background: var(--mj-bg-surface-card);\n}\n\n.history-row.even-row {\n background: var(--mj-bg-surface);\n}\n\n.history-row:hover {\n background: var(--mj-border-default) !important;\n}\n\n/* Template Parameters Styles */\n.parameter-card {\n position: relative;\n overflow: hidden;\n}\n\n.parameter-card::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 4px;\n background: inherit;\n transition: width 0.2s;\n}\n\n.parameter-card:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-md);\n}\n\n.parameter-card:hover::before {\n width: 6px;\n}\n\n.type-badge {\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n transition: transform 0.2s;\n}\n\n.parameter-card:hover .type-badge {\n transform: scale(1.05);\n}\n\n/* Parameter type icons animation */\n.parameter-card i.fa-solid {\n transition: transform 0.3s;\n}\n\n.parameter-card:hover i.fa-solid {\n transform: rotate(360deg);\n}\n\n/* Grid responsive behavior */\n@media (max-width: 768px) {\n .parameter-card {\n margin-bottom: 8px;\n }\n\n .parameter-card h6 {\n font-size: 0.95em;\n }\n\n .type-badge {\n font-size: 0.7em !important;\n }\n}\n"] }]
3472
3474
  }], null, { TemplateEditor: [{
3473
3475
  type: ViewChild,
3474
3476
  args: ['templateEditor']