@memberjunction/ng-dashboards 5.22.0 → 5.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/README.md +51 -0
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +364 -362
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.js +2 -2
  6. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +275 -64
  7. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  8. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2645 -436
  9. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  10. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +240 -6
  11. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  12. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +2166 -256
  13. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  14. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  15. package/dist/AI/components/execution-monitoring.component.js +191 -197
  16. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  17. package/dist/AI/components/models/model-management.component.js +9 -8
  18. package/dist/AI/components/models/model-management.component.js.map +1 -1
  19. package/dist/AI/components/prompts/prompt-management.component.js +305 -299
  20. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  21. package/dist/AI/components/system/system-configuration.component.js +319 -313
  22. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  23. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +1 -2
  24. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  25. package/dist/AI/components/vectors/vector-management-resource.component.js +12 -27
  26. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  27. package/dist/APIKeys/api-applications-panel.component.js +10 -12
  28. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  29. package/dist/APIKeys/api-key-create-dialog.component.js +13 -19
  30. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  31. package/dist/APIKeys/api-key-edit-panel.component.js +12 -14
  32. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  33. package/dist/APIKeys/api-scopes-panel.component.js +61 -68
  34. package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
  35. package/dist/APIKeys/api-usage-panel.component.js +10 -11
  36. package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
  37. package/dist/Actions/components/actions-list-view.component.js +82 -96
  38. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  39. package/dist/Actions/components/actions-overview.component.js +130 -134
  40. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  41. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  42. package/dist/Actions/components/categories-list-view.component.js +40 -46
  43. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  44. package/dist/Actions/components/code-management.component.js +2 -2
  45. package/dist/Actions/components/code-management.component.js.map +1 -1
  46. package/dist/Actions/components/entity-integration.component.js +2 -2
  47. package/dist/Actions/components/entity-integration.component.js.map +1 -1
  48. package/dist/Actions/components/execution-monitoring.component.js +127 -132
  49. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  50. package/dist/Actions/components/executions-list-view.component.js +2 -2
  51. package/dist/Actions/components/executions-list-view.component.js.map +1 -1
  52. package/dist/Actions/components/explorer/action-card.component.js +11 -17
  53. package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
  54. package/dist/Actions/components/explorer/action-explorer.component.js +5 -11
  55. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  56. package/dist/Actions/components/explorer/action-list-item.component.js +8 -10
  57. package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -1
  58. package/dist/Actions/components/explorer/action-toolbar.component.js +112 -133
  59. package/dist/Actions/components/explorer/action-toolbar.component.js.map +1 -1
  60. package/dist/Actions/components/explorer/action-tree-panel.component.js +63 -83
  61. package/dist/Actions/components/explorer/action-tree-panel.component.js.map +1 -1
  62. package/dist/Actions/components/explorer/new-action-panel.component.js +17 -21
  63. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  64. package/dist/Actions/components/explorer/new-category-panel.component.js +17 -21
  65. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  66. package/dist/Actions/components/scheduled-actions.component.js +2 -2
  67. package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
  68. package/dist/Actions/components/security-permissions.component.js +2 -2
  69. package/dist/Actions/components/security-permissions.component.js.map +1 -1
  70. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +13 -5
  71. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  72. package/dist/ComponentStudio/component-studio-dashboard.component.js +168 -145
  73. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  74. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +4 -5
  75. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  76. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +197 -200
  77. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  78. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +5 -7
  79. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  80. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +142 -148
  81. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  82. package/dist/ComponentStudio/components/browser/component-browser.component.js +153 -166
  83. package/dist/ComponentStudio/components/browser/component-browser.component.js.map +1 -1
  84. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +15 -20
  85. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
  86. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +16 -21
  87. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
  88. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +18 -23
  89. package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
  90. package/dist/ComponentStudio/components/editors/spec-editor.component.js +25 -30
  91. package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
  92. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +10 -11
  93. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js.map +1 -1
  94. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts.map +1 -1
  95. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +24 -35
  96. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
  97. package/dist/ComponentStudio/components/text-import-dialog.component.js +15 -17
  98. package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
  99. package/dist/Credentials/components/credentials-categories-resource.component.js +7 -6
  100. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  101. package/dist/Credentials/components/credentials-list-resource.component.js +6 -5
  102. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  103. package/dist/Credentials/components/credentials-types-resource.component.js +7 -6
  104. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  105. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +9 -9
  106. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  107. package/dist/Home/home-dashboard.component.js +4 -4
  108. package/dist/Home/home-dashboard.component.js.map +1 -1
  109. package/dist/Integration/components/connections/connections.component.js +4 -4
  110. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  111. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +246 -259
  112. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  113. package/dist/Integration/components/widgets/integration-card.component.js +7 -9
  114. package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
  115. package/dist/Integration/integration.module.d.ts +6 -10
  116. package/dist/Integration/integration.module.d.ts.map +1 -1
  117. package/dist/Integration/integration.module.js +12 -20
  118. package/dist/Integration/integration.module.js.map +1 -1
  119. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +106 -0
  120. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -0
  121. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +607 -0
  122. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -0
  123. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +7 -2
  124. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
  125. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +59 -31
  126. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  127. package/dist/KnowledgeHub/index.d.ts +1 -0
  128. package/dist/KnowledgeHub/index.d.ts.map +1 -1
  129. package/dist/KnowledgeHub/index.js +1 -0
  130. package/dist/KnowledgeHub/index.js.map +1 -1
  131. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  132. package/dist/Lists/components/lists-browse-resource.component.js +9 -7
  133. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  134. package/dist/Lists/components/lists-my-lists-resource.component.js +5 -4
  135. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  136. package/dist/Lists/components/lists-operations-resource.component.js +10 -9
  137. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  138. package/dist/MCP/components/mcp-connection-dialog.component.js +141 -132
  139. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  140. package/dist/MCP/components/mcp-log-detail-panel.component.js +4 -4
  141. package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
  142. package/dist/MCP/components/mcp-server-dialog.component.js +141 -128
  143. package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
  144. package/dist/MCP/components/mcp-test-tool-dialog.component.js +210 -218
  145. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
  146. package/dist/MCP/mcp-dashboard.component.js +2 -2
  147. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  148. package/dist/MCP/mcp.module.d.ts +6 -9
  149. package/dist/MCP/mcp.module.d.ts.map +1 -1
  150. package/dist/MCP/mcp.module.js +20 -22
  151. package/dist/MCP/mcp.module.js.map +1 -1
  152. package/dist/Scheduling/components/scheduling-activity.component.js +5 -4
  153. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  154. package/dist/Scheduling/components/scheduling-jobs.component.js +6 -5
  155. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  156. package/dist/Scheduling/components/scheduling-overview.component.js +93 -92
  157. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  158. package/dist/Testing/testing-dashboard.component.js +9 -10
  159. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  160. package/dist/actions-dashboards.module.d.ts +8 -13
  161. package/dist/actions-dashboards.module.d.ts.map +1 -1
  162. package/dist/actions-dashboards.module.js +6 -27
  163. package/dist/actions-dashboards.module.js.map +1 -1
  164. package/dist/ai-dashboards.module.d.ts +16 -20
  165. package/dist/ai-dashboards.module.d.ts.map +1 -1
  166. package/dist/ai-dashboards.module.js +23 -44
  167. package/dist/ai-dashboards.module.js.map +1 -1
  168. package/dist/communication-dashboards.module.d.ts +4 -8
  169. package/dist/communication-dashboards.module.d.ts.map +1 -1
  170. package/dist/communication-dashboards.module.js +0 -19
  171. package/dist/communication-dashboards.module.js.map +1 -1
  172. package/dist/component-studio-dashboards.module.d.ts +7 -11
  173. package/dist/component-studio-dashboards.module.d.ts.map +1 -1
  174. package/dist/component-studio-dashboards.module.js +22 -34
  175. package/dist/component-studio-dashboards.module.js.map +1 -1
  176. package/dist/core-dashboards.module.d.ts +12 -18
  177. package/dist/core-dashboards.module.d.ts.map +1 -1
  178. package/dist/core-dashboards.module.js +15 -31
  179. package/dist/core-dashboards.module.js.map +1 -1
  180. package/dist/credentials-dashboards.module.d.ts +5 -8
  181. package/dist/credentials-dashboards.module.d.ts.map +1 -1
  182. package/dist/credentials-dashboards.module.js +3 -19
  183. package/dist/credentials-dashboards.module.js.map +1 -1
  184. package/dist/data-explorer-dashboards.module.d.ts +7 -13
  185. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  186. package/dist/data-explorer-dashboards.module.js +0 -27
  187. package/dist/data-explorer-dashboards.module.js.map +1 -1
  188. package/dist/lists-dashboards.module.d.ts +5 -8
  189. package/dist/lists-dashboards.module.d.ts.map +1 -1
  190. package/dist/lists-dashboards.module.js +3 -19
  191. package/dist/lists-dashboards.module.js.map +1 -1
  192. package/dist/public-api.d.ts +1 -0
  193. package/dist/public-api.d.ts.map +1 -1
  194. package/dist/public-api.js +1 -0
  195. package/dist/public-api.js.map +1 -1
  196. package/dist/scheduling-dashboards.module.d.ts +6 -10
  197. package/dist/scheduling-dashboards.module.d.ts.map +1 -1
  198. package/dist/scheduling-dashboards.module.js +3 -23
  199. package/dist/scheduling-dashboards.module.js.map +1 -1
  200. package/dist/testing-dashboards.module.d.ts +7 -13
  201. package/dist/testing-dashboards.module.d.ts.map +1 -1
  202. package/dist/testing-dashboards.module.js +0 -27
  203. package/dist/testing-dashboards.module.js.map +1 -1
  204. package/package.json +47 -55
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-connection-dialog.component.js","sourceRoot":"","sources":["../../../src/MCP/components/mcp-connection-dialog.component.ts","../../../src/MCP/components/mcp-connection-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview MCP Connection Dialog Component\n *\n * Dialog for creating and editing MCP server connections.\n */\n\nimport { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef, ViewChild } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { Metadata, RunView, CompositeKey } from '@memberjunction/core';\nimport { MJMCPServerConnectionEntity, MJCredentialTypeEntity } from '@memberjunction/core-entities';\nimport { MCPConnectionData, MCPServerData } from '../mcp-dashboard.component';\nimport { CredentialDialogComponent, CredentialDialogResult } from '@memberjunction/ng-credentials';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Dialog result interface\n */\nexport interface ConnectionDialogResult {\n saved: boolean;\n connection?: MCPConnectionData;\n}\n\n/**\n * MCP Connection Dialog Component\n */\n@Component({\n standalone: false,\n selector: 'mj-mcp-connection-dialog',\n templateUrl: './mcp-connection-dialog.component.html',\n styleUrls: ['./mcp-connection-dialog.component.css']\n})\nexport class MCPConnectionDialogComponent implements OnInit, OnChanges {\n\n @ViewChild('credentialDialog') credentialDialog!: CredentialDialogComponent;\n\n @Input() connection: MCPConnectionData | null = null;\n @Input() servers: MCPServerData[] = [];\n @Input() visible = false;\n @Output() close = new EventEmitter<ConnectionDialogResult>();\n\n public connectionForm: FormGroup;\n public credentials: Array<{ ID: string; Name: string }> = [];\n public companies: Array<{ ID: string; Name: string }> = [];\n public credentialTypes: MJCredentialTypeEntity[] = [];\n public IsSaving = false;\n public IsLoadingDropdowns = false;\n public ErrorMessage: string | null = null;\n public ShowCredentialDialog = false;\n\n public get IsEditMode(): boolean {\n return !!this.connection?.ID;\n }\n\n public get DialogTitle(): string {\n return this.IsEditMode ? 'Edit Connection' : 'Add Connection';\n }\n\n public get ActiveServers(): MCPServerData[] {\n return this.servers.filter(s => s.Status === 'Active');\n }\n\n constructor(\n private fb: FormBuilder,\n private cdr: ChangeDetectorRef\n ) {\n this.connectionForm = this.createForm();\n }\n\n ngOnInit(): void {\n this.loadDropdownData();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['connection'] || changes['visible']) {\n if (this.visible) {\n this.initializeForm();\n }\n }\n }\n\n private createForm(): FormGroup {\n return this.fb.group({\n MCPServerID: ['', Validators.required],\n Name: ['', [Validators.required, Validators.maxLength(200)]],\n Description: ['', Validators.maxLength(2000)],\n CompanyID: [''],\n CredentialID: [''],\n AutoSyncTools: [true],\n LogToolCalls: [true],\n LogInputParameters: [true],\n LogOutputContent: [true],\n MaxOutputLogSize: [102400, [Validators.min(0), Validators.max(10485760)]],\n CustomHeaderName: [''],\n EnvironmentVars: [''],\n Status: ['Active']\n });\n }\n\n private initializeForm(): void {\n if (this.connection) {\n this.connectionForm.patchValue({\n MCPServerID: this.connection.MCPServerID,\n Name: this.connection.Name,\n Description: this.connection.Description ?? '',\n CompanyID: this.connection.CompanyID ?? '',\n CredentialID: '', // Would need to load from entity\n AutoSyncTools: this.connection.AutoSyncTools,\n LogToolCalls: this.connection.LogToolCalls,\n LogInputParameters: true,\n LogOutputContent: true,\n MaxOutputLogSize: 102400,\n CustomHeaderName: '',\n EnvironmentVars: '',\n Status: this.connection.Status\n });\n } else {\n this.connectionForm.reset({\n MCPServerID: '',\n Name: '',\n Description: '',\n CompanyID: '',\n CredentialID: '',\n AutoSyncTools: true,\n LogToolCalls: true,\n LogInputParameters: true,\n LogOutputContent: true,\n MaxOutputLogSize: 102400,\n CustomHeaderName: '',\n EnvironmentVars: '',\n Status: 'Active'\n });\n }\n this.ErrorMessage = null;\n this.cdr.detectChanges();\n }\n\n private async loadDropdownData(): Promise<void> {\n this.IsLoadingDropdowns = true;\n try {\n const rv = new RunView();\n // Load credentials, credential types, and companies in parallel\n const [credResult, typeResult, companyResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Credentials',\n Fields: ['ID', 'Name'],\n OrderBy: 'Name',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Credential Types',\n OrderBy: 'Category, Name',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: Companies',\n Fields: ['ID', 'Name'],\n OrderBy: 'Name',\n ResultType: 'simple'\n }\n ]);\n\n if (credResult.Success) {\n this.credentials = credResult.Results as Array<{ ID: string; Name: string }> || [];\n }\n if (typeResult.Success) {\n this.credentialTypes = typeResult.Results as MJCredentialTypeEntity[] || [];\n }\n if (companyResult.Success) {\n this.companies = companyResult.Results as Array<{ ID: string; Name: string }> || [];\n }\n } catch (error) {\n console.error('Failed to load dropdown data:', error);\n } finally {\n this.IsLoadingDropdowns = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Opens the credential creation dialog\n */\n public openCredentialDialog(): void {\n this.ShowCredentialDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handles the credential dialog close event\n */\n public onCredentialDialogClose(result: CredentialDialogResult): void {\n this.ShowCredentialDialog = false;\n\n if (result.success && result.credential) {\n // Add the new credential to the list and select it\n this.credentials.push({\n ID: result.credential.ID,\n Name: result.credential.Name\n });\n // Sort credentials by name\n this.credentials.sort((a, b) => a.Name.localeCompare(b.Name));\n // Select the new credential\n this.connectionForm.patchValue({\n CredentialID: result.credential.ID\n });\n }\n\n this.cdr.detectChanges();\n }\n\n public onServerChange(): void {\n const serverId = this.connectionForm.get('MCPServerID')?.value;\n const server = this.servers.find(s => UUIDsEqual(s.ID, serverId));\n if (server && !this.connectionForm.get('Name')?.value) {\n // Auto-fill name based on server\n this.connectionForm.patchValue({\n Name: `${server.Name} Connection`\n });\n }\n }\n\n public async save(): Promise<void> {\n if (this.connectionForm.invalid) {\n this.connectionForm.markAllAsTouched();\n return;\n }\n\n this.IsSaving = true;\n this.ErrorMessage = null;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<MJMCPServerConnectionEntity>('MJ: MCP Server Connections');\n\n if (this.IsEditMode && this.connection) {\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: this.connection.ID }]));\n } else {\n entity.NewRecord();\n }\n\n // Apply form values\n const formValue = this.connectionForm.value;\n entity.MCPServerID = formValue.MCPServerID;\n entity.Name = formValue.Name;\n entity.Description = formValue.Description || null;\n entity.CompanyID = formValue.CompanyID || null;\n entity.CredentialID = formValue.CredentialID || null;\n entity.AutoSyncTools = formValue.AutoSyncTools;\n entity.LogToolCalls = formValue.LogToolCalls;\n entity.LogInputParameters = formValue.LogInputParameters;\n entity.LogOutputContent = formValue.LogOutputContent;\n entity.MaxOutputLogSize = formValue.MaxOutputLogSize || 102400;\n entity.CustomHeaderName = formValue.CustomHeaderName || null;\n entity.EnvironmentVars = formValue.EnvironmentVars || null;\n entity.Status = formValue.Status;\n\n const saved = await entity.Save();\n if (!saved) {\n // Use CompleteMessage for full error details, fall back to Message\n const errorMessage = entity.LatestResult?.CompleteMessage || entity.LatestResult?.Message || 'Unknown error';\n console.error('MCP Connection save failed:', errorMessage, entity.LatestResult);\n throw new Error(errorMessage);\n }\n\n this.close.emit({ saved: true });\n\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n this.ErrorMessage = `Failed to save: ${errorMsg}`;\n console.error('MCP Connection save error:', errorMsg);\n this.cdr.detectChanges();\n } finally {\n this.IsSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n public cancel(): void {\n this.close.emit({ saved: false });\n }\n\n public hasError(controlName: string, errorType: string): boolean {\n const control = this.connectionForm.get(controlName);\n return control?.hasError(errorType) && control?.touched || false;\n }\n}\n","@if (visible) {\n <kendo-dialog\n [title]=\"DialogTitle\"\n (close)=\"cancel()\"\n [width]=\"600\"\n [minWidth]=\"400\">\n <form [formGroup]=\"connectionForm\" class=\"connection-form\">\n <!-- Error Message -->\n @if (ErrorMessage) {\n <div class=\"error-banner\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ ErrorMessage }}\n </div>\n }\n <!-- Basic Info Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-info-circle\"></i> Basic Information</h3>\n <div class=\"form-group\">\n <label for=\"server\">MCP Server <span class=\"required\">*</span></label>\n <kendo-dropdownlist\n id=\"server\"\n formControlName=\"MCPServerID\"\n [data]=\"ActiveServers\"\n textField=\"Name\"\n valueField=\"ID\"\n [valuePrimitive]=\"true\"\n [defaultItem]=\"{ Name: 'Select a server...', ID: '' }\"\n (valueChange)=\"onServerChange()\">\n <ng-template kendoDropDownListItemTemplate let-dataItem>\n <div class=\"server-option\">\n <span class=\"server-name\">{{ dataItem.Name }}</span>\n @if (dataItem.TransportType) {\n <span class=\"server-transport\">{{ dataItem.TransportType }}</span>\n }\n </div>\n </ng-template>\n </kendo-dropdownlist>\n @if (hasError('MCPServerID', 'required')) {\n <span class=\"error-text\">Server selection is required</span>\n }\n </div>\n <div class=\"form-group\">\n <label for=\"name\">Connection Name <span class=\"required\">*</span></label>\n <input kendoTextBox\n id=\"name\"\n formControlName=\"Name\"\n placeholder=\"e.g., Production GitHub Connection\" />\n @if (hasError('Name', 'required')) {\n <span class=\"error-text\">Name is required</span>\n }\n </div>\n <div class=\"form-group\">\n <label for=\"description\">Description</label>\n <textarea kendoTextArea\n id=\"description\"\n formControlName=\"Description\"\n placeholder=\"Optional description of this connection\"\n [rows]=\"3\"></textarea>\n </div>\n <div class=\"form-group\">\n <label for=\"status\">Status</label>\n <kendo-dropdownlist\n id=\"status\"\n formControlName=\"Status\"\n [data]=\"['Active', 'Inactive']\"\n [valuePrimitive]=\"true\">\n </kendo-dropdownlist>\n </div>\n <div class=\"form-group\">\n <label for=\"company\">Company</label>\n <kendo-dropdownlist\n id=\"company\"\n formControlName=\"CompanyID\"\n [data]=\"companies\"\n textField=\"Name\"\n valueField=\"ID\"\n [valuePrimitive]=\"true\"\n [defaultItem]=\"{ Name: 'Global (all companies)', ID: '' }\">\n </kendo-dropdownlist>\n <span class=\"hint\">Leave as Global to make this connection available to all companies</span>\n </div>\n </div>\n <!-- Authentication Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-key\"></i> Authentication</h3>\n <div class=\"form-group\">\n <label for=\"credential\">Credential</label>\n @if (IsLoadingDropdowns) {\n <div class=\"loading-credentials\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Loading credentials...\n </div>\n } @else {\n <div class=\"credential-row\">\n <kendo-dropdownlist\n id=\"credential\"\n formControlName=\"CredentialID\"\n [data]=\"credentials\"\n textField=\"Name\"\n valueField=\"ID\"\n [valuePrimitive]=\"true\"\n [defaultItem]=\"{ Name: 'No credential (anonymous)', ID: '' }\">\n </kendo-dropdownlist>\n <button kendoButton\n type=\"button\"\n fillMode=\"outline\"\n (click)=\"openCredentialDialog()\"\n title=\"Create New Credential\">\n <i class=\"fa-solid fa-plus\"></i>\n New\n </button>\n </div>\n <span class=\"hint\">Select an existing credential or create a new one</span>\n }\n </div>\n <div class=\"form-group\">\n <label for=\"customHeader\">Custom Header Name</label>\n <input kendoTextBox\n id=\"customHeader\"\n formControlName=\"CustomHeaderName\"\n placeholder=\"e.g., X-Custom-API-Key\" />\n <span class=\"hint\">Override the default header name for API key authentication</span>\n </div>\n </div>\n <!-- Behavior Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-sliders\"></i> Behavior</h3>\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" kendoCheckBox formControlName=\"AutoSyncTools\" />\n <span>Auto-sync tools on connect</span>\n </label>\n <span class=\"hint\">Automatically discover and sync available tools when connecting</span>\n </div>\n </div>\n <!-- Logging Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-file-lines\"></i> Logging</h3>\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" kendoCheckBox formControlName=\"LogToolCalls\" />\n <span>Enable tool call logging</span>\n </label>\n <span class=\"hint\">Log all tool executions to the database</span>\n </div>\n <div class=\"logging-options\" [class.disabled]=\"!connectionForm.get('LogToolCalls')?.value\">\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" kendoCheckBox formControlName=\"LogInputParameters\" />\n <span>Log input parameters</span>\n </label>\n </div>\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" kendoCheckBox formControlName=\"LogOutputContent\" />\n <span>Log output content</span>\n </label>\n </div>\n <div class=\"form-group\">\n <label for=\"maxOutputSize\">Max Output Log Size (bytes)</label>\n <kendo-numerictextbox\n id=\"maxOutputSize\"\n formControlName=\"MaxOutputLogSize\"\n [min]=\"0\"\n [max]=\"10485760\"\n [step]=\"10240\"\n [format]=\"'n0'\">\n </kendo-numerictextbox>\n <span class=\"hint\">Maximum size of output content to log (0 = unlimited, max 10MB)</span>\n </div>\n </div>\n </div>\n <!-- Advanced Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-gear\"></i> Advanced</h3>\n <div class=\"form-group\">\n <label for=\"envVars\">Environment Variables (JSON)</label>\n <textarea kendoTextArea\n id=\"envVars\"\n formControlName=\"EnvironmentVars\"\n placeholder='{\"VAR_NAME\": \"value\"}'\n [rows]=\"3\"></textarea>\n <span class=\"hint\">Additional environment variables for Stdio transport (JSON object)</span>\n </div>\n </div>\n </form>\n <kendo-dialog-actions>\n <button kendoButton (click)=\"save()\" themeColor=\"primary\" [disabled]=\"IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{ IsEditMode ? 'Update' : 'Create' }}\n </button>\n <button kendoButton (click)=\"cancel()\">Cancel</button>\n </kendo-dialog-actions>\n </kendo-dialog>\n}\n\n<!-- Credential Creation Dialog -->\n@if (ShowCredentialDialog) {\n <mj-credential-dialog\n #credentialDialog\n [Visible]=\"ShowCredentialDialog\"\n (close)=\"onCredentialDialogClose($event)\">\n </mj-credential-dialog>\n}\n"]}
1
+ {"version":3,"file":"mcp-connection-dialog.component.js","sourceRoot":"","sources":["../../../src/MCP/components/mcp-connection-dialog.component.ts","../../../src/MCP/components/mcp-connection-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview MCP Connection Dialog Component\n *\n * Dialog for creating and editing MCP server connections.\n */\n\nimport { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef, ViewChild } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { Metadata, RunView, CompositeKey } from '@memberjunction/core';\nimport { MJMCPServerConnectionEntity, MJCredentialTypeEntity } from '@memberjunction/core-entities';\nimport { MCPConnectionData, MCPServerData } from '../mcp-dashboard.component';\nimport { CredentialDialogComponent, CredentialDialogResult } from '@memberjunction/ng-credentials';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Dialog result interface\n */\nexport interface ConnectionDialogResult {\n saved: boolean;\n connection?: MCPConnectionData;\n}\n\n/**\n * MCP Connection Dialog Component\n */\n@Component({\n standalone: false,\n selector: 'mj-mcp-connection-dialog',\n templateUrl: './mcp-connection-dialog.component.html',\n styleUrls: ['./mcp-connection-dialog.component.css']\n})\nexport class MCPConnectionDialogComponent implements OnInit, OnChanges {\n\n @ViewChild('credentialDialog') credentialDialog!: CredentialDialogComponent;\n\n @Input() connection: MCPConnectionData | null = null;\n @Input() servers: MCPServerData[] = [];\n @Input() visible = false;\n @Output() close = new EventEmitter<ConnectionDialogResult>();\n\n public connectionForm: FormGroup;\n public credentials: Array<{ ID: string; Name: string }> = [];\n public companies: Array<{ ID: string; Name: string }> = [];\n public credentialTypes: MJCredentialTypeEntity[] = [];\n public IsSaving = false;\n public IsLoadingDropdowns = false;\n public ErrorMessage: string | null = null;\n public ShowCredentialDialog = false;\n\n public get IsEditMode(): boolean {\n return !!this.connection?.ID;\n }\n\n public get DialogTitle(): string {\n return this.IsEditMode ? 'Edit Connection' : 'Add Connection';\n }\n\n public get ActiveServers(): MCPServerData[] {\n return this.servers.filter(s => s.Status === 'Active');\n }\n\n constructor(\n private fb: FormBuilder,\n private cdr: ChangeDetectorRef\n ) {\n this.connectionForm = this.createForm();\n }\n\n ngOnInit(): void {\n this.loadDropdownData();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['connection'] || changes['visible']) {\n if (this.visible) {\n this.initializeForm();\n }\n }\n }\n\n private createForm(): FormGroup {\n return this.fb.group({\n MCPServerID: ['', Validators.required],\n Name: ['', [Validators.required, Validators.maxLength(200)]],\n Description: ['', Validators.maxLength(2000)],\n CompanyID: [''],\n CredentialID: [''],\n AutoSyncTools: [true],\n LogToolCalls: [true],\n LogInputParameters: [true],\n LogOutputContent: [true],\n MaxOutputLogSize: [102400, [Validators.min(0), Validators.max(10485760)]],\n CustomHeaderName: [''],\n EnvironmentVars: [''],\n Status: ['Active']\n });\n }\n\n private initializeForm(): void {\n if (this.connection) {\n this.connectionForm.patchValue({\n MCPServerID: this.connection.MCPServerID,\n Name: this.connection.Name,\n Description: this.connection.Description ?? '',\n CompanyID: this.connection.CompanyID ?? '',\n CredentialID: '', // Would need to load from entity\n AutoSyncTools: this.connection.AutoSyncTools,\n LogToolCalls: this.connection.LogToolCalls,\n LogInputParameters: true,\n LogOutputContent: true,\n MaxOutputLogSize: 102400,\n CustomHeaderName: '',\n EnvironmentVars: '',\n Status: this.connection.Status\n });\n } else {\n this.connectionForm.reset({\n MCPServerID: '',\n Name: '',\n Description: '',\n CompanyID: '',\n CredentialID: '',\n AutoSyncTools: true,\n LogToolCalls: true,\n LogInputParameters: true,\n LogOutputContent: true,\n MaxOutputLogSize: 102400,\n CustomHeaderName: '',\n EnvironmentVars: '',\n Status: 'Active'\n });\n }\n this.ErrorMessage = null;\n this.cdr.detectChanges();\n }\n\n private async loadDropdownData(): Promise<void> {\n this.IsLoadingDropdowns = true;\n try {\n const rv = new RunView();\n // Load credentials, credential types, and companies in parallel\n const [credResult, typeResult, companyResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Credentials',\n Fields: ['ID', 'Name'],\n OrderBy: 'Name',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Credential Types',\n OrderBy: 'Category, Name',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: Companies',\n Fields: ['ID', 'Name'],\n OrderBy: 'Name',\n ResultType: 'simple'\n }\n ]);\n\n if (credResult.Success) {\n this.credentials = credResult.Results as Array<{ ID: string; Name: string }> || [];\n }\n if (typeResult.Success) {\n this.credentialTypes = typeResult.Results as MJCredentialTypeEntity[] || [];\n }\n if (companyResult.Success) {\n this.companies = companyResult.Results as Array<{ ID: string; Name: string }> || [];\n }\n } catch (error) {\n console.error('Failed to load dropdown data:', error);\n } finally {\n this.IsLoadingDropdowns = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Opens the credential creation dialog\n */\n public openCredentialDialog(): void {\n this.ShowCredentialDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handles the credential dialog close event\n */\n public onCredentialDialogClose(result: CredentialDialogResult): void {\n this.ShowCredentialDialog = false;\n\n if (result.success && result.credential) {\n // Add the new credential to the list and select it\n this.credentials.push({\n ID: result.credential.ID,\n Name: result.credential.Name\n });\n // Sort credentials by name\n this.credentials.sort((a, b) => a.Name.localeCompare(b.Name));\n // Select the new credential\n this.connectionForm.patchValue({\n CredentialID: result.credential.ID\n });\n }\n\n this.cdr.detectChanges();\n }\n\n public onServerChange(): void {\n const serverId = this.connectionForm.get('MCPServerID')?.value;\n const server = this.servers.find(s => UUIDsEqual(s.ID, serverId));\n if (server && !this.connectionForm.get('Name')?.value) {\n // Auto-fill name based on server\n this.connectionForm.patchValue({\n Name: `${server.Name} Connection`\n });\n }\n }\n\n public async save(): Promise<void> {\n if (this.connectionForm.invalid) {\n this.connectionForm.markAllAsTouched();\n return;\n }\n\n this.IsSaving = true;\n this.ErrorMessage = null;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<MJMCPServerConnectionEntity>('MJ: MCP Server Connections');\n\n if (this.IsEditMode && this.connection) {\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: this.connection.ID }]));\n } else {\n entity.NewRecord();\n }\n\n // Apply form values\n const formValue = this.connectionForm.value;\n entity.MCPServerID = formValue.MCPServerID;\n entity.Name = formValue.Name;\n entity.Description = formValue.Description || null;\n entity.CompanyID = formValue.CompanyID || null;\n entity.CredentialID = formValue.CredentialID || null;\n entity.AutoSyncTools = formValue.AutoSyncTools;\n entity.LogToolCalls = formValue.LogToolCalls;\n entity.LogInputParameters = formValue.LogInputParameters;\n entity.LogOutputContent = formValue.LogOutputContent;\n entity.MaxOutputLogSize = formValue.MaxOutputLogSize || 102400;\n entity.CustomHeaderName = formValue.CustomHeaderName || null;\n entity.EnvironmentVars = formValue.EnvironmentVars || null;\n entity.Status = formValue.Status;\n\n const saved = await entity.Save();\n if (!saved) {\n // Use CompleteMessage for full error details, fall back to Message\n const errorMessage = entity.LatestResult?.CompleteMessage || entity.LatestResult?.Message || 'Unknown error';\n console.error('MCP Connection save failed:', errorMessage, entity.LatestResult);\n throw new Error(errorMessage);\n }\n\n this.close.emit({ saved: true });\n\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n this.ErrorMessage = `Failed to save: ${errorMsg}`;\n console.error('MCP Connection save error:', errorMsg);\n this.cdr.detectChanges();\n } finally {\n this.IsSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n public cancel(): void {\n this.close.emit({ saved: false });\n }\n\n public hasError(controlName: string, errorType: string): boolean {\n const control = this.connectionForm.get(controlName);\n return control?.hasError(errorType) && control?.touched || false;\n }\n}\n","@if (visible) {\n <mj-dialog\n [Visible]=\"true\"\n [Title]=\"DialogTitle\"\n (Close)=\"cancel()\"\n [Width]=\"600\">\n <form [formGroup]=\"connectionForm\" class=\"connection-form\">\n <!-- Error Message -->\n @if (ErrorMessage) {\n <div class=\"error-banner\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ ErrorMessage }}\n </div>\n }\n <!-- Basic Info Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-info-circle\"></i> Basic Information</h3>\n <div class=\"form-group\">\n <label for=\"server\">MCP Server <span class=\"required\">*</span></label>\n <mj-dropdown\n [Data]=\"ActiveServers\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [DefaultItem]=\"{ Name: 'Select a server...', ID: '' }\"\n [ngModelOptions]=\"{standalone: true}\" [ngModel]=\"connectionForm.get('MCPServerID')?.value\"\n (ValueChange)=\"connectionForm.get('MCPServerID')?.setValue($any($event)); onServerChange()\">\n <ng-template #mjDropdownItem let-dataItem>\n <div class=\"server-option\">\n <span class=\"server-name\">{{ dataItem.Name }}</span>\n @if (dataItem.TransportType) {\n <span class=\"server-transport\">{{ dataItem.TransportType }}</span>\n }\n </div>\n </ng-template>\n </mj-dropdown>\n @if (hasError('MCPServerID', 'required')) {\n <span class=\"error-text\">Server selection is required</span>\n }\n </div>\n <div class=\"form-group\">\n <label for=\"name\">Connection Name <span class=\"required\">*</span></label>\n <input class=\"mj-input\"\n id=\"name\"\n formControlName=\"Name\"\n placeholder=\"e.g., Production GitHub Connection\" />\n @if (hasError('Name', 'required')) {\n <span class=\"error-text\">Name is required</span>\n }\n </div>\n <div class=\"form-group\">\n <label for=\"description\">Description</label>\n <textarea class=\"mj-textarea\"\n id=\"description\"\n formControlName=\"Description\"\n placeholder=\"Optional description of this connection\"\n [rows]=\"3\"></textarea>\n </div>\n <div class=\"form-group\">\n <label for=\"status\">Status</label>\n <mj-dropdown\n [Data]=\"['Active', 'Inactive']\"\n [ngModelOptions]=\"{standalone: true}\" [ngModel]=\"connectionForm.get('Status')?.value\"\n (ValueChange)=\"connectionForm.get('Status')?.setValue($any($event))\">\n </mj-dropdown>\n </div>\n <div class=\"form-group\">\n <label for=\"company\">Company</label>\n <mj-dropdown\n [Data]=\"companies\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [DefaultItem]=\"{ Name: 'Global (all companies)', ID: '' }\"\n [ngModelOptions]=\"{standalone: true}\" [ngModel]=\"connectionForm.get('CompanyID')?.value\"\n (ValueChange)=\"connectionForm.get('CompanyID')?.setValue($any($event))\">\n </mj-dropdown>\n <span class=\"hint\">Leave as Global to make this connection available to all companies</span>\n </div>\n </div>\n <!-- Authentication Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-key\"></i> Authentication</h3>\n <div class=\"form-group\">\n <label for=\"credential\">Credential</label>\n @if (IsLoadingDropdowns) {\n <div class=\"loading-credentials\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Loading credentials...\n </div>\n } @else {\n <div class=\"credential-row\">\n <mj-dropdown\n [Data]=\"credentials\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [DefaultItem]=\"{ Name: 'No credential (anonymous)', ID: '' }\"\n [ngModelOptions]=\"{standalone: true}\" [ngModel]=\"connectionForm.get('CredentialID')?.value\"\n (ValueChange)=\"connectionForm.get('CredentialID')?.setValue($any($event))\">\n </mj-dropdown>\n <button mjButton\n type=\"button\"\n variant=\"outline\"\n (click)=\"openCredentialDialog()\"\n title=\"Create New Credential\">\n <i class=\"fa-solid fa-plus\"></i>\n New\n </button>\n </div>\n <span class=\"hint\">Select an existing credential or create a new one</span>\n }\n </div>\n <div class=\"form-group\">\n <label for=\"customHeader\">Custom Header Name</label>\n <input class=\"mj-input\"\n id=\"customHeader\"\n formControlName=\"CustomHeaderName\"\n placeholder=\"e.g., X-Custom-API-Key\" />\n <span class=\"hint\">Override the default header name for API key authentication</span>\n </div>\n </div>\n <!-- Behavior Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-sliders\"></i> Behavior</h3>\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" class=\"mj-checkbox\" formControlName=\"AutoSyncTools\" />\n <span>Auto-sync tools on connect</span>\n </label>\n <span class=\"hint\">Automatically discover and sync available tools when connecting</span>\n </div>\n </div>\n <!-- Logging Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-file-lines\"></i> Logging</h3>\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" class=\"mj-checkbox\" formControlName=\"LogToolCalls\" />\n <span>Enable tool call logging</span>\n </label>\n <span class=\"hint\">Log all tool executions to the database</span>\n </div>\n <div class=\"logging-options\" [class.disabled]=\"!connectionForm.get('LogToolCalls')?.value\">\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" class=\"mj-checkbox\" formControlName=\"LogInputParameters\" />\n <span>Log input parameters</span>\n </label>\n </div>\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" class=\"mj-checkbox\" formControlName=\"LogOutputContent\" />\n <span>Log output content</span>\n </label>\n </div>\n <div class=\"form-group\">\n <label for=\"maxOutputSize\">Max Output Log Size (bytes)</label>\n <mj-numeric-input\n [Min]=\"0\"\n [Max]=\"10485760\"\n [Step]=\"10240\"\n [ngModelOptions]=\"{standalone: true}\" [ngModel]=\"connectionForm.get('MaxOutputLogSize')?.value\"\n (ngModelChange)=\"connectionForm.get('MaxOutputLogSize')?.setValue($event)\">\n </mj-numeric-input>\n <span class=\"hint\">Maximum size of output content to log (0 = unlimited, max 10MB)</span>\n </div>\n </div>\n </div>\n <!-- Advanced Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-gear\"></i> Advanced</h3>\n <div class=\"form-group\">\n <label for=\"envVars\">Environment Variables (JSON)</label>\n <textarea class=\"mj-textarea\"\n id=\"envVars\"\n formControlName=\"EnvironmentVars\"\n placeholder='{\"VAR_NAME\": \"value\"}'\n [rows]=\"3\"></textarea>\n <span class=\"hint\">Additional environment variables for Stdio transport (JSON object)</span>\n </div>\n </div>\n </form>\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"save()\" [disabled]=\"IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{ IsEditMode ? 'Update' : 'Create' }}\n </button>\n <button mjButton (click)=\"cancel()\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n\n<!-- Credential Creation Dialog -->\n@if (ShowCredentialDialog) {\n <mj-credential-dialog\n #credentialDialog\n [Visible]=\"ShowCredentialDialog\"\n (close)=\"onCredentialDialogClose($event)\">\n </mj-credential-dialog>\n}\n"]}
@@ -12,7 +12,7 @@ import { UserInfoEngine } from '@memberjunction/core-entities';
12
12
  import * as i0 from "@angular/core";
13
13
  import * as i1 from "@angular/common";
14
14
  import * as i2 from "@angular/forms";
15
- import * as i3 from "@progress/kendo-angular-buttons";
15
+ import * as i3 from "@memberjunction/ng-ui-components";
16
16
  import * as i4 from "@memberjunction/ng-code-editor";
17
17
  function MCPLogDetailPanelComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
18
18
  const _r1 = i0.ɵɵgetCurrentView();
@@ -479,14 +479,14 @@ export class MCPLogDetailPanelComponent {
479
479
  static ɵfac = function MCPLogDetailPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MCPLogDetailPanelComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
480
480
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MCPLogDetailPanelComponent, selectors: [["mj-mcp-log-detail-panel"]], hostBindings: function MCPLogDetailPanelComponent_HostBindings(rf, ctx) { if (rf & 1) {
481
481
  i0.ɵɵlistener("mousemove", function MCPLogDetailPanelComponent_mousemove_HostBindingHandler($event) { return ctx.onMouseMove($event); }, i0.ɵɵresolveDocument)("mouseup", function MCPLogDetailPanelComponent_mouseup_HostBindingHandler() { return ctx.onMouseUp(); }, i0.ɵɵresolveDocument)("resize", function MCPLogDetailPanelComponent_resize_HostBindingHandler() { return ctx.onWindowResize(); }, i0.ɵɵresolveWindow);
482
- } }, inputs: { Visible: "Visible", Log: "Log" }, outputs: { Close: "Close", RunAgain: "RunAgain" }, standalone: false, decls: 2, vars: 2, consts: [[1, "panel-backdrop"], [1, "slide-out-panel", 3, "width", "mobile", "resizing"], [1, "panel-backdrop", 3, "click"], [1, "slide-out-panel"], ["title", "Drag to resize", 1, "resize-handle", 3, "active"], [1, "panel-header"], [1, "panel-title"], [1, "fa-solid", "fa-list-check"], ["title", "Close", 1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "panel-content"], [1, "status-banner", 3, "ngClass"], [1, "status-text"], [1, "duration"], [1, "info-section"], [1, "section-title"], [1, "fa-solid", "fa-wrench"], [1, "info-card"], [1, "info-row"], [1, "info-label"], [1, "info-value", "tool-name"], [1, "info-value"], [1, "fa-solid", "fa-clock"], [1, "info-section", "error-section", "expandable-section"], [1, "info-section", "expandable-section"], [1, "panel-actions"], ["kendoButton", "", "themeColor", "primary"], ["kendoButton", "", "fillMode", "flat", 3, "click"], ["title", "Drag to resize", 1, "resize-handle", 3, "mousedown"], [1, "resize-grip"], [1, "section-header", "clickable", 3, "click"], [1, "section-title-row"], [1, "fa-solid", "fa-chevron-right", "expand-icon"], [1, "section-title", "error"], [1, "fa-solid", "fa-exclamation-triangle"], ["kendoButton", "", "fillMode", "flat", "size", "small", "title", "Copy error", 3, "click"], [1, "fa-solid", "fa-copy"], [1, "error-card"], [1, "error-message"], [1, "fa-solid", "fa-arrow-right-to-bracket"], ["kendoButton", "", "fillMode", "flat", "size", "small", "title", "Copy input arguments", 3, "click"], [1, "code-card"], [3, "ngModel", "language", "readonly"], [1, "fa-solid", "fa-arrow-right-from-bracket"], ["kendoButton", "", "fillMode", "flat", "size", "small", "title", "Copy result", 3, "click"], [1, "fa-solid", "fa-user"], ["kendoButton", "", "themeColor", "primary", 3, "click"], [1, "fa-solid", "fa-play"]], template: function MCPLogDetailPanelComponent_Template(rf, ctx) { if (rf & 1) {
482
+ } }, inputs: { Visible: "Visible", Log: "Log" }, outputs: { Close: "Close", RunAgain: "RunAgain" }, standalone: false, decls: 2, vars: 2, consts: [[1, "panel-backdrop"], [1, "slide-out-panel", 3, "width", "mobile", "resizing"], [1, "panel-backdrop", 3, "click"], [1, "slide-out-panel"], ["title", "Drag to resize", 1, "resize-handle", 3, "active"], [1, "panel-header"], [1, "panel-title"], [1, "fa-solid", "fa-list-check"], ["title", "Close", 1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "panel-content"], [1, "status-banner", 3, "ngClass"], [1, "status-text"], [1, "duration"], [1, "info-section"], [1, "section-title"], [1, "fa-solid", "fa-wrench"], [1, "info-card"], [1, "info-row"], [1, "info-label"], [1, "info-value", "tool-name"], [1, "info-value"], [1, "fa-solid", "fa-clock"], [1, "info-section", "error-section", "expandable-section"], [1, "info-section", "expandable-section"], [1, "panel-actions"], ["mjButton", "", "variant", "primary"], ["mjButton", "", "variant", "flat", 3, "click"], ["title", "Drag to resize", 1, "resize-handle", 3, "mousedown"], [1, "resize-grip"], [1, "section-header", "clickable", 3, "click"], [1, "section-title-row"], [1, "fa-solid", "fa-chevron-right", "expand-icon"], [1, "section-title", "error"], [1, "fa-solid", "fa-exclamation-triangle"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Copy error", 3, "click"], [1, "fa-solid", "fa-copy"], [1, "error-card"], [1, "error-message"], [1, "fa-solid", "fa-arrow-right-to-bracket"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Copy input arguments", 3, "click"], [1, "code-card"], [3, "ngModel", "language", "readonly"], [1, "fa-solid", "fa-arrow-right-from-bracket"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Copy result", 3, "click"], [1, "fa-solid", "fa-user"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "fa-solid", "fa-play"]], template: function MCPLogDetailPanelComponent_Template(rf, ctx) { if (rf & 1) {
483
483
  i0.ɵɵconditionalCreate(0, MCPLogDetailPanelComponent_Conditional_0_Template, 1, 0, "div", 0);
484
484
  i0.ɵɵconditionalCreate(1, MCPLogDetailPanelComponent_Conditional_1_Template, 58, 24, "div", 1);
485
485
  } if (rf & 2) {
486
486
  i0.ɵɵconditional(ctx.Visible ? 0 : -1);
487
487
  i0.ɵɵadvance();
488
488
  i0.ɵɵconditional(ctx.Visible && ctx.Log ? 1 : -1);
489
- } }, dependencies: [i1.NgClass, i2.NgControlStatus, i2.NgModel, i3.ButtonComponent, i4.CodeEditorComponent], styles: ["\n\n\n\n\n\n\n.panel-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 1000;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n\n\n\n.slide-out-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 20px rgba(0, 0, 0, 0.15);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.slide-out-panel.mobile[_ngcontent-%COMP%] {\n width: 100% !important;\n left: 0;\n}\n\n.slide-out-panel.resizing[_ngcontent-%COMP%] {\n user-select: none;\n transition: none;\n}\n\n\n\n\n\n.resize-handle[_ngcontent-%COMP%] {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n background: transparent;\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover, \n.resize-handle.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.resize-grip[_ngcontent-%COMP%] {\n width: 3px;\n height: 40px;\n background: var(--mj-border-strong);\n border-radius: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover .resize-grip[_ngcontent-%COMP%], \n.resize-handle.active[_ngcontent-%COMP%] .resize-grip[_ngcontent-%COMP%] {\n opacity: 1;\n background: var(--mj-brand-primary);\n}\n\n\n\n\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.close-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n}\n\n.close-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 18px;\n}\n\n\n\n\n\n.panel-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n}\n\n\n\n\n\n.status-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n border-radius: 8px;\n margin-bottom: 20px;\n font-weight: 600;\n font-size: 16px;\n}\n\n.status-banner.status-success[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.status-banner.status-success[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-status-success);\n}\n\n.status-banner.status-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-banner.status-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-status-error);\n}\n\n.status-banner.status-running[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-banner.status-running[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-brand-primary);\n}\n\n.status-banner[_ngcontent-%COMP%] .status-text[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.status-banner[_ngcontent-%COMP%] .duration[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: normal;\n background: rgba(0, 0, 0, 0.05);\n padding: 4px 10px;\n border-radius: 4px;\n}\n\n\n\n\n\n.info-section[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}\n\n.section-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-brand-primary);\n}\n\n.section-title.error[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.section-title.error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n\n\n.expandable-section[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.expandable-section[_ngcontent-%COMP%] .section-header.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n padding: 8px 12px;\n margin: -8px -12px 12px -12px;\n border-radius: 6px;\n transition: background 0.15s ease;\n}\n\n.expandable-section[_ngcontent-%COMP%] .section-header.clickable[_ngcontent-%COMP%]:hover {\n background: rgba(0, 0, 0, 0.03);\n}\n\n.section-title-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.expand-icon[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n}\n\n.expand-icon.expanded[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n}\n\n\n\n\n\n.info-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n padding: 12px 16px;\n}\n\n.info-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n font-size: 14px;\n}\n\n.info-row[_ngcontent-%COMP%]:not(:last-child) {\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.info-label[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.info-value[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.info-value.tool-name[_ngcontent-%COMP%] {\n font-family: 'Consolas', 'Monaco', monospace;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n padding: 2px 8px;\n border-radius: 4px;\n color: var(--mj-brand-primary);\n}\n\n\n\n\n\n.error-card[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 20%, transparent);\n border-radius: 8px;\n padding: 16px;\n}\n\n.error-message[_ngcontent-%COMP%] {\n margin: 0;\n font-family: monospace;\n font-size: 13px;\n line-height: 1.5;\n color: var(--mj-status-error);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n\n\n\n\n.code-card[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n height: 200px;\n}\n\n.code-card[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n}\n\n\n\n\n\n.panel-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n padding: 16px 20px;\n background: var(--mj-bg-surface);\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.panel-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n min-width: 100px;\n}\n\n.panel-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 6px;\n}\n\n\n\n\n\n@media (max-width: 768px) {\n .slide-out-panel[_ngcontent-%COMP%] {\n width: 100% !important;\n left: 0;\n }\n\n .resize-handle[_ngcontent-%COMP%] {\n display: none;\n }\n\n .panel-content[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .status-banner[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n\n .panel-actions[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n\n .panel-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 80px;\n }\n\n .code-card[_ngcontent-%COMP%] {\n height: 150px;\n }\n}"], data: { animation: [
489
+ } }, dependencies: [i1.NgClass, i2.NgControlStatus, i2.NgModel, i3.MJButtonDirective, i4.CodeEditorComponent], styles: ["\n\n\n\n\n\n\n.panel-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 1000;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n\n\n\n.slide-out-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 20px rgba(0, 0, 0, 0.15);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.slide-out-panel.mobile[_ngcontent-%COMP%] {\n width: 100% !important;\n left: 0;\n}\n\n.slide-out-panel.resizing[_ngcontent-%COMP%] {\n user-select: none;\n transition: none;\n}\n\n\n\n\n\n.resize-handle[_ngcontent-%COMP%] {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n background: transparent;\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover, \n.resize-handle.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.resize-grip[_ngcontent-%COMP%] {\n width: 3px;\n height: 40px;\n background: var(--mj-border-strong);\n border-radius: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover .resize-grip[_ngcontent-%COMP%], \n.resize-handle.active[_ngcontent-%COMP%] .resize-grip[_ngcontent-%COMP%] {\n opacity: 1;\n background: var(--mj-brand-primary);\n}\n\n\n\n\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.close-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n}\n\n.close-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 18px;\n}\n\n\n\n\n\n.panel-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n}\n\n\n\n\n\n.status-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n border-radius: 8px;\n margin-bottom: 20px;\n font-weight: 600;\n font-size: 16px;\n}\n\n.status-banner.status-success[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.status-banner.status-success[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-status-success);\n}\n\n.status-banner.status-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-banner.status-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-status-error);\n}\n\n.status-banner.status-running[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-banner.status-running[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-brand-primary);\n}\n\n.status-banner[_ngcontent-%COMP%] .status-text[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.status-banner[_ngcontent-%COMP%] .duration[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: normal;\n background: rgba(0, 0, 0, 0.05);\n padding: 4px 10px;\n border-radius: 4px;\n}\n\n\n\n\n\n.info-section[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}\n\n.section-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-brand-primary);\n}\n\n.section-title.error[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.section-title.error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n\n\n.expandable-section[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.expandable-section[_ngcontent-%COMP%] .section-header.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n padding: 8px 12px;\n margin: -8px -12px 12px -12px;\n border-radius: 6px;\n transition: background 0.15s ease;\n}\n\n.expandable-section[_ngcontent-%COMP%] .section-header.clickable[_ngcontent-%COMP%]:hover {\n background: rgba(0, 0, 0, 0.03);\n}\n\n.section-title-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.expand-icon[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n}\n\n.expand-icon.expanded[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n}\n\n\n\n\n\n.info-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n padding: 12px 16px;\n}\n\n.info-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n font-size: 14px;\n}\n\n.info-row[_ngcontent-%COMP%]:not(:last-child) {\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.info-label[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.info-value[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.info-value.tool-name[_ngcontent-%COMP%] {\n font-family: 'Consolas', 'Monaco', monospace;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n padding: 2px 8px;\n border-radius: 4px;\n color: var(--mj-brand-primary);\n}\n\n\n\n\n\n.error-card[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 20%, transparent);\n border-radius: 8px;\n padding: 16px;\n}\n\n.error-message[_ngcontent-%COMP%] {\n margin: 0;\n font-family: monospace;\n font-size: 13px;\n line-height: 1.5;\n color: var(--mj-status-error);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n\n\n\n\n.code-card[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n height: 200px;\n}\n\n.code-card[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n}\n\n\n\n\n\n.panel-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n padding: 16px 20px;\n background: var(--mj-bg-surface);\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.panel-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n min-width: 100px;\n}\n\n.panel-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 6px;\n}\n\n\n\n\n\n@media (max-width: 768px) {\n .slide-out-panel[_ngcontent-%COMP%] {\n width: 100% !important;\n left: 0;\n }\n\n .resize-handle[_ngcontent-%COMP%] {\n display: none;\n }\n\n .panel-content[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .status-banner[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n\n .panel-actions[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n\n .panel-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 80px;\n }\n\n .code-card[_ngcontent-%COMP%] {\n height: 150px;\n }\n}"], data: { animation: [
490
490
  trigger('slideIn', [
491
491
  transition(':enter', [
492
492
  style({ transform: 'translateX(100%)', opacity: 0 }),
@@ -510,7 +510,7 @@ export class MCPLogDetailPanelComponent {
510
510
  animate('200ms ease-in', style({ transform: 'translateX(100%)', opacity: 0 }))
511
511
  ])
512
512
  ])
513
- ], template: "<!-- Backdrop -->\n@if (Visible) {\n <div class=\"panel-backdrop\" (click)=\"closePanel()\"></div>\n}\n\n<!-- Slide-out Panel -->\n@if (Visible && Log) {\n <div class=\"slide-out-panel\"\n @slideIn\n [style.width.px]=\"IsMobileMode ? null : PanelWidth\"\n [class.mobile]=\"IsMobileMode\"\n [class.resizing]=\"IsResizing\">\n <!-- Resize Handle -->\n @if (!IsMobileMode) {\n <div class=\"resize-handle\"\n (mousedown)=\"onResizeStart($event)\"\n [class.active]=\"IsResizing\"\n title=\"Drag to resize\">\n <div class=\"resize-grip\"></div>\n </div>\n }\n <!-- Panel Header -->\n <div class=\"panel-header\">\n <h2 class=\"panel-title\">\n <i class=\"fa-solid fa-list-check\"></i>\n Execution Details\n </h2>\n <button class=\"close-btn\" (click)=\"closePanel()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Panel Content -->\n <div class=\"panel-content\">\n <!-- Status Banner -->\n <div class=\"status-banner\" [ngClass]=\"getStatusClass(Log.Status)\">\n <i [class]=\"getStatusIcon(Log.Status)\"></i>\n <span class=\"status-text\">{{ Log.Status }}</span>\n @if (Log.DurationMs) {\n <span class=\"duration\">{{ formatDuration(Log.DurationMs) }}</span>\n }\n </div>\n <!-- Tool Info -->\n <div class=\"info-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-wrench\"></i>\n Tool\n </h3>\n <div class=\"info-card\">\n <div class=\"info-row\">\n <span class=\"info-label\">Name</span>\n <span class=\"info-value tool-name\">{{ Log.ToolName }}</span>\n </div>\n @if (Log.ServerName) {\n <div class=\"info-row\">\n <span class=\"info-label\">Server</span>\n <span class=\"info-value\">{{ Log.ServerName }}</span>\n </div>\n }\n <div class=\"info-row\">\n <span class=\"info-label\">Connection</span>\n <span class=\"info-value\">{{ Log.ConnectionName }}</span>\n </div>\n </div>\n </div>\n <!-- Timing Info -->\n <div class=\"info-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-clock\"></i>\n Timing\n </h3>\n <div class=\"info-card\">\n <div class=\"info-row\">\n <span class=\"info-label\">Started</span>\n <span class=\"info-value\">{{ formatDate(Log.StartedAt) }}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"info-label\">Completed</span>\n <span class=\"info-value\">{{ formatDate(Log.CompletedAt) }}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"info-label\">Duration</span>\n <span class=\"info-value\">{{ formatDuration(Log.DurationMs) }}</span>\n </div>\n </div>\n </div>\n <!-- Error Message (if any) -->\n @if (Log.ErrorMessage) {\n <div class=\"info-section error-section expandable-section\">\n <div class=\"section-header clickable\" (click)=\"toggleSection(ErrorSection)\">\n <div class=\"section-title-row\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"ErrorSection.expanded\"></i>\n <h3 class=\"section-title error\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n Error\n </h3>\n </div>\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"copyError(); $event.stopPropagation()\" title=\"Copy error\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (ErrorSection.expanded) {\n <div class=\"error-card\">\n <pre class=\"error-message\">{{ Log.ErrorMessage }}</pre>\n </div>\n }\n </div>\n }\n <!-- Input Arguments -->\n @if (Log.InputArgs) {\n <div class=\"info-section expandable-section\">\n <div class=\"section-header clickable\" (click)=\"toggleSection(InputArgsSection)\">\n <div class=\"section-title-row\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"InputArgsSection.expanded\"></i>\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-arrow-right-to-bracket\"></i>\n Input Arguments\n </h3>\n </div>\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"copyInputArgs(); $event.stopPropagation()\" title=\"Copy input arguments\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (InputArgsSection.expanded) {\n <div class=\"code-card\">\n <mj-code-editor\n [ngModel]=\"FormattedInputArgs\"\n [language]=\"'json'\"\n [readonly]=\"true\">\n </mj-code-editor>\n </div>\n }\n </div>\n }\n <!-- Result -->\n @if (Log.Result) {\n <div class=\"info-section expandable-section\">\n <div class=\"section-header clickable\" (click)=\"toggleSection(ResultSection)\">\n <div class=\"section-title-row\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"ResultSection.expanded\"></i>\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-arrow-right-from-bracket\"></i>\n Result\n </h3>\n </div>\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"copyResult(); $event.stopPropagation()\" title=\"Copy result\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (ResultSection.expanded) {\n <div class=\"code-card\">\n <mj-code-editor\n [ngModel]=\"FormattedResult\"\n [language]=\"'json'\"\n [readonly]=\"true\">\n </mj-code-editor>\n </div>\n }\n </div>\n }\n <!-- User Info -->\n @if (Log.UserName) {\n <div class=\"info-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-user\"></i>\n Executed By\n </h3>\n <div class=\"info-card\">\n <div class=\"info-row\">\n <span class=\"info-label\">User</span>\n <span class=\"info-value\">{{ Log.UserName }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n <!-- Panel Actions -->\n <div class=\"panel-actions\">\n @if (Log.ToolID) {\n <button kendoButton themeColor=\"primary\" (click)=\"onRunAgain()\">\n <i class=\"fa-solid fa-play\"></i>\n Run Again\n </button>\n }\n <button kendoButton fillMode=\"flat\" (click)=\"closePanel()\">Close</button>\n </div>\n </div>\n}\n", styles: ["/* MCP Log Detail Panel Styles */\n\n/* ========================================\n Backdrop\n ======================================== */\n.panel-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 1000;\n animation: fadeIn 0.2s ease-out;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* ========================================\n Slide-Out Panel\n ======================================== */\n.slide-out-panel {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 20px rgba(0, 0, 0, 0.15);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.slide-out-panel.mobile {\n width: 100% !important;\n left: 0;\n}\n\n.slide-out-panel.resizing {\n user-select: none;\n transition: none;\n}\n\n/* ========================================\n Resize Handle\n ======================================== */\n.resize-handle {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n background: transparent;\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease;\n}\n\n.resize-handle:hover,\n.resize-handle.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.resize-grip {\n width: 3px;\n height: 40px;\n background: var(--mj-border-strong);\n border-radius: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.resize-handle:hover .resize-grip,\n.resize-handle.active .resize-grip {\n opacity: 1;\n background: var(--mj-brand-primary);\n}\n\n/* ========================================\n Panel Header\n ======================================== */\n.panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.panel-title i {\n color: var(--mj-brand-primary);\n}\n\n.close-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.close-btn:hover {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n}\n\n.close-btn i {\n font-size: 18px;\n}\n\n/* ========================================\n Panel Content\n ======================================== */\n.panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n}\n\n/* ========================================\n Status Banner\n ======================================== */\n.status-banner {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n border-radius: 8px;\n margin-bottom: 20px;\n font-weight: 600;\n font-size: 16px;\n}\n\n.status-banner.status-success {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.status-banner.status-success i {\n font-size: 24px;\n color: var(--mj-status-success);\n}\n\n.status-banner.status-error {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-banner.status-error i {\n font-size: 24px;\n color: var(--mj-status-error);\n}\n\n.status-banner.status-running {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-banner.status-running i {\n font-size: 24px;\n color: var(--mj-brand-primary);\n}\n\n.status-banner .status-text {\n flex: 1;\n}\n\n.status-banner .duration {\n font-size: 14px;\n font-weight: normal;\n background: rgba(0, 0, 0, 0.05);\n padding: 4px 10px;\n border-radius: 4px;\n}\n\n/* ========================================\n Info Sections\n ======================================== */\n.info-section {\n margin-bottom: 20px;\n}\n\n.section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-title i {\n font-size: 14px;\n color: var(--mj-brand-primary);\n}\n\n.section-title.error {\n color: var(--mj-status-error);\n}\n\n.section-title.error i {\n color: var(--mj-status-error);\n}\n\n/* ========================================\n Expandable Sections\n ======================================== */\n.expandable-section .section-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.expandable-section .section-header.clickable {\n cursor: pointer;\n padding: 8px 12px;\n margin: -8px -12px 12px -12px;\n border-radius: 6px;\n transition: background 0.15s ease;\n}\n\n.expandable-section .section-header.clickable:hover {\n background: rgba(0, 0, 0, 0.03);\n}\n\n.section-title-row {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.expand-icon {\n font-size: 12px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n}\n\n.expand-icon.expanded {\n transform: rotate(90deg);\n}\n\n/* ========================================\n Info Cards\n ======================================== */\n.info-card {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n padding: 12px 16px;\n}\n\n.info-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n font-size: 14px;\n}\n\n.info-row:not(:last-child) {\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.info-label {\n color: var(--mj-text-muted);\n}\n\n.info-value {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.info-value.tool-name {\n font-family: 'Consolas', 'Monaco', monospace;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n padding: 2px 8px;\n border-radius: 4px;\n color: var(--mj-brand-primary);\n}\n\n/* ========================================\n Error Card\n ======================================== */\n.error-card {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 20%, transparent);\n border-radius: 8px;\n padding: 16px;\n}\n\n.error-message {\n margin: 0;\n font-family: monospace;\n font-size: 13px;\n line-height: 1.5;\n color: var(--mj-status-error);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n/* ========================================\n Code Card\n ======================================== */\n.code-card {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n height: 200px;\n}\n\n.code-card mj-code-editor {\n width: 100%;\n height: 100%;\n}\n\n/* ========================================\n Panel Actions\n ======================================== */\n.panel-actions {\n display: flex;\n gap: 8px;\n padding: 16px 20px;\n background: var(--mj-bg-surface);\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.panel-actions button {\n min-width: 100px;\n}\n\n.panel-actions button i {\n margin-right: 6px;\n}\n\n/* ========================================\n Responsive / Mobile\n ======================================== */\n@media (max-width: 768px) {\n .slide-out-panel {\n width: 100% !important;\n left: 0;\n }\n\n .resize-handle {\n display: none;\n }\n\n .panel-content {\n padding: 16px;\n }\n\n .status-banner {\n flex-wrap: wrap;\n }\n\n .panel-actions {\n flex-wrap: wrap;\n }\n\n .panel-actions button {\n flex: 1;\n min-width: 80px;\n }\n\n .code-card {\n height: 150px;\n }\n}\n"] }]
513
+ ], template: "<!-- Backdrop -->\n@if (Visible) {\n <div class=\"panel-backdrop\" (click)=\"closePanel()\"></div>\n}\n\n<!-- Slide-out Panel -->\n@if (Visible && Log) {\n <div class=\"slide-out-panel\"\n @slideIn\n [style.width.px]=\"IsMobileMode ? null : PanelWidth\"\n [class.mobile]=\"IsMobileMode\"\n [class.resizing]=\"IsResizing\">\n <!-- Resize Handle -->\n @if (!IsMobileMode) {\n <div class=\"resize-handle\"\n (mousedown)=\"onResizeStart($event)\"\n [class.active]=\"IsResizing\"\n title=\"Drag to resize\">\n <div class=\"resize-grip\"></div>\n </div>\n }\n <!-- Panel Header -->\n <div class=\"panel-header\">\n <h2 class=\"panel-title\">\n <i class=\"fa-solid fa-list-check\"></i>\n Execution Details\n </h2>\n <button class=\"close-btn\" (click)=\"closePanel()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Panel Content -->\n <div class=\"panel-content\">\n <!-- Status Banner -->\n <div class=\"status-banner\" [ngClass]=\"getStatusClass(Log.Status)\">\n <i [class]=\"getStatusIcon(Log.Status)\"></i>\n <span class=\"status-text\">{{ Log.Status }}</span>\n @if (Log.DurationMs) {\n <span class=\"duration\">{{ formatDuration(Log.DurationMs) }}</span>\n }\n </div>\n <!-- Tool Info -->\n <div class=\"info-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-wrench\"></i>\n Tool\n </h3>\n <div class=\"info-card\">\n <div class=\"info-row\">\n <span class=\"info-label\">Name</span>\n <span class=\"info-value tool-name\">{{ Log.ToolName }}</span>\n </div>\n @if (Log.ServerName) {\n <div class=\"info-row\">\n <span class=\"info-label\">Server</span>\n <span class=\"info-value\">{{ Log.ServerName }}</span>\n </div>\n }\n <div class=\"info-row\">\n <span class=\"info-label\">Connection</span>\n <span class=\"info-value\">{{ Log.ConnectionName }}</span>\n </div>\n </div>\n </div>\n <!-- Timing Info -->\n <div class=\"info-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-clock\"></i>\n Timing\n </h3>\n <div class=\"info-card\">\n <div class=\"info-row\">\n <span class=\"info-label\">Started</span>\n <span class=\"info-value\">{{ formatDate(Log.StartedAt) }}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"info-label\">Completed</span>\n <span class=\"info-value\">{{ formatDate(Log.CompletedAt) }}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"info-label\">Duration</span>\n <span class=\"info-value\">{{ formatDuration(Log.DurationMs) }}</span>\n </div>\n </div>\n </div>\n <!-- Error Message (if any) -->\n @if (Log.ErrorMessage) {\n <div class=\"info-section error-section expandable-section\">\n <div class=\"section-header clickable\" (click)=\"toggleSection(ErrorSection)\">\n <div class=\"section-title-row\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"ErrorSection.expanded\"></i>\n <h3 class=\"section-title error\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n Error\n </h3>\n </div>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"copyError(); $event.stopPropagation()\" title=\"Copy error\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (ErrorSection.expanded) {\n <div class=\"error-card\">\n <pre class=\"error-message\">{{ Log.ErrorMessage }}</pre>\n </div>\n }\n </div>\n }\n <!-- Input Arguments -->\n @if (Log.InputArgs) {\n <div class=\"info-section expandable-section\">\n <div class=\"section-header clickable\" (click)=\"toggleSection(InputArgsSection)\">\n <div class=\"section-title-row\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"InputArgsSection.expanded\"></i>\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-arrow-right-to-bracket\"></i>\n Input Arguments\n </h3>\n </div>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"copyInputArgs(); $event.stopPropagation()\" title=\"Copy input arguments\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (InputArgsSection.expanded) {\n <div class=\"code-card\">\n <mj-code-editor\n [ngModel]=\"FormattedInputArgs\"\n [language]=\"'json'\"\n [readonly]=\"true\">\n </mj-code-editor>\n </div>\n }\n </div>\n }\n <!-- Result -->\n @if (Log.Result) {\n <div class=\"info-section expandable-section\">\n <div class=\"section-header clickable\" (click)=\"toggleSection(ResultSection)\">\n <div class=\"section-title-row\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"ResultSection.expanded\"></i>\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-arrow-right-from-bracket\"></i>\n Result\n </h3>\n </div>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"copyResult(); $event.stopPropagation()\" title=\"Copy result\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (ResultSection.expanded) {\n <div class=\"code-card\">\n <mj-code-editor\n [ngModel]=\"FormattedResult\"\n [language]=\"'json'\"\n [readonly]=\"true\">\n </mj-code-editor>\n </div>\n }\n </div>\n }\n <!-- User Info -->\n @if (Log.UserName) {\n <div class=\"info-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-user\"></i>\n Executed By\n </h3>\n <div class=\"info-card\">\n <div class=\"info-row\">\n <span class=\"info-label\">User</span>\n <span class=\"info-value\">{{ Log.UserName }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n <!-- Panel Actions -->\n <div class=\"panel-actions\">\n @if (Log.ToolID) {\n <button mjButton variant=\"primary\" (click)=\"onRunAgain()\">\n <i class=\"fa-solid fa-play\"></i>\n Run Again\n </button>\n }\n <button mjButton variant=\"flat\" (click)=\"closePanel()\">Close</button>\n </div>\n </div>\n}\n", styles: ["/* MCP Log Detail Panel Styles */\n\n/* ========================================\n Backdrop\n ======================================== */\n.panel-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 1000;\n animation: fadeIn 0.2s ease-out;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* ========================================\n Slide-Out Panel\n ======================================== */\n.slide-out-panel {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 20px rgba(0, 0, 0, 0.15);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.slide-out-panel.mobile {\n width: 100% !important;\n left: 0;\n}\n\n.slide-out-panel.resizing {\n user-select: none;\n transition: none;\n}\n\n/* ========================================\n Resize Handle\n ======================================== */\n.resize-handle {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n background: transparent;\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease;\n}\n\n.resize-handle:hover,\n.resize-handle.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.resize-grip {\n width: 3px;\n height: 40px;\n background: var(--mj-border-strong);\n border-radius: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.resize-handle:hover .resize-grip,\n.resize-handle.active .resize-grip {\n opacity: 1;\n background: var(--mj-brand-primary);\n}\n\n/* ========================================\n Panel Header\n ======================================== */\n.panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.panel-title i {\n color: var(--mj-brand-primary);\n}\n\n.close-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.close-btn:hover {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n}\n\n.close-btn i {\n font-size: 18px;\n}\n\n/* ========================================\n Panel Content\n ======================================== */\n.panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n}\n\n/* ========================================\n Status Banner\n ======================================== */\n.status-banner {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n border-radius: 8px;\n margin-bottom: 20px;\n font-weight: 600;\n font-size: 16px;\n}\n\n.status-banner.status-success {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.status-banner.status-success i {\n font-size: 24px;\n color: var(--mj-status-success);\n}\n\n.status-banner.status-error {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-banner.status-error i {\n font-size: 24px;\n color: var(--mj-status-error);\n}\n\n.status-banner.status-running {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-banner.status-running i {\n font-size: 24px;\n color: var(--mj-brand-primary);\n}\n\n.status-banner .status-text {\n flex: 1;\n}\n\n.status-banner .duration {\n font-size: 14px;\n font-weight: normal;\n background: rgba(0, 0, 0, 0.05);\n padding: 4px 10px;\n border-radius: 4px;\n}\n\n/* ========================================\n Info Sections\n ======================================== */\n.info-section {\n margin-bottom: 20px;\n}\n\n.section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-title i {\n font-size: 14px;\n color: var(--mj-brand-primary);\n}\n\n.section-title.error {\n color: var(--mj-status-error);\n}\n\n.section-title.error i {\n color: var(--mj-status-error);\n}\n\n/* ========================================\n Expandable Sections\n ======================================== */\n.expandable-section .section-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.expandable-section .section-header.clickable {\n cursor: pointer;\n padding: 8px 12px;\n margin: -8px -12px 12px -12px;\n border-radius: 6px;\n transition: background 0.15s ease;\n}\n\n.expandable-section .section-header.clickable:hover {\n background: rgba(0, 0, 0, 0.03);\n}\n\n.section-title-row {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.expand-icon {\n font-size: 12px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n}\n\n.expand-icon.expanded {\n transform: rotate(90deg);\n}\n\n/* ========================================\n Info Cards\n ======================================== */\n.info-card {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n padding: 12px 16px;\n}\n\n.info-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n font-size: 14px;\n}\n\n.info-row:not(:last-child) {\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.info-label {\n color: var(--mj-text-muted);\n}\n\n.info-value {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.info-value.tool-name {\n font-family: 'Consolas', 'Monaco', monospace;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n padding: 2px 8px;\n border-radius: 4px;\n color: var(--mj-brand-primary);\n}\n\n/* ========================================\n Error Card\n ======================================== */\n.error-card {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 20%, transparent);\n border-radius: 8px;\n padding: 16px;\n}\n\n.error-message {\n margin: 0;\n font-family: monospace;\n font-size: 13px;\n line-height: 1.5;\n color: var(--mj-status-error);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n/* ========================================\n Code Card\n ======================================== */\n.code-card {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n height: 200px;\n}\n\n.code-card mj-code-editor {\n width: 100%;\n height: 100%;\n}\n\n/* ========================================\n Panel Actions\n ======================================== */\n.panel-actions {\n display: flex;\n gap: 8px;\n padding: 16px 20px;\n background: var(--mj-bg-surface);\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.panel-actions button {\n min-width: 100px;\n}\n\n.panel-actions button i {\n margin-right: 6px;\n}\n\n/* ========================================\n Responsive / Mobile\n ======================================== */\n@media (max-width: 768px) {\n .slide-out-panel {\n width: 100% !important;\n left: 0;\n }\n\n .resize-handle {\n display: none;\n }\n\n .panel-content {\n padding: 16px;\n }\n\n .status-banner {\n flex-wrap: wrap;\n }\n\n .panel-actions {\n flex-wrap: wrap;\n }\n\n .panel-actions button {\n flex: 1;\n min-width: 80px;\n }\n\n .code-card {\n height: 150px;\n }\n}\n"] }]
514
514
  }], () => [{ type: i0.ChangeDetectorRef }], { Visible: [{
515
515
  type: Input
516
516
  }], Log: [{
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-log-detail-panel.component.js","sourceRoot":"","sources":["../../../src/MCP/components/mcp-log-detail-panel.component.ts","../../../src/MCP/components/mcp-log-detail-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview MCP Log Detail Slide-Out Panel Component\n *\n * Displays detailed information about an MCP tool execution log\n * in a slide-out panel from the right side.\n */\n\nimport { Component, Input, Output, EventEmitter, ChangeDetectorRef, HostListener, OnInit, OnDestroy } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { trigger, transition, style, animate } from '@angular/animations';\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport { MCPExecutionLogData } from '../mcp-dashboard.component';\n\n/**\n * Extended log data with parsed input/output\n */\nexport interface LogDetailData extends MCPExecutionLogData {\n InputArgs?: string | null;\n Result?: string | null;\n ServerName?: string;\n}\n\n/**\n * Expandable section state\n */\ninterface ExpandableSection {\n expanded: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-mcp-log-detail-panel',\n templateUrl: './mcp-log-detail-panel.component.html',\n styleUrls: ['./mcp-log-detail-panel.component.css'],\n animations: [\n trigger('slideIn', [\n transition(':enter', [\n style({ transform: 'translateX(100%)', opacity: 0 }),\n animate('250ms ease-out', style({ transform: 'translateX(0)', opacity: 1 }))\n ]),\n transition(':leave', [\n animate('200ms ease-in', style({ transform: 'translateX(100%)', opacity: 0 }))\n ])\n ])\n ]\n})\nexport class MCPLogDetailPanelComponent implements OnInit, OnDestroy {\n\n // ========================================\n // Inputs\n // ========================================\n\n @Input() Visible = false;\n @Input() Log: LogDetailData | null = null;\n\n // ========================================\n // Outputs\n // ========================================\n\n @Output() Close = new EventEmitter<void>();\n @Output() RunAgain = new EventEmitter<{ toolId: string; connectionId: string }>();\n\n // ========================================\n // Expandable Sections State\n // ========================================\n\n InputArgsSection: ExpandableSection = { expanded: true };\n ResultSection: ExpandableSection = { expanded: true };\n ErrorSection: ExpandableSection = { expanded: true };\n\n // ========================================\n // Panel Width / Resize State\n // ========================================\n\n private readonly PANEL_WIDTH_SETTING_KEY = 'mcp-log-detail-panel/width';\n private readonly MIN_PANEL_WIDTH = 320;\n private readonly MAX_PANEL_WIDTH = 800;\n private readonly DEFAULT_PANEL_WIDTH = 500;\n private readonly MOBILE_BREAKPOINT = 768;\n\n PanelWidth: number = this.DEFAULT_PANEL_WIDTH;\n IsResizing = false;\n\n get IsMobileMode(): boolean {\n return typeof window !== 'undefined' && window.innerWidth <= this.MOBILE_BREAKPOINT;\n }\n\n private widthPersistSubject = new Subject<number>();\n private destroy$ = new Subject<void>();\n\n constructor(private cdr: ChangeDetectorRef) {\n this.widthPersistSubject.pipe(\n debounceTime(500),\n takeUntil(this.destroy$)\n ).subscribe(width => {\n this.persistPanelWidth(width);\n });\n }\n\n ngOnInit(): void {\n this.loadSavedPanelWidth();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ========================================\n // Panel Resize Handlers\n // ========================================\n\n onResizeStart(event: MouseEvent): void {\n if (this.IsMobileMode) return;\n event.preventDefault();\n this.IsResizing = true;\n document.body.style.cursor = 'ew-resize';\n document.body.style.userSelect = 'none';\n }\n\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (!this.IsResizing) return;\n const newWidth = window.innerWidth - event.clientX;\n this.PanelWidth = Math.min(\n Math.max(newWidth, this.MIN_PANEL_WIDTH),\n Math.min(this.MAX_PANEL_WIDTH, window.innerWidth - 50)\n );\n this.cdr.detectChanges();\n }\n\n @HostListener('document:mouseup')\n onMouseUp(): void {\n if (this.IsResizing) {\n this.IsResizing = false;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n this.widthPersistSubject.next(this.PanelWidth);\n }\n }\n\n @HostListener('window:resize')\n onWindowResize(): void {\n if (this.IsMobileMode) {\n this.PanelWidth = window.innerWidth;\n } else if (this.PanelWidth > window.innerWidth - 50) {\n this.PanelWidth = Math.max(this.MIN_PANEL_WIDTH, window.innerWidth - 50);\n }\n this.cdr.detectChanges();\n }\n\n private loadSavedPanelWidth(): void {\n if (this.IsMobileMode) {\n this.PanelWidth = window.innerWidth;\n return;\n }\n try {\n const savedWidth = UserInfoEngine.Instance.GetSetting(this.PANEL_WIDTH_SETTING_KEY);\n if (savedWidth) {\n const width = parseInt(savedWidth, 10);\n if (!isNaN(width) && width >= this.MIN_PANEL_WIDTH && width <= this.MAX_PANEL_WIDTH) {\n this.PanelWidth = width;\n }\n }\n } catch (error) {\n console.warn('[MCPLogDetailPanel] Failed to load saved panel width:', error);\n }\n }\n\n private async persistPanelWidth(width: number): Promise<void> {\n try {\n await UserInfoEngine.Instance.SetSetting(this.PANEL_WIDTH_SETTING_KEY, String(width));\n } catch (error) {\n console.warn('[MCPLogDetailPanel] Failed to persist panel width:', error);\n }\n }\n\n // ========================================\n // Actions\n // ========================================\n\n closePanel(): void {\n this.Close.emit();\n }\n\n onRunAgain(): void {\n if (this.Log?.ToolID && this.Log?.ConnectionID) {\n this.RunAgain.emit({\n toolId: this.Log.ToolID,\n connectionId: this.Log.ConnectionID\n });\n }\n }\n\n // ========================================\n // Section Toggle & Copy Actions\n // ========================================\n\n toggleSection(section: ExpandableSection): void {\n section.expanded = !section.expanded;\n this.cdr.detectChanges();\n }\n\n async copyInputArgs(): Promise<void> {\n await this.copyToClipboard(this.FormattedInputArgs, 'Input arguments copied to clipboard');\n }\n\n async copyResult(): Promise<void> {\n await this.copyToClipboard(this.FormattedResult, 'Result copied to clipboard');\n }\n\n async copyError(): Promise<void> {\n await this.copyToClipboard(this.Log?.ErrorMessage || '', 'Error message copied to clipboard');\n }\n\n private async copyToClipboard(text: string, successMessage: string): Promise<void> {\n if (!text) return;\n try {\n await navigator.clipboard.writeText(text);\n // Could emit an event or show a toast here\n console.log(successMessage);\n } catch (error) {\n console.error('Failed to copy to clipboard:', error);\n }\n }\n\n // ========================================\n // Formatting Helpers\n // ========================================\n\n formatDate(date: Date | string | null): string {\n if (!date) return 'N/A';\n const d = typeof date === 'string' ? new Date(date) : date;\n return d.toLocaleString();\n }\n\n formatDuration(ms: number | null): string {\n if (ms === null) return '-';\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n }\n\n formatJson(jsonString: string | null | undefined): string {\n if (!jsonString) return '';\n try {\n const parsed = JSON.parse(jsonString);\n return JSON.stringify(parsed, null, 2);\n } catch {\n return jsonString;\n }\n }\n\n get FormattedInputArgs(): string {\n return this.formatJson(this.Log?.InputArgs);\n }\n\n get FormattedResult(): string {\n return this.formatJson(this.Log?.Result);\n }\n\n getStatusIcon(status: string): string {\n switch (status) {\n case 'Success': return 'fa-solid fa-check-circle';\n case 'Error': return 'fa-solid fa-times-circle';\n case 'Running': return 'fa-solid fa-spinner fa-spin';\n default: return 'fa-solid fa-question-circle';\n }\n }\n\n getStatusClass(status: string): string {\n switch (status) {\n case 'Success': return 'status-success';\n case 'Error': return 'status-error';\n case 'Running': return 'status-running';\n default: return 'status-unknown';\n }\n }\n}\n","<!-- Backdrop -->\n@if (Visible) {\n <div class=\"panel-backdrop\" (click)=\"closePanel()\"></div>\n}\n\n<!-- Slide-out Panel -->\n@if (Visible && Log) {\n <div class=\"slide-out-panel\"\n @slideIn\n [style.width.px]=\"IsMobileMode ? null : PanelWidth\"\n [class.mobile]=\"IsMobileMode\"\n [class.resizing]=\"IsResizing\">\n <!-- Resize Handle -->\n @if (!IsMobileMode) {\n <div class=\"resize-handle\"\n (mousedown)=\"onResizeStart($event)\"\n [class.active]=\"IsResizing\"\n title=\"Drag to resize\">\n <div class=\"resize-grip\"></div>\n </div>\n }\n <!-- Panel Header -->\n <div class=\"panel-header\">\n <h2 class=\"panel-title\">\n <i class=\"fa-solid fa-list-check\"></i>\n Execution Details\n </h2>\n <button class=\"close-btn\" (click)=\"closePanel()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Panel Content -->\n <div class=\"panel-content\">\n <!-- Status Banner -->\n <div class=\"status-banner\" [ngClass]=\"getStatusClass(Log.Status)\">\n <i [class]=\"getStatusIcon(Log.Status)\"></i>\n <span class=\"status-text\">{{ Log.Status }}</span>\n @if (Log.DurationMs) {\n <span class=\"duration\">{{ formatDuration(Log.DurationMs) }}</span>\n }\n </div>\n <!-- Tool Info -->\n <div class=\"info-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-wrench\"></i>\n Tool\n </h3>\n <div class=\"info-card\">\n <div class=\"info-row\">\n <span class=\"info-label\">Name</span>\n <span class=\"info-value tool-name\">{{ Log.ToolName }}</span>\n </div>\n @if (Log.ServerName) {\n <div class=\"info-row\">\n <span class=\"info-label\">Server</span>\n <span class=\"info-value\">{{ Log.ServerName }}</span>\n </div>\n }\n <div class=\"info-row\">\n <span class=\"info-label\">Connection</span>\n <span class=\"info-value\">{{ Log.ConnectionName }}</span>\n </div>\n </div>\n </div>\n <!-- Timing Info -->\n <div class=\"info-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-clock\"></i>\n Timing\n </h3>\n <div class=\"info-card\">\n <div class=\"info-row\">\n <span class=\"info-label\">Started</span>\n <span class=\"info-value\">{{ formatDate(Log.StartedAt) }}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"info-label\">Completed</span>\n <span class=\"info-value\">{{ formatDate(Log.CompletedAt) }}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"info-label\">Duration</span>\n <span class=\"info-value\">{{ formatDuration(Log.DurationMs) }}</span>\n </div>\n </div>\n </div>\n <!-- Error Message (if any) -->\n @if (Log.ErrorMessage) {\n <div class=\"info-section error-section expandable-section\">\n <div class=\"section-header clickable\" (click)=\"toggleSection(ErrorSection)\">\n <div class=\"section-title-row\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"ErrorSection.expanded\"></i>\n <h3 class=\"section-title error\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n Error\n </h3>\n </div>\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"copyError(); $event.stopPropagation()\" title=\"Copy error\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (ErrorSection.expanded) {\n <div class=\"error-card\">\n <pre class=\"error-message\">{{ Log.ErrorMessage }}</pre>\n </div>\n }\n </div>\n }\n <!-- Input Arguments -->\n @if (Log.InputArgs) {\n <div class=\"info-section expandable-section\">\n <div class=\"section-header clickable\" (click)=\"toggleSection(InputArgsSection)\">\n <div class=\"section-title-row\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"InputArgsSection.expanded\"></i>\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-arrow-right-to-bracket\"></i>\n Input Arguments\n </h3>\n </div>\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"copyInputArgs(); $event.stopPropagation()\" title=\"Copy input arguments\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (InputArgsSection.expanded) {\n <div class=\"code-card\">\n <mj-code-editor\n [ngModel]=\"FormattedInputArgs\"\n [language]=\"'json'\"\n [readonly]=\"true\">\n </mj-code-editor>\n </div>\n }\n </div>\n }\n <!-- Result -->\n @if (Log.Result) {\n <div class=\"info-section expandable-section\">\n <div class=\"section-header clickable\" (click)=\"toggleSection(ResultSection)\">\n <div class=\"section-title-row\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"ResultSection.expanded\"></i>\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-arrow-right-from-bracket\"></i>\n Result\n </h3>\n </div>\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"copyResult(); $event.stopPropagation()\" title=\"Copy result\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (ResultSection.expanded) {\n <div class=\"code-card\">\n <mj-code-editor\n [ngModel]=\"FormattedResult\"\n [language]=\"'json'\"\n [readonly]=\"true\">\n </mj-code-editor>\n </div>\n }\n </div>\n }\n <!-- User Info -->\n @if (Log.UserName) {\n <div class=\"info-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-user\"></i>\n Executed By\n </h3>\n <div class=\"info-card\">\n <div class=\"info-row\">\n <span class=\"info-label\">User</span>\n <span class=\"info-value\">{{ Log.UserName }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n <!-- Panel Actions -->\n <div class=\"panel-actions\">\n @if (Log.ToolID) {\n <button kendoButton themeColor=\"primary\" (click)=\"onRunAgain()\">\n <i class=\"fa-solid fa-play\"></i>\n Run Again\n </button>\n }\n <button kendoButton fillMode=\"flat\" (click)=\"closePanel()\">Close</button>\n </div>\n </div>\n}\n"]}
1
+ {"version":3,"file":"mcp-log-detail-panel.component.js","sourceRoot":"","sources":["../../../src/MCP/components/mcp-log-detail-panel.component.ts","../../../src/MCP/components/mcp-log-detail-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview MCP Log Detail Slide-Out Panel Component\n *\n * Displays detailed information about an MCP tool execution log\n * in a slide-out panel from the right side.\n */\n\nimport { Component, Input, Output, EventEmitter, ChangeDetectorRef, HostListener, OnInit, OnDestroy } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { trigger, transition, style, animate } from '@angular/animations';\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport { MCPExecutionLogData } from '../mcp-dashboard.component';\n\n/**\n * Extended log data with parsed input/output\n */\nexport interface LogDetailData extends MCPExecutionLogData {\n InputArgs?: string | null;\n Result?: string | null;\n ServerName?: string;\n}\n\n/**\n * Expandable section state\n */\ninterface ExpandableSection {\n expanded: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-mcp-log-detail-panel',\n templateUrl: './mcp-log-detail-panel.component.html',\n styleUrls: ['./mcp-log-detail-panel.component.css'],\n animations: [\n trigger('slideIn', [\n transition(':enter', [\n style({ transform: 'translateX(100%)', opacity: 0 }),\n animate('250ms ease-out', style({ transform: 'translateX(0)', opacity: 1 }))\n ]),\n transition(':leave', [\n animate('200ms ease-in', style({ transform: 'translateX(100%)', opacity: 0 }))\n ])\n ])\n ]\n})\nexport class MCPLogDetailPanelComponent implements OnInit, OnDestroy {\n\n // ========================================\n // Inputs\n // ========================================\n\n @Input() Visible = false;\n @Input() Log: LogDetailData | null = null;\n\n // ========================================\n // Outputs\n // ========================================\n\n @Output() Close = new EventEmitter<void>();\n @Output() RunAgain = new EventEmitter<{ toolId: string; connectionId: string }>();\n\n // ========================================\n // Expandable Sections State\n // ========================================\n\n InputArgsSection: ExpandableSection = { expanded: true };\n ResultSection: ExpandableSection = { expanded: true };\n ErrorSection: ExpandableSection = { expanded: true };\n\n // ========================================\n // Panel Width / Resize State\n // ========================================\n\n private readonly PANEL_WIDTH_SETTING_KEY = 'mcp-log-detail-panel/width';\n private readonly MIN_PANEL_WIDTH = 320;\n private readonly MAX_PANEL_WIDTH = 800;\n private readonly DEFAULT_PANEL_WIDTH = 500;\n private readonly MOBILE_BREAKPOINT = 768;\n\n PanelWidth: number = this.DEFAULT_PANEL_WIDTH;\n IsResizing = false;\n\n get IsMobileMode(): boolean {\n return typeof window !== 'undefined' && window.innerWidth <= this.MOBILE_BREAKPOINT;\n }\n\n private widthPersistSubject = new Subject<number>();\n private destroy$ = new Subject<void>();\n\n constructor(private cdr: ChangeDetectorRef) {\n this.widthPersistSubject.pipe(\n debounceTime(500),\n takeUntil(this.destroy$)\n ).subscribe(width => {\n this.persistPanelWidth(width);\n });\n }\n\n ngOnInit(): void {\n this.loadSavedPanelWidth();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ========================================\n // Panel Resize Handlers\n // ========================================\n\n onResizeStart(event: MouseEvent): void {\n if (this.IsMobileMode) return;\n event.preventDefault();\n this.IsResizing = true;\n document.body.style.cursor = 'ew-resize';\n document.body.style.userSelect = 'none';\n }\n\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (!this.IsResizing) return;\n const newWidth = window.innerWidth - event.clientX;\n this.PanelWidth = Math.min(\n Math.max(newWidth, this.MIN_PANEL_WIDTH),\n Math.min(this.MAX_PANEL_WIDTH, window.innerWidth - 50)\n );\n this.cdr.detectChanges();\n }\n\n @HostListener('document:mouseup')\n onMouseUp(): void {\n if (this.IsResizing) {\n this.IsResizing = false;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n this.widthPersistSubject.next(this.PanelWidth);\n }\n }\n\n @HostListener('window:resize')\n onWindowResize(): void {\n if (this.IsMobileMode) {\n this.PanelWidth = window.innerWidth;\n } else if (this.PanelWidth > window.innerWidth - 50) {\n this.PanelWidth = Math.max(this.MIN_PANEL_WIDTH, window.innerWidth - 50);\n }\n this.cdr.detectChanges();\n }\n\n private loadSavedPanelWidth(): void {\n if (this.IsMobileMode) {\n this.PanelWidth = window.innerWidth;\n return;\n }\n try {\n const savedWidth = UserInfoEngine.Instance.GetSetting(this.PANEL_WIDTH_SETTING_KEY);\n if (savedWidth) {\n const width = parseInt(savedWidth, 10);\n if (!isNaN(width) && width >= this.MIN_PANEL_WIDTH && width <= this.MAX_PANEL_WIDTH) {\n this.PanelWidth = width;\n }\n }\n } catch (error) {\n console.warn('[MCPLogDetailPanel] Failed to load saved panel width:', error);\n }\n }\n\n private async persistPanelWidth(width: number): Promise<void> {\n try {\n await UserInfoEngine.Instance.SetSetting(this.PANEL_WIDTH_SETTING_KEY, String(width));\n } catch (error) {\n console.warn('[MCPLogDetailPanel] Failed to persist panel width:', error);\n }\n }\n\n // ========================================\n // Actions\n // ========================================\n\n closePanel(): void {\n this.Close.emit();\n }\n\n onRunAgain(): void {\n if (this.Log?.ToolID && this.Log?.ConnectionID) {\n this.RunAgain.emit({\n toolId: this.Log.ToolID,\n connectionId: this.Log.ConnectionID\n });\n }\n }\n\n // ========================================\n // Section Toggle & Copy Actions\n // ========================================\n\n toggleSection(section: ExpandableSection): void {\n section.expanded = !section.expanded;\n this.cdr.detectChanges();\n }\n\n async copyInputArgs(): Promise<void> {\n await this.copyToClipboard(this.FormattedInputArgs, 'Input arguments copied to clipboard');\n }\n\n async copyResult(): Promise<void> {\n await this.copyToClipboard(this.FormattedResult, 'Result copied to clipboard');\n }\n\n async copyError(): Promise<void> {\n await this.copyToClipboard(this.Log?.ErrorMessage || '', 'Error message copied to clipboard');\n }\n\n private async copyToClipboard(text: string, successMessage: string): Promise<void> {\n if (!text) return;\n try {\n await navigator.clipboard.writeText(text);\n // Could emit an event or show a toast here\n console.log(successMessage);\n } catch (error) {\n console.error('Failed to copy to clipboard:', error);\n }\n }\n\n // ========================================\n // Formatting Helpers\n // ========================================\n\n formatDate(date: Date | string | null): string {\n if (!date) return 'N/A';\n const d = typeof date === 'string' ? new Date(date) : date;\n return d.toLocaleString();\n }\n\n formatDuration(ms: number | null): string {\n if (ms === null) return '-';\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n }\n\n formatJson(jsonString: string | null | undefined): string {\n if (!jsonString) return '';\n try {\n const parsed = JSON.parse(jsonString);\n return JSON.stringify(parsed, null, 2);\n } catch {\n return jsonString;\n }\n }\n\n get FormattedInputArgs(): string {\n return this.formatJson(this.Log?.InputArgs);\n }\n\n get FormattedResult(): string {\n return this.formatJson(this.Log?.Result);\n }\n\n getStatusIcon(status: string): string {\n switch (status) {\n case 'Success': return 'fa-solid fa-check-circle';\n case 'Error': return 'fa-solid fa-times-circle';\n case 'Running': return 'fa-solid fa-spinner fa-spin';\n default: return 'fa-solid fa-question-circle';\n }\n }\n\n getStatusClass(status: string): string {\n switch (status) {\n case 'Success': return 'status-success';\n case 'Error': return 'status-error';\n case 'Running': return 'status-running';\n default: return 'status-unknown';\n }\n }\n}\n","<!-- Backdrop -->\n@if (Visible) {\n <div class=\"panel-backdrop\" (click)=\"closePanel()\"></div>\n}\n\n<!-- Slide-out Panel -->\n@if (Visible && Log) {\n <div class=\"slide-out-panel\"\n @slideIn\n [style.width.px]=\"IsMobileMode ? null : PanelWidth\"\n [class.mobile]=\"IsMobileMode\"\n [class.resizing]=\"IsResizing\">\n <!-- Resize Handle -->\n @if (!IsMobileMode) {\n <div class=\"resize-handle\"\n (mousedown)=\"onResizeStart($event)\"\n [class.active]=\"IsResizing\"\n title=\"Drag to resize\">\n <div class=\"resize-grip\"></div>\n </div>\n }\n <!-- Panel Header -->\n <div class=\"panel-header\">\n <h2 class=\"panel-title\">\n <i class=\"fa-solid fa-list-check\"></i>\n Execution Details\n </h2>\n <button class=\"close-btn\" (click)=\"closePanel()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Panel Content -->\n <div class=\"panel-content\">\n <!-- Status Banner -->\n <div class=\"status-banner\" [ngClass]=\"getStatusClass(Log.Status)\">\n <i [class]=\"getStatusIcon(Log.Status)\"></i>\n <span class=\"status-text\">{{ Log.Status }}</span>\n @if (Log.DurationMs) {\n <span class=\"duration\">{{ formatDuration(Log.DurationMs) }}</span>\n }\n </div>\n <!-- Tool Info -->\n <div class=\"info-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-wrench\"></i>\n Tool\n </h3>\n <div class=\"info-card\">\n <div class=\"info-row\">\n <span class=\"info-label\">Name</span>\n <span class=\"info-value tool-name\">{{ Log.ToolName }}</span>\n </div>\n @if (Log.ServerName) {\n <div class=\"info-row\">\n <span class=\"info-label\">Server</span>\n <span class=\"info-value\">{{ Log.ServerName }}</span>\n </div>\n }\n <div class=\"info-row\">\n <span class=\"info-label\">Connection</span>\n <span class=\"info-value\">{{ Log.ConnectionName }}</span>\n </div>\n </div>\n </div>\n <!-- Timing Info -->\n <div class=\"info-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-clock\"></i>\n Timing\n </h3>\n <div class=\"info-card\">\n <div class=\"info-row\">\n <span class=\"info-label\">Started</span>\n <span class=\"info-value\">{{ formatDate(Log.StartedAt) }}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"info-label\">Completed</span>\n <span class=\"info-value\">{{ formatDate(Log.CompletedAt) }}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"info-label\">Duration</span>\n <span class=\"info-value\">{{ formatDuration(Log.DurationMs) }}</span>\n </div>\n </div>\n </div>\n <!-- Error Message (if any) -->\n @if (Log.ErrorMessage) {\n <div class=\"info-section error-section expandable-section\">\n <div class=\"section-header clickable\" (click)=\"toggleSection(ErrorSection)\">\n <div class=\"section-title-row\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"ErrorSection.expanded\"></i>\n <h3 class=\"section-title error\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n Error\n </h3>\n </div>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"copyError(); $event.stopPropagation()\" title=\"Copy error\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (ErrorSection.expanded) {\n <div class=\"error-card\">\n <pre class=\"error-message\">{{ Log.ErrorMessage }}</pre>\n </div>\n }\n </div>\n }\n <!-- Input Arguments -->\n @if (Log.InputArgs) {\n <div class=\"info-section expandable-section\">\n <div class=\"section-header clickable\" (click)=\"toggleSection(InputArgsSection)\">\n <div class=\"section-title-row\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"InputArgsSection.expanded\"></i>\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-arrow-right-to-bracket\"></i>\n Input Arguments\n </h3>\n </div>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"copyInputArgs(); $event.stopPropagation()\" title=\"Copy input arguments\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (InputArgsSection.expanded) {\n <div class=\"code-card\">\n <mj-code-editor\n [ngModel]=\"FormattedInputArgs\"\n [language]=\"'json'\"\n [readonly]=\"true\">\n </mj-code-editor>\n </div>\n }\n </div>\n }\n <!-- Result -->\n @if (Log.Result) {\n <div class=\"info-section expandable-section\">\n <div class=\"section-header clickable\" (click)=\"toggleSection(ResultSection)\">\n <div class=\"section-title-row\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"ResultSection.expanded\"></i>\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-arrow-right-from-bracket\"></i>\n Result\n </h3>\n </div>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"copyResult(); $event.stopPropagation()\" title=\"Copy result\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (ResultSection.expanded) {\n <div class=\"code-card\">\n <mj-code-editor\n [ngModel]=\"FormattedResult\"\n [language]=\"'json'\"\n [readonly]=\"true\">\n </mj-code-editor>\n </div>\n }\n </div>\n }\n <!-- User Info -->\n @if (Log.UserName) {\n <div class=\"info-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-user\"></i>\n Executed By\n </h3>\n <div class=\"info-card\">\n <div class=\"info-row\">\n <span class=\"info-label\">User</span>\n <span class=\"info-value\">{{ Log.UserName }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n <!-- Panel Actions -->\n <div class=\"panel-actions\">\n @if (Log.ToolID) {\n <button mjButton variant=\"primary\" (click)=\"onRunAgain()\">\n <i class=\"fa-solid fa-play\"></i>\n Run Again\n </button>\n }\n <button mjButton variant=\"flat\" (click)=\"closePanel()\">Close</button>\n </div>\n </div>\n}\n"]}