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
package/.env.template ADDED
@@ -0,0 +1,71 @@
1
+ # Service Ports (used by start.js, vite, and docker-compose)
2
+ VITE_CLIENT_PORT=3000
3
+ PYTHON_BACKEND_PORT=3010
4
+ WHATSAPP_RPC_PORT=9400
5
+ REDIS_PORT=6379
6
+
7
+ # Server Configuration
8
+ HOST=127.0.0.1
9
+ PORT=3010
10
+ DEBUG=false
11
+ WORKERS=1
12
+
13
+ # Security (Development keys - MUST CHANGE FOR PRODUCTION)
14
+ SECRET_KEY=dev-secret-key-12345678901234567890123456789012
15
+ API_KEY_ENCRYPTION_KEY=dev-encryption-key-12345678901234567890123456
16
+
17
+ # Authentication
18
+ # VITE_AUTH_ENABLED: "true" (require login) or "false" (bypass authentication)
19
+ VITE_AUTH_ENABLED=false
20
+ # AUTH_MODE: "single" (local deploy - first user is owner) or "multi" (cloud - open registration)
21
+ AUTH_MODE=single
22
+ JWT_SECRET_KEY=dev-jwt-secret-key-12345678901234567890
23
+ JWT_EXPIRE_MINUTES=10080
24
+ JWT_COOKIE_NAME=machina_token
25
+ JWT_COOKIE_SECURE=false
26
+ JWT_COOKIE_SAMESITE=lax
27
+
28
+ # CORS Configuration - Allow all common dev ports
29
+ CORS_ORIGINS=["http://localhost:3000","http://localhost:3001","http://localhost:3002","http://localhost:3003","http://localhost:3004","http://localhost:3005","http://localhost:3006","http://127.0.0.1:3000","http://127.0.0.1:3001","http://127.0.0.1:3002","http://127.0.0.1:3003","http://127.0.0.1:3004","http://127.0.0.1:3005","http://127.0.0.1:3006","http://localhost:5173"]
30
+
31
+ # Database Configuration
32
+ DATABASE_URL=sqlite+aiosqlite:///./data/workflow.db
33
+ DATABASE_ECHO=false
34
+ DATABASE_POOL_SIZE=5
35
+ DATABASE_MAX_OVERFLOW=10
36
+
37
+ # Cache Configuration (Disabled for development)
38
+ REDIS_ENABLED=false
39
+ CACHE_TTL=300
40
+
41
+ # Logging
42
+ LOG_LEVEL=INFO
43
+ LOG_FORMAT=text
44
+
45
+ # Rate Limiting (Relaxed for development)
46
+ RATE_LIMIT_ENABLED=false
47
+ RATE_LIMIT_REQUESTS=1000
48
+ RATE_LIMIT_WINDOW=60
49
+
50
+ # Service Timeouts (Extended for debugging)
51
+ AI_TIMEOUT=60
52
+ AI_MAX_RETRIES=1
53
+ AI_RETRY_DELAY=0.5
54
+
55
+ MAPS_TIMEOUT=30
56
+
57
+ # Health Check
58
+ HEALTH_CHECK_INTERVAL=60
59
+
60
+ # WebSocket Configuration (For remote Android device connections)
61
+ WEBSOCKET_URL=
62
+ WEBSOCKET_API_KEY=
63
+
64
+ # WhatsApp Service URL
65
+ WHATSAPP_SERVICE_URL=http://localhost:5000
66
+
67
+ # External API Keys (managed through UI, these are optional defaults)
68
+ OPENAI_API_KEY=
69
+ GOOGLE_MAPS_API_KEY=
70
+ ANTHROPIC_API_KEY=
71
+ GOOGLE_AI_API_KEY=
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 MachinaOs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,87 @@
1
+ # MachinaOs
2
+
3
+ Platform to Build Personal AI Assistants for Yourself that Perform Human Like Tasks.
4
+ mashup of N8N + Clawdbot
5
+
6
+ ## Quick Start
7
+
8
+ ```bash
9
+ git clone https://github.com/trohitg/MachinaOS.git
10
+ cd MachinaOs
11
+ npm run docker:build
12
+ npm run docker:up
13
+ ```
14
+
15
+ Open http://localhost:3000
16
+
17
+ ## Local Development
18
+
19
+ **Prerequisites:** Node.js 18+, Python 3.10+, Go 1.21+
20
+
21
+ ```bash
22
+ npm run build
23
+ npm run start
24
+ ```
25
+
26
+ ---
27
+
28
+ ## Features
29
+
30
+ - **AI Workflows** - OpenAI, Claude, Gemini models with tool calling
31
+ - **Android Automation** - Control your phone via 17 service nodes
32
+ - **WhatsApp Bots** - Send/receive messages with filters
33
+ - **HTTP/Webhooks** - API integrations
34
+ - **Tool Schema Editor** - Customize AI tool schemas per service
35
+
36
+ ## Docker Commands
37
+
38
+ ### Development (hot reload, larger images)
39
+ | Command | Description |
40
+ |---------|-------------|
41
+ | `npm run docker:build` | Build dev images |
42
+ | `npm run docker:up` | Start dev containers |
43
+ | `npm run docker:down` | Stop containers |
44
+ | `npm run docker:logs` | View logs |
45
+
46
+ ### Production (optimized, smaller images)
47
+ | Command | Description |
48
+ |---------|-------------|
49
+ | `npm run docker:prod:build` | Build prod images |
50
+ | `npm run docker:prod:up` | Start prod containers |
51
+ | `npm run docker:prod:logs` | View logs |
52
+
53
+ **Redis (optional):** Set `REDIS_ENABLED=true` in `.env`
54
+
55
+ ## Local Commands
56
+
57
+ | Command | Description |
58
+ |---------|-------------|
59
+ | `npm run start` | Start all services |
60
+ | `npm run stop` | Stop all services |
61
+ | `npm run build` | Install dependencies |
62
+
63
+ ## Configuration
64
+
65
+ **API Keys:** Click **Credentials** button in toolbar to add API keys for OpenAI, Claude, Google Maps, etc.
66
+
67
+ **Environment:** Edit `.env` for auth settings, ports, and database location.
68
+
69
+ ## Project Structure
70
+
71
+ ```
72
+ MachinaOs/
73
+ ├── client/ # React frontend (localhost:3000)
74
+ ├── server/ # Python backend (localhost:3010)
75
+ │ └── whatsapp-rpc/ # WhatsApp service
76
+ └── package.json
77
+ ```
78
+
79
+ ## Tech Stack
80
+
81
+ - **Frontend:** React, TypeScript, React Flow
82
+ - **Backend:** Python, FastAPI, SQLite
83
+ - **Services:** WhatsApp (Go), WebSocket relay
84
+
85
+ ## License
86
+
87
+ MIT
package/bin/cli.js ADDED
@@ -0,0 +1,159 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { spawn, execSync } from 'child_process';
4
+ import { existsSync, copyFileSync } from 'fs';
5
+ import { resolve, dirname } from 'path';
6
+ import { fileURLToPath } from 'url';
7
+
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = dirname(__filename);
10
+ const ROOT_DIR = resolve(__dirname, '..');
11
+
12
+ const COMMANDS = {
13
+ start: 'Start the development server',
14
+ stop: 'Stop all running services',
15
+ build: 'Build the project for production',
16
+ 'docker:up': 'Start with Docker Compose',
17
+ 'docker:down': 'Stop Docker Compose services',
18
+ 'docker:logs': 'View Docker logs',
19
+ init: 'Initialize environment file from template',
20
+ help: 'Show this help message',
21
+ };
22
+
23
+ function printHelp() {
24
+ console.log(`
25
+ MachinaOS - Workflow Automation Platform
26
+
27
+ Usage: machinaos <command>
28
+
29
+ Commands:
30
+ ${Object.entries(COMMANDS)
31
+ .map(([cmd, desc]) => ` ${cmd.padEnd(14)} ${desc}`)
32
+ .join('\n')}
33
+
34
+ Examples:
35
+ machinaos init # Create .env from template
36
+ machinaos start # Start development server
37
+ machinaos docker:up # Start with Docker
38
+
39
+ Documentation: https://github.com/trohitg/MachinaOS
40
+ `);
41
+ }
42
+
43
+ function checkDependencies() {
44
+ const missing = [];
45
+
46
+ // Check Node.js version
47
+ const nodeVersion = process.version.slice(1).split('.')[0];
48
+ if (parseInt(nodeVersion) < 18) {
49
+ console.error(`Error: Node.js 18+ required (found ${process.version})`);
50
+ process.exit(1);
51
+ }
52
+
53
+ // Check Python
54
+ try {
55
+ execSync('python --version', { stdio: 'pipe' });
56
+ } catch {
57
+ missing.push('Python 3.11+');
58
+ }
59
+
60
+ // Check uv (Python package manager)
61
+ try {
62
+ execSync('uv --version', { stdio: 'pipe' });
63
+ } catch {
64
+ missing.push('uv (install: curl -LsSf https://astral.sh/uv/install.sh | sh)');
65
+ }
66
+
67
+ if (missing.length > 0) {
68
+ console.error('Missing dependencies:');
69
+ missing.forEach((dep) => console.error(` - ${dep}`));
70
+ console.error('\nPlease install the missing dependencies and try again.');
71
+ process.exit(1);
72
+ }
73
+ }
74
+
75
+ function initEnv() {
76
+ const envPath = resolve(ROOT_DIR, 'server', '.env');
77
+ const templatePath = resolve(ROOT_DIR, '.env.template');
78
+
79
+ if (existsSync(envPath)) {
80
+ console.log('.env file already exists at server/.env');
81
+ return;
82
+ }
83
+
84
+ if (!existsSync(templatePath)) {
85
+ console.error('Error: .env.template not found');
86
+ process.exit(1);
87
+ }
88
+
89
+ copyFileSync(templatePath, envPath);
90
+ console.log('Created server/.env from template');
91
+ console.log('Edit server/.env to configure your API keys and settings');
92
+ }
93
+
94
+ function runNpmScript(script) {
95
+ const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm';
96
+ const child = spawn(npm, ['run', script], {
97
+ cwd: ROOT_DIR,
98
+ stdio: 'inherit',
99
+ shell: true,
100
+ });
101
+
102
+ child.on('error', (err) => {
103
+ console.error(`Failed to run: ${err.message}`);
104
+ process.exit(1);
105
+ });
106
+
107
+ child.on('close', (code) => {
108
+ process.exit(code || 0);
109
+ });
110
+ }
111
+
112
+ // Main
113
+ const [, , command = 'help'] = process.argv;
114
+
115
+ switch (command) {
116
+ case 'help':
117
+ case '--help':
118
+ case '-h':
119
+ printHelp();
120
+ break;
121
+
122
+ case 'init':
123
+ initEnv();
124
+ break;
125
+
126
+ case 'start':
127
+ checkDependencies();
128
+ if (!existsSync(resolve(ROOT_DIR, 'server', '.env'))) {
129
+ console.log('No .env found. Running init first...');
130
+ initEnv();
131
+ }
132
+ runNpmScript('start');
133
+ break;
134
+
135
+ case 'stop':
136
+ runNpmScript('stop');
137
+ break;
138
+
139
+ case 'build':
140
+ runNpmScript('build');
141
+ break;
142
+
143
+ case 'docker:up':
144
+ runNpmScript('docker:up');
145
+ break;
146
+
147
+ case 'docker:down':
148
+ runNpmScript('docker:down');
149
+ break;
150
+
151
+ case 'docker:logs':
152
+ runNpmScript('docker:logs');
153
+ break;
154
+
155
+ default:
156
+ console.error(`Unknown command: ${command}`);
157
+ printHelp();
158
+ process.exit(1);
159
+ }
@@ -0,0 +1,45 @@
1
+ # Dependencies
2
+ node_modules/
3
+
4
+ # Build output
5
+ dist/
6
+ build/
7
+
8
+ # IDE
9
+ .vscode/
10
+ .idea/
11
+ *.swp
12
+ *.swo
13
+
14
+ # Logs
15
+ *.log
16
+ npm-debug.log*
17
+ yarn-debug.log*
18
+ yarn-error.log*
19
+
20
+ # Environment
21
+ .env
22
+ .env.*
23
+ !.env.example
24
+
25
+ # Git
26
+ .git/
27
+ .gitignore
28
+
29
+ # Documentation
30
+ *.md
31
+ !README.md
32
+
33
+ # Test
34
+ coverage/
35
+ __tests__/
36
+ *.test.ts
37
+ *.test.tsx
38
+ *.spec.ts
39
+ *.spec.tsx
40
+
41
+ # TypeScript cache
42
+ *.tsbuildinfo
43
+
44
+ # ESLint cache
45
+ .eslintcache
@@ -0,0 +1,68 @@
1
+ # React Frontend (Vite)
2
+ # Development stage
3
+ FROM node:22-alpine AS development
4
+
5
+ WORKDIR /app
6
+
7
+ # Copy package files
8
+ COPY package.json package-lock.json* ./
9
+
10
+ # Install dependencies (npm ci for faster, deterministic installs)
11
+ RUN npm ci
12
+
13
+ # Copy application code
14
+ COPY . .
15
+
16
+ # Port from environment (default 3000)
17
+ ENV VITE_CLIENT_PORT=3000
18
+
19
+ # Expose default port (actual port set via environment)
20
+ EXPOSE 3000
21
+
22
+ # Run the application
23
+ CMD ["npm", "run", "start"]
24
+
25
+ # Build stage
26
+ FROM node:22-alpine AS builder
27
+
28
+ WORKDIR /app
29
+
30
+ # Copy package files
31
+ COPY package.json package-lock.json* ./
32
+
33
+ # Install dependencies (npm ci for faster, deterministic installs)
34
+ RUN npm ci
35
+
36
+ # Copy application code
37
+ COPY . .
38
+
39
+ # Build arguments for Vite environment variables (set at build time)
40
+ ARG VITE_AUTH_ENABLED=true
41
+ ARG VITE_PYTHON_SERVICE_URL=
42
+ ARG VITE_WHATSAPP_SERVICE_URL=
43
+ ARG VITE_ANDROID_RELAY_URL=
44
+
45
+ # Expose build args as environment variables for Vite build
46
+ ENV VITE_AUTH_ENABLED=$VITE_AUTH_ENABLED
47
+ ENV VITE_PYTHON_SERVICE_URL=$VITE_PYTHON_SERVICE_URL
48
+ ENV VITE_WHATSAPP_SERVICE_URL=$VITE_WHATSAPP_SERVICE_URL
49
+ ENV VITE_ANDROID_RELAY_URL=$VITE_ANDROID_RELAY_URL
50
+
51
+ # Increase Node.js memory limit for large builds (GCP e2-micro has limited RAM)
52
+ ENV NODE_OPTIONS="--max-old-space-size=2048"
53
+
54
+ # Build for production
55
+ RUN npm run build
56
+
57
+ # Production stage
58
+ FROM nginx:alpine AS production
59
+
60
+ # Copy built assets
61
+ COPY --from=builder /app/dist /usr/share/nginx/html
62
+
63
+ # Copy nginx config
64
+ COPY nginx.conf /etc/nginx/conf.d/default.conf
65
+
66
+ EXPOSE 80
67
+
68
+ CMD ["nginx", "-g", "daemon off;"]
@@ -0,0 +1,29 @@
1
+ import js from '@eslint/js'
2
+ import globals from 'globals'
3
+ import reactHooks from 'eslint-plugin-react-hooks'
4
+ import reactRefresh from 'eslint-plugin-react-refresh'
5
+ import { defineConfig, globalIgnores } from 'eslint/config'
6
+
7
+ export default defineConfig([
8
+ globalIgnores(['dist']),
9
+ {
10
+ files: ['**/*.{js,jsx}'],
11
+ extends: [
12
+ js.configs.recommended,
13
+ reactHooks.configs['recommended-latest'],
14
+ reactRefresh.configs.vite,
15
+ ],
16
+ languageOptions: {
17
+ ecmaVersion: 2020,
18
+ globals: globals.browser,
19
+ parserOptions: {
20
+ ecmaVersion: 'latest',
21
+ ecmaFeatures: { jsx: true },
22
+ sourceType: 'module',
23
+ },
24
+ },
25
+ rules: {
26
+ 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }],
27
+ },
28
+ },
29
+ ])
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>React Flow Project</title>
8
+ </head>
9
+ <body>
10
+ <div id="root"></div>
11
+ <script type="module" src="/src/main.tsx"></script>
12
+ </body>
13
+ </html>
@@ -0,0 +1,66 @@
1
+ server {
2
+ listen 80;
3
+ server_name localhost;
4
+ root /usr/share/nginx/html;
5
+ index index.html;
6
+
7
+ # Gzip compression
8
+ gzip on;
9
+ gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
10
+
11
+ # Security headers
12
+ add_header X-Content-Type-Options "nosniff" always;
13
+ add_header X-Frame-Options "SAMEORIGIN" always;
14
+
15
+ # Handle SPA routing
16
+ location / {
17
+ try_files $uri $uri/ /index.html;
18
+ }
19
+
20
+ # Proxy API requests to backend
21
+ location /api/ {
22
+ proxy_pass http://backend:3010/api/;
23
+ proxy_http_version 1.1;
24
+ proxy_set_header Upgrade $http_upgrade;
25
+ proxy_set_header Connection 'upgrade';
26
+ proxy_set_header Host $host;
27
+ proxy_set_header X-Real-IP $remote_addr;
28
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
29
+ proxy_cache_bypass $http_upgrade;
30
+ }
31
+
32
+ # Proxy webhook requests to backend
33
+ location /webhook/ {
34
+ proxy_pass http://backend:3010/webhook/;
35
+ proxy_http_version 1.1;
36
+ proxy_set_header Host $host;
37
+ proxy_set_header X-Real-IP $remote_addr;
38
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
39
+ proxy_set_header X-Forwarded-Proto $scheme;
40
+ }
41
+
42
+ # Proxy WebSocket requests
43
+ location /ws/ {
44
+ proxy_pass http://backend:3010/ws/;
45
+ proxy_http_version 1.1;
46
+ proxy_set_header Upgrade $http_upgrade;
47
+ proxy_set_header Connection "Upgrade";
48
+ proxy_set_header Host $host;
49
+ proxy_set_header X-Real-IP $remote_addr;
50
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
51
+ proxy_read_timeout 86400;
52
+ }
53
+
54
+ # Health check endpoint
55
+ location /health {
56
+ proxy_pass http://backend:3010/health;
57
+ proxy_http_version 1.1;
58
+ proxy_set_header Host $host;
59
+ }
60
+
61
+ # Cache static assets
62
+ location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
63
+ expires 1y;
64
+ add_header Cache-Control "public, immutable";
65
+ }
66
+ }
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "react-flow-client",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "start": "vite --host 0.0.0.0 --port ${VITE_CLIENT_PORT:-3000}",
8
+ "dev": "vite",
9
+ "build": "vite build",
10
+ "lint": "eslint .",
11
+ "preview": "vite preview"
12
+ },
13
+ "dependencies": {
14
+ "@ant-design/icons": "^6.0.2",
15
+ "@lobehub/icons": "^2.45.0",
16
+ "@radix-ui/react-collapsible": "^1.1.12",
17
+ "@radix-ui/react-dialog": "^1.1.15",
18
+ "@types/styled-components": "^5.1.34",
19
+ "antd": "^5.27.4",
20
+ "prismjs": "^1.30.0",
21
+ "react": "^19.1.1",
22
+ "react-dom": "^19.1.1",
23
+ "react-js-cron": "^5.2.0",
24
+ "react-markdown": "^10.1.0",
25
+ "react-simple-code-editor": "^0.14.1",
26
+ "reactflow": "^11.11.4",
27
+ "styled-components": "^6.1.19",
28
+ "zustand": "^5.0.8"
29
+ },
30
+ "devDependencies": {
31
+ "@eslint/js": "^9.33.0",
32
+ "@types/google.maps": "^3.58.1",
33
+ "@types/node": "^24.3.1",
34
+ "@types/prismjs": "^1.26.5",
35
+ "@types/react": "^19.1.10",
36
+ "@types/react-dom": "^19.1.7",
37
+ "@vitejs/plugin-react": "^5.0.0",
38
+ "autoprefixer": "^10.4.21",
39
+ "eslint": "^9.33.0",
40
+ "eslint-plugin-react-hooks": "^7.0.1",
41
+ "eslint-plugin-react-refresh": "^0.4.20",
42
+ "globals": "^16.3.0",
43
+ "postcss": "^8.5.6",
44
+ "tailwindcss": "^4.1.13",
45
+ "typescript": "^5.9.2",
46
+ "vite": "^7.1.2"
47
+ }
48
+ }
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+ import { ConfigProvider, theme as antdThemeAlgorithm } from 'antd';
3
+ import Dashboard from './Dashboard';
4
+ import ProtectedRoute from './components/auth/ProtectedRoute';
5
+ import { lightTheme, darkTheme } from './config/antdTheme';
6
+ import { useTheme } from './contexts/ThemeContext';
7
+
8
+ const App: React.FC = () => {
9
+ const { isDarkMode } = useTheme();
10
+
11
+ const currentTheme = isDarkMode ? {
12
+ ...darkTheme,
13
+ algorithm: antdThemeAlgorithm.darkAlgorithm,
14
+ } : lightTheme;
15
+
16
+ return (
17
+ <ConfigProvider theme={currentTheme}>
18
+ <ProtectedRoute>
19
+ <div style={{ width: '100vw', height: '100vh', display: 'flex' }}>
20
+ <Dashboard />
21
+ </div>
22
+ </ProtectedRoute>
23
+ </ConfigProvider>
24
+ );
25
+ }
26
+
27
+ export default App