@memberjunction/ng-dashboards 5.30.0 → 5.31.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.
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +4 -4
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts +2 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +8 -6
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +2 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +6 -5
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +2 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +6 -5
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +2 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +6 -5
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts +2 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +7 -4
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +3 -2
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.js +10 -6
- package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +2 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +6 -5
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +2 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +6 -5
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +55 -52
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +15 -15
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +4 -3
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +2 -2
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +2 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +10 -8
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +2 -2
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts +2 -1
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js +13 -10
- package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +1181 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -0
- package/dist/AI/components/tags/tags-resource.component.js +7487 -0
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +25 -21
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/AI/index.d.ts +1 -0
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +5 -0
- package/dist/AI/index.js.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js +12 -4
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.d.ts +3 -2
- package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +5 -4
- package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.d.ts +2 -1
- package/dist/APIKeys/api-key-create-dialog.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.js +5 -5
- package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.d.ts +3 -2
- package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js +11 -10
- package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-list.component.d.ts +2 -1
- package/dist/APIKeys/api-key-list.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-list.component.js +6 -5
- package/dist/APIKeys/api-key-list.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +4 -4
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.d.ts +3 -2
- package/dist/APIKeys/api-scopes-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.js +8 -6
- package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
- package/dist/APIKeys/api-usage-panel.component.d.ts +3 -2
- package/dist/APIKeys/api-usage-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-usage-panel.component.js +10 -8
- package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
- package/dist/Actions/components/actions-list-view.component.d.ts +2 -1
- package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-list-view.component.js +6 -5
- package/dist/Actions/components/actions-list-view.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +2 -2
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.d.ts +2 -1
- package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +6 -5
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +1 -1
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.d.ts +2 -1
- package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.js +6 -4
- package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-action-panel.component.d.ts +2 -1
- package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/new-action-panel.component.js +7 -5
- package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.d.ts +2 -1
- package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.js +7 -5
- package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +4 -4
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +1 -1
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +1 -1
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +3 -3
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +1 -1
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +3 -3
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +5 -4
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +2 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +6 -4
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +11 -2
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +61 -27
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +4 -2
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +19 -11
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts +4 -2
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +11 -3
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +10 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.js +18 -9
- package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts +11 -1
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -1
- package/dist/ComponentStudio/services/component-studio-state.service.js +23 -3
- package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
- package/dist/ComponentStudio/services/component-version.service.d.ts +6 -1
- package/dist/ComponentStudio/services/component-version.service.d.ts.map +1 -1
- package/dist/ComponentStudio/services/component-version.service.js +16 -6
- package/dist/ComponentStudio/services/component-version.service.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.js +1 -1
- package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +13 -13
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-adapter.d.ts +4 -0
- package/dist/DashboardBrowser/dashboard-share-adapter.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-adapter.js +5 -2
- package/dist/DashboardBrowser/dashboard-share-adapter.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +3 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js +9 -4
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +3 -2
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +7 -6
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +3 -2
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +6 -5
- package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +10 -9
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.d.ts +6 -1
- package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.js +15 -5
- package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
- package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.d.ts +64 -0
- package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.js +400 -0
- package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.d.ts +42 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.js +232 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.d.ts +14 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.js +38 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.d.ts +24 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.js +77 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.d.ts +88 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.js +404 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.d.ts +12 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.js +116 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +55 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +204 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts +61 -0
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/entity-list.component.js +485 -0
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/modify/database-modify.component.d.ts +52 -0
- package/dist/DatabaseDesigner/components/modify/database-modify.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/modify/database-modify.component.js +320 -0
- package/dist/DatabaseDesigner/components/modify/database-modify.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.d.ts +79 -0
- package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.js +378 -0
- package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.d.ts +85 -0
- package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.js +429 -0
- package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.d.ts +58 -0
- package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.js +333 -0
- package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.d.ts +36 -0
- package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.js +345 -0
- package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.d.ts +13 -0
- package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.js +81 -0
- package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.js.map +1 -0
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +30 -0
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -0
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +131 -0
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -0
- package/dist/DatabaseDesigner/database-designer-erd.d.ts +19 -0
- package/dist/DatabaseDesigner/database-designer-erd.d.ts.map +1 -0
- package/dist/DatabaseDesigner/database-designer-erd.js +84 -0
- package/dist/DatabaseDesigner/database-designer-erd.js.map +1 -0
- package/dist/DatabaseDesigner/database-designer.types.d.ts +167 -0
- package/dist/DatabaseDesigner/database-designer.types.d.ts.map +1 -0
- package/dist/DatabaseDesigner/database-designer.types.js +26 -0
- package/dist/DatabaseDesigner/database-designer.types.js.map +1 -0
- package/dist/DatabaseDesigner/services/database-designer.engine.d.ts +94 -0
- package/dist/DatabaseDesigner/services/database-designer.engine.d.ts.map +1 -0
- package/dist/DatabaseDesigner/services/database-designer.engine.js +392 -0
- package/dist/DatabaseDesigner/services/database-designer.engine.js.map +1 -0
- package/dist/DatabaseDesigner/services/database-designer.service.d.ts +78 -0
- package/dist/DatabaseDesigner/services/database-designer.service.d.ts.map +1 -0
- package/dist/DatabaseDesigner/services/database-designer.service.js +273 -0
- package/dist/DatabaseDesigner/services/database-designer.service.js.map +1 -0
- package/dist/DatabaseDesigner/services/entity-wizard-state.service.d.ts +79 -0
- package/dist/DatabaseDesigner/services/entity-wizard-state.service.d.ts.map +1 -0
- package/dist/DatabaseDesigner/services/entity-wizard-state.service.js +204 -0
- package/dist/DatabaseDesigner/services/entity-wizard-state.service.js.map +1 -0
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +2 -2
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/action-pin-config-dialog.component.d.ts +2 -1
- package/dist/Home/action-pin-config-dialog.component.d.ts.map +1 -1
- package/dist/Home/action-pin-config-dialog.component.js +6 -4
- package/dist/Home/action-pin-config-dialog.component.js.map +1 -1
- package/dist/Home/action-pin-runner-dialog.component.d.ts +2 -1
- package/dist/Home/action-pin-runner-dialog.component.d.ts.map +1 -1
- package/dist/Home/action-pin-runner-dialog.component.js +5 -4
- package/dist/Home/action-pin-runner-dialog.component.js.map +1 -1
- package/dist/Home/home-application.d.ts.map +1 -1
- package/dist/Home/home-application.js +10 -12
- package/dist/Home/home-application.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +3 -3
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +1 -0
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +11 -10
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +2 -2
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +1 -0
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +1 -0
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +5 -4
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/services/integration-data.service.d.ts +5 -1
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +27 -19
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +6 -6
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +8 -6
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +6 -6
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +3 -3
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +6 -6
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +4 -4
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +6 -6
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +11 -10
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/services/list-set-operations.service.d.ts +5 -0
- package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
- package/dist/Lists/services/list-set-operations.service.js +11 -3
- package/dist/Lists/services/list-set-operations.service.js.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.d.ts +2 -1
- package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js +8 -6
- package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.d.ts +2 -1
- package/dist/MCP/components/mcp-server-dialog.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +7 -5
- package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +12 -12
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/Permissions/permissions-shared.d.ts +3 -3
- package/dist/Permissions/permissions-shared.d.ts.map +1 -1
- package/dist/Permissions/permissions-shared.js +5 -5
- package/dist/Permissions/permissions-shared.js.map +1 -1
- package/dist/Permissions/resource-access-resource.component.js +1 -1
- package/dist/Permissions/resource-access-resource.component.js.map +1 -1
- package/dist/Permissions/user-access-resource.component.js +1 -2
- package/dist/Permissions/user-access-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +1 -0
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +5 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.js +21 -13
- package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +2 -2
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +2 -1
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +9 -7
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/services/testing-instrumentation.service.d.ts +6 -1
- package/dist/Testing/services/testing-instrumentation.service.d.ts.map +1 -1
- package/dist/Testing/services/testing-instrumentation.service.js +21 -11
- package/dist/Testing/services/testing-instrumentation.service.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +3 -1
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +15 -11
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +5 -5
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +1 -2
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +3 -3
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +35 -34
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +6 -0
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/module.d.ts +13 -12
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +7 -0
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +3 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -1
- package/dist/public-api.js.map +1 -1
- package/dist/shared/entity-field-display.d.ts +4 -3
- package/dist/shared/entity-field-display.d.ts.map +1 -1
- package/dist/shared/entity-field-display.js +9 -9
- package/dist/shared/entity-field-display.js.map +1 -1
- package/package.json +52 -51
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-editor.component.js","sourceRoot":"","sources":["../../../../src/AI/components/agents/agent-editor.component.ts","../../../../src/AI/components/agents/agent-editor.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, ViewChild, ElementRef, AfterViewInit } from '@angular/core';\nimport { RunView, Metadata, LogError, LogStatus } from '@memberjunction/core';\nimport { MJAIAgentEntityExtended } from '@memberjunction/ai-core-plus';\nimport { CreateAgentService, CreateAgentResult } from '@memberjunction/ng-agents';\nimport { NavigationService } from '@memberjunction/ng-shared';\nimport * as d3 from 'd3';\nimport { UUIDsEqual } from '@memberjunction/global';\n\ninterface AgentHierarchyNode {\n id: string;\n name: string;\n agent: MJAIAgentEntityExtended;\n children?: AgentHierarchyNode[];\n parent?: AgentHierarchyNode;\n x?: number;\n y?: number;\n}\n\ninterface AgentPrompt {\n id: string;\n name: string;\n content: string;\n type: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-agent-editor',\n templateUrl: './agent-editor.component.html',\n styleUrls: ['./agent-editor.component.css']\n})\nexport class AgentEditorComponent implements OnInit, OnDestroy, AfterViewInit {\n @Input() agentId: string | null = null;\n @Output() close = new EventEmitter<void>();\n @Output() openAgent = new EventEmitter<string>();\n @Output() openEntityRecord = new EventEmitter<{entityName: string, recordId: string}>();\n\n @ViewChild('hierarchyChart', { static: false }) hierarchyChartRef!: ElementRef;\n\n public isLoading = false;\n public error: string | null = null;\n public currentAgent: MJAIAgentEntityExtended | null = null;\n public allAgents: MJAIAgentEntityExtended[] = [];\n public hierarchyData: AgentHierarchyNode | null = null;\n public selectedNode: AgentHierarchyNode | null = null;\n public agentPrompts: AgentPrompt[] = [];\n\n // Tab settings\n public activeTab: 'hierarchy' | 'prompts' | 'properties' = 'hierarchy';\n \n // Legacy layout settings (keeping for compatibility)\n public showHierarchy = true;\n public showPrompts = true;\n public showProperties = true;\n \n // D3 variables\n private svg: any;\n private g: any;\n private tree: any;\n private root: any;\n private zoom: any;\n\n constructor(\n private navigationService: NavigationService,\n private createAgentService: CreateAgentService) {}\n\n ngOnInit(): void {\n if (this.agentId) {\n this.loadAgentData();\n }\n }\n\n ngAfterViewInit(): void {\n // Chart initialization now happens after data loading in loadAgentData()\n }\n\n ngOnDestroy(): void {\n // Cleanup D3\n if (this.svg) {\n this.svg.remove();\n }\n }\n\n public async loadAgentData(): Promise<void> {\n try {\n this.isLoading = true;\n this.error = null;\n\n // Load all agents to build hierarchy\n const rv = new RunView();\n const result = await rv.RunView({\n EntityName: 'MJ: AI Agents',\n ExtraFilter: '',\n OrderBy: 'Name',\n MaxRows: 1000\n });\n\n this.allAgents = result.Results as MJAIAgentEntityExtended[];\n this.currentAgent = this.allAgents.find(a => UUIDsEqual(a.ID, this.agentId)) || null;\n\n if (this.currentAgent) {\n this.buildHierarchy();\n this.loadAgentPrompts();\n \n // Initialize chart after data is loaded\n setTimeout(() => {\n if (this.hierarchyChartRef) {\n this.initializeChart();\n }\n }, 100);\n }\n } catch (error) {\n console.error('Error loading agent data:', error);\n this.error = 'Failed to load agent data';\n } finally {\n this.isLoading = false;\n }\n }\n\n private buildHierarchy(): void {\n if (!this.currentAgent) return;\n\n // Find the root of the hierarchy that contains our current agent\n const rootAgent = this.findRootAgent(this.currentAgent);\n \n this.hierarchyData = this.buildHierarchyTree(rootAgent);\n this.selectedNode = this.findNodeInHierarchy(this.hierarchyData, this.currentAgent.ID);\n }\n\n private findRootAgent(agent: MJAIAgentEntityExtended): MJAIAgentEntityExtended {\n let current = agent;\n while (current.ParentID) {\n const parent = this.allAgents.find(a => UUIDsEqual(a.ID, current.ParentID));\n if (!parent) break;\n current = parent;\n }\n return current;\n }\n\n private buildHierarchyTree(agent: MJAIAgentEntityExtended): AgentHierarchyNode {\n const children = this.allAgents\n .filter(a => UUIDsEqual(a.ParentID, agent.ID))\n .map(child => this.buildHierarchyTree(child));\n\n const node: AgentHierarchyNode = {\n id: agent.ID,\n name: agent.Name || 'Unnamed Agent',\n agent: agent,\n children: children\n };\n\n // Set parent references\n if (node.children) {\n node.children.forEach(child => child.parent = node);\n }\n\n return node;\n }\n\n private findNodeInHierarchy(node: AgentHierarchyNode, agentId: string): AgentHierarchyNode | null {\n if (node.id === agentId) return node;\n \n if (node.children) {\n for (const child of node.children) {\n const found = this.findNodeInHierarchy(child, agentId);\n if (found) return found;\n }\n }\n \n return null;\n }\n\n private async loadAgentPrompts(): Promise<void> {\n if (!this.currentAgent) return;\n \n try {\n // This would load prompts associated with the agent\n // For now, using mock data structure\n this.agentPrompts = [\n { id: '1', name: 'System Prompt', content: 'Default system instructions...', type: 'system' },\n { id: '2', name: 'User Prompt', content: 'User interaction template...', type: 'user' }\n ];\n } catch (error) {\n console.error('Error loading agent prompts:', error);\n }\n }\n\n private initializeChart(): void {\n if (!this.hierarchyChartRef?.nativeElement) {\n return;\n }\n\n const container = this.hierarchyChartRef.nativeElement;\n const width = container.clientWidth || 800;\n const height = container.clientHeight || 600;\n\n // Clear any existing SVG\n d3.select(container).selectAll('*').remove();\n\n // Create SVG with zoom/pan functionality\n this.svg = d3.select(container)\n .append('svg')\n .attr('width', width)\n .attr('height', height)\n .style('background', '#fafafa')\n .style('border', '1px solid #e0e0e0');\n\n // Create zoom behavior with wheel support\n this.zoom = d3.zoom()\n .scaleExtent([0.1, 3])\n .wheelDelta((event: any) => -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1))\n .on('zoom', (event) => {\n this.g.attr('transform', event.transform);\n });\n\n // Apply zoom to SVG\n this.svg.call(this.zoom);\n\n // Create main group for chart content\n this.g = this.svg.append('g');\n\n // Create tree layout with proper spacing - use nodeSize for fixed spacing\n this.tree = d3.tree()\n .nodeSize([150, 100]) // Fixed node spacing: 150px horizontal, 100px vertical\n .separation((a: any, b: any) => a.parent === b.parent ? 1 : 1.5);\n\n this.renderHierarchy();\n }\n\n private renderHierarchy(): void {\n if (!this.hierarchyData || !this.g || !this.tree) {\n return;\n }\n\n // Create hierarchy\n this.root = d3.hierarchy(this.hierarchyData);\n this.tree(this.root);\n\n // Clear previous render\n this.g.selectAll('*').remove();\n\n // Get container dimensions\n const container = this.hierarchyChartRef.nativeElement;\n const containerWidth = container.clientWidth || 800;\n \n // Calculate the tree bounds after layout\n const treeBounds = this.getTreeBounds(this.root);\n \n // Calculate centering offsets\n const offsetX = (containerWidth - treeBounds.width) / 2 - treeBounds.minX;\n const offsetY = 150; // Top margin for the tree\n \n // Apply transform to center the tree properly\n this.g.attr('transform', `translate(${offsetX}, ${offsetY})`);\n\n // Draw links\n this.g.selectAll('.link')\n .data(this.root.links())\n .enter().append('path')\n .attr('class', 'link')\n .attr('d', d3.linkVertical()\n .x((d: any) => d.x)\n .y((d: any) => d.y))\n .style('fill', 'none')\n .style('stroke', '#999')\n .style('stroke-width', '2px')\n .style('stroke-opacity', 0.6);\n\n // Draw nodes\n const nodes = this.g.selectAll('.node')\n .data(this.root.descendants())\n .enter().append('g')\n .attr('class', 'node')\n .attr('transform', (d: any) => `translate(${d.x}, ${d.y})`)\n .style('cursor', 'pointer')\n .on('click', (_event: any, d: any) => this.onNodeClick(d.data));\n\n // Add rectangles for nodes\n const nodeWidth = 120;\n const nodeHeight = 40;\n \n nodes.append('rect')\n .attr('x', -nodeWidth / 2)\n .attr('y', -nodeHeight / 2)\n .attr('width', nodeWidth)\n .attr('height', nodeHeight)\n .attr('rx', 6)\n .attr('ry', 6)\n .style('fill', (d: any) => this.getNodeColor(d))\n .style('stroke', (d: any) => this.getNodeStrokeColor(d))\n .style('stroke-width', (d: any) => d.data.id === this.currentAgent?.ID ? '3px' : '2px')\n .style('opacity', 0.9);\n\n // Add node labels (agent names)\n nodes.append('text')\n .attr('dy', -2)\n .attr('text-anchor', 'middle')\n .style('font-size', '11px')\n .style('font-weight', (d: any) => d.data.id === this.currentAgent?.ID ? 'bold' : '500')\n .style('fill', '#333')\n .style('pointer-events', 'none')\n .text((d: any) => {\n const name = d.data.name;\n return name.length > 14 ? name.substring(0, 11) + '...' : name;\n });\n\n // Add execution mode labels\n nodes.append('text')\n .attr('dy', 12)\n .attr('text-anchor', 'middle')\n .style('font-size', '9px')\n .style('fill', '#666')\n .style('pointer-events', 'none')\n .text((d: any) => d.data.agent.ExecutionMode);\n\n // Add level indicators\n nodes.append('text')\n .attr('x', nodeWidth / 2 - 8)\n .attr('y', -nodeHeight / 2 + 12)\n .attr('text-anchor', 'middle')\n .style('font-size', '8px')\n .style('font-weight', 'bold')\n .style('fill', '#fff')\n .style('pointer-events', 'none')\n .text((d: any) => `L${d.depth}`);\n }\n\n private getTreeBounds(root: any): { width: number, height: number, minX: number, maxX: number, minY: number, maxY: number } {\n let minX = Infinity, maxX = -Infinity;\n let minY = Infinity, maxY = -Infinity;\n \n root.descendants().forEach((d: any) => {\n minX = Math.min(minX, d.x);\n maxX = Math.max(maxX, d.x);\n minY = Math.min(minY, d.y);\n maxY = Math.max(maxY, d.y);\n });\n \n return {\n width: maxX - minX,\n height: maxY - minY,\n minX,\n maxX,\n minY,\n maxY\n };\n }\n\n private getNodeColor(d: any): string {\n const level = d.depth;\n const isCurrentAgent = d.data.id === this.currentAgent?.ID;\n \n // Level-based color scheme\n const levelColors = [\n '#1976d2', // Level 0 (root) - Blue\n '#388e3c', // Level 1 - Green \n '#f57c00', // Level 2 - Orange\n '#7b1fa2', // Level 3 - Purple\n '#c2185b', // Level 4 - Pink\n '#5d4037' // Level 5+ - Brown\n ];\n \n const baseColor = levelColors[Math.min(level, levelColors.length - 1)];\n \n // Highlight current agent with brighter color\n if (isCurrentAgent) {\n return baseColor;\n }\n \n // Make non-current agents slightly lighter\n return this.lightenColor(baseColor, 0.3);\n }\n\n private getNodeStrokeColor(d: any): string {\n const isCurrentAgent = d.data.id === this.currentAgent?.ID;\n if (isCurrentAgent) {\n return '#000';\n }\n return '#666';\n }\n\n private lightenColor(color: string, factor: number): string {\n // Simple color lightening function\n const hex = color.replace('#', '');\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n \n const newR = Math.min(255, Math.floor(r + (255 - r) * factor));\n const newG = Math.min(255, Math.floor(g + (255 - g) * factor));\n const newB = Math.min(255, Math.floor(b + (255 - b) * factor));\n \n return `rgb(${newR}, ${newG}, ${newB})`;\n }\n\n public onNodeClick(node: AgentHierarchyNode): void {\n if (node.id !== this.currentAgent?.ID) {\n this.openAgent.emit(node.id);\n }\n }\n\n public zoomIn(): void {\n if (this.svg && this.zoom) {\n this.svg.transition().call(\n this.zoom.scaleBy, 1.5\n );\n }\n }\n\n public zoomOut(): void {\n if (this.svg && this.zoom) {\n this.svg.transition().call(\n this.zoom.scaleBy, 1 / 1.5\n );\n }\n }\n\n public resetZoom(): void {\n if (this.svg && this.zoom) {\n // Reset to initial centered position\n this.svg.transition().call(\n this.zoom.transform,\n d3.zoomIdentity\n );\n }\n }\n\n public navigateToAgent(agentId: string): void {\n this.openAgent.emit(agentId);\n }\n\n public closeEditor(): void {\n this.close.emit();\n }\n\n public setActiveTab(tab: 'hierarchy' | 'prompts' | 'properties'): void {\n this.activeTab = tab;\n }\n\n public getExecutionModeColor(mode: string): string {\n return mode === 'Sequential' ? '#2196f3' : '#4caf50';\n }\n\n public getExecutionModeIcon(mode: string): string {\n return mode === 'Sequential' ? 'fa-solid fa-list-ol' : 'fa-solid fa-layer-group';\n }\n\n /**\n * Opens the create sub-agent slide-in panel using the new CreateAgentService.\n * After successful creation, saves the agent and navigates to it.\n */\n public openCreateSubAgent(): void {\n if (!this.currentAgent) return;\n\n this.error = null;\n\n this.createAgentService.OpenSubAgentSlideIn(\n this.currentAgent.ID,\n this.currentAgent.Name || 'Agent'\n ).subscribe({\n next: async (dialogResult) => {\n if (!dialogResult.Cancelled && dialogResult.Result) {\n await this.handleAgentCreated(dialogResult.Result);\n }\n },\n error: (err) => {\n console.error('Error in create sub-agent slide-in:', err);\n this.error = 'Failed to open create sub-agent panel';\n }\n });\n }\n\n /**\n * Handles the result from the create agent slide-in.\n * Saves the agent and navigates to the new record.\n */\n private async handleAgentCreated(result: CreateAgentResult): Promise<void> {\n try {\n this.isLoading = true;\n this.error = null;\n\n const agent = result.Agent;\n\n // Create the agent and all of its linked prompts/actions in one atomic transaction.\n // agent.ID is assigned client-side by NewRecord() so we can use it on child records before submit.\n const md = new Metadata();\n const tg = await md.CreateTransactionGroup();\n\n agent.TransactionGroup = tg;\n await agent.Save();\n\n if (result.AgentPrompts && result.AgentPrompts.length > 0) {\n for (const agentPrompt of result.AgentPrompts) {\n agentPrompt.AgentID = agent.ID;\n agentPrompt.TransactionGroup = tg;\n await agentPrompt.Save();\n }\n }\n\n if (result.AgentActions && result.AgentActions.length > 0) {\n for (const agentAction of result.AgentActions) {\n agentAction.AgentID = agent.ID;\n agentAction.TransactionGroup = tg;\n await agentAction.Save();\n }\n }\n\n if (await tg.Submit()) {\n LogStatus('Sub-agent created successfully');\n\n // Reload agent data to show the new hierarchy\n await this.loadAgentData();\n\n // Navigate to the newly created agent record\n this.navigationService.OpenEntityRecord('MJ: AI Agents', agent.PrimaryKey);\n } else {\n const errorMessage = agent.LatestResult?.Message || 'Unknown error occurred while creating sub-agent';\n this.error = `Failed to create sub-agent: ${errorMessage}`;\n LogError('Sub-agent creation failed', undefined, errorMessage);\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'An unexpected error occurred';\n this.error = `Failed to create sub-agent: ${errorMessage}`;\n LogError('Error creating sub-agent', undefined, error);\n } finally {\n this.isLoading = false;\n }\n }\n\n public hasChildren(): boolean {\n return this.selectedNode?.children && this.selectedNode.children.length > 0 || false;\n }\n\n public hasParent(): boolean {\n return this.selectedNode?.parent !== undefined;\n }\n\n public getChildCount(): number {\n return this.selectedNode?.children?.length || 0;\n }\n\n public openCurrentAgentRecord(): void {\n if (this.currentAgent) {\n this.openEntityRecord.emit({ entityName: 'MJ: AI Agents', recordId: this.currentAgent.ID });\n }\n }\n}","<div class=\"agent-editor-container\">\n <!-- Header -->\n <div class=\"editor-header\">\n <div class=\"header-info\">\n <div class=\"header-actions\">\n <button \n type=\"button\" \n class=\"back-btn\"\n (click)=\"closeEditor()\"\n title=\"Back to Agent List\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n Back to Agents\n </button>\n \n @if (currentAgent) {\n <button \n type=\"button\" \n class=\"open-btn\"\n (click)=\"openCurrentAgentRecord()\"\n title=\"Open Agent Record\">\n <i class=\"fa-solid fa-external-link\"></i>\n Open Record\n </button>\n }\n </div>\n \n @if (currentAgent) {\n <div class=\"agent-breadcrumb\">\n <h2>{{ currentAgent.Name }}</h2>\n @if (currentAgent.Parent) {\n <span class=\"breadcrumb-item\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n Child of {{ currentAgent.Parent }}\n </span>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Tab Navigation -->\n @if (!isLoading && !error && currentAgent) {\n <div class=\"tab-navigation\">\n <button \n type=\"button\" \n class=\"tab-btn\"\n [class.active]=\"activeTab === 'hierarchy'\"\n (click)=\"setActiveTab('hierarchy')\">\n <i class=\"fa-solid fa-sitemap\"></i>\n Hierarchy\n </button>\n \n <button \n type=\"button\" \n class=\"tab-btn\"\n [class.active]=\"activeTab === 'prompts'\"\n (click)=\"setActiveTab('prompts')\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n Prompts\n </button>\n \n <button \n type=\"button\" \n class=\"tab-btn\"\n [class.active]=\"activeTab === 'properties'\"\n (click)=\"setActiveTab('properties')\">\n <i class=\"fa-solid fa-cog\"></i>\n Properties\n </button>\n </div>\n }\n\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading agent data...\" size=\"large\"></mj-loading>\n </div>\n }\n\n <!-- Error State -->\n @if (error) {\n <div class=\"error-container\">\n <div class=\"error-content\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <h3>Error Loading Agent</h3>\n <p>{{ error }}</p>\n <button class=\"retry-btn\" (click)=\"loadAgentData()\">\n <i class=\"fa-solid fa-retry\"></i>\n Retry\n </button>\n </div>\n </div>\n }\n\n <!-- Tab Content -->\n @if (!isLoading && !error && currentAgent) {\n <div class=\"tab-content\" >\n \n <!-- Hierarchy Tab -->\n @if (activeTab === 'hierarchy') {\n <div class=\"hierarchy-section\" >\n <div class=\"section-header\">\n <h3>\n <i class=\"fa-solid fa-sitemap\"></i>\n Agent Hierarchy\n </h3>\n \n <div class=\"hierarchy-controls\">\n <div class=\"zoom-controls\">\n <button \n type=\"button\" \n class=\"zoom-btn\"\n (click)=\"zoomIn()\"\n title=\"Zoom In\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n <button \n type=\"button\" \n class=\"zoom-btn\"\n (click)=\"zoomOut()\"\n title=\"Zoom Out\">\n <i class=\"fa-solid fa-minus\"></i>\n </button>\n <button \n type=\"button\" \n class=\"zoom-btn\"\n (click)=\"resetZoom()\"\n title=\"Reset Zoom\">\n <i class=\"fa-solid fa-expand\"></i>\n </button>\n </div>\n \n <div class=\"hierarchy-legend\">\n <div class=\"legend-item\">\n <div class=\"legend-rect level-0\"></div>\n <span>Root</span>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-rect level-1\"></div>\n <span>Level 1</span>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-rect level-2\"></div>\n <span>Level 2+</span>\n </div>\n </div>\n </div>\n </div>\n \n <div class=\"hierarchy-chart\" #hierarchyChart >\n <!-- Help text overlay -->\n @if (hierarchyData && (hasChildren() || hasParent())) {\n <div class=\"chart-help\">\n <small>\n <i class=\"fa-solid fa-hand-pointer\"></i>\n Drag to pan • Use zoom controls or scroll to zoom • Click nodes to navigate\n </small>\n </div>\n }\n \n <!-- Empty state for hierarchy -->\n @if (!hierarchyData || (!hasChildren() && !hasParent())) {\n <div class=\"empty-hierarchy\">\n <i class=\"fa-solid fa-sitemap\"></i>\n <h4>No Agent Hierarchy</h4>\n <p>This agent doesn't have any parent or child agents yet.</p>\n <button class=\"create-subagent-btn\" (click)=\"openCreateSubAgent()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Sub-Agent\n </button>\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Prompts Tab -->\n @if (activeTab === 'prompts') {\n <div class=\"prompts-section\" >\n <div class=\"section-header\">\n <h3>\n <i class=\"fa-solid fa-comment-dots\"></i>\n Agent Prompts\n </h3>\n <button class=\"add-prompt-btn\" title=\"Add New Prompt\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Prompt\n </button>\n </div>\n \n <div class=\"prompts-list\">\n @if (agentPrompts.length === 0) {\n <div class=\"empty-prompts\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n <p>No prompts configured for this agent</p>\n <button class=\"add-first-prompt-btn\">\n <i class=\"fa-solid fa-plus\"></i>\n Add First Prompt\n </button>\n </div>\n } @else {\n @for (prompt of agentPrompts; track prompt.id) {\n <div class=\"prompt-card\">\n <div class=\"prompt-header\">\n <div class=\"prompt-info\">\n <h4>{{ prompt.name }}</h4>\n <span class=\"prompt-type\">{{ prompt.type }}</span>\n </div>\n <div class=\"prompt-actions\">\n <button class=\"action-btn\" title=\"Edit Prompt\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n <button class=\"action-btn danger\" title=\"Delete Prompt\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <div class=\"prompt-content\">\n <p>{{ prompt.content }}</p>\n </div>\n </div>\n }\n }\n </div>\n </div>\n }\n \n <!-- Properties Tab -->\n @if (activeTab === 'properties') {\n <div class=\"properties-section\" >\n <div class=\"section-header\">\n <h3>\n <i class=\"fa-solid fa-cog\"></i>\n Agent Properties\n </h3>\n <button class=\"save-btn\" title=\"Save Changes\">\n <i class=\"fa-solid fa-save\"></i>\n Save\n </button>\n </div>\n \n <div class=\"properties-form\">\n <div class=\"form-group\">\n <label>Name</label>\n <input \n type=\"text\" \n class=\"form-input\"\n [value]=\"currentAgent.Name\"\n placeholder=\"Agent name\">\n </div>\n \n <div class=\"form-group\">\n <label>Description</label>\n <textarea \n class=\"form-textarea\"\n [value]=\"currentAgent.Description\"\n placeholder=\"Agent description\"\n rows=\"3\"></textarea>\n </div>\n \n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>Execution Mode</label>\n <select class=\"form-select\" [value]=\"currentAgent.ExecutionMode\">\n <option value=\"Sequential\">Sequential</option>\n <option value=\"Parallel\">Parallel</option>\n </select>\n </div>\n \n <div class=\"form-group\">\n <label>Execution Order</label>\n <input \n type=\"number\" \n class=\"form-input\"\n [value]=\"currentAgent.ExecutionOrder\"\n min=\"0\">\n </div>\n </div>\n \n <div class=\"form-group checkbox-group\">\n <label class=\"checkbox-label\">\n <input \n type=\"checkbox\" \n [checked]=\"currentAgent.ExposeAsAction\">\n <span class=\"checkmark\"></span>\n Expose as Action\n </label>\n <small>Allow this agent to be used as an action by other agents</small>\n </div>\n \n <div class=\"form-group checkbox-group\">\n <label class=\"checkbox-label\">\n <input \n type=\"checkbox\" \n [checked]=\"currentAgent.EnableContextCompression\">\n <span class=\"checkmark\"></span>\n Enable Context Compression\n </label>\n <small>Automatically compress conversation context when threshold is reached</small>\n </div>\n \n @if (currentAgent.EnableContextCompression) {\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>Message Threshold</label>\n <input \n type=\"number\" \n class=\"form-input\"\n [value]=\"currentAgent.ContextCompressionMessageThreshold\"\n min=\"1\"\n placeholder=\"Number of messages\">\n </div>\n \n <div class=\"form-group\">\n <label>Retention Count</label>\n <input \n type=\"number\" \n class=\"form-input\"\n [value]=\"currentAgent.ContextCompressionMessageRetentionCount\"\n min=\"0\"\n placeholder=\"Messages to keep\">\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Sub-Agent creation now uses CreateAgentService slide-in panel -->\n</div>"]}
|
|
1
|
+
{"version":3,"file":"agent-editor.component.js","sourceRoot":"","sources":["../../../../src/AI/components/agents/agent-editor.component.ts","../../../../src/AI/components/agents/agent-editor.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, ViewChild, ElementRef, AfterViewInit } from '@angular/core';\nimport { RunView, LogError, LogStatus } from '@memberjunction/core';\nimport { MJAIAgentEntityExtended } from '@memberjunction/ai-core-plus';\nimport { CreateAgentService, CreateAgentResult } from '@memberjunction/ng-agents';\nimport { NavigationService } from '@memberjunction/ng-shared';\nimport * as d3 from 'd3';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\ninterface AgentHierarchyNode {\n id: string;\n name: string;\n agent: MJAIAgentEntityExtended;\n children?: AgentHierarchyNode[];\n parent?: AgentHierarchyNode;\n x?: number;\n y?: number;\n}\n\ninterface AgentPrompt {\n id: string;\n name: string;\n content: string;\n type: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-agent-editor',\n templateUrl: './agent-editor.component.html',\n styleUrls: ['./agent-editor.component.css']\n})\nexport class AgentEditorComponent extends BaseAngularComponent implements OnInit, OnDestroy, AfterViewInit {\n @Input() agentId: string | null = null;\n @Output() close = new EventEmitter<void>();\n @Output() openAgent = new EventEmitter<string>();\n @Output() openEntityRecord = new EventEmitter<{entityName: string, recordId: string}>();\n\n @ViewChild('hierarchyChart', { static: false }) hierarchyChartRef!: ElementRef;\n\n public isLoading = false;\n public error: string | null = null;\n public currentAgent: MJAIAgentEntityExtended | null = null;\n public allAgents: MJAIAgentEntityExtended[] = [];\n public hierarchyData: AgentHierarchyNode | null = null;\n public selectedNode: AgentHierarchyNode | null = null;\n public agentPrompts: AgentPrompt[] = [];\n\n // Tab settings\n public activeTab: 'hierarchy' | 'prompts' | 'properties' = 'hierarchy';\n \n // Legacy layout settings (keeping for compatibility)\n public showHierarchy = true;\n public showPrompts = true;\n public showProperties = true;\n \n // D3 variables\n private svg: any;\n private g: any;\n private tree: any;\n private root: any;\n private zoom: any;\n\n constructor(\n private navigationService: NavigationService,\n private createAgentService: CreateAgentService) { super(); }\n\n ngOnInit(): void {\n if (this.agentId) {\n this.loadAgentData();\n }\n }\n\n ngAfterViewInit(): void {\n // Chart initialization now happens after data loading in loadAgentData()\n }\n\n ngOnDestroy(): void {\n // Cleanup D3\n if (this.svg) {\n this.svg.remove();\n }\n }\n\n public async loadAgentData(): Promise<void> {\n try {\n this.isLoading = true;\n this.error = null;\n\n // Load all agents to build hierarchy\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({\n EntityName: 'MJ: AI Agents',\n ExtraFilter: '',\n OrderBy: 'Name',\n MaxRows: 1000\n });\n\n this.allAgents = result.Results as MJAIAgentEntityExtended[];\n this.currentAgent = this.allAgents.find(a => UUIDsEqual(a.ID, this.agentId)) || null;\n\n if (this.currentAgent) {\n this.buildHierarchy();\n this.loadAgentPrompts();\n \n // Initialize chart after data is loaded\n setTimeout(() => {\n if (this.hierarchyChartRef) {\n this.initializeChart();\n }\n }, 100);\n }\n } catch (error) {\n console.error('Error loading agent data:', error);\n this.error = 'Failed to load agent data';\n } finally {\n this.isLoading = false;\n }\n }\n\n private buildHierarchy(): void {\n if (!this.currentAgent) return;\n\n // Find the root of the hierarchy that contains our current agent\n const rootAgent = this.findRootAgent(this.currentAgent);\n \n this.hierarchyData = this.buildHierarchyTree(rootAgent);\n this.selectedNode = this.findNodeInHierarchy(this.hierarchyData, this.currentAgent.ID);\n }\n\n private findRootAgent(agent: MJAIAgentEntityExtended): MJAIAgentEntityExtended {\n let current = agent;\n while (current.ParentID) {\n const parent = this.allAgents.find(a => UUIDsEqual(a.ID, current.ParentID));\n if (!parent) break;\n current = parent;\n }\n return current;\n }\n\n private buildHierarchyTree(agent: MJAIAgentEntityExtended): AgentHierarchyNode {\n const children = this.allAgents\n .filter(a => UUIDsEqual(a.ParentID, agent.ID))\n .map(child => this.buildHierarchyTree(child));\n\n const node: AgentHierarchyNode = {\n id: agent.ID,\n name: agent.Name || 'Unnamed Agent',\n agent: agent,\n children: children\n };\n\n // Set parent references\n if (node.children) {\n node.children.forEach(child => child.parent = node);\n }\n\n return node;\n }\n\n private findNodeInHierarchy(node: AgentHierarchyNode, agentId: string): AgentHierarchyNode | null {\n if (node.id === agentId) return node;\n \n if (node.children) {\n for (const child of node.children) {\n const found = this.findNodeInHierarchy(child, agentId);\n if (found) return found;\n }\n }\n \n return null;\n }\n\n private async loadAgentPrompts(): Promise<void> {\n if (!this.currentAgent) return;\n \n try {\n // This would load prompts associated with the agent\n // For now, using mock data structure\n this.agentPrompts = [\n { id: '1', name: 'System Prompt', content: 'Default system instructions...', type: 'system' },\n { id: '2', name: 'User Prompt', content: 'User interaction template...', type: 'user' }\n ];\n } catch (error) {\n console.error('Error loading agent prompts:', error);\n }\n }\n\n private initializeChart(): void {\n if (!this.hierarchyChartRef?.nativeElement) {\n return;\n }\n\n const container = this.hierarchyChartRef.nativeElement;\n const width = container.clientWidth || 800;\n const height = container.clientHeight || 600;\n\n // Clear any existing SVG\n d3.select(container).selectAll('*').remove();\n\n // Create SVG with zoom/pan functionality\n this.svg = d3.select(container)\n .append('svg')\n .attr('width', width)\n .attr('height', height)\n .style('background', '#fafafa')\n .style('border', '1px solid #e0e0e0');\n\n // Create zoom behavior with wheel support\n this.zoom = d3.zoom()\n .scaleExtent([0.1, 3])\n .wheelDelta((event: any) => -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1))\n .on('zoom', (event) => {\n this.g.attr('transform', event.transform);\n });\n\n // Apply zoom to SVG\n this.svg.call(this.zoom);\n\n // Create main group for chart content\n this.g = this.svg.append('g');\n\n // Create tree layout with proper spacing - use nodeSize for fixed spacing\n this.tree = d3.tree()\n .nodeSize([150, 100]) // Fixed node spacing: 150px horizontal, 100px vertical\n .separation((a: any, b: any) => a.parent === b.parent ? 1 : 1.5);\n\n this.renderHierarchy();\n }\n\n private renderHierarchy(): void {\n if (!this.hierarchyData || !this.g || !this.tree) {\n return;\n }\n\n // Create hierarchy\n this.root = d3.hierarchy(this.hierarchyData);\n this.tree(this.root);\n\n // Clear previous render\n this.g.selectAll('*').remove();\n\n // Get container dimensions\n const container = this.hierarchyChartRef.nativeElement;\n const containerWidth = container.clientWidth || 800;\n \n // Calculate the tree bounds after layout\n const treeBounds = this.getTreeBounds(this.root);\n \n // Calculate centering offsets\n const offsetX = (containerWidth - treeBounds.width) / 2 - treeBounds.minX;\n const offsetY = 150; // Top margin for the tree\n \n // Apply transform to center the tree properly\n this.g.attr('transform', `translate(${offsetX}, ${offsetY})`);\n\n // Draw links\n this.g.selectAll('.link')\n .data(this.root.links())\n .enter().append('path')\n .attr('class', 'link')\n .attr('d', d3.linkVertical()\n .x((d: any) => d.x)\n .y((d: any) => d.y))\n .style('fill', 'none')\n .style('stroke', '#999')\n .style('stroke-width', '2px')\n .style('stroke-opacity', 0.6);\n\n // Draw nodes\n const nodes = this.g.selectAll('.node')\n .data(this.root.descendants())\n .enter().append('g')\n .attr('class', 'node')\n .attr('transform', (d: any) => `translate(${d.x}, ${d.y})`)\n .style('cursor', 'pointer')\n .on('click', (_event: any, d: any) => this.onNodeClick(d.data));\n\n // Add rectangles for nodes\n const nodeWidth = 120;\n const nodeHeight = 40;\n \n nodes.append('rect')\n .attr('x', -nodeWidth / 2)\n .attr('y', -nodeHeight / 2)\n .attr('width', nodeWidth)\n .attr('height', nodeHeight)\n .attr('rx', 6)\n .attr('ry', 6)\n .style('fill', (d: any) => this.getNodeColor(d))\n .style('stroke', (d: any) => this.getNodeStrokeColor(d))\n .style('stroke-width', (d: any) => d.data.id === this.currentAgent?.ID ? '3px' : '2px')\n .style('opacity', 0.9);\n\n // Add node labels (agent names)\n nodes.append('text')\n .attr('dy', -2)\n .attr('text-anchor', 'middle')\n .style('font-size', '11px')\n .style('font-weight', (d: any) => d.data.id === this.currentAgent?.ID ? 'bold' : '500')\n .style('fill', '#333')\n .style('pointer-events', 'none')\n .text((d: any) => {\n const name = d.data.name;\n return name.length > 14 ? name.substring(0, 11) + '...' : name;\n });\n\n // Add execution mode labels\n nodes.append('text')\n .attr('dy', 12)\n .attr('text-anchor', 'middle')\n .style('font-size', '9px')\n .style('fill', '#666')\n .style('pointer-events', 'none')\n .text((d: any) => d.data.agent.ExecutionMode);\n\n // Add level indicators\n nodes.append('text')\n .attr('x', nodeWidth / 2 - 8)\n .attr('y', -nodeHeight / 2 + 12)\n .attr('text-anchor', 'middle')\n .style('font-size', '8px')\n .style('font-weight', 'bold')\n .style('fill', '#fff')\n .style('pointer-events', 'none')\n .text((d: any) => `L${d.depth}`);\n }\n\n private getTreeBounds(root: any): { width: number, height: number, minX: number, maxX: number, minY: number, maxY: number } {\n let minX = Infinity, maxX = -Infinity;\n let minY = Infinity, maxY = -Infinity;\n \n root.descendants().forEach((d: any) => {\n minX = Math.min(minX, d.x);\n maxX = Math.max(maxX, d.x);\n minY = Math.min(minY, d.y);\n maxY = Math.max(maxY, d.y);\n });\n \n return {\n width: maxX - minX,\n height: maxY - minY,\n minX,\n maxX,\n minY,\n maxY\n };\n }\n\n private getNodeColor(d: any): string {\n const level = d.depth;\n const isCurrentAgent = d.data.id === this.currentAgent?.ID;\n \n // Level-based color scheme\n const levelColors = [\n '#1976d2', // Level 0 (root) - Blue\n '#388e3c', // Level 1 - Green \n '#f57c00', // Level 2 - Orange\n '#7b1fa2', // Level 3 - Purple\n '#c2185b', // Level 4 - Pink\n '#5d4037' // Level 5+ - Brown\n ];\n \n const baseColor = levelColors[Math.min(level, levelColors.length - 1)];\n \n // Highlight current agent with brighter color\n if (isCurrentAgent) {\n return baseColor;\n }\n \n // Make non-current agents slightly lighter\n return this.lightenColor(baseColor, 0.3);\n }\n\n private getNodeStrokeColor(d: any): string {\n const isCurrentAgent = d.data.id === this.currentAgent?.ID;\n if (isCurrentAgent) {\n return '#000';\n }\n return '#666';\n }\n\n private lightenColor(color: string, factor: number): string {\n // Simple color lightening function\n const hex = color.replace('#', '');\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n \n const newR = Math.min(255, Math.floor(r + (255 - r) * factor));\n const newG = Math.min(255, Math.floor(g + (255 - g) * factor));\n const newB = Math.min(255, Math.floor(b + (255 - b) * factor));\n \n return `rgb(${newR}, ${newG}, ${newB})`;\n }\n\n public onNodeClick(node: AgentHierarchyNode): void {\n if (node.id !== this.currentAgent?.ID) {\n this.openAgent.emit(node.id);\n }\n }\n\n public zoomIn(): void {\n if (this.svg && this.zoom) {\n this.svg.transition().call(\n this.zoom.scaleBy, 1.5\n );\n }\n }\n\n public zoomOut(): void {\n if (this.svg && this.zoom) {\n this.svg.transition().call(\n this.zoom.scaleBy, 1 / 1.5\n );\n }\n }\n\n public resetZoom(): void {\n if (this.svg && this.zoom) {\n // Reset to initial centered position\n this.svg.transition().call(\n this.zoom.transform,\n d3.zoomIdentity\n );\n }\n }\n\n public navigateToAgent(agentId: string): void {\n this.openAgent.emit(agentId);\n }\n\n public closeEditor(): void {\n this.close.emit();\n }\n\n public setActiveTab(tab: 'hierarchy' | 'prompts' | 'properties'): void {\n this.activeTab = tab;\n }\n\n public getExecutionModeColor(mode: string): string {\n return mode === 'Sequential' ? '#2196f3' : '#4caf50';\n }\n\n public getExecutionModeIcon(mode: string): string {\n return mode === 'Sequential' ? 'fa-solid fa-list-ol' : 'fa-solid fa-layer-group';\n }\n\n /**\n * Opens the create sub-agent slide-in panel using the new CreateAgentService.\n * After successful creation, saves the agent and navigates to it.\n */\n public openCreateSubAgent(): void {\n if (!this.currentAgent) return;\n\n this.error = null;\n\n this.createAgentService.OpenSubAgentSlideIn(\n this.currentAgent.ID,\n this.currentAgent.Name || 'Agent'\n ).subscribe({\n next: async (dialogResult) => {\n if (!dialogResult.Cancelled && dialogResult.Result) {\n await this.handleAgentCreated(dialogResult.Result);\n }\n },\n error: (err) => {\n console.error('Error in create sub-agent slide-in:', err);\n this.error = 'Failed to open create sub-agent panel';\n }\n });\n }\n\n /**\n * Handles the result from the create agent slide-in.\n * Saves the agent and navigates to the new record.\n */\n private async handleAgentCreated(result: CreateAgentResult): Promise<void> {\n try {\n this.isLoading = true;\n this.error = null;\n\n const agent = result.Agent;\n\n // Create the agent and all of its linked prompts/actions in one atomic transaction.\n // agent.ID is assigned client-side by NewRecord() so we can use it on child records before submit.\n const md = this.ProviderToUse;\n const tg = await md.CreateTransactionGroup();\n\n agent.TransactionGroup = tg;\n await agent.Save();\n\n if (result.AgentPrompts && result.AgentPrompts.length > 0) {\n for (const agentPrompt of result.AgentPrompts) {\n agentPrompt.AgentID = agent.ID;\n agentPrompt.TransactionGroup = tg;\n await agentPrompt.Save();\n }\n }\n\n if (result.AgentActions && result.AgentActions.length > 0) {\n for (const agentAction of result.AgentActions) {\n agentAction.AgentID = agent.ID;\n agentAction.TransactionGroup = tg;\n await agentAction.Save();\n }\n }\n\n if (await tg.Submit()) {\n LogStatus('Sub-agent created successfully');\n\n // Reload agent data to show the new hierarchy\n await this.loadAgentData();\n\n // Navigate to the newly created agent record\n this.navigationService.OpenEntityRecord('MJ: AI Agents', agent.PrimaryKey);\n } else {\n const errorMessage = agent.LatestResult?.Message || 'Unknown error occurred while creating sub-agent';\n this.error = `Failed to create sub-agent: ${errorMessage}`;\n LogError('Sub-agent creation failed', undefined, errorMessage);\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'An unexpected error occurred';\n this.error = `Failed to create sub-agent: ${errorMessage}`;\n LogError('Error creating sub-agent', undefined, error);\n } finally {\n this.isLoading = false;\n }\n }\n\n public hasChildren(): boolean {\n return this.selectedNode?.children && this.selectedNode.children.length > 0 || false;\n }\n\n public hasParent(): boolean {\n return this.selectedNode?.parent !== undefined;\n }\n\n public getChildCount(): number {\n return this.selectedNode?.children?.length || 0;\n }\n\n public openCurrentAgentRecord(): void {\n if (this.currentAgent) {\n this.openEntityRecord.emit({ entityName: 'MJ: AI Agents', recordId: this.currentAgent.ID });\n }\n }\n}","<div class=\"agent-editor-container\">\n <!-- Header -->\n <div class=\"editor-header\">\n <div class=\"header-info\">\n <div class=\"header-actions\">\n <button \n type=\"button\" \n class=\"back-btn\"\n (click)=\"closeEditor()\"\n title=\"Back to Agent List\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n Back to Agents\n </button>\n \n @if (currentAgent) {\n <button \n type=\"button\" \n class=\"open-btn\"\n (click)=\"openCurrentAgentRecord()\"\n title=\"Open Agent Record\">\n <i class=\"fa-solid fa-external-link\"></i>\n Open Record\n </button>\n }\n </div>\n \n @if (currentAgent) {\n <div class=\"agent-breadcrumb\">\n <h2>{{ currentAgent.Name }}</h2>\n @if (currentAgent.Parent) {\n <span class=\"breadcrumb-item\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n Child of {{ currentAgent.Parent }}\n </span>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Tab Navigation -->\n @if (!isLoading && !error && currentAgent) {\n <div class=\"tab-navigation\">\n <button \n type=\"button\" \n class=\"tab-btn\"\n [class.active]=\"activeTab === 'hierarchy'\"\n (click)=\"setActiveTab('hierarchy')\">\n <i class=\"fa-solid fa-sitemap\"></i>\n Hierarchy\n </button>\n \n <button \n type=\"button\" \n class=\"tab-btn\"\n [class.active]=\"activeTab === 'prompts'\"\n (click)=\"setActiveTab('prompts')\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n Prompts\n </button>\n \n <button \n type=\"button\" \n class=\"tab-btn\"\n [class.active]=\"activeTab === 'properties'\"\n (click)=\"setActiveTab('properties')\">\n <i class=\"fa-solid fa-cog\"></i>\n Properties\n </button>\n </div>\n }\n\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading agent data...\" size=\"large\"></mj-loading>\n </div>\n }\n\n <!-- Error State -->\n @if (error) {\n <div class=\"error-container\">\n <div class=\"error-content\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <h3>Error Loading Agent</h3>\n <p>{{ error }}</p>\n <button class=\"retry-btn\" (click)=\"loadAgentData()\">\n <i class=\"fa-solid fa-retry\"></i>\n Retry\n </button>\n </div>\n </div>\n }\n\n <!-- Tab Content -->\n @if (!isLoading && !error && currentAgent) {\n <div class=\"tab-content\" >\n \n <!-- Hierarchy Tab -->\n @if (activeTab === 'hierarchy') {\n <div class=\"hierarchy-section\" >\n <div class=\"section-header\">\n <h3>\n <i class=\"fa-solid fa-sitemap\"></i>\n Agent Hierarchy\n </h3>\n \n <div class=\"hierarchy-controls\">\n <div class=\"zoom-controls\">\n <button \n type=\"button\" \n class=\"zoom-btn\"\n (click)=\"zoomIn()\"\n title=\"Zoom In\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n <button \n type=\"button\" \n class=\"zoom-btn\"\n (click)=\"zoomOut()\"\n title=\"Zoom Out\">\n <i class=\"fa-solid fa-minus\"></i>\n </button>\n <button \n type=\"button\" \n class=\"zoom-btn\"\n (click)=\"resetZoom()\"\n title=\"Reset Zoom\">\n <i class=\"fa-solid fa-expand\"></i>\n </button>\n </div>\n \n <div class=\"hierarchy-legend\">\n <div class=\"legend-item\">\n <div class=\"legend-rect level-0\"></div>\n <span>Root</span>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-rect level-1\"></div>\n <span>Level 1</span>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-rect level-2\"></div>\n <span>Level 2+</span>\n </div>\n </div>\n </div>\n </div>\n \n <div class=\"hierarchy-chart\" #hierarchyChart >\n <!-- Help text overlay -->\n @if (hierarchyData && (hasChildren() || hasParent())) {\n <div class=\"chart-help\">\n <small>\n <i class=\"fa-solid fa-hand-pointer\"></i>\n Drag to pan • Use zoom controls or scroll to zoom • Click nodes to navigate\n </small>\n </div>\n }\n \n <!-- Empty state for hierarchy -->\n @if (!hierarchyData || (!hasChildren() && !hasParent())) {\n <div class=\"empty-hierarchy\">\n <i class=\"fa-solid fa-sitemap\"></i>\n <h4>No Agent Hierarchy</h4>\n <p>This agent doesn't have any parent or child agents yet.</p>\n <button class=\"create-subagent-btn\" (click)=\"openCreateSubAgent()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Sub-Agent\n </button>\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Prompts Tab -->\n @if (activeTab === 'prompts') {\n <div class=\"prompts-section\" >\n <div class=\"section-header\">\n <h3>\n <i class=\"fa-solid fa-comment-dots\"></i>\n Agent Prompts\n </h3>\n <button class=\"add-prompt-btn\" title=\"Add New Prompt\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Prompt\n </button>\n </div>\n \n <div class=\"prompts-list\">\n @if (agentPrompts.length === 0) {\n <div class=\"empty-prompts\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n <p>No prompts configured for this agent</p>\n <button class=\"add-first-prompt-btn\">\n <i class=\"fa-solid fa-plus\"></i>\n Add First Prompt\n </button>\n </div>\n } @else {\n @for (prompt of agentPrompts; track prompt.id) {\n <div class=\"prompt-card\">\n <div class=\"prompt-header\">\n <div class=\"prompt-info\">\n <h4>{{ prompt.name }}</h4>\n <span class=\"prompt-type\">{{ prompt.type }}</span>\n </div>\n <div class=\"prompt-actions\">\n <button class=\"action-btn\" title=\"Edit Prompt\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n <button class=\"action-btn danger\" title=\"Delete Prompt\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <div class=\"prompt-content\">\n <p>{{ prompt.content }}</p>\n </div>\n </div>\n }\n }\n </div>\n </div>\n }\n \n <!-- Properties Tab -->\n @if (activeTab === 'properties') {\n <div class=\"properties-section\" >\n <div class=\"section-header\">\n <h3>\n <i class=\"fa-solid fa-cog\"></i>\n Agent Properties\n </h3>\n <button class=\"save-btn\" title=\"Save Changes\">\n <i class=\"fa-solid fa-save\"></i>\n Save\n </button>\n </div>\n \n <div class=\"properties-form\">\n <div class=\"form-group\">\n <label>Name</label>\n <input \n type=\"text\" \n class=\"form-input\"\n [value]=\"currentAgent.Name\"\n placeholder=\"Agent name\">\n </div>\n \n <div class=\"form-group\">\n <label>Description</label>\n <textarea \n class=\"form-textarea\"\n [value]=\"currentAgent.Description\"\n placeholder=\"Agent description\"\n rows=\"3\"></textarea>\n </div>\n \n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>Execution Mode</label>\n <select class=\"form-select\" [value]=\"currentAgent.ExecutionMode\">\n <option value=\"Sequential\">Sequential</option>\n <option value=\"Parallel\">Parallel</option>\n </select>\n </div>\n \n <div class=\"form-group\">\n <label>Execution Order</label>\n <input \n type=\"number\" \n class=\"form-input\"\n [value]=\"currentAgent.ExecutionOrder\"\n min=\"0\">\n </div>\n </div>\n \n <div class=\"form-group checkbox-group\">\n <label class=\"checkbox-label\">\n <input \n type=\"checkbox\" \n [checked]=\"currentAgent.ExposeAsAction\">\n <span class=\"checkmark\"></span>\n Expose as Action\n </label>\n <small>Allow this agent to be used as an action by other agents</small>\n </div>\n \n <div class=\"form-group checkbox-group\">\n <label class=\"checkbox-label\">\n <input \n type=\"checkbox\" \n [checked]=\"currentAgent.EnableContextCompression\">\n <span class=\"checkmark\"></span>\n Enable Context Compression\n </label>\n <small>Automatically compress conversation context when threshold is reached</small>\n </div>\n \n @if (currentAgent.EnableContextCompression) {\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>Message Threshold</label>\n <input \n type=\"number\" \n class=\"form-input\"\n [value]=\"currentAgent.ContextCompressionMessageThreshold\"\n min=\"1\"\n placeholder=\"Number of messages\">\n </div>\n \n <div class=\"form-group\">\n <label>Retention Count</label>\n <input \n type=\"number\" \n class=\"form-input\"\n [value]=\"currentAgent.ContextCompressionMessageRetentionCount\"\n min=\"0\"\n placeholder=\"Messages to keep\">\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Sub-Agent creation now uses CreateAgentService slide-in panel -->\n</div>"]}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* "MJ: AI Agent Runs" and "MJ: AI Prompt Runs" entities.
|
|
7
7
|
*/
|
|
8
8
|
import { EventEmitter, OnInit, OnDestroy } from '@angular/core';
|
|
9
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
9
10
|
import { GlobalFilterState } from '../../../interfaces/analytics-preferences.interface';
|
|
10
11
|
import * as i0 from "@angular/core";
|
|
11
12
|
interface AgentRunFilters {
|
|
@@ -44,7 +45,7 @@ interface RecentRunRow {
|
|
|
44
45
|
}
|
|
45
46
|
type SortField = 'Agent' | 'Status' | 'StepCount' | 'Duration' | 'Cost' | 'Time';
|
|
46
47
|
type SortDirection = 'asc' | 'desc';
|
|
47
|
-
export declare class AnalyticsAgentRunsComponent implements OnInit, OnDestroy {
|
|
48
|
+
export declare class AnalyticsAgentRunsComponent extends BaseAngularComponent implements OnInit, OnDestroy {
|
|
48
49
|
TimeRange: string;
|
|
49
50
|
Filters: AgentRunFilters;
|
|
50
51
|
TimeRangeChange: EventEmitter<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-run-analysis.component.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/agent-runs/agent-run-analysis.component.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACuB,YAAY,EACtC,MAAM,EAAE,SAAS,EACpB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-run-analysis.component.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/agent-runs/agent-run-analysis.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
import { Component, Input, Output, EventEmitter, ChangeDetectorRef, inject } from '@angular/core';
|
|
9
9
|
import { Subject } from 'rxjs';
|
|
10
10
|
import { RunView } from '@memberjunction/core';
|
|
11
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
11
12
|
import { UUIDsEqual } from '@memberjunction/global';
|
|
12
13
|
import * as i0 from "@angular/core";
|
|
13
14
|
import * as i1 from "@memberjunction/ng-shared-generic";
|
|
@@ -251,7 +252,7 @@ const COST_COLORS = [
|
|
|
251
252
|
'var(--mj-status-info)',
|
|
252
253
|
'var(--mj-text-disabled)'
|
|
253
254
|
];
|
|
254
|
-
export class AnalyticsAgentRunsComponent {
|
|
255
|
+
export class AnalyticsAgentRunsComponent extends BaseAngularComponent {
|
|
255
256
|
TimeRange = '7d';
|
|
256
257
|
Filters = { Agents: [], Statuses: [] };
|
|
257
258
|
TimeRangeChange = new EventEmitter();
|
|
@@ -332,7 +333,7 @@ export class AnalyticsAgentRunsComponent {
|
|
|
332
333
|
this.IsLoading = true;
|
|
333
334
|
this.cdr.detectChanges();
|
|
334
335
|
try {
|
|
335
|
-
const rv =
|
|
336
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
336
337
|
const dateFilter = this.buildDateFilter('StartedAt');
|
|
337
338
|
const agentFilter = this.buildAgentFilter();
|
|
338
339
|
const statusFilter = this.buildStatusFilter();
|
|
@@ -547,8 +548,8 @@ export class AnalyticsAgentRunsComponent {
|
|
|
547
548
|
const diffDay = Math.floor(diffHr / 24);
|
|
548
549
|
return diffDay + 'd ago';
|
|
549
550
|
}
|
|
550
|
-
static ɵfac = function AnalyticsAgentRunsComponent_Factory(__ngFactoryType__) { return
|
|
551
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AnalyticsAgentRunsComponent, selectors: [["app-analytics-agent-runs"]], inputs: { TimeRange: "TimeRange", Filters: "Filters" }, outputs: { TimeRangeChange: "TimeRangeChange", FiltersChange: "FiltersChange" }, standalone: false, decls: 3, vars: 9, consts: [[3, "TimeRangeChange", "FiltersChange", "TimeRange", "Filters", "ShowModelFilter", "ShowPromptFilter", "ShowAgentFilter", "ShowStatusFilter", "ShowCompareToggle", "ShowExportButton"], [1, "loading-container"], ["text", "Loading agent runs..."], [1, "stats-grid"], [1, "stat-card", "accent-brand"], [1, "stat-label"], [1, "stat-value"], [1, "stat-card"], [1, "stat-card", "accent-success"], [1, "panel"], [1, "panel-header"], [1, "panel-header__title"], [1, "fa-solid", "fa-chart-bar", "panel-header__icon"], [1, "panel-body"], [1, "panel-empty"], [1, "attribution-row"], [1, "legend-row"], [1, "fa-solid", "fa-list", "panel-header__icon"], [1, "panel-header__subtitle"], [1, "table-wrapper"], [1, "data-table"], [1, "sortable-header", 3, "sorted"], [1, "attribution-name", 3, "title"], [1, "attribution-bar-container"], [1, "attribution-segment", 3, "width", "background", "title"], [1, "attribution-total"], [1, "attribution-segment", 3, "title"], [1, "legend-item"], [1, "legend-swatch"], [1, "sortable-header", 3, "click"], [3, "class"], [1, "empty-row"], [1, "cell-agent"], [1, "status-pill"], [1, "cell-numeric"], [1, "cell-time"]], template: function AnalyticsAgentRunsComponent_Template(rf, ctx) { if (rf & 1) {
|
|
551
|
+
static ɵfac = /*@__PURE__*/ (() => { let ɵAnalyticsAgentRunsComponent_BaseFactory; return function AnalyticsAgentRunsComponent_Factory(__ngFactoryType__) { return (ɵAnalyticsAgentRunsComponent_BaseFactory || (ɵAnalyticsAgentRunsComponent_BaseFactory = i0.ɵɵgetInheritedFactory(AnalyticsAgentRunsComponent)))(__ngFactoryType__ || AnalyticsAgentRunsComponent); }; })();
|
|
552
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AnalyticsAgentRunsComponent, selectors: [["app-analytics-agent-runs"]], inputs: { TimeRange: "TimeRange", Filters: "Filters" }, outputs: { TimeRangeChange: "TimeRangeChange", FiltersChange: "FiltersChange" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 9, consts: [[3, "TimeRangeChange", "FiltersChange", "TimeRange", "Filters", "ShowModelFilter", "ShowPromptFilter", "ShowAgentFilter", "ShowStatusFilter", "ShowCompareToggle", "ShowExportButton"], [1, "loading-container"], ["text", "Loading agent runs..."], [1, "stats-grid"], [1, "stat-card", "accent-brand"], [1, "stat-label"], [1, "stat-value"], [1, "stat-card"], [1, "stat-card", "accent-success"], [1, "panel"], [1, "panel-header"], [1, "panel-header__title"], [1, "fa-solid", "fa-chart-bar", "panel-header__icon"], [1, "panel-body"], [1, "panel-empty"], [1, "attribution-row"], [1, "legend-row"], [1, "fa-solid", "fa-list", "panel-header__icon"], [1, "panel-header__subtitle"], [1, "table-wrapper"], [1, "data-table"], [1, "sortable-header", 3, "sorted"], [1, "attribution-name", 3, "title"], [1, "attribution-bar-container"], [1, "attribution-segment", 3, "width", "background", "title"], [1, "attribution-total"], [1, "attribution-segment", 3, "title"], [1, "legend-item"], [1, "legend-swatch"], [1, "sortable-header", 3, "click"], [3, "class"], [1, "empty-row"], [1, "cell-agent"], [1, "status-pill"], [1, "cell-numeric"], [1, "cell-time"]], template: function AnalyticsAgentRunsComponent_Template(rf, ctx) { if (rf & 1) {
|
|
552
553
|
i0.ɵɵelementStart(0, "app-analytics-filter-bar", 0);
|
|
553
554
|
i0.ɵɵlistener("TimeRangeChange", function AnalyticsAgentRunsComponent_Template_app_analytics_filter_bar_TimeRangeChange_0_listener($event) { return ctx.OnTimeRangeChange($event); })("FiltersChange", function AnalyticsAgentRunsComponent_Template_app_analytics_filter_bar_FiltersChange_0_listener($event) { return ctx.OnFiltersChange($event); });
|
|
554
555
|
i0.ɵɵelementEnd();
|
|
@@ -705,6 +706,6 @@ export class AnalyticsAgentRunsComponent {
|
|
|
705
706
|
}], FiltersChange: [{
|
|
706
707
|
type: Output
|
|
707
708
|
}] }); })();
|
|
708
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AnalyticsAgentRunsComponent, { className: "AnalyticsAgentRunsComponent", filePath: "src/AI/components/analytics/agent-runs/agent-run-analysis.component.ts", lineNumber:
|
|
709
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AnalyticsAgentRunsComponent, { className: "AnalyticsAgentRunsComponent", filePath: "src/AI/components/analytics/agent-runs/agent-run-analysis.component.ts", lineNumber: 557 }); })();
|
|
709
710
|
export function LoadAnalyticsAgentRuns() { }
|
|
710
711
|
//# sourceMappingURL=agent-run-analysis.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-run-analysis.component.js","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/agent-runs/agent-run-analysis.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Agent Run Analysis -- Cost Attribution Focus.\n *\n * Displays agent run stats, cost attribution horizontal stacked bars per agent,\n * and a sortable recent agent runs table. All data loaded via RunView from\n * \"MJ: AI Agent Runs\" and \"MJ: AI Prompt Runs\" entities.\n */\n\nimport {\n Component, Input, Output, EventEmitter,\n OnInit, OnDestroy, ChangeDetectorRef, inject\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RunView } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { GlobalFilterState } from '../../../interfaces/analytics-preferences.interface';\n\n// ── Interfaces ──\n\ninterface AgentRunFilters {\n Agents: string[];\n Statuses: string[];\n}\n\ninterface AgentRunRecord {\n ID: string;\n StartedAt: string;\n CompletedAt: string | null;\n Status: string;\n Success: boolean | null;\n TotalCost: number | null;\n TotalTokensUsed: number | null;\n AgentID: string;\n Agent: string | null;\n ErrorMessage: string | null;\n}\n\ninterface PromptRunRecord {\n ID: string;\n AgentRunID: string | null;\n Cost: number | null;\n TotalCost: number | null;\n Model: string | null;\n Vendor: string | null;\n}\n\ninterface AgentRunStats {\n TotalRuns: number;\n TotalCost: number;\n PromptRuns: number;\n AvgCostPerRun: number;\n SuccessRate: number;\n AvgDurationSeconds: number;\n}\n\ninterface CostAttributionRow {\n AgentName: string;\n AgentID: string;\n TotalCost: number;\n Segments: CostSegment[];\n}\n\ninterface CostSegment {\n Label: string;\n Value: number;\n Percent: number;\n Color: string;\n}\n\ninterface RecentRunRow {\n ID: string;\n Agent: string;\n Status: string;\n StatusClass: string;\n StepCount: number;\n Duration: string;\n Cost: string;\n Time: string;\n}\n\ntype SortField = 'Agent' | 'Status' | 'StepCount' | 'Duration' | 'Cost' | 'Time';\ntype SortDirection = 'asc' | 'desc';\n\nconst AGENT_RUN_FIELDS = [\n 'ID', 'StartedAt', 'CompletedAt', 'Status', 'Success',\n 'TotalCost', 'TotalTokensUsed', 'AgentID', 'Agent', 'ErrorMessage'\n];\n\nconst PROMPT_RUN_FIELDS = [\n 'ID', 'AgentRunID', 'Cost', 'TotalCost', 'Model', 'Vendor'\n];\n\nconst COST_COLORS = [\n 'var(--mj-brand-primary)',\n 'var(--mj-brand-accent, var(--mj-brand-primary-hover))',\n 'var(--mj-status-info)',\n 'var(--mj-text-disabled)'\n];\n\n@Component({\n standalone: false,\n selector: 'app-analytics-agent-runs',\n template: `\n <!-- Filter Bar -->\n <app-analytics-filter-bar\n [TimeRange]=\"TimeRange\"\n [Filters]=\"globalFilters\"\n [ShowModelFilter]=\"false\"\n [ShowPromptFilter]=\"false\"\n [ShowAgentFilter]=\"true\"\n [ShowStatusFilter]=\"true\"\n [ShowCompareToggle]=\"false\"\n [ShowExportButton]=\"false\"\n (TimeRangeChange)=\"OnTimeRangeChange($event)\"\n (FiltersChange)=\"OnFiltersChange($event)\"\n ></app-analytics-filter-bar>\n\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading agent runs...\"></mj-loading>\n </div>\n } @else {\n <!-- Stats Bar -->\n <div class=\"stats-grid\">\n <div class=\"stat-card accent-brand\">\n <div class=\"stat-label\">Total Runs</div>\n <div class=\"stat-value\">{{ Stats.TotalRuns | number }}</div>\n </div>\n <div class=\"stat-card accent-brand\">\n <div class=\"stat-label\">Total Cost</div>\n <div class=\"stat-value\">{{ FormatCurrency(Stats.TotalCost) }}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Prompt Runs</div>\n <div class=\"stat-value\">{{ Stats.PromptRuns | number }}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Avg Cost/Run</div>\n <div class=\"stat-value\">{{ FormatCurrency(Stats.AvgCostPerRun, 4) }}</div>\n </div>\n <div class=\"stat-card accent-success\">\n <div class=\"stat-label\">Success Rate</div>\n <div class=\"stat-value\">{{ Stats.SuccessRate | number:'1.1-1' }}%</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Avg Duration</div>\n <div class=\"stat-value\">{{ Stats.AvgDurationSeconds | number:'1.1-1' }}s</div>\n </div>\n </div>\n\n <!-- Cost Attribution Panel -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-header__title\">\n <i class=\"fa-solid fa-chart-bar panel-header__icon\"></i>\n Cost Attribution by Agent\n </div>\n </div>\n <div class=\"panel-body\">\n @if (CostAttributionRows.length === 0) {\n <div class=\"panel-empty\">No agent cost data for selected period</div>\n }\n @for (row of CostAttributionRows; track row.AgentID) {\n <div class=\"attribution-row\">\n <div class=\"attribution-name\" [title]=\"row.AgentName\">{{ row.AgentName }}</div>\n <div class=\"attribution-bar-container\">\n @for (seg of row.Segments; track seg.Label) {\n <div\n class=\"attribution-segment\"\n [style.width.%]=\"seg.Percent\"\n [style.background]=\"seg.Color\"\n [title]=\"seg.Label + ': ' + FormatCurrency(seg.Value, 4)\"\n ></div>\n }\n </div>\n <div class=\"attribution-total\">{{ FormatCurrency(row.TotalCost) }}</div>\n </div>\n }\n @if (CostAttributionRows.length > 0) {\n <div class=\"legend-row\">\n @for (item of LegendItems; track item.Label) {\n <div class=\"legend-item\">\n <span class=\"legend-swatch\" [style.background]=\"item.Color\"></span>\n {{ item.Label }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Recent Agent Runs Table -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-header__title\">\n <i class=\"fa-solid fa-list panel-header__icon\"></i>\n Recent Agent Runs\n </div>\n <span class=\"panel-header__subtitle\">{{ RecentRuns.length }} runs</span>\n </div>\n <div class=\"table-wrapper\">\n <table class=\"data-table\">\n <thead>\n <tr>\n @for (col of TableColumns; track col.field) {\n <th\n class=\"sortable-header\"\n [class.sorted]=\"SortField === col.field\"\n (click)=\"OnSort(col.field)\">\n {{ col.label }}\n @if (SortField === col.field) {\n <i [class]=\"SortDir === 'asc' ? 'fa-solid fa-caret-up' : 'fa-solid fa-caret-down'\"></i>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (RecentRuns.length === 0) {\n <tr><td [attr.colspan]=\"TableColumns.length\" class=\"empty-row\">No runs found</td></tr>\n }\n @for (run of RecentRuns; track run.ID) {\n <tr>\n <td class=\"cell-agent\">{{ run.Agent }}</td>\n <td><span class=\"status-pill\" [class]=\"run.StatusClass\">{{ run.Status }}</span></td>\n <td class=\"cell-numeric\">{{ run.StepCount }}</td>\n <td class=\"cell-numeric\">{{ run.Duration }}</td>\n <td class=\"cell-numeric\">{{ run.Cost }}</td>\n <td class=\"cell-time\">{{ run.Time }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n `,\n styles: [`\n :host { display: block; }\n\n .loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n }\n\n /* ── Stats Grid ── */\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 12px;\n margin: 16px 0;\n }\n\n .stat-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 14px 16px;\n text-align: center;\n border-top: 3px solid var(--mj-border-subtle);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n\n .stat-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n }\n\n .stat-card.accent-brand { border-top-color: var(--mj-brand-primary); }\n .stat-card.accent-success { border-top-color: var(--mj-status-success); }\n .stat-card.accent-warning { border-top-color: var(--mj-status-warning); }\n\n .stat-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 4px;\n }\n\n .stat-value {\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n letter-spacing: -0.02em;\n }\n\n /* ── Panel ── */\n .panel {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n margin-bottom: 16px;\n overflow: hidden;\n }\n\n .panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 18px;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .panel-header__title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .panel-header__icon {\n font-size: 13px;\n color: var(--mj-brand-primary);\n }\n\n .panel-header__subtitle {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .panel-body {\n padding: 16px 18px;\n }\n\n .panel-empty {\n text-align: center;\n padding: 24px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n }\n\n /* ── Cost Attribution ── */\n .attribution-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .attribution-row:last-of-type {\n border-bottom: none;\n }\n\n .attribution-name {\n width: 140px;\n min-width: 140px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .attribution-bar-container {\n flex: 1;\n display: flex;\n height: 24px;\n border-radius: 6px;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n }\n\n .attribution-segment {\n height: 100%;\n min-width: 2px;\n transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .attribution-total {\n width: 80px;\n min-width: 80px;\n text-align: right;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n }\n\n .legend-row {\n display: flex;\n gap: 16px;\n padding: 12px 0 4px;\n flex-wrap: wrap;\n }\n\n .legend-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .legend-swatch {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n flex-shrink: 0;\n }\n\n /* ── Table ── */\n .table-wrapper {\n overflow-x: auto;\n }\n\n .data-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n }\n\n .data-table th,\n .data-table td {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .data-table th {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n }\n\n .sortable-header {\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n transition: color 0.15s;\n }\n\n .sortable-header:hover {\n color: var(--mj-brand-primary);\n }\n\n .sortable-header.sorted {\n color: var(--mj-brand-primary);\n }\n\n .sortable-header i {\n margin-left: 4px;\n font-size: 10px;\n }\n\n .data-table tbody tr {\n transition: background 0.15s;\n }\n\n .data-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .cell-agent {\n font-weight: 500;\n color: var(--mj-text-primary);\n max-width: 200px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .cell-numeric {\n text-align: right;\n font-variant-numeric: tabular-nums;\n color: var(--mj-text-secondary);\n }\n\n .cell-time {\n white-space: nowrap;\n color: var(--mj-text-muted);\n font-size: 12px;\n }\n\n .empty-row {\n text-align: center;\n color: var(--mj-text-disabled);\n padding: 24px;\n }\n\n /* ── Status Pills ── */\n .status-pill {\n display: inline-block;\n padding: 3px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.3px;\n }\n\n .status-completed {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .status-running {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .status-failed {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .status-cancelled {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n .status-paused, .status-awaitingfeedback {\n background: color-mix(in srgb, var(--mj-text-disabled) 12%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n }\n\n /* ── Responsive ── */\n @media (max-width: 1200px) {\n .stats-grid {\n grid-template-columns: repeat(3, 1fr);\n }\n }\n\n @media (max-width: 768px) {\n .stats-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .attribution-name {\n width: 100px;\n min-width: 100px;\n }\n\n .attribution-total {\n width: 60px;\n min-width: 60px;\n }\n\n .stat-value {\n font-size: 18px;\n }\n }\n `]\n})\nexport class AnalyticsAgentRunsComponent implements OnInit, OnDestroy {\n @Input() TimeRange = '7d';\n @Input() Filters: AgentRunFilters = { Agents: [], Statuses: [] };\n\n @Output() TimeRangeChange = new EventEmitter<string>();\n @Output() FiltersChange = new EventEmitter<AgentRunFilters>();\n\n private cdr = inject(ChangeDetectorRef);\n private destroy$ = new Subject<void>();\n\n public IsLoading = false;\n\n public Stats: AgentRunStats = {\n TotalRuns: 0,\n TotalCost: 0,\n PromptRuns: 0,\n AvgCostPerRun: 0,\n SuccessRate: 0,\n AvgDurationSeconds: 0\n };\n\n public CostAttributionRows: CostAttributionRow[] = [];\n public LegendItems: { Label: string; Color: string }[] = [];\n public RecentRuns: RecentRunRow[] = [];\n public SortField: SortField = 'Time';\n public SortDir: SortDirection = 'desc';\n\n public TableColumns: { field: SortField; label: string }[] = [\n { field: 'Agent', label: 'Agent' },\n { field: 'Status', label: 'Status' },\n { field: 'StepCount', label: 'Steps' },\n { field: 'Duration', label: 'Duration' },\n { field: 'Cost', label: 'Cost' },\n { field: 'Time', label: 'Time' }\n ];\n\n /** Bridge the local filter shape to the global shape the filter bar expects */\n public get globalFilters(): GlobalFilterState {\n return {\n Models: [],\n Agents: this.Filters.Agents,\n Prompts: [],\n Statuses: this.Filters.Statuses\n };\n }\n\n private agentRuns: AgentRunRecord[] = [];\n private promptRuns: PromptRunRecord[] = [];\n\n ngOnInit(): void {\n this.LoadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ── Public Event Handlers ──\n\n public OnTimeRangeChange(range: string): void {\n this.TimeRange = range;\n this.TimeRangeChange.emit(range);\n this.LoadData();\n }\n\n public OnFiltersChange(filters: GlobalFilterState): void {\n this.Filters = { Agents: filters.Agents, Statuses: filters.Statuses };\n this.FiltersChange.emit(this.Filters);\n this.LoadData();\n }\n\n public OnSort(field: SortField): void {\n if (this.SortField === field) {\n this.SortDir = this.SortDir === 'asc' ? 'desc' : 'asc';\n } else {\n this.SortField = field;\n this.SortDir = field === 'Time' ? 'desc' : 'asc';\n }\n this.sortRecentRuns();\n this.cdr.detectChanges();\n }\n\n public FormatCurrency(value: number, decimals = 2): string {\n if (value === 0) return '$0.00';\n if (value < 0.01 && decimals < 4) decimals = 4;\n return '$' + value.toFixed(decimals);\n }\n\n // ── Data Loading ──\n\n private async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const rv = new RunView();\n const dateFilter = this.buildDateFilter('StartedAt');\n const agentFilter = this.buildAgentFilter();\n const statusFilter = this.buildStatusFilter();\n const extraFilter = [dateFilter, agentFilter, statusFilter].filter(Boolean).join(' AND ');\n\n const promptDateFilter = this.buildDateFilter('RunAt');\n\n const [agentResult, promptResult] = await rv.RunViews([\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: extraFilter,\n Fields: AGENT_RUN_FIELDS,\n OrderBy: 'StartedAt DESC',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: promptDateFilter,\n Fields: PROMPT_RUN_FIELDS,\n OrderBy: 'RunAt DESC',\n ResultType: 'simple'\n }\n ]);\n\n this.agentRuns = (agentResult?.Results ?? []) as AgentRunRecord[];\n this.promptRuns = (promptResult?.Results ?? []) as PromptRunRecord[];\n\n this.computeStats();\n this.computeCostAttribution();\n this.buildRecentRuns();\n this.sortRecentRuns();\n } catch (e) {\n console.error('Agent Run Analysis load error:', e);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ── Computations ──\n\n private computeStats(): void {\n const runs = this.agentRuns;\n const total = runs.length;\n const totalCost = runs.reduce((s, r) => s + (r.TotalCost ?? 0), 0);\n const completed = runs.filter(r => r.Status === 'Completed');\n const successCount = runs.filter(r => r.Success === true).length;\n\n const durations = completed\n .filter(r => r.CompletedAt)\n .map(r => {\n const start = new Date(r.StartedAt).getTime();\n const end = new Date(r.CompletedAt!).getTime();\n return (end - start) / 1000;\n })\n .filter(d => d > 0);\n\n const avgDuration = durations.length > 0\n ? durations.reduce((s, d) => s + d, 0) / durations.length\n : 0;\n\n const linkedPromptRuns = this.promptRuns.filter(\n p => p.AgentRunID != null && this.agentRunIdSet.has(p.AgentRunID)\n );\n\n this.Stats = {\n TotalRuns: total,\n TotalCost: totalCost,\n PromptRuns: linkedPromptRuns.length,\n AvgCostPerRun: total > 0 ? totalCost / total : 0,\n SuccessRate: total > 0 ? (successCount / total) * 100 : 0,\n AvgDurationSeconds: avgDuration\n };\n }\n\n private get agentRunIdSet(): Set<string> {\n return new Set(this.agentRuns.map(r => r.ID));\n }\n\n private computeCostAttribution(): void {\n const agentCostMap = new Map<string, { name: string; vendorCosts: Map<string, number>; totalCost: number }>();\n\n // Group prompt runs by agent run, then by vendor\n for (const pr of this.promptRuns) {\n if (!pr.AgentRunID) continue;\n const agentRun = this.agentRuns.find(ar => UUIDsEqual(ar.ID, pr.AgentRunID));\n if (!agentRun) continue;\n\n const agentKey = agentRun.AgentID;\n if (!agentCostMap.has(agentKey)) {\n agentCostMap.set(agentKey, {\n name: agentRun.Agent ?? 'Unknown',\n vendorCosts: new Map<string, number>(),\n totalCost: 0\n });\n }\n\n const entry = agentCostMap.get(agentKey)!;\n const vendor = pr.Vendor ?? 'Other';\n const cost = pr.Cost ?? pr.TotalCost ?? 0;\n entry.vendorCosts.set(vendor, (entry.vendorCosts.get(vendor) ?? 0) + cost);\n entry.totalCost += cost;\n }\n\n // Collect all vendors for consistent coloring\n const allVendors = new Set<string>();\n for (const entry of agentCostMap.values()) {\n for (const v of entry.vendorCosts.keys()) {\n allVendors.add(v);\n }\n }\n const vendorList = Array.from(allVendors);\n\n // Build legend\n this.LegendItems = vendorList.map((v, i) => ({\n Label: v,\n Color: COST_COLORS[i % COST_COLORS.length]\n }));\n\n // Sort by total cost descending\n const sorted = Array.from(agentCostMap.entries())\n .sort((a, b) => b[1].totalCost - a[1].totalCost);\n\n this.CostAttributionRows = sorted.map(([agentId, entry]) => {\n const segments: CostSegment[] = vendorList.map((vendor, i) => {\n const val = entry.vendorCosts.get(vendor) ?? 0;\n return {\n Label: vendor,\n Value: val,\n Percent: entry.totalCost > 0 ? (val / entry.totalCost) * 100 : 0,\n Color: COST_COLORS[i % COST_COLORS.length]\n };\n }).filter(s => s.Value > 0);\n\n return {\n AgentName: entry.name,\n AgentID: agentId,\n TotalCost: entry.totalCost,\n Segments: segments\n };\n });\n }\n\n private buildRecentRuns(): void {\n // Count prompt runs per agent run\n const promptCountMap = new Map<string, number>();\n for (const pr of this.promptRuns) {\n if (pr.AgentRunID) {\n promptCountMap.set(pr.AgentRunID, (promptCountMap.get(pr.AgentRunID) ?? 0) + 1);\n }\n }\n\n this.RecentRuns = this.agentRuns.slice(0, 100).map(r => ({\n ID: r.ID,\n Agent: r.Agent ?? 'Unknown',\n Status: r.Status,\n StatusClass: this.getStatusClass(r.Status),\n StepCount: promptCountMap.get(r.ID) ?? 0,\n Duration: this.formatDuration(r.StartedAt, r.CompletedAt),\n Cost: this.FormatCurrency(r.TotalCost ?? 0),\n Time: this.formatRelativeTime(r.StartedAt)\n }));\n }\n\n private sortRecentRuns(): void {\n const dir = this.SortDir === 'asc' ? 1 : -1;\n this.RecentRuns.sort((a, b) => {\n switch (this.SortField) {\n case 'Agent': return dir * a.Agent.localeCompare(b.Agent);\n case 'Status': return dir * a.Status.localeCompare(b.Status);\n case 'StepCount': return dir * (a.StepCount - b.StepCount);\n case 'Duration': return dir * a.Duration.localeCompare(b.Duration);\n case 'Cost': return dir * a.Cost.localeCompare(b.Cost);\n case 'Time': return dir * a.Time.localeCompare(b.Time);\n default: return 0;\n }\n });\n }\n\n // ── Helpers ──\n\n private buildDateFilter(field: string): string {\n const now = new Date();\n const ms = this.timeRangeToMs(this.TimeRange);\n const start = new Date(now.getTime() - ms);\n return `${field} >= '${start.toISOString()}'`;\n }\n\n private buildAgentFilter(): string {\n if (this.Filters.Agents.length === 0) return '';\n const ids = this.Filters.Agents.map(id => `'${id}'`).join(',');\n return `AgentID IN (${ids})`;\n }\n\n private buildStatusFilter(): string {\n if (this.Filters.Statuses.length === 0) return '';\n const values = this.Filters.Statuses.map(s => `'${s}'`).join(',');\n return `Status IN (${values})`;\n }\n\n private timeRangeToMs(range: string): number {\n const map: Record<string, number> = {\n '1h': 3600000,\n '6h': 21600000,\n '24h': 86400000,\n '7d': 604800000,\n '30d': 2592000000\n };\n return map[range] ?? 604800000;\n }\n\n private getStatusClass(status: string): string {\n return 'status-pill status-' + status.toLowerCase().replace(/\\s+/g, '');\n }\n\n private formatDuration(startStr: string, endStr: string | null): string {\n if (!endStr) return '--';\n const ms = new Date(endStr).getTime() - new Date(startStr).getTime();\n if (ms < 1000) return ms + 'ms';\n if (ms < 60000) return (ms / 1000).toFixed(1) + 's';\n return (ms / 60000).toFixed(1) + 'm';\n }\n\n private formatRelativeTime(dateStr: string): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diffMs = now - then;\n const diffMin = Math.floor(diffMs / 60000);\n if (diffMin < 1) return 'just now';\n if (diffMin < 60) return diffMin + 'm ago';\n const diffHr = Math.floor(diffMin / 60);\n if (diffHr < 24) return diffHr + 'h ago';\n const diffDay = Math.floor(diffHr / 24);\n return diffDay + 'd ago';\n }\n}\n\nexport function LoadAnalyticsAgentRuns() { /* tree-shaking prevention */ }\n"]}
|
|
1
|
+
{"version":3,"file":"agent-run-analysis.component.js","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/agent-runs/agent-run-analysis.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Agent Run Analysis -- Cost Attribution Focus.\n *\n * Displays agent run stats, cost attribution horizontal stacked bars per agent,\n * and a sortable recent agent runs table. All data loaded via RunView from\n * \"MJ: AI Agent Runs\" and \"MJ: AI Prompt Runs\" entities.\n */\n\nimport {\n Component, Input, Output, EventEmitter,\n OnInit, OnDestroy, ChangeDetectorRef, inject\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RunView } from '@memberjunction/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { GlobalFilterState } from '../../../interfaces/analytics-preferences.interface';\n\n// ── Interfaces ──\n\ninterface AgentRunFilters {\n Agents: string[];\n Statuses: string[];\n}\n\ninterface AgentRunRecord {\n ID: string;\n StartedAt: string;\n CompletedAt: string | null;\n Status: string;\n Success: boolean | null;\n TotalCost: number | null;\n TotalTokensUsed: number | null;\n AgentID: string;\n Agent: string | null;\n ErrorMessage: string | null;\n}\n\ninterface PromptRunRecord {\n ID: string;\n AgentRunID: string | null;\n Cost: number | null;\n TotalCost: number | null;\n Model: string | null;\n Vendor: string | null;\n}\n\ninterface AgentRunStats {\n TotalRuns: number;\n TotalCost: number;\n PromptRuns: number;\n AvgCostPerRun: number;\n SuccessRate: number;\n AvgDurationSeconds: number;\n}\n\ninterface CostAttributionRow {\n AgentName: string;\n AgentID: string;\n TotalCost: number;\n Segments: CostSegment[];\n}\n\ninterface CostSegment {\n Label: string;\n Value: number;\n Percent: number;\n Color: string;\n}\n\ninterface RecentRunRow {\n ID: string;\n Agent: string;\n Status: string;\n StatusClass: string;\n StepCount: number;\n Duration: string;\n Cost: string;\n Time: string;\n}\n\ntype SortField = 'Agent' | 'Status' | 'StepCount' | 'Duration' | 'Cost' | 'Time';\ntype SortDirection = 'asc' | 'desc';\n\nconst AGENT_RUN_FIELDS = [\n 'ID', 'StartedAt', 'CompletedAt', 'Status', 'Success',\n 'TotalCost', 'TotalTokensUsed', 'AgentID', 'Agent', 'ErrorMessage'\n];\n\nconst PROMPT_RUN_FIELDS = [\n 'ID', 'AgentRunID', 'Cost', 'TotalCost', 'Model', 'Vendor'\n];\n\nconst COST_COLORS = [\n 'var(--mj-brand-primary)',\n 'var(--mj-brand-accent, var(--mj-brand-primary-hover))',\n 'var(--mj-status-info)',\n 'var(--mj-text-disabled)'\n];\n\n@Component({\n standalone: false,\n selector: 'app-analytics-agent-runs',\n template: `\n <!-- Filter Bar -->\n <app-analytics-filter-bar\n [TimeRange]=\"TimeRange\"\n [Filters]=\"globalFilters\"\n [ShowModelFilter]=\"false\"\n [ShowPromptFilter]=\"false\"\n [ShowAgentFilter]=\"true\"\n [ShowStatusFilter]=\"true\"\n [ShowCompareToggle]=\"false\"\n [ShowExportButton]=\"false\"\n (TimeRangeChange)=\"OnTimeRangeChange($event)\"\n (FiltersChange)=\"OnFiltersChange($event)\"\n ></app-analytics-filter-bar>\n\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading agent runs...\"></mj-loading>\n </div>\n } @else {\n <!-- Stats Bar -->\n <div class=\"stats-grid\">\n <div class=\"stat-card accent-brand\">\n <div class=\"stat-label\">Total Runs</div>\n <div class=\"stat-value\">{{ Stats.TotalRuns | number }}</div>\n </div>\n <div class=\"stat-card accent-brand\">\n <div class=\"stat-label\">Total Cost</div>\n <div class=\"stat-value\">{{ FormatCurrency(Stats.TotalCost) }}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Prompt Runs</div>\n <div class=\"stat-value\">{{ Stats.PromptRuns | number }}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Avg Cost/Run</div>\n <div class=\"stat-value\">{{ FormatCurrency(Stats.AvgCostPerRun, 4) }}</div>\n </div>\n <div class=\"stat-card accent-success\">\n <div class=\"stat-label\">Success Rate</div>\n <div class=\"stat-value\">{{ Stats.SuccessRate | number:'1.1-1' }}%</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Avg Duration</div>\n <div class=\"stat-value\">{{ Stats.AvgDurationSeconds | number:'1.1-1' }}s</div>\n </div>\n </div>\n\n <!-- Cost Attribution Panel -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-header__title\">\n <i class=\"fa-solid fa-chart-bar panel-header__icon\"></i>\n Cost Attribution by Agent\n </div>\n </div>\n <div class=\"panel-body\">\n @if (CostAttributionRows.length === 0) {\n <div class=\"panel-empty\">No agent cost data for selected period</div>\n }\n @for (row of CostAttributionRows; track row.AgentID) {\n <div class=\"attribution-row\">\n <div class=\"attribution-name\" [title]=\"row.AgentName\">{{ row.AgentName }}</div>\n <div class=\"attribution-bar-container\">\n @for (seg of row.Segments; track seg.Label) {\n <div\n class=\"attribution-segment\"\n [style.width.%]=\"seg.Percent\"\n [style.background]=\"seg.Color\"\n [title]=\"seg.Label + ': ' + FormatCurrency(seg.Value, 4)\"\n ></div>\n }\n </div>\n <div class=\"attribution-total\">{{ FormatCurrency(row.TotalCost) }}</div>\n </div>\n }\n @if (CostAttributionRows.length > 0) {\n <div class=\"legend-row\">\n @for (item of LegendItems; track item.Label) {\n <div class=\"legend-item\">\n <span class=\"legend-swatch\" [style.background]=\"item.Color\"></span>\n {{ item.Label }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Recent Agent Runs Table -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-header__title\">\n <i class=\"fa-solid fa-list panel-header__icon\"></i>\n Recent Agent Runs\n </div>\n <span class=\"panel-header__subtitle\">{{ RecentRuns.length }} runs</span>\n </div>\n <div class=\"table-wrapper\">\n <table class=\"data-table\">\n <thead>\n <tr>\n @for (col of TableColumns; track col.field) {\n <th\n class=\"sortable-header\"\n [class.sorted]=\"SortField === col.field\"\n (click)=\"OnSort(col.field)\">\n {{ col.label }}\n @if (SortField === col.field) {\n <i [class]=\"SortDir === 'asc' ? 'fa-solid fa-caret-up' : 'fa-solid fa-caret-down'\"></i>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (RecentRuns.length === 0) {\n <tr><td [attr.colspan]=\"TableColumns.length\" class=\"empty-row\">No runs found</td></tr>\n }\n @for (run of RecentRuns; track run.ID) {\n <tr>\n <td class=\"cell-agent\">{{ run.Agent }}</td>\n <td><span class=\"status-pill\" [class]=\"run.StatusClass\">{{ run.Status }}</span></td>\n <td class=\"cell-numeric\">{{ run.StepCount }}</td>\n <td class=\"cell-numeric\">{{ run.Duration }}</td>\n <td class=\"cell-numeric\">{{ run.Cost }}</td>\n <td class=\"cell-time\">{{ run.Time }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n `,\n styles: [`\n :host { display: block; }\n\n .loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n }\n\n /* ── Stats Grid ── */\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 12px;\n margin: 16px 0;\n }\n\n .stat-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 14px 16px;\n text-align: center;\n border-top: 3px solid var(--mj-border-subtle);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n\n .stat-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n }\n\n .stat-card.accent-brand { border-top-color: var(--mj-brand-primary); }\n .stat-card.accent-success { border-top-color: var(--mj-status-success); }\n .stat-card.accent-warning { border-top-color: var(--mj-status-warning); }\n\n .stat-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 4px;\n }\n\n .stat-value {\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n letter-spacing: -0.02em;\n }\n\n /* ── Panel ── */\n .panel {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n margin-bottom: 16px;\n overflow: hidden;\n }\n\n .panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 18px;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .panel-header__title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .panel-header__icon {\n font-size: 13px;\n color: var(--mj-brand-primary);\n }\n\n .panel-header__subtitle {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .panel-body {\n padding: 16px 18px;\n }\n\n .panel-empty {\n text-align: center;\n padding: 24px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n }\n\n /* ── Cost Attribution ── */\n .attribution-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .attribution-row:last-of-type {\n border-bottom: none;\n }\n\n .attribution-name {\n width: 140px;\n min-width: 140px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .attribution-bar-container {\n flex: 1;\n display: flex;\n height: 24px;\n border-radius: 6px;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n }\n\n .attribution-segment {\n height: 100%;\n min-width: 2px;\n transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .attribution-total {\n width: 80px;\n min-width: 80px;\n text-align: right;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n }\n\n .legend-row {\n display: flex;\n gap: 16px;\n padding: 12px 0 4px;\n flex-wrap: wrap;\n }\n\n .legend-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .legend-swatch {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n flex-shrink: 0;\n }\n\n /* ── Table ── */\n .table-wrapper {\n overflow-x: auto;\n }\n\n .data-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n }\n\n .data-table th,\n .data-table td {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .data-table th {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n }\n\n .sortable-header {\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n transition: color 0.15s;\n }\n\n .sortable-header:hover {\n color: var(--mj-brand-primary);\n }\n\n .sortable-header.sorted {\n color: var(--mj-brand-primary);\n }\n\n .sortable-header i {\n margin-left: 4px;\n font-size: 10px;\n }\n\n .data-table tbody tr {\n transition: background 0.15s;\n }\n\n .data-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .cell-agent {\n font-weight: 500;\n color: var(--mj-text-primary);\n max-width: 200px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .cell-numeric {\n text-align: right;\n font-variant-numeric: tabular-nums;\n color: var(--mj-text-secondary);\n }\n\n .cell-time {\n white-space: nowrap;\n color: var(--mj-text-muted);\n font-size: 12px;\n }\n\n .empty-row {\n text-align: center;\n color: var(--mj-text-disabled);\n padding: 24px;\n }\n\n /* ── Status Pills ── */\n .status-pill {\n display: inline-block;\n padding: 3px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.3px;\n }\n\n .status-completed {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .status-running {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .status-failed {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .status-cancelled {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n .status-paused, .status-awaitingfeedback {\n background: color-mix(in srgb, var(--mj-text-disabled) 12%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n }\n\n /* ── Responsive ── */\n @media (max-width: 1200px) {\n .stats-grid {\n grid-template-columns: repeat(3, 1fr);\n }\n }\n\n @media (max-width: 768px) {\n .stats-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .attribution-name {\n width: 100px;\n min-width: 100px;\n }\n\n .attribution-total {\n width: 60px;\n min-width: 60px;\n }\n\n .stat-value {\n font-size: 18px;\n }\n }\n `]\n})\nexport class AnalyticsAgentRunsComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n @Input() TimeRange = '7d';\n @Input() Filters: AgentRunFilters = { Agents: [], Statuses: [] };\n\n @Output() TimeRangeChange = new EventEmitter<string>();\n @Output() FiltersChange = new EventEmitter<AgentRunFilters>();\n\n private cdr = inject(ChangeDetectorRef);\n private destroy$ = new Subject<void>();\n\n public IsLoading = false;\n\n public Stats: AgentRunStats = {\n TotalRuns: 0,\n TotalCost: 0,\n PromptRuns: 0,\n AvgCostPerRun: 0,\n SuccessRate: 0,\n AvgDurationSeconds: 0\n };\n\n public CostAttributionRows: CostAttributionRow[] = [];\n public LegendItems: { Label: string; Color: string }[] = [];\n public RecentRuns: RecentRunRow[] = [];\n public SortField: SortField = 'Time';\n public SortDir: SortDirection = 'desc';\n\n public TableColumns: { field: SortField; label: string }[] = [\n { field: 'Agent', label: 'Agent' },\n { field: 'Status', label: 'Status' },\n { field: 'StepCount', label: 'Steps' },\n { field: 'Duration', label: 'Duration' },\n { field: 'Cost', label: 'Cost' },\n { field: 'Time', label: 'Time' }\n ];\n\n /** Bridge the local filter shape to the global shape the filter bar expects */\n public get globalFilters(): GlobalFilterState {\n return {\n Models: [],\n Agents: this.Filters.Agents,\n Prompts: [],\n Statuses: this.Filters.Statuses\n };\n }\n\n private agentRuns: AgentRunRecord[] = [];\n private promptRuns: PromptRunRecord[] = [];\n\n ngOnInit(): void {\n this.LoadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ── Public Event Handlers ──\n\n public OnTimeRangeChange(range: string): void {\n this.TimeRange = range;\n this.TimeRangeChange.emit(range);\n this.LoadData();\n }\n\n public OnFiltersChange(filters: GlobalFilterState): void {\n this.Filters = { Agents: filters.Agents, Statuses: filters.Statuses };\n this.FiltersChange.emit(this.Filters);\n this.LoadData();\n }\n\n public OnSort(field: SortField): void {\n if (this.SortField === field) {\n this.SortDir = this.SortDir === 'asc' ? 'desc' : 'asc';\n } else {\n this.SortField = field;\n this.SortDir = field === 'Time' ? 'desc' : 'asc';\n }\n this.sortRecentRuns();\n this.cdr.detectChanges();\n }\n\n public FormatCurrency(value: number, decimals = 2): string {\n if (value === 0) return '$0.00';\n if (value < 0.01 && decimals < 4) decimals = 4;\n return '$' + value.toFixed(decimals);\n }\n\n // ── Data Loading ──\n\n private async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const dateFilter = this.buildDateFilter('StartedAt');\n const agentFilter = this.buildAgentFilter();\n const statusFilter = this.buildStatusFilter();\n const extraFilter = [dateFilter, agentFilter, statusFilter].filter(Boolean).join(' AND ');\n\n const promptDateFilter = this.buildDateFilter('RunAt');\n\n const [agentResult, promptResult] = await rv.RunViews([\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: extraFilter,\n Fields: AGENT_RUN_FIELDS,\n OrderBy: 'StartedAt DESC',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: promptDateFilter,\n Fields: PROMPT_RUN_FIELDS,\n OrderBy: 'RunAt DESC',\n ResultType: 'simple'\n }\n ]);\n\n this.agentRuns = (agentResult?.Results ?? []) as AgentRunRecord[];\n this.promptRuns = (promptResult?.Results ?? []) as PromptRunRecord[];\n\n this.computeStats();\n this.computeCostAttribution();\n this.buildRecentRuns();\n this.sortRecentRuns();\n } catch (e) {\n console.error('Agent Run Analysis load error:', e);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ── Computations ──\n\n private computeStats(): void {\n const runs = this.agentRuns;\n const total = runs.length;\n const totalCost = runs.reduce((s, r) => s + (r.TotalCost ?? 0), 0);\n const completed = runs.filter(r => r.Status === 'Completed');\n const successCount = runs.filter(r => r.Success === true).length;\n\n const durations = completed\n .filter(r => r.CompletedAt)\n .map(r => {\n const start = new Date(r.StartedAt).getTime();\n const end = new Date(r.CompletedAt!).getTime();\n return (end - start) / 1000;\n })\n .filter(d => d > 0);\n\n const avgDuration = durations.length > 0\n ? durations.reduce((s, d) => s + d, 0) / durations.length\n : 0;\n\n const linkedPromptRuns = this.promptRuns.filter(\n p => p.AgentRunID != null && this.agentRunIdSet.has(p.AgentRunID)\n );\n\n this.Stats = {\n TotalRuns: total,\n TotalCost: totalCost,\n PromptRuns: linkedPromptRuns.length,\n AvgCostPerRun: total > 0 ? totalCost / total : 0,\n SuccessRate: total > 0 ? (successCount / total) * 100 : 0,\n AvgDurationSeconds: avgDuration\n };\n }\n\n private get agentRunIdSet(): Set<string> {\n return new Set(this.agentRuns.map(r => r.ID));\n }\n\n private computeCostAttribution(): void {\n const agentCostMap = new Map<string, { name: string; vendorCosts: Map<string, number>; totalCost: number }>();\n\n // Group prompt runs by agent run, then by vendor\n for (const pr of this.promptRuns) {\n if (!pr.AgentRunID) continue;\n const agentRun = this.agentRuns.find(ar => UUIDsEqual(ar.ID, pr.AgentRunID));\n if (!agentRun) continue;\n\n const agentKey = agentRun.AgentID;\n if (!agentCostMap.has(agentKey)) {\n agentCostMap.set(agentKey, {\n name: agentRun.Agent ?? 'Unknown',\n vendorCosts: new Map<string, number>(),\n totalCost: 0\n });\n }\n\n const entry = agentCostMap.get(agentKey)!;\n const vendor = pr.Vendor ?? 'Other';\n const cost = pr.Cost ?? pr.TotalCost ?? 0;\n entry.vendorCosts.set(vendor, (entry.vendorCosts.get(vendor) ?? 0) + cost);\n entry.totalCost += cost;\n }\n\n // Collect all vendors for consistent coloring\n const allVendors = new Set<string>();\n for (const entry of agentCostMap.values()) {\n for (const v of entry.vendorCosts.keys()) {\n allVendors.add(v);\n }\n }\n const vendorList = Array.from(allVendors);\n\n // Build legend\n this.LegendItems = vendorList.map((v, i) => ({\n Label: v,\n Color: COST_COLORS[i % COST_COLORS.length]\n }));\n\n // Sort by total cost descending\n const sorted = Array.from(agentCostMap.entries())\n .sort((a, b) => b[1].totalCost - a[1].totalCost);\n\n this.CostAttributionRows = sorted.map(([agentId, entry]) => {\n const segments: CostSegment[] = vendorList.map((vendor, i) => {\n const val = entry.vendorCosts.get(vendor) ?? 0;\n return {\n Label: vendor,\n Value: val,\n Percent: entry.totalCost > 0 ? (val / entry.totalCost) * 100 : 0,\n Color: COST_COLORS[i % COST_COLORS.length]\n };\n }).filter(s => s.Value > 0);\n\n return {\n AgentName: entry.name,\n AgentID: agentId,\n TotalCost: entry.totalCost,\n Segments: segments\n };\n });\n }\n\n private buildRecentRuns(): void {\n // Count prompt runs per agent run\n const promptCountMap = new Map<string, number>();\n for (const pr of this.promptRuns) {\n if (pr.AgentRunID) {\n promptCountMap.set(pr.AgentRunID, (promptCountMap.get(pr.AgentRunID) ?? 0) + 1);\n }\n }\n\n this.RecentRuns = this.agentRuns.slice(0, 100).map(r => ({\n ID: r.ID,\n Agent: r.Agent ?? 'Unknown',\n Status: r.Status,\n StatusClass: this.getStatusClass(r.Status),\n StepCount: promptCountMap.get(r.ID) ?? 0,\n Duration: this.formatDuration(r.StartedAt, r.CompletedAt),\n Cost: this.FormatCurrency(r.TotalCost ?? 0),\n Time: this.formatRelativeTime(r.StartedAt)\n }));\n }\n\n private sortRecentRuns(): void {\n const dir = this.SortDir === 'asc' ? 1 : -1;\n this.RecentRuns.sort((a, b) => {\n switch (this.SortField) {\n case 'Agent': return dir * a.Agent.localeCompare(b.Agent);\n case 'Status': return dir * a.Status.localeCompare(b.Status);\n case 'StepCount': return dir * (a.StepCount - b.StepCount);\n case 'Duration': return dir * a.Duration.localeCompare(b.Duration);\n case 'Cost': return dir * a.Cost.localeCompare(b.Cost);\n case 'Time': return dir * a.Time.localeCompare(b.Time);\n default: return 0;\n }\n });\n }\n\n // ── Helpers ──\n\n private buildDateFilter(field: string): string {\n const now = new Date();\n const ms = this.timeRangeToMs(this.TimeRange);\n const start = new Date(now.getTime() - ms);\n return `${field} >= '${start.toISOString()}'`;\n }\n\n private buildAgentFilter(): string {\n if (this.Filters.Agents.length === 0) return '';\n const ids = this.Filters.Agents.map(id => `'${id}'`).join(',');\n return `AgentID IN (${ids})`;\n }\n\n private buildStatusFilter(): string {\n if (this.Filters.Statuses.length === 0) return '';\n const values = this.Filters.Statuses.map(s => `'${s}'`).join(',');\n return `Status IN (${values})`;\n }\n\n private timeRangeToMs(range: string): number {\n const map: Record<string, number> = {\n '1h': 3600000,\n '6h': 21600000,\n '24h': 86400000,\n '7d': 604800000,\n '30d': 2592000000\n };\n return map[range] ?? 604800000;\n }\n\n private getStatusClass(status: string): string {\n return 'status-pill status-' + status.toLowerCase().replace(/\\s+/g, '');\n }\n\n private formatDuration(startStr: string, endStr: string | null): string {\n if (!endStr) return '--';\n const ms = new Date(endStr).getTime() - new Date(startStr).getTime();\n if (ms < 1000) return ms + 'ms';\n if (ms < 60000) return (ms / 1000).toFixed(1) + 's';\n return (ms / 60000).toFixed(1) + 'm';\n }\n\n private formatRelativeTime(dateStr: string): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diffMs = now - then;\n const diffMin = Math.floor(diffMs / 60000);\n if (diffMin < 1) return 'just now';\n if (diffMin < 60) return diffMin + 'm ago';\n const diffHr = Math.floor(diffMin / 60);\n if (diffHr < 24) return diffHr + 'h ago';\n const diffDay = Math.floor(diffHr / 24);\n return diffDay + 'd ago';\n }\n}\n\nexport function LoadAnalyticsAgentRuns() { /* tree-shaking prevention */ }\n"]}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* a cost breakdown treemap, and a detailed cost-by-model table with CSV export.
|
|
6
6
|
*/
|
|
7
7
|
import { EventEmitter, OnInit, OnDestroy } from '@angular/core';
|
|
8
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
8
9
|
import { GlobalFilterState } from '../../../interfaces/analytics-preferences.interface';
|
|
9
10
|
import * as i0 from "@angular/core";
|
|
10
11
|
interface CostKpi {
|
|
@@ -40,7 +41,7 @@ interface CostByModelRow {
|
|
|
40
41
|
TotalCost: number;
|
|
41
42
|
PercentOfTotal: number;
|
|
42
43
|
}
|
|
43
|
-
export declare class AnalyticsCostBudgetComponent implements OnInit, OnDestroy {
|
|
44
|
+
export declare class AnalyticsCostBudgetComponent extends BaseAngularComponent implements OnInit, OnDestroy {
|
|
44
45
|
TimeRange: string;
|
|
45
46
|
Filters: GlobalFilterState;
|
|
46
47
|
TimeRangeChange: EventEmitter<string>;
|