@friggframework/devtools 2.0.0-next.29 → 2.0.0-next.30

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 (164) hide show
  1. package/frigg-cli/.eslintrc.js +141 -0
  2. package/frigg-cli/__tests__/jest.config.js +102 -0
  3. package/frigg-cli/__tests__/unit/commands/build.test.js +483 -0
  4. package/frigg-cli/__tests__/unit/commands/install.test.js +418 -0
  5. package/frigg-cli/__tests__/unit/commands/ui.test.js +592 -0
  6. package/frigg-cli/__tests__/utils/command-tester.js +170 -0
  7. package/frigg-cli/__tests__/utils/mock-factory.js +270 -0
  8. package/frigg-cli/__tests__/utils/test-fixtures.js +463 -0
  9. package/frigg-cli/__tests__/utils/test-setup.js +286 -0
  10. package/frigg-cli/generate-command/__tests__/generate-command.test.js +312 -0
  11. package/frigg-cli/generate-command/azure-generator.js +43 -0
  12. package/frigg-cli/generate-command/gcp-generator.js +47 -0
  13. package/frigg-cli/generate-command/index.js +332 -0
  14. package/frigg-cli/generate-command/terraform-generator.js +555 -0
  15. package/frigg-cli/index.js +19 -1
  16. package/frigg-cli/init-command/backend-first-handler.js +756 -0
  17. package/frigg-cli/init-command/index.js +93 -0
  18. package/frigg-cli/init-command/template-handler.js +143 -0
  19. package/frigg-cli/package.json +51 -0
  20. package/frigg-cli/test/init-command.test.js +180 -0
  21. package/frigg-cli/test/npm-registry.test.js +319 -0
  22. package/frigg-cli/ui-command/index.js +154 -0
  23. package/frigg-cli/utils/app-resolver.js +319 -0
  24. package/frigg-cli/utils/backend-path.js +25 -0
  25. package/frigg-cli/utils/npm-registry.js +167 -0
  26. package/frigg-cli/utils/process-manager.js +199 -0
  27. package/frigg-cli/utils/repo-detection.js +405 -0
  28. package/infrastructure/serverless-template.js +177 -292
  29. package/management-ui/.eslintrc.js +22 -0
  30. package/management-ui/README.md +203 -0
  31. package/management-ui/components.json +21 -0
  32. package/management-ui/docs/phase2-integration-guide.md +320 -0
  33. package/management-ui/{dist/index.html → index.html} +1 -2
  34. package/management-ui/package-lock.json +16517 -0
  35. package/management-ui/package.json +76 -0
  36. package/management-ui/packages/devtools/frigg-cli/ui-command/index.js +302 -0
  37. package/management-ui/postcss.config.js +6 -0
  38. package/management-ui/server/api/backend.js +256 -0
  39. package/management-ui/server/api/cli.js +315 -0
  40. package/management-ui/server/api/codegen.js +663 -0
  41. package/management-ui/server/api/connections.js +857 -0
  42. package/management-ui/server/api/discovery.js +185 -0
  43. package/management-ui/server/api/environment/index.js +1 -0
  44. package/management-ui/server/api/environment/router.js +378 -0
  45. package/management-ui/server/api/environment.js +328 -0
  46. package/management-ui/server/api/integrations.js +876 -0
  47. package/management-ui/server/api/logs.js +248 -0
  48. package/management-ui/server/api/monitoring.js +282 -0
  49. package/management-ui/server/api/open-ide.js +31 -0
  50. package/management-ui/server/api/project.js +1029 -0
  51. package/management-ui/server/api/users/sessions.js +371 -0
  52. package/management-ui/server/api/users/simulation.js +254 -0
  53. package/management-ui/server/api/users.js +362 -0
  54. package/management-ui/server/api-contract.md +275 -0
  55. package/management-ui/server/index.js +873 -0
  56. package/management-ui/server/middleware/errorHandler.js +93 -0
  57. package/management-ui/server/middleware/security.js +32 -0
  58. package/management-ui/server/processManager.js +296 -0
  59. package/management-ui/server/server.js +346 -0
  60. package/management-ui/server/services/aws-monitor.js +413 -0
  61. package/management-ui/server/services/npm-registry.js +347 -0
  62. package/management-ui/server/services/template-engine.js +538 -0
  63. package/management-ui/server/utils/cliIntegration.js +220 -0
  64. package/management-ui/server/utils/environment/auditLogger.js +471 -0
  65. package/management-ui/server/utils/environment/awsParameterStore.js +264 -0
  66. package/management-ui/server/utils/environment/encryption.js +278 -0
  67. package/management-ui/server/utils/environment/envFileManager.js +286 -0
  68. package/management-ui/server/utils/import-commonjs.js +28 -0
  69. package/management-ui/server/utils/response.js +83 -0
  70. package/management-ui/server/websocket/handler.js +325 -0
  71. package/management-ui/src/App.jsx +109 -0
  72. package/management-ui/src/components/AppRouter.jsx +65 -0
  73. package/management-ui/src/components/Button.jsx +70 -0
  74. package/management-ui/src/components/Card.jsx +97 -0
  75. package/management-ui/src/components/EnvironmentCompare.jsx +400 -0
  76. package/management-ui/src/components/EnvironmentEditor.jsx +372 -0
  77. package/management-ui/src/components/EnvironmentImportExport.jsx +469 -0
  78. package/management-ui/src/components/EnvironmentSchema.jsx +491 -0
  79. package/management-ui/src/components/EnvironmentSecurity.jsx +463 -0
  80. package/management-ui/src/components/ErrorBoundary.jsx +73 -0
  81. package/management-ui/src/components/IntegrationCard.jsx +481 -0
  82. package/management-ui/src/components/IntegrationCardEnhanced.jsx +770 -0
  83. package/management-ui/src/components/IntegrationExplorer.jsx +379 -0
  84. package/management-ui/src/components/IntegrationStatus.jsx +336 -0
  85. package/management-ui/src/components/Layout.jsx +716 -0
  86. package/management-ui/src/components/LoadingSpinner.jsx +113 -0
  87. package/management-ui/src/components/RepositoryPicker.jsx +248 -0
  88. package/management-ui/src/components/SessionMonitor.jsx +350 -0
  89. package/management-ui/src/components/StatusBadge.jsx +208 -0
  90. package/management-ui/src/components/UserContextSwitcher.jsx +212 -0
  91. package/management-ui/src/components/UserSimulation.jsx +327 -0
  92. package/management-ui/src/components/Welcome.jsx +434 -0
  93. package/management-ui/src/components/codegen/APIEndpointGenerator.jsx +637 -0
  94. package/management-ui/src/components/codegen/APIModuleSelector.jsx +227 -0
  95. package/management-ui/src/components/codegen/CodeGenerationWizard.jsx +247 -0
  96. package/management-ui/src/components/codegen/CodePreviewEditor.jsx +316 -0
  97. package/management-ui/src/components/codegen/DynamicModuleForm.jsx +271 -0
  98. package/management-ui/src/components/codegen/FormBuilder.jsx +737 -0
  99. package/management-ui/src/components/codegen/IntegrationGenerator.jsx +855 -0
  100. package/management-ui/src/components/codegen/ProjectScaffoldWizard.jsx +797 -0
  101. package/management-ui/src/components/codegen/SchemaBuilder.jsx +303 -0
  102. package/management-ui/src/components/codegen/TemplateSelector.jsx +586 -0
  103. package/management-ui/src/components/codegen/index.js +10 -0
  104. package/management-ui/src/components/connections/ConnectionConfigForm.jsx +362 -0
  105. package/management-ui/src/components/connections/ConnectionHealthMonitor.jsx +182 -0
  106. package/management-ui/src/components/connections/ConnectionTester.jsx +200 -0
  107. package/management-ui/src/components/connections/EntityRelationshipMapper.jsx +292 -0
  108. package/management-ui/src/components/connections/OAuthFlow.jsx +204 -0
  109. package/management-ui/src/components/connections/index.js +5 -0
  110. package/management-ui/src/components/index.js +21 -0
  111. package/management-ui/src/components/monitoring/APIGatewayMetrics.jsx +222 -0
  112. package/management-ui/src/components/monitoring/LambdaMetrics.jsx +169 -0
  113. package/management-ui/src/components/monitoring/MetricsChart.jsx +197 -0
  114. package/management-ui/src/components/monitoring/MonitoringDashboard.jsx +393 -0
  115. package/management-ui/src/components/monitoring/SQSMetrics.jsx +246 -0
  116. package/management-ui/src/components/monitoring/index.js +6 -0
  117. package/management-ui/src/components/monitoring/monitoring.css +218 -0
  118. package/management-ui/src/components/theme-provider.jsx +52 -0
  119. package/management-ui/src/components/theme-toggle.jsx +39 -0
  120. package/management-ui/src/components/ui/badge.tsx +36 -0
  121. package/management-ui/src/components/ui/button.test.jsx +56 -0
  122. package/management-ui/src/components/ui/button.tsx +57 -0
  123. package/management-ui/src/components/ui/card.tsx +76 -0
  124. package/management-ui/src/components/ui/dropdown-menu.tsx +199 -0
  125. package/management-ui/src/components/ui/select.tsx +157 -0
  126. package/management-ui/src/components/ui/skeleton.jsx +15 -0
  127. package/management-ui/src/hooks/useFrigg.jsx +601 -0
  128. package/management-ui/src/hooks/useSocket.jsx +58 -0
  129. package/management-ui/src/index.css +193 -0
  130. package/management-ui/src/lib/utils.ts +6 -0
  131. package/management-ui/src/main.jsx +10 -0
  132. package/management-ui/src/pages/CodeGeneration.jsx +14 -0
  133. package/management-ui/src/pages/Connections.jsx +252 -0
  134. package/management-ui/src/pages/ConnectionsEnhanced.jsx +633 -0
  135. package/management-ui/src/pages/Dashboard.jsx +311 -0
  136. package/management-ui/src/pages/Environment.jsx +314 -0
  137. package/management-ui/src/pages/IntegrationConfigure.jsx +669 -0
  138. package/management-ui/src/pages/IntegrationDiscovery.jsx +567 -0
  139. package/management-ui/src/pages/IntegrationTest.jsx +742 -0
  140. package/management-ui/src/pages/Integrations.jsx +253 -0
  141. package/management-ui/src/pages/Monitoring.jsx +17 -0
  142. package/management-ui/src/pages/Simulation.jsx +155 -0
  143. package/management-ui/src/pages/Users.jsx +492 -0
  144. package/management-ui/src/services/api.js +41 -0
  145. package/management-ui/src/services/apiModuleService.js +193 -0
  146. package/management-ui/src/services/websocket-handlers.js +120 -0
  147. package/management-ui/src/test/api/project.test.js +273 -0
  148. package/management-ui/src/test/components/Welcome.test.jsx +378 -0
  149. package/management-ui/src/test/mocks/server.js +178 -0
  150. package/management-ui/src/test/setup.js +61 -0
  151. package/management-ui/src/test/utils/test-utils.jsx +134 -0
  152. package/management-ui/src/utils/repository.js +98 -0
  153. package/management-ui/src/utils/repository.test.js +118 -0
  154. package/management-ui/src/workflows/phase2-integration-workflows.js +884 -0
  155. package/management-ui/tailwind.config.js +63 -0
  156. package/management-ui/tsconfig.json +37 -0
  157. package/management-ui/tsconfig.node.json +10 -0
  158. package/management-ui/vite.config.js +26 -0
  159. package/management-ui/vitest.config.js +38 -0
  160. package/package.json +5 -5
  161. package/management-ui/dist/assets/index-BA21WgFa.js +0 -1221
  162. package/management-ui/dist/assets/index-CbM64Oba.js +0 -1221
  163. package/management-ui/dist/assets/index-CkvseXTC.css +0 -1
  164. /package/management-ui/{dist/assets/FriggLogo-B7Xx8ZW1.svg → src/assets/FriggLogo.svg} +0 -0
@@ -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