@memberjunction/ng-dashboards 5.10.1 → 5.12.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 (231) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +34 -2
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +586 -223
  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/agents/agent-filter-panel.component.d.ts +8 -0
  7. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
  8. package/dist/AI/components/agents/agent-filter-panel.component.js +85 -52
  9. package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
  10. package/dist/AI/components/charts/performance-heatmap.component.d.ts +1 -0
  11. package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -1
  12. package/dist/AI/components/charts/performance-heatmap.component.js +27 -5
  13. package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -1
  14. package/dist/AI/components/charts/time-series-chart.component.d.ts +5 -0
  15. package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -1
  16. package/dist/AI/components/charts/time-series-chart.component.js +23 -8
  17. package/dist/AI/components/charts/time-series-chart.component.js.map +1 -1
  18. package/dist/AI/components/execution-monitoring.component.js +2 -2
  19. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  20. package/dist/AI/components/models/model-management.component.js +2 -2
  21. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +2 -2
  22. package/dist/AI/components/prompts/prompt-filter-panel.component.js +2 -2
  23. package/dist/AI/components/prompts/prompt-management.component.js +3 -3
  24. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  25. package/dist/AI/components/prompts/prompt-version-control.component.js +2 -2
  26. package/dist/AI/components/requests/agent-requests-resource.component.d.ts +83 -0
  27. package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -0
  28. package/dist/AI/components/requests/agent-requests-resource.component.js +547 -0
  29. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -0
  30. package/dist/AI/components/system/system-config-filter-panel.component.js +2 -2
  31. package/dist/AI/components/system/system-configuration.component.js +2 -2
  32. package/dist/AI/components/widgets/kpi-card.component.js +7 -7
  33. package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
  34. package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -1
  35. package/dist/AI/components/widgets/live-execution-widget.component.js +6 -6
  36. package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -1
  37. package/dist/AI/index.d.ts +1 -0
  38. package/dist/AI/index.d.ts.map +1 -1
  39. package/dist/AI/index.js +2 -0
  40. package/dist/AI/index.js.map +1 -1
  41. package/dist/APIKeys/api-applications-panel.component.js +3 -3
  42. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  43. package/dist/APIKeys/api-key-create-dialog.component.js +3 -3
  44. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  45. package/dist/APIKeys/api-key-edit-panel.component.js +1 -1
  46. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  47. package/dist/APIKeys/api-key-list.component.js +3 -3
  48. package/dist/APIKeys/api-key-list.component.js.map +1 -1
  49. package/dist/APIKeys/api-keys-resource.component.js +1 -1
  50. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  51. package/dist/APIKeys/api-scopes-panel.component.js +2 -2
  52. package/dist/APIKeys/api-usage-panel.component.js +2 -2
  53. package/dist/Actions/components/actions-overview.component.js +2 -2
  54. package/dist/Actions/components/execution-monitoring.component.js +2 -2
  55. package/dist/Actions/components/explorer/action-breadcrumb.component.js +2 -2
  56. package/dist/Actions/components/explorer/action-card.component.js +2 -2
  57. package/dist/Actions/components/explorer/action-explorer.component.js +2 -2
  58. package/dist/Actions/components/explorer/action-list-item.component.js +2 -2
  59. package/dist/Actions/components/explorer/action-toolbar.component.js +2 -2
  60. package/dist/Actions/components/explorer/action-tree-panel.component.js +2 -2
  61. package/dist/Actions/components/explorer/new-action-panel.component.js +2 -2
  62. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  63. package/dist/Actions/components/explorer/new-category-panel.component.js +2 -2
  64. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  65. package/dist/Communication/communication-dashboard.component.js +2 -2
  66. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  67. package/dist/Communication/communication-logs-resource.component.js +3 -3
  68. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  69. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  70. package/dist/Communication/communication-monitor-resource.component.js +5 -5
  71. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  72. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  73. package/dist/Communication/communication-providers-resource.component.js +3 -3
  74. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  75. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  76. package/dist/Communication/communication-runs-resource.component.js +3 -3
  77. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  78. package/dist/Communication/communication-templates-resource.component.js +2 -2
  79. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  80. package/dist/ComponentStudio/component-studio-dashboard.component.js +2 -2
  81. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +2 -2
  82. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +2 -2
  83. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +2 -2
  84. package/dist/ComponentStudio/components/browser/component-browser.component.js +2 -2
  85. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +2 -2
  86. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
  87. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +2 -2
  88. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
  89. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +2 -2
  90. package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
  91. package/dist/ComponentStudio/components/editors/spec-editor.component.js +2 -2
  92. package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
  93. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +2 -2
  94. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +2 -2
  95. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
  96. package/dist/ComponentStudio/components/text-import-dialog.component.js +2 -2
  97. package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
  98. package/dist/ComponentStudio/components/workspace/component-preview.component.js +2 -2
  99. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +2 -2
  100. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
  101. package/dist/Credentials/components/credentials-audit-resource.component.js +9 -9
  102. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  103. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  104. package/dist/Credentials/components/credentials-categories-resource.component.js +11 -3
  105. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  106. package/dist/Credentials/components/credentials-list-resource.component.js +2 -2
  107. package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
  108. package/dist/Credentials/components/credentials-overview-resource.component.js +12 -11
  109. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  110. package/dist/Credentials/components/credentials-types-resource.component.js +9 -9
  111. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  112. package/dist/Credentials/credentials-dashboard.component.js +2 -2
  113. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +2 -2
  114. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +2 -2
  115. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +2 -2
  116. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +2 -2
  117. package/dist/DataExplorer/components/view-selector/view-selector.component.js +2 -2
  118. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +6 -2
  119. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  120. package/dist/DataExplorer/data-explorer-dashboard.component.js +26 -8
  121. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  122. package/dist/Home/home-dashboard.component.js +2 -2
  123. package/dist/Integration/components/activity/activity.component.d.ts +1 -1
  124. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  125. package/dist/Integration/components/activity/activity.component.js +5 -5
  126. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  127. package/dist/Integration/components/connections/connections.component.d.ts +31 -2
  128. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  129. package/dist/Integration/components/connections/connections.component.js +753 -412
  130. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  131. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +3 -3
  132. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  133. package/dist/Integration/components/overview/overview.component.d.ts +0 -1
  134. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
  135. package/dist/Integration/components/overview/overview.component.js +3 -6
  136. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  137. package/dist/Integration/components/pipelines/pipelines.component.js +3 -3
  138. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  139. package/dist/Integration/components/schedules/schedules.component.d.ts +20 -0
  140. package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
  141. package/dist/Integration/components/schedules/schedules.component.js +97 -5
  142. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  143. package/dist/Integration/components/visual-editor/visual-editor.component.js +2 -2
  144. package/dist/Integration/components/widgets/integration-card.component.d.ts.map +1 -1
  145. package/dist/Integration/components/widgets/integration-card.component.js +5 -1
  146. package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
  147. package/dist/Integration/components/widgets/run-history-panel.component.js +2 -2
  148. package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
  149. package/dist/Integration/integration.module.d.ts +2 -1
  150. package/dist/Integration/integration.module.d.ts.map +1 -1
  151. package/dist/Integration/integration.module.js +7 -3
  152. package/dist/Integration/integration.module.js.map +1 -1
  153. package/dist/Integration/services/integration-data.service.d.ts +27 -2
  154. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  155. package/dist/Integration/services/integration-data.service.js +107 -4
  156. package/dist/Integration/services/integration-data.service.js.map +1 -1
  157. package/dist/Lists/components/lists-browse-resource.component.js +2 -2
  158. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  159. package/dist/Lists/components/lists-categories-resource.component.js +2 -2
  160. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  161. package/dist/Lists/components/lists-my-lists-resource.component.js +2 -2
  162. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  163. package/dist/Lists/components/lists-operations-resource.component.js +2 -2
  164. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  165. package/dist/Lists/components/venn-diagram/venn-diagram.component.js +3 -3
  166. package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
  167. package/dist/MCP/components/mcp-connection-dialog.component.js +2 -2
  168. package/dist/MCP/components/mcp-log-detail-panel.component.js +2 -2
  169. package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
  170. package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
  171. package/dist/MCP/components/mcp-test-tool-dialog.component.js +2 -2
  172. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
  173. package/dist/MCP/mcp-dashboard.component.js +2 -2
  174. package/dist/MCP/mcp-filter-panel.component.js +2 -2
  175. package/dist/QueryBrowser/query-browser-resource.component.d.ts +55 -1
  176. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  177. package/dist/QueryBrowser/query-browser-resource.component.js +664 -199
  178. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  179. package/dist/Scheduling/components/index.d.ts +0 -1
  180. package/dist/Scheduling/components/index.d.ts.map +1 -1
  181. package/dist/Scheduling/components/index.js +0 -1
  182. package/dist/Scheduling/components/index.js.map +1 -1
  183. package/dist/Scheduling/components/scheduling-activity.component.js +2 -2
  184. package/dist/Scheduling/components/scheduling-jobs.component.d.ts +6 -9
  185. package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
  186. package/dist/Scheduling/components/scheduling-jobs.component.js +118 -110
  187. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  188. package/dist/Scheduling/components/scheduling-overview.component.js +3 -3
  189. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  190. package/dist/Scheduling/scheduling-dashboard.component.js +2 -2
  191. package/dist/SystemDiagnostics/system-diagnostics.component.js +4 -4
  192. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  193. package/dist/Testing/components/testing-analytics.component.js +2 -2
  194. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  195. package/dist/Testing/components/testing-dashboard-tab.component.js +4 -4
  196. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  197. package/dist/Testing/components/testing-explorer.component.js +2 -2
  198. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  199. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  200. package/dist/Testing/components/testing-review.component.js +5 -5
  201. package/dist/Testing/components/testing-review.component.js.map +1 -1
  202. package/dist/Testing/components/testing-runs.component.js +2 -2
  203. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  204. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js +2 -2
  205. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js.map +1 -1
  206. package/dist/Testing/components/widgets/suite-tree.component.js +4 -4
  207. package/dist/Testing/components/widgets/suite-tree.component.js.map +1 -1
  208. package/dist/Testing/components/widgets/test-run-detail-panel.component.js +2 -2
  209. package/dist/Testing/components/widgets/test-run-detail-panel.component.js.map +1 -1
  210. package/dist/Testing/testing-dashboard.component.js +2 -2
  211. package/dist/VersionHistory/components/diff-resource.component.js +2 -2
  212. package/dist/VersionHistory/components/graph-resource.component.js +2 -2
  213. package/dist/VersionHistory/components/labels-resource.component.js +3 -3
  214. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  215. package/dist/VersionHistory/components/restore-resource.component.js +3 -3
  216. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  217. package/dist/__tests__/integration-data-service.test.js +1 -0
  218. package/dist/__tests__/integration-data-service.test.js.map +1 -1
  219. package/dist/module.d.ts +52 -49
  220. package/dist/module.d.ts.map +1 -1
  221. package/dist/module.js +25 -6
  222. package/dist/module.js.map +1 -1
  223. package/dist/public-api.d.ts +1 -1
  224. package/dist/public-api.d.ts.map +1 -1
  225. package/dist/public-api.js +1 -1
  226. package/dist/public-api.js.map +1 -1
  227. package/package.json +42 -40
  228. package/dist/Scheduling/components/job-slideout.component.d.ts +0 -45
  229. package/dist/Scheduling/components/job-slideout.component.d.ts.map +0 -1
  230. package/dist/Scheduling/components/job-slideout.component.js +0 -459
  231. package/dist/Scheduling/components/job-slideout.component.js.map +0 -1
@@ -87,16 +87,16 @@ export class KPICardComponent {
87
87
  }
88
88
  getTrendColor() {
89
89
  if (!this.data.trend)
90
- return '#999';
90
+ return 'var(--mj-text-disabled)';
91
91
  switch (this.data.trend.direction) {
92
92
  case 'up':
93
- return '#4caf50';
93
+ return 'var(--mj-status-success)';
94
94
  case 'down':
95
- return '#f44336';
95
+ return 'var(--mj-status-error)';
96
96
  case 'stable':
97
- return '#999';
97
+ return 'var(--mj-text-disabled)';
98
98
  default:
99
- return '#999';
99
+ return 'var(--mj-text-disabled)';
100
100
  }
101
101
  }
102
102
  static ɵfac = function KPICardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || KPICardComponent)(); };
@@ -127,7 +127,7 @@ export class KPICardComponent {
127
127
  i0.ɵɵconditional(ctx.data.subtitle && !ctx.data.loading ? 9 : -1);
128
128
  i0.ɵɵadvance();
129
129
  i0.ɵɵconditional(ctx.data.trend && !ctx.data.loading ? 10 : -1);
130
- } }, dependencies: [i1.LoadingComponent], styles: [".kpi-card[_ngcontent-%COMP%] {\n background: white;\n border-radius: 16px;\n padding: 20px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.06);\n border: 1px solid #e5e7eb;\n border-left: 4px solid transparent;\n transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n min-height: 130px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .kpi-card[_ngcontent-%COMP%]:hover {\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);\n transform: translateY(-3px);\n border-color: #c7d2fe;\n }\n\n .kpi-card--primary[_ngcontent-%COMP%] { border-left-color: #6366f1; }\n .kpi-card--success[_ngcontent-%COMP%] { border-left-color: #10b981; }\n .kpi-card--warning[_ngcontent-%COMP%] { border-left-color: #f59e0b; }\n .kpi-card--danger[_ngcontent-%COMP%] { border-left-color: #ef4444; }\n .kpi-card--info[_ngcontent-%COMP%] { border-left-color: #8b5cf6; }\n\n .kpi-card__header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n margin-bottom: 12px;\n }\n\n .kpi-card__icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 12px;\n font-size: 15px;\n }\n\n .kpi-card--primary[_ngcontent-%COMP%] .kpi-card__icon[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.15) 0%, rgba(139, 92, 246, 0.15) 100%);\n color: #6366f1;\n }\n .kpi-card--success[_ngcontent-%COMP%] .kpi-card__icon[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, rgba(16, 185, 129, 0.15) 0%, rgba(5, 150, 105, 0.15) 100%);\n color: #10b981;\n }\n .kpi-card--warning[_ngcontent-%COMP%] .kpi-card__icon[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, rgba(245, 158, 11, 0.15) 0%, rgba(217, 119, 6, 0.15) 100%);\n color: #f59e0b;\n }\n .kpi-card--danger[_ngcontent-%COMP%] .kpi-card__icon[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, rgba(239, 68, 68, 0.15) 0%, rgba(220, 38, 38, 0.15) 100%);\n color: #ef4444;\n }\n .kpi-card--info[_ngcontent-%COMP%] .kpi-card__icon[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, rgba(139, 92, 246, 0.15) 0%, rgba(167, 139, 250, 0.15) 100%);\n color: #8b5cf6;\n }\n\n .kpi-card__title[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 700;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .kpi-card__content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n\n .kpi-card__value[_ngcontent-%COMP%] {\n font-size: 26px;\n font-weight: 700;\n color: #1e293b;\n margin-bottom: 4px;\n line-height: 1.1;\n letter-spacing: -0.02em;\n }\n\n .kpi-card__subtitle[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #94a3b8;\n margin-bottom: 6px;\n }\n\n .kpi-card__trend[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n font-size: 11px;\n gap: 4px;\n }\n\n .trend-percentage[_ngcontent-%COMP%] {\n font-weight: 600;\n }\n\n .trend-period[_ngcontent-%COMP%] {\n color: #94a3b8;\n }\n\n .kpi-card__loading[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 60px;\n }\n\n @media (max-width: 768px) {\n .kpi-card[_ngcontent-%COMP%] {\n min-height: 110px;\n padding: 16px;\n }\n\n .kpi-card__value[_ngcontent-%COMP%] {\n font-size: 22px;\n }\n\n .kpi-card__icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n font-size: 13px;\n }\n }"] });
130
+ } }, dependencies: [i1.LoadingComponent], styles: [".kpi-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: 16px;\n padding: 20px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.06);\n border: 1px solid var(--mj-border-default);\n border-left: 4px solid transparent;\n transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n min-height: 130px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .kpi-card[_ngcontent-%COMP%]:hover {\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);\n transform: translateY(-3px);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n }\n\n .kpi-card--primary[_ngcontent-%COMP%] { border-left-color: var(--mj-brand-primary); }\n .kpi-card--success[_ngcontent-%COMP%] { border-left-color: var(--mj-status-success); }\n .kpi-card--warning[_ngcontent-%COMP%] { border-left-color: var(--mj-status-warning); }\n .kpi-card--danger[_ngcontent-%COMP%] { border-left-color: var(--mj-status-error); }\n .kpi-card--info[_ngcontent-%COMP%] { border-left-color: var(--mj-brand-accent); }\n\n .kpi-card__header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n margin-bottom: 12px;\n }\n\n .kpi-card__icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 12px;\n font-size: 15px;\n }\n\n .kpi-card--primary[_ngcontent-%COMP%] .kpi-card__icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .kpi-card--success[_ngcontent-%COMP%] .kpi-card__icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .kpi-card--warning[_ngcontent-%COMP%] .kpi-card__icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n .kpi-card--danger[_ngcontent-%COMP%] .kpi-card__icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .kpi-card--info[_ngcontent-%COMP%] .kpi-card__icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-accent) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-accent);\n }\n\n .kpi-card__title[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .kpi-card__content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n\n .kpi-card__value[_ngcontent-%COMP%] {\n font-size: 26px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n line-height: 1.1;\n letter-spacing: -0.02em;\n }\n\n .kpi-card__subtitle[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-bottom: 6px;\n }\n\n .kpi-card__trend[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n font-size: 11px;\n gap: 4px;\n }\n\n .trend-percentage[_ngcontent-%COMP%] {\n font-weight: 600;\n }\n\n .trend-period[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n }\n\n .kpi-card__loading[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 60px;\n }\n\n @media (max-width: 768px) {\n .kpi-card[_ngcontent-%COMP%] {\n min-height: 110px;\n padding: 16px;\n }\n\n .kpi-card__value[_ngcontent-%COMP%] {\n font-size: 22px;\n }\n\n .kpi-card__icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n font-size: 13px;\n }\n }"] });
131
131
  }
132
132
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(KPICardComponent, [{
133
133
  type: Component,
@@ -169,7 +169,7 @@ export class KPICardComponent {
169
169
  }
170
170
  </div>
171
171
  </div>
172
- `, styles: ["\n .kpi-card {\n background: white;\n border-radius: 16px;\n padding: 20px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.06);\n border: 1px solid #e5e7eb;\n border-left: 4px solid transparent;\n transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n min-height: 130px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .kpi-card:hover {\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);\n transform: translateY(-3px);\n border-color: #c7d2fe;\n }\n\n .kpi-card--primary { border-left-color: #6366f1; }\n .kpi-card--success { border-left-color: #10b981; }\n .kpi-card--warning { border-left-color: #f59e0b; }\n .kpi-card--danger { border-left-color: #ef4444; }\n .kpi-card--info { border-left-color: #8b5cf6; }\n\n .kpi-card__header {\n display: flex;\n align-items: center;\n margin-bottom: 12px;\n }\n\n .kpi-card__icon {\n width: 36px;\n height: 36px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 12px;\n font-size: 15px;\n }\n\n .kpi-card--primary .kpi-card__icon {\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.15) 0%, rgba(139, 92, 246, 0.15) 100%);\n color: #6366f1;\n }\n .kpi-card--success .kpi-card__icon {\n background: linear-gradient(135deg, rgba(16, 185, 129, 0.15) 0%, rgba(5, 150, 105, 0.15) 100%);\n color: #10b981;\n }\n .kpi-card--warning .kpi-card__icon {\n background: linear-gradient(135deg, rgba(245, 158, 11, 0.15) 0%, rgba(217, 119, 6, 0.15) 100%);\n color: #f59e0b;\n }\n .kpi-card--danger .kpi-card__icon {\n background: linear-gradient(135deg, rgba(239, 68, 68, 0.15) 0%, rgba(220, 38, 38, 0.15) 100%);\n color: #ef4444;\n }\n .kpi-card--info .kpi-card__icon {\n background: linear-gradient(135deg, rgba(139, 92, 246, 0.15) 0%, rgba(167, 139, 250, 0.15) 100%);\n color: #8b5cf6;\n }\n\n .kpi-card__title {\n font-size: 11px;\n font-weight: 700;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .kpi-card__content {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n\n .kpi-card__value {\n font-size: 26px;\n font-weight: 700;\n color: #1e293b;\n margin-bottom: 4px;\n line-height: 1.1;\n letter-spacing: -0.02em;\n }\n\n .kpi-card__subtitle {\n font-size: 11px;\n color: #94a3b8;\n margin-bottom: 6px;\n }\n\n .kpi-card__trend {\n display: flex;\n align-items: center;\n font-size: 11px;\n gap: 4px;\n }\n\n .trend-percentage {\n font-weight: 600;\n }\n\n .trend-period {\n color: #94a3b8;\n }\n\n .kpi-card__loading {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 60px;\n }\n\n @media (max-width: 768px) {\n .kpi-card {\n min-height: 110px;\n padding: 16px;\n }\n\n .kpi-card__value {\n font-size: 22px;\n }\n\n .kpi-card__icon {\n width: 32px;\n height: 32px;\n font-size: 13px;\n }\n }\n "] }]
172
+ `, styles: ["\n .kpi-card {\n background: var(--mj-bg-surface);\n border-radius: 16px;\n padding: 20px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.06);\n border: 1px solid var(--mj-border-default);\n border-left: 4px solid transparent;\n transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n min-height: 130px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .kpi-card:hover {\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);\n transform: translateY(-3px);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n }\n\n .kpi-card--primary { border-left-color: var(--mj-brand-primary); }\n .kpi-card--success { border-left-color: var(--mj-status-success); }\n .kpi-card--warning { border-left-color: var(--mj-status-warning); }\n .kpi-card--danger { border-left-color: var(--mj-status-error); }\n .kpi-card--info { border-left-color: var(--mj-brand-accent); }\n\n .kpi-card__header {\n display: flex;\n align-items: center;\n margin-bottom: 12px;\n }\n\n .kpi-card__icon {\n width: 36px;\n height: 36px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 12px;\n font-size: 15px;\n }\n\n .kpi-card--primary .kpi-card__icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .kpi-card--success .kpi-card__icon {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .kpi-card--warning .kpi-card__icon {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n .kpi-card--danger .kpi-card__icon {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .kpi-card--info .kpi-card__icon {\n background: color-mix(in srgb, var(--mj-brand-accent) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-accent);\n }\n\n .kpi-card__title {\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .kpi-card__content {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n\n .kpi-card__value {\n font-size: 26px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n line-height: 1.1;\n letter-spacing: -0.02em;\n }\n\n .kpi-card__subtitle {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-bottom: 6px;\n }\n\n .kpi-card__trend {\n display: flex;\n align-items: center;\n font-size: 11px;\n gap: 4px;\n }\n\n .trend-percentage {\n font-weight: 600;\n }\n\n .trend-period {\n color: var(--mj-text-disabled);\n }\n\n .kpi-card__loading {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 60px;\n }\n\n @media (max-width: 768px) {\n .kpi-card {\n min-height: 110px;\n padding: 16px;\n }\n\n .kpi-card__value {\n font-size: 22px;\n }\n\n .kpi-card__icon {\n width: 32px;\n height: 32px;\n font-size: 13px;\n }\n }\n "] }]
173
173
  }], null, { data: [{
174
174
  type: Input
175
175
  }] }); })();
@@ -1 +1 @@
1
- {"version":3,"file":"kpi-card.component.js","sourceRoot":"","sources":["../../../../src/AI/components/widgets/kpi-card.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnInit } from '@angular/core';\n\nexport interface KPICardData {\n title: string;\n value: string | number;\n subtitle?: string;\n icon: string;\n color: 'primary' | 'success' | 'warning' | 'danger' | 'info';\n trend?: {\n direction: 'up' | 'down' | 'stable';\n percentage: number;\n period: string;\n };\n loading?: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'app-kpi-card',\n template: `\n <div class=\"kpi-card\" [class]=\"'kpi-card--' + data.color\">\n <div class=\"kpi-card__header\">\n <div class=\"kpi-card__icon\">\n <i [class]=\"'fa-solid ' + data.icon\"></i>\n </div>\n <div class=\"kpi-card__title\">{{ data.title }}</div>\n </div>\n \n <div class=\"kpi-card__content\">\n @if (!data.loading) {\n <div class=\"kpi-card__value\">\n {{ formatValue(data.value) }}\n </div>\n }\n @if (data.loading) {\n <div class=\"kpi-card__loading\">\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n </div>\n }\n \n @if (data.subtitle && !data.loading) {\n <div class=\"kpi-card__subtitle\">\n {{ data.subtitle }}\n </div>\n }\n \n @if (data.trend && !data.loading) {\n <div class=\"kpi-card__trend\">\n <i [class]=\"getTrendIcon()\" [style.color]=\"getTrendColor()\"></i>\n <span class=\"trend-percentage\" [style.color]=\"getTrendColor()\">\n {{ data.trend.percentage }}%\n </span>\n <span class=\"trend-period\">{{ data.trend.period }}</span>\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n .kpi-card {\n background: white;\n border-radius: 16px;\n padding: 20px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.06);\n border: 1px solid #e5e7eb;\n border-left: 4px solid transparent;\n transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n min-height: 130px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .kpi-card:hover {\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);\n transform: translateY(-3px);\n border-color: #c7d2fe;\n }\n\n .kpi-card--primary { border-left-color: #6366f1; }\n .kpi-card--success { border-left-color: #10b981; }\n .kpi-card--warning { border-left-color: #f59e0b; }\n .kpi-card--danger { border-left-color: #ef4444; }\n .kpi-card--info { border-left-color: #8b5cf6; }\n\n .kpi-card__header {\n display: flex;\n align-items: center;\n margin-bottom: 12px;\n }\n\n .kpi-card__icon {\n width: 36px;\n height: 36px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 12px;\n font-size: 15px;\n }\n\n .kpi-card--primary .kpi-card__icon {\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.15) 0%, rgba(139, 92, 246, 0.15) 100%);\n color: #6366f1;\n }\n .kpi-card--success .kpi-card__icon {\n background: linear-gradient(135deg, rgba(16, 185, 129, 0.15) 0%, rgba(5, 150, 105, 0.15) 100%);\n color: #10b981;\n }\n .kpi-card--warning .kpi-card__icon {\n background: linear-gradient(135deg, rgba(245, 158, 11, 0.15) 0%, rgba(217, 119, 6, 0.15) 100%);\n color: #f59e0b;\n }\n .kpi-card--danger .kpi-card__icon {\n background: linear-gradient(135deg, rgba(239, 68, 68, 0.15) 0%, rgba(220, 38, 38, 0.15) 100%);\n color: #ef4444;\n }\n .kpi-card--info .kpi-card__icon {\n background: linear-gradient(135deg, rgba(139, 92, 246, 0.15) 0%, rgba(167, 139, 250, 0.15) 100%);\n color: #8b5cf6;\n }\n\n .kpi-card__title {\n font-size: 11px;\n font-weight: 700;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .kpi-card__content {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n\n .kpi-card__value {\n font-size: 26px;\n font-weight: 700;\n color: #1e293b;\n margin-bottom: 4px;\n line-height: 1.1;\n letter-spacing: -0.02em;\n }\n\n .kpi-card__subtitle {\n font-size: 11px;\n color: #94a3b8;\n margin-bottom: 6px;\n }\n\n .kpi-card__trend {\n display: flex;\n align-items: center;\n font-size: 11px;\n gap: 4px;\n }\n\n .trend-percentage {\n font-weight: 600;\n }\n\n .trend-period {\n color: #94a3b8;\n }\n\n .kpi-card__loading {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 60px;\n }\n\n @media (max-width: 768px) {\n .kpi-card {\n min-height: 110px;\n padding: 16px;\n }\n\n .kpi-card__value {\n font-size: 22px;\n }\n\n .kpi-card__icon {\n width: 32px;\n height: 32px;\n font-size: 13px;\n }\n }\n `]\n})\nexport class KPICardComponent implements OnInit {\n @Input() data!: KPICardData;\n\n ngOnInit() {\n if (!this.data) {\n throw new Error('KPICardComponent requires data input');\n }\n }\n\n formatValue(value: string | number): string {\n if (typeof value === 'number') {\n // Format large numbers with appropriate suffixes\n if (value >= 1000000) {\n return (value / 1000000).toFixed(1) + 'M';\n } else if (value >= 1000) {\n return (value / 1000).toFixed(1) + 'K';\n } else if (value % 1 !== 0) {\n return value.toFixed(2);\n }\n return value.toString();\n }\n return value;\n }\n\n getTrendIcon(): string {\n if (!this.data.trend) return '';\n \n switch (this.data.trend.direction) {\n case 'up':\n return 'fa-solid fa-arrow-up';\n case 'down':\n return 'fa-solid fa-arrow-down';\n case 'stable':\n return 'fa-solid fa-minus';\n default:\n return '';\n }\n }\n\n getTrendColor(): string {\n if (!this.data.trend) return '#999';\n \n switch (this.data.trend.direction) {\n case 'up':\n return '#4caf50';\n case 'down':\n return '#f44336';\n case 'stable':\n return '#999';\n default:\n return '#999';\n }\n }\n}"]}
1
+ {"version":3,"file":"kpi-card.component.js","sourceRoot":"","sources":["../../../../src/AI/components/widgets/kpi-card.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnInit } from '@angular/core';\n\nexport interface KPICardData {\n title: string;\n value: string | number;\n subtitle?: string;\n icon: string;\n color: 'primary' | 'success' | 'warning' | 'danger' | 'info';\n trend?: {\n direction: 'up' | 'down' | 'stable';\n percentage: number;\n period: string;\n };\n loading?: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'app-kpi-card',\n template: `\n <div class=\"kpi-card\" [class]=\"'kpi-card--' + data.color\">\n <div class=\"kpi-card__header\">\n <div class=\"kpi-card__icon\">\n <i [class]=\"'fa-solid ' + data.icon\"></i>\n </div>\n <div class=\"kpi-card__title\">{{ data.title }}</div>\n </div>\n \n <div class=\"kpi-card__content\">\n @if (!data.loading) {\n <div class=\"kpi-card__value\">\n {{ formatValue(data.value) }}\n </div>\n }\n @if (data.loading) {\n <div class=\"kpi-card__loading\">\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n </div>\n }\n \n @if (data.subtitle && !data.loading) {\n <div class=\"kpi-card__subtitle\">\n {{ data.subtitle }}\n </div>\n }\n \n @if (data.trend && !data.loading) {\n <div class=\"kpi-card__trend\">\n <i [class]=\"getTrendIcon()\" [style.color]=\"getTrendColor()\"></i>\n <span class=\"trend-percentage\" [style.color]=\"getTrendColor()\">\n {{ data.trend.percentage }}%\n </span>\n <span class=\"trend-period\">{{ data.trend.period }}</span>\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n .kpi-card {\n background: var(--mj-bg-surface);\n border-radius: 16px;\n padding: 20px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.06);\n border: 1px solid var(--mj-border-default);\n border-left: 4px solid transparent;\n transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n min-height: 130px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .kpi-card:hover {\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);\n transform: translateY(-3px);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n }\n\n .kpi-card--primary { border-left-color: var(--mj-brand-primary); }\n .kpi-card--success { border-left-color: var(--mj-status-success); }\n .kpi-card--warning { border-left-color: var(--mj-status-warning); }\n .kpi-card--danger { border-left-color: var(--mj-status-error); }\n .kpi-card--info { border-left-color: var(--mj-brand-accent); }\n\n .kpi-card__header {\n display: flex;\n align-items: center;\n margin-bottom: 12px;\n }\n\n .kpi-card__icon {\n width: 36px;\n height: 36px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 12px;\n font-size: 15px;\n }\n\n .kpi-card--primary .kpi-card__icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .kpi-card--success .kpi-card__icon {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .kpi-card--warning .kpi-card__icon {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n .kpi-card--danger .kpi-card__icon {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .kpi-card--info .kpi-card__icon {\n background: color-mix(in srgb, var(--mj-brand-accent) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-accent);\n }\n\n .kpi-card__title {\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .kpi-card__content {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n\n .kpi-card__value {\n font-size: 26px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n line-height: 1.1;\n letter-spacing: -0.02em;\n }\n\n .kpi-card__subtitle {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-bottom: 6px;\n }\n\n .kpi-card__trend {\n display: flex;\n align-items: center;\n font-size: 11px;\n gap: 4px;\n }\n\n .trend-percentage {\n font-weight: 600;\n }\n\n .trend-period {\n color: var(--mj-text-disabled);\n }\n\n .kpi-card__loading {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 60px;\n }\n\n @media (max-width: 768px) {\n .kpi-card {\n min-height: 110px;\n padding: 16px;\n }\n\n .kpi-card__value {\n font-size: 22px;\n }\n\n .kpi-card__icon {\n width: 32px;\n height: 32px;\n font-size: 13px;\n }\n }\n `]\n})\nexport class KPICardComponent implements OnInit {\n @Input() data!: KPICardData;\n\n ngOnInit() {\n if (!this.data) {\n throw new Error('KPICardComponent requires data input');\n }\n }\n\n formatValue(value: string | number): string {\n if (typeof value === 'number') {\n // Format large numbers with appropriate suffixes\n if (value >= 1000000) {\n return (value / 1000000).toFixed(1) + 'M';\n } else if (value >= 1000) {\n return (value / 1000).toFixed(1) + 'K';\n } else if (value % 1 !== 0) {\n return value.toFixed(2);\n }\n return value.toString();\n }\n return value;\n }\n\n getTrendIcon(): string {\n if (!this.data.trend) return '';\n \n switch (this.data.trend.direction) {\n case 'up':\n return 'fa-solid fa-arrow-up';\n case 'down':\n return 'fa-solid fa-arrow-down';\n case 'stable':\n return 'fa-solid fa-minus';\n default:\n return '';\n }\n }\n\n getTrendColor(): string {\n if (!this.data.trend) return 'var(--mj-text-disabled)';\n\n switch (this.data.trend.direction) {\n case 'up':\n return 'var(--mj-status-success)';\n case 'down':\n return 'var(--mj-status-error)';\n case 'stable':\n return 'var(--mj-text-disabled)';\n default:\n return 'var(--mj-text-disabled)';\n }\n }\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"live-execution-widget.component.d.ts","sourceRoot":"","sources":["../../../../src/AI/components/widgets/live-execution-widget.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;;AAE1E,qBA2Xa,4BAA6B,YAAW,MAAM,EAAE,SAAS;IAC3D,UAAU,EAAE,aAAa,EAAE,CAAM;IACjC,UAAU,SAAK;IACd,cAAc,8BAAqC;IAE7D,OAAO,UAAS;IAChB,aAAa,SAAoB;IAEjC,QAAQ;IAER,WAAW;IAEX,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,MAAM;IAInE,mBAAmB,IAAI,OAAO;IAI9B,cAAc,IAAI,MAAM;IAIxB,gBAAgB,CAAC,SAAS,EAAE,aAAa,GAAG,MAAM;IAQlD,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAarC,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;IAgBzC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAI3C,aAAa,IAAI,IAAI;IAKrB,gBAAgB,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI;IAIhD,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;yCA1E3B,4BAA4B;2CAA5B,4BAA4B;CA6ExC"}
1
+ {"version":3,"file":"live-execution-widget.component.d.ts","sourceRoot":"","sources":["../../../../src/AI/components/widgets/live-execution-widget.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;;AAE1E,qBAyWa,4BAA6B,YAAW,MAAM,EAAE,SAAS;IAC3D,UAAU,EAAE,aAAa,EAAE,CAAM;IACjC,UAAU,SAAK;IACd,cAAc,8BAAqC;IAE7D,OAAO,UAAS;IAChB,aAAa,SAAoB;IAEjC,QAAQ;IAER,WAAW;IAEX,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,MAAM;IAInE,mBAAmB,IAAI,OAAO;IAI9B,cAAc,IAAI,MAAM;IAIxB,gBAAgB,CAAC,SAAS,EAAE,aAAa,GAAG,MAAM;IAQlD,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAarC,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;IAgBzC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAI3C,aAAa,IAAI,IAAI;IAKrB,gBAAgB,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI;IAIhD,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;yCA1E3B,4BAA4B;2CAA5B,4BAA4B;CA6ExC"}
@@ -173,7 +173,7 @@ export class LiveExecutionWidgetComponent {
173
173
  return `$${amount.toFixed(4)}`;
174
174
  }
175
175
  static ɵfac = function LiveExecutionWidgetComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || LiveExecutionWidgetComponent)(); };
176
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LiveExecutionWidgetComponent, selectors: [["app-live-execution-widget"]], inputs: { executions: "executions", maxVisible: "maxVisible" }, outputs: { executionClick: "executionClick" }, standalone: false, decls: 9, vars: 4, consts: [[1, "live-execution-widget"], [1, "widget-header"], [1, "widget-title"], [1, "fa-solid", "fa-bolt"], [1, "active-count"], [1, "execution-list"], [1, "no-executions"], [1, "execution-item", 3, "class"], [1, "show-more"], [1, "execution-item", 3, "click"], [1, "execution-icon"], [1, "execution-info"], [1, "execution-name"], [1, "execution-meta"], [1, "execution-type"], [1, "execution-duration"], [1, "execution-cost"], [1, "execution-status"], [1, "progress-ring"], [1, "status-indicator"], ["width", "24", "height", "24"], ["cx", "12", "cy", "12", "r", "10", "fill", "none", "stroke", "#e0e0e0", "stroke-width", "2"], ["cx", "12", "cy", "12", "r", "10", "fill", "none", "stroke", "#2196f3", "stroke-width", "2", "stroke-linecap", "round", 1, "progress-circle"], [1, "progress-text"], [1, "show-more-btn", 3, "click"], [1, "fa-solid", "fa-circle-check"]], template: function LiveExecutionWidgetComponent_Template(rf, ctx) { if (rf & 1) {
176
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LiveExecutionWidgetComponent, selectors: [["app-live-execution-widget"]], inputs: { executions: "executions", maxVisible: "maxVisible" }, outputs: { executionClick: "executionClick" }, standalone: false, decls: 9, vars: 4, consts: [[1, "live-execution-widget"], [1, "widget-header"], [1, "widget-title"], [1, "fa-solid", "fa-bolt"], [1, "active-count"], [1, "execution-list"], [1, "no-executions"], [1, "execution-item", 3, "class"], [1, "show-more"], [1, "execution-item", 3, "click"], [1, "execution-icon"], [1, "execution-info"], [1, "execution-name"], [1, "execution-meta"], [1, "execution-type"], [1, "execution-duration"], [1, "execution-cost"], [1, "execution-status"], [1, "progress-ring"], [1, "status-indicator"], ["width", "24", "height", "24"], ["cx", "12", "cy", "12", "r", "10", "fill", "none", "stroke", "var(--mj-border-default)", "stroke-width", "2"], ["cx", "12", "cy", "12", "r", "10", "fill", "none", "stroke", "var(--mj-brand-primary)", "stroke-width", "2", "stroke-linecap", "round", 1, "progress-circle"], [1, "progress-text"], [1, "show-more-btn", 3, "click"], [1, "fa-solid", "fa-circle-check"]], template: function LiveExecutionWidgetComponent_Template(rf, ctx) { if (rf & 1) {
177
177
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "h3", 2);
178
178
  i0.ɵɵelement(3, "i", 3);
179
179
  i0.ɵɵtext(4, " Live Executions ");
@@ -190,7 +190,7 @@ export class LiveExecutionWidgetComponent {
190
190
  i0.ɵɵtextInterpolate1(" ", ctx.getActiveCount(), " active ");
191
191
  i0.ɵɵadvance();
192
192
  i0.ɵɵconditional(ctx.executions.length > 0 ? 7 : 8);
193
- } }, styles: [".live-execution-widget[_ngcontent-%COMP%] {\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n height: 400px;\n display: flex;\n flex-direction: column;\n }\n\n .widget-header[_ngcontent-%COMP%] {\n padding: 20px 20px 16px;\n border-bottom: 1px solid #f0f0f0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .widget-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .widget-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #2196f3;\n }\n\n .active-count[_ngcontent-%COMP%] {\n background: #e3f2fd;\n color: #2196f3;\n padding: 4px 12px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n transition: all 0.3s ease;\n }\n\n .active-count.pulsing[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_pulse 2s infinite;\n }\n\n @keyframes _ngcontent-%COMP%_pulse {\n 0% { opacity: 1; }\n 50% { opacity: 0.7; }\n 100% { opacity: 1; }\n }\n\n .execution-list[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n }\n\n .execution-item[_ngcontent-%COMP%] {\n padding: 12px 20px;\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n transition: all 0.2s ease;\n border-left: 3px solid transparent;\n }\n\n .execution-item[_ngcontent-%COMP%]:hover {\n background: #f8f9fa;\n }\n\n .execution-item--running[_ngcontent-%COMP%] {\n border-left-color: #2196f3;\n background: rgba(33, 150, 243, 0.02);\n }\n\n .execution-item--completed[_ngcontent-%COMP%] {\n border-left-color: #4caf50;\n }\n\n .execution-item--failed[_ngcontent-%COMP%] {\n border-left-color: #f44336;\n background: rgba(244, 67, 54, 0.02);\n }\n\n .execution-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .execution-item--running[_ngcontent-%COMP%] .execution-icon[_ngcontent-%COMP%] {\n background: rgba(33, 150, 243, 0.1);\n color: #2196f3;\n }\n\n .execution-item--completed[_ngcontent-%COMP%] .execution-icon[_ngcontent-%COMP%] {\n background: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n }\n\n .execution-item--failed[_ngcontent-%COMP%] .execution-icon[_ngcontent-%COMP%] {\n background: rgba(244, 67, 54, 0.1);\n color: #f44336;\n }\n\n .execution-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n }\n\n .execution-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: #333;\n font-size: 14px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n }\n\n .execution-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 11px;\n color: #666;\n }\n\n .execution-type[_ngcontent-%COMP%] {\n background: #f0f0f0;\n padding: 2px 6px;\n border-radius: 3px;\n font-weight: 500;\n }\n\n .execution-duration[_ngcontent-%COMP%] {\n color: #999;\n }\n\n .execution-cost[_ngcontent-%COMP%] {\n color: #ff9800;\n font-weight: 500;\n }\n\n .execution-status[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n }\n\n .progress-ring[_ngcontent-%COMP%] {\n position: relative;\n width: 24px;\n height: 24px;\n }\n\n .progress-circle[_ngcontent-%COMP%] {\n transform: rotate(-90deg);\n transform-origin: center;\n transition: stroke-dashoffset 0.3s ease;\n }\n\n .progress-text[_ngcontent-%COMP%] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 8px;\n font-weight: 600;\n color: #2196f3;\n }\n\n .status-indicator[_ngcontent-%COMP%] {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n }\n\n .status-indicator--running[_ngcontent-%COMP%] {\n background: #2196f3;\n color: white;\n animation: _ngcontent-%COMP%_pulse 2s infinite;\n }\n\n .status-indicator--completed[_ngcontent-%COMP%] {\n background: #4caf50;\n color: white;\n }\n\n .status-indicator--failed[_ngcontent-%COMP%] {\n background: #f44336;\n color: white;\n }\n\n .show-more[_ngcontent-%COMP%] {\n padding: 12px 20px;\n border-top: 1px solid #f0f0f0;\n }\n\n .show-more-btn[_ngcontent-%COMP%] {\n width: 100%;\n background: none;\n border: none;\n color: #2196f3;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 8px;\n border-radius: 4px;\n transition: background 0.2s ease;\n }\n\n .show-more-btn[_ngcontent-%COMP%]:hover {\n background: rgba(33, 150, 243, 0.1);\n }\n\n .no-executions[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: #999;\n gap: 12px;\n }\n\n .no-executions[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n color: #ddd;\n }\n\n .no-executions[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n }\n\n \n\n .execution-list[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 4px;\n }\n\n .execution-list[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: #f1f1f1;\n }\n\n .execution-list[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: #ccc;\n border-radius: 2px;\n }\n\n .execution-list[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: #999;\n }\n\n @media (max-width: 768px) {\n .execution-item[_ngcontent-%COMP%] {\n padding: 10px 16px;\n }\n \n .execution-meta[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 4px;\n }\n }"] });
193
+ } }, styles: [".live-execution-widget[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n height: 400px;\n display: flex;\n flex-direction: column;\n }\n\n .widget-header[_ngcontent-%COMP%] {\n padding: 20px 20px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .widget-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .widget-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n\n .active-count[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n padding: 4px 12px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n transition: all 0.3s ease;\n }\n\n .active-count.pulsing[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_pulse 2s infinite;\n }\n\n @keyframes _ngcontent-%COMP%_pulse {\n 0% { opacity: 1; }\n 50% { opacity: 0.7; }\n 100% { opacity: 1; }\n }\n\n .execution-list[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n }\n\n .execution-item[_ngcontent-%COMP%] {\n padding: 12px 20px;\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n transition: all 0.2s ease;\n border-left: 3px solid transparent;\n }\n\n .execution-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n }\n\n .execution-item--running[_ngcontent-%COMP%] {\n border-left-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 2%, var(--mj-bg-surface));\n }\n\n .execution-item--completed[_ngcontent-%COMP%] {\n border-left-color: var(--mj-status-success);\n }\n\n .execution-item--failed[_ngcontent-%COMP%] {\n border-left-color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 2%, var(--mj-bg-surface));\n }\n\n .execution-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .execution-item--running[_ngcontent-%COMP%] .execution-icon[_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 .execution-item--completed[_ngcontent-%COMP%] .execution-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .execution-item--failed[_ngcontent-%COMP%] .execution-icon[_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 .execution-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n }\n\n .execution-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n font-size: 14px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n }\n\n .execution-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .execution-type[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n padding: 2px 6px;\n border-radius: 3px;\n font-weight: 500;\n }\n\n .execution-duration[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n }\n\n .execution-cost[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n font-weight: 500;\n }\n\n .execution-status[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n }\n\n .progress-ring[_ngcontent-%COMP%] {\n position: relative;\n width: 24px;\n height: 24px;\n }\n\n .progress-circle[_ngcontent-%COMP%] {\n transform: rotate(-90deg);\n transform-origin: center;\n transition: stroke-dashoffset 0.3s ease;\n }\n\n .progress-text[_ngcontent-%COMP%] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 8px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n }\n\n .status-indicator[_ngcontent-%COMP%] {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n }\n\n .status-indicator--running[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n animation: _ngcontent-%COMP%_pulse 2s infinite;\n }\n\n .status-indicator--completed[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n }\n\n .status-indicator--failed[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n }\n\n .show-more[_ngcontent-%COMP%] {\n padding: 12px 20px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .show-more-btn[_ngcontent-%COMP%] {\n width: 100%;\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 8px;\n border-radius: 4px;\n transition: background 0.2s ease;\n }\n\n .show-more-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .no-executions[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-disabled);\n gap: 12px;\n }\n\n .no-executions[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n color: var(--mj-border-default);\n }\n\n .no-executions[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n }\n\n @media (max-width: 768px) {\n .execution-item[_ngcontent-%COMP%] {\n padding: 10px 16px;\n }\n\n .execution-meta[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 4px;\n }\n }"] });
194
194
  }
195
195
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LiveExecutionWidgetComponent, [{
196
196
  type: Component,
@@ -240,7 +240,7 @@ export class LiveExecutionWidgetComponent {
240
240
  cy="12"
241
241
  r="10"
242
242
  fill="none"
243
- stroke="#e0e0e0"
243
+ stroke="var(--mj-border-default)"
244
244
  stroke-width="2"
245
245
  />
246
246
  <circle
@@ -248,7 +248,7 @@ export class LiveExecutionWidgetComponent {
248
248
  cy="12"
249
249
  r="10"
250
250
  fill="none"
251
- stroke="#2196f3"
251
+ stroke="var(--mj-brand-primary)"
252
252
  stroke-width="2"
253
253
  stroke-linecap="round"
254
254
  [style.stroke-dasharray]="circumference"
@@ -286,7 +286,7 @@ export class LiveExecutionWidgetComponent {
286
286
  </div>
287
287
  }
288
288
  </div>
289
- `, styles: ["\n .live-execution-widget {\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n height: 400px;\n display: flex;\n flex-direction: column;\n }\n\n .widget-header {\n padding: 20px 20px 16px;\n border-bottom: 1px solid #f0f0f0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .widget-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .widget-title i {\n color: #2196f3;\n }\n\n .active-count {\n background: #e3f2fd;\n color: #2196f3;\n padding: 4px 12px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n transition: all 0.3s ease;\n }\n\n .active-count.pulsing {\n animation: pulse 2s infinite;\n }\n\n @keyframes pulse {\n 0% { opacity: 1; }\n 50% { opacity: 0.7; }\n 100% { opacity: 1; }\n }\n\n .execution-list {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n }\n\n .execution-item {\n padding: 12px 20px;\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n transition: all 0.2s ease;\n border-left: 3px solid transparent;\n }\n\n .execution-item:hover {\n background: #f8f9fa;\n }\n\n .execution-item--running {\n border-left-color: #2196f3;\n background: rgba(33, 150, 243, 0.02);\n }\n\n .execution-item--completed {\n border-left-color: #4caf50;\n }\n\n .execution-item--failed {\n border-left-color: #f44336;\n background: rgba(244, 67, 54, 0.02);\n }\n\n .execution-icon {\n width: 32px;\n height: 32px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .execution-item--running .execution-icon {\n background: rgba(33, 150, 243, 0.1);\n color: #2196f3;\n }\n\n .execution-item--completed .execution-icon {\n background: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n }\n\n .execution-item--failed .execution-icon {\n background: rgba(244, 67, 54, 0.1);\n color: #f44336;\n }\n\n .execution-info {\n flex: 1;\n min-width: 0;\n }\n\n .execution-name {\n font-weight: 500;\n color: #333;\n font-size: 14px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n }\n\n .execution-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 11px;\n color: #666;\n }\n\n .execution-type {\n background: #f0f0f0;\n padding: 2px 6px;\n border-radius: 3px;\n font-weight: 500;\n }\n\n .execution-duration {\n color: #999;\n }\n\n .execution-cost {\n color: #ff9800;\n font-weight: 500;\n }\n\n .execution-status {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n }\n\n .progress-ring {\n position: relative;\n width: 24px;\n height: 24px;\n }\n\n .progress-circle {\n transform: rotate(-90deg);\n transform-origin: center;\n transition: stroke-dashoffset 0.3s ease;\n }\n\n .progress-text {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 8px;\n font-weight: 600;\n color: #2196f3;\n }\n\n .status-indicator {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n }\n\n .status-indicator--running {\n background: #2196f3;\n color: white;\n animation: pulse 2s infinite;\n }\n\n .status-indicator--completed {\n background: #4caf50;\n color: white;\n }\n\n .status-indicator--failed {\n background: #f44336;\n color: white;\n }\n\n .show-more {\n padding: 12px 20px;\n border-top: 1px solid #f0f0f0;\n }\n\n .show-more-btn {\n width: 100%;\n background: none;\n border: none;\n color: #2196f3;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 8px;\n border-radius: 4px;\n transition: background 0.2s ease;\n }\n\n .show-more-btn:hover {\n background: rgba(33, 150, 243, 0.1);\n }\n\n .no-executions {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: #999;\n gap: 12px;\n }\n\n .no-executions i {\n font-size: 32px;\n color: #ddd;\n }\n\n .no-executions p {\n margin: 0;\n font-size: 14px;\n }\n\n /* Custom scrollbar */\n .execution-list::-webkit-scrollbar {\n width: 4px;\n }\n\n .execution-list::-webkit-scrollbar-track {\n background: #f1f1f1;\n }\n\n .execution-list::-webkit-scrollbar-thumb {\n background: #ccc;\n border-radius: 2px;\n }\n\n .execution-list::-webkit-scrollbar-thumb:hover {\n background: #999;\n }\n\n @media (max-width: 768px) {\n .execution-item {\n padding: 10px 16px;\n }\n \n .execution-meta {\n flex-direction: column;\n align-items: flex-start;\n gap: 4px;\n }\n }\n "] }]
289
+ `, styles: ["\n .live-execution-widget {\n background: var(--mj-bg-surface);\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n height: 400px;\n display: flex;\n flex-direction: column;\n }\n\n .widget-header {\n padding: 20px 20px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .widget-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .widget-title i {\n color: var(--mj-brand-primary);\n }\n\n .active-count {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n padding: 4px 12px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n transition: all 0.3s ease;\n }\n\n .active-count.pulsing {\n animation: pulse 2s infinite;\n }\n\n @keyframes pulse {\n 0% { opacity: 1; }\n 50% { opacity: 0.7; }\n 100% { opacity: 1; }\n }\n\n .execution-list {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n }\n\n .execution-item {\n padding: 12px 20px;\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n transition: all 0.2s ease;\n border-left: 3px solid transparent;\n }\n\n .execution-item:hover {\n background: var(--mj-bg-surface-card);\n }\n\n .execution-item--running {\n border-left-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 2%, var(--mj-bg-surface));\n }\n\n .execution-item--completed {\n border-left-color: var(--mj-status-success);\n }\n\n .execution-item--failed {\n border-left-color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 2%, var(--mj-bg-surface));\n }\n\n .execution-icon {\n width: 32px;\n height: 32px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .execution-item--running .execution-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .execution-item--completed .execution-icon {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .execution-item--failed .execution-icon {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .execution-info {\n flex: 1;\n min-width: 0;\n }\n\n .execution-name {\n font-weight: 500;\n color: var(--mj-text-primary);\n font-size: 14px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n }\n\n .execution-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .execution-type {\n background: var(--mj-bg-surface-sunken);\n padding: 2px 6px;\n border-radius: 3px;\n font-weight: 500;\n }\n\n .execution-duration {\n color: var(--mj-text-disabled);\n }\n\n .execution-cost {\n color: var(--mj-status-warning);\n font-weight: 500;\n }\n\n .execution-status {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n }\n\n .progress-ring {\n position: relative;\n width: 24px;\n height: 24px;\n }\n\n .progress-circle {\n transform: rotate(-90deg);\n transform-origin: center;\n transition: stroke-dashoffset 0.3s ease;\n }\n\n .progress-text {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 8px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n }\n\n .status-indicator {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n }\n\n .status-indicator--running {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n animation: pulse 2s infinite;\n }\n\n .status-indicator--completed {\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n }\n\n .status-indicator--failed {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n }\n\n .show-more {\n padding: 12px 20px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .show-more-btn {\n width: 100%;\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 8px;\n border-radius: 4px;\n transition: background 0.2s ease;\n }\n\n .show-more-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .no-executions {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-disabled);\n gap: 12px;\n }\n\n .no-executions i {\n font-size: 32px;\n color: var(--mj-border-default);\n }\n\n .no-executions p {\n margin: 0;\n font-size: 14px;\n }\n\n @media (max-width: 768px) {\n .execution-item {\n padding: 10px 16px;\n }\n\n .execution-meta {\n flex-direction: column;\n align-items: flex-start;\n gap: 4px;\n }\n }\n "] }]
290
290
  }], null, { executions: [{
291
291
  type: Input
292
292
  }], maxVisible: [{
@@ -294,5 +294,5 @@ export class LiveExecutionWidgetComponent {
294
294
  }], executionClick: [{
295
295
  type: Output
296
296
  }] }); })();
297
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(LiveExecutionWidgetComponent, { className: "LiveExecutionWidgetComponent", filePath: "src/AI/components/widgets/live-execution-widget.component.ts", lineNumber: 383 }); })();
297
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(LiveExecutionWidgetComponent, { className: "LiveExecutionWidgetComponent", filePath: "src/AI/components/widgets/live-execution-widget.component.ts", lineNumber: 365 }); })();
298
298
  //# sourceMappingURL=live-execution-widget.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"live-execution-widget.component.js","sourceRoot":"","sources":["../../../../src/AI/components/widgets/live-execution-widget.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy } from '@angular/core';\nimport { LiveExecution } from '../../services/ai-instrumentation.service';\n\n@Component({\n standalone: false,\n selector: 'app-live-execution-widget',\n template: `\n <div class=\"live-execution-widget\">\n <div class=\"widget-header\">\n <h3 class=\"widget-title\">\n <i class=\"fa-solid fa-bolt\"></i>\n Live Executions\n </h3>\n <div class=\"active-count\" [class.pulsing]=\"hasActiveExecutions()\">\n {{ getActiveCount() }} active\n </div>\n </div>\n\n @if (executions.length > 0) {\n <div class=\"execution-list\">\n @for (execution of executions.slice(0, maxVisible); track execution.id) {\n <div \n class=\"execution-item\"\n [class]=\"'execution-item--' + execution.status\"\n (click)=\"onExecutionClick(execution)\"\n >\n <div class=\"execution-icon\">\n <i [class]=\"getExecutionIcon(execution)\"></i>\n </div>\n \n <div class=\"execution-info\">\n <div class=\"execution-name\">{{ execution.name }}</div>\n <div class=\"execution-meta\">\n <span class=\"execution-type\">{{ execution.type }}</span>\n <span class=\"execution-duration\">{{ formatDuration(execution.duration) }}</span>\n @if (execution.cost) {\n <span class=\"execution-cost\">\n {{ formatCurrency(execution.cost) }}\n </span>\n }\n </div>\n </div>\n\n <div class=\"execution-status\">\n @if (execution.status === 'running' && execution.progress) {\n <div class=\"progress-ring\">\n <svg width=\"24\" height=\"24\">\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n fill=\"none\"\n stroke=\"#e0e0e0\"\n stroke-width=\"2\"\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n fill=\"none\"\n stroke=\"#2196f3\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n [style.stroke-dasharray]=\"circumference\"\n [style.stroke-dashoffset]=\"getProgressOffset(execution.progress)\"\n class=\"progress-circle\"\n />\n </svg>\n <span class=\"progress-text\">{{ execution.progress.toFixed(0) }}%</span>\n </div>\n }\n \n <div class=\"status-indicator\" [class]=\"'status-indicator--' + execution.status\">\n <i [class]=\"getStatusIcon(execution.status)\"></i>\n </div>\n </div>\n </div>\n }\n\n @if (executions.length > maxVisible) {\n <div class=\"show-more\">\n <button \n class=\"show-more-btn\"\n (click)=\"toggleShowAll()\"\n >\n {{ showAll ? 'Show Less' : 'Show All (' + executions.length + ')' }}\n <i [class]=\"showAll ? 'fa-solid fa-chevron-up' : 'fa-solid fa-chevron-down'\"></i>\n </button>\n </div>\n }\n </div>\n } @else {\n <div class=\"no-executions\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <p>No recent executions</p>\n </div>\n }\n </div>\n `,\n styles: [`\n .live-execution-widget {\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n height: 400px;\n display: flex;\n flex-direction: column;\n }\n\n .widget-header {\n padding: 20px 20px 16px;\n border-bottom: 1px solid #f0f0f0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .widget-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .widget-title i {\n color: #2196f3;\n }\n\n .active-count {\n background: #e3f2fd;\n color: #2196f3;\n padding: 4px 12px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n transition: all 0.3s ease;\n }\n\n .active-count.pulsing {\n animation: pulse 2s infinite;\n }\n\n @keyframes pulse {\n 0% { opacity: 1; }\n 50% { opacity: 0.7; }\n 100% { opacity: 1; }\n }\n\n .execution-list {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n }\n\n .execution-item {\n padding: 12px 20px;\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n transition: all 0.2s ease;\n border-left: 3px solid transparent;\n }\n\n .execution-item:hover {\n background: #f8f9fa;\n }\n\n .execution-item--running {\n border-left-color: #2196f3;\n background: rgba(33, 150, 243, 0.02);\n }\n\n .execution-item--completed {\n border-left-color: #4caf50;\n }\n\n .execution-item--failed {\n border-left-color: #f44336;\n background: rgba(244, 67, 54, 0.02);\n }\n\n .execution-icon {\n width: 32px;\n height: 32px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .execution-item--running .execution-icon {\n background: rgba(33, 150, 243, 0.1);\n color: #2196f3;\n }\n\n .execution-item--completed .execution-icon {\n background: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n }\n\n .execution-item--failed .execution-icon {\n background: rgba(244, 67, 54, 0.1);\n color: #f44336;\n }\n\n .execution-info {\n flex: 1;\n min-width: 0;\n }\n\n .execution-name {\n font-weight: 500;\n color: #333;\n font-size: 14px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n }\n\n .execution-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 11px;\n color: #666;\n }\n\n .execution-type {\n background: #f0f0f0;\n padding: 2px 6px;\n border-radius: 3px;\n font-weight: 500;\n }\n\n .execution-duration {\n color: #999;\n }\n\n .execution-cost {\n color: #ff9800;\n font-weight: 500;\n }\n\n .execution-status {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n }\n\n .progress-ring {\n position: relative;\n width: 24px;\n height: 24px;\n }\n\n .progress-circle {\n transform: rotate(-90deg);\n transform-origin: center;\n transition: stroke-dashoffset 0.3s ease;\n }\n\n .progress-text {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 8px;\n font-weight: 600;\n color: #2196f3;\n }\n\n .status-indicator {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n }\n\n .status-indicator--running {\n background: #2196f3;\n color: white;\n animation: pulse 2s infinite;\n }\n\n .status-indicator--completed {\n background: #4caf50;\n color: white;\n }\n\n .status-indicator--failed {\n background: #f44336;\n color: white;\n }\n\n .show-more {\n padding: 12px 20px;\n border-top: 1px solid #f0f0f0;\n }\n\n .show-more-btn {\n width: 100%;\n background: none;\n border: none;\n color: #2196f3;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 8px;\n border-radius: 4px;\n transition: background 0.2s ease;\n }\n\n .show-more-btn:hover {\n background: rgba(33, 150, 243, 0.1);\n }\n\n .no-executions {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: #999;\n gap: 12px;\n }\n\n .no-executions i {\n font-size: 32px;\n color: #ddd;\n }\n\n .no-executions p {\n margin: 0;\n font-size: 14px;\n }\n\n /* Custom scrollbar */\n .execution-list::-webkit-scrollbar {\n width: 4px;\n }\n\n .execution-list::-webkit-scrollbar-track {\n background: #f1f1f1;\n }\n\n .execution-list::-webkit-scrollbar-thumb {\n background: #ccc;\n border-radius: 2px;\n }\n\n .execution-list::-webkit-scrollbar-thumb:hover {\n background: #999;\n }\n\n @media (max-width: 768px) {\n .execution-item {\n padding: 10px 16px;\n }\n \n .execution-meta {\n flex-direction: column;\n align-items: flex-start;\n gap: 4px;\n }\n }\n `]\n})\nexport class LiveExecutionWidgetComponent implements OnInit, OnDestroy {\n @Input() executions: LiveExecution[] = [];\n @Input() maxVisible = 8;\n @Output() executionClick = new EventEmitter<LiveExecution>();\n\n showAll = false;\n circumference = 2 * Math.PI * 10; // r=10\n\n ngOnInit() {}\n\n ngOnDestroy() {}\n\n trackByExecutionId(index: number, execution: LiveExecution): string {\n return execution.id;\n }\n\n hasActiveExecutions(): boolean {\n return this.executions.some(e => e.status === 'running');\n }\n\n getActiveCount(): number {\n return this.executions.filter(e => e.status === 'running').length;\n }\n\n getExecutionIcon(execution: LiveExecution): string {\n if (execution.type === 'agent') {\n return 'fa-solid fa-robot';\n } else {\n return 'fa-solid fa-comment-dots';\n }\n }\n\n getStatusIcon(status: string): string {\n switch (status) {\n case 'running':\n return 'fa-solid fa-play';\n case 'completed':\n return 'fa-solid fa-check';\n case 'failed':\n return 'fa-solid fa-times';\n default:\n return 'fa-solid fa-question';\n }\n }\n\n formatDuration(duration?: number): string {\n if (!duration) return '0s';\n \n const seconds = Math.floor(duration / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m`;\n } else if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n } else {\n return `${seconds}s`;\n }\n }\n\n getProgressOffset(progress: number): number {\n return this.circumference - (progress / 100) * this.circumference;\n }\n\n toggleShowAll(): void {\n this.showAll = !this.showAll;\n this.maxVisible = this.showAll ? this.executions.length : 8;\n }\n\n onExecutionClick(execution: LiveExecution): void {\n this.executionClick.emit(execution);\n }\n\n formatCurrency(amount: number): string {\n return `$${amount.toFixed(4)}`;\n }\n}"]}
1
+ {"version":3,"file":"live-execution-widget.component.js","sourceRoot":"","sources":["../../../../src/AI/components/widgets/live-execution-widget.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy } from '@angular/core';\nimport { LiveExecution } from '../../services/ai-instrumentation.service';\n\n@Component({\n standalone: false,\n selector: 'app-live-execution-widget',\n template: `\n <div class=\"live-execution-widget\">\n <div class=\"widget-header\">\n <h3 class=\"widget-title\">\n <i class=\"fa-solid fa-bolt\"></i>\n Live Executions\n </h3>\n <div class=\"active-count\" [class.pulsing]=\"hasActiveExecutions()\">\n {{ getActiveCount() }} active\n </div>\n </div>\n\n @if (executions.length > 0) {\n <div class=\"execution-list\">\n @for (execution of executions.slice(0, maxVisible); track execution.id) {\n <div \n class=\"execution-item\"\n [class]=\"'execution-item--' + execution.status\"\n (click)=\"onExecutionClick(execution)\"\n >\n <div class=\"execution-icon\">\n <i [class]=\"getExecutionIcon(execution)\"></i>\n </div>\n \n <div class=\"execution-info\">\n <div class=\"execution-name\">{{ execution.name }}</div>\n <div class=\"execution-meta\">\n <span class=\"execution-type\">{{ execution.type }}</span>\n <span class=\"execution-duration\">{{ formatDuration(execution.duration) }}</span>\n @if (execution.cost) {\n <span class=\"execution-cost\">\n {{ formatCurrency(execution.cost) }}\n </span>\n }\n </div>\n </div>\n\n <div class=\"execution-status\">\n @if (execution.status === 'running' && execution.progress) {\n <div class=\"progress-ring\">\n <svg width=\"24\" height=\"24\">\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n fill=\"none\"\n stroke=\"var(--mj-border-default)\"\n stroke-width=\"2\"\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n fill=\"none\"\n stroke=\"var(--mj-brand-primary)\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n [style.stroke-dasharray]=\"circumference\"\n [style.stroke-dashoffset]=\"getProgressOffset(execution.progress)\"\n class=\"progress-circle\"\n />\n </svg>\n <span class=\"progress-text\">{{ execution.progress.toFixed(0) }}%</span>\n </div>\n }\n \n <div class=\"status-indicator\" [class]=\"'status-indicator--' + execution.status\">\n <i [class]=\"getStatusIcon(execution.status)\"></i>\n </div>\n </div>\n </div>\n }\n\n @if (executions.length > maxVisible) {\n <div class=\"show-more\">\n <button \n class=\"show-more-btn\"\n (click)=\"toggleShowAll()\"\n >\n {{ showAll ? 'Show Less' : 'Show All (' + executions.length + ')' }}\n <i [class]=\"showAll ? 'fa-solid fa-chevron-up' : 'fa-solid fa-chevron-down'\"></i>\n </button>\n </div>\n }\n </div>\n } @else {\n <div class=\"no-executions\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <p>No recent executions</p>\n </div>\n }\n </div>\n `,\n styles: [`\n .live-execution-widget {\n background: var(--mj-bg-surface);\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n height: 400px;\n display: flex;\n flex-direction: column;\n }\n\n .widget-header {\n padding: 20px 20px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .widget-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .widget-title i {\n color: var(--mj-brand-primary);\n }\n\n .active-count {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n padding: 4px 12px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n transition: all 0.3s ease;\n }\n\n .active-count.pulsing {\n animation: pulse 2s infinite;\n }\n\n @keyframes pulse {\n 0% { opacity: 1; }\n 50% { opacity: 0.7; }\n 100% { opacity: 1; }\n }\n\n .execution-list {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n }\n\n .execution-item {\n padding: 12px 20px;\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n transition: all 0.2s ease;\n border-left: 3px solid transparent;\n }\n\n .execution-item:hover {\n background: var(--mj-bg-surface-card);\n }\n\n .execution-item--running {\n border-left-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 2%, var(--mj-bg-surface));\n }\n\n .execution-item--completed {\n border-left-color: var(--mj-status-success);\n }\n\n .execution-item--failed {\n border-left-color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 2%, var(--mj-bg-surface));\n }\n\n .execution-icon {\n width: 32px;\n height: 32px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .execution-item--running .execution-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .execution-item--completed .execution-icon {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .execution-item--failed .execution-icon {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .execution-info {\n flex: 1;\n min-width: 0;\n }\n\n .execution-name {\n font-weight: 500;\n color: var(--mj-text-primary);\n font-size: 14px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n }\n\n .execution-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .execution-type {\n background: var(--mj-bg-surface-sunken);\n padding: 2px 6px;\n border-radius: 3px;\n font-weight: 500;\n }\n\n .execution-duration {\n color: var(--mj-text-disabled);\n }\n\n .execution-cost {\n color: var(--mj-status-warning);\n font-weight: 500;\n }\n\n .execution-status {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n }\n\n .progress-ring {\n position: relative;\n width: 24px;\n height: 24px;\n }\n\n .progress-circle {\n transform: rotate(-90deg);\n transform-origin: center;\n transition: stroke-dashoffset 0.3s ease;\n }\n\n .progress-text {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 8px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n }\n\n .status-indicator {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n }\n\n .status-indicator--running {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n animation: pulse 2s infinite;\n }\n\n .status-indicator--completed {\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n }\n\n .status-indicator--failed {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n }\n\n .show-more {\n padding: 12px 20px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .show-more-btn {\n width: 100%;\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 8px;\n border-radius: 4px;\n transition: background 0.2s ease;\n }\n\n .show-more-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .no-executions {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-disabled);\n gap: 12px;\n }\n\n .no-executions i {\n font-size: 32px;\n color: var(--mj-border-default);\n }\n\n .no-executions p {\n margin: 0;\n font-size: 14px;\n }\n\n @media (max-width: 768px) {\n .execution-item {\n padding: 10px 16px;\n }\n\n .execution-meta {\n flex-direction: column;\n align-items: flex-start;\n gap: 4px;\n }\n }\n `]\n})\nexport class LiveExecutionWidgetComponent implements OnInit, OnDestroy {\n @Input() executions: LiveExecution[] = [];\n @Input() maxVisible = 8;\n @Output() executionClick = new EventEmitter<LiveExecution>();\n\n showAll = false;\n circumference = 2 * Math.PI * 10; // r=10\n\n ngOnInit() {}\n\n ngOnDestroy() {}\n\n trackByExecutionId(index: number, execution: LiveExecution): string {\n return execution.id;\n }\n\n hasActiveExecutions(): boolean {\n return this.executions.some(e => e.status === 'running');\n }\n\n getActiveCount(): number {\n return this.executions.filter(e => e.status === 'running').length;\n }\n\n getExecutionIcon(execution: LiveExecution): string {\n if (execution.type === 'agent') {\n return 'fa-solid fa-robot';\n } else {\n return 'fa-solid fa-comment-dots';\n }\n }\n\n getStatusIcon(status: string): string {\n switch (status) {\n case 'running':\n return 'fa-solid fa-play';\n case 'completed':\n return 'fa-solid fa-check';\n case 'failed':\n return 'fa-solid fa-times';\n default:\n return 'fa-solid fa-question';\n }\n }\n\n formatDuration(duration?: number): string {\n if (!duration) return '0s';\n \n const seconds = Math.floor(duration / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m`;\n } else if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n } else {\n return `${seconds}s`;\n }\n }\n\n getProgressOffset(progress: number): number {\n return this.circumference - (progress / 100) * this.circumference;\n }\n\n toggleShowAll(): void {\n this.showAll = !this.showAll;\n this.maxVisible = this.showAll ? this.executions.length : 8;\n }\n\n onExecutionClick(execution: LiveExecution): void {\n this.executionClick.emit(execution);\n }\n\n formatCurrency(amount: number): string {\n return `$${amount.toFixed(4)}`;\n }\n}"]}
@@ -8,4 +8,5 @@ export * from './components/widgets/kpi-card.component';
8
8
  export * from './components/widgets/live-execution-widget.component';
9
9
  export * from './components/charts/time-series-chart.component';
10
10
  export * from './components/charts/performance-heatmap.component';
11
+ export * from './components/requests/agent-requests-resource.component';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/AI/index.ts"],"names":[],"mappings":"AACA,cAAc,uCAAuC,CAAC;AAGtD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,kDAAkD,CAAC;AACjE,cAAc,mDAAmD,CAAC;AAClE,cAAc,gDAAgD,CAAC;AAC/D,cAAc,oDAAoD,CAAC;AAGnE,cAAc,yCAAyC,CAAC;AACxD,cAAc,sDAAsD,CAAC;AACrE,cAAc,iDAAiD,CAAC;AAChE,cAAc,mDAAmD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/AI/index.ts"],"names":[],"mappings":"AACA,cAAc,uCAAuC,CAAC;AAGtD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,kDAAkD,CAAC;AACjE,cAAc,mDAAmD,CAAC;AAClE,cAAc,gDAAgD,CAAC;AAC/D,cAAc,oDAAoD,CAAC;AAGnE,cAAc,yCAAyC,CAAC;AACxD,cAAc,sDAAsD,CAAC;AACrE,cAAc,iDAAiD,CAAC;AAChE,cAAc,mDAAmD,CAAC;AAGlE,cAAc,yDAAyD,CAAC"}
package/dist/AI/index.js CHANGED
@@ -11,4 +11,6 @@ export * from './components/widgets/kpi-card.component';
11
11
  export * from './components/widgets/live-execution-widget.component';
12
12
  export * from './components/charts/time-series-chart.component';
13
13
  export * from './components/charts/performance-heatmap.component';
14
+ // Agent Requests
15
+ export * from './components/requests/agent-requests-resource.component';
14
16
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/AI/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,cAAc,uCAAuC,CAAC;AAEtD,kBAAkB;AAClB,cAAc,6CAA6C,CAAC;AAC5D,cAAc,kDAAkD,CAAC;AACjE,cAAc,mDAAmD,CAAC;AAClE,cAAc,gDAAgD,CAAC;AAC/D,cAAc,oDAAoD,CAAC;AAEnE,oBAAoB;AACpB,cAAc,yCAAyC,CAAC;AACxD,cAAc,sDAAsD,CAAC;AACrE,cAAc,iDAAiD,CAAC;AAChE,cAAc,mDAAmD,CAAC","sourcesContent":["// Services\nexport * from './services/ai-instrumentation.service';\n\n// Main Components\nexport * from './components/execution-monitoring.component';\nexport * from './components/prompts/prompt-management.component';\nexport * from './components/agents/agent-configuration.component';\nexport * from './components/models/model-management.component';\nexport * from './components/system/system-configuration.component';\n\n// Widget Components\nexport * from './components/widgets/kpi-card.component';\nexport * from './components/widgets/live-execution-widget.component';\nexport * from './components/charts/time-series-chart.component';\nexport * from './components/charts/performance-heatmap.component';"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/AI/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,cAAc,uCAAuC,CAAC;AAEtD,kBAAkB;AAClB,cAAc,6CAA6C,CAAC;AAC5D,cAAc,kDAAkD,CAAC;AACjE,cAAc,mDAAmD,CAAC;AAClE,cAAc,gDAAgD,CAAC;AAC/D,cAAc,oDAAoD,CAAC;AAEnE,oBAAoB;AACpB,cAAc,yCAAyC,CAAC;AACxD,cAAc,sDAAsD,CAAC;AACrE,cAAc,iDAAiD,CAAC;AAChE,cAAc,mDAAmD,CAAC;AAElE,iBAAiB;AACjB,cAAc,yDAAyD,CAAC","sourcesContent":["// Services\nexport * from './services/ai-instrumentation.service';\n\n// Main Components\nexport * from './components/execution-monitoring.component';\nexport * from './components/prompts/prompt-management.component';\nexport * from './components/agents/agent-configuration.component';\nexport * from './components/models/model-management.component';\nexport * from './components/system/system-configuration.component';\n\n// Widget Components\nexport * from './components/widgets/kpi-card.component';\nexport * from './components/widgets/live-execution-widget.component';\nexport * from './components/charts/time-series-chart.component';\nexport * from './components/charts/performance-heatmap.component';\n\n// Agent Requests\nexport * from './components/requests/agent-requests-resource.component';"]}