@memberjunction/ng-core-entity-forms 6.2.0-edge.0 → 6.2.0-edge.2

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 (398) hide show
  1. package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.d.ts +1 -1
  2. package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.js +2 -2
  3. package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.js.map +1 -1
  4. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js.map +1 -1
  5. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts +90 -16
  6. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts.map +1 -1
  7. package/dist/lib/custom/AIAgents/add-action-dialog.component.js +218 -70
  8. package/dist/lib/custom/AIAgents/add-action-dialog.component.js.map +1 -1
  9. package/dist/lib/custom/AIAgents/agent-form-tabs.d.ts +1 -0
  10. package/dist/lib/custom/AIAgents/agent-form-tabs.d.ts.map +1 -1
  11. package/dist/lib/custom/AIAgents/agent-form-tabs.js +2 -0
  12. package/dist/lib/custom/AIAgents/agent-form-tabs.js.map +1 -1
  13. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts +80 -16
  14. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts.map +1 -1
  15. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +146 -46
  16. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js.map +1 -1
  17. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +329 -27
  18. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  19. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +1322 -783
  20. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  21. package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts +76 -0
  22. package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts.map +1 -1
  23. package/dist/lib/custom/AIAgents/ai-agent-management.service.js +77 -33
  24. package/dist/lib/custom/AIAgents/ai-agent-management.service.js.map +1 -1
  25. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts +69 -15
  26. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts.map +1 -1
  27. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +182 -74
  28. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js.map +1 -1
  29. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts +105 -25
  30. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts.map +1 -1
  31. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +272 -112
  32. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -1
  33. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts +32 -6
  34. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts.map +1 -1
  35. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +71 -19
  36. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js.map +1 -1
  37. package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts +10 -0
  38. package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts.map +1 -1
  39. package/dist/lib/custom/AIAgents/new-agent-dialog.service.js +27 -7
  40. package/dist/lib/custom/AIAgents/new-agent-dialog.service.js.map +1 -1
  41. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts +65 -15
  42. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts.map +1 -1
  43. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +152 -52
  44. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
  45. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts +81 -15
  46. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts.map +1 -1
  47. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +145 -45
  48. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js.map +1 -1
  49. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +71 -17
  50. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -1
  51. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +175 -67
  52. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
  53. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +173 -27
  54. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
  55. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +385 -93
  56. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  57. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.d.ts +64 -4
  58. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.d.ts.map +1 -1
  59. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +129 -29
  60. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js.map +1 -1
  61. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +260 -27
  62. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
  63. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +694 -252
  64. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  65. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts +10 -0
  66. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts.map +1 -1
  67. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js +17 -9
  68. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js.map +1 -1
  69. package/dist/lib/custom/AIPrompts/pending-records.d.ts +11 -0
  70. package/dist/lib/custom/AIPrompts/pending-records.d.ts.map +1 -0
  71. package/dist/lib/custom/AIPrompts/pending-records.js +21 -0
  72. package/dist/lib/custom/AIPrompts/pending-records.js.map +1 -0
  73. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts +74 -16
  74. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts.map +1 -1
  75. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +174 -58
  76. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js.map +1 -1
  77. package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts +108 -14
  78. package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts.map +1 -1
  79. package/dist/lib/custom/Actions/action-execution-log-form.component.js +258 -70
  80. package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
  81. package/dist/lib/custom/Actions/action-form.component.d.ts +198 -14
  82. package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
  83. package/dist/lib/custom/Actions/action-form.component.js +387 -107
  84. package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
  85. package/dist/lib/custom/BridgeProviders/bridge-provider-features.d.ts +12 -6
  86. package/dist/lib/custom/BridgeProviders/bridge-provider-features.d.ts.map +1 -1
  87. package/dist/lib/custom/BridgeProviders/bridge-provider-features.js +41 -29
  88. package/dist/lib/custom/BridgeProviders/bridge-provider-features.js.map +1 -1
  89. package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js +14 -14
  90. package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js.map +1 -1
  91. package/dist/lib/custom/Companies/company-overview.panel.d.ts +1 -1
  92. package/dist/lib/custom/Companies/company-overview.panel.js +2 -2
  93. package/dist/lib/custom/Companies/company-overview.panel.js.map +1 -1
  94. package/dist/lib/custom/Conversations/conversation-overview.panel.d.ts +1 -1
  95. package/dist/lib/custom/Conversations/conversation-overview.panel.js +2 -2
  96. package/dist/lib/custom/Conversations/conversation-overview.panel.js.map +1 -1
  97. package/dist/lib/custom/Employees/employee-overview.panel.d.ts +1 -1
  98. package/dist/lib/custom/Employees/employee-overview.panel.js +2 -2
  99. package/dist/lib/custom/Employees/employee-overview.panel.js.map +1 -1
  100. package/dist/lib/custom/Entities/entity-form.component.d.ts +217 -29
  101. package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
  102. package/dist/lib/custom/Entities/entity-form.component.js +734 -285
  103. package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
  104. package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts +5 -1
  105. package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts.map +1 -1
  106. package/dist/lib/custom/EntityActions/entityaction.form.component.js +10 -2
  107. package/dist/lib/custom/EntityActions/entityaction.form.component.js.map +1 -1
  108. package/dist/lib/custom/Files/file-form.component.d.ts +1 -1
  109. package/dist/lib/custom/Files/file-form.component.js +2 -2
  110. package/dist/lib/custom/Files/file-form.component.js.map +1 -1
  111. package/dist/lib/custom/Lists/list-form.component.d.ts +300 -36
  112. package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
  113. package/dist/lib/custom/Lists/list-form.component.js +664 -208
  114. package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
  115. package/dist/lib/custom/MLModels/ml-model-view-models.d.ts +31 -0
  116. package/dist/lib/custom/MLModels/ml-model-view-models.d.ts.map +1 -1
  117. package/dist/lib/custom/MLModels/ml-model-view-models.js +52 -16
  118. package/dist/lib/custom/MLModels/ml-model-view-models.js.map +1 -1
  119. package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts +107 -10
  120. package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts.map +1 -1
  121. package/dist/lib/custom/MLModels/ps-model-detail.component.js +291 -101
  122. package/dist/lib/custom/MLModels/ps-model-detail.component.js.map +1 -1
  123. package/dist/lib/custom/Queries/query-form.component.d.ts +201 -26
  124. package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
  125. package/dist/lib/custom/Queries/query-form.component.js +429 -109
  126. package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
  127. package/dist/lib/custom/Queries/query-run-dialog.component.d.ts +107 -14
  128. package/dist/lib/custom/Queries/query-run-dialog.component.d.ts.map +1 -1
  129. package/dist/lib/custom/Queries/query-run-dialog.component.js +249 -79
  130. package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
  131. package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts +129 -4
  132. package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts.map +1 -1
  133. package/dist/lib/custom/RecordProcesses/record-process-form.component.js +904 -90
  134. package/dist/lib/custom/RecordProcesses/record-process-form.component.js.map +1 -1
  135. package/dist/lib/custom/Rubrics/evaluation-form.component.d.ts +37 -0
  136. package/dist/lib/custom/Rubrics/evaluation-form.component.d.ts.map +1 -0
  137. package/dist/lib/custom/Rubrics/evaluation-form.component.js +399 -0
  138. package/dist/lib/custom/Rubrics/evaluation-form.component.js.map +1 -0
  139. package/dist/lib/custom/Rubrics/record-forms.component.d.ts +69 -0
  140. package/dist/lib/custom/Rubrics/record-forms.component.d.ts.map +1 -0
  141. package/dist/lib/custom/Rubrics/record-forms.component.js +587 -0
  142. package/dist/lib/custom/Rubrics/record-forms.component.js.map +1 -0
  143. package/dist/lib/custom/Rubrics/rubric-form.component.d.ts +67 -0
  144. package/dist/lib/custom/Rubrics/rubric-form.component.d.ts.map +1 -0
  145. package/dist/lib/custom/Rubrics/rubric-form.component.js +534 -0
  146. package/dist/lib/custom/Rubrics/rubric-form.component.js.map +1 -0
  147. package/dist/lib/custom/Rubrics/rubric-form.panels.d.ts +25 -0
  148. package/dist/lib/custom/Rubrics/rubric-form.panels.d.ts.map +1 -0
  149. package/dist/lib/custom/Rubrics/rubric-form.panels.js +299 -0
  150. package/dist/lib/custom/Rubrics/rubric-form.panels.js.map +1 -0
  151. package/dist/lib/custom/Rubrics/scale-form.component.d.ts +31 -0
  152. package/dist/lib/custom/Rubrics/scale-form.component.d.ts.map +1 -0
  153. package/dist/lib/custom/Rubrics/scale-form.component.js +395 -0
  154. package/dist/lib/custom/Rubrics/scale-form.component.js.map +1 -0
  155. package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts +1 -1
  156. package/dist/lib/custom/SearchScopes/searchscope-form.component.js +4 -4
  157. package/dist/lib/custom/SearchScopes/searchscope-form.component.js.map +1 -1
  158. package/dist/lib/custom/SessionBridges/session-bridge-form.component.js.map +1 -1
  159. package/dist/lib/custom/Templates/template-param-dialog.component.d.ts +77 -13
  160. package/dist/lib/custom/Templates/template-param-dialog.component.d.ts.map +1 -1
  161. package/dist/lib/custom/Templates/template-param-dialog.component.js +196 -78
  162. package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
  163. package/dist/lib/custom/Templates/template-params-grid.component.d.ts +49 -7
  164. package/dist/lib/custom/Templates/template-params-grid.component.d.ts.map +1 -1
  165. package/dist/lib/custom/Templates/template-params-grid.component.js +132 -44
  166. package/dist/lib/custom/Templates/template-params-grid.component.js.map +1 -1
  167. package/dist/lib/custom/Templates/templates-form.component.d.ts +153 -19
  168. package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
  169. package/dist/lib/custom/Templates/templates-form.component.js +434 -217
  170. package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
  171. package/dist/lib/custom/Tests/entity-link-pill.component.d.ts +24 -4
  172. package/dist/lib/custom/Tests/entity-link-pill.component.d.ts.map +1 -1
  173. package/dist/lib/custom/Tests/entity-link-pill.component.js +64 -20
  174. package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
  175. package/dist/lib/custom/Tests/test-form.component.d.ts +223 -27
  176. package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
  177. package/dist/lib/custom/Tests/test-form.component.js +951 -530
  178. package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
  179. package/dist/lib/custom/Tests/test-run-checks.d.ts +2 -0
  180. package/dist/lib/custom/Tests/test-run-checks.d.ts.map +1 -1
  181. package/dist/lib/custom/Tests/test-run-checks.js +5 -1
  182. package/dist/lib/custom/Tests/test-run-checks.js.map +1 -1
  183. package/dist/lib/custom/Tests/test-run-feedback-form.component.d.ts +2 -0
  184. package/dist/lib/custom/Tests/test-run-feedback-form.component.d.ts.map +1 -1
  185. package/dist/lib/custom/Tests/test-run-feedback-form.component.js +5 -1
  186. package/dist/lib/custom/Tests/test-run-feedback-form.component.js.map +1 -1
  187. package/dist/lib/custom/Tests/test-run-form.component.d.ts +146 -18
  188. package/dist/lib/custom/Tests/test-run-form.component.d.ts.map +1 -1
  189. package/dist/lib/custom/Tests/test-run-form.component.js +362 -106
  190. package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
  191. package/dist/lib/custom/Tests/test-suite-form.component.d.ts +395 -47
  192. package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
  193. package/dist/lib/custom/Tests/test-suite-form.component.js +1719 -1007
  194. package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
  195. package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts +214 -26
  196. package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts.map +1 -1
  197. package/dist/lib/custom/Tests/test-suite-run-form.component.js +535 -159
  198. package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
  199. package/dist/lib/custom/Users/user-overview.panel.d.ts +1 -1
  200. package/dist/lib/custom/Users/user-overview.panel.js +3 -3
  201. package/dist/lib/custom/Users/user-overview.panel.js.map +1 -1
  202. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +208 -29
  203. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
  204. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +446 -138
  205. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
  206. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts +6 -0
  207. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts.map +1 -1
  208. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js +16 -4
  209. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js.map +1 -1
  210. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts +50 -6
  211. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
  212. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +84 -12
  213. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
  214. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts +89 -5
  215. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts.map +1 -1
  216. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +216 -70
  217. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js.map +1 -1
  218. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts +62 -3
  219. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts.map +1 -1
  220. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js +140 -42
  221. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js.map +1 -1
  222. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +81 -10
  223. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
  224. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +165 -37
  225. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  226. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +140 -15
  227. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
  228. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +326 -100
  229. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  230. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts +101 -15
  231. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts.map +1 -1
  232. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js +281 -97
  233. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js.map +1 -1
  234. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts +43 -25
  235. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts.map +1 -1
  236. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js +100 -64
  237. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js.map +1 -1
  238. package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts +14 -2
  239. package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts.map +1 -1
  240. package/dist/lib/custom/ai-agent-run/flow/constellation.component.js +71 -53
  241. package/dist/lib/custom/ai-agent-run/flow/constellation.component.js.map +1 -1
  242. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts +14 -2
  243. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts.map +1 -1
  244. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js +70 -52
  245. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js.map +1 -1
  246. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts +8 -0
  247. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts.map +1 -1
  248. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js +22 -6
  249. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js.map +1 -1
  250. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts +24 -2
  251. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts.map +1 -1
  252. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js +91 -59
  253. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js.map +1 -1
  254. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts +10 -2
  255. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts.map +1 -1
  256. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js +33 -17
  257. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js.map +1 -1
  258. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.d.ts +2 -0
  259. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.d.ts.map +1 -1
  260. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.js +34 -30
  261. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.js.map +1 -1
  262. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts +14 -2
  263. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts.map +1 -1
  264. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js +69 -51
  265. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js.map +1 -1
  266. package/dist/lib/custom/custom-forms.module.d.ts +56 -48
  267. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  268. package/dist/lib/custom/custom-forms.module.js +60 -0
  269. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  270. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts +38 -12
  271. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts.map +1 -1
  272. package/dist/lib/custom/shared/entity-selector-dialog.component.js +103 -51
  273. package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
  274. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
  275. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +61 -43
  276. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
  277. package/dist/lib/generated/Entities/MJAIAgentRubric/mjaiagentrubric.form.component.d.ts +10 -0
  278. package/dist/lib/generated/Entities/MJAIAgentRubric/mjaiagentrubric.form.component.d.ts.map +1 -0
  279. package/dist/lib/generated/Entities/MJAIAgentRubric/mjaiagentrubric.form.component.js +74 -0
  280. package/dist/lib/generated/Entities/MJAIAgentRubric/mjaiagentrubric.form.component.js.map +1 -0
  281. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.d.ts.map +1 -1
  282. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +37 -19
  283. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
  284. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.d.ts.map +1 -1
  285. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js +78 -52
  286. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
  287. package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js +76 -74
  288. package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js.map +1 -1
  289. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
  290. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +156 -84
  291. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
  292. package/dist/lib/generated/Entities/MJFeaturePipelineType/mjfeaturepipelinetype.form.component.d.ts +10 -0
  293. package/dist/lib/generated/Entities/MJFeaturePipelineType/mjfeaturepipelinetype.form.component.d.ts.map +1 -0
  294. package/dist/lib/generated/Entities/MJFeaturePipelineType/mjfeaturepipelinetype.form.component.js +62 -0
  295. package/dist/lib/generated/Entities/MJFeaturePipelineType/mjfeaturepipelinetype.form.component.js.map +1 -0
  296. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.d.ts.map +1 -1
  297. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js +24 -6
  298. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js.map +1 -1
  299. package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js +27 -25
  300. package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js.map +1 -1
  301. package/dist/lib/generated/Entities/MJRecordChange/mjrecordchange.form.component.d.ts.map +1 -1
  302. package/dist/lib/generated/Entities/MJRecordChange/mjrecordchange.form.component.js +24 -16
  303. package/dist/lib/generated/Entities/MJRecordChange/mjrecordchange.form.component.js.map +1 -1
  304. package/dist/lib/generated/Entities/MJRecordCloneLog/mjrecordclonelog.form.component.d.ts +10 -0
  305. package/dist/lib/generated/Entities/MJRecordCloneLog/mjrecordclonelog.form.component.d.ts.map +1 -0
  306. package/dist/lib/generated/Entities/MJRecordCloneLog/mjrecordclonelog.form.component.js +107 -0
  307. package/dist/lib/generated/Entities/MJRecordCloneLog/mjrecordclonelog.form.component.js.map +1 -0
  308. package/dist/lib/generated/Entities/MJRecordCloneLogItem/mjrecordclonelogitem.form.component.d.ts +10 -0
  309. package/dist/lib/generated/Entities/MJRecordCloneLogItem/mjrecordclonelogitem.form.component.d.ts.map +1 -0
  310. package/dist/lib/generated/Entities/MJRecordCloneLogItem/mjrecordclonelogitem.form.component.js +74 -0
  311. package/dist/lib/generated/Entities/MJRecordCloneLogItem/mjrecordclonelogitem.form.component.js.map +1 -0
  312. package/dist/lib/generated/Entities/MJRubric/mjrubric.form.component.d.ts +10 -0
  313. package/dist/lib/generated/Entities/MJRubric/mjrubric.form.component.d.ts.map +1 -0
  314. package/dist/lib/generated/Entities/MJRubric/mjrubric.form.component.js +135 -0
  315. package/dist/lib/generated/Entities/MJRubric/mjrubric.form.component.js.map +1 -0
  316. package/dist/lib/generated/Entities/MJRubricBand/mjrubricband.form.component.d.ts +10 -0
  317. package/dist/lib/generated/Entities/MJRubricBand/mjrubricband.form.component.d.ts.map +1 -0
  318. package/dist/lib/generated/Entities/MJRubricBand/mjrubricband.form.component.js +87 -0
  319. package/dist/lib/generated/Entities/MJRubricBand/mjrubricband.form.component.js.map +1 -0
  320. package/dist/lib/generated/Entities/MJRubricCategory/mjrubriccategory.form.component.d.ts +10 -0
  321. package/dist/lib/generated/Entities/MJRubricCategory/mjrubriccategory.form.component.d.ts.map +1 -0
  322. package/dist/lib/generated/Entities/MJRubricCategory/mjrubriccategory.form.component.js +107 -0
  323. package/dist/lib/generated/Entities/MJRubricCategory/mjrubriccategory.form.component.js.map +1 -0
  324. package/dist/lib/generated/Entities/MJRubricCriterion/mjrubriccriterion.form.component.d.ts +10 -0
  325. package/dist/lib/generated/Entities/MJRubricCriterion/mjrubriccriterion.form.component.d.ts.map +1 -0
  326. package/dist/lib/generated/Entities/MJRubricCriterion/mjrubriccriterion.form.component.js +155 -0
  327. package/dist/lib/generated/Entities/MJRubricCriterion/mjrubriccriterion.form.component.js.map +1 -0
  328. package/dist/lib/generated/Entities/MJRubricCriterionLevel/mjrubriccriterionlevel.form.component.d.ts +10 -0
  329. package/dist/lib/generated/Entities/MJRubricCriterionLevel/mjrubriccriterionlevel.form.component.d.ts.map +1 -0
  330. package/dist/lib/generated/Entities/MJRubricCriterionLevel/mjrubriccriterionlevel.form.component.js +62 -0
  331. package/dist/lib/generated/Entities/MJRubricCriterionLevel/mjrubriccriterionlevel.form.component.js.map +1 -0
  332. package/dist/lib/generated/Entities/MJRubricEvaluation/mjrubricevaluation.form.component.d.ts +10 -0
  333. package/dist/lib/generated/Entities/MJRubricEvaluation/mjrubricevaluation.form.component.d.ts.map +1 -0
  334. package/dist/lib/generated/Entities/MJRubricEvaluation/mjrubricevaluation.form.component.js +183 -0
  335. package/dist/lib/generated/Entities/MJRubricEvaluation/mjrubricevaluation.form.component.js.map +1 -0
  336. package/dist/lib/generated/Entities/MJRubricEvaluationScore/mjrubricevaluationscore.form.component.d.ts +10 -0
  337. package/dist/lib/generated/Entities/MJRubricEvaluationScore/mjrubricevaluationscore.form.component.d.ts.map +1 -0
  338. package/dist/lib/generated/Entities/MJRubricEvaluationScore/mjrubricevaluationscore.form.component.js +120 -0
  339. package/dist/lib/generated/Entities/MJRubricEvaluationScore/mjrubricevaluationscore.form.component.js.map +1 -0
  340. package/dist/lib/generated/Entities/MJRubricScale/mjrubricscale.form.component.d.ts +10 -0
  341. package/dist/lib/generated/Entities/MJRubricScale/mjrubricscale.form.component.d.ts.map +1 -0
  342. package/dist/lib/generated/Entities/MJRubricScale/mjrubricscale.form.component.js +107 -0
  343. package/dist/lib/generated/Entities/MJRubricScale/mjrubricscale.form.component.js.map +1 -0
  344. package/dist/lib/generated/Entities/MJRubricScaleLevel/mjrubricscalelevel.form.component.d.ts +10 -0
  345. package/dist/lib/generated/Entities/MJRubricScaleLevel/mjrubricscalelevel.form.component.d.ts.map +1 -0
  346. package/dist/lib/generated/Entities/MJRubricScaleLevel/mjrubricscalelevel.form.component.js +103 -0
  347. package/dist/lib/generated/Entities/MJRubricScaleLevel/mjrubricscalelevel.form.component.js.map +1 -0
  348. package/dist/lib/generated/Entities/MJRubricVersion/mjrubricversion.form.component.d.ts +10 -0
  349. package/dist/lib/generated/Entities/MJRubricVersion/mjrubricversion.form.component.d.ts.map +1 -0
  350. package/dist/lib/generated/Entities/MJRubricVersion/mjrubricversion.form.component.js +171 -0
  351. package/dist/lib/generated/Entities/MJRubricVersion/mjrubricversion.form.component.js.map +1 -0
  352. package/dist/lib/generated/Entities/MJTest/mjtest.form.component.d.ts.map +1 -1
  353. package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js +24 -16
  354. package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js.map +1 -1
  355. package/dist/lib/generated/Entities/MJTestSuite/mjtestsuite.form.component.js +27 -25
  356. package/dist/lib/generated/Entities/MJTestSuite/mjtestsuite.form.component.js.map +1 -1
  357. package/dist/lib/generated/Entities/MJTestSuiteRun/mjtestsuiterun.form.component.d.ts.map +1 -1
  358. package/dist/lib/generated/Entities/MJTestSuiteRun/mjtestsuiterun.form.component.js +19 -11
  359. package/dist/lib/generated/Entities/MJTestSuiteRun/mjtestsuiterun.form.component.js.map +1 -1
  360. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  361. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +209 -119
  362. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  363. package/dist/lib/generated/generated-forms.module.d.ts +436 -422
  364. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  365. package/dist/lib/generated/generated-forms.module.js +44 -2
  366. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  367. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts +5 -1
  368. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts.map +1 -1
  369. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js +11 -3
  370. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js.map +1 -1
  371. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.d.ts +2 -0
  372. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.d.ts.map +1 -1
  373. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js +16 -12
  374. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js.map +1 -1
  375. package/dist/lib/panels/content-sources/website-crawler-settings.panel.d.ts +1 -1
  376. package/dist/lib/panels/content-sources/website-crawler-settings.panel.js +2 -2
  377. package/dist/lib/panels/content-sources/website-crawler-settings.panel.js.map +1 -1
  378. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts +45 -19
  379. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts.map +1 -1
  380. package/dist/lib/panels/model-predictions/model-prediction.logic.js +95 -43
  381. package/dist/lib/panels/model-predictions/model-prediction.logic.js.map +1 -1
  382. package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts +20 -16
  383. package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts.map +1 -1
  384. package/dist/lib/panels/model-predictions/model-prediction.panel.js +73 -65
  385. package/dist/lib/panels/model-predictions/model-prediction.panel.js.map +1 -1
  386. package/dist/lib/panels/record-clone/entity-clone-config-editor.component.d.ts +116 -0
  387. package/dist/lib/panels/record-clone/entity-clone-config-editor.component.d.ts.map +1 -0
  388. package/dist/lib/panels/record-clone/entity-clone-config-editor.component.js +820 -0
  389. package/dist/lib/panels/record-clone/entity-clone-config-editor.component.js.map +1 -0
  390. package/dist/lib/shared/components/template-editor.component.d.ts +158 -15
  391. package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
  392. package/dist/lib/shared/components/template-editor.component.js +389 -127
  393. package/dist/lib/shared/components/template-editor.component.js.map +1 -1
  394. package/dist/public-api.d.ts +5 -0
  395. package/dist/public-api.d.ts.map +1 -1
  396. package/dist/public-api.js +5 -0
  397. package/dist/public-api.js.map +1 -1
  398. package/package.json +47 -42
@@ -144,7 +144,7 @@ function PromptSelectorDialogComponent_Conditional_3_Template(rf, ctx) { if (rf
144
144
  i0.ɵɵadvance(4);
145
145
  i0.ɵɵtextInterpolate1(" ", ((tmp_5_0 = i0.ɵɵpipeBind1(12, 14, ctx_r1.filteredPrompts$)) == null ? null : tmp_5_0.length) || 0, " prompt(s) ");
146
146
  i0.ɵɵadvance(2);
147
- i0.ɵɵconditional(ctx_r1.config.multiSelect && ctx_r1.selectedPrompts.size > 0 ? 13 : -1);
147
+ i0.ɵɵconditional(ctx_r1.config.MultiSelect && ctx_r1.selectedPrompts.size > 0 ? 13 : -1);
148
148
  i0.ɵɵadvance();
149
149
  i0.ɵɵclassProp("grid-view", ctx_r1.viewMode === "grid")("list-view", ctx_r1.viewMode === "list");
150
150
  i0.ɵɵadvance();
@@ -177,36 +177,100 @@ function PromptSelectorDialogComponent_Conditional_12_Template(rf, ctx) { if (rf
177
177
  * - Any other prompt selection scenario
178
178
  */
179
179
  export class PromptSelectorDialogComponent extends BaseAngularComponent {
180
+ /** @deprecated Use {@link Result}. */
181
+ get result() {
182
+ return this.Result;
183
+ }
184
+ /** @deprecated Use {@link Result}. */
185
+ set result(value) {
186
+ this.Result = value;
187
+ }
188
+ /** @deprecated Use {@link IsLoading$}. */
189
+ get isLoading$() {
190
+ return this.IsLoading$;
191
+ }
192
+ /** @deprecated Use {@link IsLoading$}. */
193
+ set isLoading$(value) {
194
+ this.IsLoading$ = value;
195
+ }
196
+ /** @deprecated Use {@link Prompts$}. */
197
+ get prompts$() {
198
+ return this.Prompts$;
199
+ }
200
+ /** @deprecated Use {@link Prompts$}. */
201
+ set prompts$(value) {
202
+ this.Prompts$ = value;
203
+ }
204
+ /** @deprecated Use {@link FilteredPrompts$}. */
205
+ get filteredPrompts$() {
206
+ return this.FilteredPrompts$;
207
+ }
208
+ /** @deprecated Use {@link FilteredPrompts$}. */
209
+ set filteredPrompts$(value) {
210
+ this.FilteredPrompts$ = value;
211
+ }
212
+ /** @deprecated Use {@link SearchControl}. */
213
+ get searchControl() {
214
+ return this.SearchControl;
215
+ }
216
+ /** @deprecated Use {@link SearchControl}. */
217
+ set searchControl(value) {
218
+ this.SearchControl = value;
219
+ }
220
+ /** @deprecated Use {@link SelectedPrompts}. */
221
+ get selectedPrompts() {
222
+ return this.SelectedPrompts;
223
+ }
224
+ /** @deprecated Use {@link SelectedPrompts}. */
225
+ set selectedPrompts(value) {
226
+ this.SelectedPrompts = value;
227
+ }
228
+ /** @deprecated Use {@link LinkedPrompts}. */
229
+ get linkedPrompts() {
230
+ return this.LinkedPrompts;
231
+ }
232
+ /** @deprecated Use {@link LinkedPrompts}. */
233
+ set linkedPrompts(value) {
234
+ this.LinkedPrompts = value;
235
+ }
236
+ /** @deprecated Use {@link ViewMode}. */
237
+ get viewMode() {
238
+ return this.ViewMode;
239
+ }
240
+ /** @deprecated Use {@link ViewMode}. */
241
+ set viewMode(value) {
242
+ this.ViewMode = value;
243
+ }
180
244
  constructor(cdr) {
181
245
  super();
182
246
  this.cdr = cdr;
183
247
  // Input configuration
184
- this.config = { title: 'Select Prompts' };
248
+ this.config = { Title: 'Select Prompts' };
185
249
  // State management
186
250
  this.destroy$ = new Subject();
187
- this.result = new Subject();
251
+ this.Result = new Subject();
188
252
  // Data and UI state
189
- this.isLoading$ = new BehaviorSubject(false);
190
- this.prompts$ = new BehaviorSubject([]);
191
- this.filteredPrompts$ = new BehaviorSubject([]);
253
+ this.IsLoading$ = new BehaviorSubject(false);
254
+ this.Prompts$ = new BehaviorSubject([]);
255
+ this.FilteredPrompts$ = new BehaviorSubject([]);
192
256
  // Search and selection
193
- this.searchControl = new FormControl('');
194
- this.selectedPrompts = new Set();
195
- this.linkedPrompts = new Set();
257
+ this.SearchControl = new FormControl('');
258
+ this.SelectedPrompts = new Set();
259
+ this.LinkedPrompts = new Set();
196
260
  // View mode
197
- this.viewMode = 'list';
261
+ this.ViewMode = 'list';
198
262
  this.DialogClose = new EventEmitter();
199
263
  }
200
264
  ngOnInit() {
201
265
  this.setupSearch();
202
266
  this.loadPrompts();
203
267
  // Initialize selected prompts if provided
204
- if (this.config.selectedPromptIds) {
205
- this.selectedPrompts = new Set(this.config.selectedPromptIds);
268
+ if (this.config.SelectedPromptIds) {
269
+ this.SelectedPrompts = new Set(this.config.SelectedPromptIds);
206
270
  }
207
271
  // Initialize linked prompts if provided
208
- if (this.config.linkedPromptIds) {
209
- this.linkedPrompts = new Set(this.config.linkedPromptIds);
272
+ if (this.config.LinkedPromptIds) {
273
+ this.LinkedPrompts = new Set(this.config.LinkedPromptIds);
210
274
  }
211
275
  }
212
276
  ngOnDestroy() {
@@ -214,20 +278,20 @@ export class PromptSelectorDialogComponent extends BaseAngularComponent {
214
278
  this.destroy$.complete();
215
279
  }
216
280
  setupSearch() {
217
- this.searchControl.valueChanges
281
+ this.SearchControl.valueChanges
218
282
  .pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$))
219
283
  .subscribe(searchTerm => {
220
284
  this.filterPrompts(searchTerm || '');
221
285
  });
222
286
  }
223
287
  async loadPrompts() {
224
- this.isLoading$.next(true);
288
+ this.IsLoading$.next(true);
225
289
  try {
226
290
  const rv = RunView.FromMetadataProvider(this.ProviderToUse);
227
291
  // Build filter - default to active prompts
228
292
  let filter = "Status = 'Active'";
229
- if (this.config.extraFilter) {
230
- filter += ` AND ${this.config.extraFilter}`;
293
+ if (this.config.ExtraFilter) {
294
+ filter += ` AND ${this.config.ExtraFilter}`;
231
295
  }
232
296
  const result = await rv.RunView({
233
297
  EntityName: 'MJ: AI Prompts',
@@ -238,8 +302,8 @@ export class PromptSelectorDialogComponent extends BaseAngularComponent {
238
302
  });
239
303
  if (result.Success) {
240
304
  const prompts = result.Results || [];
241
- this.prompts$.next(prompts);
242
- this.filteredPrompts$.next(prompts);
305
+ this.Prompts$.next(prompts);
306
+ this.FilteredPrompts$.next(prompts);
243
307
  }
244
308
  else {
245
309
  throw new Error(result.ErrorMessage || 'Failed to load prompts');
@@ -248,59 +312,79 @@ export class PromptSelectorDialogComponent extends BaseAngularComponent {
248
312
  catch (error) {
249
313
  console.error('Error loading prompts:', error);
250
314
  MJNotificationService.Instance.CreateSimpleNotification('Error loading prompts. Please try again.', 'error', 3000);
251
- this.prompts$.next([]);
252
- this.filteredPrompts$.next([]);
315
+ this.Prompts$.next([]);
316
+ this.FilteredPrompts$.next([]);
253
317
  }
254
318
  finally {
255
- this.isLoading$.next(false);
319
+ this.IsLoading$.next(false);
256
320
  }
257
321
  }
258
322
  filterPrompts(searchTerm) {
259
- const allPrompts = this.prompts$.value;
323
+ const allPrompts = this.Prompts$.value;
260
324
  if (!searchTerm.trim()) {
261
- this.filteredPrompts$.next(allPrompts);
325
+ this.FilteredPrompts$.next(allPrompts);
262
326
  return;
263
327
  }
264
328
  const filtered = allPrompts.filter(prompt => prompt.Name?.toLowerCase().includes(searchTerm.toLowerCase()) ||
265
329
  prompt.Description?.toLowerCase().includes(searchTerm.toLowerCase()));
266
- this.filteredPrompts$.next(filtered);
330
+ this.FilteredPrompts$.next(filtered);
267
331
  }
268
332
  // === Selection Management ===
269
- togglePromptSelection(prompt) {
333
+ TogglePromptSelection(prompt) {
270
334
  // Prevent selection of already linked prompts
271
- if (this.isPromptLinked(prompt)) {
335
+ if (this.IsPromptLinked(prompt)) {
272
336
  MJNotificationService.Instance.CreateSimpleNotification(`"${prompt.Name}" is already linked to this agent`, 'info', 2000);
273
337
  return;
274
338
  }
275
- if (this.config.multiSelect) {
276
- if (this.selectedPrompts.has(prompt.ID)) {
277
- this.selectedPrompts.delete(prompt.ID);
339
+ if (this.config.MultiSelect) {
340
+ if (this.SelectedPrompts.has(prompt.ID)) {
341
+ this.SelectedPrompts.delete(prompt.ID);
278
342
  }
279
343
  else {
280
- this.selectedPrompts.add(prompt.ID);
344
+ this.SelectedPrompts.add(prompt.ID);
281
345
  }
282
346
  }
283
347
  else {
284
348
  // Single select - replace current selection
285
- this.selectedPrompts.clear();
286
- this.selectedPrompts.add(prompt.ID);
349
+ this.SelectedPrompts.clear();
350
+ this.SelectedPrompts.add(prompt.ID);
287
351
  }
288
352
  }
353
+ /** @deprecated Use {@link TogglePromptSelection}. */
354
+ togglePromptSelection(prompt) {
355
+ return this.TogglePromptSelection(prompt);
356
+ }
357
+ IsPromptSelected(prompt) {
358
+ return this.SelectedPrompts.has(prompt.ID);
359
+ }
360
+ /** @deprecated Use {@link IsPromptSelected}. */
289
361
  isPromptSelected(prompt) {
290
- return this.selectedPrompts.has(prompt.ID);
362
+ return this.IsPromptSelected(prompt);
363
+ }
364
+ IsPromptLinked(prompt) {
365
+ return this.LinkedPrompts.has(prompt.ID);
291
366
  }
367
+ /** @deprecated Use {@link IsPromptLinked}. */
292
368
  isPromptLinked(prompt) {
293
- return this.linkedPrompts.has(prompt.ID);
369
+ return this.IsPromptLinked(prompt);
294
370
  }
371
+ GetSelectedPromptObjects() {
372
+ const allPrompts = this.Prompts$.value;
373
+ return allPrompts.filter(prompt => this.SelectedPrompts.has(prompt.ID));
374
+ }
375
+ /** @deprecated Use {@link GetSelectedPromptObjects}. */
295
376
  getSelectedPromptObjects() {
296
- const allPrompts = this.prompts$.value;
297
- return allPrompts.filter(prompt => this.selectedPrompts.has(prompt.ID));
377
+ return this.GetSelectedPromptObjects();
298
378
  }
299
379
  // === UI Helpers ===
380
+ ToggleViewMode() {
381
+ this.ViewMode = this.ViewMode === 'grid' ? 'list' : 'grid';
382
+ }
383
+ /** @deprecated Use {@link ToggleViewMode}. */
300
384
  toggleViewMode() {
301
- this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';
385
+ return this.ToggleViewMode();
302
386
  }
303
- getPromptStatusColor(prompt) {
387
+ GetPromptStatusColor(prompt) {
304
388
  switch (prompt.Status) {
305
389
  case 'Active': return 'var(--mj-status-success)';
306
390
  case 'Pending': return 'var(--mj-status-warning)';
@@ -308,32 +392,48 @@ export class PromptSelectorDialogComponent extends BaseAngularComponent {
308
392
  default: return 'var(--mj-text-muted)';
309
393
  }
310
394
  }
311
- getPromptStatusText(prompt) {
395
+ /** @deprecated Use {@link GetPromptStatusColor}. */
396
+ getPromptStatusColor(prompt) {
397
+ return this.GetPromptStatusColor(prompt);
398
+ }
399
+ GetPromptStatusText(prompt) {
312
400
  return prompt.Status || 'Unknown';
313
401
  }
402
+ /** @deprecated Use {@link GetPromptStatusText}. */
403
+ getPromptStatusText(prompt) {
404
+ return this.GetPromptStatusText(prompt);
405
+ }
314
406
  // === Dialog Actions ===
315
- selectPrompts() {
316
- const selectedPromptObjects = this.getSelectedPromptObjects();
407
+ SelectPrompts() {
408
+ const selectedPromptObjects = this.GetSelectedPromptObjects();
317
409
  if (selectedPromptObjects.length === 0) {
318
410
  MJNotificationService.Instance.CreateSimpleNotification('Please select at least one prompt', 'warning', 2000);
319
411
  return;
320
412
  }
321
413
  const result = {
322
- selectedPrompts: selectedPromptObjects
414
+ SelectedPrompts: selectedPromptObjects
323
415
  };
324
- this.result.next(result);
416
+ this.Result.next(result);
325
417
  this.DialogClose.emit();
326
418
  }
327
- createNew() {
419
+ /** @deprecated Use {@link SelectPrompts}. */
420
+ selectPrompts() {
421
+ return this.SelectPrompts();
422
+ }
423
+ CreateNew() {
328
424
  const result = {
329
- selectedPrompts: [],
425
+ SelectedPrompts: [],
330
426
  createNew: true
331
427
  };
332
- this.result.next(result);
428
+ this.Result.next(result);
333
429
  this.DialogClose.emit();
334
430
  }
431
+ /** @deprecated Use {@link CreateNew}. */
432
+ createNew() {
433
+ return this.CreateNew();
434
+ }
335
435
  cancel() {
336
- this.result.next(null);
436
+ this.Result.next(null);
337
437
  this.DialogClose.emit();
338
438
  }
339
439
  static { this.ɵfac = function PromptSelectorDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PromptSelectorDialogComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; }
@@ -357,16 +457,16 @@ export class PromptSelectorDialogComponent extends BaseAngularComponent {
357
457
  i0.ɵɵadvance();
358
458
  i0.ɵɵconditional(i0.ɵɵpipeBind1(2, 4, ctx.isLoading$) ? 1 : 3);
359
459
  i0.ɵɵadvance(5);
360
- i0.ɵɵconditional(ctx.config.showCreateNew ? 6 : -1);
460
+ i0.ɵɵconditional(ctx.config.ShowCreateNew ? 6 : -1);
361
461
  i0.ɵɵadvance(4);
362
462
  i0.ɵɵproperty("disabled", ctx.selectedPrompts.size === 0);
363
463
  i0.ɵɵadvance();
364
- i0.ɵɵconditional(ctx.config.multiSelect ? 11 : 12);
464
+ i0.ɵɵconditional(ctx.config.MultiSelect ? 11 : 12);
365
465
  } }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.FormControlDirective, i2.MJEmptyStateComponent, i2.MJButtonDirective, i3.AsyncPipe, i3.DatePipe], styles: [".prompt-selector-dialog[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n max-height: 70vh;\n}\n\n\n[_nghost-%COMP%] .k-dialog, \n[_nghost-%COMP%] .k-window {\n z-index: 10000 !important;\n}\n\n[_nghost-%COMP%] .k-overlay {\n z-index: 9999 !important;\n}\n\n\n.loading-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-secondary);\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n\n.dialog-header[_ngcontent-%COMP%] {\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.search-section[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.search-box[_ngcontent-%COMP%] {\n flex: 1;\n position: relative;\n}\n\n.search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-secondary);\n z-index: 2;\n}\n\n.search-input[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.search-input[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n padding-left: 36px !important;\n}\n\n.view-controls[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%] {\n background-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n\n.results-summary[_ngcontent-%COMP%] {\n padding: 12px 16px;\n background: var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.results-count[_ngcontent-%COMP%], .selected-count[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.selected-count[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n\n.prompts-container[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n\n.prompts-container.list-view[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n\n.prompts-container.grid-view[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n}\n\n\n.prompt-card[_ngcontent-%COMP%] {\n border: 2px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n display: flex;\n gap: 12px;\n position: relative;\n}\n\n.prompt-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.prompt-card.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, var(--mj-bg-surface));\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n}\n\n.prompt-card.linked[_ngcontent-%COMP%] {\n border-color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n opacity: 0.7;\n cursor: not-allowed;\n}\n\n.prompt-card.linked[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-text-muted);\n box-shadow: none;\n}\n\n\n.selection-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n margin-top: 2px;\n}\n\n.selected-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 18px;\n}\n\n.unselected-icon[_ngcontent-%COMP%] {\n color: var(--mj-border-strong);\n font-size: 18px;\n}\n\n.linked-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 18px;\n}\n\n\n.prompt-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.prompt-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 8px;\n}\n\n.prompt-name[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n line-height: 1.4;\n flex: 1;\n}\n\n.prompt-badges[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n align-items: center;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-inverse);\n white-space: nowrap;\n}\n\n.linked-badge[_ngcontent-%COMP%] {\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n background: var(--mj-text-muted);\n color: var(--mj-text-inverse);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.prompt-description[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n color: var(--mj-text-secondary);\n font-size: 14px;\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n\n.prompt-metadata[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: var(--mj-text-disabled);\n flex-wrap: wrap;\n}\n\n.metadata-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.metadata-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 12px;\n font-size: 10px;\n}\n\n\n.prompts-container[_ngcontent-%COMP%] mj-empty-state[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n width: 100%;\n}\n\n\n.dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.footer-left[_ngcontent-%COMP%] {\n display: flex;\n}\n\n.footer-right[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n\n@media (max-width: 768px) {\n .prompts-container.grid-view[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .prompt-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n\n .search-section[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 8px;\n }\n\n .view-controls[_ngcontent-%COMP%] {\n align-self: flex-end;\n }\n}"] }); }
366
466
  }
367
467
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PromptSelectorDialogComponent, [{
368
468
  type: Component,
369
- args: [{ standalone: false, selector: 'mj-prompt-selector-dialog', template: "<!-- Prompt Selector Dialog -->\n<div class=\"prompt-selector-dialog\">\n \n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-state\">\n <div class=\"loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin fa-2x\"></i>\n </div>\n <p>Loading prompts...</p>\n </div>\n } @else {\n \n <!-- Search and Controls Header -->\n <div class=\"dialog-header\">\n <div class=\"search-section\">\n <div class=\"search-box\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n class=\"mj-input search-input\"\n [formControl]=\"searchControl\"\n placeholder=\"Search prompts by name or description...\">\n </div>\n \n <div class=\"view-controls\">\n <button mjButton\n variant=\"flat\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"toggleViewMode()\"\n title=\"Toggle between list and grid view\">\n <i class=\"fa-solid\" [class.fa-list]=\"viewMode === 'grid'\" [class.fa-th]=\"viewMode === 'list'\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Results Summary -->\n <div class=\"results-summary\">\n <span class=\"results-count\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n {{ (filteredPrompts$ | async)?.length || 0 }} prompt(s)\n </span>\n @if (config.multiSelect && selectedPrompts.size > 0) {\n <span class=\"selected-count\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{ selectedPrompts.size }} selected\n </span>\n }\n </div>\n\n <!-- Prompts List/Grid -->\n <div class=\"prompts-container\" [class.grid-view]=\"viewMode === 'grid'\" [class.list-view]=\"viewMode === 'list'\">\n @if ((filteredPrompts$ | async)?.length === 0) {\n <mj-empty-state\n Variant=\"no-results\"\n Title=\"No prompts found\"\n Message=\"Try adjusting your search criteria or check that prompts are properly configured.\"\n Size=\"compact\" />\n } @else {\n @for (prompt of filteredPrompts$ | async; track prompt.ID) {\n <div class=\"prompt-card\" \n [class.selected]=\"isPromptSelected(prompt)\"\n [class.linked]=\"isPromptLinked(prompt)\"\n (click)=\"togglePromptSelection(prompt)\">\n \n <!-- Selection indicator -->\n <div class=\"selection-indicator\">\n @if (isPromptLinked(prompt)) {\n <i class=\"fa-solid fa-link linked-icon\" title=\"Already linked to this agent\"></i>\n } @else if (isPromptSelected(prompt)) {\n <i class=\"fa-solid fa-check-circle selected-icon\"></i>\n } @else {\n <i class=\"fa-regular fa-circle unselected-icon\"></i>\n }\n </div>\n\n <!-- Prompt Content -->\n <div class=\"prompt-content\">\n <div class=\"prompt-header\">\n <h4 class=\"prompt-name\">{{ prompt.Name }}</h4>\n <div class=\"prompt-badges\">\n @if (isPromptLinked(prompt)) {\n <span class=\"linked-badge\">\n <i class=\"fa-solid fa-link\"></i>\n Linked\n </span>\n }\n <span class=\"status-badge\" \n [style.background-color]=\"getPromptStatusColor(prompt)\">\n {{ getPromptStatusText(prompt) }}\n </span>\n </div>\n </div>\n\n @if (prompt.Description) {\n <p class=\"prompt-description\">{{ prompt.Description }}</p>\n }\n\n <!-- Prompt Metadata -->\n <div class=\"prompt-metadata\">\n @if (prompt.__mj_CreatedAt) {\n <span class=\"metadata-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n Created {{ prompt.__mj_CreatedAt | date:'short' }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n }\n </div>\n }\n\n <!-- Dialog Footer -->\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n @if (config.showCreateNew) {\n <button mjButton\n variant=\"flat\"\n (click)=\"createNew()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New Prompt\n </button>\n }\n </div>\n \n <div class=\"footer-right\">\n <button mjButton\n variant=\"flat\"\n (click)=\"cancel()\">\n Cancel\n </button>\n\n <button mjButton\n variant=\"primary\"\n (click)=\"selectPrompts()\"\n [disabled]=\"selectedPrompts.size === 0\">\n @if (config.multiSelect) {\n <i class=\"fa-solid fa-check\"></i>\n Add {{ selectedPrompts.size }} Prompt{{ selectedPrompts.size === 1 ? '' : 's' }}\n } @else {\n <i class=\"fa-solid fa-check\"></i>\n Select Prompt\n }\n </button>\n </div>\n </div>\n</div>", styles: [".prompt-selector-dialog {\n display: flex;\n flex-direction: column;\n height: 100%;\n max-height: 70vh;\n}\n\n/* Ensure dialog appears above banner and other elements */\n:host ::ng-deep .k-dialog,\n:host ::ng-deep .k-window {\n z-index: 10000 !important;\n}\n\n:host ::ng-deep .k-overlay {\n z-index: 9999 !important;\n}\n\n/* === Loading State === */\n.loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-secondary);\n}\n\n.loading-spinner {\n margin-bottom: 16px;\n}\n\n/* === Header Section === */\n.dialog-header {\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.search-section {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.search-box {\n flex: 1;\n position: relative;\n}\n\n.search-icon {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-secondary);\n z-index: 2;\n}\n\n.search-input {\n width: 100%;\n}\n\n.search-input input {\n padding-left: 36px !important;\n}\n\n.view-controls button.active {\n background-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n/* === Results Summary === */\n.results-summary {\n padding: 12px 16px;\n background: var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.results-count, .selected-count {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.selected-count {\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n/* === Prompts Container === */\n.prompts-container {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n/* List View */\n.prompts-container.list-view {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n/* Grid View */\n.prompts-container.grid-view {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n}\n\n/* === Prompt Cards === */\n.prompt-card {\n border: 2px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n display: flex;\n gap: 12px;\n position: relative;\n}\n\n.prompt-card:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.prompt-card.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, var(--mj-bg-surface));\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n}\n\n.prompt-card.linked {\n border-color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n opacity: 0.7;\n cursor: not-allowed;\n}\n\n.prompt-card.linked:hover {\n border-color: var(--mj-text-muted);\n box-shadow: none;\n}\n\n/* === Selection Indicator === */\n.selection-indicator {\n display: flex;\n align-items: flex-start;\n margin-top: 2px;\n}\n\n.selected-icon {\n color: var(--mj-brand-primary);\n font-size: 18px;\n}\n\n.unselected-icon {\n color: var(--mj-border-strong);\n font-size: 18px;\n}\n\n.linked-icon {\n color: var(--mj-text-muted);\n font-size: 18px;\n}\n\n/* === Prompt Content === */\n.prompt-content {\n flex: 1;\n min-width: 0;\n}\n\n.prompt-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 8px;\n}\n\n.prompt-name {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n line-height: 1.4;\n flex: 1;\n}\n\n.prompt-badges {\n display: flex;\n gap: 6px;\n align-items: center;\n}\n\n.status-badge {\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-inverse);\n white-space: nowrap;\n}\n\n.linked-badge {\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n background: var(--mj-text-muted);\n color: var(--mj-text-inverse);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.prompt-description {\n margin: 0 0 12px 0;\n color: var(--mj-text-secondary);\n font-size: 14px;\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* === Prompt Metadata === */\n.prompt-metadata {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: var(--mj-text-disabled);\n flex-wrap: wrap;\n}\n\n.metadata-item {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.metadata-item i {\n width: 12px;\n font-size: 10px;\n}\n\n/* No-results empty state spans the full container in grid view */\n.prompts-container mj-empty-state {\n grid-column: 1 / -1;\n width: 100%;\n}\n\n/* === Dialog Footer === */\n.dialog-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.footer-left {\n display: flex;\n}\n\n.footer-right {\n display: flex;\n gap: 8px;\n}\n\n/* === Responsive Design === */\n@media (max-width: 768px) {\n .prompts-container.grid-view {\n grid-template-columns: 1fr;\n }\n\n .prompt-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n\n .search-section {\n flex-direction: column;\n gap: 8px;\n }\n\n .view-controls {\n align-self: flex-end;\n }\n}\n"] }]
469
+ args: [{ standalone: false, selector: 'mj-prompt-selector-dialog', template: "<!-- Prompt Selector Dialog -->\n<div class=\"prompt-selector-dialog\">\n \n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-state\">\n <div class=\"loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin fa-2x\"></i>\n </div>\n <p>Loading prompts...</p>\n </div>\n } @else {\n \n <!-- Search and Controls Header -->\n <div class=\"dialog-header\">\n <div class=\"search-section\">\n <div class=\"search-box\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n class=\"mj-input search-input\"\n [formControl]=\"searchControl\"\n placeholder=\"Search prompts by name or description...\">\n </div>\n \n <div class=\"view-controls\">\n <button mjButton\n variant=\"flat\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"toggleViewMode()\"\n title=\"Toggle between list and grid view\">\n <i class=\"fa-solid\" [class.fa-list]=\"viewMode === 'grid'\" [class.fa-th]=\"viewMode === 'list'\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Results Summary -->\n <div class=\"results-summary\">\n <span class=\"results-count\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n {{ (filteredPrompts$ | async)?.length || 0 }} prompt(s)\n </span>\n @if (config.MultiSelect && selectedPrompts.size > 0) {\n <span class=\"selected-count\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{ selectedPrompts.size }} selected\n </span>\n }\n </div>\n\n <!-- Prompts List/Grid -->\n <div class=\"prompts-container\" [class.grid-view]=\"viewMode === 'grid'\" [class.list-view]=\"viewMode === 'list'\">\n @if ((filteredPrompts$ | async)?.length === 0) {\n <mj-empty-state\n Variant=\"no-results\"\n Title=\"No prompts found\"\n Message=\"Try adjusting your search criteria or check that prompts are properly configured.\"\n Size=\"compact\" />\n } @else {\n @for (prompt of filteredPrompts$ | async; track prompt.ID) {\n <div class=\"prompt-card\" \n [class.selected]=\"isPromptSelected(prompt)\"\n [class.linked]=\"isPromptLinked(prompt)\"\n (click)=\"togglePromptSelection(prompt)\">\n \n <!-- Selection indicator -->\n <div class=\"selection-indicator\">\n @if (isPromptLinked(prompt)) {\n <i class=\"fa-solid fa-link linked-icon\" title=\"Already linked to this agent\"></i>\n } @else if (isPromptSelected(prompt)) {\n <i class=\"fa-solid fa-check-circle selected-icon\"></i>\n } @else {\n <i class=\"fa-regular fa-circle unselected-icon\"></i>\n }\n </div>\n\n <!-- Prompt Content -->\n <div class=\"prompt-content\">\n <div class=\"prompt-header\">\n <h4 class=\"prompt-name\">{{ prompt.Name }}</h4>\n <div class=\"prompt-badges\">\n @if (isPromptLinked(prompt)) {\n <span class=\"linked-badge\">\n <i class=\"fa-solid fa-link\"></i>\n Linked\n </span>\n }\n <span class=\"status-badge\" \n [style.background-color]=\"getPromptStatusColor(prompt)\">\n {{ getPromptStatusText(prompt) }}\n </span>\n </div>\n </div>\n\n @if (prompt.Description) {\n <p class=\"prompt-description\">{{ prompt.Description }}</p>\n }\n\n <!-- Prompt Metadata -->\n <div class=\"prompt-metadata\">\n @if (prompt.__mj_CreatedAt) {\n <span class=\"metadata-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n Created {{ prompt.__mj_CreatedAt | date:'short' }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n }\n </div>\n }\n\n <!-- Dialog Footer -->\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n @if (config.ShowCreateNew) {\n <button mjButton\n variant=\"flat\"\n (click)=\"createNew()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New Prompt\n </button>\n }\n </div>\n \n <div class=\"footer-right\">\n <button mjButton\n variant=\"flat\"\n (click)=\"cancel()\">\n Cancel\n </button>\n\n <button mjButton\n variant=\"primary\"\n (click)=\"selectPrompts()\"\n [disabled]=\"selectedPrompts.size === 0\">\n @if (config.MultiSelect) {\n <i class=\"fa-solid fa-check\"></i>\n Add {{ selectedPrompts.size }} Prompt{{ selectedPrompts.size === 1 ? '' : 's' }}\n } @else {\n <i class=\"fa-solid fa-check\"></i>\n Select Prompt\n }\n </button>\n </div>\n </div>\n</div>", styles: [".prompt-selector-dialog {\n display: flex;\n flex-direction: column;\n height: 100%;\n max-height: 70vh;\n}\n\n/* Ensure dialog appears above banner and other elements */\n:host ::ng-deep .k-dialog,\n:host ::ng-deep .k-window {\n z-index: 10000 !important;\n}\n\n:host ::ng-deep .k-overlay {\n z-index: 9999 !important;\n}\n\n/* === Loading State === */\n.loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-secondary);\n}\n\n.loading-spinner {\n margin-bottom: 16px;\n}\n\n/* === Header Section === */\n.dialog-header {\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.search-section {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.search-box {\n flex: 1;\n position: relative;\n}\n\n.search-icon {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-secondary);\n z-index: 2;\n}\n\n.search-input {\n width: 100%;\n}\n\n.search-input input {\n padding-left: 36px !important;\n}\n\n.view-controls button.active {\n background-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n/* === Results Summary === */\n.results-summary {\n padding: 12px 16px;\n background: var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.results-count, .selected-count {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.selected-count {\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n/* === Prompts Container === */\n.prompts-container {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n/* List View */\n.prompts-container.list-view {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n/* Grid View */\n.prompts-container.grid-view {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n}\n\n/* === Prompt Cards === */\n.prompt-card {\n border: 2px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n display: flex;\n gap: 12px;\n position: relative;\n}\n\n.prompt-card:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.prompt-card.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, var(--mj-bg-surface));\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n}\n\n.prompt-card.linked {\n border-color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n opacity: 0.7;\n cursor: not-allowed;\n}\n\n.prompt-card.linked:hover {\n border-color: var(--mj-text-muted);\n box-shadow: none;\n}\n\n/* === Selection Indicator === */\n.selection-indicator {\n display: flex;\n align-items: flex-start;\n margin-top: 2px;\n}\n\n.selected-icon {\n color: var(--mj-brand-primary);\n font-size: 18px;\n}\n\n.unselected-icon {\n color: var(--mj-border-strong);\n font-size: 18px;\n}\n\n.linked-icon {\n color: var(--mj-text-muted);\n font-size: 18px;\n}\n\n/* === Prompt Content === */\n.prompt-content {\n flex: 1;\n min-width: 0;\n}\n\n.prompt-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 8px;\n}\n\n.prompt-name {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n line-height: 1.4;\n flex: 1;\n}\n\n.prompt-badges {\n display: flex;\n gap: 6px;\n align-items: center;\n}\n\n.status-badge {\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-inverse);\n white-space: nowrap;\n}\n\n.linked-badge {\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n background: var(--mj-text-muted);\n color: var(--mj-text-inverse);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.prompt-description {\n margin: 0 0 12px 0;\n color: var(--mj-text-secondary);\n font-size: 14px;\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* === Prompt Metadata === */\n.prompt-metadata {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: var(--mj-text-disabled);\n flex-wrap: wrap;\n}\n\n.metadata-item {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.metadata-item i {\n width: 12px;\n font-size: 10px;\n}\n\n/* No-results empty state spans the full container in grid view */\n.prompts-container mj-empty-state {\n grid-column: 1 / -1;\n width: 100%;\n}\n\n/* === Dialog Footer === */\n.dialog-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.footer-left {\n display: flex;\n}\n\n.footer-right {\n display: flex;\n gap: 8px;\n}\n\n/* === Responsive Design === */\n@media (max-width: 768px) {\n .prompts-container.grid-view {\n grid-template-columns: 1fr;\n }\n\n .prompt-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n\n .search-section {\n flex-direction: column;\n gap: 8px;\n }\n\n .view-controls {\n align-self: flex-end;\n }\n}\n"] }]
370
470
  }], () => [{ type: i0.ChangeDetectorRef }], { DialogClose: [{
371
471
  type: Output
372
472
  }] }); })();
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-selector-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgents/prompt-selector-dialog.component.ts","../../../../src/lib/custom/AIAgents/prompt-selector-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, Output, EventEmitter } from '@angular/core';\nimport { Subject, BehaviorSubject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\nimport { FormControl } from '@angular/forms';\nimport { RunView } from '@memberjunction/core';\nimport { MJAIPromptEntityExtended } from '@memberjunction/ai-core-plus';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nexport interface PromptSelectorConfig {\n /** Title for the dialog */\n title: string;\n /** Whether to show the \"Create New\" option */\n showCreateNew?: boolean;\n /** Filter criteria for prompts */\n extraFilter?: string;\n /** Allow multiple selection */\n multiSelect?: boolean;\n /** Pre-selected prompt IDs */\n selectedPromptIds?: string[];\n /** Already linked prompt IDs (will be grayed out and not selectable) */\n linkedPromptIds?: string[];\n}\n\nexport interface PromptSelectorResult {\n /** Selected prompts */\n selectedPrompts: MJAIPromptEntityExtended[];\n /** Whether user chose to create new */\n createNew?: boolean;\n}\n\n/**\n * Unified prompt selector dialog that can be used for:\n * - Selecting context compression prompts (single select)\n * - Adding general prompts to agents (multi-select)\n * - Any other prompt selection scenario\n */\n@Component({\n standalone: false,\n selector: 'mj-prompt-selector-dialog',\n templateUrl: './prompt-selector-dialog.component.html',\n styleUrls: ['./prompt-selector-dialog.component.css']\n})\nexport class PromptSelectorDialogComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n \n // Input configuration\n config: PromptSelectorConfig = { title: 'Select Prompts' };\n \n // State management\n private destroy$ = new Subject<void>();\n public result = new Subject<PromptSelectorResult | null>();\n \n // Data and UI state\n isLoading$ = new BehaviorSubject<boolean>(false);\n prompts$ = new BehaviorSubject<MJAIPromptEntityExtended[]>([]);\n filteredPrompts$ = new BehaviorSubject<MJAIPromptEntityExtended[]>([]);\n \n // Search and selection\n searchControl = new FormControl('');\n selectedPrompts: Set<string> = new Set();\n linkedPrompts: Set<string> = new Set();\n \n // View mode\n viewMode: 'grid' | 'list' = 'list';\n\n @Output() DialogClose = new EventEmitter<void>();\n\n constructor(\n private cdr: ChangeDetectorRef\n ) {\n super();}\n\n ngOnInit() {\n this.setupSearch();\n this.loadPrompts();\n \n // Initialize selected prompts if provided\n if (this.config.selectedPromptIds) {\n this.selectedPrompts = new Set(this.config.selectedPromptIds);\n }\n \n // Initialize linked prompts if provided\n if (this.config.linkedPromptIds) {\n this.linkedPrompts = new Set(this.config.linkedPromptIds);\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupSearch() {\n this.searchControl.valueChanges\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n )\n .subscribe(searchTerm => {\n this.filterPrompts(searchTerm || '');\n });\n }\n\n private async loadPrompts() {\n this.isLoading$.next(true);\n \n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n \n // Build filter - default to active prompts\n let filter = \"Status = 'Active'\";\n if (this.config.extraFilter) {\n filter += ` AND ${this.config.extraFilter}`;\n }\n \n const result = await rv.RunView<MJAIPromptEntityExtended>({\n EntityName: 'MJ: AI Prompts',\n ExtraFilter: filter,\n OrderBy: 'Name ASC',\n ResultType: 'entity_object',\n MaxRows: 1000\n });\n\n if (result.Success) {\n const prompts = result.Results || [];\n this.prompts$.next(prompts);\n this.filteredPrompts$.next(prompts);\n } else {\n throw new Error(result.ErrorMessage || 'Failed to load prompts');\n }\n } catch (error) {\n console.error('Error loading prompts:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error loading prompts. Please try again.',\n 'error',\n 3000\n );\n this.prompts$.next([]);\n this.filteredPrompts$.next([]);\n } finally {\n this.isLoading$.next(false);\n }\n }\n\n private filterPrompts(searchTerm: string) {\n const allPrompts = this.prompts$.value;\n \n if (!searchTerm.trim()) {\n this.filteredPrompts$.next(allPrompts);\n return;\n }\n\n const filtered = allPrompts.filter(prompt => \n prompt.Name?.toLowerCase().includes(searchTerm.toLowerCase()) ||\n prompt.Description?.toLowerCase().includes(searchTerm.toLowerCase())\n );\n \n this.filteredPrompts$.next(filtered);\n }\n\n // === Selection Management ===\n\n togglePromptSelection(prompt: MJAIPromptEntityExtended) {\n // Prevent selection of already linked prompts\n if (this.isPromptLinked(prompt)) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `\"${prompt.Name}\" is already linked to this agent`,\n 'info',\n 2000\n );\n return;\n }\n \n if (this.config.multiSelect) {\n if (this.selectedPrompts.has(prompt.ID)) {\n this.selectedPrompts.delete(prompt.ID);\n } else {\n this.selectedPrompts.add(prompt.ID);\n }\n } else {\n // Single select - replace current selection\n this.selectedPrompts.clear();\n this.selectedPrompts.add(prompt.ID);\n }\n }\n\n isPromptSelected(prompt: MJAIPromptEntityExtended): boolean {\n return this.selectedPrompts.has(prompt.ID);\n }\n\n isPromptLinked(prompt: MJAIPromptEntityExtended): boolean {\n return this.linkedPrompts.has(prompt.ID);\n }\n\n getSelectedPromptObjects(): MJAIPromptEntityExtended[] {\n const allPrompts = this.prompts$.value;\n return allPrompts.filter(prompt => this.selectedPrompts.has(prompt.ID));\n }\n\n // === UI Helpers ===\n\n toggleViewMode() {\n this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';\n }\n\n getPromptStatusColor(prompt: MJAIPromptEntityExtended): string {\n switch (prompt.Status) {\n case 'Active': return 'var(--mj-status-success)';\n case 'Pending': return 'var(--mj-status-warning)';\n case 'Disabled': return 'var(--mj-text-muted)';\n default: return 'var(--mj-text-muted)';\n }\n }\n\n getPromptStatusText(prompt: MJAIPromptEntityExtended): string {\n return prompt.Status || 'Unknown';\n }\n\n // === Dialog Actions ===\n\n selectPrompts() {\n const selectedPromptObjects = this.getSelectedPromptObjects();\n \n if (selectedPromptObjects.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please select at least one prompt',\n 'warning',\n 2000\n );\n return;\n }\n\n const result: PromptSelectorResult = {\n selectedPrompts: selectedPromptObjects\n };\n\n this.result.next(result);\n this.DialogClose.emit();\n }\n\n createNew() {\n const result: PromptSelectorResult = {\n selectedPrompts: [],\n createNew: true\n };\n\n this.result.next(result);\n this.DialogClose.emit();\n }\n\n cancel() {\n this.result.next(null);\n this.DialogClose.emit();\n }\n}","<!-- Prompt Selector Dialog -->\n<div class=\"prompt-selector-dialog\">\n \n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-state\">\n <div class=\"loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin fa-2x\"></i>\n </div>\n <p>Loading prompts...</p>\n </div>\n } @else {\n \n <!-- Search and Controls Header -->\n <div class=\"dialog-header\">\n <div class=\"search-section\">\n <div class=\"search-box\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n class=\"mj-input search-input\"\n [formControl]=\"searchControl\"\n placeholder=\"Search prompts by name or description...\">\n </div>\n \n <div class=\"view-controls\">\n <button mjButton\n variant=\"flat\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"toggleViewMode()\"\n title=\"Toggle between list and grid view\">\n <i class=\"fa-solid\" [class.fa-list]=\"viewMode === 'grid'\" [class.fa-th]=\"viewMode === 'list'\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Results Summary -->\n <div class=\"results-summary\">\n <span class=\"results-count\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n {{ (filteredPrompts$ | async)?.length || 0 }} prompt(s)\n </span>\n @if (config.multiSelect && selectedPrompts.size > 0) {\n <span class=\"selected-count\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{ selectedPrompts.size }} selected\n </span>\n }\n </div>\n\n <!-- Prompts List/Grid -->\n <div class=\"prompts-container\" [class.grid-view]=\"viewMode === 'grid'\" [class.list-view]=\"viewMode === 'list'\">\n @if ((filteredPrompts$ | async)?.length === 0) {\n <mj-empty-state\n Variant=\"no-results\"\n Title=\"No prompts found\"\n Message=\"Try adjusting your search criteria or check that prompts are properly configured.\"\n Size=\"compact\" />\n } @else {\n @for (prompt of filteredPrompts$ | async; track prompt.ID) {\n <div class=\"prompt-card\" \n [class.selected]=\"isPromptSelected(prompt)\"\n [class.linked]=\"isPromptLinked(prompt)\"\n (click)=\"togglePromptSelection(prompt)\">\n \n <!-- Selection indicator -->\n <div class=\"selection-indicator\">\n @if (isPromptLinked(prompt)) {\n <i class=\"fa-solid fa-link linked-icon\" title=\"Already linked to this agent\"></i>\n } @else if (isPromptSelected(prompt)) {\n <i class=\"fa-solid fa-check-circle selected-icon\"></i>\n } @else {\n <i class=\"fa-regular fa-circle unselected-icon\"></i>\n }\n </div>\n\n <!-- Prompt Content -->\n <div class=\"prompt-content\">\n <div class=\"prompt-header\">\n <h4 class=\"prompt-name\">{{ prompt.Name }}</h4>\n <div class=\"prompt-badges\">\n @if (isPromptLinked(prompt)) {\n <span class=\"linked-badge\">\n <i class=\"fa-solid fa-link\"></i>\n Linked\n </span>\n }\n <span class=\"status-badge\" \n [style.background-color]=\"getPromptStatusColor(prompt)\">\n {{ getPromptStatusText(prompt) }}\n </span>\n </div>\n </div>\n\n @if (prompt.Description) {\n <p class=\"prompt-description\">{{ prompt.Description }}</p>\n }\n\n <!-- Prompt Metadata -->\n <div class=\"prompt-metadata\">\n @if (prompt.__mj_CreatedAt) {\n <span class=\"metadata-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n Created {{ prompt.__mj_CreatedAt | date:'short' }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n }\n </div>\n }\n\n <!-- Dialog Footer -->\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n @if (config.showCreateNew) {\n <button mjButton\n variant=\"flat\"\n (click)=\"createNew()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New Prompt\n </button>\n }\n </div>\n \n <div class=\"footer-right\">\n <button mjButton\n variant=\"flat\"\n (click)=\"cancel()\">\n Cancel\n </button>\n\n <button mjButton\n variant=\"primary\"\n (click)=\"selectPrompts()\"\n [disabled]=\"selectedPrompts.size === 0\">\n @if (config.multiSelect) {\n <i class=\"fa-solid fa-check\"></i>\n Add {{ selectedPrompts.size }} Prompt{{ selectedPrompts.size === 1 ? '' : 's' }}\n } @else {\n <i class=\"fa-solid fa-check\"></i>\n Select Prompt\n }\n </button>\n </div>\n </div>\n</div>"]}
1
+ {"version":3,"file":"prompt-selector-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgents/prompt-selector-dialog.component.ts","../../../../src/lib/custom/AIAgents/prompt-selector-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, Output, EventEmitter } from '@angular/core';\nimport { Subject, BehaviorSubject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\nimport { FormControl } from '@angular/forms';\nimport { RunView } from '@memberjunction/core';\nimport { MJAIPromptEntityExtended } from '@memberjunction/ai-core-plus';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nexport interface PromptSelectorConfig {\n /** Title for the dialog */\n Title: string;\n /** Whether to show the \"Create New\" option */\n ShowCreateNew?: boolean;\n /** Filter criteria for prompts */\n ExtraFilter?: string;\n /** Allow multiple selection */\n MultiSelect?: boolean;\n /** Pre-selected prompt IDs */\n SelectedPromptIds?: string[];\n /** Already linked prompt IDs (will be grayed out and not selectable) */\n LinkedPromptIds?: string[];\n}\n\nexport interface PromptSelectorResult {\n /** Selected prompts */\n SelectedPrompts: MJAIPromptEntityExtended[];\n /** Whether user chose to create new */\n createNew?: boolean; // case-violation-ok-legacy-back-compat: optional, and the old name is also read off a value the checker cannot type; renaming it stays assignable and silently yields undefined\n}\n\n/**\n * Unified prompt selector dialog that can be used for:\n * - Selecting context compression prompts (single select)\n * - Adding general prompts to agents (multi-select)\n * - Any other prompt selection scenario\n */\n@Component({\n standalone: false,\n selector: 'mj-prompt-selector-dialog',\n templateUrl: './prompt-selector-dialog.component.html',\n styleUrls: ['./prompt-selector-dialog.component.css']\n})\nexport class PromptSelectorDialogComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n \n // Input configuration\n config: PromptSelectorConfig = { Title: 'Select Prompts' };\n \n // State management\n private destroy$ = new Subject<void>();\n public Result = new Subject<PromptSelectorResult | null>();\n\n /** @deprecated Use {@link Result}. */\n public get result() {\n return this.Result;\n }\n /** @deprecated Use {@link Result}. */\n public set result(value) {\n this.Result = value;\n }\n \n // Data and UI state\n IsLoading$ = new BehaviorSubject<boolean>(false);\n\n /** @deprecated Use {@link IsLoading$}. */\n get isLoading$() {\n return this.IsLoading$;\n }\n /** @deprecated Use {@link IsLoading$}. */\n set isLoading$(value) {\n this.IsLoading$ = value;\n }\n Prompts$ = new BehaviorSubject<MJAIPromptEntityExtended[]>([]);\n\n /** @deprecated Use {@link Prompts$}. */\n get prompts$() {\n return this.Prompts$;\n }\n /** @deprecated Use {@link Prompts$}. */\n set prompts$(value) {\n this.Prompts$ = value;\n }\n FilteredPrompts$ = new BehaviorSubject<MJAIPromptEntityExtended[]>([]);\n\n /** @deprecated Use {@link FilteredPrompts$}. */\n get filteredPrompts$() {\n return this.FilteredPrompts$;\n }\n /** @deprecated Use {@link FilteredPrompts$}. */\n set filteredPrompts$(value) {\n this.FilteredPrompts$ = value;\n }\n \n // Search and selection\n SearchControl = new FormControl('');\n\n /** @deprecated Use {@link SearchControl}. */\n get searchControl() {\n return this.SearchControl;\n }\n /** @deprecated Use {@link SearchControl}. */\n set searchControl(value) {\n this.SearchControl = value;\n }\n SelectedPrompts: Set<string> = new Set();\n\n /** @deprecated Use {@link SelectedPrompts}. */\n get selectedPrompts(): Set<string> {\n return this.SelectedPrompts;\n }\n /** @deprecated Use {@link SelectedPrompts}. */\n set selectedPrompts(value: Set<string>) {\n this.SelectedPrompts = value;\n }\n LinkedPrompts: Set<string> = new Set();\n\n /** @deprecated Use {@link LinkedPrompts}. */\n get linkedPrompts(): Set<string> {\n return this.LinkedPrompts;\n }\n /** @deprecated Use {@link LinkedPrompts}. */\n set linkedPrompts(value: Set<string>) {\n this.LinkedPrompts = value;\n }\n \n // View mode\n ViewMode: 'grid' | 'list' = 'list';\n\n /** @deprecated Use {@link ViewMode}. */\n get viewMode(): 'grid' | 'list' {\n return this.ViewMode;\n }\n /** @deprecated Use {@link ViewMode}. */\n set viewMode(value: 'grid' | 'list') {\n this.ViewMode = value;\n }\n\n @Output() DialogClose = new EventEmitter<void>();\n\n constructor(\n private cdr: ChangeDetectorRef\n ) {\n super();}\n\n ngOnInit() {\n this.setupSearch();\n this.loadPrompts();\n \n // Initialize selected prompts if provided\n if (this.config.SelectedPromptIds) {\n this.SelectedPrompts = new Set(this.config.SelectedPromptIds);\n }\n \n // Initialize linked prompts if provided\n if (this.config.LinkedPromptIds) {\n this.LinkedPrompts = new Set(this.config.LinkedPromptIds);\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupSearch() {\n this.SearchControl.valueChanges\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n )\n .subscribe(searchTerm => {\n this.filterPrompts(searchTerm || '');\n });\n }\n\n private async loadPrompts() {\n this.IsLoading$.next(true);\n \n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n \n // Build filter - default to active prompts\n let filter = \"Status = 'Active'\";\n if (this.config.ExtraFilter) {\n filter += ` AND ${this.config.ExtraFilter}`;\n }\n \n const result = await rv.RunView<MJAIPromptEntityExtended>({\n EntityName: 'MJ: AI Prompts',\n ExtraFilter: filter,\n OrderBy: 'Name ASC',\n ResultType: 'entity_object',\n MaxRows: 1000\n });\n\n if (result.Success) {\n const prompts = result.Results || [];\n this.Prompts$.next(prompts);\n this.FilteredPrompts$.next(prompts);\n } else {\n throw new Error(result.ErrorMessage || 'Failed to load prompts');\n }\n } catch (error) {\n console.error('Error loading prompts:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error loading prompts. Please try again.',\n 'error',\n 3000\n );\n this.Prompts$.next([]);\n this.FilteredPrompts$.next([]);\n } finally {\n this.IsLoading$.next(false);\n }\n }\n\n private filterPrompts(searchTerm: string) {\n const allPrompts = this.Prompts$.value;\n \n if (!searchTerm.trim()) {\n this.FilteredPrompts$.next(allPrompts);\n return;\n }\n\n const filtered = allPrompts.filter(prompt => \n prompt.Name?.toLowerCase().includes(searchTerm.toLowerCase()) ||\n prompt.Description?.toLowerCase().includes(searchTerm.toLowerCase())\n );\n \n this.FilteredPrompts$.next(filtered);\n }\n\n // === Selection Management ===\n\n TogglePromptSelection(prompt: MJAIPromptEntityExtended) {\n // Prevent selection of already linked prompts\n if (this.IsPromptLinked(prompt)) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `\"${prompt.Name}\" is already linked to this agent`,\n 'info',\n 2000\n );\n return;\n }\n \n if (this.config.MultiSelect) {\n if (this.SelectedPrompts.has(prompt.ID)) {\n this.SelectedPrompts.delete(prompt.ID);\n } else {\n this.SelectedPrompts.add(prompt.ID);\n }\n } else {\n // Single select - replace current selection\n this.SelectedPrompts.clear();\n this.SelectedPrompts.add(prompt.ID);\n }\n }\n\n /** @deprecated Use {@link TogglePromptSelection}. */\n togglePromptSelection(prompt: MJAIPromptEntityExtended) {\n return this.TogglePromptSelection(prompt);\n }\n\n IsPromptSelected(prompt: MJAIPromptEntityExtended): boolean {\n return this.SelectedPrompts.has(prompt.ID);\n }\n\n /** @deprecated Use {@link IsPromptSelected}. */\n isPromptSelected(prompt: MJAIPromptEntityExtended): boolean {\n return this.IsPromptSelected(prompt);\n }\n\n IsPromptLinked(prompt: MJAIPromptEntityExtended): boolean {\n return this.LinkedPrompts.has(prompt.ID);\n }\n\n /** @deprecated Use {@link IsPromptLinked}. */\n isPromptLinked(prompt: MJAIPromptEntityExtended): boolean {\n return this.IsPromptLinked(prompt);\n }\n\n GetSelectedPromptObjects(): MJAIPromptEntityExtended[] {\n const allPrompts = this.Prompts$.value;\n return allPrompts.filter(prompt => this.SelectedPrompts.has(prompt.ID));\n }\n\n /** @deprecated Use {@link GetSelectedPromptObjects}. */\n getSelectedPromptObjects(): MJAIPromptEntityExtended[] {\n return this.GetSelectedPromptObjects();\n }\n\n // === UI Helpers ===\n\n ToggleViewMode() {\n this.ViewMode = this.ViewMode === 'grid' ? 'list' : 'grid';\n }\n\n /** @deprecated Use {@link ToggleViewMode}. */\n toggleViewMode() {\n return this.ToggleViewMode();\n }\n\n GetPromptStatusColor(prompt: MJAIPromptEntityExtended): string {\n switch (prompt.Status) {\n case 'Active': return 'var(--mj-status-success)';\n case 'Pending': return 'var(--mj-status-warning)';\n case 'Disabled': return 'var(--mj-text-muted)';\n default: return 'var(--mj-text-muted)';\n }\n }\n\n /** @deprecated Use {@link GetPromptStatusColor}. */\n getPromptStatusColor(prompt: MJAIPromptEntityExtended): string {\n return this.GetPromptStatusColor(prompt);\n }\n\n GetPromptStatusText(prompt: MJAIPromptEntityExtended): string {\n return prompt.Status || 'Unknown';\n }\n\n /** @deprecated Use {@link GetPromptStatusText}. */\n getPromptStatusText(prompt: MJAIPromptEntityExtended): string {\n return this.GetPromptStatusText(prompt);\n }\n\n // === Dialog Actions ===\n\n SelectPrompts() {\n const selectedPromptObjects = this.GetSelectedPromptObjects();\n \n if (selectedPromptObjects.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please select at least one prompt',\n 'warning',\n 2000\n );\n return;\n }\n\n const result: PromptSelectorResult = {\n SelectedPrompts: selectedPromptObjects\n };\n\n this.Result.next(result);\n this.DialogClose.emit();\n }\n\n /** @deprecated Use {@link SelectPrompts}. */\n selectPrompts() {\n return this.SelectPrompts();\n }\n\n CreateNew() {\n const result: PromptSelectorResult = {\n SelectedPrompts: [],\n createNew: true\n };\n\n this.Result.next(result);\n this.DialogClose.emit();\n }\n\n /** @deprecated Use {@link CreateNew}. */\n createNew() {\n return this.CreateNew();\n }\n\n cancel() {\n this.Result.next(null);\n this.DialogClose.emit();\n }\n}","<!-- Prompt Selector Dialog -->\n<div class=\"prompt-selector-dialog\">\n \n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-state\">\n <div class=\"loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin fa-2x\"></i>\n </div>\n <p>Loading prompts...</p>\n </div>\n } @else {\n \n <!-- Search and Controls Header -->\n <div class=\"dialog-header\">\n <div class=\"search-section\">\n <div class=\"search-box\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n class=\"mj-input search-input\"\n [formControl]=\"searchControl\"\n placeholder=\"Search prompts by name or description...\">\n </div>\n \n <div class=\"view-controls\">\n <button mjButton\n variant=\"flat\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"toggleViewMode()\"\n title=\"Toggle between list and grid view\">\n <i class=\"fa-solid\" [class.fa-list]=\"viewMode === 'grid'\" [class.fa-th]=\"viewMode === 'list'\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Results Summary -->\n <div class=\"results-summary\">\n <span class=\"results-count\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n {{ (filteredPrompts$ | async)?.length || 0 }} prompt(s)\n </span>\n @if (config.MultiSelect && selectedPrompts.size > 0) {\n <span class=\"selected-count\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{ selectedPrompts.size }} selected\n </span>\n }\n </div>\n\n <!-- Prompts List/Grid -->\n <div class=\"prompts-container\" [class.grid-view]=\"viewMode === 'grid'\" [class.list-view]=\"viewMode === 'list'\">\n @if ((filteredPrompts$ | async)?.length === 0) {\n <mj-empty-state\n Variant=\"no-results\"\n Title=\"No prompts found\"\n Message=\"Try adjusting your search criteria or check that prompts are properly configured.\"\n Size=\"compact\" />\n } @else {\n @for (prompt of filteredPrompts$ | async; track prompt.ID) {\n <div class=\"prompt-card\" \n [class.selected]=\"isPromptSelected(prompt)\"\n [class.linked]=\"isPromptLinked(prompt)\"\n (click)=\"togglePromptSelection(prompt)\">\n \n <!-- Selection indicator -->\n <div class=\"selection-indicator\">\n @if (isPromptLinked(prompt)) {\n <i class=\"fa-solid fa-link linked-icon\" title=\"Already linked to this agent\"></i>\n } @else if (isPromptSelected(prompt)) {\n <i class=\"fa-solid fa-check-circle selected-icon\"></i>\n } @else {\n <i class=\"fa-regular fa-circle unselected-icon\"></i>\n }\n </div>\n\n <!-- Prompt Content -->\n <div class=\"prompt-content\">\n <div class=\"prompt-header\">\n <h4 class=\"prompt-name\">{{ prompt.Name }}</h4>\n <div class=\"prompt-badges\">\n @if (isPromptLinked(prompt)) {\n <span class=\"linked-badge\">\n <i class=\"fa-solid fa-link\"></i>\n Linked\n </span>\n }\n <span class=\"status-badge\" \n [style.background-color]=\"getPromptStatusColor(prompt)\">\n {{ getPromptStatusText(prompt) }}\n </span>\n </div>\n </div>\n\n @if (prompt.Description) {\n <p class=\"prompt-description\">{{ prompt.Description }}</p>\n }\n\n <!-- Prompt Metadata -->\n <div class=\"prompt-metadata\">\n @if (prompt.__mj_CreatedAt) {\n <span class=\"metadata-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n Created {{ prompt.__mj_CreatedAt | date:'short' }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n }\n </div>\n }\n\n <!-- Dialog Footer -->\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n @if (config.ShowCreateNew) {\n <button mjButton\n variant=\"flat\"\n (click)=\"createNew()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New Prompt\n </button>\n }\n </div>\n \n <div class=\"footer-right\">\n <button mjButton\n variant=\"flat\"\n (click)=\"cancel()\">\n Cancel\n </button>\n\n <button mjButton\n variant=\"primary\"\n (click)=\"selectPrompts()\"\n [disabled]=\"selectedPrompts.size === 0\">\n @if (config.MultiSelect) {\n <i class=\"fa-solid fa-check\"></i>\n Add {{ selectedPrompts.size }} Prompt{{ selectedPrompts.size === 1 ? '' : 's' }}\n } @else {\n <i class=\"fa-solid fa-check\"></i>\n Select Prompt\n }\n </button>\n </div>\n </div>\n</div>"]}