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,30 @@
1
+ # Git
2
+ .git
3
+ .gitignore
4
+
5
+ # Build artifacts
6
+ bin/
7
+ *.exe
8
+
9
+ # Data (mounted as volume)
10
+ data/
11
+
12
+ # Node modules
13
+ node_modules/
14
+
15
+ # Python cache
16
+ __pycache__/
17
+ *.pyc
18
+ *.pyo
19
+ .pytest_cache/
20
+
21
+ # IDE
22
+ .vscode/
23
+ .idea/
24
+
25
+ # Docs
26
+ *.md
27
+ !README.md
28
+
29
+ # Plans
30
+ .claude/
@@ -0,0 +1,44 @@
1
+ # Build stage
2
+ FROM golang:1.24-alpine AS builder
3
+
4
+ WORKDIR /app
5
+
6
+ # Install build dependencies
7
+ RUN apk add --no-cache git
8
+
9
+ # Copy go mod files
10
+ COPY go.mod go.sum ./
11
+ RUN go mod download
12
+
13
+ # Copy source code
14
+ COPY src/go/ ./src/go/
15
+
16
+ # Build binary
17
+ RUN CGO_ENABLED=0 GOOS=linux go build -o whatsapp-rpc-server ./src/go/cmd/server
18
+
19
+ # Runtime stage
20
+ FROM alpine:latest
21
+
22
+ WORKDIR /app
23
+
24
+ # Install ca-certificates for HTTPS
25
+ RUN apk add --no-cache ca-certificates tzdata
26
+
27
+ # Create data directories
28
+ RUN mkdir -p /app/data/qr /app/configs
29
+
30
+ # Copy binary from builder
31
+ COPY --from=builder /app/whatsapp-rpc-server .
32
+
33
+ # Copy config if exists
34
+ COPY configs/config.yaml ./configs/
35
+
36
+ # Expose WebSocket port
37
+ EXPOSE 9400
38
+
39
+ # Health check
40
+ HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
41
+ CMD wget --no-verbose --tries=1 --spider http://localhost:9400/health || exit 1
42
+
43
+ # Run server
44
+ CMD ["./whatsapp-rpc-server"]
@@ -0,0 +1,17 @@
1
+ # Python Web UI
2
+ FROM python:3.11-slim
3
+
4
+ WORKDIR /app
5
+
6
+ # Install dependencies
7
+ COPY web/requirements.txt ./
8
+ RUN pip install --no-cache-dir -r requirements.txt
9
+
10
+ # Copy web app
11
+ COPY web/ ./
12
+
13
+ # Expose port
14
+ EXPOSE 5000
15
+
16
+ # Run Flask app
17
+ CMD ["python", "app.py"]
@@ -0,0 +1,139 @@
1
+ # WhatsApp RPC
2
+
3
+ WebSocket JSON-RPC 2.0 API for WhatsApp.
4
+
5
+ <img width="1280" height="676" alt="image" src="https://github.com/user-attachments/assets/ddc7324a-8c4d-4557-ac6f-cb091a8ce31f" />
6
+
7
+ ## Architecture
8
+
9
+ ```
10
+ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
11
+ │ Your App │ │ Web UI │ │ Python Client │
12
+ │ (Any Language) │ │ (Flask) │ │ Library │
13
+ └────────┬────────┘ └────────┬────────┘ └────────┬────────┘
14
+ │ │ │
15
+ │ WebSocket │ HTTP │
16
+ │ JSON-RPC 2.0 │ :5000 │
17
+ │ │ │
18
+ └───────────┬───────────┴───────────────────────┘
19
+
20
+
21
+ ┌───────────────────────┐
22
+ │ Go WebSocket API │
23
+ │ :9400 │
24
+ │ ┌─────────────────┐ │
25
+ │ │ RPC Handler │ │
26
+ │ │ Rate Limiter │ │
27
+ │ │ Event Emitter │ │
28
+ │ └────────┬────────┘ │
29
+ └───────────┼───────────┘
30
+
31
+
32
+ ┌───────────────────────┐
33
+ │ WhatsApp Service │
34
+ │ ┌─────────────────┐ │
35
+ │ │ whatsmeow │ │
36
+ │ │ (Go Library) │ │
37
+ │ └────────┬────────┘ │
38
+ └───────────┼───────────┘
39
+
40
+
41
+ ┌───────────────────────┐
42
+ │ WhatsApp Servers │
43
+ └───────────────────────┘
44
+
45
+ Data Storage:
46
+ ┌─────────────────────────────────┐
47
+ │ data/ │
48
+ │ ├── whatsapp.db (SQLite) │
49
+ │ ├── qr/*.png (QR codes) │
50
+ │ └── groups.json (Group cache)│
51
+ └─────────────────────────────────┘
52
+ ```
53
+
54
+ ## Setup
55
+
56
+ ### Native
57
+ ```bash
58
+ npm start # Start API + Web UI
59
+ npm stop # Stop all
60
+ npm run restart # Restart all
61
+ npm run status # Check if running
62
+ npm run api # Start API only
63
+ npm run web # Start Web UI only
64
+ npm run build # Build Go binary
65
+ npm run clean # Full cleanup (bin, data, node_modules)
66
+ ```
67
+
68
+ All commands auto-install dependencies if missing.
69
+
70
+ ### Docker
71
+ ```bash
72
+ docker-compose up -d # Start
73
+ docker-compose down # Stop
74
+ docker-compose logs -f # View logs
75
+ ```
76
+
77
+ ## Endpoints
78
+
79
+ | Port | Service |
80
+ |------|---------|
81
+ | 9400 | WebSocket API - `ws://localhost:9400/ws/rpc` |
82
+ | 5000 | Web UI - `http://localhost:5000` |
83
+
84
+ ## API
85
+
86
+ Connect via WebSocket and send JSON-RPC 2.0 requests:
87
+
88
+ ```json
89
+ {"jsonrpc": "2.0", "id": 1, "method": "send", "params": {"phone": "1234567890", "type": "text", "message": "Hello"}}
90
+ ```
91
+
92
+ ### Methods
93
+
94
+ | Method | Params | Description |
95
+ |--------|--------|-------------|
96
+ | `status` | - | Connection status |
97
+ | `start` | - | Start WhatsApp |
98
+ | `stop` | - | Stop WhatsApp |
99
+ | `restart` | - | Full reset (logout, delete DB, new QR) |
100
+ | `qr` | - | Get QR code (base64 PNG) |
101
+ | `send` | `phone/group_id`, `type`, `message/media_data` | Send message |
102
+ | `media` | `message_id` | Download received media |
103
+ | `groups` | - | List all groups |
104
+ | `group_info` | `group_id` | Get group details |
105
+ | `contact_check` | `phones[]` | Check if numbers are on WhatsApp |
106
+
107
+ Full schema: [schema.json](schema.json)
108
+
109
+ ## Events
110
+
111
+ Server pushes events as JSON-RPC notifications (no `id`):
112
+
113
+ ```json
114
+ {"jsonrpc": "2.0", "method": "event.message_received", "params": {...}}
115
+ ```
116
+
117
+ Events: `connected`, `disconnected`, `qr_code`, `message_received`, `message_sent`
118
+
119
+ ## Data Files
120
+
121
+ - `data/whatsapp.db` - SQLite database (session, contacts)
122
+ - `data/qr/*.png` - QR code images
123
+ - `data/groups.json` - Auto-generated on connection (indexed group data)
124
+
125
+ ## Structure
126
+
127
+ ```
128
+ src/go/ # Go backend
129
+ src/python/ # Python client library
130
+ web/ # Flask web UI
131
+ scripts/ # CLI tools
132
+ configs/ # YAML config
133
+ ```
134
+
135
+ ## Requirements
136
+
137
+ - Go 1.21+
138
+ - Python 3.8+
139
+ - Node.js 16+
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env node
2
+ import { program } from 'commander';
3
+ import chalk from 'chalk';
4
+ import { execa } from 'execa';
5
+ import killPort from 'kill-port';
6
+ import { Socket } from 'net';
7
+ import { execSync, spawn } from 'child_process';
8
+ import { existsSync, statSync, unlinkSync, readdirSync } from 'fs';
9
+ import { dirname, join } from 'path';
10
+ import { fileURLToPath } from 'url';
11
+
12
+ const __dirname = dirname(fileURLToPath(import.meta.url));
13
+ const API_PORT = 9400, WEB_PORT = 5000;
14
+ const BIN = process.platform === 'win32' ? 'whatsapp-rpc.exe' : 'whatsapp-rpc';
15
+
16
+ const log = (m, c = 'blue') => console.log(chalk[c](m));
17
+ const sleep = ms => new Promise(r => setTimeout(r, ms));
18
+
19
+ const portUp = port => new Promise(r => {
20
+ const s = new Socket();
21
+ s.setTimeout(2000);
22
+ s.on('connect', () => { s.destroy(); r(true); });
23
+ s.on('timeout', () => { s.destroy(); r(false); });
24
+ s.on('error', () => r(false));
25
+ s.connect(port, '127.0.0.1');
26
+ });
27
+
28
+ const wait = async (port, ms = 10000) => {
29
+ const t = Date.now();
30
+ while (Date.now() - t < ms) { if (await portUp(port)) return true; await sleep(500); }
31
+ return false;
32
+ };
33
+
34
+ const kill = async (port, name) => {
35
+ try { await killPort(port); log(`${name} stopped`, 'green'); }
36
+ catch { log(`${name} not running`, 'yellow'); }
37
+ };
38
+
39
+ const py = () => {
40
+ try { execSync('python --version', { stdio: 'ignore' }); return 'python'; }
41
+ catch { try { execSync('python3 --version', { stdio: 'ignore' }); return 'python3'; } catch { return null; } }
42
+ };
43
+
44
+ async function api() {
45
+ if (await portUp(API_PORT)) { log(`API already on ${API_PORT}`, 'yellow'); return; }
46
+ const bin = join(__dirname, BIN);
47
+ if (!existsSync(bin)) { log('Building...', 'yellow'); await build(); }
48
+ spawn(bin, [], { cwd: __dirname, detached: true, stdio: 'ignore' }).unref();
49
+ if (await wait(API_PORT)) log(`API: ws://localhost:${API_PORT}/ws/rpc`, 'green');
50
+ else log('API failed to start', 'red');
51
+ }
52
+
53
+ async function web() {
54
+ if (await portUp(WEB_PORT)) { log(`Web already on ${WEB_PORT}`, 'yellow'); return; }
55
+ const p = py(); if (!p) { log('Python not found', 'red'); return; }
56
+ if (!await portUp(API_PORT)) log('Warning: API not running', 'yellow');
57
+ spawn(p, ['app.py'], { cwd: join(__dirname, 'web'), detached: true, stdio: 'ignore' }).unref();
58
+ if (await wait(WEB_PORT)) log(`Web: http://localhost:${WEB_PORT}`, 'green');
59
+ else log('Web failed to start', 'red');
60
+ }
61
+
62
+ async function start() { await api(); await sleep(1000); await web(); }
63
+ async function stop() { await kill(API_PORT, 'API'); await kill(WEB_PORT, 'Web'); }
64
+
65
+ async function status() {
66
+ const a = await portUp(API_PORT), w = await portUp(WEB_PORT);
67
+ log(`API (${API_PORT}): ${a ? 'UP' : 'DOWN'}`, a ? 'green' : 'red');
68
+ log(`Web (${WEB_PORT}): ${w ? 'UP' : 'DOWN'}`, w ? 'green' : 'red');
69
+ }
70
+
71
+ async function build() {
72
+ const bin = join(__dirname, BIN);
73
+ if (existsSync(bin)) unlinkSync(bin);
74
+ await execa('go', ['build', '-o', BIN, '.'], { cwd: __dirname, stdio: 'inherit' });
75
+ log(`Built: ${BIN} (${(statSync(bin).size / 1024 / 1024).toFixed(1)}MB)`, 'green');
76
+ }
77
+
78
+ async function clean() {
79
+ const bin = join(__dirname, BIN);
80
+ if (existsSync(bin)) { unlinkSync(bin); log(`Removed ${BIN}`, 'green'); }
81
+ readdirSync(__dirname).filter(f => f.startsWith('qr_') && f.endsWith('.png')).forEach(f => {
82
+ unlinkSync(join(__dirname, f)); log(`Removed ${f}`, 'green');
83
+ });
84
+ }
85
+
86
+ program.name('wa').version('1.0.0');
87
+ program.command('start').description('Start all').action(start);
88
+ program.command('stop').description('Stop all').action(stop);
89
+ program.command('restart').description('Restart all').action(async () => { await stop(); await sleep(1000); await start(); });
90
+ program.command('status').description('Status').action(status);
91
+ program.command('api').description('Start API only').action(api);
92
+ program.command('web').description('Start Web only').action(web);
93
+ program.command('build').description('Build binary').action(build);
94
+ program.command('clean').description('Clean artifacts').action(clean);
95
+ program.parse();
@@ -0,0 +1,7 @@
1
+ environment: "development"
2
+ log_level: 4
3
+ server:
4
+ port: 9400
5
+ host: "0.0.0.0"
6
+ database:
7
+ path: "data/whatsapp.db"
@@ -0,0 +1,35 @@
1
+ services:
2
+ api:
3
+ build: .
4
+ container_name: whatsapp-rpc-api
5
+ ports:
6
+ - "9400:9400"
7
+ volumes:
8
+ - ./data:/app/data
9
+ - ./configs:/app/configs
10
+ environment:
11
+ - WA_SERVER_PORT=9400
12
+ - WA_DATABASE_PATH=data/whatsapp.db
13
+ restart: unless-stopped
14
+ healthcheck:
15
+ test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:9400/health"]
16
+ interval: 30s
17
+ timeout: 10s
18
+ retries: 3
19
+
20
+ web:
21
+ build:
22
+ context: .
23
+ dockerfile: Dockerfile.web
24
+ container_name: whatsapp-rpc-web
25
+ ports:
26
+ - "5000:5000"
27
+ environment:
28
+ - GO_WS_RPC_URL=ws://api:9400/ws/rpc
29
+ depends_on:
30
+ api:
31
+ condition: service_healthy
32
+ restart: unless-stopped
33
+
34
+ volumes:
35
+ data: