claude-mpm 4.2.44__py3-none-any.whl → 4.2.51__py3-none-any.whl

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 (148) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +43 -1
  3. claude_mpm/agents/INSTRUCTIONS.md +75 -1
  4. claude_mpm/agents/WORKFLOW.md +46 -1
  5. claude_mpm/agents/frontmatter_validator.py +20 -12
  6. claude_mpm/agents/templates/nextjs_engineer.json +277 -0
  7. claude_mpm/agents/templates/python_engineer.json +289 -0
  8. claude_mpm/agents/templates/react_engineer.json +11 -3
  9. claude_mpm/agents/templates/security.json +50 -9
  10. claude_mpm/cli/commands/agents.py +2 -2
  11. claude_mpm/cli/commands/uninstall.py +1 -2
  12. claude_mpm/cli/interactive/agent_wizard.py +3 -3
  13. claude_mpm/cli/parsers/agent_manager_parser.py +3 -3
  14. claude_mpm/cli/parsers/agents_parser.py +1 -1
  15. claude_mpm/constants.py +1 -1
  16. claude_mpm/core/error_handler.py +2 -4
  17. claude_mpm/core/file_utils.py +4 -12
  18. claude_mpm/core/log_manager.py +8 -5
  19. claude_mpm/core/logger.py +1 -1
  20. claude_mpm/core/logging_utils.py +6 -6
  21. claude_mpm/core/unified_agent_registry.py +18 -4
  22. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +188 -0
  23. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +156 -0
  24. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +38 -0
  25. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +92 -0
  26. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +248 -0
  27. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +61 -0
  28. claude_mpm/dashboard/static/archive/test_activity_connection.html +179 -0
  29. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +68 -0
  30. claude_mpm/dashboard/static/archive/test_dashboard.html +409 -0
  31. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +519 -0
  32. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +181 -0
  33. claude_mpm/dashboard/static/archive/test_file_data.html +315 -0
  34. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +243 -0
  35. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +234 -0
  36. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +117 -0
  37. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +115 -0
  38. claude_mpm/dashboard/static/archive/test_file_viewer.html +224 -0
  39. claude_mpm/dashboard/static/archive/test_final_activity.html +220 -0
  40. claude_mpm/dashboard/static/archive/test_tab_fix.html +139 -0
  41. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +1 -0
  42. claude_mpm/dashboard/static/built/components/activity-tree.js +1 -1
  43. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +777 -0
  44. claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
  45. claude_mpm/dashboard/static/built/components/build-tracker.js +333 -0
  46. claude_mpm/dashboard/static/built/components/code-simple.js +857 -0
  47. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +353 -0
  48. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +235 -0
  49. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +409 -0
  50. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +435 -0
  51. claude_mpm/dashboard/static/built/components/code-viewer.js +2 -1076
  52. claude_mpm/dashboard/static/built/components/connection-debug.js +654 -0
  53. claude_mpm/dashboard/static/built/components/diff-viewer.js +891 -0
  54. claude_mpm/dashboard/static/built/components/event-processor.js +1 -1
  55. claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
  56. claude_mpm/dashboard/static/built/components/export-manager.js +1 -1
  57. claude_mpm/dashboard/static/built/components/file-change-tracker.js +443 -0
  58. claude_mpm/dashboard/static/built/components/file-change-viewer.js +690 -0
  59. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
  60. claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
  61. claude_mpm/dashboard/static/built/components/nav-bar.js +145 -0
  62. claude_mpm/dashboard/static/built/components/page-structure.js +429 -0
  63. claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
  64. claude_mpm/dashboard/static/built/components/ui-state-manager.js +2 -465
  65. claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
  66. claude_mpm/dashboard/static/built/connection-manager.js +536 -0
  67. claude_mpm/dashboard/static/built/dashboard.js +1 -1
  68. claude_mpm/dashboard/static/built/extension-error-handler.js +164 -0
  69. claude_mpm/dashboard/static/built/react/events.js +30 -0
  70. claude_mpm/dashboard/static/built/shared/dom-helpers.js +396 -0
  71. claude_mpm/dashboard/static/built/shared/event-bus.js +330 -0
  72. claude_mpm/dashboard/static/built/shared/event-filter-service.js +540 -0
  73. claude_mpm/dashboard/static/built/shared/logger.js +385 -0
  74. claude_mpm/dashboard/static/built/shared/page-structure.js +251 -0
  75. claude_mpm/dashboard/static/built/shared/tooltip-service.js +253 -0
  76. claude_mpm/dashboard/static/built/socket-client.js +1 -1
  77. claude_mpm/dashboard/static/built/tab-isolation-fix.js +185 -0
  78. claude_mpm/dashboard/static/css/dashboard.css +28 -5
  79. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
  80. claude_mpm/dashboard/static/dist/components/activity-tree.js +1 -1
  81. claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
  82. claude_mpm/dashboard/static/dist/components/code-viewer.js +2 -0
  83. claude_mpm/dashboard/static/dist/components/event-processor.js +1 -1
  84. claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
  85. claude_mpm/dashboard/static/dist/components/export-manager.js +1 -1
  86. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +1 -1
  87. claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
  88. claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
  89. claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
  90. claude_mpm/dashboard/static/dist/dashboard.js +1 -1
  91. claude_mpm/dashboard/static/dist/react/events.js +30 -0
  92. claude_mpm/dashboard/static/dist/socket-client.js +1 -1
  93. claude_mpm/dashboard/static/events.html +607 -0
  94. claude_mpm/dashboard/static/index.html +713 -0
  95. claude_mpm/dashboard/static/js/components/activity-tree.js +3 -17
  96. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +4 -1
  97. claude_mpm/dashboard/static/js/components/agent-inference.js +3 -0
  98. claude_mpm/dashboard/static/js/components/build-tracker.js +8 -0
  99. claude_mpm/dashboard/static/js/components/code-viewer.js +306 -66
  100. claude_mpm/dashboard/static/js/components/event-processor.js +3 -0
  101. claude_mpm/dashboard/static/js/components/event-viewer.js +39 -2
  102. claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
  103. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +30 -10
  104. claude_mpm/dashboard/static/js/components/socket-manager.js +4 -0
  105. claude_mpm/dashboard/static/js/components/ui-state-manager.js +285 -85
  106. claude_mpm/dashboard/static/js/components/working-directory.js +3 -0
  107. claude_mpm/dashboard/static/js/dashboard.js +61 -33
  108. claude_mpm/dashboard/static/js/socket-client.js +12 -8
  109. claude_mpm/dashboard/static/js/stores/dashboard-store.js +562 -0
  110. claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
  111. claude_mpm/dashboard/static/legacy/activity.html +736 -0
  112. claude_mpm/dashboard/static/legacy/agents.html +786 -0
  113. claude_mpm/dashboard/static/legacy/files.html +747 -0
  114. claude_mpm/dashboard/static/legacy/tools.html +831 -0
  115. claude_mpm/dashboard/static/monitors-index.html +218 -0
  116. claude_mpm/dashboard/static/monitors.html +431 -0
  117. claude_mpm/dashboard/static/production/events.html +659 -0
  118. claude_mpm/dashboard/static/production/main.html +715 -0
  119. claude_mpm/dashboard/static/production/monitors.html +483 -0
  120. claude_mpm/dashboard/static/socket.io.min.js +7 -0
  121. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
  122. claude_mpm/dashboard/static/test-archive/dashboard.html +635 -0
  123. claude_mpm/dashboard/static/test-archive/debug-events.html +147 -0
  124. claude_mpm/dashboard/static/test-archive/test-navigation.html +256 -0
  125. claude_mpm/dashboard/static/test-archive/test-react-exports.html +180 -0
  126. claude_mpm/dashboard/templates/index.html +79 -9
  127. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +1 -1
  128. claude_mpm/services/agents/deployment/agent_discovery_service.py +3 -0
  129. claude_mpm/services/agents/deployment/agent_template_builder.py +25 -8
  130. claude_mpm/services/agents/deployment/agent_validator.py +3 -0
  131. claude_mpm/services/agents/deployment/validation/template_validator.py +13 -4
  132. claude_mpm/services/agents/local_template_manager.py +2 -6
  133. claude_mpm/services/monitor/daemon.py +1 -2
  134. claude_mpm/services/monitor/daemon_manager.py +2 -5
  135. claude_mpm/services/monitor/event_emitter.py +2 -2
  136. claude_mpm/services/monitor/handlers/code_analysis.py +4 -6
  137. claude_mpm/services/monitor/handlers/hooks.py +2 -4
  138. claude_mpm/services/monitor/server.py +27 -4
  139. claude_mpm/tools/code_tree_analyzer.py +2 -2
  140. {claude_mpm-4.2.44.dist-info → claude_mpm-4.2.51.dist-info}/METADATA +1 -1
  141. {claude_mpm-4.2.44.dist-info → claude_mpm-4.2.51.dist-info}/RECORD +146 -81
  142. claude_mpm/dashboard/static/test-browser-monitor.html +0 -470
  143. claude_mpm/dashboard/static/test-simple.html +0 -97
  144. /claude_mpm/dashboard/static/{test_debug.html → test-archive/test_debug.html} +0 -0
  145. {claude_mpm-4.2.44.dist-info → claude_mpm-4.2.51.dist-info}/WHEEL +0 -0
  146. {claude_mpm-4.2.44.dist-info → claude_mpm-4.2.51.dist-info}/entry_points.txt +0 -0
  147. {claude_mpm-4.2.44.dist-info → claude_mpm-4.2.51.dist-info}/licenses/LICENSE +0 -0
  148. {claude_mpm-4.2.44.dist-info → claude_mpm-4.2.51.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,353 @@
1
+ /**
2
+ * Tree Breadcrumb Navigation
3
+ *
4
+ * Breadcrumb navigation and status display for the code tree.
5
+ * Provides path navigation and activity status updates.
6
+ *
7
+ * @module tree-breadcrumb
8
+ */
9
+
10
+ class TreeBreadcrumb {
11
+ constructor() {
12
+ this.container = null;
13
+ this.pathElement = null;
14
+ this.statusElement = null;
15
+ this.currentPath = '/';
16
+ this.workingDirectory = null;
17
+ this.navigationCallback = null;
18
+ this.maxSegments = 10;
19
+ }
20
+
21
+ /**
22
+ * Initialize breadcrumb component
23
+ * @param {string} containerId - Container element ID
24
+ * @param {Object} options - Configuration options
25
+ */
26
+ initialize(containerId, options = {}) {
27
+ this.container = document.getElementById(containerId);
28
+ if (!this.container) {
29
+ console.error(`Breadcrumb container not found: ${containerId}`);
30
+ return;
31
+ }
32
+
33
+ // Set options
34
+ this.maxSegments = options.maxSegments || 10;
35
+ this.navigationCallback = options.onNavigate || null;
36
+
37
+ // Create breadcrumb structure
38
+ this.createBreadcrumbStructure();
39
+ }
40
+
41
+ /**
42
+ * Create breadcrumb DOM structure
43
+ */
44
+ createBreadcrumbStructure() {
45
+ // Clear existing content
46
+ this.container.innerHTML = '';
47
+
48
+ // Create path navigation
49
+ const pathContainer = document.createElement('div');
50
+ pathContainer.className = 'tree-breadcrumb-path-container';
51
+
52
+ this.pathElement = document.createElement('div');
53
+ this.pathElement.id = 'tree-breadcrumb-path';
54
+ this.pathElement.className = 'tree-breadcrumb-path';
55
+ pathContainer.appendChild(this.pathElement);
56
+
57
+ // Create status/activity display
58
+ const statusContainer = document.createElement('div');
59
+ statusContainer.className = 'tree-breadcrumb-status-container';
60
+
61
+ this.statusElement = document.createElement('div');
62
+ this.statusElement.id = 'breadcrumb-content';
63
+ this.statusElement.className = 'breadcrumb-content';
64
+ statusContainer.appendChild(this.statusElement);
65
+
66
+ // Add to container
67
+ this.container.appendChild(pathContainer);
68
+ this.container.appendChild(statusContainer);
69
+ }
70
+
71
+ /**
72
+ * Set working directory
73
+ * @param {string} directory - Working directory path
74
+ */
75
+ setWorkingDirectory(directory) {
76
+ this.workingDirectory = directory;
77
+ this.updatePath(this.currentPath);
78
+ }
79
+
80
+ /**
81
+ * Update breadcrumb path
82
+ * @param {string} path - Current navigation path
83
+ */
84
+ updatePath(path) {
85
+ this.currentPath = path || '/';
86
+
87
+ if (!this.pathElement) return;
88
+
89
+ // Clear existing path
90
+ this.pathElement.innerHTML = '';
91
+
92
+ if (!this.workingDirectory ||
93
+ this.workingDirectory === 'Loading...' ||
94
+ this.workingDirectory === 'Not selected') {
95
+ this.pathElement.textContent = 'No project selected';
96
+ return;
97
+ }
98
+
99
+ // Build path segments
100
+ const segments = this.buildSegments(this.currentPath);
101
+
102
+ // Create clickable segments
103
+ segments.forEach((segment, index) => {
104
+ if (index > 0) {
105
+ const separator = document.createElement('span');
106
+ separator.className = 'breadcrumb-separator';
107
+ separator.textContent = '/';
108
+ this.pathElement.appendChild(separator);
109
+ }
110
+
111
+ const segmentElement = document.createElement('span');
112
+ segmentElement.className = index === segments.length - 1 ?
113
+ 'breadcrumb-segment current' : 'breadcrumb-segment';
114
+ segmentElement.textContent = segment.name;
115
+
116
+ // Add click handler for non-current segments
117
+ if (index < segments.length - 1) {
118
+ segmentElement.style.cursor = 'pointer';
119
+ segmentElement.addEventListener('click', () => {
120
+ this.navigateToSegment(segment.path);
121
+ });
122
+
123
+ // Add hover effect
124
+ segmentElement.addEventListener('mouseenter', () => {
125
+ segmentElement.classList.add('hover');
126
+ });
127
+ segmentElement.addEventListener('mouseleave', () => {
128
+ segmentElement.classList.remove('hover');
129
+ });
130
+ }
131
+
132
+ this.pathElement.appendChild(segmentElement);
133
+ });
134
+
135
+ // Add overflow handling for long paths
136
+ this.handlePathOverflow();
137
+ }
138
+
139
+ /**
140
+ * Build path segments from current path
141
+ * @param {string} path - Current path
142
+ * @returns {Array} Array of segment objects
143
+ */
144
+ buildSegments(path) {
145
+ const segments = [];
146
+
147
+ // Add root/project segment
148
+ const projectName = this.workingDirectory.split('/').pop() || 'Root';
149
+ segments.push({
150
+ name: projectName,
151
+ path: '/'
152
+ });
153
+
154
+ // Add path segments if not at root
155
+ if (path && path !== '/') {
156
+ const pathParts = path.split('/').filter(p => p.length > 0);
157
+ let currentPath = '';
158
+
159
+ pathParts.forEach(part => {
160
+ currentPath += '/' + part;
161
+ segments.push({
162
+ name: part,
163
+ path: currentPath
164
+ });
165
+ });
166
+ }
167
+
168
+ // Truncate if too many segments
169
+ if (segments.length > this.maxSegments) {
170
+ const truncated = [
171
+ segments[0],
172
+ { name: '...', path: null },
173
+ ...segments.slice(-(this.maxSegments - 2))
174
+ ];
175
+ return truncated;
176
+ }
177
+
178
+ return segments;
179
+ }
180
+
181
+ /**
182
+ * Navigate to a path segment
183
+ * @param {string} path - Path to navigate to
184
+ */
185
+ navigateToSegment(path) {
186
+ if (path === null) return; // Skip ellipsis
187
+
188
+ this.currentPath = path;
189
+ this.updatePath(path);
190
+
191
+ // Call navigation callback if provided
192
+ if (this.navigationCallback) {
193
+ this.navigationCallback(path);
194
+ }
195
+
196
+ // Dispatch custom event
197
+ const event = new CustomEvent('breadcrumbNavigation', {
198
+ detail: { path }
199
+ });
200
+ document.dispatchEvent(event);
201
+ }
202
+
203
+ /**
204
+ * Update status/activity message
205
+ * @param {string} message - Status message
206
+ * @param {string} type - Message type (info/success/warning/error)
207
+ */
208
+ updateStatus(message, type = 'info') {
209
+ if (!this.statusElement) return;
210
+
211
+ this.statusElement.textContent = message;
212
+ this.statusElement.className = `breadcrumb-content breadcrumb-${type}`;
213
+
214
+ // Add fade animation for status changes
215
+ this.statusElement.style.animation = 'none';
216
+ setTimeout(() => {
217
+ this.statusElement.style.animation = 'fadeIn 0.3s ease-in';
218
+ }, 10);
219
+ }
220
+
221
+ /**
222
+ * Update activity ticker with rotating messages
223
+ * @param {string} message - Activity message
224
+ * @param {string} type - Message type
225
+ */
226
+ updateActivityTicker(message, type = 'info') {
227
+ this.updateStatus(message, type);
228
+
229
+ // Optional: Add to activity history
230
+ if (!this.activityHistory) {
231
+ this.activityHistory = [];
232
+ }
233
+
234
+ this.activityHistory.push({
235
+ message,
236
+ type,
237
+ timestamp: Date.now()
238
+ });
239
+
240
+ // Keep only last 100 activities
241
+ if (this.activityHistory.length > 100) {
242
+ this.activityHistory.shift();
243
+ }
244
+ }
245
+
246
+ /**
247
+ * Handle path overflow for long paths
248
+ */
249
+ handlePathOverflow() {
250
+ if (!this.pathElement) return;
251
+
252
+ // Check if path overflows
253
+ if (this.pathElement.scrollWidth > this.pathElement.clientWidth) {
254
+ // Add scroll buttons or implement horizontal scroll
255
+ this.pathElement.style.overflowX = 'auto';
256
+ this.pathElement.classList.add('overflow');
257
+ } else {
258
+ this.pathElement.style.overflowX = 'hidden';
259
+ this.pathElement.classList.remove('overflow');
260
+ }
261
+ }
262
+
263
+ /**
264
+ * Show loading state
265
+ * @param {string} message - Loading message
266
+ */
267
+ showLoading(message = 'Loading...') {
268
+ this.updateStatus(message, 'info');
269
+
270
+ // Add loading spinner if needed
271
+ if (this.statusElement) {
272
+ const spinner = document.createElement('span');
273
+ spinner.className = 'breadcrumb-spinner';
274
+ spinner.innerHTML = ' ⏳';
275
+ this.statusElement.appendChild(spinner);
276
+ }
277
+ }
278
+
279
+ /**
280
+ * Hide loading state
281
+ */
282
+ hideLoading() {
283
+ if (this.statusElement) {
284
+ const spinner = this.statusElement.querySelector('.breadcrumb-spinner');
285
+ if (spinner) {
286
+ spinner.remove();
287
+ }
288
+ }
289
+ }
290
+
291
+ /**
292
+ * Get current path
293
+ * @returns {string} Current path
294
+ */
295
+ getCurrentPath() {
296
+ return this.currentPath;
297
+ }
298
+
299
+ /**
300
+ * Get activity history
301
+ * @returns {Array} Activity history
302
+ */
303
+ getActivityHistory() {
304
+ return this.activityHistory || [];
305
+ }
306
+
307
+ /**
308
+ * Clear breadcrumb
309
+ */
310
+ clear() {
311
+ this.currentPath = '/';
312
+ this.workingDirectory = null;
313
+
314
+ if (this.pathElement) {
315
+ this.pathElement.innerHTML = '';
316
+ }
317
+
318
+ if (this.statusElement) {
319
+ this.statusElement.textContent = '';
320
+ this.statusElement.className = 'breadcrumb-content';
321
+ }
322
+
323
+ this.activityHistory = [];
324
+ }
325
+
326
+ /**
327
+ * Destroy breadcrumb component
328
+ */
329
+ destroy() {
330
+ this.clear();
331
+
332
+ if (this.container) {
333
+ this.container.innerHTML = '';
334
+ }
335
+
336
+ this.container = null;
337
+ this.pathElement = null;
338
+ this.statusElement = null;
339
+ this.navigationCallback = null;
340
+ }
341
+ }
342
+
343
+ // Export as singleton for consistent state
344
+ const treeBreadcrumb = new TreeBreadcrumb();
345
+
346
+ // Support both module and global usage
347
+ if (typeof module !== 'undefined' && module.exports) {
348
+ module.exports = treeBreadcrumb;
349
+ } else if (typeof define === 'function' && define.amd) {
350
+ define([], () => treeBreadcrumb);
351
+ } else {
352
+ window.treeBreadcrumb = treeBreadcrumb;
353
+ }
@@ -0,0 +1,235 @@
1
+ /**
2
+ * Tree Constants and Configuration
3
+ *
4
+ * Constants and default configurations for the code tree visualization.
5
+ *
6
+ * @module tree-constants
7
+ */
8
+
9
+ const treeConstants = {
10
+ // Layout dimensions
11
+ DEFAULT_MARGIN: { top: 20, right: 20, bottom: 20, left: 20 },
12
+ DEFAULT_WIDTH: 960,
13
+ DEFAULT_HEIGHT: 600,
14
+
15
+ // Animation settings
16
+ ANIMATION_DURATION: 750,
17
+ TOOLTIP_FADE_DURATION: 200,
18
+ TOOLTIP_HIDE_DELAY: 500,
19
+
20
+ // Node visualization
21
+ NODE_RADIUS: {
22
+ DEFAULT: 6,
23
+ SMALL: 4,
24
+ LARGE: 8,
25
+ EXPANDED: 10
26
+ },
27
+
28
+ // Colors
29
+ COLORS: {
30
+ // Complexity colors
31
+ COMPLEXITY_LOW: '#52c41a', // Green
32
+ COMPLEXITY_MEDIUM: '#faad14', // Orange
33
+ COMPLEXITY_HIGH: '#f5222d', // Red
34
+
35
+ // Node state colors
36
+ NODE_DEFAULT: '#69b7ff',
37
+ NODE_SELECTED: '#1890ff',
38
+ NODE_HOVER: '#40a9ff',
39
+ NODE_LOADING: '#ffc53d',
40
+ NODE_ERROR: '#ff4d4f',
41
+
42
+ // Link colors
43
+ LINK_DEFAULT: '#d9d9d9',
44
+ LINK_SELECTED: '#1890ff',
45
+
46
+ // Text colors
47
+ TEXT_PRIMARY: '#262626',
48
+ TEXT_SECONDARY: '#8c8c8c',
49
+ TEXT_DISABLED: '#bfbfbf'
50
+ },
51
+
52
+ // Tree layout
53
+ TREE_LAYOUT: {
54
+ NODE_SIZE: [100, 40],
55
+ SEPARATION: (a, b) => (a.parent === b.parent ? 1 : 2),
56
+ RADIAL_SEPARATION: (a, b) => (a.parent === b.parent ? 1 : 2) / a.depth
57
+ },
58
+
59
+ // File type mappings
60
+ LANGUAGE_EXTENSIONS: {
61
+ 'py': 'python',
62
+ 'js': 'javascript',
63
+ 'ts': 'typescript',
64
+ 'jsx': 'javascript',
65
+ 'tsx': 'typescript',
66
+ 'java': 'java',
67
+ 'c': 'c',
68
+ 'cpp': 'cpp',
69
+ 'cs': 'csharp',
70
+ 'go': 'go',
71
+ 'rs': 'rust',
72
+ 'rb': 'ruby',
73
+ 'php': 'php',
74
+ 'swift': 'swift',
75
+ 'kt': 'kotlin',
76
+ 'scala': 'scala',
77
+ 'r': 'r',
78
+ 'lua': 'lua',
79
+ 'dart': 'dart',
80
+ 'html': 'html',
81
+ 'css': 'css',
82
+ 'scss': 'scss',
83
+ 'sass': 'sass',
84
+ 'less': 'less',
85
+ 'json': 'json',
86
+ 'xml': 'xml',
87
+ 'yaml': 'yaml',
88
+ 'yml': 'yaml',
89
+ 'toml': 'toml',
90
+ 'ini': 'ini',
91
+ 'sql': 'sql',
92
+ 'sh': 'shell',
93
+ 'bash': 'bash',
94
+ 'ps1': 'powershell',
95
+ 'bat': 'batch',
96
+ 'md': 'markdown'
97
+ },
98
+
99
+ // Default filters
100
+ DEFAULT_FILTERS: {
101
+ language: 'all',
102
+ searchTerm: '',
103
+ minComplexity: 0,
104
+ maxComplexity: 999,
105
+ showHidden: false
106
+ },
107
+
108
+ // API endpoints
109
+ API_ENDPOINTS: {
110
+ FILE_READ: '/api/file/read',
111
+ ANALYZE_FILE: '/api/analyze/file',
112
+ ANALYZE_DIRECTORY: '/api/analyze/directory',
113
+ SEARCH: '/api/search'
114
+ },
115
+
116
+ // WebSocket events
117
+ SOCKET_EVENTS: {
118
+ CONNECT: 'connect',
119
+ DISCONNECT: 'disconnect',
120
+ CODE_UPDATE: 'code_update',
121
+ ANALYSIS_START: 'analysis_start',
122
+ ANALYSIS_PROGRESS: 'analysis_progress',
123
+ ANALYSIS_COMPLETE: 'analysis_complete',
124
+ ANALYSIS_ERROR: 'analysis_error',
125
+ FILE_SELECTED: 'file_selected',
126
+ NODE_EXPANDED: 'node_expanded',
127
+ NODE_COLLAPSED: 'node_collapsed'
128
+ },
129
+
130
+ // Messages
131
+ MESSAGES: {
132
+ NO_WORKING_DIR: 'Please select a working directory to view the code tree',
133
+ LOADING: 'Loading code tree...',
134
+ ANALYZING: 'Analyzing code structure...',
135
+ NO_DATA: 'No code structure data available',
136
+ ERROR: 'Error loading code tree',
137
+ EMPTY_DIR: 'Directory is empty',
138
+ NO_RESULTS: 'No matching files found',
139
+ CLICK_TO_EXPLORE: 'Click to explore contents',
140
+ CLICK_TO_ANALYZE: 'Click to analyze file'
141
+ },
142
+
143
+ // Performance thresholds
144
+ PERFORMANCE: {
145
+ MAX_NODES_RENDER: 1000,
146
+ MAX_NODES_EXPAND: 100,
147
+ DEBOUNCE_SEARCH: 300,
148
+ DEBOUNCE_RESIZE: 150,
149
+ CACHE_TTL: 300000 // 5 minutes
150
+ },
151
+
152
+ // Icon mappings
153
+ ICONS: {
154
+ // Node type icons
155
+ MODULE: '📦',
156
+ CLASS: '🏗️',
157
+ FUNCTION: '⚡',
158
+ METHOD: '🔧',
159
+ PROPERTY: '📌',
160
+ VARIABLE: '📍',
161
+ DIRECTORY: '📁',
162
+ FILE: '📄',
163
+
164
+ // State icons
165
+ LOADING: '⏳',
166
+ ERROR: '❌',
167
+ WARNING: '⚠️',
168
+ SUCCESS: '✅',
169
+
170
+ // Action icons
171
+ EXPAND: '▶',
172
+ COLLAPSE: '▼',
173
+ SEARCH: '🔍',
174
+ FILTER: '🔽',
175
+ REFRESH: '🔄',
176
+ SETTINGS: '⚙️'
177
+ },
178
+
179
+ // CSS classes
180
+ CSS_CLASSES: {
181
+ // Container classes
182
+ CONTAINER: 'code-tree-container',
183
+ SVG: 'code-tree-svg',
184
+ GROUP: 'code-tree-group',
185
+
186
+ // Node classes
187
+ NODE: 'tree-node',
188
+ NODE_SELECTED: 'tree-node-selected',
189
+ NODE_HOVER: 'tree-node-hover',
190
+ NODE_LOADING: 'tree-node-loading',
191
+ NODE_ERROR: 'tree-node-error',
192
+
193
+ // Link classes
194
+ LINK: 'tree-link',
195
+ LINK_SELECTED: 'tree-link-selected',
196
+
197
+ // Text classes
198
+ LABEL: 'tree-label',
199
+ LABEL_PRIMARY: 'tree-label-primary',
200
+ LABEL_SECONDARY: 'tree-label-secondary',
201
+
202
+ // Tooltip classes
203
+ TOOLTIP: 'code-tree-tooltip',
204
+ TOOLTIP_VISIBLE: 'code-tree-tooltip-visible',
205
+
206
+ // Control classes
207
+ CONTROLS: 'tree-controls',
208
+ CONTROL_BTN: 'tree-control-btn',
209
+ CONTROL_ACTIVE: 'tree-control-active'
210
+ }
211
+ };
212
+
213
+ // Freeze constants to prevent modification
214
+ Object.freeze(treeConstants);
215
+ Object.freeze(treeConstants.DEFAULT_MARGIN);
216
+ Object.freeze(treeConstants.NODE_RADIUS);
217
+ Object.freeze(treeConstants.COLORS);
218
+ Object.freeze(treeConstants.TREE_LAYOUT);
219
+ Object.freeze(treeConstants.LANGUAGE_EXTENSIONS);
220
+ Object.freeze(treeConstants.DEFAULT_FILTERS);
221
+ Object.freeze(treeConstants.API_ENDPOINTS);
222
+ Object.freeze(treeConstants.SOCKET_EVENTS);
223
+ Object.freeze(treeConstants.MESSAGES);
224
+ Object.freeze(treeConstants.PERFORMANCE);
225
+ Object.freeze(treeConstants.ICONS);
226
+ Object.freeze(treeConstants.CSS_CLASSES);
227
+
228
+ // Support both module and global usage
229
+ if (typeof module !== 'undefined' && module.exports) {
230
+ module.exports = treeConstants;
231
+ } else if (typeof define === 'function' && define.amd) {
232
+ define([], () => treeConstants);
233
+ } else {
234
+ window.treeConstants = treeConstants;
235
+ }