@friggframework/devtools 2.0.0--canary.522.cbd3d5a.0 → 2.0.0--canary.517.21b69ac.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/.eslintrc.json +3 -0
  2. package/CHANGELOG.md +132 -0
  3. package/frigg-cli/README.md +1 -1
  4. package/frigg-cli/__tests__/unit/commands/doctor.test.js +2 -0
  5. package/frigg-cli/__tests__/unit/commands/install.test.js +17 -21
  6. package/frigg-cli/doctor-command/index.js +16 -17
  7. package/frigg-cli/index.js +6 -21
  8. package/frigg-cli/index.test.js +1 -7
  9. package/frigg-cli/init-command/backend-first-handler.js +42 -124
  10. package/frigg-cli/init-command/index.js +1 -2
  11. package/frigg-cli/init-command/template-handler.js +3 -13
  12. package/frigg-cli/install-command/backend-js.js +3 -3
  13. package/frigg-cli/install-command/environment-variables.js +19 -16
  14. package/frigg-cli/install-command/environment-variables.test.js +13 -12
  15. package/frigg-cli/install-command/index.js +9 -14
  16. package/frigg-cli/install-command/integration-file.js +3 -3
  17. package/frigg-cli/install-command/logger.js +12 -0
  18. package/frigg-cli/install-command/validate-package.js +9 -5
  19. package/frigg-cli/jest.config.js +1 -4
  20. package/frigg-cli/repair-command/index.js +128 -101
  21. package/frigg-cli/start-command/index.js +2 -246
  22. package/frigg-cli/ui-command/index.js +36 -58
  23. package/frigg-cli/utils/repo-detection.js +37 -85
  24. package/infrastructure/docs/iam-policy-templates.md +1 -1
  25. package/infrastructure/domains/networking/vpc-builder.test.js +4 -2
  26. package/infrastructure/domains/networking/vpc-resolver.test.js +1 -1
  27. package/infrastructure/domains/shared/cloudformation-discovery.test.js +7 -4
  28. package/infrastructure/domains/shared/resource-discovery.js +5 -5
  29. package/infrastructure/domains/shared/types/discovery-result.test.js +1 -1
  30. package/infrastructure/domains/shared/utilities/base-definition-factory.js +2 -25
  31. package/infrastructure/domains/shared/utilities/base-definition-factory.test.js +2 -2
  32. package/infrastructure/infrastructure-composer.test.js +2 -2
  33. package/layers/prisma/.build-complete +3 -0
  34. package/layers/prisma/nodejs/package.json +8 -0
  35. package/management-ui/.eslintrc.js +22 -0
  36. package/management-ui/README.md +109 -245
  37. package/management-ui/components.json +21 -0
  38. package/management-ui/docs/phase2-integration-guide.md +320 -0
  39. package/management-ui/index.html +13 -0
  40. package/management-ui/package.json +76 -0
  41. package/management-ui/packages/devtools/frigg-cli/ui-command/index.js +302 -0
  42. package/management-ui/postcss.config.js +6 -0
  43. package/management-ui/server/api/backend.js +256 -0
  44. package/management-ui/server/api/cli.js +315 -0
  45. package/management-ui/server/api/codegen.js +663 -0
  46. package/management-ui/server/api/connections.js +857 -0
  47. package/management-ui/server/api/discovery.js +185 -0
  48. package/management-ui/server/api/environment/index.js +1 -0
  49. package/management-ui/server/api/environment/router.js +378 -0
  50. package/management-ui/server/api/environment.js +328 -0
  51. package/management-ui/server/api/integrations.js +876 -0
  52. package/management-ui/server/api/logs.js +248 -0
  53. package/management-ui/server/api/monitoring.js +282 -0
  54. package/management-ui/server/api/open-ide.js +31 -0
  55. package/management-ui/server/api/project.js +1029 -0
  56. package/management-ui/server/api/users/sessions.js +371 -0
  57. package/management-ui/server/api/users/simulation.js +254 -0
  58. package/management-ui/server/api/users.js +362 -0
  59. package/management-ui/server/api-contract.md +275 -0
  60. package/management-ui/server/index.js +873 -0
  61. package/management-ui/server/middleware/errorHandler.js +93 -0
  62. package/management-ui/server/middleware/security.js +32 -0
  63. package/management-ui/server/processManager.js +296 -0
  64. package/management-ui/server/server.js +346 -0
  65. package/management-ui/server/services/aws-monitor.js +413 -0
  66. package/management-ui/server/services/npm-registry.js +347 -0
  67. package/management-ui/server/services/template-engine.js +538 -0
  68. package/management-ui/server/utils/cliIntegration.js +220 -0
  69. package/management-ui/server/utils/environment/auditLogger.js +471 -0
  70. package/management-ui/server/utils/environment/awsParameterStore.js +275 -0
  71. package/management-ui/server/utils/environment/encryption.js +278 -0
  72. package/management-ui/server/utils/environment/envFileManager.js +286 -0
  73. package/management-ui/server/utils/import-commonjs.js +28 -0
  74. package/management-ui/server/utils/response.js +83 -0
  75. package/management-ui/server/websocket/handler.js +325 -0
  76. package/management-ui/src/App.jsx +25 -0
  77. package/management-ui/src/assets/FriggLogo.svg +1 -0
  78. package/management-ui/src/components/AppRouter.jsx +65 -0
  79. package/management-ui/src/components/Button.jsx +70 -0
  80. package/management-ui/src/components/Card.jsx +97 -0
  81. package/management-ui/src/components/EnvironmentCompare.jsx +400 -0
  82. package/management-ui/src/components/EnvironmentEditor.jsx +372 -0
  83. package/management-ui/src/components/EnvironmentImportExport.jsx +469 -0
  84. package/management-ui/src/components/EnvironmentSchema.jsx +491 -0
  85. package/management-ui/src/components/EnvironmentSecurity.jsx +463 -0
  86. package/management-ui/src/components/ErrorBoundary.jsx +73 -0
  87. package/management-ui/src/components/IntegrationCard.jsx +481 -0
  88. package/management-ui/src/components/IntegrationCardEnhanced.jsx +770 -0
  89. package/management-ui/src/components/IntegrationExplorer.jsx +379 -0
  90. package/management-ui/src/components/IntegrationStatus.jsx +336 -0
  91. package/management-ui/src/components/Layout.jsx +716 -0
  92. package/management-ui/src/components/LoadingSpinner.jsx +113 -0
  93. package/management-ui/src/components/RepositoryPicker.jsx +248 -0
  94. package/management-ui/src/components/SessionMonitor.jsx +350 -0
  95. package/management-ui/src/components/StatusBadge.jsx +208 -0
  96. package/management-ui/src/components/UserContextSwitcher.jsx +212 -0
  97. package/management-ui/src/components/UserSimulation.jsx +327 -0
  98. package/management-ui/src/components/Welcome.jsx +434 -0
  99. package/management-ui/src/components/codegen/APIEndpointGenerator.jsx +637 -0
  100. package/management-ui/src/components/codegen/APIModuleSelector.jsx +227 -0
  101. package/management-ui/src/components/codegen/CodeGenerationWizard.jsx +247 -0
  102. package/management-ui/src/components/codegen/CodePreviewEditor.jsx +316 -0
  103. package/management-ui/src/components/codegen/DynamicModuleForm.jsx +271 -0
  104. package/management-ui/src/components/codegen/FormBuilder.jsx +737 -0
  105. package/management-ui/src/components/codegen/IntegrationGenerator.jsx +855 -0
  106. package/management-ui/src/components/codegen/ProjectScaffoldWizard.jsx +797 -0
  107. package/management-ui/src/components/codegen/SchemaBuilder.jsx +303 -0
  108. package/management-ui/src/components/codegen/TemplateSelector.jsx +586 -0
  109. package/management-ui/src/components/codegen/index.js +10 -0
  110. package/management-ui/src/components/connections/ConnectionConfigForm.jsx +362 -0
  111. package/management-ui/src/components/connections/ConnectionHealthMonitor.jsx +182 -0
  112. package/management-ui/src/components/connections/ConnectionTester.jsx +200 -0
  113. package/management-ui/src/components/connections/EntityRelationshipMapper.jsx +292 -0
  114. package/management-ui/src/components/connections/OAuthFlow.jsx +204 -0
  115. package/management-ui/src/components/connections/index.js +5 -0
  116. package/management-ui/src/components/index.js +21 -0
  117. package/management-ui/src/components/monitoring/APIGatewayMetrics.jsx +222 -0
  118. package/management-ui/src/components/monitoring/LambdaMetrics.jsx +169 -0
  119. package/management-ui/src/components/monitoring/MetricsChart.jsx +197 -0
  120. package/management-ui/src/components/monitoring/MonitoringDashboard.jsx +393 -0
  121. package/management-ui/src/components/monitoring/SQSMetrics.jsx +246 -0
  122. package/management-ui/src/components/monitoring/index.js +6 -0
  123. package/management-ui/src/components/monitoring/monitoring.css +218 -0
  124. package/management-ui/src/components/theme-provider.jsx +52 -0
  125. package/management-ui/src/components/theme-toggle.jsx +39 -0
  126. package/management-ui/src/components/ui/badge.tsx +36 -0
  127. package/management-ui/src/components/ui/button.test.jsx +56 -0
  128. package/management-ui/src/components/ui/button.tsx +57 -0
  129. package/management-ui/src/components/ui/card.tsx +76 -0
  130. package/management-ui/src/components/ui/dropdown-menu.tsx +199 -0
  131. package/management-ui/src/components/ui/select.tsx +157 -0
  132. package/management-ui/src/components/ui/skeleton.jsx +15 -0
  133. package/management-ui/src/hooks/useFrigg.jsx +387 -0
  134. package/management-ui/src/hooks/useSocket.jsx +58 -0
  135. package/management-ui/src/index.css +193 -0
  136. package/management-ui/src/lib/utils.ts +6 -0
  137. package/management-ui/src/main.jsx +10 -0
  138. package/management-ui/src/pages/CodeGeneration.jsx +14 -0
  139. package/management-ui/src/pages/Connections.jsx +252 -0
  140. package/management-ui/src/pages/ConnectionsEnhanced.jsx +633 -0
  141. package/management-ui/src/pages/Dashboard.jsx +311 -0
  142. package/management-ui/src/pages/Environment.jsx +314 -0
  143. package/management-ui/src/pages/IntegrationConfigure.jsx +669 -0
  144. package/management-ui/src/pages/IntegrationDiscovery.jsx +567 -0
  145. package/management-ui/src/pages/IntegrationTest.jsx +742 -0
  146. package/management-ui/src/pages/Integrations.jsx +253 -0
  147. package/management-ui/src/pages/Monitoring.jsx +17 -0
  148. package/management-ui/src/pages/Simulation.jsx +155 -0
  149. package/management-ui/src/pages/Users.jsx +492 -0
  150. package/management-ui/src/services/api.js +41 -0
  151. package/management-ui/src/services/apiModuleService.js +193 -0
  152. package/management-ui/src/services/websocket-handlers.js +120 -0
  153. package/management-ui/src/test/api/project.test.js +273 -0
  154. package/management-ui/src/test/components/Welcome.test.jsx +378 -0
  155. package/management-ui/src/test/mocks/server.js +178 -0
  156. package/management-ui/src/test/setup.js +61 -0
  157. package/management-ui/src/test/utils/test-utils.jsx +134 -0
  158. package/management-ui/src/utils/repository.js +98 -0
  159. package/management-ui/src/utils/repository.test.js +118 -0
  160. package/management-ui/src/workflows/phase2-integration-workflows.js +884 -0
  161. package/management-ui/tailwind.config.js +63 -0
  162. package/management-ui/tsconfig.json +37 -0
  163. package/management-ui/tsconfig.node.json +10 -0
  164. package/management-ui/vite.config.js +26 -0
  165. package/management-ui/vitest.config.js +38 -0
  166. package/package.json +7 -17
  167. package/frigg-cli/__tests__/application/use-cases/AddApiModuleToIntegrationUseCase.test.js +0 -326
  168. package/frigg-cli/__tests__/application/use-cases/CreateApiModuleUseCase.test.js +0 -337
  169. package/frigg-cli/__tests__/domain/entities/ApiModule.test.js +0 -373
  170. package/frigg-cli/__tests__/domain/entities/AppDefinition.test.js +0 -313
  171. package/frigg-cli/__tests__/domain/services/IntegrationValidator.test.js +0 -269
  172. package/frigg-cli/__tests__/domain/value-objects/IntegrationName.test.js +0 -82
  173. package/frigg-cli/__tests__/infrastructure/adapters/IntegrationJsUpdater.test.js +0 -408
  174. package/frigg-cli/__tests__/infrastructure/repositories/FileSystemApiModuleRepository.test.js +0 -583
  175. package/frigg-cli/__tests__/infrastructure/repositories/FileSystemAppDefinitionRepository.test.js +0 -314
  176. package/frigg-cli/__tests__/infrastructure/repositories/FileSystemIntegrationRepository.test.js +0 -430
  177. package/frigg-cli/__tests__/unit/commands/init.test.js +0 -406
  178. package/frigg-cli/__tests__/unit/commands/repair.test.js +0 -275
  179. package/frigg-cli/__tests__/unit/start-command/application/RunPreflightChecksUseCase.test.js +0 -411
  180. package/frigg-cli/__tests__/unit/start-command/infrastructure/DatabaseAdapter.test.js +0 -405
  181. package/frigg-cli/__tests__/unit/start-command/infrastructure/DockerAdapter.test.js +0 -496
  182. package/frigg-cli/__tests__/unit/start-command/presentation/InteractivePromptAdapter.test.js +0 -474
  183. package/frigg-cli/__tests__/unit/utils/output.test.js +0 -196
  184. package/frigg-cli/application/use-cases/AddApiModuleToIntegrationUseCase.js +0 -93
  185. package/frigg-cli/application/use-cases/CreateApiModuleUseCase.js +0 -93
  186. package/frigg-cli/application/use-cases/CreateIntegrationUseCase.js +0 -103
  187. package/frigg-cli/container.js +0 -172
  188. package/frigg-cli/docs/OUTPUT_MIGRATION_GUIDE.md +0 -286
  189. package/frigg-cli/domain/entities/ApiModule.js +0 -272
  190. package/frigg-cli/domain/entities/AppDefinition.js +0 -227
  191. package/frigg-cli/domain/entities/Integration.js +0 -198
  192. package/frigg-cli/domain/exceptions/DomainException.js +0 -24
  193. package/frigg-cli/domain/ports/IApiModuleRepository.js +0 -53
  194. package/frigg-cli/domain/ports/IAppDefinitionRepository.js +0 -43
  195. package/frigg-cli/domain/ports/IIntegrationRepository.js +0 -61
  196. package/frigg-cli/domain/services/IntegrationValidator.js +0 -185
  197. package/frigg-cli/domain/value-objects/IntegrationId.js +0 -42
  198. package/frigg-cli/domain/value-objects/IntegrationName.js +0 -60
  199. package/frigg-cli/domain/value-objects/SemanticVersion.js +0 -70
  200. package/frigg-cli/infrastructure/UnitOfWork.js +0 -46
  201. package/frigg-cli/infrastructure/adapters/BackendJsUpdater.js +0 -197
  202. package/frigg-cli/infrastructure/adapters/FileSystemAdapter.js +0 -224
  203. package/frigg-cli/infrastructure/adapters/IntegrationJsUpdater.js +0 -249
  204. package/frigg-cli/infrastructure/adapters/SchemaValidator.js +0 -92
  205. package/frigg-cli/infrastructure/repositories/FileSystemApiModuleRepository.js +0 -373
  206. package/frigg-cli/infrastructure/repositories/FileSystemAppDefinitionRepository.js +0 -116
  207. package/frigg-cli/infrastructure/repositories/FileSystemIntegrationRepository.js +0 -277
  208. package/frigg-cli/package-lock.json +0 -16226
  209. package/frigg-cli/start-command/application/RunPreflightChecksUseCase.js +0 -376
  210. package/frigg-cli/start-command/infrastructure/DatabaseAdapter.js +0 -591
  211. package/frigg-cli/start-command/infrastructure/DockerAdapter.js +0 -306
  212. package/frigg-cli/start-command/presentation/InteractivePromptAdapter.js +0 -329
  213. package/frigg-cli/templates/backend/.env.example +0 -62
  214. package/frigg-cli/templates/backend/.eslintrc.json +0 -12
  215. package/frigg-cli/templates/backend/.prettierrc +0 -6
  216. package/frigg-cli/templates/backend/docker-compose.yml +0 -22
  217. package/frigg-cli/templates/backend/index.js +0 -96
  218. package/frigg-cli/templates/backend/infrastructure.js +0 -12
  219. package/frigg-cli/templates/backend/jest.config.js +0 -17
  220. package/frigg-cli/templates/backend/package.json +0 -50
  221. package/frigg-cli/templates/backend/src/api-modules/.gitkeep +0 -10
  222. package/frigg-cli/templates/backend/src/base/.gitkeep +0 -7
  223. package/frigg-cli/templates/backend/src/integrations/.gitkeep +0 -10
  224. package/frigg-cli/templates/backend/src/integrations/ExampleIntegration.js +0 -65
  225. package/frigg-cli/templates/backend/src/utils/.gitkeep +0 -7
  226. package/frigg-cli/templates/backend/test/setup.js +0 -30
  227. package/frigg-cli/templates/backend/ui-extensions/.gitkeep +0 -0
  228. package/frigg-cli/templates/backend/ui-extensions/README.md +0 -77
  229. package/frigg-cli/utils/__tests__/repo-detection.test.js +0 -436
  230. package/frigg-cli/utils/output.js +0 -382
  231. package/frigg-cli/validate-command/__tests__/adapters/validate-command.test.js +0 -205
  232. package/frigg-cli/validate-command/__tests__/application/validate-app-use-case.test.js +0 -104
  233. package/frigg-cli/validate-command/__tests__/domain/fix-suggestion.test.js +0 -153
  234. package/frigg-cli/validate-command/__tests__/domain/validation-error.test.js +0 -162
  235. package/frigg-cli/validate-command/__tests__/domain/validation-result.test.js +0 -152
  236. package/frigg-cli/validate-command/__tests__/infrastructure/api-module-validator.test.js +0 -332
  237. package/frigg-cli/validate-command/__tests__/infrastructure/app-definition-validator.test.js +0 -191
  238. package/frigg-cli/validate-command/__tests__/infrastructure/integration-class-validator.test.js +0 -146
  239. package/frigg-cli/validate-command/__tests__/infrastructure/template-validation.test.js +0 -155
  240. package/frigg-cli/validate-command/adapters/cli/validate-command.js +0 -199
  241. package/frigg-cli/validate-command/application/use-cases/validate-app-use-case.js +0 -35
  242. package/frigg-cli/validate-command/domain/entities/validation-result.js +0 -74
  243. package/frigg-cli/validate-command/domain/value-objects/fix-suggestion.js +0 -74
  244. package/frigg-cli/validate-command/domain/value-objects/validation-error.js +0 -68
  245. package/frigg-cli/validate-command/infrastructure/validators/api-module-validator.js +0 -181
  246. package/frigg-cli/validate-command/infrastructure/validators/app-definition-validator.js +0 -128
  247. package/frigg-cli/validate-command/infrastructure/validators/integration-class-validator.js +0 -113
@@ -0,0 +1,633 @@
1
+ import React, { useState, useEffect } from 'react'
2
+ import { useFrigg } from '../hooks/useFrigg'
3
+ import { useSocket } from '../hooks/useSocket'
4
+ import { Button } from '../components/Button'
5
+ import { Card } from '../components/Card'
6
+ import StatusBadge from '../components/StatusBadge'
7
+ import OAuthFlow from '../components/connections/OAuthFlow'
8
+ import ConnectionTester from '../components/connections/ConnectionTester'
9
+ import ConnectionHealthMonitor from '../components/connections/ConnectionHealthMonitor'
10
+ import EntityRelationshipMapper from '../components/connections/EntityRelationshipMapper'
11
+ import ConnectionConfigForm from '../components/connections/ConnectionConfigForm'
12
+ import api from '../services/api'
13
+
14
+ const ConnectionsEnhanced = () => {
15
+ const { connections, users, integrations, refreshConnections } = useFrigg()
16
+ <<<<<<< HEAD
17
+ <<<<<<< HEAD
18
+ const { socket, emit, on } = useSocket()
19
+ =======
20
+ <<<<<<< HEAD
21
+ <<<<<<< HEAD
22
+ const { socket, emit, on } = useSocket()
23
+ =======
24
+ const socket = useSocket()
25
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
26
+ =======
27
+ const { socket, emit, on } = useSocket()
28
+ >>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
29
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
30
+ =======
31
+ const { socket, emit, on } = useSocket()
32
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
33
+ const [selectedConnection, setSelectedConnection] = useState(null)
34
+ const [activeView, setActiveView] = useState('overview') // overview, test, health, entities, config
35
+ const [showOAuthFlow, setShowOAuthFlow] = useState(false)
36
+ const [showConfigForm, setShowConfigForm] = useState(false)
37
+ const [selectedIntegration, setSelectedIntegration] = useState(null)
38
+ const [connectionStats, setConnectionStats] = useState(null)
39
+
40
+ useEffect(() => {
41
+ fetchConnectionStats()
42
+ <<<<<<< HEAD
43
+ <<<<<<< HEAD
44
+
45
+ =======
46
+ <<<<<<< HEAD
47
+
48
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
49
+ // Subscribe to real-time updates
50
+ const unsubscribeUpdate = on('connection-update', handleConnectionUpdate)
51
+ const unsubscribeTest = on('connection-test', handleTestUpdate)
52
+ emit('subscribe', { topics: ['connections'] })
53
+
54
+ return () => {
55
+ if (unsubscribeUpdate) unsubscribeUpdate()
56
+ if (unsubscribeTest) unsubscribeTest()
57
+ emit('unsubscribe', { topics: ['connections'] })
58
+ <<<<<<< HEAD
59
+ =======
60
+ =======
61
+ =======
62
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
63
+
64
+ // Subscribe to real-time updates
65
+ const unsubscribeUpdate = on('connection-update', handleConnectionUpdate)
66
+ const unsubscribeTest = on('connection-test', handleTestUpdate)
67
+ emit('subscribe', { topics: ['connections'] })
68
+
69
+ return () => {
70
+ if (unsubscribeUpdate) unsubscribeUpdate()
71
+ if (unsubscribeTest) unsubscribeTest()
72
+ emit('unsubscribe', { topics: ['connections'] })
73
+ <<<<<<< HEAD
74
+ >>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
75
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
76
+ =======
77
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
78
+ }
79
+ }, [socket])
80
+
81
+ const fetchConnectionStats = async () => {
82
+ try {
83
+ const response = await api.get('/api/connections/stats/summary')
84
+ setConnectionStats(response.data)
85
+ } catch (error) {
86
+ console.error('Failed to fetch connection stats:', error)
87
+ }
88
+ }
89
+
90
+ const handleConnectionUpdate = (data) => {
91
+ refreshConnections()
92
+ fetchConnectionStats()
93
+ }
94
+
95
+ const handleTestUpdate = (data) => {
96
+ if (selectedConnection?.id === data.connectionId) {
97
+ // Update selected connection with test results
98
+ setSelectedConnection(prev => ({
99
+ ...prev,
100
+ lastTestResult: data.summary
101
+ }))
102
+ }
103
+ }
104
+
105
+ const handleCreateConnection = (integration) => {
106
+ setSelectedIntegration(integration)
107
+ setShowOAuthFlow(true)
108
+ }
109
+
110
+ const handleOAuthSuccess = async (connection) => {
111
+ setShowOAuthFlow(false)
112
+ setSelectedIntegration(null)
113
+ await refreshConnections()
114
+ setSelectedConnection(connection)
115
+ setActiveView('config')
116
+ setShowConfigForm(true)
117
+ }
118
+
119
+ const handleConfigSave = async (config) => {
120
+ setShowConfigForm(false)
121
+ await refreshConnections()
122
+ }
123
+
124
+ const handleDeleteConnection = async (connectionId) => {
125
+ if (confirm('Are you sure you want to delete this connection?')) {
126
+ try {
127
+ await api.delete(`/api/connections/${connectionId}`)
128
+ await refreshConnections()
129
+ if (selectedConnection?.id === connectionId) {
130
+ setSelectedConnection(null)
131
+ }
132
+ } catch (error) {
133
+ console.error('Failed to delete connection:', error)
134
+ alert('Failed to delete connection')
135
+ }
136
+ }
137
+ }
138
+
139
+ const getIntegrationDetails = (integrationId) => {
140
+ return integrations.find(i => i.id === integrationId) || { name: integrationId }
141
+ }
142
+
143
+ const getUserDetails = (userId) => {
144
+ const user = users.find(u => u.id === userId)
145
+ return user ? `${user.firstName} ${user.lastName}` : userId
146
+ }
147
+
148
+ return (
149
+ <div className="space-y-6">
150
+ {/* Header */}
151
+ <div className="flex items-center justify-between">
152
+ <div>
153
+ <h2 className="text-3xl font-bold text-gray-900">Connection Management</h2>
154
+ <p className="mt-2 text-gray-600">
155
+ Manage integration connections, test connectivity, and monitor health
156
+ </p>
157
+ </div>
158
+ <Button onClick={() => setShowOAuthFlow(true)} variant="primary">
159
+ New Connection
160
+ </Button>
161
+ </div>
162
+
163
+ {/* Stats Overview */}
164
+ {connectionStats && (
165
+ <div className="grid grid-cols-1 md:grid-cols-4 gap-4">
166
+ <Card>
167
+ <div className="p-4">
168
+ <p className="text-sm text-gray-500">Total Connections</p>
169
+ <p className="text-2xl font-bold text-gray-900">
170
+ {connectionStats.totalConnections}
171
+ </p>
172
+ </div>
173
+ </Card>
174
+ <Card>
175
+ <div className="p-4">
176
+ <p className="text-sm text-gray-500">Active</p>
177
+ <p className="text-2xl font-bold text-green-600">
178
+ {connectionStats.activeConnections}
179
+ </p>
180
+ </div>
181
+ </Card>
182
+ <Card>
183
+ <div className="p-4">
184
+ <p className="text-sm text-gray-500">Total Entities</p>
185
+ <p className="text-2xl font-bold text-gray-900">
186
+ {connectionStats.totalEntities}
187
+ </p>
188
+ </div>
189
+ </Card>
190
+ <Card>
191
+ <div className="p-4">
192
+ <p className="text-sm text-gray-500">Recently Used</p>
193
+ <p className="text-2xl font-bold text-blue-600">
194
+ {connectionStats.recentlyUsed}
195
+ </p>
196
+ </div>
197
+ </Card>
198
+ </div>
199
+ )}
200
+
201
+ {/* Main Content */}
202
+ <div className="grid grid-cols-1 lg:grid-cols-3 gap-6">
203
+ {/* Connections List */}
204
+ <div className="lg:col-span-1">
205
+ <Card>
206
+ <div className="p-4">
207
+ <h3 className="text-lg font-semibold text-gray-900 mb-4">Connections</h3>
208
+ <div className="space-y-2">
209
+ {connections.map((connection) => {
210
+ const integration = getIntegrationDetails(connection.integration)
211
+ return (
212
+ <button
213
+ key={connection.id}
214
+ onClick={() => {
215
+ setSelectedConnection(connection)
216
+ setActiveView('overview')
217
+ }}
218
+ <<<<<<< HEAD
219
+ <<<<<<< HEAD
220
+ =======
221
+ <<<<<<< HEAD
222
+ className={`w-full text-left p-3 rounded-lg transition-colors ${selectedConnection?.id === connection.id
223
+ ? 'bg-blue-50 border-blue-500 border'
224
+ : 'hover:bg-gray-50 border border-gray-200'
225
+ }`}
226
+ =======
227
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
228
+ =======
229
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
230
+ className={`w-full text-left p-3 rounded-lg transition-colors ${
231
+ selectedConnection?.id === connection.id
232
+ ? 'bg-blue-50 border-blue-500 border'
233
+ : 'hover:bg-gray-50 border border-gray-200'
234
+ }`}
235
+ <<<<<<< HEAD
236
+ <<<<<<< HEAD
237
+ =======
238
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
239
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
240
+ =======
241
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
242
+ >
243
+ <div className="flex items-center justify-between">
244
+ <div className="flex-1">
245
+ <p className="font-medium text-gray-900">
246
+ {connection.name || integration.displayName || integration.name}
247
+ </p>
248
+ <p className="text-sm text-gray-500">
249
+ {getUserDetails(connection.userId)}
250
+ </p>
251
+ </div>
252
+ <<<<<<< HEAD
253
+ <<<<<<< HEAD
254
+ <ConnectionHealthMonitor
255
+ connectionId={connection.id}
256
+ =======
257
+ <<<<<<< HEAD
258
+ <ConnectionHealthMonitor
259
+ connectionId={connection.id}
260
+ =======
261
+ <ConnectionHealthMonitor
262
+ connectionId={connection.id}
263
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
264
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
265
+ =======
266
+ <ConnectionHealthMonitor
267
+ connectionId={connection.id}
268
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
269
+ compact={true}
270
+ />
271
+ </div>
272
+ </button>
273
+ )
274
+ })}
275
+ </div>
276
+ <<<<<<< HEAD
277
+ <<<<<<< HEAD
278
+
279
+ =======
280
+ <<<<<<< HEAD
281
+
282
+ =======
283
+
284
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
285
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
286
+ =======
287
+
288
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
289
+ {connections.length === 0 && (
290
+ <p className="text-center text-gray-500 py-8">
291
+ No connections yet. Create your first connection above.
292
+ </p>
293
+ )}
294
+ </div>
295
+ </Card>
296
+ </div>
297
+
298
+ {/* Detail View */}
299
+ <div className="lg:col-span-2">
300
+ {selectedConnection ? (
301
+ <div className="space-y-6">
302
+ {/* Connection Header */}
303
+ <Card>
304
+ <div className="p-6">
305
+ <div className="flex items-center justify-between mb-4">
306
+ <div>
307
+ <h3 className="text-xl font-semibold text-gray-900">
308
+ <<<<<<< HEAD
309
+ <<<<<<< HEAD
310
+ {selectedConnection.name ||
311
+ getIntegrationDetails(selectedConnection.integration).displayName}
312
+ =======
313
+ <<<<<<< HEAD
314
+ {selectedConnection.name ||
315
+ getIntegrationDetails(selectedConnection.integration).displayName}
316
+ =======
317
+ {selectedConnection.name ||
318
+ getIntegrationDetails(selectedConnection.integration).displayName}
319
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
320
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
321
+ =======
322
+ {selectedConnection.name ||
323
+ getIntegrationDetails(selectedConnection.integration).displayName}
324
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
325
+ </h3>
326
+ <p className="text-sm text-gray-500">
327
+ Connected by {getUserDetails(selectedConnection.userId)}
328
+ </p>
329
+ </div>
330
+ <div className="flex items-center space-x-2">
331
+ <<<<<<< HEAD
332
+ <<<<<<< HEAD
333
+ <StatusBadge
334
+ =======
335
+ <<<<<<< HEAD
336
+ <StatusBadge
337
+ =======
338
+ <StatusBadge
339
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
340
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
341
+ =======
342
+ <StatusBadge
343
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
344
+ status={selectedConnection.status === 'active' ? 'success' : 'error'}
345
+ text={selectedConnection.status}
346
+ />
347
+ <Button
348
+ onClick={() => handleDeleteConnection(selectedConnection.id)}
349
+ variant="secondary"
350
+ size="sm"
351
+ >
352
+ Delete
353
+ </Button>
354
+ </div>
355
+ </div>
356
+
357
+ {/* View Tabs */}
358
+ <div className="flex space-x-1 border-b border-gray-200">
359
+ {[
360
+ { id: 'overview', label: 'Overview' },
361
+ { id: 'test', label: 'Test' },
362
+ { id: 'health', label: 'Health' },
363
+ { id: 'entities', label: 'Entities' },
364
+ { id: 'config', label: 'Configuration' }
365
+ ].map(tab => (
366
+ <button
367
+ key={tab.id}
368
+ onClick={() => setActiveView(tab.id)}
369
+ <<<<<<< HEAD
370
+ <<<<<<< HEAD
371
+ =======
372
+ <<<<<<< HEAD
373
+ className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${activeView === tab.id
374
+ ? 'text-blue-600 border-blue-600'
375
+ : 'text-gray-500 border-transparent hover:text-gray-700'
376
+ }`}
377
+ =======
378
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
379
+ =======
380
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
381
+ className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${
382
+ activeView === tab.id
383
+ ? 'text-blue-600 border-blue-600'
384
+ : 'text-gray-500 border-transparent hover:text-gray-700'
385
+ }`}
386
+ <<<<<<< HEAD
387
+ <<<<<<< HEAD
388
+ =======
389
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
390
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
391
+ =======
392
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
393
+ >
394
+ {tab.label}
395
+ </button>
396
+ ))}
397
+ </div>
398
+ </div>
399
+ </Card>
400
+
401
+ {/* Active View Content */}
402
+ {activeView === 'overview' && (
403
+ <Card>
404
+ <div className="p-6">
405
+ <h4 className="text-lg font-semibold text-gray-900 mb-4">
406
+ Connection Details
407
+ </h4>
408
+ <dl className="grid grid-cols-2 gap-4">
409
+ <div>
410
+ <dt className="text-sm font-medium text-gray-500">Connection ID</dt>
411
+ <dd className="mt-1 text-sm text-gray-900 font-mono">
412
+ {selectedConnection.id}
413
+ </dd>
414
+ </div>
415
+ <div>
416
+ <dt className="text-sm font-medium text-gray-500">Created</dt>
417
+ <dd className="mt-1 text-sm text-gray-900">
418
+ {new Date(selectedConnection.createdAt).toLocaleString()}
419
+ </dd>
420
+ </div>
421
+ <div>
422
+ <dt className="text-sm font-medium text-gray-500">Last Updated</dt>
423
+ <dd className="mt-1 text-sm text-gray-900">
424
+ {new Date(selectedConnection.updatedAt).toLocaleString()}
425
+ </dd>
426
+ </div>
427
+ <div>
428
+ <dt className="text-sm font-medium text-gray-500">Last Used</dt>
429
+ <dd className="mt-1 text-sm text-gray-900">
430
+ <<<<<<< HEAD
431
+ <<<<<<< HEAD
432
+ {selectedConnection.lastUsed
433
+ =======
434
+ <<<<<<< HEAD
435
+ {selectedConnection.lastUsed
436
+ =======
437
+ {selectedConnection.lastUsed
438
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
439
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
440
+ =======
441
+ {selectedConnection.lastUsed
442
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
443
+ ? new Date(selectedConnection.lastUsed).toLocaleString()
444
+ : 'Never'}
445
+ </dd>
446
+ </div>
447
+ </dl>
448
+ <<<<<<< HEAD
449
+ <<<<<<< HEAD
450
+
451
+ =======
452
+ <<<<<<< HEAD
453
+
454
+ =======
455
+
456
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
457
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
458
+ =======
459
+
460
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
461
+ {selectedConnection.description && (
462
+ <div className="mt-4">
463
+ <h5 className="text-sm font-medium text-gray-500">Description</h5>
464
+ <p className="mt-1 text-sm text-gray-900">
465
+ {selectedConnection.description}
466
+ </p>
467
+ </div>
468
+ )}
469
+ </div>
470
+ </Card>
471
+ )}
472
+
473
+ {activeView === 'test' && (
474
+ <<<<<<< HEAD
475
+ <<<<<<< HEAD
476
+ <ConnectionTester
477
+ =======
478
+ <<<<<<< HEAD
479
+ <ConnectionTester
480
+ =======
481
+ <ConnectionTester
482
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
483
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
484
+ =======
485
+ <ConnectionTester
486
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
487
+ connection={selectedConnection}
488
+ onTestComplete={(result) => {
489
+ // Handle test completion
490
+ console.log('Test completed:', result)
491
+ }}
492
+ />
493
+ )}
494
+
495
+ {activeView === 'health' && (
496
+ <<<<<<< HEAD
497
+ <<<<<<< HEAD
498
+ <ConnectionHealthMonitor
499
+ =======
500
+ <<<<<<< HEAD
501
+ <ConnectionHealthMonitor
502
+ =======
503
+ <ConnectionHealthMonitor
504
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
505
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
506
+ =======
507
+ <ConnectionHealthMonitor
508
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
509
+ connectionId={selectedConnection.id}
510
+ compact={false}
511
+ />
512
+ )}
513
+
514
+ {activeView === 'entities' && (
515
+ <<<<<<< HEAD
516
+ <<<<<<< HEAD
517
+ <EntityRelationshipMapper
518
+ =======
519
+ <<<<<<< HEAD
520
+ <EntityRelationshipMapper
521
+ =======
522
+ <EntityRelationshipMapper
523
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
524
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
525
+ =======
526
+ <EntityRelationshipMapper
527
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
528
+ connectionId={selectedConnection.id}
529
+ />
530
+ )}
531
+
532
+ {activeView === 'config' && (
533
+ <Card>
534
+ <div className="p-6">
535
+ {showConfigForm ? (
536
+ <ConnectionConfigForm
537
+ connection={selectedConnection}
538
+ integration={getIntegrationDetails(selectedConnection.integration)}
539
+ onSave={handleConfigSave}
540
+ onCancel={() => setShowConfigForm(false)}
541
+ />
542
+ ) : (
543
+ <div>
544
+ <h4 className="text-lg font-semibold text-gray-900 mb-4">
545
+ Configuration
546
+ </h4>
547
+ <<<<<<< HEAD
548
+ <<<<<<< HEAD
549
+ <Button
550
+ =======
551
+ <<<<<<< HEAD
552
+ <Button
553
+ =======
554
+ <Button
555
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
556
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
557
+ =======
558
+ <Button
559
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
560
+ onClick={() => setShowConfigForm(true)}
561
+ variant="primary"
562
+ >
563
+ Edit Configuration
564
+ </Button>
565
+ </div>
566
+ )}
567
+ </div>
568
+ </Card>
569
+ )}
570
+ </div>
571
+ ) : (
572
+ <Card>
573
+ <div className="p-8 text-center">
574
+ <p className="text-gray-500">
575
+ Select a connection to view details and manage settings
576
+ </p>
577
+ </div>
578
+ </Card>
579
+ )}
580
+ </div>
581
+ </div>
582
+
583
+ {/* OAuth Flow Modal */}
584
+ {showOAuthFlow && (
585
+ <div className="fixed inset-0 bg-gray-500 bg-opacity-75 flex items-center justify-center z-50">
586
+ <div className="bg-white rounded-lg p-6 max-w-lg w-full">
587
+ {selectedIntegration ? (
588
+ <OAuthFlow
589
+ integration={selectedIntegration}
590
+ onSuccess={handleOAuthSuccess}
591
+ onCancel={() => {
592
+ setShowOAuthFlow(false)
593
+ setSelectedIntegration(null)
594
+ }}
595
+ />
596
+ ) : (
597
+ <div>
598
+ <h3 className="text-lg font-semibold text-gray-900 mb-4">
599
+ Select Integration
600
+ </h3>
601
+ <div className="space-y-2">
602
+ {integrations.map((integration) => (
603
+ <button
604
+ key={integration.id}
605
+ onClick={() => setSelectedIntegration(integration)}
606
+ className="w-full text-left p-3 rounded-lg border border-gray-200 hover:bg-gray-50"
607
+ >
608
+ <p className="font-medium text-gray-900">
609
+ {integration.displayName || integration.name}
610
+ </p>
611
+ <p className="text-sm text-gray-500">
612
+ {integration.description}
613
+ </p>
614
+ </button>
615
+ ))}
616
+ </div>
617
+ <Button
618
+ onClick={() => setShowOAuthFlow(false)}
619
+ variant="secondary"
620
+ className="mt-4 w-full"
621
+ >
622
+ Cancel
623
+ </Button>
624
+ </div>
625
+ )}
626
+ </div>
627
+ </div>
628
+ )}
629
+ </div>
630
+ )
631
+ }
632
+
633
+ export default ConnectionsEnhanced