@friggframework/devtools 2.0.0--canary.517.35ee143.0 → 2.0.0--canary.524.06156322a.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/infrastructure/domains/shared/types/app-definition.js +0 -21
  2. package/infrastructure/domains/shared/utilities/base-definition-factory.js +15 -1
  3. package/infrastructure/infrastructure-composer.js +0 -2
  4. package/package.json +15 -7
  5. package/.eslintrc.json +0 -3
  6. package/CHANGELOG.md +0 -132
  7. package/infrastructure/domains/admin-scripts/admin-script-builder.js +0 -200
  8. package/infrastructure/domains/admin-scripts/admin-script-builder.test.js +0 -499
  9. package/infrastructure/domains/admin-scripts/index.js +0 -5
  10. package/layers/prisma/.build-complete +0 -3
  11. package/layers/prisma/nodejs/package.json +0 -8
  12. package/management-ui/.eslintrc.js +0 -22
  13. package/management-ui/components.json +0 -21
  14. package/management-ui/docs/phase2-integration-guide.md +0 -320
  15. package/management-ui/index.html +0 -13
  16. package/management-ui/package.json +0 -76
  17. package/management-ui/packages/devtools/frigg-cli/ui-command/index.js +0 -302
  18. package/management-ui/postcss.config.js +0 -6
  19. package/management-ui/server/api/backend.js +0 -256
  20. package/management-ui/server/api/cli.js +0 -315
  21. package/management-ui/server/api/codegen.js +0 -663
  22. package/management-ui/server/api/connections.js +0 -857
  23. package/management-ui/server/api/discovery.js +0 -185
  24. package/management-ui/server/api/environment/index.js +0 -1
  25. package/management-ui/server/api/environment/router.js +0 -378
  26. package/management-ui/server/api/environment.js +0 -328
  27. package/management-ui/server/api/integrations.js +0 -876
  28. package/management-ui/server/api/logs.js +0 -248
  29. package/management-ui/server/api/monitoring.js +0 -282
  30. package/management-ui/server/api/open-ide.js +0 -31
  31. package/management-ui/server/api/project.js +0 -1029
  32. package/management-ui/server/api/users/sessions.js +0 -371
  33. package/management-ui/server/api/users/simulation.js +0 -254
  34. package/management-ui/server/api/users.js +0 -362
  35. package/management-ui/server/api-contract.md +0 -275
  36. package/management-ui/server/index.js +0 -873
  37. package/management-ui/server/middleware/errorHandler.js +0 -93
  38. package/management-ui/server/middleware/security.js +0 -32
  39. package/management-ui/server/processManager.js +0 -296
  40. package/management-ui/server/server.js +0 -346
  41. package/management-ui/server/services/aws-monitor.js +0 -413
  42. package/management-ui/server/services/npm-registry.js +0 -347
  43. package/management-ui/server/services/template-engine.js +0 -538
  44. package/management-ui/server/utils/cliIntegration.js +0 -220
  45. package/management-ui/server/utils/environment/auditLogger.js +0 -471
  46. package/management-ui/server/utils/environment/awsParameterStore.js +0 -275
  47. package/management-ui/server/utils/environment/encryption.js +0 -278
  48. package/management-ui/server/utils/environment/envFileManager.js +0 -286
  49. package/management-ui/server/utils/import-commonjs.js +0 -28
  50. package/management-ui/server/utils/response.js +0 -83
  51. package/management-ui/server/websocket/handler.js +0 -325
  52. package/management-ui/src/App.jsx +0 -25
  53. package/management-ui/src/assets/FriggLogo.svg +0 -1
  54. package/management-ui/src/components/AppRouter.jsx +0 -65
  55. package/management-ui/src/components/Button.jsx +0 -70
  56. package/management-ui/src/components/Card.jsx +0 -97
  57. package/management-ui/src/components/EnvironmentCompare.jsx +0 -400
  58. package/management-ui/src/components/EnvironmentEditor.jsx +0 -372
  59. package/management-ui/src/components/EnvironmentImportExport.jsx +0 -469
  60. package/management-ui/src/components/EnvironmentSchema.jsx +0 -491
  61. package/management-ui/src/components/EnvironmentSecurity.jsx +0 -463
  62. package/management-ui/src/components/ErrorBoundary.jsx +0 -73
  63. package/management-ui/src/components/IntegrationCard.jsx +0 -481
  64. package/management-ui/src/components/IntegrationCardEnhanced.jsx +0 -770
  65. package/management-ui/src/components/IntegrationExplorer.jsx +0 -379
  66. package/management-ui/src/components/IntegrationStatus.jsx +0 -336
  67. package/management-ui/src/components/Layout.jsx +0 -716
  68. package/management-ui/src/components/LoadingSpinner.jsx +0 -113
  69. package/management-ui/src/components/RepositoryPicker.jsx +0 -248
  70. package/management-ui/src/components/SessionMonitor.jsx +0 -350
  71. package/management-ui/src/components/StatusBadge.jsx +0 -208
  72. package/management-ui/src/components/UserContextSwitcher.jsx +0 -212
  73. package/management-ui/src/components/UserSimulation.jsx +0 -327
  74. package/management-ui/src/components/Welcome.jsx +0 -434
  75. package/management-ui/src/components/codegen/APIEndpointGenerator.jsx +0 -637
  76. package/management-ui/src/components/codegen/APIModuleSelector.jsx +0 -227
  77. package/management-ui/src/components/codegen/CodeGenerationWizard.jsx +0 -247
  78. package/management-ui/src/components/codegen/CodePreviewEditor.jsx +0 -316
  79. package/management-ui/src/components/codegen/DynamicModuleForm.jsx +0 -271
  80. package/management-ui/src/components/codegen/FormBuilder.jsx +0 -737
  81. package/management-ui/src/components/codegen/IntegrationGenerator.jsx +0 -855
  82. package/management-ui/src/components/codegen/ProjectScaffoldWizard.jsx +0 -797
  83. package/management-ui/src/components/codegen/SchemaBuilder.jsx +0 -303
  84. package/management-ui/src/components/codegen/TemplateSelector.jsx +0 -586
  85. package/management-ui/src/components/codegen/index.js +0 -10
  86. package/management-ui/src/components/connections/ConnectionConfigForm.jsx +0 -362
  87. package/management-ui/src/components/connections/ConnectionHealthMonitor.jsx +0 -182
  88. package/management-ui/src/components/connections/ConnectionTester.jsx +0 -200
  89. package/management-ui/src/components/connections/EntityRelationshipMapper.jsx +0 -292
  90. package/management-ui/src/components/connections/OAuthFlow.jsx +0 -204
  91. package/management-ui/src/components/connections/index.js +0 -5
  92. package/management-ui/src/components/index.js +0 -21
  93. package/management-ui/src/components/monitoring/APIGatewayMetrics.jsx +0 -222
  94. package/management-ui/src/components/monitoring/LambdaMetrics.jsx +0 -169
  95. package/management-ui/src/components/monitoring/MetricsChart.jsx +0 -197
  96. package/management-ui/src/components/monitoring/MonitoringDashboard.jsx +0 -393
  97. package/management-ui/src/components/monitoring/SQSMetrics.jsx +0 -246
  98. package/management-ui/src/components/monitoring/index.js +0 -6
  99. package/management-ui/src/components/monitoring/monitoring.css +0 -218
  100. package/management-ui/src/components/theme-provider.jsx +0 -52
  101. package/management-ui/src/components/theme-toggle.jsx +0 -39
  102. package/management-ui/src/components/ui/badge.tsx +0 -36
  103. package/management-ui/src/components/ui/button.test.jsx +0 -56
  104. package/management-ui/src/components/ui/button.tsx +0 -57
  105. package/management-ui/src/components/ui/card.tsx +0 -76
  106. package/management-ui/src/components/ui/dropdown-menu.tsx +0 -199
  107. package/management-ui/src/components/ui/select.tsx +0 -157
  108. package/management-ui/src/components/ui/skeleton.jsx +0 -15
  109. package/management-ui/src/hooks/useFrigg.jsx +0 -387
  110. package/management-ui/src/hooks/useSocket.jsx +0 -58
  111. package/management-ui/src/index.css +0 -193
  112. package/management-ui/src/lib/utils.ts +0 -6
  113. package/management-ui/src/main.jsx +0 -10
  114. package/management-ui/src/pages/CodeGeneration.jsx +0 -14
  115. package/management-ui/src/pages/Connections.jsx +0 -252
  116. package/management-ui/src/pages/ConnectionsEnhanced.jsx +0 -633
  117. package/management-ui/src/pages/Dashboard.jsx +0 -311
  118. package/management-ui/src/pages/Environment.jsx +0 -314
  119. package/management-ui/src/pages/IntegrationConfigure.jsx +0 -669
  120. package/management-ui/src/pages/IntegrationDiscovery.jsx +0 -567
  121. package/management-ui/src/pages/IntegrationTest.jsx +0 -742
  122. package/management-ui/src/pages/Integrations.jsx +0 -253
  123. package/management-ui/src/pages/Monitoring.jsx +0 -17
  124. package/management-ui/src/pages/Simulation.jsx +0 -155
  125. package/management-ui/src/pages/Users.jsx +0 -492
  126. package/management-ui/src/services/api.js +0 -41
  127. package/management-ui/src/services/apiModuleService.js +0 -193
  128. package/management-ui/src/services/websocket-handlers.js +0 -120
  129. package/management-ui/src/test/api/project.test.js +0 -273
  130. package/management-ui/src/test/components/Welcome.test.jsx +0 -378
  131. package/management-ui/src/test/mocks/server.js +0 -178
  132. package/management-ui/src/test/setup.js +0 -61
  133. package/management-ui/src/test/utils/test-utils.jsx +0 -134
  134. package/management-ui/src/utils/repository.js +0 -98
  135. package/management-ui/src/utils/repository.test.js +0 -118
  136. package/management-ui/src/workflows/phase2-integration-workflows.js +0 -884
  137. package/management-ui/tailwind.config.js +0 -63
  138. package/management-ui/tsconfig.json +0 -37
  139. package/management-ui/tsconfig.node.json +0 -10
  140. package/management-ui/vite.config.js +0 -26
  141. package/management-ui/vitest.config.js +0 -38
  142. package/test/auther-definition-method-tester.js +0 -45
  143. package/test/index.js +0 -9
  144. package/test/integration-validator.js +0 -2
  145. package/test/mock-api-readme.md +0 -102
  146. package/test/mock-api.js +0 -284
  147. package/test/mock-integration.js +0 -78
@@ -1,212 +0,0 @@
1
- import React, { useState, useRef, useEffect } from 'react'
2
- import { User, ChevronDown, UserCircle } from 'lucide-react'
3
- <<<<<<< HEAD
4
- <<<<<<< HEAD
5
- import { cn } from '../lib/utils'
6
- =======
7
- <<<<<<< HEAD
8
- <<<<<<< HEAD
9
- import { cn } from '../lib/utils'
10
- =======
11
- import { cn } from '../utils/cn'
12
- >>>>>>> 652520a5 (Claude Flow RFC related development)
13
- =======
14
- import { cn } from '../lib/utils'
15
- >>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
16
- >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
17
- =======
18
- import { cn } from '../lib/utils'
19
- >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
20
-
21
- const UserContextSwitcher = ({ users, currentUser, onUserSwitch }) => {
22
- const [isOpen, setIsOpen] = useState(false)
23
- const dropdownRef = useRef(null)
24
-
25
- // Close dropdown when clicking outside
26
- useEffect(() => {
27
- const handleClickOutside = (event) => {
28
- if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
29
- setIsOpen(false)
30
- }
31
- }
32
-
33
- document.addEventListener('mousedown', handleClickOutside)
34
- return () => document.removeEventListener('mousedown', handleClickOutside)
35
- }, [])
36
-
37
- const handleUserSelect = (user) => {
38
- onUserSwitch(user)
39
- setIsOpen(false)
40
- }
41
-
42
- const clearContext = () => {
43
- onUserSwitch(null)
44
- setIsOpen(false)
45
- }
46
-
47
- return (
48
- <div className="relative" ref={dropdownRef}>
49
- <button
50
- onClick={() => setIsOpen(!isOpen)}
51
- className={cn(
52
- "flex items-center space-x-2 px-3 py-2 rounded-md text-sm font-medium transition-colors",
53
- <<<<<<< HEAD
54
- <<<<<<< HEAD
55
- currentUser
56
- ? "bg-blue-100 text-blue-700 hover:bg-blue-200"
57
- =======
58
- <<<<<<< HEAD
59
- currentUser
60
- ? "bg-blue-100 text-blue-700 hover:bg-blue-200"
61
- =======
62
- currentUser
63
- ? "bg-blue-100 text-blue-700 hover:bg-blue-200"
64
- >>>>>>> 652520a5 (Claude Flow RFC related development)
65
- >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
66
- =======
67
- currentUser
68
- ? "bg-blue-100 text-blue-700 hover:bg-blue-200"
69
- >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
70
- : "bg-gray-100 text-gray-700 hover:bg-gray-200"
71
- )}
72
- >
73
- {currentUser ? (
74
- <>
75
- <div className="w-6 h-6 rounded-full bg-blue-600 text-white flex items-center justify-center text-xs">
76
- {currentUser.firstName?.[0]}{currentUser.lastName?.[0]}
77
- </div>
78
- <span className="max-w-[150px] truncate">
79
- {currentUser.firstName} {currentUser.lastName}
80
- </span>
81
- </>
82
- ) : (
83
- <>
84
- <UserCircle size={20} />
85
- <span>No User Context</span>
86
- </>
87
- )}
88
- <ChevronDown size={16} className={cn(
89
- "transition-transform",
90
- isOpen && "rotate-180"
91
- )} />
92
- </button>
93
-
94
- {/* Dropdown */}
95
- {isOpen && (
96
- <div className="absolute right-0 mt-2 w-72 bg-white rounded-lg shadow-lg border border-gray-200 z-50">
97
- <div className="p-3 border-b border-gray-200">
98
- <h3 className="text-sm font-semibold text-gray-900">Switch User Context</h3>
99
- <p className="text-xs text-gray-500 mt-1">
100
- Simulate integration behavior as different users
101
- </p>
102
- </div>
103
-
104
- <div className="max-h-64 overflow-y-auto">
105
- {users.length === 0 ? (
106
- <div className="p-4 text-center text-sm text-gray-500">
107
- No users available. Create a test user first.
108
- </div>
109
- ) : (
110
- <>
111
- {currentUser && (
112
- <button
113
- onClick={clearContext}
114
- className="w-full text-left px-4 py-3 hover:bg-gray-50 flex items-center space-x-3 border-b border-gray-100"
115
- >
116
- <div className="w-8 h-8 rounded-full bg-gray-300 flex items-center justify-center">
117
- <User size={16} className="text-gray-600" />
118
- </div>
119
- <div>
120
- <p className="text-sm font-medium text-gray-900">Clear Context</p>
121
- <p className="text-xs text-gray-500">Use default system context</p>
122
- </div>
123
- </button>
124
- )}
125
- <<<<<<< HEAD
126
- <<<<<<< HEAD
127
-
128
- =======
129
- <<<<<<< HEAD
130
-
131
- =======
132
-
133
- >>>>>>> 652520a5 (Claude Flow RFC related development)
134
- >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
135
- =======
136
-
137
- >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
138
- {users.map((user) => (
139
- <button
140
- key={user.id}
141
- onClick={() => handleUserSelect(user)}
142
- className={cn(
143
- "w-full text-left px-4 py-3 hover:bg-gray-50 flex items-center space-x-3",
144
- currentUser?.id === user.id && "bg-blue-50"
145
- )}
146
- >
147
- <div className={cn(
148
- "w-8 h-8 rounded-full flex items-center justify-center text-xs font-medium",
149
- <<<<<<< HEAD
150
- <<<<<<< HEAD
151
- currentUser?.id === user.id
152
- ? "bg-blue-600 text-white"
153
- =======
154
- <<<<<<< HEAD
155
- currentUser?.id === user.id
156
- ? "bg-blue-600 text-white"
157
- =======
158
- currentUser?.id === user.id
159
- ? "bg-blue-600 text-white"
160
- >>>>>>> 652520a5 (Claude Flow RFC related development)
161
- >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
162
- =======
163
- currentUser?.id === user.id
164
- ? "bg-blue-600 text-white"
165
- >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
166
- : "bg-gray-300 text-gray-700"
167
- )}>
168
- {user.firstName?.[0]}{user.lastName?.[0]}
169
- </div>
170
- <div className="flex-1 min-w-0">
171
- <p className="text-sm font-medium text-gray-900">
172
- {user.firstName} {user.lastName}
173
- </p>
174
- <p className="text-xs text-gray-500 truncate">{user.email}</p>
175
- <div className="flex items-center space-x-2 mt-1">
176
- <span className="text-xs bg-gray-100 text-gray-600 px-2 py-0.5 rounded">
177
- {user.role}
178
- </span>
179
- {user.appOrgId && (
180
- <span className="text-xs text-gray-500">
181
- Org: {user.appOrgId}
182
- </span>
183
- )}
184
- </div>
185
- </div>
186
- {currentUser?.id === user.id && (
187
- <div className="text-blue-600">
188
- <svg className="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
189
- <path fillRule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clipRule="evenodd" />
190
- </svg>
191
- </div>
192
- )}
193
- </button>
194
- ))}
195
- </>
196
- )}
197
- </div>
198
-
199
- {currentUser && (
200
- <div className="p-3 bg-gray-50 border-t border-gray-200">
201
- <p className="text-xs text-gray-600">
202
- <span className="font-medium">Current context:</span> {currentUser.appUserId || currentUser.email}
203
- </p>
204
- </div>
205
- )}
206
- </div>
207
- )}
208
- </div>
209
- )
210
- }
211
-
212
- export default UserContextSwitcher
@@ -1,327 +0,0 @@
1
- import React, { useState, useEffect } from 'react'
2
- import { Play, Square, AlertCircle, CheckCircle, Clock, Zap } from 'lucide-react'
3
- import { useFrigg } from '../hooks/useFrigg'
4
- import { useSocket } from '../hooks/useSocket'
5
- import api from '../services/api'
6
- <<<<<<< HEAD
7
- <<<<<<< HEAD
8
- import { cn } from '../lib/utils'
9
- =======
10
- <<<<<<< HEAD
11
- <<<<<<< HEAD
12
- import { cn } from '../lib/utils'
13
- =======
14
- import { cn } from '../utils/cn'
15
- >>>>>>> 652520a5 (Claude Flow RFC related development)
16
- =======
17
- import { cn } from '../lib/utils'
18
- >>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
19
- >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
20
- =======
21
- import { cn } from '../lib/utils'
22
- >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
23
-
24
- const UserSimulation = ({ user, integration }) => {
25
- const { currentUser } = useFrigg()
26
- const { on } = useSocket()
27
- const [isSimulating, setIsSimulating] = useState(false)
28
- const [session, setSession] = useState(null)
29
- const [logs, setLogs] = useState([])
30
- const [selectedAction, setSelectedAction] = useState('list')
31
- const [actionPayload, setActionPayload] = useState('')
32
-
33
- const simulationUser = user || currentUser
34
-
35
- useEffect(() => {
36
- // Listen for simulation events
37
- const unsubscribeAuth = on('simulation:auth', (data) => {
38
- addLog('Authentication', data.session)
39
- })
40
-
41
- const unsubscribeAction = on('simulation:action', (data) => {
42
- addLog('Action Performed', data.actionResult)
43
- })
44
-
45
- const unsubscribeWebhook = on('simulation:webhook', (data) => {
46
- addLog('Webhook Event', data.webhookEvent)
47
- })
48
-
49
- return () => {
50
- unsubscribeAuth && unsubscribeAuth()
51
- unsubscribeAction && unsubscribeAction()
52
- unsubscribeWebhook && unsubscribeWebhook()
53
- }
54
- }, [on])
55
-
56
- const addLog = (type, data) => {
57
- setLogs(prev => [{
58
- id: Date.now(),
59
- type,
60
- data,
61
- timestamp: new Date().toISOString()
62
- }, ...prev].slice(0, 50)) // Keep last 50 logs
63
- }
64
-
65
- const startSimulation = async () => {
66
- if (!simulationUser || !integration) {
67
- alert('Please select a user and integration')
68
- return
69
- }
70
-
71
- try {
72
- setIsSimulating(true)
73
- const response = await api.post('/api/users/simulation/authenticate', {
74
- userId: simulationUser.id,
75
- integrationId: integration.id
76
- })
77
- <<<<<<< HEAD
78
- <<<<<<< HEAD
79
-
80
- =======
81
- <<<<<<< HEAD
82
-
83
- =======
84
-
85
- >>>>>>> 652520a5 (Claude Flow RFC related development)
86
- >>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
87
- =======
88
-
89
- >>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
90
- setSession(response.data.session)
91
- addLog('Session Started', response.data.session)
92
- } catch (error) {
93
- console.error('Failed to start simulation:', error)
94
- alert('Failed to start simulation')
95
- setIsSimulating(false)
96
- }
97
- }
98
-
99
- const stopSimulation = async () => {
100
- if (!session) return
101
-
102
- try {
103
- await api.delete(`/api/users/simulation/sessions/${session.sessionId}`)
104
- setSession(null)
105
- setIsSimulating(false)
106
- addLog('Session Ended', { sessionId: session.sessionId })
107
- } catch (error) {
108
- console.error('Failed to stop simulation:', error)
109
- }
110
- }
111
-
112
- const performAction = async () => {
113
- if (!session) return
114
-
115
- try {
116
- let payload = {}
117
- if (actionPayload) {
118
- try {
119
- payload = JSON.parse(actionPayload)
120
- } catch {
121
- payload = { data: actionPayload }
122
- }
123
- }
124
-
125
- const response = await api.post('/api/users/simulation/action', {
126
- sessionId: session.sessionId,
127
- action: selectedAction,
128
- payload
129
- })
130
-
131
- addLog('Action Result', response.data.actionResult)
132
- } catch (error) {
133
- console.error('Failed to perform action:', error)
134
- alert('Failed to perform action')
135
- }
136
- }
137
-
138
- const simulateWebhook = async () => {
139
- if (!simulationUser || !integration) return
140
-
141
- try {
142
- const response = await api.post('/api/users/simulation/webhook', {
143
- userId: simulationUser.id,
144
- integrationId: integration.id,
145
- event: 'data.updated',
146
- data: {
147
- id: 'webhook_item_' + Date.now(),
148
- changes: ['field1', 'field2'],
149
- timestamp: new Date().toISOString()
150
- }
151
- })
152
-
153
- addLog('Webhook Simulated', response.data.webhookEvent)
154
- } catch (error) {
155
- console.error('Failed to simulate webhook:', error)
156
- alert('Failed to simulate webhook')
157
- }
158
- }
159
-
160
- const commonActions = [
161
- { value: 'list', label: 'List Items' },
162
- { value: 'create', label: 'Create Item' },
163
- { value: 'update', label: 'Update Item' },
164
- { value: 'delete', label: 'Delete Item' },
165
- { value: 'sync', label: 'Sync Data' }
166
- ]
167
-
168
- return (
169
- <div className="bg-white rounded-lg shadow p-6">
170
- <div className="mb-6">
171
- <h3 className="text-lg font-semibold text-gray-900 mb-2">User Simulation</h3>
172
- <p className="text-sm text-gray-600">
173
- Simulate user interactions with integrations for testing
174
- </p>
175
- </div>
176
-
177
- {/* Simulation Controls */}
178
- <div className="space-y-4 mb-6">
179
- <div className="flex items-center justify-between p-4 bg-gray-50 rounded-lg">
180
- <div>
181
- <p className="text-sm font-medium text-gray-900">
182
- {simulationUser ? `${simulationUser.firstName} ${simulationUser.lastName}` : 'No user selected'}
183
- </p>
184
- <p className="text-xs text-gray-500">
185
- {integration ? integration.name : 'No integration selected'}
186
- </p>
187
- </div>
188
- <div className="flex items-center space-x-2">
189
- {!isSimulating ? (
190
- <button
191
- onClick={startSimulation}
192
- disabled={!simulationUser || !integration}
193
- className={cn(
194
- "flex items-center space-x-2 px-4 py-2 rounded-md transition-colors",
195
- simulationUser && integration
196
- ? "bg-green-600 text-white hover:bg-green-700"
197
- : "bg-gray-300 text-gray-500 cursor-not-allowed"
198
- )}
199
- >
200
- <Play size={16} />
201
- <span>Start Simulation</span>
202
- </button>
203
- ) : (
204
- <button
205
- onClick={stopSimulation}
206
- className="flex items-center space-x-2 px-4 py-2 bg-red-600 text-white rounded-md hover:bg-red-700"
207
- >
208
- <Square size={16} />
209
- <span>Stop Simulation</span>
210
- </button>
211
- )}
212
- </div>
213
- </div>
214
-
215
- {session && (
216
- <div className="p-4 bg-blue-50 border border-blue-200 rounded-lg">
217
- <div className="flex items-start space-x-3">
218
- <CheckCircle className="text-blue-600 mt-0.5" size={20} />
219
- <div className="flex-1">
220
- <p className="text-sm font-medium text-blue-900">Session Active</p>
221
- <p className="text-xs text-blue-700 mt-1">
222
- Session ID: {session.sessionId}
223
- </p>
224
- <p className="text-xs text-blue-700">
225
- Expires: {new Date(session.expiresAt).toLocaleTimeString()}
226
- </p>
227
- </div>
228
- </div>
229
- </div>
230
- )}
231
- </div>
232
-
233
- {/* Action Simulator */}
234
- {isSimulating && session && (
235
- <div className="space-y-4 mb-6">
236
- <div className="p-4 border border-gray-200 rounded-lg">
237
- <h4 className="text-sm font-medium text-gray-900 mb-3">Simulate Action</h4>
238
- <div className="space-y-3">
239
- <div>
240
- <label className="block text-xs font-medium text-gray-700 mb-1">
241
- Action Type
242
- </label>
243
- <select
244
- value={selectedAction}
245
- onChange={(e) => setSelectedAction(e.target.value)}
246
- className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:border-blue-500"
247
- >
248
- {commonActions.map(action => (
249
- <option key={action.value} value={action.value}>
250
- {action.label}
251
- </option>
252
- ))}
253
- </select>
254
- </div>
255
- <div>
256
- <label className="block text-xs font-medium text-gray-700 mb-1">
257
- Payload (JSON)
258
- </label>
259
- <textarea
260
- value={actionPayload}
261
- onChange={(e) => setActionPayload(e.target.value)}
262
- placeholder='{"name": "Test Item"}'
263
- className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:border-blue-500 font-mono text-xs"
264
- rows={3}
265
- />
266
- </div>
267
- <div className="flex space-x-2">
268
- <button
269
- onClick={performAction}
270
- className="flex items-center space-x-2 px-3 py-1.5 bg-blue-600 text-white text-sm rounded-md hover:bg-blue-700"
271
- >
272
- <Zap size={14} />
273
- <span>Execute Action</span>
274
- </button>
275
- <button
276
- onClick={simulateWebhook}
277
- className="flex items-center space-x-2 px-3 py-1.5 bg-purple-600 text-white text-sm rounded-md hover:bg-purple-700"
278
- >
279
- <AlertCircle size={14} />
280
- <span>Trigger Webhook</span>
281
- </button>
282
- </div>
283
- </div>
284
- </div>
285
- </div>
286
- )}
287
-
288
- {/* Activity Logs */}
289
- <div>
290
- <h4 className="text-sm font-medium text-gray-900 mb-3">Activity Log</h4>
291
- <div className="space-y-2 max-h-64 overflow-y-auto">
292
- {logs.length === 0 ? (
293
- <p className="text-sm text-gray-500 text-center py-4">
294
- No activity yet. Start a simulation to see logs.
295
- </p>
296
- ) : (
297
- logs.map(log => (
298
- <div
299
- key={log.id}
300
- className="p-3 bg-gray-50 rounded-md border border-gray-200"
301
- >
302
- <div className="flex items-start justify-between">
303
- <div className="flex items-center space-x-2">
304
- <Clock size={14} className="text-gray-500" />
305
- <span className="text-xs font-medium text-gray-900">
306
- {log.type}
307
- </span>
308
- </div>
309
- <span className="text-xs text-gray-500">
310
- {new Date(log.timestamp).toLocaleTimeString()}
311
- </span>
312
- </div>
313
- <div className="mt-1">
314
- <pre className="text-xs text-gray-600 font-mono overflow-x-auto">
315
- {JSON.stringify(log.data, null, 2)}
316
- </pre>
317
- </div>
318
- </div>
319
- ))
320
- )}
321
- </div>
322
- </div>
323
- </div>
324
- )
325
- }
326
-
327
- export default UserSimulation