machinaos 0.0.1 → 0.0.6
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.
- package/.env.template +71 -71
- package/LICENSE +21 -21
- package/README.md +145 -87
- package/bin/cli.js +62 -106
- package/client/.dockerignore +45 -45
- package/client/Dockerfile +68 -68
- package/client/dist/assets/index-DFSC53FP.css +1 -0
- package/client/dist/assets/index-fJ-1gTf5.js +613 -0
- package/client/dist/index.html +14 -0
- package/client/eslint.config.js +34 -16
- package/client/nginx.conf +66 -66
- package/client/package.json +61 -48
- package/client/src/App.tsx +27 -27
- package/client/src/Dashboard.tsx +1200 -1172
- package/client/src/ParameterPanel.tsx +302 -300
- package/client/src/components/AIAgentNode.tsx +315 -321
- package/client/src/components/APIKeyValidator.tsx +117 -117
- package/client/src/components/ClaudeChatModelNode.tsx +17 -17
- package/client/src/components/CredentialsModal.tsx +1200 -306
- package/client/src/components/GeminiChatModelNode.tsx +17 -17
- package/client/src/components/GenericNode.tsx +356 -356
- package/client/src/components/LocationParameterPanel.tsx +153 -153
- package/client/src/components/ModelNode.tsx +285 -285
- package/client/src/components/OpenAIChatModelNode.tsx +17 -17
- package/client/src/components/OutputPanel.tsx +470 -470
- package/client/src/components/ParameterRenderer.tsx +1873 -1873
- package/client/src/components/SkillEditorModal.tsx +3 -3
- package/client/src/components/SquareNode.tsx +812 -796
- package/client/src/components/ToolkitNode.tsx +365 -365
- package/client/src/components/auth/LoginPage.tsx +247 -247
- package/client/src/components/auth/ProtectedRoute.tsx +59 -59
- package/client/src/components/base/BaseChatModelNode.tsx +270 -270
- package/client/src/components/icons/AIProviderIcons.tsx +50 -50
- package/client/src/components/maps/GoogleMapsPicker.tsx +136 -136
- package/client/src/components/maps/MapsPreviewPanel.tsx +109 -109
- package/client/src/components/maps/index.ts +25 -25
- package/client/src/components/parameterPanel/InputSection.tsx +1094 -1094
- package/client/src/components/parameterPanel/LocationPanelLayout.tsx +64 -64
- package/client/src/components/parameterPanel/MapsSection.tsx +91 -91
- package/client/src/components/parameterPanel/MiddleSection.tsx +867 -571
- package/client/src/components/parameterPanel/OutputSection.tsx +80 -80
- package/client/src/components/parameterPanel/ParameterPanelLayout.tsx +81 -81
- package/client/src/components/parameterPanel/ToolSchemaEditor.tsx +436 -436
- package/client/src/components/parameterPanel/index.ts +41 -41
- package/client/src/components/shared/DataPanel.tsx +142 -142
- package/client/src/components/shared/JSONTreeRenderer.tsx +105 -105
- package/client/src/components/ui/AIResultModal.tsx +203 -203
- package/client/src/components/ui/ApiKeyInput.tsx +93 -0
- package/client/src/components/ui/CodeEditor.tsx +81 -81
- package/client/src/components/ui/CollapsibleSection.tsx +87 -87
- package/client/src/components/ui/ComponentItem.tsx +153 -153
- package/client/src/components/ui/ComponentPalette.tsx +320 -320
- package/client/src/components/ui/ConsolePanel.tsx +151 -43
- package/client/src/components/ui/ErrorBoundary.tsx +195 -195
- package/client/src/components/ui/InputNodesPanel.tsx +203 -203
- package/client/src/components/ui/MapSelector.tsx +313 -313
- package/client/src/components/ui/Modal.tsx +151 -148
- package/client/src/components/ui/NodeOutputPanel.tsx +1150 -1150
- package/client/src/components/ui/OutputDisplayPanel.tsx +381 -381
- package/client/src/components/ui/QRCodeDisplay.tsx +182 -0
- package/client/src/components/ui/TopToolbar.tsx +736 -736
- package/client/src/components/ui/WorkflowSidebar.tsx +293 -293
- package/client/src/config/antdTheme.ts +186 -186
- package/client/src/contexts/AuthContext.tsx +221 -221
- package/client/src/contexts/ThemeContext.tsx +42 -42
- package/client/src/contexts/WebSocketContext.tsx +2144 -1971
- package/client/src/factories/baseChatModelFactory.ts +255 -255
- package/client/src/hooks/useAndroidOperations.ts +118 -164
- package/client/src/hooks/useApiKeyValidation.ts +106 -106
- package/client/src/hooks/useApiKeys.ts +238 -238
- package/client/src/hooks/useAppTheme.ts +17 -17
- package/client/src/hooks/useComponentPalette.ts +50 -50
- package/client/src/hooks/useDragAndDrop.ts +123 -123
- package/client/src/hooks/useDragVariable.ts +88 -88
- package/client/src/hooks/useExecution.ts +319 -313
- package/client/src/hooks/useParameterPanel.ts +176 -176
- package/client/src/hooks/useReactFlowNodes.ts +188 -188
- package/client/src/hooks/useToolSchema.ts +209 -209
- package/client/src/hooks/useWhatsApp.ts +196 -196
- package/client/src/hooks/useWorkflowManagement.ts +45 -45
- package/client/src/index.css +314 -314
- package/client/src/nodeDefinitions/aiAgentNodes.ts +335 -335
- package/client/src/nodeDefinitions/aiModelNodes.ts +340 -340
- package/client/src/nodeDefinitions/androidServiceNodes.ts +383 -383
- package/client/src/nodeDefinitions/chatNodes.ts +135 -135
- package/client/src/nodeDefinitions/codeNodes.ts +54 -54
- package/client/src/nodeDefinitions/index.ts +14 -14
- package/client/src/nodeDefinitions/locationNodes.ts +462 -462
- package/client/src/nodeDefinitions/schedulerNodes.ts +220 -220
- package/client/src/nodeDefinitions/skillNodes.ts +17 -5
- package/client/src/nodeDefinitions/utilityNodes.ts +284 -284
- package/client/src/nodeDefinitions/whatsappNodes.ts +821 -865
- package/client/src/nodeDefinitions.ts +101 -103
- package/client/src/services/dynamicParameterService.ts +95 -95
- package/client/src/services/execution/aiAgentExecutionService.ts +34 -34
- package/client/src/services/executionService.ts +227 -231
- package/client/src/services/workflowApi.ts +91 -91
- package/client/src/store/useAppStore.ts +578 -581
- package/client/src/styles/theme.ts +513 -508
- package/client/src/styles/zIndex.ts +16 -16
- package/client/src/types/ComponentTypes.ts +38 -38
- package/client/src/types/INodeProperties.ts +287 -287
- package/client/src/types/NodeTypes.ts +27 -27
- package/client/src/utils/formatters.ts +32 -32
- package/client/src/utils/googleMapsLoader.ts +139 -139
- package/client/src/utils/locationUtils.ts +84 -84
- package/client/src/utils/nodeUtils.ts +30 -30
- package/client/src/utils/workflow.ts +29 -29
- package/client/src/vite-env.d.ts +12 -12
- package/client/tailwind.config.js +59 -59
- package/client/tsconfig.json +25 -25
- package/client/vite.config.js +35 -35
- package/package.json +78 -70
- package/scripts/build.js +153 -45
- package/scripts/clean.js +40 -40
- package/scripts/start.js +234 -210
- package/scripts/stop.js +301 -325
- package/server/.dockerignore +44 -44
- package/server/Dockerfile +45 -45
- package/server/constants.py +244 -249
- package/server/core/cache.py +460 -460
- package/server/core/config.py +127 -127
- package/server/core/container.py +98 -98
- package/server/core/database.py +1296 -1210
- package/server/core/logging.py +313 -313
- package/server/main.py +288 -288
- package/server/middleware/__init__.py +5 -5
- package/server/middleware/auth.py +89 -89
- package/server/models/auth.py +52 -52
- package/server/models/cache.py +24 -24
- package/server/models/database.py +235 -210
- package/server/models/nodes.py +435 -455
- package/server/pyproject.toml +75 -72
- package/server/requirements.txt +83 -83
- package/server/routers/android.py +294 -294
- package/server/routers/auth.py +203 -203
- package/server/routers/database.py +150 -150
- package/server/routers/maps.py +141 -141
- package/server/routers/nodejs_compat.py +288 -288
- package/server/routers/webhook.py +90 -90
- package/server/routers/websocket.py +2239 -2127
- package/server/routers/whatsapp.py +761 -761
- package/server/routers/workflow.py +199 -199
- package/server/services/ai.py +2444 -2414
- package/server/services/android_service.py +588 -588
- package/server/services/auth.py +130 -130
- package/server/services/chat_client.py +160 -160
- package/server/services/deployment/manager.py +706 -706
- package/server/services/event_waiter.py +675 -785
- package/server/services/execution/executor.py +1351 -1351
- package/server/services/execution/models.py +1 -1
- package/server/services/handlers/__init__.py +122 -126
- package/server/services/handlers/ai.py +390 -355
- package/server/services/handlers/android.py +69 -260
- package/server/services/handlers/code.py +278 -278
- package/server/services/handlers/http.py +193 -193
- package/server/services/handlers/tools.py +146 -32
- package/server/services/handlers/triggers.py +107 -107
- package/server/services/handlers/utility.py +822 -822
- package/server/services/handlers/whatsapp.py +423 -476
- package/server/services/maps.py +288 -288
- package/server/services/memory_store.py +103 -103
- package/server/services/node_executor.py +372 -375
- package/server/services/scheduler.py +155 -155
- package/server/services/skill_loader.py +1 -1
- package/server/services/status_broadcaster.py +834 -826
- package/server/services/temporal/__init__.py +23 -23
- package/server/services/temporal/activities.py +344 -344
- package/server/services/temporal/client.py +76 -76
- package/server/services/temporal/executor.py +147 -147
- package/server/services/temporal/worker.py +251 -251
- package/server/services/temporal/workflow.py +355 -355
- package/server/services/temporal/ws_client.py +236 -236
- package/server/services/text.py +110 -110
- package/server/services/user_auth.py +172 -172
- package/server/services/websocket_client.py +29 -29
- package/server/services/workflow.py +597 -597
- package/server/skills/android-skill/SKILL.md +4 -4
- package/server/skills/code-skill/SKILL.md +123 -89
- package/server/skills/maps-skill/SKILL.md +3 -3
- package/server/skills/memory-skill/SKILL.md +1 -1
- package/server/skills/web-search-skill/SKILL.md +154 -0
- package/server/skills/whatsapp-skill/SKILL.md +3 -3
- package/server/uv.lock +461 -100
- package/server/whatsapp-rpc/.dockerignore +30 -30
- package/server/whatsapp-rpc/Dockerfile +44 -44
- package/server/whatsapp-rpc/Dockerfile.web +17 -17
- package/server/whatsapp-rpc/README.md +139 -139
- package/server/whatsapp-rpc/bin/whatsapp-rpc-server +0 -0
- package/server/whatsapp-rpc/cli.js +95 -95
- package/server/whatsapp-rpc/configs/config.yaml +6 -6
- package/server/whatsapp-rpc/docker-compose.yml +35 -35
- package/server/whatsapp-rpc/docs/API.md +410 -410
- package/server/whatsapp-rpc/node_modules/.package-lock.json +259 -0
- package/server/whatsapp-rpc/node_modules/chalk/license +9 -0
- package/server/whatsapp-rpc/node_modules/chalk/package.json +83 -0
- package/server/whatsapp-rpc/node_modules/chalk/readme.md +297 -0
- package/server/whatsapp-rpc/node_modules/chalk/source/index.d.ts +325 -0
- package/server/whatsapp-rpc/node_modules/chalk/source/index.js +225 -0
- package/server/whatsapp-rpc/node_modules/chalk/source/utilities.js +33 -0
- package/server/whatsapp-rpc/node_modules/chalk/source/vendor/ansi-styles/index.d.ts +236 -0
- package/server/whatsapp-rpc/node_modules/chalk/source/vendor/ansi-styles/index.js +223 -0
- package/server/whatsapp-rpc/node_modules/chalk/source/vendor/supports-color/browser.d.ts +1 -0
- package/server/whatsapp-rpc/node_modules/chalk/source/vendor/supports-color/browser.js +34 -0
- package/server/whatsapp-rpc/node_modules/chalk/source/vendor/supports-color/index.d.ts +55 -0
- package/server/whatsapp-rpc/node_modules/chalk/source/vendor/supports-color/index.js +190 -0
- package/server/whatsapp-rpc/node_modules/commander/LICENSE +22 -0
- package/server/whatsapp-rpc/node_modules/commander/Readme.md +1148 -0
- package/server/whatsapp-rpc/node_modules/commander/esm.mjs +16 -0
- package/server/whatsapp-rpc/node_modules/commander/index.js +26 -0
- package/server/whatsapp-rpc/node_modules/commander/lib/argument.js +145 -0
- package/server/whatsapp-rpc/node_modules/commander/lib/command.js +2179 -0
- package/server/whatsapp-rpc/node_modules/commander/lib/error.js +43 -0
- package/server/whatsapp-rpc/node_modules/commander/lib/help.js +462 -0
- package/server/whatsapp-rpc/node_modules/commander/lib/option.js +329 -0
- package/server/whatsapp-rpc/node_modules/commander/lib/suggestSimilar.js +100 -0
- package/server/whatsapp-rpc/node_modules/commander/package-support.json +16 -0
- package/server/whatsapp-rpc/node_modules/commander/package.json +80 -0
- package/server/whatsapp-rpc/node_modules/commander/typings/esm.d.mts +3 -0
- package/server/whatsapp-rpc/node_modules/commander/typings/index.d.ts +884 -0
- package/server/whatsapp-rpc/node_modules/cross-spawn/LICENSE +21 -0
- package/server/whatsapp-rpc/node_modules/cross-spawn/README.md +89 -0
- package/server/whatsapp-rpc/node_modules/cross-spawn/index.js +39 -0
- package/server/whatsapp-rpc/node_modules/cross-spawn/lib/enoent.js +59 -0
- package/server/whatsapp-rpc/node_modules/cross-spawn/lib/parse.js +91 -0
- package/server/whatsapp-rpc/node_modules/cross-spawn/lib/util/escape.js +47 -0
- package/server/whatsapp-rpc/node_modules/cross-spawn/lib/util/readShebang.js +23 -0
- package/server/whatsapp-rpc/node_modules/cross-spawn/lib/util/resolveCommand.js +52 -0
- package/server/whatsapp-rpc/node_modules/cross-spawn/package.json +73 -0
- package/server/whatsapp-rpc/node_modules/execa/index.d.ts +955 -0
- package/server/whatsapp-rpc/node_modules/execa/index.js +309 -0
- package/server/whatsapp-rpc/node_modules/execa/lib/command.js +119 -0
- package/server/whatsapp-rpc/node_modules/execa/lib/error.js +87 -0
- package/server/whatsapp-rpc/node_modules/execa/lib/kill.js +102 -0
- package/server/whatsapp-rpc/node_modules/execa/lib/pipe.js +42 -0
- package/server/whatsapp-rpc/node_modules/execa/lib/promise.js +36 -0
- package/server/whatsapp-rpc/node_modules/execa/lib/stdio.js +49 -0
- package/server/whatsapp-rpc/node_modules/execa/lib/stream.js +133 -0
- package/server/whatsapp-rpc/node_modules/execa/lib/verbose.js +19 -0
- package/server/whatsapp-rpc/node_modules/execa/license +9 -0
- package/server/whatsapp-rpc/node_modules/execa/package.json +90 -0
- package/server/whatsapp-rpc/node_modules/execa/readme.md +822 -0
- package/server/whatsapp-rpc/node_modules/get-stream/license +9 -0
- package/server/whatsapp-rpc/node_modules/get-stream/package.json +53 -0
- package/server/whatsapp-rpc/node_modules/get-stream/readme.md +291 -0
- package/server/whatsapp-rpc/node_modules/get-stream/source/array-buffer.js +84 -0
- package/server/whatsapp-rpc/node_modules/get-stream/source/array.js +32 -0
- package/server/whatsapp-rpc/node_modules/get-stream/source/buffer.js +20 -0
- package/server/whatsapp-rpc/node_modules/get-stream/source/contents.js +101 -0
- package/server/whatsapp-rpc/node_modules/get-stream/source/index.d.ts +119 -0
- package/server/whatsapp-rpc/node_modules/get-stream/source/index.js +5 -0
- package/server/whatsapp-rpc/node_modules/get-stream/source/string.js +36 -0
- package/server/whatsapp-rpc/node_modules/get-stream/source/utils.js +11 -0
- package/server/whatsapp-rpc/node_modules/get-them-args/LICENSE +21 -0
- package/server/whatsapp-rpc/node_modules/get-them-args/README.md +95 -0
- package/server/whatsapp-rpc/node_modules/get-them-args/index.js +97 -0
- package/server/whatsapp-rpc/node_modules/get-them-args/package.json +36 -0
- package/server/whatsapp-rpc/node_modules/human-signals/LICENSE +201 -0
- package/server/whatsapp-rpc/node_modules/human-signals/README.md +168 -0
- package/server/whatsapp-rpc/node_modules/human-signals/build/src/core.js +273 -0
- package/server/whatsapp-rpc/node_modules/human-signals/build/src/main.d.ts +73 -0
- package/server/whatsapp-rpc/node_modules/human-signals/build/src/main.js +70 -0
- package/server/whatsapp-rpc/node_modules/human-signals/build/src/realtime.js +16 -0
- package/server/whatsapp-rpc/node_modules/human-signals/build/src/signals.js +34 -0
- package/server/whatsapp-rpc/node_modules/human-signals/package.json +61 -0
- package/server/whatsapp-rpc/node_modules/is-stream/index.d.ts +81 -0
- package/server/whatsapp-rpc/node_modules/is-stream/index.js +29 -0
- package/server/whatsapp-rpc/node_modules/is-stream/license +9 -0
- package/server/whatsapp-rpc/node_modules/is-stream/package.json +44 -0
- package/server/whatsapp-rpc/node_modules/is-stream/readme.md +60 -0
- package/server/whatsapp-rpc/node_modules/isexe/LICENSE +15 -0
- package/server/whatsapp-rpc/node_modules/isexe/README.md +51 -0
- package/server/whatsapp-rpc/node_modules/isexe/index.js +57 -0
- package/server/whatsapp-rpc/node_modules/isexe/mode.js +41 -0
- package/server/whatsapp-rpc/node_modules/isexe/package.json +31 -0
- package/server/whatsapp-rpc/node_modules/isexe/test/basic.js +221 -0
- package/server/whatsapp-rpc/node_modules/isexe/windows.js +42 -0
- package/server/whatsapp-rpc/node_modules/kill-port/.editorconfig +12 -0
- package/server/whatsapp-rpc/node_modules/kill-port/.gitattributes +1 -0
- package/server/whatsapp-rpc/node_modules/kill-port/LICENSE +21 -0
- package/server/whatsapp-rpc/node_modules/kill-port/README.md +140 -0
- package/server/whatsapp-rpc/node_modules/kill-port/cli.js +25 -0
- package/server/whatsapp-rpc/node_modules/kill-port/example.js +21 -0
- package/server/whatsapp-rpc/node_modules/kill-port/index.js +46 -0
- package/server/whatsapp-rpc/node_modules/kill-port/logo.png +0 -0
- package/server/whatsapp-rpc/node_modules/kill-port/package.json +41 -0
- package/server/whatsapp-rpc/node_modules/kill-port/pnpm-lock.yaml +4606 -0
- package/server/whatsapp-rpc/node_modules/kill-port/test.js +16 -0
- package/server/whatsapp-rpc/node_modules/merge-stream/LICENSE +21 -0
- package/server/whatsapp-rpc/node_modules/merge-stream/README.md +78 -0
- package/server/whatsapp-rpc/node_modules/merge-stream/index.js +41 -0
- package/server/whatsapp-rpc/node_modules/merge-stream/package.json +19 -0
- package/server/whatsapp-rpc/node_modules/mimic-fn/index.d.ts +52 -0
- package/server/whatsapp-rpc/node_modules/mimic-fn/index.js +71 -0
- package/server/whatsapp-rpc/node_modules/mimic-fn/license +9 -0
- package/server/whatsapp-rpc/node_modules/mimic-fn/package.json +45 -0
- package/server/whatsapp-rpc/node_modules/mimic-fn/readme.md +90 -0
- package/server/whatsapp-rpc/node_modules/npm-run-path/index.d.ts +90 -0
- package/server/whatsapp-rpc/node_modules/npm-run-path/index.js +52 -0
- package/server/whatsapp-rpc/node_modules/npm-run-path/license +9 -0
- package/server/whatsapp-rpc/node_modules/npm-run-path/node_modules/path-key/index.d.ts +31 -0
- package/server/whatsapp-rpc/node_modules/npm-run-path/node_modules/path-key/index.js +12 -0
- package/server/whatsapp-rpc/node_modules/npm-run-path/node_modules/path-key/license +9 -0
- package/server/whatsapp-rpc/node_modules/npm-run-path/node_modules/path-key/package.json +41 -0
- package/server/whatsapp-rpc/node_modules/npm-run-path/node_modules/path-key/readme.md +57 -0
- package/server/whatsapp-rpc/node_modules/npm-run-path/package.json +49 -0
- package/server/whatsapp-rpc/node_modules/npm-run-path/readme.md +104 -0
- package/server/whatsapp-rpc/node_modules/onetime/index.d.ts +59 -0
- package/server/whatsapp-rpc/node_modules/onetime/index.js +41 -0
- package/server/whatsapp-rpc/node_modules/onetime/license +9 -0
- package/server/whatsapp-rpc/node_modules/onetime/package.json +45 -0
- package/server/whatsapp-rpc/node_modules/onetime/readme.md +94 -0
- package/server/whatsapp-rpc/node_modules/path-key/index.d.ts +40 -0
- package/server/whatsapp-rpc/node_modules/path-key/index.js +16 -0
- package/server/whatsapp-rpc/node_modules/path-key/license +9 -0
- package/server/whatsapp-rpc/node_modules/path-key/package.json +39 -0
- package/server/whatsapp-rpc/node_modules/path-key/readme.md +61 -0
- package/server/whatsapp-rpc/node_modules/shebang-command/index.js +19 -0
- package/server/whatsapp-rpc/node_modules/shebang-command/license +9 -0
- package/server/whatsapp-rpc/node_modules/shebang-command/package.json +34 -0
- package/server/whatsapp-rpc/node_modules/shebang-command/readme.md +34 -0
- package/server/whatsapp-rpc/node_modules/shebang-regex/index.d.ts +22 -0
- package/server/whatsapp-rpc/node_modules/shebang-regex/index.js +2 -0
- package/server/whatsapp-rpc/node_modules/shebang-regex/license +9 -0
- package/server/whatsapp-rpc/node_modules/shebang-regex/package.json +35 -0
- package/server/whatsapp-rpc/node_modules/shebang-regex/readme.md +33 -0
- package/server/whatsapp-rpc/node_modules/shell-exec/LICENSE +21 -0
- package/server/whatsapp-rpc/node_modules/shell-exec/README.md +60 -0
- package/server/whatsapp-rpc/node_modules/shell-exec/index.js +47 -0
- package/server/whatsapp-rpc/node_modules/shell-exec/package.json +29 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/LICENSE.txt +16 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/README.md +74 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/browser.d.ts +12 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/browser.d.ts.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/browser.js +10 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/browser.js.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/index.d.ts +48 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/index.d.ts.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/index.js +279 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/index.js.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/package.json +3 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/signals.d.ts +29 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/signals.d.ts.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/signals.js +42 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/signals.js.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/browser.d.ts +12 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/browser.d.ts.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/browser.js +4 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/browser.js.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/index.d.ts +48 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/index.d.ts.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/index.js +275 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/index.js.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/package.json +3 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/signals.d.ts +29 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/signals.d.ts.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/signals.js +39 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/signals.js.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/package.json +106 -0
- package/server/whatsapp-rpc/node_modules/strip-final-newline/index.js +14 -0
- package/server/whatsapp-rpc/node_modules/strip-final-newline/license +9 -0
- package/server/whatsapp-rpc/node_modules/strip-final-newline/package.json +43 -0
- package/server/whatsapp-rpc/node_modules/strip-final-newline/readme.md +35 -0
- package/server/whatsapp-rpc/node_modules/which/CHANGELOG.md +166 -0
- package/server/whatsapp-rpc/node_modules/which/LICENSE +15 -0
- package/server/whatsapp-rpc/node_modules/which/README.md +54 -0
- package/server/whatsapp-rpc/node_modules/which/bin/node-which +52 -0
- package/server/whatsapp-rpc/node_modules/which/package.json +43 -0
- package/server/whatsapp-rpc/node_modules/which/which.js +125 -0
- package/server/whatsapp-rpc/package-lock.json +272 -0
- package/server/whatsapp-rpc/package.json +30 -30
- package/server/whatsapp-rpc/schema.json +1294 -1294
- package/server/whatsapp-rpc/scripts/clean.cjs +66 -66
- package/server/whatsapp-rpc/scripts/cli.js +162 -162
- package/server/whatsapp-rpc/src/go/whatsapp/history.go +166 -166
- package/server/whatsapp-rpc/src/python/pyproject.toml +15 -15
- package/server/whatsapp-rpc/src/python/whatsapp_rpc/__init__.py +4 -4
- package/server/whatsapp-rpc/src/python/whatsapp_rpc/client.py +427 -427
- package/server/whatsapp-rpc/web/app.py +609 -609
- package/server/whatsapp-rpc/web/requirements.txt +6 -6
- package/server/whatsapp-rpc/web/rpc_client.py +427 -427
- package/server/whatsapp-rpc/web/static/openapi.yaml +59 -59
- package/server/whatsapp-rpc/web/templates/base.html +149 -149
- package/server/whatsapp-rpc/web/templates/contacts.html +240 -240
- package/server/whatsapp-rpc/web/templates/dashboard.html +319 -319
- package/server/whatsapp-rpc/web/templates/groups.html +328 -328
- package/server/whatsapp-rpc/web/templates/messages.html +465 -465
- package/server/whatsapp-rpc/web/templates/messaging.html +680 -680
- package/server/whatsapp-rpc/web/templates/send.html +258 -258
- package/server/whatsapp-rpc/web/templates/settings.html +459 -459
- package/client/src/components/ui/AndroidSettingsPanel.tsx +0 -401
- package/client/src/components/ui/WhatsAppSettingsPanel.tsx +0 -345
- package/client/src/nodeDefinitions/androidDeviceNodes.ts +0 -140
- package/docker-compose.prod.yml +0 -107
- package/docker-compose.yml +0 -104
- package/docs-MachinaOs/README.md +0 -85
- package/docs-MachinaOs/deployment/docker.mdx +0 -228
- package/docs-MachinaOs/deployment/production.mdx +0 -345
- package/docs-MachinaOs/docs.json +0 -75
- package/docs-MachinaOs/faq.mdx +0 -309
- package/docs-MachinaOs/favicon.svg +0 -5
- package/docs-MachinaOs/installation.mdx +0 -160
- package/docs-MachinaOs/introduction.mdx +0 -114
- package/docs-MachinaOs/logo/dark.svg +0 -6
- package/docs-MachinaOs/logo/light.svg +0 -6
- package/docs-MachinaOs/nodes/ai-agent.mdx +0 -216
- package/docs-MachinaOs/nodes/ai-models.mdx +0 -240
- package/docs-MachinaOs/nodes/android.mdx +0 -411
- package/docs-MachinaOs/nodes/overview.mdx +0 -181
- package/docs-MachinaOs/nodes/schedulers.mdx +0 -316
- package/docs-MachinaOs/nodes/webhooks.mdx +0 -330
- package/docs-MachinaOs/nodes/whatsapp.mdx +0 -305
- package/docs-MachinaOs/quickstart.mdx +0 -119
- package/docs-MachinaOs/tutorials/ai-agent-workflow.mdx +0 -177
- package/docs-MachinaOs/tutorials/android-automation.mdx +0 -242
- package/docs-MachinaOs/tutorials/first-workflow.mdx +0 -134
- package/docs-MachinaOs/tutorials/whatsapp-automation.mdx +0 -185
- package/nul +0 -0
- package/scripts/check-ports.ps1 +0 -33
- package/scripts/kill-port.ps1 +0 -154
|
@@ -1,30 +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/
|
|
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/
|
|
@@ -1,44 +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"]
|
|
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"]
|
|
@@ -1,17 +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"]
|
|
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"]
|
|
@@ -1,139 +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+
|
|
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+
|
|
Binary file
|
|
@@ -1,95 +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();
|
|
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();
|