@memberjunction/ng-core-entity-forms 6.2.0-edge.1 → 6.2.0-edge.3

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 (372) hide show
  1. package/dist/lib/custom/AIAgentCategories/ai-agent-category-header.panel.d.ts.map +1 -1
  2. package/dist/lib/custom/AIAgentCategories/ai-agent-category-header.panel.js +9 -5
  3. package/dist/lib/custom/AIAgentCategories/ai-agent-category-header.panel.js.map +1 -1
  4. package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.d.ts +4 -0
  5. package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.d.ts.map +1 -1
  6. package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.js +67 -36
  7. package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.js.map +1 -1
  8. package/dist/lib/custom/AIAgents/agent-form-tabs.d.ts +1 -0
  9. package/dist/lib/custom/AIAgents/agent-form-tabs.d.ts.map +1 -1
  10. package/dist/lib/custom/AIAgents/agent-form-tabs.js +2 -0
  11. package/dist/lib/custom/AIAgents/agent-form-tabs.js.map +1 -1
  12. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  13. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +529 -521
  14. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  15. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
  16. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +1 -0
  17. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  18. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
  19. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +10 -16
  20. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  21. package/dist/lib/custom/AIPrompts/pending-records.d.ts +11 -0
  22. package/dist/lib/custom/AIPrompts/pending-records.d.ts.map +1 -0
  23. package/dist/lib/custom/AIPrompts/pending-records.js +21 -0
  24. package/dist/lib/custom/AIPrompts/pending-records.js.map +1 -0
  25. package/dist/lib/custom/Companies/company-header.panel.d.ts.map +1 -1
  26. package/dist/lib/custom/Companies/company-header.panel.js +9 -5
  27. package/dist/lib/custom/Companies/company-header.panel.js.map +1 -1
  28. package/dist/lib/custom/Companies/company-overview.panel.d.ts +4 -0
  29. package/dist/lib/custom/Companies/company-overview.panel.d.ts.map +1 -1
  30. package/dist/lib/custom/Companies/company-overview.panel.js +68 -37
  31. package/dist/lib/custom/Companies/company-overview.panel.js.map +1 -1
  32. package/dist/lib/custom/Conversations/conversation-header.panel.d.ts.map +1 -1
  33. package/dist/lib/custom/Conversations/conversation-header.panel.js +9 -5
  34. package/dist/lib/custom/Conversations/conversation-header.panel.js.map +1 -1
  35. package/dist/lib/custom/Conversations/conversation-overview.panel.d.ts +10 -2
  36. package/dist/lib/custom/Conversations/conversation-overview.panel.d.ts.map +1 -1
  37. package/dist/lib/custom/Conversations/conversation-overview.panel.js +138 -76
  38. package/dist/lib/custom/Conversations/conversation-overview.panel.js.map +1 -1
  39. package/dist/lib/custom/Employees/employee-header.panel.d.ts.map +1 -1
  40. package/dist/lib/custom/Employees/employee-header.panel.js +9 -5
  41. package/dist/lib/custom/Employees/employee-header.panel.js.map +1 -1
  42. package/dist/lib/custom/Employees/employee-overview.panel.d.ts +4 -0
  43. package/dist/lib/custom/Employees/employee-overview.panel.d.ts.map +1 -1
  44. package/dist/lib/custom/Employees/employee-overview.panel.js +68 -37
  45. package/dist/lib/custom/Employees/employee-overview.panel.js.map +1 -1
  46. package/dist/lib/custom/Entities/entity-form.component.d.ts +8 -1
  47. package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
  48. package/dist/lib/custom/Entities/entity-form.component.js +241 -147
  49. package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
  50. package/dist/lib/custom/HierarchyPanels/hierarchy-form-panels.d.ts.map +1 -1
  51. package/dist/lib/custom/HierarchyPanels/hierarchy-form-panels.js +60 -45
  52. package/dist/lib/custom/HierarchyPanels/hierarchy-form-panels.js.map +1 -1
  53. package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
  54. package/dist/lib/custom/Lists/list-form.component.js +1 -0
  55. package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
  56. package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
  57. package/dist/lib/custom/Queries/query-form.component.js +1 -0
  58. package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
  59. package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts +19 -0
  60. package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts.map +1 -1
  61. package/dist/lib/custom/RecordProcesses/record-process-form.component.js +50 -8
  62. package/dist/lib/custom/RecordProcesses/record-process-form.component.js.map +1 -1
  63. package/dist/lib/custom/Rubrics/evaluation-form.component.d.ts +37 -0
  64. package/dist/lib/custom/Rubrics/evaluation-form.component.d.ts.map +1 -0
  65. package/dist/lib/custom/Rubrics/evaluation-form.component.js +399 -0
  66. package/dist/lib/custom/Rubrics/evaluation-form.component.js.map +1 -0
  67. package/dist/lib/custom/Rubrics/record-forms.component.d.ts +69 -0
  68. package/dist/lib/custom/Rubrics/record-forms.component.d.ts.map +1 -0
  69. package/dist/lib/custom/Rubrics/record-forms.component.js +587 -0
  70. package/dist/lib/custom/Rubrics/record-forms.component.js.map +1 -0
  71. package/dist/lib/custom/Rubrics/rubric-form.component.d.ts +67 -0
  72. package/dist/lib/custom/Rubrics/rubric-form.component.d.ts.map +1 -0
  73. package/dist/lib/custom/Rubrics/rubric-form.component.js +534 -0
  74. package/dist/lib/custom/Rubrics/rubric-form.component.js.map +1 -0
  75. package/dist/lib/custom/Rubrics/rubric-form.panels.d.ts +25 -0
  76. package/dist/lib/custom/Rubrics/rubric-form.panels.d.ts.map +1 -0
  77. package/dist/lib/custom/Rubrics/rubric-form.panels.js +299 -0
  78. package/dist/lib/custom/Rubrics/rubric-form.panels.js.map +1 -0
  79. package/dist/lib/custom/Rubrics/scale-form.component.d.ts +31 -0
  80. package/dist/lib/custom/Rubrics/scale-form.component.d.ts.map +1 -0
  81. package/dist/lib/custom/Rubrics/scale-form.component.js +395 -0
  82. package/dist/lib/custom/Rubrics/scale-form.component.js.map +1 -0
  83. package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts.map +1 -1
  84. package/dist/lib/custom/SearchScopes/searchscope-form.component.js +1 -0
  85. package/dist/lib/custom/SearchScopes/searchscope-form.component.js.map +1 -1
  86. package/dist/lib/custom/Templates/templates-form.component.d.ts +13 -4
  87. package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
  88. package/dist/lib/custom/Templates/templates-form.component.js +111 -113
  89. package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
  90. package/dist/lib/custom/Tests/test-form.component.d.ts +6 -0
  91. package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
  92. package/dist/lib/custom/Tests/test-form.component.js +403 -361
  93. package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
  94. package/dist/lib/custom/Tests/test-run-form.component.d.ts.map +1 -1
  95. package/dist/lib/custom/Tests/test-run-form.component.js +1 -0
  96. package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
  97. package/dist/lib/custom/Tests/test-suite-form.component.d.ts +5 -0
  98. package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
  99. package/dist/lib/custom/Tests/test-suite-form.component.js +705 -664
  100. package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
  101. package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts.map +1 -1
  102. package/dist/lib/custom/Tests/test-suite-run-form.component.js +1 -0
  103. package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
  104. package/dist/lib/custom/Users/user-header.panel.d.ts.map +1 -1
  105. package/dist/lib/custom/Users/user-header.panel.js +9 -5
  106. package/dist/lib/custom/Users/user-header.panel.js.map +1 -1
  107. package/dist/lib/custom/Users/user-overview.panel.d.ts +4 -0
  108. package/dist/lib/custom/Users/user-overview.panel.d.ts.map +1 -1
  109. package/dist/lib/custom/Users/user-overview.panel.js +65 -34
  110. package/dist/lib/custom/Users/user-overview.panel.js.map +1 -1
  111. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
  112. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +1 -0
  113. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  114. package/dist/lib/custom/custom-forms.module.d.ts +56 -48
  115. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  116. package/dist/lib/custom/custom-forms.module.js +60 -0
  117. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  118. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
  119. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +115 -43
  120. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
  121. package/dist/lib/generated/Entities/MJAIAgentArtifactType/mjaiagentartifacttype.form.component.d.ts.map +1 -1
  122. package/dist/lib/generated/Entities/MJAIAgentArtifactType/mjaiagentartifacttype.form.component.js +5 -9
  123. package/dist/lib/generated/Entities/MJAIAgentArtifactType/mjaiagentartifacttype.form.component.js.map +1 -1
  124. package/dist/lib/generated/Entities/MJAIAgentNoteType/mjaiagentnotetype.form.component.d.ts.map +1 -1
  125. package/dist/lib/generated/Entities/MJAIAgentNoteType/mjaiagentnotetype.form.component.js +15 -18
  126. package/dist/lib/generated/Entities/MJAIAgentNoteType/mjaiagentnotetype.form.component.js.map +1 -1
  127. package/dist/lib/generated/Entities/MJAIAgentPrompt/mjaiagentprompt.form.component.d.ts.map +1 -1
  128. package/dist/lib/generated/Entities/MJAIAgentPrompt/mjaiagentprompt.form.component.js +5 -9
  129. package/dist/lib/generated/Entities/MJAIAgentPrompt/mjaiagentprompt.form.component.js.map +1 -1
  130. package/dist/lib/generated/Entities/MJAIAgentRubric/mjaiagentrubric.form.component.d.ts +10 -0
  131. package/dist/lib/generated/Entities/MJAIAgentRubric/mjaiagentrubric.form.component.d.ts.map +1 -0
  132. package/dist/lib/generated/Entities/MJAIAgentRubric/mjaiagentrubric.form.component.js +74 -0
  133. package/dist/lib/generated/Entities/MJAIAgentRubric/mjaiagentrubric.form.component.js.map +1 -0
  134. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.d.ts.map +1 -1
  135. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +37 -19
  136. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
  137. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.d.ts.map +1 -1
  138. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js +27 -9
  139. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js.map +1 -1
  140. package/dist/lib/generated/Entities/MJAIAgentSessionBridge/mjaiagentsessionbridge.form.component.js +17 -15
  141. package/dist/lib/generated/Entities/MJAIAgentSessionBridge/mjaiagentsessionbridge.form.component.js.map +1 -1
  142. package/dist/lib/generated/Entities/MJAIBridgeProvider/mjaibridgeprovider.form.component.d.ts.map +1 -1
  143. package/dist/lib/generated/Entities/MJAIBridgeProvider/mjaibridgeprovider.form.component.js +25 -7
  144. package/dist/lib/generated/Entities/MJAIBridgeProvider/mjaibridgeprovider.form.component.js.map +1 -1
  145. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.d.ts.map +1 -1
  146. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js +31 -13
  147. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
  148. package/dist/lib/generated/Entities/MJAIResultCache/mjairesultcache.form.component.js +12 -14
  149. package/dist/lib/generated/Entities/MJAIResultCache/mjairesultcache.form.component.js.map +1 -1
  150. package/dist/lib/generated/Entities/MJCommunicationLog/mjcommunicationlog.form.component.d.ts.map +1 -1
  151. package/dist/lib/generated/Entities/MJCommunicationLog/mjcommunicationlog.form.component.js +5 -9
  152. package/dist/lib/generated/Entities/MJCommunicationLog/mjcommunicationlog.form.component.js.map +1 -1
  153. package/dist/lib/generated/Entities/MJCompanyIntegrationRunAPILog/mjcompanyintegrationrunapilog.form.component.d.ts.map +1 -1
  154. package/dist/lib/generated/Entities/MJCompanyIntegrationRunAPILog/mjcompanyintegrationrunapilog.form.component.js +5 -9
  155. package/dist/lib/generated/Entities/MJCompanyIntegrationRunAPILog/mjcompanyintegrationrunapilog.form.component.js.map +1 -1
  156. package/dist/lib/generated/Entities/MJComponent/mjcomponent.form.component.d.ts.map +1 -1
  157. package/dist/lib/generated/Entities/MJComponent/mjcomponent.form.component.js +26 -8
  158. package/dist/lib/generated/Entities/MJComponent/mjcomponent.form.component.js.map +1 -1
  159. package/dist/lib/generated/Entities/MJContentItemAttribute/mjcontentitemattribute.form.component.d.ts.map +1 -1
  160. package/dist/lib/generated/Entities/MJContentItemAttribute/mjcontentitemattribute.form.component.js +4 -7
  161. package/dist/lib/generated/Entities/MJContentItemAttribute/mjcontentitemattribute.form.component.js.map +1 -1
  162. package/dist/lib/generated/Entities/MJContentSourceParam/mjcontentsourceparam.form.component.d.ts.map +1 -1
  163. package/dist/lib/generated/Entities/MJContentSourceParam/mjcontentsourceparam.form.component.js +4 -7
  164. package/dist/lib/generated/Entities/MJContentSourceParam/mjcontentsourceparam.form.component.js.map +1 -1
  165. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.d.ts.map +1 -1
  166. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js +31 -13
  167. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js.map +1 -1
  168. package/dist/lib/generated/Entities/MJConversationArtifactPermission/mjconversationartifactpermission.form.component.d.ts.map +1 -1
  169. package/dist/lib/generated/Entities/MJConversationArtifactPermission/mjconversationartifactpermission.form.component.js +5 -9
  170. package/dist/lib/generated/Entities/MJConversationArtifactPermission/mjconversationartifactpermission.form.component.js.map +1 -1
  171. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.d.ts.map +1 -1
  172. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js +34 -16
  173. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js.map +1 -1
  174. package/dist/lib/generated/Entities/MJEmployeeRole/mjemployeerole.form.component.d.ts.map +1 -1
  175. package/dist/lib/generated/Entities/MJEmployeeRole/mjemployeerole.form.component.js +5 -9
  176. package/dist/lib/generated/Entities/MJEmployeeRole/mjemployeerole.form.component.js.map +1 -1
  177. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
  178. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +210 -84
  179. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
  180. package/dist/lib/generated/Entities/MJEntityCommunicationField/mjentitycommunicationfield.form.component.d.ts.map +1 -1
  181. package/dist/lib/generated/Entities/MJEntityCommunicationField/mjentitycommunicationfield.form.component.js +8 -11
  182. package/dist/lib/generated/Entities/MJEntityCommunicationField/mjentitycommunicationfield.form.component.js.map +1 -1
  183. package/dist/lib/generated/Entities/MJEntityDocumentType/mjentitydocumenttype.form.component.d.ts.map +1 -1
  184. package/dist/lib/generated/Entities/MJEntityDocumentType/mjentitydocumenttype.form.component.js +15 -18
  185. package/dist/lib/generated/Entities/MJEntityDocumentType/mjentitydocumenttype.form.component.js.map +1 -1
  186. package/dist/lib/generated/Entities/MJEntityFormContribution/mjentityformcontribution.form.component.d.ts +10 -0
  187. package/dist/lib/generated/Entities/MJEntityFormContribution/mjentityformcontribution.form.component.d.ts.map +1 -0
  188. package/dist/lib/generated/Entities/MJEntityFormContribution/mjentityformcontribution.form.component.js +148 -0
  189. package/dist/lib/generated/Entities/MJEntityFormContribution/mjentityformcontribution.form.component.js.map +1 -0
  190. package/dist/lib/generated/Entities/MJEnvironment/mjenvironment.form.component.d.ts.map +1 -1
  191. package/dist/lib/generated/Entities/MJEnvironment/mjenvironment.form.component.js +53 -56
  192. package/dist/lib/generated/Entities/MJEnvironment/mjenvironment.form.component.js.map +1 -1
  193. package/dist/lib/generated/Entities/MJFeaturePipelineType/mjfeaturepipelinetype.form.component.d.ts +10 -0
  194. package/dist/lib/generated/Entities/MJFeaturePipelineType/mjfeaturepipelinetype.form.component.d.ts.map +1 -0
  195. package/dist/lib/generated/Entities/MJFeaturePipelineType/mjfeaturepipelinetype.form.component.js +62 -0
  196. package/dist/lib/generated/Entities/MJFeaturePipelineType/mjfeaturepipelinetype.form.component.js.map +1 -0
  197. package/dist/lib/generated/Entities/MJInteraction/mjinteraction.form.component.d.ts +10 -0
  198. package/dist/lib/generated/Entities/MJInteraction/mjinteraction.form.component.d.ts.map +1 -0
  199. package/dist/lib/generated/Entities/MJInteraction/mjinteraction.form.component.js +161 -0
  200. package/dist/lib/generated/Entities/MJInteraction/mjinteraction.form.component.js.map +1 -0
  201. package/dist/lib/generated/Entities/MJInteractionEvent/mjinteractionevent.form.component.d.ts +10 -0
  202. package/dist/lib/generated/Entities/MJInteractionEvent/mjinteractionevent.form.component.d.ts.map +1 -0
  203. package/dist/lib/generated/Entities/MJInteractionEvent/mjinteractionevent.form.component.js +78 -0
  204. package/dist/lib/generated/Entities/MJInteractionEvent/mjinteractionevent.form.component.js.map +1 -0
  205. package/dist/lib/generated/Entities/MJInteractionLink/mjinteractionlink.form.component.d.ts +10 -0
  206. package/dist/lib/generated/Entities/MJInteractionLink/mjinteractionlink.form.component.d.ts.map +1 -0
  207. package/dist/lib/generated/Entities/MJInteractionLink/mjinteractionlink.form.component.js +68 -0
  208. package/dist/lib/generated/Entities/MJInteractionLink/mjinteractionlink.form.component.js.map +1 -0
  209. package/dist/lib/generated/Entities/MJInteractionOffer/mjinteractionoffer.form.component.d.ts +10 -0
  210. package/dist/lib/generated/Entities/MJInteractionOffer/mjinteractionoffer.form.component.d.ts.map +1 -0
  211. package/dist/lib/generated/Entities/MJInteractionOffer/mjinteractionoffer.form.component.js +100 -0
  212. package/dist/lib/generated/Entities/MJInteractionOffer/mjinteractionoffer.form.component.js.map +1 -0
  213. package/dist/lib/generated/Entities/MJMeeting/mjmeeting.form.component.d.ts +10 -0
  214. package/dist/lib/generated/Entities/MJMeeting/mjmeeting.form.component.d.ts.map +1 -0
  215. package/dist/lib/generated/Entities/MJMeeting/mjmeeting.form.component.js +119 -0
  216. package/dist/lib/generated/Entities/MJMeeting/mjmeeting.form.component.js.map +1 -0
  217. package/dist/lib/generated/Entities/MJMeetingParticipant/mjmeetingparticipant.form.component.d.ts +10 -0
  218. package/dist/lib/generated/Entities/MJMeetingParticipant/mjmeetingparticipant.form.component.d.ts.map +1 -0
  219. package/dist/lib/generated/Entities/MJMeetingParticipant/mjmeetingparticipant.form.component.js +92 -0
  220. package/dist/lib/generated/Entities/MJMeetingParticipant/mjmeetingparticipant.form.component.js.map +1 -0
  221. package/dist/lib/generated/Entities/MJNumberPool/mjnumberpool.form.component.d.ts +10 -0
  222. package/dist/lib/generated/Entities/MJNumberPool/mjnumberpool.form.component.d.ts.map +1 -0
  223. package/dist/lib/generated/Entities/MJNumberPool/mjnumberpool.form.component.js +87 -0
  224. package/dist/lib/generated/Entities/MJNumberPool/mjnumberpool.form.component.js.map +1 -0
  225. package/dist/lib/generated/Entities/MJPhoneNumber/mjphonenumber.form.component.d.ts +10 -0
  226. package/dist/lib/generated/Entities/MJPhoneNumber/mjphonenumber.form.component.d.ts.map +1 -0
  227. package/dist/lib/generated/Entities/MJPhoneNumber/mjphonenumber.form.component.js +129 -0
  228. package/dist/lib/generated/Entities/MJPhoneNumber/mjphonenumber.form.component.js.map +1 -0
  229. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.d.ts.map +1 -1
  230. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js +24 -6
  231. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js.map +1 -1
  232. package/dist/lib/generated/Entities/MJQueryPermission/mjquerypermission.form.component.d.ts.map +1 -1
  233. package/dist/lib/generated/Entities/MJQueryPermission/mjquerypermission.form.component.js +5 -9
  234. package/dist/lib/generated/Entities/MJQueryPermission/mjquerypermission.form.component.js.map +1 -1
  235. package/dist/lib/generated/Entities/MJRecommendationItem/mjrecommendationitem.form.component.d.ts.map +1 -1
  236. package/dist/lib/generated/Entities/MJRecommendationItem/mjrecommendationitem.form.component.js +8 -11
  237. package/dist/lib/generated/Entities/MJRecommendationItem/mjrecommendationitem.form.component.js.map +1 -1
  238. package/dist/lib/generated/Entities/MJRecordChange/mjrecordchange.form.component.d.ts.map +1 -1
  239. package/dist/lib/generated/Entities/MJRecordChange/mjrecordchange.form.component.js +24 -16
  240. package/dist/lib/generated/Entities/MJRecordChange/mjrecordchange.form.component.js.map +1 -1
  241. package/dist/lib/generated/Entities/MJRecordCloneLog/mjrecordclonelog.form.component.d.ts +10 -0
  242. package/dist/lib/generated/Entities/MJRecordCloneLog/mjrecordclonelog.form.component.d.ts.map +1 -0
  243. package/dist/lib/generated/Entities/MJRecordCloneLog/mjrecordclonelog.form.component.js +107 -0
  244. package/dist/lib/generated/Entities/MJRecordCloneLog/mjrecordclonelog.form.component.js.map +1 -0
  245. package/dist/lib/generated/Entities/MJRecordCloneLogItem/mjrecordclonelogitem.form.component.d.ts +10 -0
  246. package/dist/lib/generated/Entities/MJRecordCloneLogItem/mjrecordclonelogitem.form.component.d.ts.map +1 -0
  247. package/dist/lib/generated/Entities/MJRecordCloneLogItem/mjrecordclonelogitem.form.component.js +74 -0
  248. package/dist/lib/generated/Entities/MJRecordCloneLogItem/mjrecordclonelogitem.form.component.js.map +1 -0
  249. package/dist/lib/generated/Entities/MJResourceType/mjresourcetype.form.component.d.ts.map +1 -1
  250. package/dist/lib/generated/Entities/MJResourceType/mjresourcetype.form.component.js +36 -40
  251. package/dist/lib/generated/Entities/MJResourceType/mjresourcetype.form.component.js.map +1 -1
  252. package/dist/lib/generated/Entities/MJRole/mjrole.form.component.d.ts.map +1 -1
  253. package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js +39 -21
  254. package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js.map +1 -1
  255. package/dist/lib/generated/Entities/MJRowLevelSecurityFilter/mjrowlevelsecurityfilter.form.component.d.ts.map +1 -1
  256. package/dist/lib/generated/Entities/MJRowLevelSecurityFilter/mjrowlevelsecurityfilter.form.component.js +45 -48
  257. package/dist/lib/generated/Entities/MJRowLevelSecurityFilter/mjrowlevelsecurityfilter.form.component.js.map +1 -1
  258. package/dist/lib/generated/Entities/MJRubric/mjrubric.form.component.d.ts +10 -0
  259. package/dist/lib/generated/Entities/MJRubric/mjrubric.form.component.d.ts.map +1 -0
  260. package/dist/lib/generated/Entities/MJRubric/mjrubric.form.component.js +135 -0
  261. package/dist/lib/generated/Entities/MJRubric/mjrubric.form.component.js.map +1 -0
  262. package/dist/lib/generated/Entities/MJRubricBand/mjrubricband.form.component.d.ts +10 -0
  263. package/dist/lib/generated/Entities/MJRubricBand/mjrubricband.form.component.d.ts.map +1 -0
  264. package/dist/lib/generated/Entities/MJRubricBand/mjrubricband.form.component.js +87 -0
  265. package/dist/lib/generated/Entities/MJRubricBand/mjrubricband.form.component.js.map +1 -0
  266. package/dist/lib/generated/Entities/MJRubricCategory/mjrubriccategory.form.component.d.ts +10 -0
  267. package/dist/lib/generated/Entities/MJRubricCategory/mjrubriccategory.form.component.d.ts.map +1 -0
  268. package/dist/lib/generated/Entities/MJRubricCategory/mjrubriccategory.form.component.js +107 -0
  269. package/dist/lib/generated/Entities/MJRubricCategory/mjrubriccategory.form.component.js.map +1 -0
  270. package/dist/lib/generated/Entities/MJRubricCriterion/mjrubriccriterion.form.component.d.ts +10 -0
  271. package/dist/lib/generated/Entities/MJRubricCriterion/mjrubriccriterion.form.component.d.ts.map +1 -0
  272. package/dist/lib/generated/Entities/MJRubricCriterion/mjrubriccriterion.form.component.js +155 -0
  273. package/dist/lib/generated/Entities/MJRubricCriterion/mjrubriccriterion.form.component.js.map +1 -0
  274. package/dist/lib/generated/Entities/MJRubricCriterionLevel/mjrubriccriterionlevel.form.component.d.ts +10 -0
  275. package/dist/lib/generated/Entities/MJRubricCriterionLevel/mjrubriccriterionlevel.form.component.d.ts.map +1 -0
  276. package/dist/lib/generated/Entities/MJRubricCriterionLevel/mjrubriccriterionlevel.form.component.js +62 -0
  277. package/dist/lib/generated/Entities/MJRubricCriterionLevel/mjrubriccriterionlevel.form.component.js.map +1 -0
  278. package/dist/lib/generated/Entities/MJRubricEvaluation/mjrubricevaluation.form.component.d.ts +10 -0
  279. package/dist/lib/generated/Entities/MJRubricEvaluation/mjrubricevaluation.form.component.d.ts.map +1 -0
  280. package/dist/lib/generated/Entities/MJRubricEvaluation/mjrubricevaluation.form.component.js +183 -0
  281. package/dist/lib/generated/Entities/MJRubricEvaluation/mjrubricevaluation.form.component.js.map +1 -0
  282. package/dist/lib/generated/Entities/MJRubricEvaluationScore/mjrubricevaluationscore.form.component.d.ts +10 -0
  283. package/dist/lib/generated/Entities/MJRubricEvaluationScore/mjrubricevaluationscore.form.component.d.ts.map +1 -0
  284. package/dist/lib/generated/Entities/MJRubricEvaluationScore/mjrubricevaluationscore.form.component.js +120 -0
  285. package/dist/lib/generated/Entities/MJRubricEvaluationScore/mjrubricevaluationscore.form.component.js.map +1 -0
  286. package/dist/lib/generated/Entities/MJRubricScale/mjrubricscale.form.component.d.ts +10 -0
  287. package/dist/lib/generated/Entities/MJRubricScale/mjrubricscale.form.component.d.ts.map +1 -0
  288. package/dist/lib/generated/Entities/MJRubricScale/mjrubricscale.form.component.js +107 -0
  289. package/dist/lib/generated/Entities/MJRubricScale/mjrubricscale.form.component.js.map +1 -0
  290. package/dist/lib/generated/Entities/MJRubricScaleLevel/mjrubricscalelevel.form.component.d.ts +10 -0
  291. package/dist/lib/generated/Entities/MJRubricScaleLevel/mjrubricscalelevel.form.component.d.ts.map +1 -0
  292. package/dist/lib/generated/Entities/MJRubricScaleLevel/mjrubricscalelevel.form.component.js +103 -0
  293. package/dist/lib/generated/Entities/MJRubricScaleLevel/mjrubricscalelevel.form.component.js.map +1 -0
  294. package/dist/lib/generated/Entities/MJRubricVersion/mjrubricversion.form.component.d.ts +10 -0
  295. package/dist/lib/generated/Entities/MJRubricVersion/mjrubricversion.form.component.d.ts.map +1 -0
  296. package/dist/lib/generated/Entities/MJRubricVersion/mjrubricversion.form.component.js +171 -0
  297. package/dist/lib/generated/Entities/MJRubricVersion/mjrubricversion.form.component.js.map +1 -0
  298. package/dist/lib/generated/Entities/MJTemplateContentType/mjtemplatecontenttype.form.component.d.ts.map +1 -1
  299. package/dist/lib/generated/Entities/MJTemplateContentType/mjtemplatecontenttype.form.component.js +15 -18
  300. package/dist/lib/generated/Entities/MJTemplateContentType/mjtemplatecontenttype.form.component.js.map +1 -1
  301. package/dist/lib/generated/Entities/MJTest/mjtest.form.component.d.ts.map +1 -1
  302. package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js +24 -16
  303. package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js.map +1 -1
  304. package/dist/lib/generated/Entities/MJTestSuite/mjtestsuite.form.component.js +27 -25
  305. package/dist/lib/generated/Entities/MJTestSuite/mjtestsuite.form.component.js.map +1 -1
  306. package/dist/lib/generated/Entities/MJTestSuiteRun/mjtestsuiterun.form.component.d.ts.map +1 -1
  307. package/dist/lib/generated/Entities/MJTestSuiteRun/mjtestsuiterun.form.component.js +19 -11
  308. package/dist/lib/generated/Entities/MJTestSuiteRun/mjtestsuiterun.form.component.js.map +1 -1
  309. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  310. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +299 -119
  311. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  312. package/dist/lib/generated/Entities/MJVersionLabelItem/mjversionlabelitem.form.component.d.ts.map +1 -1
  313. package/dist/lib/generated/Entities/MJVersionLabelItem/mjversionlabelitem.form.component.js +5 -9
  314. package/dist/lib/generated/Entities/MJVersionLabelItem/mjversionlabelitem.form.component.js.map +1 -1
  315. package/dist/lib/generated/Entities/MJWorkQueueDeduplication/mjworkqueuededuplication.form.component.d.ts +10 -0
  316. package/dist/lib/generated/Entities/MJWorkQueueDeduplication/mjworkqueuededuplication.form.component.d.ts.map +1 -0
  317. package/dist/lib/generated/Entities/MJWorkQueueDeduplication/mjworkqueuededuplication.form.component.js +64 -0
  318. package/dist/lib/generated/Entities/MJWorkQueueDeduplication/mjworkqueuededuplication.form.component.js.map +1 -0
  319. package/dist/lib/generated/Entities/MJWorkQueueDelivery/mjworkqueuedelivery.form.component.d.ts +10 -0
  320. package/dist/lib/generated/Entities/MJWorkQueueDelivery/mjworkqueuedelivery.form.component.d.ts.map +1 -0
  321. package/dist/lib/generated/Entities/MJWorkQueueDelivery/mjworkqueuedelivery.form.component.js +94 -0
  322. package/dist/lib/generated/Entities/MJWorkQueueDelivery/mjworkqueuedelivery.form.component.js.map +1 -0
  323. package/dist/lib/generated/Entities/MJWorkQueueMessage/mjworkqueuemessage.form.component.d.ts +10 -0
  324. package/dist/lib/generated/Entities/MJWorkQueueMessage/mjworkqueuemessage.form.component.d.ts.map +1 -0
  325. package/dist/lib/generated/Entities/MJWorkQueueMessage/mjworkqueuemessage.form.component.js +91 -0
  326. package/dist/lib/generated/Entities/MJWorkQueueMessage/mjworkqueuemessage.form.component.js.map +1 -0
  327. package/dist/lib/generated/Entities/MJWorkQueueSubscription/mjworkqueuesubscription.form.component.d.ts +10 -0
  328. package/dist/lib/generated/Entities/MJWorkQueueSubscription/mjworkqueuesubscription.form.component.d.ts.map +1 -0
  329. package/dist/lib/generated/Entities/MJWorkQueueSubscription/mjworkqueuesubscription.form.component.js +105 -0
  330. package/dist/lib/generated/Entities/MJWorkQueueSubscription/mjworkqueuesubscription.form.component.js.map +1 -0
  331. package/dist/lib/generated/Entities/MJWorkQueueTopic/mjworkqueuetopic.form.component.d.ts +10 -0
  332. package/dist/lib/generated/Entities/MJWorkQueueTopic/mjworkqueuetopic.form.component.d.ts.map +1 -0
  333. package/dist/lib/generated/Entities/MJWorkQueueTopic/mjworkqueuetopic.form.component.js +129 -0
  334. package/dist/lib/generated/Entities/MJWorkQueueTopic/mjworkqueuetopic.form.component.js.map +1 -0
  335. package/dist/lib/generated/Entities/MJWorkQueueTransport/mjworkqueuetransport.form.component.d.ts +10 -0
  336. package/dist/lib/generated/Entities/MJWorkQueueTransport/mjworkqueuetransport.form.component.d.ts.map +1 -0
  337. package/dist/lib/generated/Entities/MJWorkQueueTransport/mjworkqueuetransport.form.component.js +85 -0
  338. package/dist/lib/generated/Entities/MJWorkQueueTransport/mjworkqueuetransport.form.component.js.map +1 -0
  339. package/dist/lib/generated/Entities/MJWorkspace/mjworkspace.form.component.d.ts.map +1 -1
  340. package/dist/lib/generated/Entities/MJWorkspace/mjworkspace.form.component.js +17 -20
  341. package/dist/lib/generated/Entities/MJWorkspace/mjworkspace.form.component.js.map +1 -1
  342. package/dist/lib/generated/generated-forms.module.d.ts +451 -422
  343. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  344. package/dist/lib/generated/generated-forms.module.js +101 -14
  345. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  346. package/dist/lib/panels/ai-agents/agent-realtime.panel.d.ts +7 -1
  347. package/dist/lib/panels/ai-agents/agent-realtime.panel.d.ts.map +1 -1
  348. package/dist/lib/panels/ai-agents/agent-realtime.panel.js +89 -43
  349. package/dist/lib/panels/ai-agents/agent-realtime.panel.js.map +1 -1
  350. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js +3 -3
  351. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js.map +1 -1
  352. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js +5 -5
  353. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js.map +1 -1
  354. package/dist/lib/panels/content-sources/website-crawler-settings.panel.js +4 -4
  355. package/dist/lib/panels/content-sources/website-crawler-settings.panel.js.map +1 -1
  356. package/dist/lib/panels/form-chrome/entity-relationship-form-role.panel.js +3 -3
  357. package/dist/lib/panels/form-chrome/entity-relationship-form-role.panel.js.map +1 -1
  358. package/dist/lib/panels/model-predictions/model-prediction.panel.js +4 -4
  359. package/dist/lib/panels/model-predictions/model-prediction.panel.js.map +1 -1
  360. package/dist/lib/panels/record-clone/entity-clone-config-editor.component.d.ts +116 -0
  361. package/dist/lib/panels/record-clone/entity-clone-config-editor.component.d.ts.map +1 -0
  362. package/dist/lib/panels/record-clone/entity-clone-config-editor.component.js +820 -0
  363. package/dist/lib/panels/record-clone/entity-clone-config-editor.component.js.map +1 -0
  364. package/dist/lib/shared/components/template-editor.component.d.ts +25 -1
  365. package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
  366. package/dist/lib/shared/components/template-editor.component.js +67 -3
  367. package/dist/lib/shared/components/template-editor.component.js.map +1 -1
  368. package/dist/public-api.d.ts +5 -0
  369. package/dist/public-api.d.ts.map +1 -1
  370. package/dist/public-api.js +5 -0
  371. package/dist/public-api.js.map +1 -1
  372. package/package.json +47 -43
@@ -34,7 +34,7 @@ interface BridgeIdentityRow {
34
34
  * - its bridge agent identities ('MJ: AI Bridge Agent Identities' for this
35
35
  * agent).
36
36
  *
37
- * Registers against the 'AI Agents' entity, `after-fields` slot. The AI Agent
37
+ * Registers against the 'MJ: AI Agents' entity, `after-fields` slot. The AI Agent
38
38
  * form is a full custom override whose template doesn't emit the `after-fields`
39
39
  * marker, so this panel falls through to the container's always-present
40
40
  * `after-everything` slot and mounts at the bottom of the form — functional,
@@ -48,6 +48,10 @@ export declare class AgentRealtimePanel extends BaseFormPanel<MJAIAgentEntity> i
48
48
  LoadError: string | null;
49
49
  Pairings: CoAgentPairingRow[];
50
50
  Identities: BridgeIdentityRow[];
51
+ /** Set when the co-agent pairing query fails; the other sections still show. */
52
+ PairingsError: string | null;
53
+ /** Set when the bridge identity query fails; the other sections still show. */
54
+ IdentitiesError: string | null;
51
55
  private prettyTypeConfigCache;
52
56
  ngOnInit(): Promise<void>;
53
57
  /** Pretty-printed TypeConfiguration JSON (cached, falls back to raw on parse error). */
@@ -59,6 +63,8 @@ export declare class AgentRealtimePanel extends BaseFormPanel<MJAIAgentEntity> i
59
63
  * the already-loaded record (no query needed).
60
64
  */
61
65
  private loadData;
66
+ /** A short "could not load" line for one section, with the underlying message when there is one. */
67
+ private loadErrorText;
62
68
  PairingTypeIcon(type: string): string;
63
69
  IdentityTypeIcon(type: string): string;
64
70
  /** The "other" agent in a pairing (the one that isn't the agent on this form). */
@@ -1 +1 @@
1
- {"version":3,"file":"agent-realtime.panel.d.ts","sourceRoot":"","sources":["../../../../src/lib/panels/ai-agents/agent-realtime.panel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAA6B,MAAM,eAAe,CAAC;AAG7E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;;AAGhE,2DAA2D;AAC3D,UAAU,iBAAiB;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,gGAAgG;IAChG,IAAI,EAAE,YAAY,GAAG,WAAW,CAAC;CACpC;AAED,0DAA0D;AAC1D,UAAU,iBAAiB;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAea,kBAAmB,SAAQ,aAAa,CAAC,eAAe,CAAE,YAAW,MAAM;IACpF,OAAO,CAAC,GAAG,CAA6B;IAEjC,OAAO,UAAS;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAChC,QAAQ,EAAE,iBAAiB,EAAE,CAAM;IACnC,UAAU,EAAE,iBAAiB,EAAE,CAAM;IAE5C,OAAO,CAAC,qBAAqB,CAAwC;IAE/D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,wFAAwF;IACxF,IAAW,uBAAuB,IAAI,MAAM,GAAG,IAAI,CAalD;IAED,IAAW,WAAW,IAAI,OAAO,CAEhC;IAED;;;;OAIG;YACW,QAAQ;IAwCf,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAYrC,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAS7C,kFAAkF;IAC3E,cAAc,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM;IAI5C,WAAW,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI;IAIvC,YAAY,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI;yCA7GtC,kBAAkB;2CAAlB,kBAAkB;CAgH9B;AAED,gEAAgE;AAChE,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
1
+ {"version":3,"file":"agent-realtime.panel.d.ts","sourceRoot":"","sources":["../../../../src/lib/panels/ai-agents/agent-realtime.panel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAA6B,MAAM,eAAe,CAAC;AAG7E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;;AAGhE,2DAA2D;AAC3D,UAAU,iBAAiB;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,gGAAgG;IAChG,IAAI,EAAE,YAAY,GAAG,WAAW,CAAC;CACpC;AAED,0DAA0D;AAC1D,UAAU,iBAAiB;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAea,kBAAmB,SAAQ,aAAa,CAAC,eAAe,CAAE,YAAW,MAAM;IACpF,OAAO,CAAC,GAAG,CAA6B;IAEjC,OAAO,UAAS;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAChC,QAAQ,EAAE,iBAAiB,EAAE,CAAM;IACnC,UAAU,EAAE,iBAAiB,EAAE,CAAM;IAC5C,gFAAgF;IACzE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC3C,+EAA+E;IACxE,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE7C,OAAO,CAAC,qBAAqB,CAAwC;IAE/D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,wFAAwF;IACxF,IAAW,uBAAuB,IAAI,MAAM,GAAG,IAAI,CAalD;IAED,IAAW,WAAW,IAAI,OAAO,CAEhC;IAED;;;;OAIG;YACW,QAAQ;IA4CtB,oGAAoG;IACpG,OAAO,CAAC,aAAa;IAId,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAYrC,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAS7C,kFAAkF;IAC3E,cAAc,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM;IAI5C,WAAW,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI;IAIvC,YAAY,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI;yCA1HtC,kBAAkB;2CAAlB,kBAAkB;CA6H9B;AAED,gEAAgE;AAChE,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
@@ -26,13 +26,31 @@ function AgentRealtimePanel_Conditional_2_Template(rf, ctx) { if (rf & 1) {
26
26
  i0.ɵɵadvance();
27
27
  i0.ɵɵtextInterpolate(ctx_r0.LoadError);
28
28
  } }
29
+ function AgentRealtimePanel_Conditional_3_Conditional_7_Template(rf, ctx) { if (rf & 1) {
30
+ i0.ɵɵelementStart(0, "span", 7);
31
+ i0.ɵɵtext(1);
32
+ i0.ɵɵelementEnd();
33
+ } if (rf & 2) {
34
+ const ctx_r0 = i0.ɵɵnextContext(2);
35
+ i0.ɵɵadvance();
36
+ i0.ɵɵtextInterpolate(ctx_r0.Pairings.length);
37
+ } }
38
+ function AgentRealtimePanel_Conditional_3_Conditional_8_Template(rf, ctx) { if (rf & 1) {
39
+ i0.ɵɵelementStart(0, "mj-alert", 8);
40
+ i0.ɵɵtext(1);
41
+ i0.ɵɵelementEnd();
42
+ } if (rf & 2) {
43
+ const ctx_r0 = i0.ɵɵnextContext(2);
44
+ i0.ɵɵadvance();
45
+ i0.ɵɵtextInterpolate(ctx_r0.PairingsError);
46
+ } }
29
47
  function AgentRealtimePanel_Conditional_3_Conditional_9_Template(rf, ctx) { if (rf & 1) {
30
- i0.ɵɵelementStart(0, "div", 8);
48
+ i0.ɵɵelementStart(0, "div", 9);
31
49
  i0.ɵɵtext(1, "No co-agent pairings reference this agent.");
32
50
  i0.ɵɵelementEnd();
33
51
  } }
34
52
  function AgentRealtimePanel_Conditional_3_Conditional_10_For_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
35
- i0.ɵɵelementStart(0, "span", 20);
53
+ i0.ɵɵelementStart(0, "span", 21);
36
54
  i0.ɵɵtext(1, "voices");
37
55
  i0.ɵɵelementEnd();
38
56
  i0.ɵɵtext(2);
@@ -43,7 +61,7 @@ function AgentRealtimePanel_Conditional_3_Conditional_10_For_2_Conditional_6_Tem
43
61
  i0.ɵɵtextInterpolate1(" ", ctx_r0.OtherAgentName(p_r3), " ");
44
62
  } }
45
63
  function AgentRealtimePanel_Conditional_3_Conditional_10_For_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
46
- i0.ɵɵelementStart(0, "span", 20);
64
+ i0.ɵɵelementStart(0, "span", 21);
47
65
  i0.ɵɵtext(1, "voiced by");
48
66
  i0.ɵɵelementEnd();
49
67
  i0.ɵɵtext(2);
@@ -55,26 +73,26 @@ function AgentRealtimePanel_Conditional_3_Conditional_10_For_2_Conditional_7_Tem
55
73
  } }
56
74
  function AgentRealtimePanel_Conditional_3_Conditional_10_For_2_Conditional_10_Template(rf, ctx) { if (rf & 1) {
57
75
  i0.ɵɵtext(0, " \u00B7 ");
58
- i0.ɵɵelementStart(1, "span", 21);
76
+ i0.ɵɵelementStart(1, "span", 22);
59
77
  i0.ɵɵtext(2, "default");
60
78
  i0.ɵɵelementEnd();
61
79
  } }
62
80
  function AgentRealtimePanel_Conditional_3_Conditional_10_For_2_Template(rf, ctx) { if (rf & 1) {
63
81
  const _r2 = i0.ɵɵgetCurrentView();
64
- i0.ɵɵelementStart(0, "button", 14);
82
+ i0.ɵɵelementStart(0, "button", 15);
65
83
  i0.ɵɵlistener("click", function AgentRealtimePanel_Conditional_3_Conditional_10_For_2_Template_button_click_0_listener() { const p_r3 = i0.ɵɵrestoreView(_r2).$implicit; const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OpenPairing(p_r3)); });
66
- i0.ɵɵelementStart(1, "span", 15);
84
+ i0.ɵɵelementStart(1, "span", 16);
67
85
  i0.ɵɵelement(2, "i");
68
86
  i0.ɵɵelementEnd();
69
- i0.ɵɵelementStart(3, "span", 16)(4, "span", 17);
87
+ i0.ɵɵelementStart(3, "span", 17)(4, "span", 18);
70
88
  i0.ɵɵtext(5);
71
89
  i0.ɵɵconditionalCreate(6, AgentRealtimePanel_Conditional_3_Conditional_10_For_2_Conditional_6_Template, 3, 1)(7, AgentRealtimePanel_Conditional_3_Conditional_10_For_2_Conditional_7_Template, 3, 1);
72
90
  i0.ɵɵelementEnd();
73
- i0.ɵɵelementStart(8, "span", 18);
91
+ i0.ɵɵelementStart(8, "span", 19);
74
92
  i0.ɵɵtext(9);
75
93
  i0.ɵɵconditionalCreate(10, AgentRealtimePanel_Conditional_3_Conditional_10_For_2_Conditional_10_Template, 3, 0);
76
94
  i0.ɵɵelementEnd()();
77
- i0.ɵɵelementStart(11, "span", 19);
95
+ i0.ɵɵelementStart(11, "span", 20);
78
96
  i0.ɵɵtext(12);
79
97
  i0.ɵɵelementEnd()();
80
98
  } if (rf & 2) {
@@ -96,33 +114,51 @@ function AgentRealtimePanel_Conditional_3_Conditional_10_For_2_Template(rf, ctx)
96
114
  i0.ɵɵtextInterpolate(p_r3.Status);
97
115
  } }
98
116
  function AgentRealtimePanel_Conditional_3_Conditional_10_Template(rf, ctx) { if (rf & 1) {
99
- i0.ɵɵelementStart(0, "div", 9);
100
- i0.ɵɵrepeaterCreate(1, AgentRealtimePanel_Conditional_3_Conditional_10_For_2_Template, 13, 10, "button", 13, _forTrack0);
117
+ i0.ɵɵelementStart(0, "div", 10);
118
+ i0.ɵɵrepeaterCreate(1, AgentRealtimePanel_Conditional_3_Conditional_10_For_2_Template, 13, 10, "button", 14, _forTrack0);
101
119
  i0.ɵɵelementEnd();
102
120
  } if (rf & 2) {
103
121
  const ctx_r0 = i0.ɵɵnextContext(2);
104
122
  i0.ɵɵadvance();
105
123
  i0.ɵɵrepeater(ctx_r0.Pairings);
106
124
  } }
125
+ function AgentRealtimePanel_Conditional_3_Conditional_16_Template(rf, ctx) { if (rf & 1) {
126
+ i0.ɵɵelementStart(0, "span", 7);
127
+ i0.ɵɵtext(1);
128
+ i0.ɵɵelementEnd();
129
+ } if (rf & 2) {
130
+ const ctx_r0 = i0.ɵɵnextContext(2);
131
+ i0.ɵɵadvance();
132
+ i0.ɵɵtextInterpolate(ctx_r0.Identities.length);
133
+ } }
134
+ function AgentRealtimePanel_Conditional_3_Conditional_17_Template(rf, ctx) { if (rf & 1) {
135
+ i0.ɵɵelementStart(0, "mj-alert", 8);
136
+ i0.ɵɵtext(1);
137
+ i0.ɵɵelementEnd();
138
+ } if (rf & 2) {
139
+ const ctx_r0 = i0.ɵɵnextContext(2);
140
+ i0.ɵɵadvance();
141
+ i0.ɵɵtextInterpolate(ctx_r0.IdentitiesError);
142
+ } }
107
143
  function AgentRealtimePanel_Conditional_3_Conditional_18_Template(rf, ctx) { if (rf & 1) {
108
- i0.ɵɵelementStart(0, "div", 8);
144
+ i0.ɵɵelementStart(0, "div", 9);
109
145
  i0.ɵɵtext(1, "No bridge identities provisioned for this agent.");
110
146
  i0.ɵɵelementEnd();
111
147
  } }
112
148
  function AgentRealtimePanel_Conditional_3_Conditional_19_For_2_Template(rf, ctx) { if (rf & 1) {
113
149
  const _r4 = i0.ɵɵgetCurrentView();
114
- i0.ɵɵelementStart(0, "button", 14);
150
+ i0.ɵɵelementStart(0, "button", 15);
115
151
  i0.ɵɵlistener("click", function AgentRealtimePanel_Conditional_3_Conditional_19_For_2_Template_button_click_0_listener() { const i_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OpenIdentity(i_r5)); });
116
- i0.ɵɵelementStart(1, "span", 15);
152
+ i0.ɵɵelementStart(1, "span", 16);
117
153
  i0.ɵɵelement(2, "i");
118
154
  i0.ɵɵelementEnd();
119
- i0.ɵɵelementStart(3, "span", 16)(4, "span", 17);
155
+ i0.ɵɵelementStart(3, "span", 17)(4, "span", 18);
120
156
  i0.ɵɵtext(5);
121
157
  i0.ɵɵelementEnd();
122
- i0.ɵɵelementStart(6, "span", 18);
158
+ i0.ɵɵelementStart(6, "span", 19);
123
159
  i0.ɵɵtext(7);
124
160
  i0.ɵɵelementEnd()();
125
- i0.ɵɵelementStart(8, "span", 19);
161
+ i0.ɵɵelementStart(8, "span", 20);
126
162
  i0.ɵɵtext(9);
127
163
  i0.ɵɵelementEnd()();
128
164
  } if (rf & 2) {
@@ -140,8 +176,8 @@ function AgentRealtimePanel_Conditional_3_Conditional_19_For_2_Template(rf, ctx)
140
176
  i0.ɵɵtextInterpolate(i_r5.IsActive ? "Active" : "Inactive");
141
177
  } }
142
178
  function AgentRealtimePanel_Conditional_3_Conditional_19_Template(rf, ctx) { if (rf & 1) {
143
- i0.ɵɵelementStart(0, "div", 9);
144
- i0.ɵɵrepeaterCreate(1, AgentRealtimePanel_Conditional_3_Conditional_19_For_2_Template, 10, 9, "button", 13, _forTrack0);
179
+ i0.ɵɵelementStart(0, "div", 10);
180
+ i0.ɵɵrepeaterCreate(1, AgentRealtimePanel_Conditional_3_Conditional_19_For_2_Template, 10, 9, "button", 14, _forTrack0);
145
181
  i0.ɵɵelementEnd();
146
182
  } if (rf & 2) {
147
183
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -149,7 +185,7 @@ function AgentRealtimePanel_Conditional_3_Conditional_19_Template(rf, ctx) { if
149
185
  i0.ɵɵrepeater(ctx_r0.Identities);
150
186
  } }
151
187
  function AgentRealtimePanel_Conditional_3_Conditional_25_Template(rf, ctx) { if (rf & 1) {
152
- i0.ɵɵelementStart(0, "pre", 12);
188
+ i0.ɵɵelementStart(0, "pre", 13);
153
189
  i0.ɵɵtext(1);
154
190
  i0.ɵɵelementEnd();
155
191
  } if (rf & 2) {
@@ -158,7 +194,7 @@ function AgentRealtimePanel_Conditional_3_Conditional_25_Template(rf, ctx) { if
158
194
  i0.ɵɵtextInterpolate(ctx_r0.PrettyTypeConfiguration);
159
195
  } }
160
196
  function AgentRealtimePanel_Conditional_3_Conditional_26_Template(rf, ctx) { if (rf & 1) {
161
- i0.ɵɵelementStart(0, "div", 8);
197
+ i0.ɵɵelementStart(0, "div", 9);
162
198
  i0.ɵɵtext(1, "No type configuration set \u2014 this agent uses its type's defaults.");
163
199
  i0.ɵɵelementEnd();
164
200
  } }
@@ -171,39 +207,37 @@ function AgentRealtimePanel_Conditional_3_Template(rf, ctx) { if (rf & 1) {
171
207
  i0.ɵɵelementStart(5, "span");
172
208
  i0.ɵɵtext(6, "Co-agent pairings");
173
209
  i0.ɵɵelementEnd();
174
- i0.ɵɵelementStart(7, "span", 7);
175
- i0.ɵɵtext(8);
176
- i0.ɵɵelementEnd()();
177
- i0.ɵɵconditionalCreate(9, AgentRealtimePanel_Conditional_3_Conditional_9_Template, 2, 0, "div", 8)(10, AgentRealtimePanel_Conditional_3_Conditional_10_Template, 3, 0, "div", 9);
210
+ i0.ɵɵconditionalCreate(7, AgentRealtimePanel_Conditional_3_Conditional_7_Template, 2, 1, "span", 7);
211
+ i0.ɵɵelementEnd();
212
+ i0.ɵɵconditionalCreate(8, AgentRealtimePanel_Conditional_3_Conditional_8_Template, 2, 1, "mj-alert", 8)(9, AgentRealtimePanel_Conditional_3_Conditional_9_Template, 2, 0, "div", 9)(10, AgentRealtimePanel_Conditional_3_Conditional_10_Template, 3, 0, "div", 10);
178
213
  i0.ɵɵelementEnd();
179
214
  i0.ɵɵelementStart(11, "div", 4)(12, "div", 5);
180
- i0.ɵɵelement(13, "i", 10);
215
+ i0.ɵɵelement(13, "i", 11);
181
216
  i0.ɵɵelementStart(14, "span");
182
217
  i0.ɵɵtext(15, "Bridge identities");
183
218
  i0.ɵɵelementEnd();
184
- i0.ɵɵelementStart(16, "span", 7);
185
- i0.ɵɵtext(17);
186
- i0.ɵɵelementEnd()();
187
- i0.ɵɵconditionalCreate(18, AgentRealtimePanel_Conditional_3_Conditional_18_Template, 2, 0, "div", 8)(19, AgentRealtimePanel_Conditional_3_Conditional_19_Template, 3, 0, "div", 9);
219
+ i0.ɵɵconditionalCreate(16, AgentRealtimePanel_Conditional_3_Conditional_16_Template, 2, 1, "span", 7);
220
+ i0.ɵɵelementEnd();
221
+ i0.ɵɵconditionalCreate(17, AgentRealtimePanel_Conditional_3_Conditional_17_Template, 2, 1, "mj-alert", 8)(18, AgentRealtimePanel_Conditional_3_Conditional_18_Template, 2, 0, "div", 9)(19, AgentRealtimePanel_Conditional_3_Conditional_19_Template, 3, 0, "div", 10);
188
222
  i0.ɵɵelementEnd();
189
223
  i0.ɵɵelementStart(20, "div", 4)(21, "div", 5);
190
- i0.ɵɵelement(22, "i", 11);
224
+ i0.ɵɵelement(22, "i", 12);
191
225
  i0.ɵɵelementStart(23, "span");
192
226
  i0.ɵɵtext(24, "Type configuration");
193
227
  i0.ɵɵelementEnd()();
194
- i0.ɵɵconditionalCreate(25, AgentRealtimePanel_Conditional_3_Conditional_25_Template, 2, 1, "pre", 12)(26, AgentRealtimePanel_Conditional_3_Conditional_26_Template, 2, 0, "div", 8);
228
+ i0.ɵɵconditionalCreate(25, AgentRealtimePanel_Conditional_3_Conditional_25_Template, 2, 1, "pre", 13)(26, AgentRealtimePanel_Conditional_3_Conditional_26_Template, 2, 0, "div", 9);
195
229
  i0.ɵɵelementEnd();
196
230
  } if (rf & 2) {
197
231
  const ctx_r0 = i0.ɵɵnextContext();
198
- i0.ɵɵadvance(8);
199
- i0.ɵɵtextInterpolate(ctx_r0.Pairings.length);
232
+ i0.ɵɵadvance(7);
233
+ i0.ɵɵconditional(!ctx_r0.PairingsError ? 7 : -1);
200
234
  i0.ɵɵadvance();
201
- i0.ɵɵconditional(ctx_r0.Pairings.length === 0 ? 9 : 10);
235
+ i0.ɵɵconditional(ctx_r0.PairingsError ? 8 : ctx_r0.Pairings.length === 0 ? 9 : 10);
202
236
  i0.ɵɵadvance(8);
203
- i0.ɵɵtextInterpolate(ctx_r0.Identities.length);
237
+ i0.ɵɵconditional(!ctx_r0.IdentitiesError ? 16 : -1);
204
238
  i0.ɵɵadvance();
205
- i0.ɵɵconditional(ctx_r0.Identities.length === 0 ? 18 : 19);
206
- i0.ɵɵadvance(7);
239
+ i0.ɵɵconditional(ctx_r0.IdentitiesError ? 17 : ctx_r0.Identities.length === 0 ? 18 : 19);
240
+ i0.ɵɵadvance(8);
207
241
  i0.ɵɵconditional(ctx_r0.PrettyTypeConfiguration ? 25 : 26);
208
242
  } }
209
243
  /**
@@ -215,7 +249,7 @@ function AgentRealtimePanel_Conditional_3_Template(rf, ctx) { if (rf & 1) {
215
249
  * - its bridge agent identities ('MJ: AI Bridge Agent Identities' for this
216
250
  * agent).
217
251
  *
218
- * Registers against the 'AI Agents' entity, `after-fields` slot. The AI Agent
252
+ * Registers against the 'MJ: AI Agents' entity, `after-fields` slot. The AI Agent
219
253
  * form is a full custom override whose template doesn't emit the `after-fields`
220
254
  * marker, so this panel falls through to the container's always-present
221
255
  * `after-everything` slot and mounts at the bottom of the form — functional,
@@ -231,6 +265,10 @@ let AgentRealtimePanel = class AgentRealtimePanel extends BaseFormPanel {
231
265
  this.LoadError = null;
232
266
  this.Pairings = [];
233
267
  this.Identities = [];
268
+ /** Set when the co-agent pairing query fails; the other sections still show. */
269
+ this.PairingsError = null;
270
+ /** Set when the bridge identity query fails; the other sections still show. */
271
+ this.IdentitiesError = null;
234
272
  this.prettyTypeConfigCache = undefined;
235
273
  }
236
274
  async ngOnInit() {
@@ -267,6 +305,8 @@ let AgentRealtimePanel = class AgentRealtimePanel extends BaseFormPanel {
267
305
  return;
268
306
  this.Loading = true;
269
307
  this.LoadError = null;
308
+ this.PairingsError = null;
309
+ this.IdentitiesError = null;
270
310
  try {
271
311
  const rv = RunView.FromMetadataProvider(this.FormComponent.ProviderToUse);
272
312
  const results = await rv.RunViews([
@@ -291,6 +331,8 @@ let AgentRealtimePanel = class AgentRealtimePanel extends BaseFormPanel {
291
331
  role: UUIDsEqual(p.CoAgentID, agentId) ? 'as-coagent' : 'as-target',
292
332
  }));
293
333
  this.Identities = (results[1]?.Success ? results[1].Results : []);
334
+ this.PairingsError = results[0]?.Success ? null : this.loadErrorText('co-agent pairings', results[0]?.ErrorMessage);
335
+ this.IdentitiesError = results[1]?.Success ? null : this.loadErrorText('bridge identities', results[1]?.ErrorMessage);
294
336
  }
295
337
  catch (error) {
296
338
  console.error('Error loading agent realtime panel data:', error);
@@ -301,6 +343,10 @@ let AgentRealtimePanel = class AgentRealtimePanel extends BaseFormPanel {
301
343
  this.cdr.markForCheck();
302
344
  }
303
345
  }
346
+ /** A short "could not load" line for one section, with the underlying message when there is one. */
347
+ loadErrorText(what, detail) {
348
+ return detail ? `Could not load ${what}: ${detail}` : `Could not load ${what}.`;
349
+ }
304
350
  PairingTypeIcon(type) {
305
351
  switch (type) {
306
352
  case 'CoAgent': return 'fa-microphone-lines';
@@ -331,12 +377,12 @@ let AgentRealtimePanel = class AgentRealtimePanel extends BaseFormPanel {
331
377
  SharedService.Instance.OpenEntityRecord('MJ: AI Bridge Agent Identities', CompositeKey.FromID(i.ID));
332
378
  }
333
379
  static { this.ɵfac = /*@__PURE__*/ (() => { let ɵAgentRealtimePanel_BaseFactory; return function AgentRealtimePanel_Factory(__ngFactoryType__) { return (ɵAgentRealtimePanel_BaseFactory || (ɵAgentRealtimePanel_BaseFactory = i0.ɵɵgetInheritedFactory(AgentRealtimePanel)))(__ngFactoryType__ || AgentRealtimePanel); }; })(); }
334
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AgentRealtimePanel, selectors: [["mj-ai-agent-realtime-panel"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 3, consts: [["SectionKey", "agentRealtime", "SectionName", "Realtime", "Icon", "fa fa-tower-broadcast", 3, "Form", "FormContext"], ["text", "Loading realtime setup..."], ["Variant", "error"], [1, "rt-intro"], [1, "rt-section"], [1, "rt-section-header"], [1, "fa-solid", "fa-people-arrows"], [1, "rt-count"], [1, "rt-empty"], [1, "rt-list"], [1, "fa-solid", "fa-id-card"], [1, "fa-solid", "fa-gears"], [1, "rt-config"], ["type", "button", 1, "rt-row"], ["type", "button", 1, "rt-row", 3, "click"], [1, "rt-row-icon"], [1, "rt-row-main"], [1, "rt-row-title"], [1, "rt-row-sub"], [1, "rt-status"], [1, "rt-rel"], [1, "rt-tag"]], template: function AgentRealtimePanel_Template(rf, ctx) { if (rf & 1) {
380
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AgentRealtimePanel, selectors: [["mj-ai-agent-realtime-panel"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 4, consts: [["SectionKey", "agentRealtime", "SectionName", "Realtime", "Icon", "fa fa-tower-broadcast", 3, "Order", "Form", "FormContext"], ["text", "Loading realtime setup..."], ["Variant", "error"], [1, "rt-intro"], [1, "rt-section"], [1, "rt-section-header"], [1, "fa-solid", "fa-people-arrows"], [1, "rt-count"], ["Variant", "error", "Size", "sm"], [1, "rt-empty"], [1, "rt-list"], [1, "fa-solid", "fa-id-card"], [1, "fa-solid", "fa-gears"], [1, "rt-config"], ["type", "button", 1, "rt-row"], ["type", "button", 1, "rt-row", 3, "click"], [1, "rt-row-icon"], [1, "rt-row-main"], [1, "rt-row-title"], [1, "rt-row-sub"], [1, "rt-status"], [1, "rt-rel"], [1, "rt-tag"]], template: function AgentRealtimePanel_Template(rf, ctx) { if (rf & 1) {
335
381
  i0.ɵɵelementStart(0, "mj-collapsible-panel", 0);
336
382
  i0.ɵɵconditionalCreate(1, AgentRealtimePanel_Conditional_1_Template, 1, 0, "mj-loading", 1)(2, AgentRealtimePanel_Conditional_2_Template, 2, 1, "mj-alert", 2)(3, AgentRealtimePanel_Conditional_3_Template, 27, 5);
337
383
  i0.ɵɵelementEnd();
338
384
  } if (rf & 2) {
339
- i0.ɵɵproperty("Form", ctx.FormComponent)("FormContext", ctx.FormContext);
385
+ i0.ɵɵproperty("Order", ctx.DisplayOrder)("Form", ctx.FormComponent)("FormContext", ctx.FormContext);
340
386
  i0.ɵɵadvance();
341
387
  i0.ɵɵconditional(ctx.Loading ? 1 : ctx.LoadError ? 2 : 3);
342
388
  } }, dependencies: [i1.MJAlertComponent, i2.MjCollapsiblePanelComponent, i3.LoadingComponent], styles: ["\n\n\n.rt-intro[_ngcontent-%COMP%] {\n font-size: 12px;\n line-height: 1.5;\n color: var(--mj-text-secondary);\n margin: 0 0 14px;\n max-width: 92ch;\n}\n\n.rt-section[_ngcontent-%COMP%] { margin-bottom: 18px; }\n.rt-section[_ngcontent-%COMP%]:last-child { margin-bottom: 0; }\n\n.rt-section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n font-weight: 700;\n color: var(--mj-text-muted);\n margin: 0 0 8px;\n}\n.rt-section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n.rt-count[_ngcontent-%COMP%] {\n margin-left: auto;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n padding: 1px 8px;\n}\n\n.rt-empty[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding: 8px 0;\n}\n\n.rt-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n.rt-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n width: 100%;\n text-align: left;\n padding: 10px 14px;\n border: 0;\n border-top: 1px solid var(--mj-border-subtle);\n background: transparent;\n cursor: pointer;\n color: var(--mj-text-primary);\n transition: background 0.12s;\n}\n.rt-row[_ngcontent-%COMP%]:first-child { border-top: 0; }\n.rt-row[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); }\n\n.rt-row-icon[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n width: 30px;\n height: 30px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n.rt-row-main[_ngcontent-%COMP%] { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1 1 auto; }\n.rt-row-title[_ngcontent-%COMP%] { font-size: 13px; font-weight: 600; }\n.rt-row-title[_ngcontent-%COMP%] .rt-rel[_ngcontent-%COMP%] { color: var(--mj-text-muted); font-weight: 400; }\n.rt-row-sub[_ngcontent-%COMP%] { font-size: 11px; color: var(--mj-text-muted); }\n.rt-tag[_ngcontent-%COMP%] {\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-brand-primary);\n}\n\n.rt-status[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n font-size: 11px;\n font-weight: 600;\n padding: 2px 9px;\n border-radius: 10px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n.rt-status.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 14%, transparent);\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n\n.rt-config[_ngcontent-%COMP%] {\n margin: 0;\n padding: 12px 14px;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n font-family: ui-monospace, monospace;\n font-size: 12px;\n line-height: 1.5;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 360px;\n overflow: auto;\n}"] }); }
@@ -346,7 +392,7 @@ AgentRealtimePanel = __decorate([
346
392
  key: 'ai-agents:realtime',
347
393
  skipNullKeyWarning: true,
348
394
  metadata: {
349
- entity: 'AI Agents',
395
+ entity: 'MJ: AI Agents',
350
396
  slot: 'after-fields',
351
397
  sortKey: 40,
352
398
  },
@@ -355,7 +401,7 @@ AgentRealtimePanel = __decorate([
355
401
  export { AgentRealtimePanel };
356
402
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AgentRealtimePanel, [{
357
403
  type: Component,
358
- args: [{ standalone: false, selector: 'mj-ai-agent-realtime-panel', template: "<mj-collapsible-panel\n SectionKey=\"agentRealtime\"\n SectionName=\"Realtime\"\n Icon=\"fa fa-tower-broadcast\"\n [Form]=\"FormComponent\"\n [FormContext]=\"FormContext\">\n\n @if (Loading) {\n <mj-loading text=\"Loading realtime setup...\"></mj-loading>\n } @else if (LoadError) {\n <mj-alert Variant=\"error\">{{ LoadError }}</mj-alert>\n } @else {\n <p class=\"rt-intro\">\n A one-place summary of this agent's realtime / bridge setup \u2014 its co-agent pairings, its\n type-level realtime configuration, and the bridge identities that route inbound calls and invites to it.\n </p>\n\n <!-- Co-agent pairings -->\n <div class=\"rt-section\">\n <div class=\"rt-section-header\">\n <i class=\"fa-solid fa-people-arrows\"></i>\n <span>Co-agent pairings</span>\n <span class=\"rt-count\">{{ Pairings.length }}</span>\n </div>\n @if (Pairings.length === 0) {\n <div class=\"rt-empty\">No co-agent pairings reference this agent.</div>\n } @else {\n <div class=\"rt-list\">\n @for (p of Pairings; track p.ID) {\n <button type=\"button\" class=\"rt-row\" (click)=\"OpenPairing(p)\">\n <span class=\"rt-row-icon\"><i class=\"fa-solid {{ PairingTypeIcon(p.Type) }}\"></i></span>\n <span class=\"rt-row-main\">\n <span class=\"rt-row-title\">\n {{ p.Type }}\n @if (p.role === 'as-coagent') {\n <span class=\"rt-rel\">voices</span> {{ OtherAgentName(p) }}\n } @else {\n <span class=\"rt-rel\">voiced by</span> {{ OtherAgentName(p) }}\n }\n </span>\n <span class=\"rt-row-sub\">\n seq {{ p.Sequence }}\n @if (p.IsDefault) { \u00B7 <span class=\"rt-tag\">default</span> }\n </span>\n </span>\n <span class=\"rt-status\" [class.active]=\"p.Status === 'Active'\">{{ p.Status }}</span>\n </button>\n }\n </div>\n }\n </div>\n\n <!-- Bridge identities -->\n <div class=\"rt-section\">\n <div class=\"rt-section-header\">\n <i class=\"fa-solid fa-id-card\"></i>\n <span>Bridge identities</span>\n <span class=\"rt-count\">{{ Identities.length }}</span>\n </div>\n @if (Identities.length === 0) {\n <div class=\"rt-empty\">No bridge identities provisioned for this agent.</div>\n } @else {\n <div class=\"rt-list\">\n @for (i of Identities; track i.ID) {\n <button type=\"button\" class=\"rt-row\" (click)=\"OpenIdentity(i)\">\n <span class=\"rt-row-icon\"><i class=\"fa-solid {{ IdentityTypeIcon(i.IdentityType) }}\"></i></span>\n <span class=\"rt-row-main\">\n <span class=\"rt-row-title\">{{ i.DisplayName || i.IdentityValue }}</span>\n <span class=\"rt-row-sub\">{{ i.IdentityType }} \u00B7 {{ i.Provider }}</span>\n </span>\n <span class=\"rt-status\" [class.active]=\"i.IsActive\">{{ i.IsActive ? 'Active' : 'Inactive' }}</span>\n </button>\n }\n </div>\n }\n </div>\n\n <!-- Type configuration -->\n <div class=\"rt-section\">\n <div class=\"rt-section-header\">\n <i class=\"fa-solid fa-gears\"></i>\n <span>Type configuration</span>\n </div>\n @if (PrettyTypeConfiguration) {\n <pre class=\"rt-config\">{{ PrettyTypeConfiguration }}</pre>\n } @else {\n <div class=\"rt-empty\">No type configuration set \u2014 this agent uses its type's defaults.</div>\n }\n </div>\n }\n</mj-collapsible-panel>\n", styles: ["/* AI Agent Realtime panel \u2014 read-only summary of pairings / identities / type config.\n Tokens only. */\n\n.rt-intro {\n font-size: 12px;\n line-height: 1.5;\n color: var(--mj-text-secondary);\n margin: 0 0 14px;\n max-width: 92ch;\n}\n\n.rt-section { margin-bottom: 18px; }\n.rt-section:last-child { margin-bottom: 0; }\n\n.rt-section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n font-weight: 700;\n color: var(--mj-text-muted);\n margin: 0 0 8px;\n}\n.rt-section-header i { color: var(--mj-brand-primary); }\n.rt-count {\n margin-left: auto;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n padding: 1px 8px;\n}\n\n.rt-empty {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding: 8px 0;\n}\n\n.rt-list {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n.rt-row {\n display: flex;\n align-items: center;\n gap: 12px;\n width: 100%;\n text-align: left;\n padding: 10px 14px;\n border: 0;\n border-top: 1px solid var(--mj-border-subtle);\n background: transparent;\n cursor: pointer;\n color: var(--mj-text-primary);\n transition: background 0.12s;\n}\n.rt-row:first-child { border-top: 0; }\n.rt-row:hover { background: var(--mj-bg-surface-hover); }\n\n.rt-row-icon {\n flex: 0 0 auto;\n width: 30px;\n height: 30px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n.rt-row-main { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1 1 auto; }\n.rt-row-title { font-size: 13px; font-weight: 600; }\n.rt-row-title .rt-rel { color: var(--mj-text-muted); font-weight: 400; }\n.rt-row-sub { font-size: 11px; color: var(--mj-text-muted); }\n.rt-tag {\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-brand-primary);\n}\n\n.rt-status {\n flex: 0 0 auto;\n font-size: 11px;\n font-weight: 600;\n padding: 2px 9px;\n border-radius: 10px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n.rt-status.active {\n background: color-mix(in srgb, var(--mj-status-success) 14%, transparent);\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n\n.rt-config {\n margin: 0;\n padding: 12px 14px;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n font-family: ui-monospace, monospace;\n font-size: 12px;\n line-height: 1.5;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 360px;\n overflow: auto;\n}\n"] }]
404
+ args: [{ standalone: false, selector: 'mj-ai-agent-realtime-panel', template: "<mj-collapsible-panel\n SectionKey=\"agentRealtime\"\n [Order]=\"DisplayOrder\"\n SectionName=\"Realtime\"\n Icon=\"fa fa-tower-broadcast\"\n [Form]=\"FormComponent\"\n [FormContext]=\"FormContext\">\n\n @if (Loading) {\n <mj-loading text=\"Loading realtime setup...\"></mj-loading>\n } @else if (LoadError) {\n <mj-alert Variant=\"error\">{{ LoadError }}</mj-alert>\n } @else {\n <p class=\"rt-intro\">\n A one-place summary of this agent's realtime / bridge setup \u2014 its co-agent pairings, its\n type-level realtime configuration, and the bridge identities that route inbound calls and invites to it.\n </p>\n\n <!-- Co-agent pairings -->\n <div class=\"rt-section\">\n <div class=\"rt-section-header\">\n <i class=\"fa-solid fa-people-arrows\"></i>\n <span>Co-agent pairings</span>\n @if (!PairingsError) {\n <span class=\"rt-count\">{{ Pairings.length }}</span>\n }\n </div>\n @if (PairingsError) {\n <mj-alert Variant=\"error\" Size=\"sm\">{{ PairingsError }}</mj-alert>\n } @else if (Pairings.length === 0) {\n <div class=\"rt-empty\">No co-agent pairings reference this agent.</div>\n } @else {\n <div class=\"rt-list\">\n @for (p of Pairings; track p.ID) {\n <button type=\"button\" class=\"rt-row\" (click)=\"OpenPairing(p)\">\n <span class=\"rt-row-icon\"><i class=\"fa-solid {{ PairingTypeIcon(p.Type) }}\"></i></span>\n <span class=\"rt-row-main\">\n <span class=\"rt-row-title\">\n {{ p.Type }}\n @if (p.role === 'as-coagent') {\n <span class=\"rt-rel\">voices</span> {{ OtherAgentName(p) }}\n } @else {\n <span class=\"rt-rel\">voiced by</span> {{ OtherAgentName(p) }}\n }\n </span>\n <span class=\"rt-row-sub\">\n seq {{ p.Sequence }}\n @if (p.IsDefault) { \u00B7 <span class=\"rt-tag\">default</span> }\n </span>\n </span>\n <span class=\"rt-status\" [class.active]=\"p.Status === 'Active'\">{{ p.Status }}</span>\n </button>\n }\n </div>\n }\n </div>\n\n <!-- Bridge identities -->\n <div class=\"rt-section\">\n <div class=\"rt-section-header\">\n <i class=\"fa-solid fa-id-card\"></i>\n <span>Bridge identities</span>\n @if (!IdentitiesError) {\n <span class=\"rt-count\">{{ Identities.length }}</span>\n }\n </div>\n @if (IdentitiesError) {\n <mj-alert Variant=\"error\" Size=\"sm\">{{ IdentitiesError }}</mj-alert>\n } @else if (Identities.length === 0) {\n <div class=\"rt-empty\">No bridge identities provisioned for this agent.</div>\n } @else {\n <div class=\"rt-list\">\n @for (i of Identities; track i.ID) {\n <button type=\"button\" class=\"rt-row\" (click)=\"OpenIdentity(i)\">\n <span class=\"rt-row-icon\"><i class=\"fa-solid {{ IdentityTypeIcon(i.IdentityType) }}\"></i></span>\n <span class=\"rt-row-main\">\n <span class=\"rt-row-title\">{{ i.DisplayName || i.IdentityValue }}</span>\n <span class=\"rt-row-sub\">{{ i.IdentityType }} \u00B7 {{ i.Provider }}</span>\n </span>\n <span class=\"rt-status\" [class.active]=\"i.IsActive\">{{ i.IsActive ? 'Active' : 'Inactive' }}</span>\n </button>\n }\n </div>\n }\n </div>\n\n <!-- Type configuration -->\n <div class=\"rt-section\">\n <div class=\"rt-section-header\">\n <i class=\"fa-solid fa-gears\"></i>\n <span>Type configuration</span>\n </div>\n @if (PrettyTypeConfiguration) {\n <pre class=\"rt-config\">{{ PrettyTypeConfiguration }}</pre>\n } @else {\n <div class=\"rt-empty\">No type configuration set \u2014 this agent uses its type's defaults.</div>\n }\n </div>\n }\n</mj-collapsible-panel>\n", styles: ["/* AI Agent Realtime panel \u2014 read-only summary of pairings / identities / type config.\n Tokens only. */\n\n.rt-intro {\n font-size: 12px;\n line-height: 1.5;\n color: var(--mj-text-secondary);\n margin: 0 0 14px;\n max-width: 92ch;\n}\n\n.rt-section { margin-bottom: 18px; }\n.rt-section:last-child { margin-bottom: 0; }\n\n.rt-section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n font-weight: 700;\n color: var(--mj-text-muted);\n margin: 0 0 8px;\n}\n.rt-section-header i { color: var(--mj-brand-primary); }\n.rt-count {\n margin-left: auto;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n padding: 1px 8px;\n}\n\n.rt-empty {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding: 8px 0;\n}\n\n.rt-list {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n.rt-row {\n display: flex;\n align-items: center;\n gap: 12px;\n width: 100%;\n text-align: left;\n padding: 10px 14px;\n border: 0;\n border-top: 1px solid var(--mj-border-subtle);\n background: transparent;\n cursor: pointer;\n color: var(--mj-text-primary);\n transition: background 0.12s;\n}\n.rt-row:first-child { border-top: 0; }\n.rt-row:hover { background: var(--mj-bg-surface-hover); }\n\n.rt-row-icon {\n flex: 0 0 auto;\n width: 30px;\n height: 30px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n.rt-row-main { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1 1 auto; }\n.rt-row-title { font-size: 13px; font-weight: 600; }\n.rt-row-title .rt-rel { color: var(--mj-text-muted); font-weight: 400; }\n.rt-row-sub { font-size: 11px; color: var(--mj-text-muted); }\n.rt-tag {\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-brand-primary);\n}\n\n.rt-status {\n flex: 0 0 auto;\n font-size: 11px;\n font-weight: 600;\n padding: 2px 9px;\n border-radius: 10px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n.rt-status.active {\n background: color-mix(in srgb, var(--mj-status-success) 14%, transparent);\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n\n.rt-config {\n margin: 0;\n padding: 12px 14px;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n font-family: ui-monospace, monospace;\n font-size: 12px;\n line-height: 1.5;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 360px;\n overflow: auto;\n}\n"] }]
359
405
  }], null, null); })();
360
406
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AgentRealtimePanel, { className: "AgentRealtimePanel", filePath: "src/lib/panels/ai-agents/agent-realtime.panel.ts", lineNumber: 65 }); })();
361
407
  /** Tree-shake guard — invoked from the panels module loader. */
@@ -1 +1 @@
1
- {"version":3,"file":"agent-realtime.panel.js","sourceRoot":"","sources":["../../../../src/lib/panels/ai-agents/agent-realtime.panel.ts","../../../../src/lib/panels/ai-agents/agent-realtime.panel.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, inject, ChangeDetectorRef } from '@angular/core';\nimport { CompositeKey, RunView } from '@memberjunction/core';\nimport { RegisterClassEx, UUIDsEqual } from '@memberjunction/global';\nimport { BaseFormPanel } from '@memberjunction/ng-base-forms';\nimport { MJAIAgentEntity } from '@memberjunction/core-entities';\nimport { SharedService } from '@memberjunction/ng-shared';\n\n/** Read-only co-agent pairing row for the summary list. */\ninterface CoAgentPairingRow {\n ID: string;\n CoAgentID: string;\n CoAgent: string | null;\n TargetAgentID: string | null;\n TargetAgent: string | null;\n Type: string;\n IsDefault: boolean;\n Sequence: number;\n Status: string;\n /** 'as-coagent' = this agent IS the co-agent; 'as-target' = this agent is the voiced target. */\n role: 'as-coagent' | 'as-target';\n}\n\n/** Read-only bridge identity row for the summary list. */\ninterface BridgeIdentityRow {\n ID: string;\n IdentityType: string;\n IdentityValue: string;\n DisplayName: string | null;\n Provider: string;\n IsActive: boolean;\n}\n\n/**\n * AI Agent \"Realtime\" panel (Pattern 1 — BaseFormPanel slot). A read-only\n * summary that puts an agent's realtime / bridge setup in one place:\n * - its co-agent pairings (rows where this agent is the co-agent OR the\n * voiced target, from 'MJ: AI Agent Co Agents'),\n * - its `TypeConfiguration` (the agent's typed realtime config layer),\n * - its bridge agent identities ('MJ: AI Bridge Agent Identities' for this\n * agent).\n *\n * Registers against the 'AI Agents' entity, `after-fields` slot. The AI Agent\n * form is a full custom override whose template doesn't emit the `after-fields`\n * marker, so this panel falls through to the container's always-present\n * `after-everything` slot and mounts at the bottom of the form — functional,\n * just lower than ideal until the custom form emits the slot marker.\n *\n * Provider-correct: all RunViews are scoped to the host form's `ProviderToUse`.\n */\n@RegisterClassEx(BaseFormPanel, {\n key: 'ai-agents:realtime',\n skipNullKeyWarning: true,\n metadata: {\n entity: 'AI Agents',\n slot: 'after-fields',\n sortKey: 40,\n },\n})\n@Component({\n standalone: false,\n selector: 'mj-ai-agent-realtime-panel',\n templateUrl: './agent-realtime.panel.html',\n styleUrls: ['./agent-realtime.panel.css'],\n})\nexport class AgentRealtimePanel extends BaseFormPanel<MJAIAgentEntity> implements OnInit {\n private cdr = inject(ChangeDetectorRef);\n\n public Loading = false;\n public LoadError: string | null = null;\n public Pairings: CoAgentPairingRow[] = [];\n public Identities: BridgeIdentityRow[] = [];\n\n private prettyTypeConfigCache: string | null | undefined = undefined;\n\n async ngOnInit(): Promise<void> {\n await this.loadData();\n }\n\n /** Pretty-printed TypeConfiguration JSON (cached, falls back to raw on parse error). */\n public get PrettyTypeConfiguration(): string | null {\n if (this.prettyTypeConfigCache !== undefined) return this.prettyTypeConfigCache;\n const raw = this.Record?.TypeConfiguration ?? null;\n if (!raw) {\n this.prettyTypeConfigCache = null;\n return null;\n }\n try {\n this.prettyTypeConfigCache = JSON.stringify(JSON.parse(raw), null, 2);\n } catch {\n this.prettyTypeConfigCache = raw;\n }\n return this.prettyTypeConfigCache;\n }\n\n public get HasAnything(): boolean {\n return this.Pairings.length > 0 || this.Identities.length > 0 || this.PrettyTypeConfiguration != null;\n }\n\n /**\n * Loads the agent's pairings + bridge identities in one batched round trip,\n * scoped to the host form's provider. TypeConfiguration is read straight off\n * the already-loaded record (no query needed).\n */\n private async loadData(): Promise<void> {\n const agentId = this.Record?.ID;\n if (!agentId) return;\n\n this.Loading = true;\n this.LoadError = null;\n try {\n const rv = RunView.FromMetadataProvider(this.FormComponent.ProviderToUse);\n const results = await rv.RunViews([\n {\n EntityName: 'MJ: AI Agent Co Agents',\n Fields: ['ID', 'CoAgentID', 'CoAgent', 'TargetAgentID', 'TargetAgent', 'Type', 'IsDefault', 'Sequence', 'Status'],\n ExtraFilter: `CoAgentID='${agentId}' OR TargetAgentID='${agentId}'`,\n OrderBy: 'Sequence ASC',\n ResultType: 'simple',\n },\n {\n EntityName: 'MJ: AI Bridge Agent Identities',\n Fields: ['ID', 'IdentityType', 'IdentityValue', 'DisplayName', 'Provider', 'IsActive'],\n ExtraFilter: `AgentID='${agentId}'`,\n OrderBy: 'Provider ASC',\n ResultType: 'simple',\n },\n ]);\n\n const pairings = (results[0]?.Success ? results[0].Results : []) as Array<Omit<CoAgentPairingRow, 'role'>>;\n this.Pairings = pairings.map((p) => ({\n ...p,\n role: UUIDsEqual(p.CoAgentID, agentId) ? 'as-coagent' : 'as-target',\n }));\n this.Identities = (results[1]?.Success ? results[1].Results : []) as BridgeIdentityRow[];\n } catch (error) {\n console.error('Error loading agent realtime panel data:', error);\n this.LoadError = 'Failed to load realtime setup.';\n } finally {\n this.Loading = false;\n this.cdr.markForCheck();\n }\n }\n\n public PairingTypeIcon(type: string): string {\n switch (type) {\n case 'CoAgent': return 'fa-microphone-lines';\n case 'Delegate': return 'fa-share-from-square';\n case 'Fallback': return 'fa-life-ring';\n case 'Observer': return 'fa-eye';\n case 'Peer': return 'fa-people-arrows';\n case 'Reviewer': return 'fa-clipboard-check';\n default: return 'fa-link';\n }\n }\n\n public IdentityTypeIcon(type: string): string {\n switch (type) {\n case 'Email': return 'fa-envelope';\n case 'PhoneNumber': return 'fa-phone';\n case 'AccountID': return 'fa-id-badge';\n default: return 'fa-id-card';\n }\n }\n\n /** The \"other\" agent in a pairing (the one that isn't the agent on this form). */\n public OtherAgentName(p: CoAgentPairingRow): string {\n return p.role === 'as-coagent' ? (p.TargetAgent ?? 'this agent') : (p.CoAgent ?? 'unknown co-agent');\n }\n\n public OpenPairing(p: CoAgentPairingRow): void {\n SharedService.Instance.OpenEntityRecord('MJ: AI Agent Co Agents', CompositeKey.FromID(p.ID));\n }\n\n public OpenIdentity(i: BridgeIdentityRow): void {\n SharedService.Instance.OpenEntityRecord('MJ: AI Bridge Agent Identities', CompositeKey.FromID(i.ID));\n }\n}\n\n/** Tree-shake guard — invoked from the panels module loader. */\nexport function LoadAgentRealtimePanel(): void {\n /* no-op marker */\n}\n","<mj-collapsible-panel\n SectionKey=\"agentRealtime\"\n SectionName=\"Realtime\"\n Icon=\"fa fa-tower-broadcast\"\n [Form]=\"FormComponent\"\n [FormContext]=\"FormContext\">\n\n @if (Loading) {\n <mj-loading text=\"Loading realtime setup...\"></mj-loading>\n } @else if (LoadError) {\n <mj-alert Variant=\"error\">{{ LoadError }}</mj-alert>\n } @else {\n <p class=\"rt-intro\">\n A one-place summary of this agent's realtime / bridge setup — its co-agent pairings, its\n type-level realtime configuration, and the bridge identities that route inbound calls and invites to it.\n </p>\n\n <!-- Co-agent pairings -->\n <div class=\"rt-section\">\n <div class=\"rt-section-header\">\n <i class=\"fa-solid fa-people-arrows\"></i>\n <span>Co-agent pairings</span>\n <span class=\"rt-count\">{{ Pairings.length }}</span>\n </div>\n @if (Pairings.length === 0) {\n <div class=\"rt-empty\">No co-agent pairings reference this agent.</div>\n } @else {\n <div class=\"rt-list\">\n @for (p of Pairings; track p.ID) {\n <button type=\"button\" class=\"rt-row\" (click)=\"OpenPairing(p)\">\n <span class=\"rt-row-icon\"><i class=\"fa-solid {{ PairingTypeIcon(p.Type) }}\"></i></span>\n <span class=\"rt-row-main\">\n <span class=\"rt-row-title\">\n {{ p.Type }}\n @if (p.role === 'as-coagent') {\n <span class=\"rt-rel\">voices</span> {{ OtherAgentName(p) }}\n } @else {\n <span class=\"rt-rel\">voiced by</span> {{ OtherAgentName(p) }}\n }\n </span>\n <span class=\"rt-row-sub\">\n seq {{ p.Sequence }}\n @if (p.IsDefault) { · <span class=\"rt-tag\">default</span> }\n </span>\n </span>\n <span class=\"rt-status\" [class.active]=\"p.Status === 'Active'\">{{ p.Status }}</span>\n </button>\n }\n </div>\n }\n </div>\n\n <!-- Bridge identities -->\n <div class=\"rt-section\">\n <div class=\"rt-section-header\">\n <i class=\"fa-solid fa-id-card\"></i>\n <span>Bridge identities</span>\n <span class=\"rt-count\">{{ Identities.length }}</span>\n </div>\n @if (Identities.length === 0) {\n <div class=\"rt-empty\">No bridge identities provisioned for this agent.</div>\n } @else {\n <div class=\"rt-list\">\n @for (i of Identities; track i.ID) {\n <button type=\"button\" class=\"rt-row\" (click)=\"OpenIdentity(i)\">\n <span class=\"rt-row-icon\"><i class=\"fa-solid {{ IdentityTypeIcon(i.IdentityType) }}\"></i></span>\n <span class=\"rt-row-main\">\n <span class=\"rt-row-title\">{{ i.DisplayName || i.IdentityValue }}</span>\n <span class=\"rt-row-sub\">{{ i.IdentityType }} · {{ i.Provider }}</span>\n </span>\n <span class=\"rt-status\" [class.active]=\"i.IsActive\">{{ i.IsActive ? 'Active' : 'Inactive' }}</span>\n </button>\n }\n </div>\n }\n </div>\n\n <!-- Type configuration -->\n <div class=\"rt-section\">\n <div class=\"rt-section-header\">\n <i class=\"fa-solid fa-gears\"></i>\n <span>Type configuration</span>\n </div>\n @if (PrettyTypeConfiguration) {\n <pre class=\"rt-config\">{{ PrettyTypeConfiguration }}</pre>\n } @else {\n <div class=\"rt-empty\">No type configuration set — this agent uses its type's defaults.</div>\n }\n </div>\n }\n</mj-collapsible-panel>\n"]}
1
+ {"version":3,"file":"agent-realtime.panel.js","sourceRoot":"","sources":["../../../../src/lib/panels/ai-agents/agent-realtime.panel.ts","../../../../src/lib/panels/ai-agents/agent-realtime.panel.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, inject, ChangeDetectorRef } from '@angular/core';\nimport { CompositeKey, RunView } from '@memberjunction/core';\nimport { RegisterClassEx, UUIDsEqual } from '@memberjunction/global';\nimport { BaseFormPanel } from '@memberjunction/ng-base-forms';\nimport { MJAIAgentEntity } from '@memberjunction/core-entities';\nimport { SharedService } from '@memberjunction/ng-shared';\n\n/** Read-only co-agent pairing row for the summary list. */\ninterface CoAgentPairingRow {\n ID: string;\n CoAgentID: string;\n CoAgent: string | null;\n TargetAgentID: string | null;\n TargetAgent: string | null;\n Type: string;\n IsDefault: boolean;\n Sequence: number;\n Status: string;\n /** 'as-coagent' = this agent IS the co-agent; 'as-target' = this agent is the voiced target. */\n role: 'as-coagent' | 'as-target';\n}\n\n/** Read-only bridge identity row for the summary list. */\ninterface BridgeIdentityRow {\n ID: string;\n IdentityType: string;\n IdentityValue: string;\n DisplayName: string | null;\n Provider: string;\n IsActive: boolean;\n}\n\n/**\n * AI Agent \"Realtime\" panel (Pattern 1 — BaseFormPanel slot). A read-only\n * summary that puts an agent's realtime / bridge setup in one place:\n * - its co-agent pairings (rows where this agent is the co-agent OR the\n * voiced target, from 'MJ: AI Agent Co Agents'),\n * - its `TypeConfiguration` (the agent's typed realtime config layer),\n * - its bridge agent identities ('MJ: AI Bridge Agent Identities' for this\n * agent).\n *\n * Registers against the 'MJ: AI Agents' entity, `after-fields` slot. The AI Agent\n * form is a full custom override whose template doesn't emit the `after-fields`\n * marker, so this panel falls through to the container's always-present\n * `after-everything` slot and mounts at the bottom of the form — functional,\n * just lower than ideal until the custom form emits the slot marker.\n *\n * Provider-correct: all RunViews are scoped to the host form's `ProviderToUse`.\n */\n@RegisterClassEx(BaseFormPanel, {\n key: 'ai-agents:realtime',\n skipNullKeyWarning: true,\n metadata: {\n entity: 'MJ: AI Agents',\n slot: 'after-fields',\n sortKey: 40,\n },\n})\n@Component({\n standalone: false,\n selector: 'mj-ai-agent-realtime-panel',\n templateUrl: './agent-realtime.panel.html',\n styleUrls: ['./agent-realtime.panel.css'],\n})\nexport class AgentRealtimePanel extends BaseFormPanel<MJAIAgentEntity> implements OnInit {\n private cdr = inject(ChangeDetectorRef);\n\n public Loading = false;\n public LoadError: string | null = null;\n public Pairings: CoAgentPairingRow[] = [];\n public Identities: BridgeIdentityRow[] = [];\n /** Set when the co-agent pairing query fails; the other sections still show. */\n public PairingsError: string | null = null;\n /** Set when the bridge identity query fails; the other sections still show. */\n public IdentitiesError: string | null = null;\n\n private prettyTypeConfigCache: string | null | undefined = undefined;\n\n async ngOnInit(): Promise<void> {\n await this.loadData();\n }\n\n /** Pretty-printed TypeConfiguration JSON (cached, falls back to raw on parse error). */\n public get PrettyTypeConfiguration(): string | null {\n if (this.prettyTypeConfigCache !== undefined) return this.prettyTypeConfigCache;\n const raw = this.Record?.TypeConfiguration ?? null;\n if (!raw) {\n this.prettyTypeConfigCache = null;\n return null;\n }\n try {\n this.prettyTypeConfigCache = JSON.stringify(JSON.parse(raw), null, 2);\n } catch {\n this.prettyTypeConfigCache = raw;\n }\n return this.prettyTypeConfigCache;\n }\n\n public get HasAnything(): boolean {\n return this.Pairings.length > 0 || this.Identities.length > 0 || this.PrettyTypeConfiguration != null;\n }\n\n /**\n * Loads the agent's pairings + bridge identities in one batched round trip,\n * scoped to the host form's provider. TypeConfiguration is read straight off\n * the already-loaded record (no query needed).\n */\n private async loadData(): Promise<void> {\n const agentId = this.Record?.ID;\n if (!agentId) return;\n\n this.Loading = true;\n this.LoadError = null;\n this.PairingsError = null;\n this.IdentitiesError = null;\n try {\n const rv = RunView.FromMetadataProvider(this.FormComponent.ProviderToUse);\n const results = await rv.RunViews([\n {\n EntityName: 'MJ: AI Agent Co Agents',\n Fields: ['ID', 'CoAgentID', 'CoAgent', 'TargetAgentID', 'TargetAgent', 'Type', 'IsDefault', 'Sequence', 'Status'],\n ExtraFilter: `CoAgentID='${agentId}' OR TargetAgentID='${agentId}'`,\n OrderBy: 'Sequence ASC',\n ResultType: 'simple',\n },\n {\n EntityName: 'MJ: AI Bridge Agent Identities',\n Fields: ['ID', 'IdentityType', 'IdentityValue', 'DisplayName', 'Provider', 'IsActive'],\n ExtraFilter: `AgentID='${agentId}'`,\n OrderBy: 'Provider ASC',\n ResultType: 'simple',\n },\n ]);\n\n const pairings = (results[0]?.Success ? results[0].Results : []) as Array<Omit<CoAgentPairingRow, 'role'>>;\n this.Pairings = pairings.map((p) => ({\n ...p,\n role: UUIDsEqual(p.CoAgentID, agentId) ? 'as-coagent' : 'as-target',\n }));\n this.Identities = (results[1]?.Success ? results[1].Results : []) as BridgeIdentityRow[];\n this.PairingsError = results[0]?.Success ? null : this.loadErrorText('co-agent pairings', results[0]?.ErrorMessage);\n this.IdentitiesError = results[1]?.Success ? null : this.loadErrorText('bridge identities', results[1]?.ErrorMessage);\n } catch (error) {\n console.error('Error loading agent realtime panel data:', error);\n this.LoadError = 'Failed to load realtime setup.';\n } finally {\n this.Loading = false;\n this.cdr.markForCheck();\n }\n }\n\n /** A short \"could not load\" line for one section, with the underlying message when there is one. */\n private loadErrorText(what: string, detail: string | undefined): string {\n return detail ? `Could not load ${what}: ${detail}` : `Could not load ${what}.`;\n }\n\n public PairingTypeIcon(type: string): string {\n switch (type) {\n case 'CoAgent': return 'fa-microphone-lines';\n case 'Delegate': return 'fa-share-from-square';\n case 'Fallback': return 'fa-life-ring';\n case 'Observer': return 'fa-eye';\n case 'Peer': return 'fa-people-arrows';\n case 'Reviewer': return 'fa-clipboard-check';\n default: return 'fa-link';\n }\n }\n\n public IdentityTypeIcon(type: string): string {\n switch (type) {\n case 'Email': return 'fa-envelope';\n case 'PhoneNumber': return 'fa-phone';\n case 'AccountID': return 'fa-id-badge';\n default: return 'fa-id-card';\n }\n }\n\n /** The \"other\" agent in a pairing (the one that isn't the agent on this form). */\n public OtherAgentName(p: CoAgentPairingRow): string {\n return p.role === 'as-coagent' ? (p.TargetAgent ?? 'this agent') : (p.CoAgent ?? 'unknown co-agent');\n }\n\n public OpenPairing(p: CoAgentPairingRow): void {\n SharedService.Instance.OpenEntityRecord('MJ: AI Agent Co Agents', CompositeKey.FromID(p.ID));\n }\n\n public OpenIdentity(i: BridgeIdentityRow): void {\n SharedService.Instance.OpenEntityRecord('MJ: AI Bridge Agent Identities', CompositeKey.FromID(i.ID));\n }\n}\n\n/** Tree-shake guard — invoked from the panels module loader. */\nexport function LoadAgentRealtimePanel(): void {\n /* no-op marker */\n}\n","<mj-collapsible-panel\n SectionKey=\"agentRealtime\"\n [Order]=\"DisplayOrder\"\n SectionName=\"Realtime\"\n Icon=\"fa fa-tower-broadcast\"\n [Form]=\"FormComponent\"\n [FormContext]=\"FormContext\">\n\n @if (Loading) {\n <mj-loading text=\"Loading realtime setup...\"></mj-loading>\n } @else if (LoadError) {\n <mj-alert Variant=\"error\">{{ LoadError }}</mj-alert>\n } @else {\n <p class=\"rt-intro\">\n A one-place summary of this agent's realtime / bridge setup — its co-agent pairings, its\n type-level realtime configuration, and the bridge identities that route inbound calls and invites to it.\n </p>\n\n <!-- Co-agent pairings -->\n <div class=\"rt-section\">\n <div class=\"rt-section-header\">\n <i class=\"fa-solid fa-people-arrows\"></i>\n <span>Co-agent pairings</span>\n @if (!PairingsError) {\n <span class=\"rt-count\">{{ Pairings.length }}</span>\n }\n </div>\n @if (PairingsError) {\n <mj-alert Variant=\"error\" Size=\"sm\">{{ PairingsError }}</mj-alert>\n } @else if (Pairings.length === 0) {\n <div class=\"rt-empty\">No co-agent pairings reference this agent.</div>\n } @else {\n <div class=\"rt-list\">\n @for (p of Pairings; track p.ID) {\n <button type=\"button\" class=\"rt-row\" (click)=\"OpenPairing(p)\">\n <span class=\"rt-row-icon\"><i class=\"fa-solid {{ PairingTypeIcon(p.Type) }}\"></i></span>\n <span class=\"rt-row-main\">\n <span class=\"rt-row-title\">\n {{ p.Type }}\n @if (p.role === 'as-coagent') {\n <span class=\"rt-rel\">voices</span> {{ OtherAgentName(p) }}\n } @else {\n <span class=\"rt-rel\">voiced by</span> {{ OtherAgentName(p) }}\n }\n </span>\n <span class=\"rt-row-sub\">\n seq {{ p.Sequence }}\n @if (p.IsDefault) { · <span class=\"rt-tag\">default</span> }\n </span>\n </span>\n <span class=\"rt-status\" [class.active]=\"p.Status === 'Active'\">{{ p.Status }}</span>\n </button>\n }\n </div>\n }\n </div>\n\n <!-- Bridge identities -->\n <div class=\"rt-section\">\n <div class=\"rt-section-header\">\n <i class=\"fa-solid fa-id-card\"></i>\n <span>Bridge identities</span>\n @if (!IdentitiesError) {\n <span class=\"rt-count\">{{ Identities.length }}</span>\n }\n </div>\n @if (IdentitiesError) {\n <mj-alert Variant=\"error\" Size=\"sm\">{{ IdentitiesError }}</mj-alert>\n } @else if (Identities.length === 0) {\n <div class=\"rt-empty\">No bridge identities provisioned for this agent.</div>\n } @else {\n <div class=\"rt-list\">\n @for (i of Identities; track i.ID) {\n <button type=\"button\" class=\"rt-row\" (click)=\"OpenIdentity(i)\">\n <span class=\"rt-row-icon\"><i class=\"fa-solid {{ IdentityTypeIcon(i.IdentityType) }}\"></i></span>\n <span class=\"rt-row-main\">\n <span class=\"rt-row-title\">{{ i.DisplayName || i.IdentityValue }}</span>\n <span class=\"rt-row-sub\">{{ i.IdentityType }} · {{ i.Provider }}</span>\n </span>\n <span class=\"rt-status\" [class.active]=\"i.IsActive\">{{ i.IsActive ? 'Active' : 'Inactive' }}</span>\n </button>\n }\n </div>\n }\n </div>\n\n <!-- Type configuration -->\n <div class=\"rt-section\">\n <div class=\"rt-section-header\">\n <i class=\"fa-solid fa-gears\"></i>\n <span>Type configuration</span>\n </div>\n @if (PrettyTypeConfiguration) {\n <pre class=\"rt-config\">{{ PrettyTypeConfiguration }}</pre>\n } @else {\n <div class=\"rt-empty\">No type configuration set — this agent uses its type's defaults.</div>\n }\n </div>\n }\n</mj-collapsible-panel>\n"]}
@@ -216,13 +216,13 @@ let AISkillSharingPanel = class AISkillSharingPanel extends BaseFormPanel {
216
216
  } if (rf & 2) {
217
217
  let _t;
218
218
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.ImportFileInput = _t.first);
219
- } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 4, consts: [["importFileInput", ""], ["SectionKey", "aiSkillSharing", "SectionName", "Sharing & Portability", "Icon", "fa fa-share-nodes", 3, "Form", "FormContext"], [1, "ai-skill-sharing-hint"], [1, "ai-skill-sharing-actions"], [3, "Skill"], ["mjButton", "", "variant", "secondary", "size", "sm"], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "click", "disabled"], ["type", "file", "accept", ".md,.SKILL.md,text/markdown", 1, "ai-skill-sharing-file-input", 3, "change"], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "click"], [1, "fa-solid", "fa-shield-halved"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-file-export"], [1, "fa-solid", "fa-file-import"], [3, "Closed", "Skill"]], template: function AISkillSharingPanel_Template(rf, ctx) { if (rf & 1) {
219
+ } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 5, consts: [["importFileInput", ""], ["SectionKey", "aiSkillSharing", "SectionName", "Sharing & Portability", "Icon", "fa fa-share-nodes", 3, "Order", "Form", "FormContext"], [1, "ai-skill-sharing-hint"], [1, "ai-skill-sharing-actions"], [3, "Skill"], ["mjButton", "", "variant", "secondary", "size", "sm"], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "click", "disabled"], ["type", "file", "accept", ".md,.SKILL.md,text/markdown", 1, "ai-skill-sharing-file-input", 3, "change"], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "click"], [1, "fa-solid", "fa-shield-halved"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-file-export"], [1, "fa-solid", "fa-file-import"], [3, "Closed", "Skill"]], template: function AISkillSharingPanel_Template(rf, ctx) { if (rf & 1) {
220
220
  i0.ɵɵelementStart(0, "mj-collapsible-panel", 1);
221
221
  i0.ɵɵconditionalCreate(1, AISkillSharingPanel_Conditional_1_Template, 2, 0, "p", 2)(2, AISkillSharingPanel_Conditional_2_Template, 10, 5, "div", 3);
222
222
  i0.ɵɵelementEnd();
223
223
  i0.ɵɵconditionalCreate(3, AISkillSharingPanel_Conditional_3_Template, 1, 1, "mj-skill-permissions-dialog", 4);
224
224
  } if (rf & 2) {
225
- i0.ɵɵproperty("Form", ctx.FormComponent)("FormContext", ctx.FormContext);
225
+ i0.ɵɵproperty("Order", ctx.DisplayOrder)("Form", ctx.FormComponent)("FormContext", ctx.FormContext);
226
226
  i0.ɵɵadvance();
227
227
  i0.ɵɵconditional(!ctx.CanExportImport ? 1 : 2);
228
228
  i0.ɵɵadvance(2);
@@ -239,7 +239,7 @@ AISkillSharingPanel = __decorate([
239
239
  export { AISkillSharingPanel };
240
240
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AISkillSharingPanel, [{
241
241
  type: Component,
242
- args: [{ standalone: false, selector: 'mj-ai-skill-sharing-panel', template: "<mj-collapsible-panel\n SectionKey=\"aiSkillSharing\"\n SectionName=\"Sharing &amp; Portability\"\n Icon=\"fa fa-share-nodes\"\n [Form]=\"FormComponent\"\n [FormContext]=\"FormContext\">\n\n @if (!CanExportImport) {\n <p class=\"ai-skill-sharing-hint\">Save this skill first to share it or export/import SKILL.md.</p>\n } @else {\n <div class=\"ai-skill-sharing-actions\">\n @if (CanShareSkills) {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OpenPermissionsDialog()\">\n <i class=\"fa-solid fa-shield-halved\"></i> Manage Permissions\n </button>\n }\n\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"IsExporting\" (click)=\"ExportMarkdown()\">\n @if (IsExporting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Exporting\u2026\n } @else {\n <i class=\"fa-solid fa-file-export\"></i> Export SKILL.md\n }\n </button>\n\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"IsImporting\" (click)=\"TriggerImport()\">\n @if (IsImporting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Importing\u2026\n } @else {\n <i class=\"fa-solid fa-file-import\"></i> Import SKILL.md\n }\n </button>\n <input #importFileInput type=\"file\" accept=\".md,.SKILL.md,text/markdown\" class=\"ai-skill-sharing-file-input\" (change)=\"OnImportFileSelected($event)\" />\n </div>\n }\n</mj-collapsible-panel>\n\n@if (PermissionsDialogVisible) {\n <mj-skill-permissions-dialog\n [Skill]=\"Record\"\n (Closed)=\"OnPermissionsDialogClosed()\">\n </mj-skill-permissions-dialog>\n}\n", styles: [".ai-skill-sharing-hint {\n color: var(--mj-text-muted);\n font-size: 0.875rem;\n margin: 0;\n}\n\n.ai-skill-sharing-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n align-items: center;\n}\n\n.ai-skill-sharing-file-input {\n display: none;\n}\n"] }]
242
+ args: [{ standalone: false, selector: 'mj-ai-skill-sharing-panel', template: "<mj-collapsible-panel\n SectionKey=\"aiSkillSharing\"\n [Order]=\"DisplayOrder\"\n SectionName=\"Sharing &amp; Portability\"\n Icon=\"fa fa-share-nodes\"\n [Form]=\"FormComponent\"\n [FormContext]=\"FormContext\">\n\n @if (!CanExportImport) {\n <p class=\"ai-skill-sharing-hint\">Save this skill first to share it or export/import SKILL.md.</p>\n } @else {\n <div class=\"ai-skill-sharing-actions\">\n @if (CanShareSkills) {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OpenPermissionsDialog()\">\n <i class=\"fa-solid fa-shield-halved\"></i> Manage Permissions\n </button>\n }\n\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"IsExporting\" (click)=\"ExportMarkdown()\">\n @if (IsExporting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Exporting\u2026\n } @else {\n <i class=\"fa-solid fa-file-export\"></i> Export SKILL.md\n }\n </button>\n\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"IsImporting\" (click)=\"TriggerImport()\">\n @if (IsImporting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Importing\u2026\n } @else {\n <i class=\"fa-solid fa-file-import\"></i> Import SKILL.md\n }\n </button>\n <input #importFileInput type=\"file\" accept=\".md,.SKILL.md,text/markdown\" class=\"ai-skill-sharing-file-input\" (change)=\"OnImportFileSelected($event)\" />\n </div>\n }\n</mj-collapsible-panel>\n\n@if (PermissionsDialogVisible) {\n <mj-skill-permissions-dialog\n [Skill]=\"Record\"\n (Closed)=\"OnPermissionsDialogClosed()\">\n </mj-skill-permissions-dialog>\n}\n", styles: [".ai-skill-sharing-hint {\n color: var(--mj-text-muted);\n font-size: 0.875rem;\n margin: 0;\n}\n\n.ai-skill-sharing-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n align-items: center;\n}\n\n.ai-skill-sharing-file-input {\n display: none;\n}\n"] }]
243
243
  }], null, { ImportFileInput: [{
244
244
  type: ViewChild,
245
245
  args: ['importFileInput']
@@ -1 +1 @@
1
- {"version":3,"file":"ai-skill-sharing-panel.component.js","sourceRoot":"","sources":["../../../../src/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.ts","../../../../src/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewChild, ElementRef } from '@angular/core';\nimport { RegisterClassEx } from '@memberjunction/global';\nimport { BaseFormPanel } from '@memberjunction/ng-base-forms';\nimport { Metadata, AuthorizationEvaluator } from '@memberjunction/core';\nimport { MJAISkillEntity } from '@memberjunction/core-entities';\n// CodeGen-generated Remote Operation classes for AISkill.ExportMarkdown / AISkill.ImportMarkdown\n// (see metadata/remote-operations/.remote-operations.json) — requires `mj codegen` to have run\n// against the migration that seeds them before this file compiles.\nimport { AISkillExportMarkdownOperation, AISkillImportMarkdownOperation } from '@memberjunction/core-entities';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\n/** `MJ: Authorizations.Name` gating the Manage Permissions action — seeded in metadata/authorizations/.agent-skills.json. */\nconst CAN_SHARE_SKILLS_AUTH_NAME = 'Can Share Skills';\n\n/**\n * Adds Manage Permissions / Export SKILL.md / Import SKILL.md actions to the generated\n * `MJ: AI Skills` form via the BaseFormPanel slot system (Pattern 1 — see PANELS.md) rather than a\n * full custom form override, since the generated form's field panels and related-entity grids are\n * otherwise fine as-is.\n *\n * - Manage Permissions opens the dedicated `<mj-skill-permissions-dialog>` (from\n * `@memberjunction/ng-agents`), which reads/writes the dedicated `MJ: AI Skill Permissions`\n * table (per-user / per-role View/Run/Edit/Delete) — the same open-by-default, dedicated-table\n * model AI Agents use. It is gated behind the \"Can Share Skills\" authorization; authoring/using\n * your own skills never requires it.\n * - Export/Import call the `AISkill.ExportMarkdown` / `AISkill.ImportMarkdown` Remote Operations\n * (typed, provider-routed — see guides/REMOTE_OPERATIONS_GUIDE.md), which wrap\n * `SkillImportExportService` in `@memberjunction/ai-agents` server-side.\n */\n@RegisterClassEx(BaseFormPanel, {\n key: 'ai-skills:sharing-portability',\n skipNullKeyWarning: true,\n metadata: { entity: 'MJ: AI Skills', slot: 'after-fields', sortKey: 50 },\n})\n@Component({\n standalone: false,\n selector: 'mj-ai-skill-sharing-panel',\n templateUrl: './ai-skill-sharing-panel.component.html',\n styleUrls: ['./ai-skill-sharing-panel.component.css'],\n})\nexport class AISkillSharingPanel extends BaseFormPanel<MJAISkillEntity> {\n @ViewChild('importFileInput') ImportFileInput!: ElementRef<HTMLInputElement>;\n\n /** @deprecated Use {@link ImportFileInput}. */\n get importFileInput(): ElementRef<HTMLInputElement> {\n return this.ImportFileInput;\n }\n /** @deprecated Use {@link ImportFileInput}. */\n set importFileInput(value: ElementRef<HTMLInputElement>) {\n this.ImportFileInput = value;\n }\n\n public PermissionsDialogVisible = false;\n\n public IsExporting = false;\n public IsImporting = false;\n\n /**\n * Whether the current user may manage this skill's permission grid (per-user / per-role\n * View/Run/Edit/Delete on the skill). `BaseFormPanel` has no Provider input (the panel slot\n * system doesn't thread one through yet), so this uses the global default provider —\n * consistent with the rest of the not-yet-multi-provider-migrated panel system today.\n */\n public get CanShareSkills(): boolean {\n const md = Metadata.Provider; // global-provider-ok: BaseFormPanel slots have no Provider input; panel system is single-provider today\n if (!md?.CurrentUser) {\n return false;\n }\n const auth = md.Authorizations?.find(a => a.Name === CAN_SHARE_SKILLS_AUTH_NAME);\n if (!auth) {\n return false;\n }\n try {\n return new AuthorizationEvaluator().CurrentUserCanExecuteWithAncestors(auth, md);\n } catch {\n return false;\n }\n }\n\n public get CanExportImport(): boolean {\n return !!this.Record?.IsSaved;\n }\n\n public OpenPermissionsDialog(): void {\n this.PermissionsDialogVisible = true;\n }\n\n public OnPermissionsDialogClosed(): void {\n this.PermissionsDialogVisible = false;\n }\n\n public async ExportMarkdown(): Promise<void> {\n this.IsExporting = true;\n try {\n const result = await new AISkillExportMarkdownOperation().Execute(\n { skillID: this.Record.ID },\n { provider: Metadata.Provider } // global-provider-ok: BaseFormPanel slots have no Provider input; panel system is single-provider today\n );\n if (!result.Success || !result.Output) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Export failed: ${result.ErrorMessage ?? 'unknown error'}`,\n 'error',\n 5000\n );\n return;\n }\n this.downloadTextFile(result.Output.markdown, `${result.Output.suggestedFileName}.SKILL.md`);\n } catch (error) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Export failed: ${(error as Error).message}`,\n 'error',\n 5000\n );\n } finally {\n this.IsExporting = false;\n }\n }\n\n /** Opens the hidden file input; the actual import happens in `OnImportFileSelected`. */\n public TriggerImport(): void {\n this.ImportFileInput?.nativeElement.click();\n }\n\n public async OnImportFileSelected(event: Event): Promise<void> {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n input.value = ''; // allow re-selecting the same file next time\n if (!file) {\n return;\n }\n\n this.IsImporting = true;\n try {\n const markdownText = await file.text();\n const result = await new AISkillImportMarkdownOperation().Execute(\n { markdownText, updateSkillID: this.Record.ID },\n { provider: Metadata.Provider } // global-provider-ok: BaseFormPanel slots have no Provider input; panel system is single-provider today\n );\n if (!result.Success || !result.Output) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Import failed: ${result.ErrorMessage ?? 'unknown error'}`,\n 'error',\n 5000\n );\n return;\n }\n if (result.Output.warnings.length > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Imported \"${result.Output.skillName}\" with ${result.Output.warnings.length} warning(s): ${result.Output.warnings.join('; ')}`,\n 'warning',\n 8000\n );\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Imported \"${result.Output.skillName}\".`,\n 'success',\n 3000\n );\n }\n // Refresh this record's fields (Instructions/Description/Category may have changed).\n await this.Record.Load(this.Record.ID);\n } catch (error) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Import failed: ${(error as Error).message}`,\n 'error',\n 5000\n );\n } finally {\n this.IsImporting = false;\n }\n }\n\n private downloadTextFile(text: string, fileName: string): void {\n const blob = new Blob([text], { type: 'text/markdown' });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = fileName;\n anchor.click();\n URL.revokeObjectURL(url);\n }\n}\n","<mj-collapsible-panel\n SectionKey=\"aiSkillSharing\"\n SectionName=\"Sharing &amp; Portability\"\n Icon=\"fa fa-share-nodes\"\n [Form]=\"FormComponent\"\n [FormContext]=\"FormContext\">\n\n @if (!CanExportImport) {\n <p class=\"ai-skill-sharing-hint\">Save this skill first to share it or export/import SKILL.md.</p>\n } @else {\n <div class=\"ai-skill-sharing-actions\">\n @if (CanShareSkills) {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OpenPermissionsDialog()\">\n <i class=\"fa-solid fa-shield-halved\"></i> Manage Permissions\n </button>\n }\n\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"IsExporting\" (click)=\"ExportMarkdown()\">\n @if (IsExporting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Exporting…\n } @else {\n <i class=\"fa-solid fa-file-export\"></i> Export SKILL.md\n }\n </button>\n\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"IsImporting\" (click)=\"TriggerImport()\">\n @if (IsImporting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Importing…\n } @else {\n <i class=\"fa-solid fa-file-import\"></i> Import SKILL.md\n }\n </button>\n <input #importFileInput type=\"file\" accept=\".md,.SKILL.md,text/markdown\" class=\"ai-skill-sharing-file-input\" (change)=\"OnImportFileSelected($event)\" />\n </div>\n }\n</mj-collapsible-panel>\n\n@if (PermissionsDialogVisible) {\n <mj-skill-permissions-dialog\n [Skill]=\"Record\"\n (Closed)=\"OnPermissionsDialogClosed()\">\n </mj-skill-permissions-dialog>\n}\n"]}
1
+ {"version":3,"file":"ai-skill-sharing-panel.component.js","sourceRoot":"","sources":["../../../../src/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.ts","../../../../src/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewChild, ElementRef } from '@angular/core';\nimport { RegisterClassEx } from '@memberjunction/global';\nimport { BaseFormPanel } from '@memberjunction/ng-base-forms';\nimport { Metadata, AuthorizationEvaluator } from '@memberjunction/core';\nimport { MJAISkillEntity } from '@memberjunction/core-entities';\n// CodeGen-generated Remote Operation classes for AISkill.ExportMarkdown / AISkill.ImportMarkdown\n// (see metadata/remote-operations/.remote-operations.json) — requires `mj codegen` to have run\n// against the migration that seeds them before this file compiles.\nimport { AISkillExportMarkdownOperation, AISkillImportMarkdownOperation } from '@memberjunction/core-entities';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\n/** `MJ: Authorizations.Name` gating the Manage Permissions action — seeded in metadata/authorizations/.agent-skills.json. */\nconst CAN_SHARE_SKILLS_AUTH_NAME = 'Can Share Skills';\n\n/**\n * Adds Manage Permissions / Export SKILL.md / Import SKILL.md actions to the generated\n * `MJ: AI Skills` form via the BaseFormPanel slot system (Pattern 1 — see PANELS.md) rather than a\n * full custom form override, since the generated form's field panels and related-entity grids are\n * otherwise fine as-is.\n *\n * - Manage Permissions opens the dedicated `<mj-skill-permissions-dialog>` (from\n * `@memberjunction/ng-agents`), which reads/writes the dedicated `MJ: AI Skill Permissions`\n * table (per-user / per-role View/Run/Edit/Delete) — the same open-by-default, dedicated-table\n * model AI Agents use. It is gated behind the \"Can Share Skills\" authorization; authoring/using\n * your own skills never requires it.\n * - Export/Import call the `AISkill.ExportMarkdown` / `AISkill.ImportMarkdown` Remote Operations\n * (typed, provider-routed — see guides/REMOTE_OPERATIONS_GUIDE.md), which wrap\n * `SkillImportExportService` in `@memberjunction/ai-agents` server-side.\n */\n@RegisterClassEx(BaseFormPanel, {\n key: 'ai-skills:sharing-portability',\n skipNullKeyWarning: true,\n metadata: { entity: 'MJ: AI Skills', slot: 'after-fields', sortKey: 50 },\n})\n@Component({\n standalone: false,\n selector: 'mj-ai-skill-sharing-panel',\n templateUrl: './ai-skill-sharing-panel.component.html',\n styleUrls: ['./ai-skill-sharing-panel.component.css'],\n})\nexport class AISkillSharingPanel extends BaseFormPanel<MJAISkillEntity> {\n @ViewChild('importFileInput') ImportFileInput!: ElementRef<HTMLInputElement>;\n\n /** @deprecated Use {@link ImportFileInput}. */\n get importFileInput(): ElementRef<HTMLInputElement> {\n return this.ImportFileInput;\n }\n /** @deprecated Use {@link ImportFileInput}. */\n set importFileInput(value: ElementRef<HTMLInputElement>) {\n this.ImportFileInput = value;\n }\n\n public PermissionsDialogVisible = false;\n\n public IsExporting = false;\n public IsImporting = false;\n\n /**\n * Whether the current user may manage this skill's permission grid (per-user / per-role\n * View/Run/Edit/Delete on the skill). `BaseFormPanel` has no Provider input (the panel slot\n * system doesn't thread one through yet), so this uses the global default provider —\n * consistent with the rest of the not-yet-multi-provider-migrated panel system today.\n */\n public get CanShareSkills(): boolean {\n const md = Metadata.Provider; // global-provider-ok: BaseFormPanel slots have no Provider input; panel system is single-provider today\n if (!md?.CurrentUser) {\n return false;\n }\n const auth = md.Authorizations?.find(a => a.Name === CAN_SHARE_SKILLS_AUTH_NAME);\n if (!auth) {\n return false;\n }\n try {\n return new AuthorizationEvaluator().CurrentUserCanExecuteWithAncestors(auth, md);\n } catch {\n return false;\n }\n }\n\n public get CanExportImport(): boolean {\n return !!this.Record?.IsSaved;\n }\n\n public OpenPermissionsDialog(): void {\n this.PermissionsDialogVisible = true;\n }\n\n public OnPermissionsDialogClosed(): void {\n this.PermissionsDialogVisible = false;\n }\n\n public async ExportMarkdown(): Promise<void> {\n this.IsExporting = true;\n try {\n const result = await new AISkillExportMarkdownOperation().Execute(\n { skillID: this.Record.ID },\n { provider: Metadata.Provider } // global-provider-ok: BaseFormPanel slots have no Provider input; panel system is single-provider today\n );\n if (!result.Success || !result.Output) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Export failed: ${result.ErrorMessage ?? 'unknown error'}`,\n 'error',\n 5000\n );\n return;\n }\n this.downloadTextFile(result.Output.markdown, `${result.Output.suggestedFileName}.SKILL.md`);\n } catch (error) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Export failed: ${(error as Error).message}`,\n 'error',\n 5000\n );\n } finally {\n this.IsExporting = false;\n }\n }\n\n /** Opens the hidden file input; the actual import happens in `OnImportFileSelected`. */\n public TriggerImport(): void {\n this.ImportFileInput?.nativeElement.click();\n }\n\n public async OnImportFileSelected(event: Event): Promise<void> {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n input.value = ''; // allow re-selecting the same file next time\n if (!file) {\n return;\n }\n\n this.IsImporting = true;\n try {\n const markdownText = await file.text();\n const result = await new AISkillImportMarkdownOperation().Execute(\n { markdownText, updateSkillID: this.Record.ID },\n { provider: Metadata.Provider } // global-provider-ok: BaseFormPanel slots have no Provider input; panel system is single-provider today\n );\n if (!result.Success || !result.Output) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Import failed: ${result.ErrorMessage ?? 'unknown error'}`,\n 'error',\n 5000\n );\n return;\n }\n if (result.Output.warnings.length > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Imported \"${result.Output.skillName}\" with ${result.Output.warnings.length} warning(s): ${result.Output.warnings.join('; ')}`,\n 'warning',\n 8000\n );\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Imported \"${result.Output.skillName}\".`,\n 'success',\n 3000\n );\n }\n // Refresh this record's fields (Instructions/Description/Category may have changed).\n await this.Record.Load(this.Record.ID);\n } catch (error) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Import failed: ${(error as Error).message}`,\n 'error',\n 5000\n );\n } finally {\n this.IsImporting = false;\n }\n }\n\n private downloadTextFile(text: string, fileName: string): void {\n const blob = new Blob([text], { type: 'text/markdown' });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = fileName;\n anchor.click();\n URL.revokeObjectURL(url);\n }\n}\n","<mj-collapsible-panel\n SectionKey=\"aiSkillSharing\"\n [Order]=\"DisplayOrder\"\n SectionName=\"Sharing &amp; Portability\"\n Icon=\"fa fa-share-nodes\"\n [Form]=\"FormComponent\"\n [FormContext]=\"FormContext\">\n\n @if (!CanExportImport) {\n <p class=\"ai-skill-sharing-hint\">Save this skill first to share it or export/import SKILL.md.</p>\n } @else {\n <div class=\"ai-skill-sharing-actions\">\n @if (CanShareSkills) {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OpenPermissionsDialog()\">\n <i class=\"fa-solid fa-shield-halved\"></i> Manage Permissions\n </button>\n }\n\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"IsExporting\" (click)=\"ExportMarkdown()\">\n @if (IsExporting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Exporting…\n } @else {\n <i class=\"fa-solid fa-file-export\"></i> Export SKILL.md\n }\n </button>\n\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"IsImporting\" (click)=\"TriggerImport()\">\n @if (IsImporting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Importing…\n } @else {\n <i class=\"fa-solid fa-file-import\"></i> Import SKILL.md\n }\n </button>\n <input #importFileInput type=\"file\" accept=\".md,.SKILL.md,text/markdown\" class=\"ai-skill-sharing-file-input\" (change)=\"OnImportFileSelected($event)\" />\n </div>\n }\n</mj-collapsible-panel>\n\n@if (PermissionsDialogVisible) {\n <mj-skill-permissions-dialog\n [Skill]=\"Record\"\n (Closed)=\"OnPermissionsDialogClosed()\">\n </mj-skill-permissions-dialog>\n}\n"]}