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,209 @@
1
+ /**
2
+ * useToolSchema Hook - WebSocket-based tool schema management
3
+ *
4
+ * Provides tool schema operations for Android Toolkit and other tool nodes.
5
+ * The database-stored schema is the source of truth for LLM tool configurations.
6
+ */
7
+
8
+ import { useCallback, useState } from 'react';
9
+ import { useWebSocket } from '../contexts/WebSocketContext';
10
+
11
+ /**
12
+ * Schema field configuration for tool arguments
13
+ */
14
+ export interface SchemaFieldConfig {
15
+ type: 'string' | 'number' | 'integer' | 'boolean' | 'object' | 'array';
16
+ description: string;
17
+ required?: boolean;
18
+ default?: any;
19
+ enum?: string[];
20
+ }
21
+
22
+ /**
23
+ * Full schema configuration stored in database
24
+ */
25
+ export interface ToolSchemaConfig {
26
+ description: string;
27
+ fields: Record<string, SchemaFieldConfig>;
28
+ }
29
+
30
+ /**
31
+ * Tool schema as stored in database
32
+ */
33
+ export interface ToolSchema {
34
+ node_id: string;
35
+ tool_name: string;
36
+ tool_description: string;
37
+ schema_config: ToolSchemaConfig;
38
+ connected_services?: Record<string, any>[];
39
+ created_at?: string;
40
+ updated_at?: string;
41
+ }
42
+
43
+ export interface UseToolSchemaResult {
44
+ // Get tool schema for a node
45
+ getToolSchema: (nodeId: string) => Promise<ToolSchema | null>;
46
+
47
+ // Save tool schema for a node
48
+ saveToolSchema: (
49
+ nodeId: string,
50
+ toolName: string,
51
+ toolDescription: string,
52
+ schemaConfig: ToolSchemaConfig,
53
+ connectedServices?: Record<string, any>[]
54
+ ) => Promise<boolean>;
55
+
56
+ // Delete tool schema for a node
57
+ deleteToolSchema: (nodeId: string) => Promise<boolean>;
58
+
59
+ // Get all tool schemas
60
+ getAllToolSchemas: () => Promise<ToolSchema[]>;
61
+
62
+ // State
63
+ isLoading: boolean;
64
+ error: string | null;
65
+ isConnected: boolean;
66
+ }
67
+
68
+ export const useToolSchema = (): UseToolSchemaResult => {
69
+ const { sendRequest, isConnected } = useWebSocket();
70
+
71
+ const [isLoading, setIsLoading] = useState(false);
72
+ const [error, setError] = useState<string | null>(null);
73
+
74
+ /**
75
+ * Get tool schema for a node from database
76
+ */
77
+ const getToolSchema = useCallback(async (nodeId: string): Promise<ToolSchema | null> => {
78
+ if (!isConnected) {
79
+ console.warn('[useToolSchema] WebSocket not connected');
80
+ return null;
81
+ }
82
+
83
+ setIsLoading(true);
84
+ setError(null);
85
+
86
+ try {
87
+ const response = await sendRequest<{ success: boolean; schema: ToolSchema | null }>('get_tool_schema', {
88
+ node_id: nodeId
89
+ });
90
+
91
+ if (response.success) {
92
+ return response.schema;
93
+ }
94
+ return null;
95
+ } catch (err) {
96
+ const errorMsg = err instanceof Error ? err.message : 'Failed to get tool schema';
97
+ setError(errorMsg);
98
+ console.error('[useToolSchema] Error getting schema:', errorMsg);
99
+ return null;
100
+ } finally {
101
+ setIsLoading(false);
102
+ }
103
+ }, [isConnected, sendRequest]);
104
+
105
+ /**
106
+ * Save tool schema for a node to database
107
+ */
108
+ const saveToolSchema = useCallback(async (
109
+ nodeId: string,
110
+ toolName: string,
111
+ toolDescription: string,
112
+ schemaConfig: ToolSchemaConfig,
113
+ connectedServices?: Record<string, any>[]
114
+ ): Promise<boolean> => {
115
+ if (!isConnected) {
116
+ console.warn('[useToolSchema] WebSocket not connected');
117
+ return false;
118
+ }
119
+
120
+ setIsLoading(true);
121
+ setError(null);
122
+
123
+ try {
124
+ const response = await sendRequest<{ success: boolean; saved: boolean }>('save_tool_schema', {
125
+ node_id: nodeId,
126
+ tool_name: toolName,
127
+ tool_description: toolDescription,
128
+ schema_config: schemaConfig,
129
+ connected_services: connectedServices
130
+ });
131
+
132
+ return response.success && response.saved;
133
+ } catch (err) {
134
+ const errorMsg = err instanceof Error ? err.message : 'Failed to save tool schema';
135
+ setError(errorMsg);
136
+ console.error('[useToolSchema] Error saving schema:', errorMsg);
137
+ return false;
138
+ } finally {
139
+ setIsLoading(false);
140
+ }
141
+ }, [isConnected, sendRequest]);
142
+
143
+ /**
144
+ * Delete tool schema for a node from database
145
+ */
146
+ const deleteToolSchema = useCallback(async (nodeId: string): Promise<boolean> => {
147
+ if (!isConnected) {
148
+ console.warn('[useToolSchema] WebSocket not connected');
149
+ return false;
150
+ }
151
+
152
+ setIsLoading(true);
153
+ setError(null);
154
+
155
+ try {
156
+ const response = await sendRequest<{ success: boolean }>('delete_tool_schema', {
157
+ node_id: nodeId
158
+ });
159
+
160
+ return response.success;
161
+ } catch (err) {
162
+ const errorMsg = err instanceof Error ? err.message : 'Failed to delete tool schema';
163
+ setError(errorMsg);
164
+ console.error('[useToolSchema] Error deleting schema:', errorMsg);
165
+ return false;
166
+ } finally {
167
+ setIsLoading(false);
168
+ }
169
+ }, [isConnected, sendRequest]);
170
+
171
+ /**
172
+ * Get all tool schemas from database
173
+ */
174
+ const getAllToolSchemas = useCallback(async (): Promise<ToolSchema[]> => {
175
+ if (!isConnected) {
176
+ console.warn('[useToolSchema] WebSocket not connected');
177
+ return [];
178
+ }
179
+
180
+ setIsLoading(true);
181
+ setError(null);
182
+
183
+ try {
184
+ const response = await sendRequest<{ success: boolean; schemas: ToolSchema[] }>('get_all_tool_schemas', {});
185
+
186
+ if (response.success) {
187
+ return response.schemas || [];
188
+ }
189
+ return [];
190
+ } catch (err) {
191
+ const errorMsg = err instanceof Error ? err.message : 'Failed to get tool schemas';
192
+ setError(errorMsg);
193
+ console.error('[useToolSchema] Error getting schemas:', errorMsg);
194
+ return [];
195
+ } finally {
196
+ setIsLoading(false);
197
+ }
198
+ }, [isConnected, sendRequest]);
199
+
200
+ return {
201
+ getToolSchema,
202
+ saveToolSchema,
203
+ deleteToolSchema,
204
+ getAllToolSchemas,
205
+ isLoading,
206
+ error,
207
+ isConnected
208
+ };
209
+ };
@@ -0,0 +1,196 @@
1
+ /**
2
+ * useWhatsApp Hook - WebSocket-based WhatsApp operations
3
+ *
4
+ * Provides WhatsApp messaging and connection management via WebSocket.
5
+ * This replaces REST-based WhatsApp API calls for real-time operations.
6
+ */
7
+
8
+ import { useCallback, useState } from 'react';
9
+ import { useWebSocket } from '../contexts/WebSocketContext';
10
+
11
+ export interface WhatsAppStatus {
12
+ connected: boolean;
13
+ deviceId?: string;
14
+ data?: any;
15
+ }
16
+
17
+ export interface WhatsAppQRResult {
18
+ connected: boolean;
19
+ qr?: string;
20
+ message?: string;
21
+ }
22
+
23
+ export interface WhatsAppSendResult {
24
+ success: boolean;
25
+ messageId?: string;
26
+ error?: string;
27
+ }
28
+
29
+ export interface UseWhatsAppResult {
30
+ // Get WhatsApp connection status
31
+ getStatus: () => Promise<WhatsAppStatus>;
32
+
33
+ // Get QR code for authentication
34
+ getQRCode: () => Promise<WhatsAppQRResult>;
35
+
36
+ // Send a WhatsApp message
37
+ sendMessage: (phone: string, message: string) => Promise<WhatsAppSendResult>;
38
+
39
+ // Start WhatsApp connection
40
+ startConnection: () => Promise<{ success: boolean; message?: string }>;
41
+
42
+ // Restart WhatsApp connection (stops and starts the service)
43
+ restartConnection: () => Promise<{ success: boolean; message?: string }>;
44
+
45
+ // State
46
+ isLoading: boolean;
47
+ lastError: string | null;
48
+ connectionStatus: WhatsAppStatus | null;
49
+ isConnected: boolean;
50
+ }
51
+
52
+ export const useWhatsApp = (): UseWhatsAppResult => {
53
+ const {
54
+ getWhatsAppStatus: wsGetStatus,
55
+ getWhatsAppQR: wsGetQR,
56
+ sendWhatsAppMessage: wsSendMessage,
57
+ startWhatsAppConnection: wsStartConnection,
58
+ restartWhatsAppConnection: wsRestartConnection,
59
+ isConnected
60
+ } = useWebSocket();
61
+
62
+ const [isLoading, setIsLoading] = useState(false);
63
+ const [lastError, setLastError] = useState<string | null>(null);
64
+ const [connectionStatus, setConnectionStatus] = useState<WhatsAppStatus | null>(null);
65
+
66
+ /**
67
+ * Get WhatsApp connection status
68
+ */
69
+ const getStatus = useCallback(async (): Promise<WhatsAppStatus> => {
70
+ setIsLoading(true);
71
+ setLastError(null);
72
+
73
+ try {
74
+ const result = await wsGetStatus();
75
+ setConnectionStatus(result);
76
+ return result;
77
+ } catch (error: any) {
78
+ const errorMsg = error.message || 'Failed to get status';
79
+ setLastError(errorMsg);
80
+ return { connected: false };
81
+ } finally {
82
+ setIsLoading(false);
83
+ }
84
+ }, [wsGetStatus]);
85
+
86
+ /**
87
+ * Get QR code for WhatsApp authentication
88
+ */
89
+ const getQRCode = useCallback(async (): Promise<WhatsAppQRResult> => {
90
+ setIsLoading(true);
91
+ setLastError(null);
92
+
93
+ try {
94
+ const result = await wsGetQR();
95
+
96
+ if (result.connected) {
97
+ setConnectionStatus({ connected: true });
98
+ }
99
+
100
+ return result;
101
+ } catch (error: any) {
102
+ const errorMsg = error.message || 'Failed to get QR code';
103
+ setLastError(errorMsg);
104
+ return { connected: false, message: errorMsg };
105
+ } finally {
106
+ setIsLoading(false);
107
+ }
108
+ }, [wsGetQR]);
109
+
110
+ /**
111
+ * Send a WhatsApp message
112
+ */
113
+ const sendMessage = useCallback(async (
114
+ phone: string,
115
+ message: string
116
+ ): Promise<WhatsAppSendResult> => {
117
+ setIsLoading(true);
118
+ setLastError(null);
119
+
120
+ try {
121
+ const result = await wsSendMessage(phone, message);
122
+
123
+ if (!result.success && result.error) {
124
+ setLastError(result.error);
125
+ }
126
+
127
+ return result;
128
+ } catch (error: any) {
129
+ const errorMsg = error.message || 'Failed to send message';
130
+ setLastError(errorMsg);
131
+ return { success: false, error: errorMsg };
132
+ } finally {
133
+ setIsLoading(false);
134
+ }
135
+ }, [wsSendMessage]);
136
+
137
+ /**
138
+ * Start WhatsApp connection
139
+ */
140
+ const startConnection = useCallback(async (): Promise<{ success: boolean; message?: string }> => {
141
+ setIsLoading(true);
142
+ setLastError(null);
143
+
144
+ try {
145
+ const result = await wsStartConnection();
146
+
147
+ if (!result.success && result.message) {
148
+ setLastError(result.message);
149
+ }
150
+
151
+ return result;
152
+ } catch (error: any) {
153
+ const errorMsg = error.message || 'Failed to start connection';
154
+ setLastError(errorMsg);
155
+ return { success: false, message: errorMsg };
156
+ } finally {
157
+ setIsLoading(false);
158
+ }
159
+ }, [wsStartConnection]);
160
+
161
+ /**
162
+ * Restart WhatsApp connection (stops and starts the service)
163
+ */
164
+ const restartConnection = useCallback(async (): Promise<{ success: boolean; message?: string }> => {
165
+ setIsLoading(true);
166
+ setLastError(null);
167
+
168
+ try {
169
+ const result = await wsRestartConnection();
170
+
171
+ if (!result.success && result.message) {
172
+ setLastError(result.message);
173
+ }
174
+
175
+ return result;
176
+ } catch (error: any) {
177
+ const errorMsg = error.message || 'Failed to restart connection';
178
+ setLastError(errorMsg);
179
+ return { success: false, message: errorMsg };
180
+ } finally {
181
+ setIsLoading(false);
182
+ }
183
+ }, [wsRestartConnection]);
184
+
185
+ return {
186
+ getStatus,
187
+ getQRCode,
188
+ sendMessage,
189
+ startConnection,
190
+ restartConnection,
191
+ isLoading,
192
+ lastError,
193
+ connectionStatus,
194
+ isConnected
195
+ };
196
+ };
@@ -0,0 +1,46 @@
1
+ import { useCallback } from 'react';
2
+ import { useAppStore } from '../store/useAppStore';
3
+
4
+ export const useWorkflowManagement = () => {
5
+ const {
6
+ currentWorkflow,
7
+ hasUnsavedChanges,
8
+ savedWorkflows,
9
+ updateWorkflow,
10
+ saveWorkflow,
11
+ loadWorkflow,
12
+ createNewWorkflow,
13
+ } = useAppStore();
14
+
15
+ const handleWorkflowNameChange = useCallback((name: string) => {
16
+ updateWorkflow({ name });
17
+ }, [updateWorkflow]);
18
+
19
+ const handleSave = useCallback(() => {
20
+ saveWorkflow();
21
+ }, [saveWorkflow]);
22
+
23
+ const handleNew = useCallback(() => {
24
+ createNewWorkflow();
25
+ }, [createNewWorkflow]);
26
+
27
+ const handleOpen = useCallback(() => {
28
+ // Workflow selection is handled by sidebar
29
+ }, []);
30
+
31
+ const handleSelectWorkflow = useCallback((workflow: any) => {
32
+ loadWorkflow(workflow.id);
33
+ }, [loadWorkflow]);
34
+
35
+
36
+ return {
37
+ currentWorkflow,
38
+ hasUnsavedChanges,
39
+ savedWorkflows,
40
+ handleWorkflowNameChange,
41
+ handleSave,
42
+ handleNew,
43
+ handleOpen,
44
+ handleSelectWorkflow,
45
+ };
46
+ };