@friggframework/devtools 2.0.0-next.4 → 2.0.0-next.41
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.
- package/frigg-cli/.eslintrc.js +141 -0
- package/frigg-cli/__tests__/jest.config.js +102 -0
- package/frigg-cli/__tests__/unit/commands/build.test.js +483 -0
- package/frigg-cli/__tests__/unit/commands/install.test.js +418 -0
- package/frigg-cli/__tests__/unit/commands/ui.test.js +592 -0
- package/frigg-cli/__tests__/utils/command-tester.js +170 -0
- package/frigg-cli/__tests__/utils/mock-factory.js +270 -0
- package/frigg-cli/__tests__/utils/test-fixtures.js +463 -0
- package/frigg-cli/__tests__/utils/test-setup.js +286 -0
- package/frigg-cli/build-command/index.js +54 -0
- package/frigg-cli/deploy-command/index.js +175 -0
- package/frigg-cli/generate-command/__tests__/generate-command.test.js +312 -0
- package/frigg-cli/generate-command/azure-generator.js +43 -0
- package/frigg-cli/generate-command/gcp-generator.js +47 -0
- package/frigg-cli/generate-command/index.js +332 -0
- package/frigg-cli/generate-command/terraform-generator.js +555 -0
- package/frigg-cli/generate-iam-command.js +115 -0
- package/frigg-cli/index.js +47 -1
- package/frigg-cli/index.test.js +1 -4
- package/frigg-cli/init-command/backend-first-handler.js +756 -0
- package/frigg-cli/init-command/index.js +93 -0
- package/frigg-cli/init-command/template-handler.js +143 -0
- package/frigg-cli/install-command/index.js +1 -4
- package/frigg-cli/package.json +51 -0
- package/frigg-cli/start-command/index.js +30 -4
- package/frigg-cli/start-command/start-command.test.js +155 -0
- package/frigg-cli/test/init-command.test.js +180 -0
- package/frigg-cli/test/npm-registry.test.js +319 -0
- package/frigg-cli/ui-command/index.js +154 -0
- package/frigg-cli/utils/app-resolver.js +319 -0
- package/frigg-cli/utils/backend-path.js +16 -17
- package/frigg-cli/utils/npm-registry.js +167 -0
- package/frigg-cli/utils/process-manager.js +199 -0
- package/frigg-cli/utils/repo-detection.js +405 -0
- package/infrastructure/DEPLOYMENT-INSTRUCTIONS.md +268 -0
- package/infrastructure/GENERATE-IAM-DOCS.md +278 -0
- package/infrastructure/IAM-POLICY-TEMPLATES.md +176 -0
- package/infrastructure/README.md +443 -0
- package/infrastructure/WEBSOCKET-CONFIGURATION.md +105 -0
- package/infrastructure/__tests__/fixtures/mock-aws-resources.js +391 -0
- package/infrastructure/__tests__/helpers/test-utils.js +277 -0
- package/infrastructure/aws-discovery.js +1176 -0
- package/infrastructure/aws-discovery.test.js +1220 -0
- package/infrastructure/build-time-discovery.js +206 -0
- package/infrastructure/build-time-discovery.test.js +378 -0
- package/infrastructure/create-frigg-infrastructure.js +3 -5
- package/infrastructure/env-validator.js +77 -0
- package/infrastructure/frigg-deployment-iam-stack.yaml +401 -0
- package/infrastructure/iam-generator.js +836 -0
- package/infrastructure/iam-generator.test.js +172 -0
- package/infrastructure/iam-policy-basic.json +218 -0
- package/infrastructure/iam-policy-full.json +288 -0
- package/infrastructure/integration.test.js +383 -0
- package/infrastructure/run-discovery.js +110 -0
- package/infrastructure/serverless-template.js +1493 -138
- package/infrastructure/serverless-template.test.js +1804 -0
- package/management-ui/.eslintrc.js +22 -0
- package/management-ui/README.md +203 -0
- package/management-ui/components.json +21 -0
- package/management-ui/docs/phase2-integration-guide.md +320 -0
- package/management-ui/index.html +13 -0
- package/management-ui/package-lock.json +16517 -0
- package/management-ui/package.json +76 -0
- package/management-ui/packages/devtools/frigg-cli/ui-command/index.js +302 -0
- package/management-ui/postcss.config.js +6 -0
- package/management-ui/server/api/backend.js +256 -0
- package/management-ui/server/api/cli.js +315 -0
- package/management-ui/server/api/codegen.js +663 -0
- package/management-ui/server/api/connections.js +857 -0
- package/management-ui/server/api/discovery.js +185 -0
- package/management-ui/server/api/environment/index.js +1 -0
- package/management-ui/server/api/environment/router.js +378 -0
- package/management-ui/server/api/environment.js +328 -0
- package/management-ui/server/api/integrations.js +876 -0
- package/management-ui/server/api/logs.js +248 -0
- package/management-ui/server/api/monitoring.js +282 -0
- package/management-ui/server/api/open-ide.js +31 -0
- package/management-ui/server/api/project.js +1029 -0
- package/management-ui/server/api/users/sessions.js +371 -0
- package/management-ui/server/api/users/simulation.js +254 -0
- package/management-ui/server/api/users.js +362 -0
- package/management-ui/server/api-contract.md +275 -0
- package/management-ui/server/index.js +873 -0
- package/management-ui/server/middleware/errorHandler.js +93 -0
- package/management-ui/server/middleware/security.js +32 -0
- package/management-ui/server/processManager.js +296 -0
- package/management-ui/server/server.js +346 -0
- package/management-ui/server/services/aws-monitor.js +413 -0
- package/management-ui/server/services/npm-registry.js +347 -0
- package/management-ui/server/services/template-engine.js +538 -0
- package/management-ui/server/utils/cliIntegration.js +220 -0
- package/management-ui/server/utils/environment/auditLogger.js +471 -0
- package/management-ui/server/utils/environment/awsParameterStore.js +264 -0
- package/management-ui/server/utils/environment/encryption.js +278 -0
- package/management-ui/server/utils/environment/envFileManager.js +286 -0
- package/management-ui/server/utils/import-commonjs.js +28 -0
- package/management-ui/server/utils/response.js +83 -0
- package/management-ui/server/websocket/handler.js +325 -0
- package/management-ui/src/App.jsx +109 -0
- package/management-ui/src/assets/FriggLogo.svg +1 -0
- package/management-ui/src/components/AppRouter.jsx +65 -0
- package/management-ui/src/components/Button.jsx +70 -0
- package/management-ui/src/components/Card.jsx +97 -0
- package/management-ui/src/components/EnvironmentCompare.jsx +400 -0
- package/management-ui/src/components/EnvironmentEditor.jsx +372 -0
- package/management-ui/src/components/EnvironmentImportExport.jsx +469 -0
- package/management-ui/src/components/EnvironmentSchema.jsx +491 -0
- package/management-ui/src/components/EnvironmentSecurity.jsx +463 -0
- package/management-ui/src/components/ErrorBoundary.jsx +73 -0
- package/management-ui/src/components/IntegrationCard.jsx +481 -0
- package/management-ui/src/components/IntegrationCardEnhanced.jsx +770 -0
- package/management-ui/src/components/IntegrationExplorer.jsx +379 -0
- package/management-ui/src/components/IntegrationStatus.jsx +336 -0
- package/management-ui/src/components/Layout.jsx +716 -0
- package/management-ui/src/components/LoadingSpinner.jsx +113 -0
- package/management-ui/src/components/RepositoryPicker.jsx +248 -0
- package/management-ui/src/components/SessionMonitor.jsx +350 -0
- package/management-ui/src/components/StatusBadge.jsx +208 -0
- package/management-ui/src/components/UserContextSwitcher.jsx +212 -0
- package/management-ui/src/components/UserSimulation.jsx +327 -0
- package/management-ui/src/components/Welcome.jsx +434 -0
- package/management-ui/src/components/codegen/APIEndpointGenerator.jsx +637 -0
- package/management-ui/src/components/codegen/APIModuleSelector.jsx +227 -0
- package/management-ui/src/components/codegen/CodeGenerationWizard.jsx +247 -0
- package/management-ui/src/components/codegen/CodePreviewEditor.jsx +316 -0
- package/management-ui/src/components/codegen/DynamicModuleForm.jsx +271 -0
- package/management-ui/src/components/codegen/FormBuilder.jsx +737 -0
- package/management-ui/src/components/codegen/IntegrationGenerator.jsx +855 -0
- package/management-ui/src/components/codegen/ProjectScaffoldWizard.jsx +797 -0
- package/management-ui/src/components/codegen/SchemaBuilder.jsx +303 -0
- package/management-ui/src/components/codegen/TemplateSelector.jsx +586 -0
- package/management-ui/src/components/codegen/index.js +10 -0
- package/management-ui/src/components/connections/ConnectionConfigForm.jsx +362 -0
- package/management-ui/src/components/connections/ConnectionHealthMonitor.jsx +182 -0
- package/management-ui/src/components/connections/ConnectionTester.jsx +200 -0
- package/management-ui/src/components/connections/EntityRelationshipMapper.jsx +292 -0
- package/management-ui/src/components/connections/OAuthFlow.jsx +204 -0
- package/management-ui/src/components/connections/index.js +5 -0
- package/management-ui/src/components/index.js +21 -0
- package/management-ui/src/components/monitoring/APIGatewayMetrics.jsx +222 -0
- package/management-ui/src/components/monitoring/LambdaMetrics.jsx +169 -0
- package/management-ui/src/components/monitoring/MetricsChart.jsx +197 -0
- package/management-ui/src/components/monitoring/MonitoringDashboard.jsx +393 -0
- package/management-ui/src/components/monitoring/SQSMetrics.jsx +246 -0
- package/management-ui/src/components/monitoring/index.js +6 -0
- package/management-ui/src/components/monitoring/monitoring.css +218 -0
- package/management-ui/src/components/theme-provider.jsx +52 -0
- package/management-ui/src/components/theme-toggle.jsx +39 -0
- package/management-ui/src/components/ui/badge.tsx +36 -0
- package/management-ui/src/components/ui/button.test.jsx +56 -0
- package/management-ui/src/components/ui/button.tsx +57 -0
- package/management-ui/src/components/ui/card.tsx +76 -0
- package/management-ui/src/components/ui/dropdown-menu.tsx +199 -0
- package/management-ui/src/components/ui/select.tsx +157 -0
- package/management-ui/src/components/ui/skeleton.jsx +15 -0
- package/management-ui/src/hooks/useFrigg.jsx +601 -0
- package/management-ui/src/hooks/useSocket.jsx +58 -0
- package/management-ui/src/index.css +193 -0
- package/management-ui/src/lib/utils.ts +6 -0
- package/management-ui/src/main.jsx +10 -0
- package/management-ui/src/pages/CodeGeneration.jsx +14 -0
- package/management-ui/src/pages/Connections.jsx +252 -0
- package/management-ui/src/pages/ConnectionsEnhanced.jsx +633 -0
- package/management-ui/src/pages/Dashboard.jsx +311 -0
- package/management-ui/src/pages/Environment.jsx +314 -0
- package/management-ui/src/pages/IntegrationConfigure.jsx +669 -0
- package/management-ui/src/pages/IntegrationDiscovery.jsx +567 -0
- package/management-ui/src/pages/IntegrationTest.jsx +742 -0
- package/management-ui/src/pages/Integrations.jsx +253 -0
- package/management-ui/src/pages/Monitoring.jsx +17 -0
- package/management-ui/src/pages/Simulation.jsx +155 -0
- package/management-ui/src/pages/Users.jsx +492 -0
- package/management-ui/src/services/api.js +41 -0
- package/management-ui/src/services/apiModuleService.js +193 -0
- package/management-ui/src/services/websocket-handlers.js +120 -0
- package/management-ui/src/test/api/project.test.js +273 -0
- package/management-ui/src/test/components/Welcome.test.jsx +378 -0
- package/management-ui/src/test/mocks/server.js +178 -0
- package/management-ui/src/test/setup.js +61 -0
- package/management-ui/src/test/utils/test-utils.jsx +134 -0
- package/management-ui/src/utils/repository.js +98 -0
- package/management-ui/src/utils/repository.test.js +118 -0
- package/management-ui/src/workflows/phase2-integration-workflows.js +884 -0
- package/management-ui/tailwind.config.js +63 -0
- package/management-ui/tsconfig.json +37 -0
- package/management-ui/tsconfig.node.json +10 -0
- package/management-ui/vite.config.js +26 -0
- package/management-ui/vitest.config.js +38 -0
- package/package.json +20 -9
- package/infrastructure/app-handler-helpers.js +0 -57
- package/infrastructure/backend-utils.js +0 -90
- package/infrastructure/routers/auth.js +0 -26
- package/infrastructure/routers/integration-defined-routers.js +0 -37
- package/infrastructure/routers/middleware/loadUser.js +0 -15
- package/infrastructure/routers/middleware/requireLoggedInUser.js +0 -12
- package/infrastructure/routers/user.js +0 -41
- package/infrastructure/routers/websocket.js +0 -55
- package/infrastructure/workers/integration-defined-workers.js +0 -24
|
@@ -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
|
+
}
|