machinaos 0.0.1

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 (288) hide show
  1. package/.env.template +71 -0
  2. package/LICENSE +21 -0
  3. package/README.md +87 -0
  4. package/bin/cli.js +159 -0
  5. package/client/.dockerignore +45 -0
  6. package/client/Dockerfile +68 -0
  7. package/client/eslint.config.js +29 -0
  8. package/client/index.html +13 -0
  9. package/client/nginx.conf +66 -0
  10. package/client/package.json +48 -0
  11. package/client/src/App.tsx +27 -0
  12. package/client/src/Dashboard.tsx +1173 -0
  13. package/client/src/ParameterPanel.tsx +301 -0
  14. package/client/src/components/AIAgentNode.tsx +321 -0
  15. package/client/src/components/APIKeyValidator.tsx +118 -0
  16. package/client/src/components/ClaudeChatModelNode.tsx +18 -0
  17. package/client/src/components/ConditionalEdge.tsx +189 -0
  18. package/client/src/components/CredentialsModal.tsx +306 -0
  19. package/client/src/components/EdgeConditionEditor.tsx +443 -0
  20. package/client/src/components/GeminiChatModelNode.tsx +18 -0
  21. package/client/src/components/GenericNode.tsx +357 -0
  22. package/client/src/components/LocationParameterPanel.tsx +154 -0
  23. package/client/src/components/ModelNode.tsx +286 -0
  24. package/client/src/components/OpenAIChatModelNode.tsx +18 -0
  25. package/client/src/components/OutputPanel.tsx +471 -0
  26. package/client/src/components/ParameterRenderer.tsx +1874 -0
  27. package/client/src/components/SkillEditorModal.tsx +417 -0
  28. package/client/src/components/SquareNode.tsx +797 -0
  29. package/client/src/components/StartNode.tsx +250 -0
  30. package/client/src/components/ToolkitNode.tsx +365 -0
  31. package/client/src/components/TriggerNode.tsx +463 -0
  32. package/client/src/components/auth/LoginPage.tsx +247 -0
  33. package/client/src/components/auth/ProtectedRoute.tsx +59 -0
  34. package/client/src/components/base/BaseChatModelNode.tsx +271 -0
  35. package/client/src/components/icons/AIProviderIcons.tsx +50 -0
  36. package/client/src/components/maps/GoogleMapsPicker.tsx +137 -0
  37. package/client/src/components/maps/MapsPreviewPanel.tsx +110 -0
  38. package/client/src/components/maps/index.ts +26 -0
  39. package/client/src/components/parameterPanel/InputSection.tsx +1094 -0
  40. package/client/src/components/parameterPanel/LocationPanelLayout.tsx +65 -0
  41. package/client/src/components/parameterPanel/MapsSection.tsx +92 -0
  42. package/client/src/components/parameterPanel/MiddleSection.tsx +571 -0
  43. package/client/src/components/parameterPanel/OutputSection.tsx +81 -0
  44. package/client/src/components/parameterPanel/ParameterPanelLayout.tsx +82 -0
  45. package/client/src/components/parameterPanel/ToolSchemaEditor.tsx +436 -0
  46. package/client/src/components/parameterPanel/index.ts +42 -0
  47. package/client/src/components/shared/DataPanel.tsx +142 -0
  48. package/client/src/components/shared/JSONTreeRenderer.tsx +106 -0
  49. package/client/src/components/ui/AIResultModal.tsx +204 -0
  50. package/client/src/components/ui/AndroidSettingsPanel.tsx +401 -0
  51. package/client/src/components/ui/CodeEditor.tsx +81 -0
  52. package/client/src/components/ui/CollapsibleSection.tsx +88 -0
  53. package/client/src/components/ui/ComponentItem.tsx +154 -0
  54. package/client/src/components/ui/ComponentPalette.tsx +321 -0
  55. package/client/src/components/ui/ConsolePanel.tsx +1074 -0
  56. package/client/src/components/ui/ErrorBoundary.tsx +196 -0
  57. package/client/src/components/ui/InputNodesPanel.tsx +204 -0
  58. package/client/src/components/ui/MapSelector.tsx +314 -0
  59. package/client/src/components/ui/Modal.tsx +149 -0
  60. package/client/src/components/ui/NodeContextMenu.tsx +192 -0
  61. package/client/src/components/ui/NodeOutputPanel.tsx +1150 -0
  62. package/client/src/components/ui/OutputDisplayPanel.tsx +381 -0
  63. package/client/src/components/ui/SettingsPanel.tsx +243 -0
  64. package/client/src/components/ui/TopToolbar.tsx +736 -0
  65. package/client/src/components/ui/WhatsAppSettingsPanel.tsx +345 -0
  66. package/client/src/components/ui/WorkflowSidebar.tsx +294 -0
  67. package/client/src/config/antdTheme.ts +186 -0
  68. package/client/src/config/api.ts +54 -0
  69. package/client/src/contexts/AuthContext.tsx +221 -0
  70. package/client/src/contexts/ThemeContext.tsx +42 -0
  71. package/client/src/contexts/WebSocketContext.tsx +1971 -0
  72. package/client/src/factories/baseChatModelFactory.ts +256 -0
  73. package/client/src/hooks/useAndroidOperations.ts +164 -0
  74. package/client/src/hooks/useApiKeyValidation.ts +107 -0
  75. package/client/src/hooks/useApiKeys.ts +238 -0
  76. package/client/src/hooks/useAppTheme.ts +17 -0
  77. package/client/src/hooks/useComponentPalette.ts +51 -0
  78. package/client/src/hooks/useCopyPaste.ts +155 -0
  79. package/client/src/hooks/useDragAndDrop.ts +124 -0
  80. package/client/src/hooks/useDragVariable.ts +88 -0
  81. package/client/src/hooks/useExecution.ts +313 -0
  82. package/client/src/hooks/useParameterPanel.ts +176 -0
  83. package/client/src/hooks/useReactFlowNodes.ts +189 -0
  84. package/client/src/hooks/useToolSchema.ts +209 -0
  85. package/client/src/hooks/useWhatsApp.ts +196 -0
  86. package/client/src/hooks/useWorkflowManagement.ts +46 -0
  87. package/client/src/index.css +315 -0
  88. package/client/src/main.tsx +19 -0
  89. package/client/src/nodeDefinitions/aiAgentNodes.ts +336 -0
  90. package/client/src/nodeDefinitions/aiModelNodes.ts +340 -0
  91. package/client/src/nodeDefinitions/androidDeviceNodes.ts +140 -0
  92. package/client/src/nodeDefinitions/androidServiceNodes.ts +383 -0
  93. package/client/src/nodeDefinitions/chatNodes.ts +135 -0
  94. package/client/src/nodeDefinitions/codeNodes.ts +54 -0
  95. package/client/src/nodeDefinitions/documentNodes.ts +379 -0
  96. package/client/src/nodeDefinitions/index.ts +15 -0
  97. package/client/src/nodeDefinitions/locationNodes.ts +463 -0
  98. package/client/src/nodeDefinitions/schedulerNodes.ts +220 -0
  99. package/client/src/nodeDefinitions/skillNodes.ts +211 -0
  100. package/client/src/nodeDefinitions/toolNodes.ts +198 -0
  101. package/client/src/nodeDefinitions/utilityNodes.ts +284 -0
  102. package/client/src/nodeDefinitions/whatsappNodes.ts +865 -0
  103. package/client/src/nodeDefinitions/workflowNodes.ts +41 -0
  104. package/client/src/nodeDefinitions.ts +104 -0
  105. package/client/src/schemas/workflowSchema.ts +264 -0
  106. package/client/src/services/dynamicParameterService.ts +96 -0
  107. package/client/src/services/execution/aiAgentExecutionService.ts +35 -0
  108. package/client/src/services/executionService.ts +232 -0
  109. package/client/src/services/workflowApi.ts +91 -0
  110. package/client/src/store/useAppStore.ts +582 -0
  111. package/client/src/styles/theme.ts +508 -0
  112. package/client/src/styles/zIndex.ts +17 -0
  113. package/client/src/types/ComponentTypes.ts +39 -0
  114. package/client/src/types/EdgeCondition.ts +231 -0
  115. package/client/src/types/INodeProperties.ts +288 -0
  116. package/client/src/types/NodeTypes.ts +28 -0
  117. package/client/src/utils/formatters.ts +33 -0
  118. package/client/src/utils/googleMapsLoader.ts +140 -0
  119. package/client/src/utils/locationUtils.ts +85 -0
  120. package/client/src/utils/nodeUtils.ts +31 -0
  121. package/client/src/utils/workflow.ts +30 -0
  122. package/client/src/utils/workflowExport.ts +120 -0
  123. package/client/src/vite-env.d.ts +12 -0
  124. package/client/tailwind.config.js +60 -0
  125. package/client/tsconfig.json +25 -0
  126. package/client/tsconfig.node.json +11 -0
  127. package/client/vite.config.js +35 -0
  128. package/docker-compose.prod.yml +107 -0
  129. package/docker-compose.yml +104 -0
  130. package/docs-MachinaOs/README.md +85 -0
  131. package/docs-MachinaOs/deployment/docker.mdx +228 -0
  132. package/docs-MachinaOs/deployment/production.mdx +345 -0
  133. package/docs-MachinaOs/docs.json +75 -0
  134. package/docs-MachinaOs/faq.mdx +309 -0
  135. package/docs-MachinaOs/favicon.svg +5 -0
  136. package/docs-MachinaOs/installation.mdx +160 -0
  137. package/docs-MachinaOs/introduction.mdx +114 -0
  138. package/docs-MachinaOs/logo/dark.svg +6 -0
  139. package/docs-MachinaOs/logo/light.svg +6 -0
  140. package/docs-MachinaOs/nodes/ai-agent.mdx +216 -0
  141. package/docs-MachinaOs/nodes/ai-models.mdx +240 -0
  142. package/docs-MachinaOs/nodes/android.mdx +411 -0
  143. package/docs-MachinaOs/nodes/overview.mdx +181 -0
  144. package/docs-MachinaOs/nodes/schedulers.mdx +316 -0
  145. package/docs-MachinaOs/nodes/webhooks.mdx +330 -0
  146. package/docs-MachinaOs/nodes/whatsapp.mdx +305 -0
  147. package/docs-MachinaOs/quickstart.mdx +119 -0
  148. package/docs-MachinaOs/tutorials/ai-agent-workflow.mdx +177 -0
  149. package/docs-MachinaOs/tutorials/android-automation.mdx +242 -0
  150. package/docs-MachinaOs/tutorials/first-workflow.mdx +134 -0
  151. package/docs-MachinaOs/tutorials/whatsapp-automation.mdx +185 -0
  152. package/nul +0 -0
  153. package/package.json +70 -0
  154. package/scripts/build.js +158 -0
  155. package/scripts/check-ports.ps1 +33 -0
  156. package/scripts/clean.js +40 -0
  157. package/scripts/docker.js +93 -0
  158. package/scripts/kill-port.ps1 +154 -0
  159. package/scripts/start.js +210 -0
  160. package/scripts/stop.js +325 -0
  161. package/server/.dockerignore +44 -0
  162. package/server/Dockerfile +45 -0
  163. package/server/constants.py +249 -0
  164. package/server/core/__init__.py +1 -0
  165. package/server/core/cache.py +461 -0
  166. package/server/core/config.py +128 -0
  167. package/server/core/container.py +99 -0
  168. package/server/core/database.py +1211 -0
  169. package/server/core/logging.py +314 -0
  170. package/server/main.py +289 -0
  171. package/server/middleware/__init__.py +5 -0
  172. package/server/middleware/auth.py +89 -0
  173. package/server/models/__init__.py +1 -0
  174. package/server/models/auth.py +52 -0
  175. package/server/models/cache.py +24 -0
  176. package/server/models/database.py +211 -0
  177. package/server/models/nodes.py +455 -0
  178. package/server/package.json +9 -0
  179. package/server/pyproject.toml +72 -0
  180. package/server/requirements.txt +83 -0
  181. package/server/routers/__init__.py +1 -0
  182. package/server/routers/android.py +294 -0
  183. package/server/routers/auth.py +203 -0
  184. package/server/routers/database.py +151 -0
  185. package/server/routers/maps.py +142 -0
  186. package/server/routers/nodejs_compat.py +289 -0
  187. package/server/routers/webhook.py +90 -0
  188. package/server/routers/websocket.py +2127 -0
  189. package/server/routers/whatsapp.py +761 -0
  190. package/server/routers/workflow.py +200 -0
  191. package/server/services/__init__.py +1 -0
  192. package/server/services/ai.py +2415 -0
  193. package/server/services/android/__init__.py +27 -0
  194. package/server/services/android/broadcaster.py +114 -0
  195. package/server/services/android/client.py +608 -0
  196. package/server/services/android/manager.py +78 -0
  197. package/server/services/android/protocol.py +165 -0
  198. package/server/services/android_service.py +588 -0
  199. package/server/services/auth.py +131 -0
  200. package/server/services/chat_client.py +160 -0
  201. package/server/services/deployment/__init__.py +12 -0
  202. package/server/services/deployment/manager.py +706 -0
  203. package/server/services/deployment/state.py +47 -0
  204. package/server/services/deployment/triggers.py +275 -0
  205. package/server/services/event_waiter.py +785 -0
  206. package/server/services/execution/__init__.py +77 -0
  207. package/server/services/execution/cache.py +769 -0
  208. package/server/services/execution/conditions.py +373 -0
  209. package/server/services/execution/dlq.py +132 -0
  210. package/server/services/execution/executor.py +1351 -0
  211. package/server/services/execution/models.py +531 -0
  212. package/server/services/execution/recovery.py +235 -0
  213. package/server/services/handlers/__init__.py +126 -0
  214. package/server/services/handlers/ai.py +355 -0
  215. package/server/services/handlers/android.py +260 -0
  216. package/server/services/handlers/code.py +278 -0
  217. package/server/services/handlers/document.py +598 -0
  218. package/server/services/handlers/http.py +193 -0
  219. package/server/services/handlers/polyglot.py +105 -0
  220. package/server/services/handlers/tools.py +845 -0
  221. package/server/services/handlers/triggers.py +107 -0
  222. package/server/services/handlers/utility.py +822 -0
  223. package/server/services/handlers/whatsapp.py +476 -0
  224. package/server/services/maps.py +289 -0
  225. package/server/services/memory_store.py +103 -0
  226. package/server/services/node_executor.py +375 -0
  227. package/server/services/parameter_resolver.py +218 -0
  228. package/server/services/polyglot_client.py +169 -0
  229. package/server/services/scheduler.py +155 -0
  230. package/server/services/skill_loader.py +417 -0
  231. package/server/services/status_broadcaster.py +826 -0
  232. package/server/services/temporal/__init__.py +23 -0
  233. package/server/services/temporal/activities.py +344 -0
  234. package/server/services/temporal/client.py +76 -0
  235. package/server/services/temporal/executor.py +147 -0
  236. package/server/services/temporal/worker.py +251 -0
  237. package/server/services/temporal/workflow.py +355 -0
  238. package/server/services/temporal/ws_client.py +236 -0
  239. package/server/services/text.py +111 -0
  240. package/server/services/user_auth.py +172 -0
  241. package/server/services/websocket_client.py +29 -0
  242. package/server/services/workflow.py +597 -0
  243. package/server/skills/android-skill/SKILL.md +82 -0
  244. package/server/skills/assistant-personality/SKILL.md +45 -0
  245. package/server/skills/code-skill/SKILL.md +140 -0
  246. package/server/skills/http-skill/SKILL.md +161 -0
  247. package/server/skills/maps-skill/SKILL.md +170 -0
  248. package/server/skills/memory-skill/SKILL.md +154 -0
  249. package/server/skills/scheduler-skill/SKILL.md +84 -0
  250. package/server/skills/whatsapp-skill/SKILL.md +283 -0
  251. package/server/uv.lock +2916 -0
  252. package/server/whatsapp-rpc/.dockerignore +30 -0
  253. package/server/whatsapp-rpc/Dockerfile +44 -0
  254. package/server/whatsapp-rpc/Dockerfile.web +17 -0
  255. package/server/whatsapp-rpc/README.md +139 -0
  256. package/server/whatsapp-rpc/cli.js +95 -0
  257. package/server/whatsapp-rpc/configs/config.yaml +7 -0
  258. package/server/whatsapp-rpc/docker-compose.yml +35 -0
  259. package/server/whatsapp-rpc/docs/API.md +410 -0
  260. package/server/whatsapp-rpc/go.mod +67 -0
  261. package/server/whatsapp-rpc/go.sum +203 -0
  262. package/server/whatsapp-rpc/package.json +30 -0
  263. package/server/whatsapp-rpc/schema.json +1294 -0
  264. package/server/whatsapp-rpc/scripts/clean.cjs +66 -0
  265. package/server/whatsapp-rpc/scripts/cli.js +162 -0
  266. package/server/whatsapp-rpc/src/go/cmd/server/main.go +91 -0
  267. package/server/whatsapp-rpc/src/go/config/config.go +49 -0
  268. package/server/whatsapp-rpc/src/go/rpc/rpc.go +446 -0
  269. package/server/whatsapp-rpc/src/go/rpc/server.go +112 -0
  270. package/server/whatsapp-rpc/src/go/whatsapp/history.go +166 -0
  271. package/server/whatsapp-rpc/src/go/whatsapp/messages.go +390 -0
  272. package/server/whatsapp-rpc/src/go/whatsapp/service.go +2130 -0
  273. package/server/whatsapp-rpc/src/go/whatsapp/types.go +261 -0
  274. package/server/whatsapp-rpc/src/python/pyproject.toml +15 -0
  275. package/server/whatsapp-rpc/src/python/whatsapp_rpc/__init__.py +4 -0
  276. package/server/whatsapp-rpc/src/python/whatsapp_rpc/client.py +427 -0
  277. package/server/whatsapp-rpc/web/app.py +609 -0
  278. package/server/whatsapp-rpc/web/requirements.txt +6 -0
  279. package/server/whatsapp-rpc/web/rpc_client.py +427 -0
  280. package/server/whatsapp-rpc/web/static/openapi.yaml +59 -0
  281. package/server/whatsapp-rpc/web/templates/base.html +150 -0
  282. package/server/whatsapp-rpc/web/templates/contacts.html +240 -0
  283. package/server/whatsapp-rpc/web/templates/dashboard.html +320 -0
  284. package/server/whatsapp-rpc/web/templates/groups.html +328 -0
  285. package/server/whatsapp-rpc/web/templates/messages.html +465 -0
  286. package/server/whatsapp-rpc/web/templates/messaging.html +681 -0
  287. package/server/whatsapp-rpc/web/templates/send.html +259 -0
  288. package/server/whatsapp-rpc/web/templates/settings.html +459 -0
@@ -0,0 +1,232 @@
1
+ import { nodeDefinitions } from '../nodeDefinitions';
2
+ import { ANDROID_SERVICE_NODE_TYPES } from '../nodeDefinitions/androidServiceNodes';
3
+ import { ANDROID_DEVICE_NODE_TYPES } from '../nodeDefinitions/androidDeviceNodes';
4
+ import { SCHEDULER_NODE_TYPES } from '../nodeDefinitions/schedulerNodes';
5
+ import { CODE_NODE_TYPES } from '../nodeDefinitions/codeNodes';
6
+ import { UTILITY_NODE_TYPES } from '../nodeDefinitions/utilityNodes';
7
+ import { DOCUMENT_NODE_TYPES } from '../nodeDefinitions/documentNodes';
8
+ import { Node, Edge } from 'reactflow';
9
+ import { INodeExecutionData } from '../types/INodeProperties';
10
+ import { API_CONFIG } from '../config/api';
11
+
12
+ // Execution result with n8n-compatible data
13
+ export interface ExecutionResult {
14
+ success: boolean;
15
+ nodeId: string;
16
+ nodeType: string;
17
+ nodeName: string;
18
+ timestamp: string;
19
+ executionTime: number;
20
+ outputs?: Record<string, any>;
21
+ error?: string;
22
+ data?: any;
23
+ nodeData: INodeExecutionData[][];
24
+ }
25
+
26
+ // WebSocket execution function type (passed from components using useWebSocket)
27
+ export type WebSocketExecuteFn = (
28
+ nodeId: string,
29
+ nodeType: string,
30
+ parameters: Record<string, any>,
31
+ nodes?: any[],
32
+ edges?: any[]
33
+ ) => Promise<any>;
34
+
35
+ // WebSocket parameter getter type
36
+ export type WebSocketGetParametersFn = (nodeId: string) => Promise<{ parameters: Record<string, any> } | null>;
37
+
38
+ // No frontend cache - backend is single source of truth
39
+
40
+ // ============================================================================
41
+ // EXECUTION SERVICE - Migrated to Python backend
42
+ // ============================================================================
43
+
44
+ export class ExecutionService {
45
+ // ============================================================================
46
+ // WEBSOCKET-BASED EXECUTION - Primary execution method
47
+ // ============================================================================
48
+
49
+ /**
50
+ * Execute node via WebSocket (preferred method)
51
+ * Use this when you have access to WebSocket functions from useWebSocket hook
52
+ */
53
+ static async executeNodeViaWebSocket(
54
+ nodeId: string,
55
+ nodeType: string,
56
+ wsExecute: WebSocketExecuteFn,
57
+ wsGetParameters: WebSocketGetParametersFn,
58
+ nodes?: Node[],
59
+ edges?: Edge[]
60
+ ): Promise<ExecutionResult> {
61
+ try {
62
+ console.log(`[WS Execution] Starting: ${nodeId} (type: ${nodeType})`);
63
+
64
+ const startTime = Date.now();
65
+
66
+ // Load parameters via WebSocket
67
+ const paramsResult = await wsGetParameters(nodeId);
68
+ const parameters = paramsResult?.parameters || {};
69
+ console.log(`[WS Execution] Parameters for ${nodeId}:`, parameters);
70
+
71
+ // Prepare nodes and edges
72
+ const nodeData = nodes?.map(node => ({
73
+ id: node.id,
74
+ type: node.type || '',
75
+ data: node.data || {}
76
+ })) || [];
77
+
78
+ const edgeData = edges?.map(edge => ({
79
+ id: edge.id,
80
+ source: edge.source,
81
+ target: edge.target,
82
+ sourceHandle: edge.sourceHandle || undefined,
83
+ targetHandle: edge.targetHandle || undefined
84
+ })) || [];
85
+
86
+ // Execute via WebSocket
87
+ const result = await wsExecute(nodeId, nodeType, parameters, nodeData, edgeData);
88
+
89
+ console.log(`[WS Execution] Result:`, result);
90
+
91
+ const executionTime = Date.now() - startTime;
92
+
93
+ if (result.success) {
94
+ const outputData = result.result || {
95
+ nodeId,
96
+ success: true,
97
+ message: 'Execution completed successfully',
98
+ timestamp: result.timestamp || new Date().toISOString()
99
+ };
100
+
101
+ const nodeExecutionData: INodeExecutionData[][] = [[{
102
+ json: outputData
103
+ }]];
104
+
105
+ return {
106
+ success: true,
107
+ nodeId,
108
+ nodeType,
109
+ nodeName: nodeDefinitions[nodeType]?.displayName || nodeType,
110
+ timestamp: result.timestamp || new Date().toISOString(),
111
+ executionTime: result.execution_time || executionTime,
112
+ outputs: outputData,
113
+ data: outputData,
114
+ nodeData: nodeExecutionData
115
+ };
116
+ } else {
117
+ const errorOutputData = result.result || {
118
+ error: result.error,
119
+ nodeId,
120
+ success: false,
121
+ timestamp: result.timestamp || new Date().toISOString()
122
+ };
123
+
124
+ const errorData: INodeExecutionData[][] = [[{
125
+ json: errorOutputData
126
+ }]];
127
+
128
+ return {
129
+ success: false,
130
+ nodeId,
131
+ nodeType,
132
+ nodeName: nodeDefinitions[nodeType]?.displayName || nodeType,
133
+ timestamp: result.timestamp || new Date().toISOString(),
134
+ executionTime: result.execution_time || executionTime,
135
+ error: result.error,
136
+ outputs: errorOutputData,
137
+ data: errorOutputData,
138
+ nodeData: errorData
139
+ };
140
+ }
141
+
142
+ } catch (error: any) {
143
+ console.error(`[WS Execution] Failed for node ${nodeId}:`, error);
144
+
145
+ const catchErrorData = {
146
+ error: error.message || 'WebSocket execution failed',
147
+ nodeId,
148
+ success: false,
149
+ timestamp: new Date().toISOString()
150
+ };
151
+
152
+ return {
153
+ success: false,
154
+ nodeId,
155
+ nodeType,
156
+ nodeName: nodeDefinitions[nodeType]?.displayName || nodeType,
157
+ timestamp: new Date().toISOString(),
158
+ executionTime: 0,
159
+ error: error.message || 'WebSocket execution failed',
160
+ outputs: catchErrorData,
161
+ data: catchErrorData,
162
+ nodeData: [[{ json: catchErrorData }]]
163
+ };
164
+ }
165
+ }
166
+
167
+ // ============================================================================
168
+ // HELPER METHODS
169
+ // ============================================================================
170
+
171
+ /**
172
+ * Check backend health status
173
+ */
174
+ static async checkBackendHealth(): Promise<boolean> {
175
+ try {
176
+ const response = await fetch(`${API_CONFIG.PYTHON_BASE_URL}/api/workflow/health`);
177
+ const health = await response.json();
178
+ return health.status === 'OK';
179
+ } catch (error) {
180
+ console.warn('Backend health check failed:', error);
181
+ return false;
182
+ }
183
+ }
184
+
185
+ /**
186
+ * Check if node type is supported by backend execution
187
+ */
188
+ static isNodeTypeSupported(nodeType: string): boolean {
189
+ const supportedTypes = [
190
+ // AI Nodes
191
+ 'aiAgent',
192
+ 'chatAgent',
193
+ // Note: simpleMemory is passive - accessed by AI Agent automatically, not executed directly
194
+ 'openaiChatModel',
195
+ 'anthropicChatModel',
196
+ 'geminiChatModel',
197
+ 'openrouterChatModel',
198
+ 'groqChatModel',
199
+ 'cerebrasChatModel',
200
+ 'azure_openaiChatModel', // Planned
201
+ 'cohereChatModel', // Planned
202
+ 'ollamaChatModel', // Planned
203
+ 'mistralChatModel', // Planned
204
+ // Google Maps Nodes
205
+ 'createMap',
206
+ 'addLocations',
207
+ 'showNearbyPlaces',
208
+ // WhatsApp Nodes
209
+ 'whatsappSend',
210
+ 'whatsappConnect',
211
+ 'whatsappReceive',
212
+ 'whatsappDb',
213
+ // Text Processing Nodes
214
+ 'textGenerator',
215
+ 'fileHandler',
216
+ // Android Services (16 individual nodes)
217
+ ...ANDROID_SERVICE_NODE_TYPES,
218
+ // Android Device Setup
219
+ ...ANDROID_DEVICE_NODE_TYPES,
220
+ // Scheduler Nodes
221
+ ...SCHEDULER_NODE_TYPES,
222
+ // Code Execution Nodes
223
+ ...CODE_NODE_TYPES,
224
+ // Utility Nodes (HTTP, Webhooks)
225
+ ...UTILITY_NODE_TYPES,
226
+ // Document Processing Nodes
227
+ ...DOCUMENT_NODE_TYPES
228
+ ];
229
+
230
+ return supportedTypes.includes(nodeType);
231
+ }
232
+ }
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Workflow API Service
3
+ * Handles workflow CRUD operations with the backend database
4
+ */
5
+
6
+ import { API_CONFIG } from '../config/api';
7
+
8
+ const getApiBase = () => `${API_CONFIG.PYTHON_BASE_URL}/api/database`;
9
+
10
+ export interface WorkflowSummary {
11
+ id: string;
12
+ name: string;
13
+ nodeCount: number;
14
+ createdAt: string;
15
+ lastModified: string;
16
+ }
17
+
18
+ export interface WorkflowData {
19
+ id: string;
20
+ name: string;
21
+ data: {
22
+ nodes: any[];
23
+ edges: any[];
24
+ };
25
+ createdAt: string;
26
+ lastModified: string;
27
+ }
28
+
29
+ export const workflowApi = {
30
+ async saveWorkflow(workflowId: string, name: string, data: { nodes: any[]; edges: any[] }): Promise<boolean> {
31
+ try {
32
+ const response = await fetch(`${getApiBase()}/workflows`, {
33
+ method: 'POST',
34
+ headers: { 'Content-Type': 'application/json' },
35
+ credentials: 'include',
36
+ body: JSON.stringify({ workflow_id: workflowId, name, data })
37
+ });
38
+ const result = await response.json();
39
+ return result.success;
40
+ } catch (error) {
41
+ console.error('Failed to save workflow:', error);
42
+ return false;
43
+ }
44
+ },
45
+
46
+ async getWorkflow(workflowId: string): Promise<WorkflowData | null> {
47
+ try {
48
+ const response = await fetch(`${getApiBase()}/workflows/${workflowId}`, {
49
+ credentials: 'include'
50
+ });
51
+ const result = await response.json();
52
+ if (result.success && result.workflow) {
53
+ return result.workflow;
54
+ }
55
+ return null;
56
+ } catch (error) {
57
+ console.error('Failed to get workflow:', error);
58
+ return null;
59
+ }
60
+ },
61
+
62
+ async getAllWorkflows(): Promise<WorkflowSummary[]> {
63
+ try {
64
+ const response = await fetch(`${getApiBase()}/workflows`, {
65
+ credentials: 'include'
66
+ });
67
+ const result = await response.json();
68
+ if (result.success && result.workflows) {
69
+ return result.workflows;
70
+ }
71
+ return [];
72
+ } catch (error) {
73
+ console.error('Failed to get workflows:', error);
74
+ return [];
75
+ }
76
+ },
77
+
78
+ async deleteWorkflow(workflowId: string): Promise<boolean> {
79
+ try {
80
+ const response = await fetch(`${getApiBase()}/workflows/${workflowId}`, {
81
+ method: 'DELETE',
82
+ credentials: 'include'
83
+ });
84
+ const result = await response.json();
85
+ return result.success;
86
+ } catch (error) {
87
+ console.error('Failed to delete workflow:', error);
88
+ return false;
89
+ }
90
+ }
91
+ };