@memberjunction/ng-core-entity-forms 6.2.0-edge.2 → 6.2.0-edge.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/custom/AIAgentCategories/ai-agent-category-header.panel.d.ts.map +1 -1
- package/dist/lib/custom/AIAgentCategories/ai-agent-category-header.panel.js +9 -5
- package/dist/lib/custom/AIAgentCategories/ai-agent-category-header.panel.js.map +1 -1
- package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.d.ts +4 -0
- package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.d.ts.map +1 -1
- package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.js +67 -36
- package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.js.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +5 -0
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js +13 -9
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +1 -0
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
- package/dist/lib/custom/Companies/company-header.panel.d.ts.map +1 -1
- package/dist/lib/custom/Companies/company-header.panel.js +9 -5
- package/dist/lib/custom/Companies/company-header.panel.js.map +1 -1
- package/dist/lib/custom/Companies/company-overview.panel.d.ts +4 -0
- package/dist/lib/custom/Companies/company-overview.panel.d.ts.map +1 -1
- package/dist/lib/custom/Companies/company-overview.panel.js +68 -37
- package/dist/lib/custom/Companies/company-overview.panel.js.map +1 -1
- package/dist/lib/custom/Conversations/conversation-header.panel.d.ts.map +1 -1
- package/dist/lib/custom/Conversations/conversation-header.panel.js +9 -5
- package/dist/lib/custom/Conversations/conversation-header.panel.js.map +1 -1
- package/dist/lib/custom/Conversations/conversation-overview.panel.d.ts +25 -4
- package/dist/lib/custom/Conversations/conversation-overview.panel.d.ts.map +1 -1
- package/dist/lib/custom/Conversations/conversation-overview.panel.js +212 -90
- package/dist/lib/custom/Conversations/conversation-overview.panel.js.map +1 -1
- package/dist/lib/custom/Employees/employee-header.panel.d.ts.map +1 -1
- package/dist/lib/custom/Employees/employee-header.panel.js +9 -5
- package/dist/lib/custom/Employees/employee-header.panel.js.map +1 -1
- package/dist/lib/custom/Employees/employee-overview.panel.d.ts +4 -0
- package/dist/lib/custom/Employees/employee-overview.panel.d.ts.map +1 -1
- package/dist/lib/custom/Employees/employee-overview.panel.js +68 -37
- package/dist/lib/custom/Employees/employee-overview.panel.js.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.d.ts +8 -0
- package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.js +19 -4
- package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
- package/dist/lib/custom/Files/file-form.component.d.ts +5 -5
- package/dist/lib/custom/Files/file-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Files/file-form.component.js +227 -157
- package/dist/lib/custom/Files/file-form.component.js.map +1 -1
- package/dist/lib/custom/Files/file-form.logic.d.ts +24 -0
- package/dist/lib/custom/Files/file-form.logic.d.ts.map +1 -0
- package/dist/lib/custom/Files/file-form.logic.js +57 -0
- package/dist/lib/custom/Files/file-form.logic.js.map +1 -0
- package/dist/lib/custom/HierarchyPanels/hierarchy-form-panels.d.ts.map +1 -1
- package/dist/lib/custom/HierarchyPanels/hierarchy-form-panels.js +60 -45
- package/dist/lib/custom/HierarchyPanels/hierarchy-form-panels.js.map +1 -1
- package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Lists/list-form.component.js +4 -2
- package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.js +3 -2
- package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
- package/dist/lib/custom/Rubrics/rubric-form.component.js +1 -1
- package/dist/lib/custom/Rubrics/rubric-form.component.js.map +1 -1
- package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts.map +1 -1
- package/dist/lib/custom/SearchScopes/searchscope-form.component.js +1 -0
- package/dist/lib/custom/SearchScopes/searchscope-form.component.js.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.js +3 -2
- package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.js +1 -0
- package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.js +1 -0
- package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.js +1 -0
- package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.js +1 -0
- package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
- package/dist/lib/custom/Users/user-header.panel.d.ts.map +1 -1
- package/dist/lib/custom/Users/user-header.panel.js +9 -5
- package/dist/lib/custom/Users/user-header.panel.js.map +1 -1
- package/dist/lib/custom/Users/user-overview.panel.d.ts +4 -0
- package/dist/lib/custom/Users/user-overview.panel.d.ts.map +1 -1
- package/dist/lib/custom/Users/user-overview.panel.js +64 -33
- package/dist/lib/custom/Users/user-overview.panel.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/agent-run-cost-split.d.ts +34 -0
- package/dist/lib/custom/ai-agent-run/agent-run-cost-split.d.ts.map +1 -0
- package/dist/lib/custom/ai-agent-run/agent-run-cost-split.js +33 -0
- package/dist/lib/custom/ai-agent-run/agent-run-cost-split.js.map +1 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +3 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +261 -242
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +1 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
- package/dist/lib/custom/custom-forms.module.d.ts +35 -34
- package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
- package/dist/lib/custom/custom-forms.module.js +6 -2
- package/dist/lib/custom/custom-forms.module.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +98 -44
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentArtifactType/mjaiagentartifacttype.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentArtifactType/mjaiagentartifacttype.form.component.js +5 -9
- package/dist/lib/generated/Entities/MJAIAgentArtifactType/mjaiagentartifacttype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentNoteType/mjaiagentnotetype.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentNoteType/mjaiagentnotetype.form.component.js +15 -18
- package/dist/lib/generated/Entities/MJAIAgentNoteType/mjaiagentnotetype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentPrompt/mjaiagentprompt.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentPrompt/mjaiagentprompt.form.component.js +5 -9
- package/dist/lib/generated/Entities/MJAIAgentPrompt/mjaiagentprompt.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js +27 -9
- package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentSessionBridge/mjaiagentsessionbridge.form.component.js +17 -15
- package/dist/lib/generated/Entities/MJAIAgentSessionBridge/mjaiagentsessionbridge.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIBridgeProvider/mjaibridgeprovider.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIBridgeProvider/mjaibridgeprovider.form.component.js +25 -7
- package/dist/lib/generated/Entities/MJAIBridgeProvider/mjaibridgeprovider.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIResultCache/mjairesultcache.form.component.js +12 -14
- package/dist/lib/generated/Entities/MJAIResultCache/mjairesultcache.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCommunicationLog/mjcommunicationlog.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJCommunicationLog/mjcommunicationlog.form.component.js +5 -9
- package/dist/lib/generated/Entities/MJCommunicationLog/mjcommunicationlog.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCompanyIntegrationRunAPILog/mjcompanyintegrationrunapilog.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJCompanyIntegrationRunAPILog/mjcompanyintegrationrunapilog.form.component.js +5 -9
- package/dist/lib/generated/Entities/MJCompanyIntegrationRunAPILog/mjcompanyintegrationrunapilog.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJComponent/mjcomponent.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJComponent/mjcomponent.form.component.js +26 -8
- package/dist/lib/generated/Entities/MJComponent/mjcomponent.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentItemAttribute/mjcontentitemattribute.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJContentItemAttribute/mjcontentitemattribute.form.component.js +4 -7
- package/dist/lib/generated/Entities/MJContentItemAttribute/mjcontentitemattribute.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentSourceParam/mjcontentsourceparam.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJContentSourceParam/mjcontentsourceparam.form.component.js +4 -7
- package/dist/lib/generated/Entities/MJContentSourceParam/mjcontentsourceparam.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js +49 -13
- package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJConversationArtifactPermission/mjconversationartifactpermission.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJConversationArtifactPermission/mjconversationartifactpermission.form.component.js +5 -9
- package/dist/lib/generated/Entities/MJConversationArtifactPermission/mjconversationartifactpermission.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJConversationBranch/mjconversationbranch.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJConversationBranch/mjconversationbranch.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJConversationBranch/mjconversationbranch.form.component.js +111 -0
- package/dist/lib/generated/Entities/MJConversationBranch/mjconversationbranch.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js +73 -75
- package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js +34 -16
- package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEmployeeRole/mjemployeerole.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEmployeeRole/mjemployeerole.form.component.js +5 -9
- package/dist/lib/generated/Entities/MJEmployeeRole/mjemployeerole.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +169 -97
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityCommunicationField/mjentitycommunicationfield.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntityCommunicationField/mjentitycommunicationfield.form.component.js +8 -11
- package/dist/lib/generated/Entities/MJEntityCommunicationField/mjentitycommunicationfield.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityDocumentType/mjentitydocumenttype.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntityDocumentType/mjentitydocumenttype.form.component.js +15 -18
- package/dist/lib/generated/Entities/MJEntityDocumentType/mjentitydocumenttype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityFormContribution/mjentityformcontribution.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJEntityFormContribution/mjentityformcontribution.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJEntityFormContribution/mjentityformcontribution.form.component.js +148 -0
- package/dist/lib/generated/Entities/MJEntityFormContribution/mjentityformcontribution.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJEnvironment/mjenvironment.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEnvironment/mjenvironment.form.component.js +53 -56
- package/dist/lib/generated/Entities/MJEnvironment/mjenvironment.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJInteraction/mjinteraction.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJInteraction/mjinteraction.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJInteraction/mjinteraction.form.component.js +161 -0
- package/dist/lib/generated/Entities/MJInteraction/mjinteraction.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJInteractionEvent/mjinteractionevent.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJInteractionEvent/mjinteractionevent.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJInteractionEvent/mjinteractionevent.form.component.js +78 -0
- package/dist/lib/generated/Entities/MJInteractionEvent/mjinteractionevent.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJInteractionLink/mjinteractionlink.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJInteractionLink/mjinteractionlink.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJInteractionLink/mjinteractionlink.form.component.js +68 -0
- package/dist/lib/generated/Entities/MJInteractionLink/mjinteractionlink.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJInteractionOffer/mjinteractionoffer.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJInteractionOffer/mjinteractionoffer.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJInteractionOffer/mjinteractionoffer.form.component.js +100 -0
- package/dist/lib/generated/Entities/MJInteractionOffer/mjinteractionoffer.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJMeeting/mjmeeting.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJMeeting/mjmeeting.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJMeeting/mjmeeting.form.component.js +119 -0
- package/dist/lib/generated/Entities/MJMeeting/mjmeeting.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJMeetingParticipant/mjmeetingparticipant.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJMeetingParticipant/mjmeetingparticipant.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJMeetingParticipant/mjmeetingparticipant.form.component.js +92 -0
- package/dist/lib/generated/Entities/MJMeetingParticipant/mjmeetingparticipant.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJNumberPool/mjnumberpool.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJNumberPool/mjnumberpool.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJNumberPool/mjnumberpool.form.component.js +87 -0
- package/dist/lib/generated/Entities/MJNumberPool/mjnumberpool.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJPhoneNumber/mjphonenumber.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJPhoneNumber/mjphonenumber.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJPhoneNumber/mjphonenumber.form.component.js +129 -0
- package/dist/lib/generated/Entities/MJPhoneNumber/mjphonenumber.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJQueryPermission/mjquerypermission.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJQueryPermission/mjquerypermission.form.component.js +5 -9
- package/dist/lib/generated/Entities/MJQueryPermission/mjquerypermission.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJRecommendationItem/mjrecommendationitem.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJRecommendationItem/mjrecommendationitem.form.component.js +8 -11
- package/dist/lib/generated/Entities/MJRecommendationItem/mjrecommendationitem.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJResourceType/mjresourcetype.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJResourceType/mjresourcetype.form.component.js +36 -40
- package/dist/lib/generated/Entities/MJResourceType/mjresourcetype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJRole/mjrole.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js +39 -21
- package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJRowLevelSecurityFilter/mjrowlevelsecurityfilter.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJRowLevelSecurityFilter/mjrowlevelsecurityfilter.form.component.js +45 -48
- package/dist/lib/generated/Entities/MJRowLevelSecurityFilter/mjrowlevelsecurityfilter.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJScopedNotificationConfig/mjscopednotificationconfig.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJScopedNotificationConfig/mjscopednotificationconfig.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJScopedNotificationConfig/mjscopednotificationconfig.form.component.js +106 -0
- package/dist/lib/generated/Entities/MJScopedNotificationConfig/mjscopednotificationconfig.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJTemplateContentType/mjtemplatecontenttype.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJTemplateContentType/mjtemplatecontenttype.form.component.js +15 -18
- package/dist/lib/generated/Entities/MJTemplateContentType/mjtemplatecontenttype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +822 -676
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUserNotificationType/mjusernotificationtype.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJUserNotificationType/mjusernotificationtype.form.component.js +24 -6
- package/dist/lib/generated/Entities/MJUserNotificationType/mjusernotificationtype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJVersionLabelItem/mjversionlabelitem.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJVersionLabelItem/mjversionlabelitem.form.component.js +5 -9
- package/dist/lib/generated/Entities/MJVersionLabelItem/mjversionlabelitem.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJWorkQueueDeduplication/mjworkqueuededuplication.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJWorkQueueDeduplication/mjworkqueuededuplication.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJWorkQueueDeduplication/mjworkqueuededuplication.form.component.js +64 -0
- package/dist/lib/generated/Entities/MJWorkQueueDeduplication/mjworkqueuededuplication.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJWorkQueueDelivery/mjworkqueuedelivery.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJWorkQueueDelivery/mjworkqueuedelivery.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJWorkQueueDelivery/mjworkqueuedelivery.form.component.js +94 -0
- package/dist/lib/generated/Entities/MJWorkQueueDelivery/mjworkqueuedelivery.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJWorkQueueMessage/mjworkqueuemessage.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJWorkQueueMessage/mjworkqueuemessage.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJWorkQueueMessage/mjworkqueuemessage.form.component.js +91 -0
- package/dist/lib/generated/Entities/MJWorkQueueMessage/mjworkqueuemessage.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJWorkQueueSubscription/mjworkqueuesubscription.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJWorkQueueSubscription/mjworkqueuesubscription.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJWorkQueueSubscription/mjworkqueuesubscription.form.component.js +105 -0
- package/dist/lib/generated/Entities/MJWorkQueueSubscription/mjworkqueuesubscription.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJWorkQueueTopic/mjworkqueuetopic.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJWorkQueueTopic/mjworkqueuetopic.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJWorkQueueTopic/mjworkqueuetopic.form.component.js +129 -0
- package/dist/lib/generated/Entities/MJWorkQueueTopic/mjworkqueuetopic.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJWorkQueueTransport/mjworkqueuetransport.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJWorkQueueTransport/mjworkqueuetransport.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJWorkQueueTransport/mjworkqueuetransport.form.component.js +85 -0
- package/dist/lib/generated/Entities/MJWorkQueueTransport/mjworkqueuetransport.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJWorkspace/mjworkspace.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJWorkspace/mjworkspace.form.component.js +17 -20
- package/dist/lib/generated/Entities/MJWorkspace/mjworkspace.form.component.js.map +1 -1
- package/dist/lib/generated/generated-forms.module.d.ts +448 -431
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
- package/dist/lib/generated/generated-forms.module.js +63 -12
- package/dist/lib/generated/generated-forms.module.js.map +1 -1
- package/dist/lib/panels/ai-agents/agent-realtime.panel.d.ts +7 -1
- package/dist/lib/panels/ai-agents/agent-realtime.panel.d.ts.map +1 -1
- package/dist/lib/panels/ai-agents/agent-realtime.panel.js +89 -43
- package/dist/lib/panels/ai-agents/agent-realtime.panel.js.map +1 -1
- package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js +3 -3
- package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js.map +1 -1
- package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js +5 -5
- package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js.map +1 -1
- package/dist/lib/panels/content-sources/website-crawler-settings.panel.js +4 -4
- package/dist/lib/panels/content-sources/website-crawler-settings.panel.js.map +1 -1
- package/dist/lib/panels/form-chrome/entity-relationship-form-role.panel.js +3 -3
- package/dist/lib/panels/form-chrome/entity-relationship-form-role.panel.js.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.panel.js +4 -4
- package/dist/lib/panels/model-predictions/model-prediction.panel.js.map +1 -1
- package/package.json +48 -47
|
@@ -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;
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
84
|
+
i0.ɵɵelementStart(1, "span", 16);
|
|
67
85
|
i0.ɵɵelement(2, "i");
|
|
68
86
|
i0.ɵɵelementEnd();
|
|
69
|
-
i0.ɵɵelementStart(3, "span",
|
|
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",
|
|
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",
|
|
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",
|
|
100
|
-
i0.ɵɵrepeaterCreate(1, AgentRealtimePanel_Conditional_3_Conditional_10_For_2_Template, 13, 10, "button",
|
|
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",
|
|
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",
|
|
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",
|
|
152
|
+
i0.ɵɵelementStart(1, "span", 16);
|
|
117
153
|
i0.ɵɵelement(2, "i");
|
|
118
154
|
i0.ɵɵelementEnd();
|
|
119
|
-
i0.ɵɵelementStart(3, "span",
|
|
155
|
+
i0.ɵɵelementStart(3, "span", 17)(4, "span", 18);
|
|
120
156
|
i0.ɵɵtext(5);
|
|
121
157
|
i0.ɵɵelementEnd();
|
|
122
|
-
i0.ɵɵelementStart(6, "span",
|
|
158
|
+
i0.ɵɵelementStart(6, "span", 19);
|
|
123
159
|
i0.ɵɵtext(7);
|
|
124
160
|
i0.ɵɵelementEnd()();
|
|
125
|
-
i0.ɵɵelementStart(8, "span",
|
|
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",
|
|
144
|
-
i0.ɵɵrepeaterCreate(1, AgentRealtimePanel_Conditional_3_Conditional_19_For_2_Template, 10, 9, "button",
|
|
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",
|
|
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",
|
|
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.ɵɵ
|
|
175
|
-
i0.ɵɵ
|
|
176
|
-
i0.ɵɵ
|
|
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",
|
|
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.ɵɵ
|
|
185
|
-
i0.ɵɵ
|
|
186
|
-
i0.ɵɵ
|
|
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",
|
|
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",
|
|
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(
|
|
199
|
-
i0.ɵɵ
|
|
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.ɵɵ
|
|
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(
|
|
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:
|
|
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:
|
|
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 & 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 & 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 & 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 & 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"]}
|