@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,601 @@
1
+ import React, { createContext, useContext, useState, useEffect } from 'react'
2
+ import { useSocket } from './useSocket'
3
+ import api from '../services/api'
4
+
5
+ const FriggContext = createContext()
6
+
7
+ export const useFrigg = () => {
8
+ const context = useContext(FriggContext)
9
+ if (!context) {
10
+ throw new Error('useFrigg must be used within FriggProvider')
11
+ }
12
+ return context
13
+ }
14
+
15
+ export const FriggProvider = ({ children }) => {
16
+ const { on, emit } = useSocket()
17
+ const [status, setStatus] = useState('stopped') // running, stopped, starting
18
+ const [environment, setEnvironment] = useState('local')
19
+ const [integrations, setIntegrations] = useState([])
20
+ const [envVariables, setEnvVariables] = useState({})
21
+ const [users, setUsers] = useState([])
22
+ const [connections, setConnections] = useState([])
23
+ const [currentUser, setCurrentUser] = useState(null)
24
+ <<<<<<< HEAD
25
+ <<<<<<< HEAD
26
+ const [repositories, setRepositories] = useState([])
27
+ const [currentRepository, setCurrentRepository] = useState(null)
28
+ const [isLoading, setIsLoading] = useState(true)
29
+ const [loading, setLoading] = useState(false)
30
+ const [error, setError] = useState(null)
31
+ =======
32
+ <<<<<<< HEAD
33
+ <<<<<<< HEAD
34
+ <<<<<<< HEAD
35
+ =======
36
+ =======
37
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
38
+ const [repositories, setRepositories] = useState([])
39
+ const [currentRepository, setCurrentRepository] = useState(null)
40
+ const [isLoading, setIsLoading] = useState(true)
41
+ const [loading, setLoading] = useState(false)
42
+ const [error, setError] = useState(null)
43
+ <<<<<<< HEAD
44
+ =======
45
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
46
+ =======
47
+ const [loading, setLoading] = useState(false)
48
+ const [error, setError] = useState(null)
49
+ >>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
50
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
51
+ =======
52
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
53
+
54
+ useEffect(() => {
55
+ // Listen for status updates
56
+ const unsubscribeStatus = on('frigg:status', (data) => {
57
+ setStatus(data.status)
58
+ })
59
+
60
+ // Listen for integration updates
61
+ const unsubscribeIntegrations = on('integrations:update', (data) => {
62
+ setIntegrations(data.integrations)
63
+ })
64
+
65
+ // Initial data fetch
66
+ initializeApp()
67
+
68
+ return () => {
69
+ unsubscribeStatus && unsubscribeStatus()
70
+ unsubscribeIntegrations && unsubscribeIntegrations()
71
+ }
72
+ }, [on])
73
+
74
+ const initializeApp = async () => {
75
+ try {
76
+ setIsLoading(true)
77
+ // First fetch repositories to see what's available
78
+ const repos = await fetchRepositories()
79
+ // For the new flow, we never auto-set a current repository
80
+ // The user must explicitly select one from the welcome screen
81
+ setCurrentRepository(null)
82
+ } catch (error) {
83
+ console.error('Error initializing app:', error)
84
+ setError(error.message || 'Failed to initialize app')
85
+ } finally {
86
+ setIsLoading(false)
87
+ }
88
+ }
89
+
90
+ const fetchRepositories = async () => {
91
+ try {
92
+ const response = await api.get('/api/project/repositories')
93
+ const repos = response.data.data?.repositories || response.data.repositories || []
94
+ setRepositories(repos)
95
+ return repos
96
+ } catch (error) {
97
+ console.error('Error fetching repositories:', error)
98
+ setRepositories([])
99
+ return []
100
+ }
101
+ }
102
+
103
+ const fetchCurrentRepository = async () => {
104
+ // For the new welcome flow, we never auto-fetch a current repository
105
+ // The user must always make an explicit selection
106
+ setCurrentRepository(null)
107
+ return null
108
+ }
109
+
110
+ const switchRepository = async (repoPath) => {
111
+ try {
112
+ const response = await api.post('/api/project/switch-repository', { repositoryPath: repoPath })
113
+ const repo = response.data.data?.repository || response.data.repository
114
+ setCurrentRepository(repo)
115
+ // Refresh other data after switching repository
116
+ await fetchInitialData()
117
+ return repo
118
+ } catch (error) {
119
+ console.error('Error switching repository:', error)
120
+ throw error
121
+ }
122
+ }
123
+
124
+ const fetchInitialData = async () => {
125
+ try {
126
+ <<<<<<< HEAD
127
+ <<<<<<< HEAD
128
+ =======
129
+ <<<<<<< HEAD
130
+ <<<<<<< HEAD
131
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
132
+ =======
133
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
134
+ setLoading(true)
135
+ setError(null)
136
+
137
+ const [statusRes, integrationsRes, envRes, usersRes, connectionsRes] = await Promise.all([
138
+ api.get('/api/project/status'),
139
+ <<<<<<< HEAD
140
+ <<<<<<< HEAD
141
+ =======
142
+ =======
143
+ const [statusRes, integrationsRes, envRes, usersRes, connectionsRes] = await Promise.all([
144
+ api.get('/api/frigg/status'),
145
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
146
+ =======
147
+ setLoading(true)
148
+ setError(null)
149
+
150
+ const [statusRes, integrationsRes, envRes, usersRes, connectionsRes] = await Promise.all([
151
+ api.get('/api/project/status'),
152
+ >>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
153
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
154
+ =======
155
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
156
+ api.get('/api/integrations'),
157
+ api.get('/api/environment'),
158
+ api.get('/api/users'),
159
+ api.get('/api/connections'),
160
+ ])
161
+
162
+ <<<<<<< HEAD
163
+ <<<<<<< HEAD
164
+ =======
165
+ <<<<<<< HEAD
166
+ <<<<<<< HEAD
167
+ =======
168
+ >>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
169
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
170
+ =======
171
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
172
+ setStatus(statusRes.data.data?.status || statusRes.data.status || 'stopped')
173
+ setIntegrations(integrationsRes.data.data?.integrations || integrationsRes.data.integrations || [])
174
+ setEnvVariables(envRes.data.data?.variables || envRes.data.variables || {})
175
+ setUsers(usersRes.data.data?.users || usersRes.data.users || [])
176
+ setConnections(connectionsRes.data.data?.connections || connectionsRes.data.connections || [])
177
+ <<<<<<< HEAD
178
+ <<<<<<< HEAD
179
+ =======
180
+ <<<<<<< HEAD
181
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
182
+ =======
183
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
184
+ } catch (error) {
185
+ console.error('Error fetching initial data:', error)
186
+ setError(error.message || 'Failed to fetch data')
187
+ } finally {
188
+ setLoading(false)
189
+ <<<<<<< HEAD
190
+ <<<<<<< HEAD
191
+ =======
192
+ =======
193
+ setStatus(statusRes.data.status)
194
+ setIntegrations(integrationsRes.data.integrations || [])
195
+ setEnvVariables(envRes.data.variables || {})
196
+ setUsers(usersRes.data.users || [])
197
+ setConnections(connectionsRes.data.connections || [])
198
+ } catch (error) {
199
+ console.error('Error fetching initial data:', error)
200
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
201
+ =======
202
+ } catch (error) {
203
+ console.error('Error fetching initial data:', error)
204
+ setError(error.message || 'Failed to fetch data')
205
+ } finally {
206
+ setLoading(false)
207
+ >>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
208
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
209
+ =======
210
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
211
+ }
212
+ }
213
+
214
+ const startFrigg = async (options = {}) => {
215
+ try {
216
+ setStatus('starting')
217
+ <<<<<<< HEAD
218
+ <<<<<<< HEAD
219
+ await api.post('/api/project/start', options)
220
+ =======
221
+ <<<<<<< HEAD
222
+ <<<<<<< HEAD
223
+ await api.post('/api/project/start', options)
224
+ =======
225
+ await api.post('/api/frigg/start', options)
226
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
227
+ =======
228
+ await api.post('/api/project/start', options)
229
+ >>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
230
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
231
+ =======
232
+ await api.post('/api/project/start', options)
233
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
234
+ } catch (error) {
235
+ console.error('Error starting Frigg:', error)
236
+ setStatus('stopped')
237
+ }
238
+ }
239
+
240
+ const stopFrigg = async (force = false) => {
241
+ try {
242
+ <<<<<<< HEAD
243
+ <<<<<<< HEAD
244
+ await api.post('/api/project/stop', { force })
245
+ =======
246
+ <<<<<<< HEAD
247
+ <<<<<<< HEAD
248
+ await api.post('/api/project/stop', { force })
249
+ =======
250
+ await api.post('/api/frigg/stop', { force })
251
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
252
+ =======
253
+ await api.post('/api/project/stop', { force })
254
+ >>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
255
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
256
+ =======
257
+ await api.post('/api/project/stop', { force })
258
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
259
+ setStatus('stopped')
260
+ } catch (error) {
261
+ console.error('Error stopping Frigg:', error)
262
+ }
263
+ }
264
+
265
+ const restartFrigg = async (options = {}) => {
266
+ try {
267
+ <<<<<<< HEAD
268
+ <<<<<<< HEAD
269
+ await api.post('/api/project/restart', options)
270
+ =======
271
+ <<<<<<< HEAD
272
+ <<<<<<< HEAD
273
+ await api.post('/api/project/restart', options)
274
+ =======
275
+ await api.post('/api/frigg/restart', options)
276
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
277
+ =======
278
+ await api.post('/api/project/restart', options)
279
+ >>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
280
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
281
+ =======
282
+ await api.post('/api/project/restart', options)
283
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
284
+ } catch (error) {
285
+ console.error('Error restarting Frigg:', error)
286
+ }
287
+ }
288
+
289
+ const getLogs = async (limit = 100) => {
290
+ try {
291
+ <<<<<<< HEAD
292
+ <<<<<<< HEAD
293
+ const response = await api.get(`/api/project/logs?limit=${limit}`)
294
+ return response.data.data?.logs || response.data.logs || []
295
+ =======
296
+ <<<<<<< HEAD
297
+ <<<<<<< HEAD
298
+ const response = await api.get(`/api/project/logs?limit=${limit}`)
299
+ return response.data.data?.logs || response.data.logs || []
300
+ =======
301
+ const response = await api.get(`/api/frigg/logs?limit=${limit}`)
302
+ return response.data.logs || []
303
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
304
+ =======
305
+ const response = await api.get(`/api/project/logs?limit=${limit}`)
306
+ return response.data.data?.logs || response.data.logs || []
307
+ >>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
308
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
309
+ =======
310
+ const response = await api.get(`/api/project/logs?limit=${limit}`)
311
+ return response.data.data?.logs || response.data.logs || []
312
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
313
+ } catch (error) {
314
+ console.error('Error fetching logs:', error)
315
+ return []
316
+ }
317
+ }
318
+
319
+ const getMetrics = async () => {
320
+ try {
321
+ <<<<<<< HEAD
322
+ <<<<<<< HEAD
323
+ const response = await api.get('/api/project/metrics')
324
+ return response.data.data || response.data
325
+ =======
326
+ <<<<<<< HEAD
327
+ <<<<<<< HEAD
328
+ const response = await api.get('/api/project/metrics')
329
+ return response.data.data || response.data
330
+ =======
331
+ const response = await api.get('/api/frigg/metrics')
332
+ return response.data
333
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
334
+ =======
335
+ const response = await api.get('/api/project/metrics')
336
+ return response.data.data || response.data
337
+ >>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
338
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
339
+ =======
340
+ const response = await api.get('/api/project/metrics')
341
+ return response.data.data || response.data
342
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
343
+ } catch (error) {
344
+ console.error('Error fetching metrics:', error)
345
+ return null
346
+ }
347
+ }
348
+
349
+ <<<<<<< HEAD
350
+ <<<<<<< HEAD
351
+ =======
352
+ <<<<<<< HEAD
353
+ <<<<<<< HEAD
354
+
355
+ =======
356
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
357
+ =======
358
+
359
+ >>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
360
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
361
+ =======
362
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
363
+ const installIntegration = async (integrationName) => {
364
+ try {
365
+ const response = await api.post('/api/integrations/install', { name: integrationName })
366
+ await fetchInitialData() // Refresh data
367
+ return response.data
368
+ } catch (error) {
369
+ console.error('Error installing integration:', error)
370
+ throw error
371
+ }
372
+ }
373
+
374
+ const updateEnvVariable = async (key, value) => {
375
+ try {
376
+ await api.put('/api/environment', { key, value })
377
+ setEnvVariables(prev => ({ ...prev, [key]: value }))
378
+ } catch (error) {
379
+ console.error('Error updating environment variable:', error)
380
+ throw error
381
+ }
382
+ }
383
+
384
+ const createUser = async (userData) => {
385
+ try {
386
+ const response = await api.post('/api/users', userData)
387
+ await fetchInitialData() // Refresh data
388
+ return response.data
389
+ } catch (error) {
390
+ console.error('Error creating user:', error)
391
+ throw error
392
+ }
393
+ }
394
+
395
+ const updateUser = async (userId, userData) => {
396
+ try {
397
+ const response = await api.put(`/api/users/${userId}`, userData)
398
+ await fetchInitialData() // Refresh data
399
+ return response.data
400
+ } catch (error) {
401
+ console.error('Error updating user:', error)
402
+ throw error
403
+ }
404
+ }
405
+
406
+ const deleteUser = async (userId) => {
407
+ try {
408
+ const response = await api.delete(`/api/users/${userId}`)
409
+ await fetchInitialData() // Refresh data
410
+ return response.data
411
+ } catch (error) {
412
+ console.error('Error deleting user:', error)
413
+ throw error
414
+ }
415
+ }
416
+
417
+ const bulkCreateUsers = async (count) => {
418
+ try {
419
+ const response = await api.post('/api/users/bulk', { count })
420
+ await fetchInitialData() // Refresh data
421
+ return response.data
422
+ } catch (error) {
423
+ console.error('Error creating bulk users:', error)
424
+ throw error
425
+ }
426
+ }
427
+
428
+ const deleteAllUsers = async () => {
429
+ try {
430
+ const response = await api.delete('/api/users')
431
+ await fetchInitialData() // Refresh data
432
+ return response.data
433
+ } catch (error) {
434
+ console.error('Error deleting all users:', error)
435
+ throw error
436
+ }
437
+ }
438
+
439
+ const switchUserContext = (user) => {
440
+ setCurrentUser(user)
441
+ // Store in localStorage for persistence
442
+ if (user) {
443
+ localStorage.setItem('frigg_current_user', JSON.stringify(user))
444
+ } else {
445
+ localStorage.removeItem('frigg_current_user')
446
+ }
447
+ // Emit event for other components to react
448
+ emit('user:context-switched', { user })
449
+ }
450
+
451
+ // Session management functions
452
+ const createSession = async (userId, metadata = {}) => {
453
+ try {
454
+ const response = await api.post('/api/users/sessions/create', { userId, metadata })
455
+ return response.data.session
456
+ } catch (error) {
457
+ console.error('Error creating session:', error)
458
+ throw error
459
+ }
460
+ }
461
+
462
+ const getSession = async (sessionId) => {
463
+ try {
464
+ const response = await api.get(`/api/users/sessions/${sessionId}`)
465
+ return response.data.session
466
+ } catch (error) {
467
+ console.error('Error fetching session:', error)
468
+ throw error
469
+ }
470
+ }
471
+
472
+ const getUserSessions = async (userId) => {
473
+ try {
474
+ const response = await api.get(`/api/users/sessions/user/${userId}`)
475
+ return response.data.sessions
476
+ } catch (error) {
477
+ console.error('Error fetching user sessions:', error)
478
+ throw error
479
+ }
480
+ }
481
+
482
+ const trackSessionActivity = async (sessionId, action, data = {}) => {
483
+ try {
484
+ const response = await api.post(`/api/users/sessions/${sessionId}/activity`, { action, data })
485
+ return response.data.activity
486
+ } catch (error) {
487
+ console.error('Error tracking session activity:', error)
488
+ throw error
489
+ }
490
+ }
491
+
492
+ const refreshSession = async (sessionId) => {
493
+ try {
494
+ const response = await api.post(`/api/users/sessions/${sessionId}/refresh`)
495
+ return response.data.session
496
+ } catch (error) {
497
+ console.error('Error refreshing session:', error)
498
+ throw error
499
+ }
500
+ }
501
+
502
+ const endSession = async (sessionId) => {
503
+ try {
504
+ const response = await api.delete(`/api/users/sessions/${sessionId}`)
505
+ return response.data
506
+ } catch (error) {
507
+ console.error('Error ending session:', error)
508
+ throw error
509
+ }
510
+ }
511
+
512
+ const getAllSessions = async () => {
513
+ try {
514
+ const response = await api.get('/api/users/sessions')
515
+ return response.data
516
+ } catch (error) {
517
+ console.error('Error fetching all sessions:', error)
518
+ throw error
519
+ }
520
+ }
521
+
522
+ // Load current user from localStorage on mount
523
+ useEffect(() => {
524
+ const storedUser = localStorage.getItem('frigg_current_user')
525
+ if (storedUser) {
526
+ try {
527
+ setCurrentUser(JSON.parse(storedUser))
528
+ } catch (error) {
529
+ console.error('Error loading stored user context:', error)
530
+ }
531
+ }
532
+ }, [])
533
+
534
+ const value = {
535
+ status,
536
+ environment,
537
+ integrations,
538
+ envVariables,
539
+ users,
540
+ connections,
541
+ currentUser,
542
+ <<<<<<< HEAD
543
+ <<<<<<< HEAD
544
+ repositories,
545
+ currentRepository,
546
+ isLoading,
547
+ loading,
548
+ error,
549
+ =======
550
+ <<<<<<< HEAD
551
+ <<<<<<< HEAD
552
+ <<<<<<< HEAD
553
+ =======
554
+ =======
555
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
556
+ repositories,
557
+ currentRepository,
558
+ isLoading,
559
+ loading,
560
+ error,
561
+ <<<<<<< HEAD
562
+ =======
563
+ >>>>>>> 652520a5 (Claude Flow RFC related development)
564
+ =======
565
+ loading,
566
+ error,
567
+ >>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
568
+ >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
569
+ =======
570
+ >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
571
+ startFrigg,
572
+ stopFrigg,
573
+ restartFrigg,
574
+ getLogs,
575
+ getMetrics,
576
+ installIntegration,
577
+ updateEnvVariable,
578
+ createUser,
579
+ updateUser,
580
+ deleteUser,
581
+ bulkCreateUsers,
582
+ deleteAllUsers,
583
+ switchUserContext,
584
+ createSession,
585
+ getSession,
586
+ getUserSessions,
587
+ trackSessionActivity,
588
+ refreshSession,
589
+ endSession,
590
+ getAllSessions,
591
+ fetchRepositories,
592
+ switchRepository,
593
+ refreshData: fetchInitialData,
594
+ }
595
+
596
+ return (
597
+ <FriggContext.Provider value={value}>
598
+ {children}
599
+ </FriggContext.Provider>
600
+ )
601
+ }
@@ -0,0 +1,58 @@
1
+ import React, { createContext, useContext, useEffect, useState } from 'react'
2
+ import io from 'socket.io-client'
3
+
4
+ const SocketContext = createContext()
5
+
6
+ export const useSocket = () => {
7
+ const context = useContext(SocketContext)
8
+ if (!context) {
9
+ throw new Error('useSocket must be used within SocketProvider')
10
+ }
11
+ return context
12
+ }
13
+
14
+ export const SocketProvider = ({ children }) => {
15
+ const [socket, setSocket] = useState(null)
16
+ const [connected, setConnected] = useState(false)
17
+
18
+ useEffect(() => {
19
+ const newSocket = io('http://localhost:3001', {
20
+ transports: ['websocket', 'polling'],
21
+ })
22
+
23
+ newSocket.on('connect', () => {
24
+ console.log('Connected to server')
25
+ setConnected(true)
26
+ })
27
+
28
+ newSocket.on('disconnect', () => {
29
+ console.log('Disconnected from server')
30
+ setConnected(false)
31
+ })
32
+
33
+ setSocket(newSocket)
34
+
35
+ return () => {
36
+ newSocket.close()
37
+ }
38
+ }, [])
39
+
40
+ const emit = (event, data) => {
41
+ if (socket && connected) {
42
+ socket.emit(event, data)
43
+ }
44
+ }
45
+
46
+ const on = (event, callback) => {
47
+ if (socket) {
48
+ socket.on(event, callback)
49
+ return () => socket.off(event, callback)
50
+ }
51
+ }
52
+
53
+ return (
54
+ <SocketContext.Provider value={{ socket, connected, emit, on }}>
55
+ {children}
56
+ </SocketContext.Provider>
57
+ )
58
+ }