agentic-qe 2.3.1 → 2.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/README.md +1 -1
  3. package/dist/agents/CoverageAnalyzerAgent.d.ts.map +1 -1
  4. package/dist/agents/CoverageAnalyzerAgent.js +53 -27
  5. package/dist/agents/CoverageAnalyzerAgent.js.map +1 -1
  6. package/dist/agents/FlakyTestHunterAgent.d.ts +5 -0
  7. package/dist/agents/FlakyTestHunterAgent.d.ts.map +1 -1
  8. package/dist/agents/FlakyTestHunterAgent.js +20 -5
  9. package/dist/agents/FlakyTestHunterAgent.js.map +1 -1
  10. package/dist/agents/QualityGateAgent.js +44 -6
  11. package/dist/agents/QualityGateAgent.js.map +1 -1
  12. package/dist/cli/index.js +0 -0
  13. package/dist/cli/init/database-init.js +5 -0
  14. package/dist/cli/init/database-init.js.map +1 -1
  15. package/dist/core/memory/HNSWVectorMemory.js +1 -1
  16. package/dist/learning/PerformanceTracker.d.ts +9 -0
  17. package/dist/learning/PerformanceTracker.d.ts.map +1 -1
  18. package/dist/learning/PerformanceTracker.js +26 -2
  19. package/dist/learning/PerformanceTracker.js.map +1 -1
  20. package/dist/mcp/server-instructions.d.ts +1 -1
  21. package/dist/mcp/server-instructions.js +1 -1
  22. package/package.json +4 -2
  23. package/scripts/README.md +352 -0
  24. package/scripts/hooks/capture-task-learning.js +191 -0
  25. package/scripts/hooks/emit-task-complete.sh +35 -0
  26. package/scripts/hooks/emit-task-spawn.sh +27 -0
  27. package/.claude/agents/failing-agent.json +0 -9
  28. package/.claude/agents/test-agent.json +0 -9
  29. package/dist/App.d.ts +0 -5
  30. package/dist/App.d.ts.map +0 -1
  31. package/dist/App.js +0 -15
  32. package/dist/App.js.map +0 -1
  33. package/dist/cli/init/utils.d.ts +0 -183
  34. package/dist/cli/init/utils.d.ts.map +0 -1
  35. package/dist/cli/init/utils.js +0 -354
  36. package/dist/cli/init/utils.js.map +0 -1
  37. package/dist/components/Dashboard/Dashboard.d.ts +0 -4
  38. package/dist/components/Dashboard/Dashboard.d.ts.map +0 -1
  39. package/dist/components/Dashboard/Dashboard.js +0 -148
  40. package/dist/components/Dashboard/Dashboard.js.map +0 -1
  41. package/dist/components/Dashboard/DashboardHeader.d.ts +0 -4
  42. package/dist/components/Dashboard/DashboardHeader.d.ts.map +0 -1
  43. package/dist/components/Dashboard/DashboardHeader.js +0 -138
  44. package/dist/components/Dashboard/DashboardHeader.js.map +0 -1
  45. package/dist/contexts/DashboardContext.d.ts +0 -41
  46. package/dist/contexts/DashboardContext.d.ts.map +0 -1
  47. package/dist/contexts/DashboardContext.js +0 -187
  48. package/dist/contexts/DashboardContext.js.map +0 -1
  49. package/dist/core/transport/QUICTransport.d.ts +0 -320
  50. package/dist/core/transport/QUICTransport.d.ts.map +0 -1
  51. package/dist/core/transport/QUICTransport.js +0 -711
  52. package/dist/core/transport/QUICTransport.js.map +0 -1
  53. package/dist/learning/LearningPersistenceAdapter.d.ts +0 -84
  54. package/dist/learning/LearningPersistenceAdapter.d.ts.map +0 -1
  55. package/dist/learning/LearningPersistenceAdapter.js +0 -202
  56. package/dist/learning/LearningPersistenceAdapter.js.map +0 -1
  57. package/dist/learning/algorithms/QLearning.d.ts +0 -68
  58. package/dist/learning/algorithms/QLearning.d.ts.map +0 -1
  59. package/dist/learning/algorithms/QLearning.js +0 -116
  60. package/dist/learning/algorithms/QLearning.js.map +0 -1
  61. package/dist/mcp/handlers/advanced/requirements-generate-bdd.d.ts +0 -7
  62. package/dist/mcp/handlers/advanced/requirements-generate-bdd.d.ts.map +0 -1
  63. package/dist/mcp/handlers/advanced/requirements-generate-bdd.js +0 -267
  64. package/dist/mcp/handlers/advanced/requirements-generate-bdd.js.map +0 -1
  65. package/dist/mcp/handlers/advanced/requirements-validate.d.ts +0 -7
  66. package/dist/mcp/handlers/advanced/requirements-validate.d.ts.map +0 -1
  67. package/dist/mcp/handlers/advanced/requirements-validate.js +0 -175
  68. package/dist/mcp/handlers/advanced/requirements-validate.js.map +0 -1
  69. package/dist/mcp/handlers/analysis/performance-benchmark-run-handler.d.ts +0 -15
  70. package/dist/mcp/handlers/analysis/performance-benchmark-run-handler.d.ts.map +0 -1
  71. package/dist/mcp/handlers/analysis/performance-benchmark-run-handler.js +0 -43
  72. package/dist/mcp/handlers/analysis/performance-benchmark-run-handler.js.map +0 -1
  73. package/dist/mcp/handlers/analysis/performanceBenchmarkRun.d.ts +0 -58
  74. package/dist/mcp/handlers/analysis/performanceBenchmarkRun.d.ts.map +0 -1
  75. package/dist/mcp/handlers/analysis/performanceBenchmarkRun.js +0 -188
  76. package/dist/mcp/handlers/analysis/performanceBenchmarkRun.js.map +0 -1
  77. package/dist/mcp/handlers/optimize-tests.d.ts +0 -219
  78. package/dist/mcp/handlers/optimize-tests.d.ts.map +0 -1
  79. package/dist/mcp/handlers/optimize-tests.js +0 -533
  80. package/dist/mcp/handlers/optimize-tests.js.map +0 -1
  81. package/dist/mcp/handlers/predict-defects.d.ts +0 -194
  82. package/dist/mcp/handlers/predict-defects.d.ts.map +0 -1
  83. package/dist/mcp/handlers/predict-defects.js +0 -722
  84. package/dist/mcp/handlers/predict-defects.js.map +0 -1
  85. package/dist/mcp/handlers/prediction/regression-risk-analyze.d.ts +0 -199
  86. package/dist/mcp/handlers/prediction/regression-risk-analyze.d.ts.map +0 -1
  87. package/dist/mcp/handlers/prediction/regression-risk-analyze.js +0 -471
  88. package/dist/mcp/handlers/prediction/regression-risk-analyze.js.map +0 -1
  89. package/dist/mcp/handlers/quality/quality-decision-make.d.ts +0 -104
  90. package/dist/mcp/handlers/quality/quality-decision-make.d.ts.map +0 -1
  91. package/dist/mcp/handlers/quality/quality-decision-make.js +0 -408
  92. package/dist/mcp/handlers/quality/quality-decision-make.js.map +0 -1
  93. package/dist/mcp/handlers/quality/quality-gate-execute.d.ts +0 -160
  94. package/dist/mcp/handlers/quality/quality-gate-execute.d.ts.map +0 -1
  95. package/dist/mcp/handlers/quality/quality-gate-execute.js +0 -412
  96. package/dist/mcp/handlers/quality/quality-gate-execute.js.map +0 -1
  97. package/dist/mcp/handlers/quality/quality-policy-check.d.ts +0 -163
  98. package/dist/mcp/handlers/quality/quality-policy-check.d.ts.map +0 -1
  99. package/dist/mcp/handlers/quality/quality-policy-check.js +0 -455
  100. package/dist/mcp/handlers/quality/quality-policy-check.js.map +0 -1
  101. package/dist/mcp/handlers/quality/quality-risk-assess.d.ts +0 -123
  102. package/dist/mcp/handlers/quality/quality-risk-assess.d.ts.map +0 -1
  103. package/dist/mcp/handlers/quality/quality-risk-assess.js +0 -522
  104. package/dist/mcp/handlers/quality/quality-risk-assess.js.map +0 -1
  105. package/dist/mcp/handlers/quality/quality-validate-metrics.d.ts +0 -117
  106. package/dist/mcp/handlers/quality/quality-validate-metrics.d.ts.map +0 -1
  107. package/dist/mcp/handlers/quality/quality-validate-metrics.js +0 -288
  108. package/dist/mcp/handlers/quality/quality-validate-metrics.js.map +0 -1
  109. package/dist/mcp/handlers/quality-analyze.d.ts +0 -279
  110. package/dist/mcp/handlers/quality-analyze.d.ts.map +0 -1
  111. package/dist/mcp/handlers/quality-analyze.js +0 -720
  112. package/dist/mcp/handlers/quality-analyze.js.map +0 -1
  113. package/dist/mcp/handlers/security/check-authz.d.ts +0 -152
  114. package/dist/mcp/handlers/security/check-authz.d.ts.map +0 -1
  115. package/dist/mcp/handlers/security/check-authz.js +0 -434
  116. package/dist/mcp/handlers/security/check-authz.js.map +0 -1
  117. package/dist/mcp/handlers/security/scan-dependencies.d.ts +0 -148
  118. package/dist/mcp/handlers/security/scan-dependencies.d.ts.map +0 -1
  119. package/dist/mcp/handlers/security/scan-dependencies.js +0 -354
  120. package/dist/mcp/handlers/security/scan-dependencies.js.map +0 -1
  121. package/dist/mcp/handlers/security/validate-auth.d.ts +0 -128
  122. package/dist/mcp/handlers/security/validate-auth.d.ts.map +0 -1
  123. package/dist/mcp/handlers/security/validate-auth.js +0 -294
  124. package/dist/mcp/handlers/security/validate-auth.js.map +0 -1
  125. package/dist/mcp/handlers/test-generate.d.ts +0 -107
  126. package/dist/mcp/handlers/test-generate.d.ts.map +0 -1
  127. package/dist/mcp/handlers/test-generate.js +0 -454
  128. package/dist/mcp/handlers/test-generate.js.map +0 -1
@@ -1,148 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.Dashboard = void 0;
37
- const react_1 = __importStar(require("react"));
38
- const DashboardContext_1 = require("../../contexts/DashboardContext");
39
- const DashboardHeader_1 = require("./DashboardHeader");
40
- const MindMap_1 = require("../MindMap/MindMap");
41
- const QualityMetrics_1 = require("../QualityMetrics/QualityMetrics");
42
- const EventTimeline_1 = require("../EventTimeline/EventTimeline");
43
- require("./Dashboard.css");
44
- const TABS = [
45
- { id: 'overview', label: 'Overview', icon: '📊' },
46
- { id: 'mindmap', label: 'Mind Map', icon: '🗺️' },
47
- { id: 'metrics', label: 'Metrics', icon: '📈' },
48
- { id: 'timeline', label: 'Timeline', icon: '⏱️' },
49
- ];
50
- const Dashboard = () => {
51
- const { activeView, setActiveView, exportData, refreshData, filters } = (0, DashboardContext_1.useDashboard)();
52
- // Keyboard shortcuts
53
- (0, react_1.useEffect)(() => {
54
- const handleKeyboard = (e) => {
55
- if (e.ctrlKey || e.metaKey) {
56
- switch (e.key) {
57
- case 'e':
58
- e.preventDefault();
59
- exportData();
60
- break;
61
- case 'r':
62
- e.preventDefault();
63
- refreshData();
64
- break;
65
- case 'f':
66
- e.preventDefault();
67
- // Focus search input
68
- const searchInput = document.querySelector('.search-input');
69
- if (searchInput)
70
- searchInput.focus();
71
- break;
72
- case '1':
73
- e.preventDefault();
74
- setActiveView('overview');
75
- break;
76
- case '2':
77
- e.preventDefault();
78
- setActiveView('mindmap');
79
- break;
80
- case '3':
81
- e.preventDefault();
82
- setActiveView('metrics');
83
- break;
84
- case '4':
85
- e.preventDefault();
86
- setActiveView('timeline');
87
- break;
88
- }
89
- }
90
- };
91
- window.addEventListener('keydown', handleKeyboard);
92
- return () => window.removeEventListener('keydown', handleKeyboard);
93
- }, [exportData, refreshData, setActiveView]);
94
- const renderContent = () => {
95
- switch (activeView) {
96
- case 'overview':
97
- return (react_1.default.createElement("div", { className: "overview-grid" },
98
- react_1.default.createElement("div", { className: "overview-section" },
99
- react_1.default.createElement("h2", null, "Key Metrics"),
100
- react_1.default.createElement(QualityMetrics_1.QualityMetrics, { compact: true })),
101
- react_1.default.createElement("div", { className: "overview-section" },
102
- react_1.default.createElement("h2", null, "Recent Events"),
103
- react_1.default.createElement(EventTimeline_1.EventTimeline, { compact: true, maxItems: 10 })),
104
- react_1.default.createElement("div", { className: "overview-section full-width" },
105
- react_1.default.createElement("h2", null, "Agent Network"),
106
- react_1.default.createElement(MindMap_1.MindMap, { compact: true }))));
107
- case 'mindmap':
108
- return (react_1.default.createElement("div", { className: "full-view" },
109
- react_1.default.createElement(MindMap_1.MindMap, null)));
110
- case 'metrics':
111
- return (react_1.default.createElement("div", { className: "full-view" },
112
- react_1.default.createElement(QualityMetrics_1.QualityMetrics, null)));
113
- case 'timeline':
114
- return (react_1.default.createElement("div", { className: "full-view" },
115
- react_1.default.createElement(EventTimeline_1.EventTimeline, null)));
116
- default:
117
- return null;
118
- }
119
- };
120
- return (react_1.default.createElement("div", { className: "dashboard" },
121
- react_1.default.createElement(DashboardHeader_1.DashboardHeader, null),
122
- react_1.default.createElement("div", { className: "dashboard-tabs" }, TABS.map((tab) => (react_1.default.createElement("button", { key: tab.id, className: `tab-button ${activeView === tab.id ? 'active' : ''}`, onClick: () => setActiveView(tab.id) },
123
- react_1.default.createElement("span", { className: "tab-icon" }, tab.icon),
124
- react_1.default.createElement("span", { className: "tab-label" }, tab.label))))),
125
- react_1.default.createElement("div", { className: "dashboard-content" }, renderContent()),
126
- react_1.default.createElement("div", { className: "dashboard-footer" },
127
- react_1.default.createElement("div", { className: "footer-info" },
128
- react_1.default.createElement("span", null,
129
- "Filters: ",
130
- filters.sessionId ? '1 session' : 'All sessions',
131
- " \u2022",
132
- ' ',
133
- filters.agents.length > 0 ? `${filters.agents.length} agents` : 'All agents')),
134
- react_1.default.createElement("div", { className: "footer-shortcuts" },
135
- react_1.default.createElement("kbd", null, "Ctrl+E"),
136
- " Export \u2022",
137
- ' ',
138
- react_1.default.createElement("kbd", null, "Ctrl+R"),
139
- " Refresh \u2022",
140
- ' ',
141
- react_1.default.createElement("kbd", null, "Ctrl+F"),
142
- " Search \u2022",
143
- ' ',
144
- react_1.default.createElement("kbd", null, "Ctrl+1-4"),
145
- " Switch View"))));
146
- };
147
- exports.Dashboard = Dashboard;
148
- //# sourceMappingURL=Dashboard.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Dashboard.js","sourceRoot":"","sources":["../../../src/components/Dashboard/Dashboard.tsx"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import React from 'react';
2
- import './DashboardHeader.css';
3
- export declare const DashboardHeader: React.FC;
4
- //# sourceMappingURL=DashboardHeader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DashboardHeader.d.ts","sourceRoot":"","sources":["../../../src/components/Dashboard/DashboardHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAEnD,OAAO,uBAAuB,CAAC;AAS/B,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAuNnC,CAAC"}
@@ -1,138 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.DashboardHeader = void 0;
37
- const react_1 = __importStar(require("react"));
38
- const DashboardContext_1 = require("../../contexts/DashboardContext");
39
- require("./DashboardHeader.css");
40
- const DashboardHeader = () => {
41
- const { filters, updateFilters, resetFilters, wsConnected, exportData, refreshData, notifications, } = (0, DashboardContext_1.useDashboard)();
42
- const [sessions, setSessions] = (0, react_1.useState)([]);
43
- const [agents, setAgents] = (0, react_1.useState)([]);
44
- const [showFilters, setShowFilters] = (0, react_1.useState)(false);
45
- const [showNotifications, setShowNotifications] = (0, react_1.useState)(false);
46
- // Mock data - in real app, fetch from API
47
- (0, react_1.useEffect)(() => {
48
- setSessions([
49
- { id: 'session-1', name: 'Test Run #1', startTime: new Date('2025-11-21T10:00:00') },
50
- { id: 'session-2', name: 'Test Run #2', startTime: new Date('2025-11-21T11:00:00') },
51
- { id: 'session-3', name: 'Test Run #3', startTime: new Date('2025-11-21T12:00:00') },
52
- ]);
53
- setAgents(['test-generator', 'coverage-analyzer', 'performance-tester', 'security-scanner']);
54
- }, []);
55
- const unreadCount = notifications.filter((n) => !n.read).length;
56
- const handleTimeRangeChange = (range) => {
57
- const now = new Date();
58
- let start = null;
59
- switch (range) {
60
- case 'today':
61
- start = new Date(now.setHours(0, 0, 0, 0));
62
- break;
63
- case 'week':
64
- start = new Date(now.setDate(now.getDate() - 7));
65
- break;
66
- case 'month':
67
- start = new Date(now.setMonth(now.getMonth() - 1));
68
- break;
69
- }
70
- updateFilters({
71
- timeRange: { start, end: new Date() },
72
- });
73
- };
74
- const toggleAgent = (agent) => {
75
- const currentAgents = filters.agents;
76
- const newAgents = currentAgents.includes(agent)
77
- ? currentAgents.filter((a) => a !== agent)
78
- : [...currentAgents, agent];
79
- updateFilters({ agents: newAgents });
80
- };
81
- return (react_1.default.createElement("header", { className: "dashboard-header" },
82
- react_1.default.createElement("div", { className: "header-left" },
83
- react_1.default.createElement("h1", null, "AQE Dashboard"),
84
- react_1.default.createElement("div", { className: `ws-status ${wsConnected ? 'connected' : 'disconnected'}` },
85
- react_1.default.createElement("span", { className: "status-indicator" }),
86
- react_1.default.createElement("span", { className: "status-text" }, wsConnected ? 'Connected' : 'Disconnected'))),
87
- react_1.default.createElement("div", { className: "header-center" },
88
- react_1.default.createElement("div", { className: "filter-group" },
89
- react_1.default.createElement("label", null, "Session:"),
90
- react_1.default.createElement("select", { value: filters.sessionId || '', onChange: (e) => updateFilters({ sessionId: e.target.value || null }), className: "filter-select" },
91
- react_1.default.createElement("option", { value: "" }, "All Sessions"),
92
- sessions.map((session) => (react_1.default.createElement("option", { key: session.id, value: session.id }, session.name))))),
93
- react_1.default.createElement("div", { className: "filter-group" },
94
- react_1.default.createElement("label", null, "Time Range:"),
95
- react_1.default.createElement("select", { onChange: (e) => handleTimeRangeChange(e.target.value), className: "filter-select" },
96
- react_1.default.createElement("option", { value: "" }, "All Time"),
97
- react_1.default.createElement("option", { value: "today" }, "Today"),
98
- react_1.default.createElement("option", { value: "week" }, "Last 7 Days"),
99
- react_1.default.createElement("option", { value: "month" }, "Last 30 Days"),
100
- react_1.default.createElement("option", { value: "custom" }, "Custom Range"))),
101
- react_1.default.createElement("button", { className: "filter-toggle-btn", onClick: () => setShowFilters(!showFilters), title: "Toggle Filters (Ctrl+F)" },
102
- react_1.default.createElement("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "currentColor" },
103
- react_1.default.createElement("path", { d: "M3 4h14M6 8h8M8 12h4M10 16h0", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" })),
104
- "Filters")),
105
- react_1.default.createElement("div", { className: "header-right" },
106
- react_1.default.createElement("div", { className: "notification-container" },
107
- react_1.default.createElement("button", { className: "notification-btn", onClick: () => setShowNotifications(!showNotifications) },
108
- react_1.default.createElement("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "currentColor" },
109
- react_1.default.createElement("path", { d: "M10 2a6 6 0 016 6v3.586l1.707 1.707A1 1 0 0117 15h-4a3 3 0 01-6 0H3a1 1 0 01-.707-1.707L4 11.586V8a6 6 0 016-6z" })),
110
- unreadCount > 0 && react_1.default.createElement("span", { className: "notification-badge" }, unreadCount)),
111
- showNotifications && (react_1.default.createElement("div", { className: "notification-dropdown" },
112
- react_1.default.createElement("div", { className: "notification-header" },
113
- react_1.default.createElement("h3", null, "Notifications"),
114
- react_1.default.createElement("button", { onClick: () => setShowNotifications(false) }, "\u2715")),
115
- react_1.default.createElement("div", { className: "notification-list" }, notifications.length === 0 ? (react_1.default.createElement("div", { className: "notification-empty" }, "No notifications")) : (notifications.slice(0, 10).map((notif) => (react_1.default.createElement("div", { key: notif.id, className: `notification-item ${notif.type} ${notif.read ? 'read' : 'unread'}` },
116
- react_1.default.createElement("div", { className: "notification-content" },
117
- react_1.default.createElement("strong", null, notif.title),
118
- react_1.default.createElement("p", null, notif.message),
119
- react_1.default.createElement("span", { className: "notification-time" }, notif.timestamp.toLocaleTimeString())))))))))),
120
- react_1.default.createElement("button", { className: "action-btn", onClick: refreshData, title: "Refresh Data (Ctrl+R)" },
121
- react_1.default.createElement("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "currentColor" },
122
- react_1.default.createElement("path", { d: "M4 2a1 1 0 011 1v2.101a7.002 7.002 0 0111.601 2.566 1 1 0 11-1.885.666A5.002 5.002 0 005.999 7H9a1 1 0 010 2H4a1 1 0 01-1-1V3a1 1 0 011-1zm.008 9.057a1 1 0 011.276.61A5.002 5.002 0 0014.001 13H11a1 1 0 110-2h5a1 1 0 011 1v5a1 1 0 11-2 0v-2.101a7.002 7.002 0 01-11.601-2.566 1 1 0 01.61-1.276z" })),
123
- "Refresh"),
124
- react_1.default.createElement("button", { className: "action-btn", onClick: exportData, title: "Export Data (Ctrl+E)" },
125
- react_1.default.createElement("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "currentColor" },
126
- react_1.default.createElement("path", { d: "M3 17a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zm3.293-7.707a1 1 0 011.414 0L9 10.586V3a1 1 0 112 0v7.586l1.293-1.293a1 1 0 111.414 1.414l-3 3a1 1 0 01-1.414 0l-3-3a1 1 0 010-1.414z" })),
127
- "Export"),
128
- react_1.default.createElement("button", { className: "action-btn secondary", onClick: resetFilters, title: "Reset Filters" }, "Reset")),
129
- showFilters && (react_1.default.createElement("div", { className: "filters-panel" },
130
- react_1.default.createElement("h3", null, "Agent Filter"),
131
- react_1.default.createElement("div", { className: "agent-checkboxes" }, agents.map((agent) => (react_1.default.createElement("label", { key: agent, className: "agent-checkbox" },
132
- react_1.default.createElement("input", { type: "checkbox", checked: filters.agents.includes(agent), onChange: () => toggleAgent(agent) }),
133
- react_1.default.createElement("span", null, agent))))),
134
- react_1.default.createElement("h3", null, "Search"),
135
- react_1.default.createElement("input", { type: "text", placeholder: "Search events, metrics...", value: filters.searchTerm, onChange: (e) => updateFilters({ searchTerm: e.target.value }), className: "search-input" })))));
136
- };
137
- exports.DashboardHeader = DashboardHeader;
138
- //# sourceMappingURL=DashboardHeader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DashboardHeader.js","sourceRoot":"","sources":["../../../src/components/Dashboard/DashboardHeader.tsx"],"names":[],"mappings":"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"}
@@ -1,41 +0,0 @@
1
- import React from 'react';
2
- import { WebSocketClient } from '../services/websocket/WebSocketClient';
3
- export interface DashboardFilters {
4
- sessionId: string | null;
5
- timeRange: {
6
- start: Date | null;
7
- end: Date | null;
8
- };
9
- agents: string[];
10
- searchTerm: string;
11
- }
12
- export interface Notification {
13
- id: string;
14
- type: 'info' | 'success' | 'warning' | 'error';
15
- title: string;
16
- message: string;
17
- timestamp: Date;
18
- read: boolean;
19
- }
20
- interface DashboardContextValue {
21
- filters: DashboardFilters;
22
- updateFilters: (filters: Partial<DashboardFilters>) => void;
23
- resetFilters: () => void;
24
- wsClient: WebSocketClient | null;
25
- wsConnected: boolean;
26
- wsError: string | null;
27
- notifications: Notification[];
28
- addNotification: (notification: Omit<Notification, 'id' | 'timestamp' | 'read'>) => void;
29
- markNotificationRead: (id: string) => void;
30
- clearNotifications: () => void;
31
- activeView: 'overview' | 'mindmap' | 'metrics' | 'timeline';
32
- setActiveView: (view: 'overview' | 'mindmap' | 'metrics' | 'timeline') => void;
33
- exportData: () => void;
34
- refreshData: () => void;
35
- }
36
- export declare const DashboardProvider: React.FC<{
37
- children: React.ReactNode;
38
- }>;
39
- export declare const useDashboard: () => DashboardContextValue;
40
- export {};
41
- //# sourceMappingURL=DashboardContext.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DashboardContext.d.ts","sourceRoot":"","sources":["../../src/contexts/DashboardContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsE,MAAM,OAAO,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAExE,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE;QACT,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;QACnB,GAAG,EAAE,IAAI,GAAG,IAAI,CAAC;KAClB,CAAC;IACF,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,UAAU,qBAAqB;IAE7B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,aAAa,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAC5D,YAAY,EAAE,MAAM,IAAI,CAAC;IAGzB,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAGvB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,eAAe,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,WAAW,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC;IACzF,oBAAoB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAG/B,UAAU,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IAC5D,aAAa,EAAE,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,KAAK,IAAI,CAAC;IAG/E,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAcD,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,CAqJrE,CAAC;AAEF,eAAO,MAAM,YAAY,QAAO,qBAM/B,CAAC"}
@@ -1,187 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.useDashboard = exports.DashboardProvider = void 0;
37
- const react_1 = __importStar(require("react"));
38
- const WebSocketClient_1 = require("../services/websocket/WebSocketClient");
39
- const DashboardContext = (0, react_1.createContext)(undefined);
40
- const DEFAULT_FILTERS = {
41
- sessionId: null,
42
- timeRange: {
43
- start: null,
44
- end: null,
45
- },
46
- agents: [],
47
- searchTerm: '',
48
- };
49
- const DashboardProvider = ({ children }) => {
50
- const [filters, setFilters] = (0, react_1.useState)(DEFAULT_FILTERS);
51
- const [wsClient, setWsClient] = (0, react_1.useState)(null);
52
- const [wsConnected, setWsConnected] = (0, react_1.useState)(false);
53
- const [wsError, setWsError] = (0, react_1.useState)(null);
54
- const [notifications, setNotifications] = (0, react_1.useState)([]);
55
- const [activeView, setActiveView] = (0, react_1.useState)('overview');
56
- // Initialize WebSocket connection
57
- (0, react_1.useEffect)(() => {
58
- const client = new WebSocketClient_1.WebSocketClient({
59
- url: process.env.REACT_APP_WS_URL || 'ws://localhost:8081',
60
- reconnectInterval: 3000,
61
- maxReconnectAttempts: 5,
62
- });
63
- client.on('connect', () => {
64
- setWsConnected(true);
65
- setWsError(null);
66
- addNotification({
67
- type: 'success',
68
- title: 'Connected',
69
- message: 'WebSocket connection established',
70
- });
71
- });
72
- client.on('disconnect', () => {
73
- setWsConnected(false);
74
- addNotification({
75
- type: 'warning',
76
- title: 'Disconnected',
77
- message: 'WebSocket connection lost',
78
- });
79
- });
80
- client.on('error', (error) => {
81
- setWsError(error.message);
82
- addNotification({
83
- type: 'error',
84
- title: 'Connection Error',
85
- message: error.message,
86
- });
87
- });
88
- client.on('event', (event) => {
89
- // Notify on important events
90
- if (event.metadata?.severity === 'high' || event.metadata?.quality_gate_failed) {
91
- addNotification({
92
- type: event.metadata.quality_gate_failed ? 'error' : 'warning',
93
- title: `Event: ${event.type}`,
94
- message: event.metadata.quality_gate_failed
95
- ? `Quality gate violation: ${event.metadata.quality_gate_name}`
96
- : event.description || 'New event received',
97
- });
98
- }
99
- });
100
- client.connect();
101
- setWsClient(client);
102
- return () => {
103
- client.disconnect();
104
- };
105
- }, []);
106
- const updateFilters = (0, react_1.useCallback)((newFilters) => {
107
- setFilters((prev) => ({ ...prev, ...newFilters }));
108
- }, []);
109
- const resetFilters = (0, react_1.useCallback)(() => {
110
- setFilters(DEFAULT_FILTERS);
111
- }, []);
112
- const addNotification = (0, react_1.useCallback)((notification) => {
113
- const newNotification = {
114
- ...notification,
115
- id: `notif-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
116
- timestamp: new Date(),
117
- read: false,
118
- };
119
- setNotifications((prev) => [newNotification, ...prev].slice(0, 50)); // Keep last 50
120
- }, []);
121
- const markNotificationRead = (0, react_1.useCallback)((id) => {
122
- setNotifications((prev) => prev.map((notif) => (notif.id === id ? { ...notif, read: true } : notif)));
123
- }, []);
124
- const clearNotifications = (0, react_1.useCallback)(() => {
125
- setNotifications([]);
126
- }, []);
127
- const exportData = (0, react_1.useCallback)(() => {
128
- // Export all data to JSON
129
- const data = {
130
- filters,
131
- notifications,
132
- timestamp: new Date().toISOString(),
133
- };
134
- const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });
135
- const url = URL.createObjectURL(blob);
136
- const a = document.createElement('a');
137
- a.href = url;
138
- a.download = `dashboard-export-${new Date().toISOString()}.json`;
139
- document.body.appendChild(a);
140
- a.click();
141
- document.body.removeChild(a);
142
- URL.revokeObjectURL(url);
143
- addNotification({
144
- type: 'success',
145
- title: 'Export Complete',
146
- message: 'Dashboard data exported successfully',
147
- });
148
- }, [filters, notifications, addNotification]);
149
- const refreshData = (0, react_1.useCallback)(() => {
150
- // Trigger refresh event
151
- if (wsClient && wsConnected) {
152
- wsClient.send({ type: 'refresh', timestamp: new Date().toISOString() });
153
- }
154
- addNotification({
155
- type: 'info',
156
- title: 'Refreshing',
157
- message: 'Data refresh requested',
158
- });
159
- }, [wsClient, wsConnected, addNotification]);
160
- const value = {
161
- filters,
162
- updateFilters,
163
- resetFilters,
164
- wsClient,
165
- wsConnected,
166
- wsError,
167
- notifications,
168
- addNotification,
169
- markNotificationRead,
170
- clearNotifications,
171
- activeView,
172
- setActiveView,
173
- exportData,
174
- refreshData,
175
- };
176
- return react_1.default.createElement(DashboardContext.Provider, { value: value }, children);
177
- };
178
- exports.DashboardProvider = DashboardProvider;
179
- const useDashboard = () => {
180
- const context = (0, react_1.useContext)(DashboardContext);
181
- if (context === undefined) {
182
- throw new Error('useDashboard must be used within a DashboardProvider');
183
- }
184
- return context;
185
- };
186
- exports.useDashboard = useDashboard;
187
- //# sourceMappingURL=DashboardContext.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DashboardContext.js","sourceRoot":"","sources":["../../src/contexts/DashboardContext.tsx"],"names":[],"mappings":"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"}