machinaos 0.0.1 → 0.0.7
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 +163 -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/install.ps1 +308 -0
- package/install.sh +343 -0
- package/package.json +81 -70
- package/scripts/build.js +174 -51
- 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,294 +1,294 @@
|
|
|
1
|
-
"""Android System Services routes."""
|
|
2
|
-
|
|
3
|
-
from fastapi import APIRouter, Depends
|
|
4
|
-
from pydantic import BaseModel, Field
|
|
5
|
-
from typing import Dict, Any, Optional
|
|
6
|
-
|
|
7
|
-
from core.container import container
|
|
8
|
-
from services.android_service import AndroidService
|
|
9
|
-
from core.logging import get_logger
|
|
10
|
-
|
|
11
|
-
logger = get_logger(__name__)
|
|
12
|
-
router = APIRouter(prefix="/api/android", tags=["android"])
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class AndroidServiceRequest(BaseModel):
|
|
16
|
-
"""Request model for Android service execution."""
|
|
17
|
-
service_id: str = Field(..., description="Android service ID (e.g., 'battery', 'network', 'app_launcher')")
|
|
18
|
-
action: str = Field(..., description="Service action to perform (e.g., 'status', 'launch', 'list')")
|
|
19
|
-
parameters: Dict[str, Any] = Field(default_factory=dict, description="Action-specific parameters")
|
|
20
|
-
android_host: str = Field(default="localhost", description="Android device API host")
|
|
21
|
-
android_port: int = Field(default=8888, description="Android device API port")
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
@router.post("/execute")
|
|
25
|
-
async def execute_android_service(
|
|
26
|
-
request: AndroidServiceRequest,
|
|
27
|
-
android_service: AndroidService = Depends(lambda: container.android_service())
|
|
28
|
-
):
|
|
29
|
-
"""Execute an Android system service action.
|
|
30
|
-
|
|
31
|
-
Examples:
|
|
32
|
-
- Battery status: {"service_id": "battery", "action": "status"}
|
|
33
|
-
- Launch app: {"service_id": "app_launcher", "action": "launch", "parameters": {"package_name": "com.android.settings"}}
|
|
34
|
-
- List apps: {"service_id": "app_list", "action": "list", "parameters": {"include_system": false}}
|
|
35
|
-
"""
|
|
36
|
-
logger.info(
|
|
37
|
-
"[Android API] Executing service",
|
|
38
|
-
service_id=request.service_id,
|
|
39
|
-
action=request.action,
|
|
40
|
-
android_host=request.android_host,
|
|
41
|
-
android_port=request.android_port
|
|
42
|
-
)
|
|
43
|
-
|
|
44
|
-
result = await android_service.execute_service(
|
|
45
|
-
node_id="api_call",
|
|
46
|
-
service_id=request.service_id,
|
|
47
|
-
action=request.action,
|
|
48
|
-
parameters=request.parameters,
|
|
49
|
-
android_host=request.android_host,
|
|
50
|
-
android_port=request.android_port
|
|
51
|
-
)
|
|
52
|
-
|
|
53
|
-
return result
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
@router.get("/status")
|
|
57
|
-
async def check_device_status(
|
|
58
|
-
android_host: str = "localhost",
|
|
59
|
-
android_port: int = 8888,
|
|
60
|
-
android_service: AndroidService = Depends(lambda: container.android_service())
|
|
61
|
-
):
|
|
62
|
-
"""Check if Android device API is reachable."""
|
|
63
|
-
logger.info(
|
|
64
|
-
"[Android API] Checking device status",
|
|
65
|
-
android_host=android_host,
|
|
66
|
-
android_port=android_port
|
|
67
|
-
)
|
|
68
|
-
|
|
69
|
-
status = await android_service.check_device_status(
|
|
70
|
-
android_host=android_host,
|
|
71
|
-
android_port=android_port
|
|
72
|
-
)
|
|
73
|
-
|
|
74
|
-
return status
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
@router.get("/services/{service_id}/actions")
|
|
78
|
-
async def get_service_actions(
|
|
79
|
-
service_id: str,
|
|
80
|
-
android_service: AndroidService = Depends(lambda: container.android_service())
|
|
81
|
-
):
|
|
82
|
-
"""Get available actions for a specific Android service.
|
|
83
|
-
|
|
84
|
-
Returns list of action options that can be performed on the service.
|
|
85
|
-
"""
|
|
86
|
-
logger.info(f"[Android API] Getting actions for service: {service_id}")
|
|
87
|
-
|
|
88
|
-
actions = android_service.get_service_actions(service_id)
|
|
89
|
-
|
|
90
|
-
if not actions:
|
|
91
|
-
return {
|
|
92
|
-
"success": False,
|
|
93
|
-
"error": f"Unknown service: {service_id}",
|
|
94
|
-
"actions": []
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
return {
|
|
98
|
-
"success": True,
|
|
99
|
-
"service_id": service_id,
|
|
100
|
-
"actions": actions
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
@router.get("/services/{service_id}/actions/{action}/parameters")
|
|
105
|
-
async def get_action_parameters(
|
|
106
|
-
service_id: str,
|
|
107
|
-
action: str,
|
|
108
|
-
android_service: AndroidService = Depends(lambda: container.android_service())
|
|
109
|
-
):
|
|
110
|
-
"""Get default parameters for a specific service action.
|
|
111
|
-
|
|
112
|
-
Returns default parameter template that can be used as a starting point.
|
|
113
|
-
"""
|
|
114
|
-
logger.info(f"[Android API] Getting parameters for: {service_id}/{action}")
|
|
115
|
-
|
|
116
|
-
default_params = android_service.get_default_parameters(service_id, action)
|
|
117
|
-
|
|
118
|
-
return {
|
|
119
|
-
"success": True,
|
|
120
|
-
"service_id": service_id,
|
|
121
|
-
"action": action,
|
|
122
|
-
"default_parameters": default_params
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
@router.get("/devices")
|
|
127
|
-
async def list_android_devices():
|
|
128
|
-
"""List all connected Android devices via ADB."""
|
|
129
|
-
import subprocess
|
|
130
|
-
try:
|
|
131
|
-
# Run adb devices command
|
|
132
|
-
result = subprocess.run(
|
|
133
|
-
["adb", "devices", "-l"],
|
|
134
|
-
capture_output=True,
|
|
135
|
-
text=True,
|
|
136
|
-
encoding="utf-8",
|
|
137
|
-
errors="replace",
|
|
138
|
-
timeout=5
|
|
139
|
-
)
|
|
140
|
-
|
|
141
|
-
devices = []
|
|
142
|
-
lines = result.stdout.strip().split('\n')[1:] # Skip header "List of devices attached"
|
|
143
|
-
|
|
144
|
-
for line in lines:
|
|
145
|
-
if not line.strip():
|
|
146
|
-
continue
|
|
147
|
-
|
|
148
|
-
parts = line.split()
|
|
149
|
-
if len(parts) >= 2:
|
|
150
|
-
device_id = parts[0]
|
|
151
|
-
state = parts[1]
|
|
152
|
-
|
|
153
|
-
# Extract model and other info
|
|
154
|
-
model = "Unknown"
|
|
155
|
-
android_version = None
|
|
156
|
-
|
|
157
|
-
for part in parts[2:]:
|
|
158
|
-
if part.startswith("model:"):
|
|
159
|
-
model = part.split(":")[1]
|
|
160
|
-
elif part.startswith("device:"):
|
|
161
|
-
pass # Can use this for device codename
|
|
162
|
-
|
|
163
|
-
devices.append({
|
|
164
|
-
"id": device_id,
|
|
165
|
-
"state": state,
|
|
166
|
-
"model": model,
|
|
167
|
-
"android_version": android_version
|
|
168
|
-
})
|
|
169
|
-
|
|
170
|
-
return {
|
|
171
|
-
"success": True,
|
|
172
|
-
"devices": devices,
|
|
173
|
-
"count": len(devices)
|
|
174
|
-
}
|
|
175
|
-
except FileNotFoundError:
|
|
176
|
-
logger.error("[Android] ADB not found in PATH")
|
|
177
|
-
return {
|
|
178
|
-
"success": False,
|
|
179
|
-
"error": "ADB not found. Please install Android SDK Platform Tools",
|
|
180
|
-
"devices": []
|
|
181
|
-
}
|
|
182
|
-
except Exception as e:
|
|
183
|
-
logger.error(f"[Android] Failed to list devices: {e}")
|
|
184
|
-
return {
|
|
185
|
-
"success": False,
|
|
186
|
-
"error": str(e),
|
|
187
|
-
"devices": []
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
@router.post("/port-forward")
|
|
192
|
-
async def setup_port_forwarding(
|
|
193
|
-
device_id: str,
|
|
194
|
-
local_port: int = 8888,
|
|
195
|
-
device_port: int = 8888
|
|
196
|
-
):
|
|
197
|
-
"""Setup ADB port forwarding for Android device communication."""
|
|
198
|
-
import subprocess
|
|
199
|
-
try:
|
|
200
|
-
# Setup port forwarding: adb -s device_id forward tcp:local_port tcp:device_port
|
|
201
|
-
cmd = ["adb", "-s", device_id, "forward", f"tcp:{local_port}", f"tcp:{device_port}"]
|
|
202
|
-
|
|
203
|
-
result = subprocess.run(
|
|
204
|
-
cmd,
|
|
205
|
-
capture_output=True,
|
|
206
|
-
text=True,
|
|
207
|
-
encoding="utf-8",
|
|
208
|
-
errors="replace",
|
|
209
|
-
timeout=5
|
|
210
|
-
)
|
|
211
|
-
|
|
212
|
-
if result.returncode == 0:
|
|
213
|
-
logger.info(
|
|
214
|
-
f"[Android] Port forwarding setup: {device_id} tcp:{local_port} -> tcp:{device_port}"
|
|
215
|
-
)
|
|
216
|
-
return {
|
|
217
|
-
"success": True,
|
|
218
|
-
"device_id": device_id,
|
|
219
|
-
"local_port": local_port,
|
|
220
|
-
"device_port": device_port,
|
|
221
|
-
"message": f"Port forwarding active: localhost:{local_port} -> device:{device_port}"
|
|
222
|
-
}
|
|
223
|
-
else:
|
|
224
|
-
error_msg = result.stderr.strip() or result.stdout.strip()
|
|
225
|
-
logger.error(f"[Android] Port forwarding failed: {error_msg}")
|
|
226
|
-
return {
|
|
227
|
-
"success": False,
|
|
228
|
-
"error": error_msg
|
|
229
|
-
}
|
|
230
|
-
except FileNotFoundError:
|
|
231
|
-
logger.error("[Android] ADB not found in PATH")
|
|
232
|
-
return {
|
|
233
|
-
"success": False,
|
|
234
|
-
"error": "ADB not found. Please install Android SDK Platform Tools"
|
|
235
|
-
}
|
|
236
|
-
except Exception as e:
|
|
237
|
-
logger.error(f"[Android] Port forwarding error: {e}")
|
|
238
|
-
return {
|
|
239
|
-
"success": False,
|
|
240
|
-
"error": str(e)
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
@router.get("/health")
|
|
245
|
-
async def android_health_check():
|
|
246
|
-
"""Android service health check."""
|
|
247
|
-
return {
|
|
248
|
-
"status": "OK",
|
|
249
|
-
"service": "android"
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
@router.get("/relay-status")
|
|
254
|
-
async def get_relay_connection_status():
|
|
255
|
-
"""Get relay connection status for remote Android devices.
|
|
256
|
-
|
|
257
|
-
Returns connection status including whether a relay connection is active
|
|
258
|
-
and the paired Android device.
|
|
259
|
-
"""
|
|
260
|
-
try:
|
|
261
|
-
from services.android import get_current_relay_client
|
|
262
|
-
|
|
263
|
-
relay_client = get_current_relay_client()
|
|
264
|
-
|
|
265
|
-
if relay_client and relay_client.is_connected():
|
|
266
|
-
return {
|
|
267
|
-
"success": True,
|
|
268
|
-
"connected": True,
|
|
269
|
-
"paired": relay_client.is_paired(),
|
|
270
|
-
"connection_type": "relay",
|
|
271
|
-
"device_id": relay_client.paired_device_id,
|
|
272
|
-
"device_name": relay_client.paired_device_name,
|
|
273
|
-
"session_token": relay_client.session_token,
|
|
274
|
-
"qr_data": relay_client.qr_data if not relay_client.is_paired() else None,
|
|
275
|
-
"status": "paired" if relay_client.is_paired() else "waiting_for_pairing"
|
|
276
|
-
}
|
|
277
|
-
else:
|
|
278
|
-
return {
|
|
279
|
-
"success": True,
|
|
280
|
-
"connected": False,
|
|
281
|
-
"paired": False,
|
|
282
|
-
"connection_type": None,
|
|
283
|
-
"device_id": None,
|
|
284
|
-
"device_name": None,
|
|
285
|
-
"status": "disconnected"
|
|
286
|
-
}
|
|
287
|
-
except Exception as e:
|
|
288
|
-
logger.error(f"[Android] Failed to get relay status: {e}")
|
|
289
|
-
return {
|
|
290
|
-
"success": False,
|
|
291
|
-
"connected": False,
|
|
292
|
-
"error": str(e),
|
|
293
|
-
"status": "error"
|
|
294
|
-
}
|
|
1
|
+
"""Android System Services routes."""
|
|
2
|
+
|
|
3
|
+
from fastapi import APIRouter, Depends
|
|
4
|
+
from pydantic import BaseModel, Field
|
|
5
|
+
from typing import Dict, Any, Optional
|
|
6
|
+
|
|
7
|
+
from core.container import container
|
|
8
|
+
from services.android_service import AndroidService
|
|
9
|
+
from core.logging import get_logger
|
|
10
|
+
|
|
11
|
+
logger = get_logger(__name__)
|
|
12
|
+
router = APIRouter(prefix="/api/android", tags=["android"])
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class AndroidServiceRequest(BaseModel):
|
|
16
|
+
"""Request model for Android service execution."""
|
|
17
|
+
service_id: str = Field(..., description="Android service ID (e.g., 'battery', 'network', 'app_launcher')")
|
|
18
|
+
action: str = Field(..., description="Service action to perform (e.g., 'status', 'launch', 'list')")
|
|
19
|
+
parameters: Dict[str, Any] = Field(default_factory=dict, description="Action-specific parameters")
|
|
20
|
+
android_host: str = Field(default="localhost", description="Android device API host")
|
|
21
|
+
android_port: int = Field(default=8888, description="Android device API port")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@router.post("/execute")
|
|
25
|
+
async def execute_android_service(
|
|
26
|
+
request: AndroidServiceRequest,
|
|
27
|
+
android_service: AndroidService = Depends(lambda: container.android_service())
|
|
28
|
+
):
|
|
29
|
+
"""Execute an Android system service action.
|
|
30
|
+
|
|
31
|
+
Examples:
|
|
32
|
+
- Battery status: {"service_id": "battery", "action": "status"}
|
|
33
|
+
- Launch app: {"service_id": "app_launcher", "action": "launch", "parameters": {"package_name": "com.android.settings"}}
|
|
34
|
+
- List apps: {"service_id": "app_list", "action": "list", "parameters": {"include_system": false}}
|
|
35
|
+
"""
|
|
36
|
+
logger.info(
|
|
37
|
+
"[Android API] Executing service",
|
|
38
|
+
service_id=request.service_id,
|
|
39
|
+
action=request.action,
|
|
40
|
+
android_host=request.android_host,
|
|
41
|
+
android_port=request.android_port
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
result = await android_service.execute_service(
|
|
45
|
+
node_id="api_call",
|
|
46
|
+
service_id=request.service_id,
|
|
47
|
+
action=request.action,
|
|
48
|
+
parameters=request.parameters,
|
|
49
|
+
android_host=request.android_host,
|
|
50
|
+
android_port=request.android_port
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
return result
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@router.get("/status")
|
|
57
|
+
async def check_device_status(
|
|
58
|
+
android_host: str = "localhost",
|
|
59
|
+
android_port: int = 8888,
|
|
60
|
+
android_service: AndroidService = Depends(lambda: container.android_service())
|
|
61
|
+
):
|
|
62
|
+
"""Check if Android device API is reachable."""
|
|
63
|
+
logger.info(
|
|
64
|
+
"[Android API] Checking device status",
|
|
65
|
+
android_host=android_host,
|
|
66
|
+
android_port=android_port
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
status = await android_service.check_device_status(
|
|
70
|
+
android_host=android_host,
|
|
71
|
+
android_port=android_port
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
return status
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@router.get("/services/{service_id}/actions")
|
|
78
|
+
async def get_service_actions(
|
|
79
|
+
service_id: str,
|
|
80
|
+
android_service: AndroidService = Depends(lambda: container.android_service())
|
|
81
|
+
):
|
|
82
|
+
"""Get available actions for a specific Android service.
|
|
83
|
+
|
|
84
|
+
Returns list of action options that can be performed on the service.
|
|
85
|
+
"""
|
|
86
|
+
logger.info(f"[Android API] Getting actions for service: {service_id}")
|
|
87
|
+
|
|
88
|
+
actions = android_service.get_service_actions(service_id)
|
|
89
|
+
|
|
90
|
+
if not actions:
|
|
91
|
+
return {
|
|
92
|
+
"success": False,
|
|
93
|
+
"error": f"Unknown service: {service_id}",
|
|
94
|
+
"actions": []
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
"success": True,
|
|
99
|
+
"service_id": service_id,
|
|
100
|
+
"actions": actions
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
@router.get("/services/{service_id}/actions/{action}/parameters")
|
|
105
|
+
async def get_action_parameters(
|
|
106
|
+
service_id: str,
|
|
107
|
+
action: str,
|
|
108
|
+
android_service: AndroidService = Depends(lambda: container.android_service())
|
|
109
|
+
):
|
|
110
|
+
"""Get default parameters for a specific service action.
|
|
111
|
+
|
|
112
|
+
Returns default parameter template that can be used as a starting point.
|
|
113
|
+
"""
|
|
114
|
+
logger.info(f"[Android API] Getting parameters for: {service_id}/{action}")
|
|
115
|
+
|
|
116
|
+
default_params = android_service.get_default_parameters(service_id, action)
|
|
117
|
+
|
|
118
|
+
return {
|
|
119
|
+
"success": True,
|
|
120
|
+
"service_id": service_id,
|
|
121
|
+
"action": action,
|
|
122
|
+
"default_parameters": default_params
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
@router.get("/devices")
|
|
127
|
+
async def list_android_devices():
|
|
128
|
+
"""List all connected Android devices via ADB."""
|
|
129
|
+
import subprocess
|
|
130
|
+
try:
|
|
131
|
+
# Run adb devices command
|
|
132
|
+
result = subprocess.run(
|
|
133
|
+
["adb", "devices", "-l"],
|
|
134
|
+
capture_output=True,
|
|
135
|
+
text=True,
|
|
136
|
+
encoding="utf-8",
|
|
137
|
+
errors="replace",
|
|
138
|
+
timeout=5
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
devices = []
|
|
142
|
+
lines = result.stdout.strip().split('\n')[1:] # Skip header "List of devices attached"
|
|
143
|
+
|
|
144
|
+
for line in lines:
|
|
145
|
+
if not line.strip():
|
|
146
|
+
continue
|
|
147
|
+
|
|
148
|
+
parts = line.split()
|
|
149
|
+
if len(parts) >= 2:
|
|
150
|
+
device_id = parts[0]
|
|
151
|
+
state = parts[1]
|
|
152
|
+
|
|
153
|
+
# Extract model and other info
|
|
154
|
+
model = "Unknown"
|
|
155
|
+
android_version = None
|
|
156
|
+
|
|
157
|
+
for part in parts[2:]:
|
|
158
|
+
if part.startswith("model:"):
|
|
159
|
+
model = part.split(":")[1]
|
|
160
|
+
elif part.startswith("device:"):
|
|
161
|
+
pass # Can use this for device codename
|
|
162
|
+
|
|
163
|
+
devices.append({
|
|
164
|
+
"id": device_id,
|
|
165
|
+
"state": state,
|
|
166
|
+
"model": model,
|
|
167
|
+
"android_version": android_version
|
|
168
|
+
})
|
|
169
|
+
|
|
170
|
+
return {
|
|
171
|
+
"success": True,
|
|
172
|
+
"devices": devices,
|
|
173
|
+
"count": len(devices)
|
|
174
|
+
}
|
|
175
|
+
except FileNotFoundError:
|
|
176
|
+
logger.error("[Android] ADB not found in PATH")
|
|
177
|
+
return {
|
|
178
|
+
"success": False,
|
|
179
|
+
"error": "ADB not found. Please install Android SDK Platform Tools",
|
|
180
|
+
"devices": []
|
|
181
|
+
}
|
|
182
|
+
except Exception as e:
|
|
183
|
+
logger.error(f"[Android] Failed to list devices: {e}")
|
|
184
|
+
return {
|
|
185
|
+
"success": False,
|
|
186
|
+
"error": str(e),
|
|
187
|
+
"devices": []
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
@router.post("/port-forward")
|
|
192
|
+
async def setup_port_forwarding(
|
|
193
|
+
device_id: str,
|
|
194
|
+
local_port: int = 8888,
|
|
195
|
+
device_port: int = 8888
|
|
196
|
+
):
|
|
197
|
+
"""Setup ADB port forwarding for Android device communication."""
|
|
198
|
+
import subprocess
|
|
199
|
+
try:
|
|
200
|
+
# Setup port forwarding: adb -s device_id forward tcp:local_port tcp:device_port
|
|
201
|
+
cmd = ["adb", "-s", device_id, "forward", f"tcp:{local_port}", f"tcp:{device_port}"]
|
|
202
|
+
|
|
203
|
+
result = subprocess.run(
|
|
204
|
+
cmd,
|
|
205
|
+
capture_output=True,
|
|
206
|
+
text=True,
|
|
207
|
+
encoding="utf-8",
|
|
208
|
+
errors="replace",
|
|
209
|
+
timeout=5
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
if result.returncode == 0:
|
|
213
|
+
logger.info(
|
|
214
|
+
f"[Android] Port forwarding setup: {device_id} tcp:{local_port} -> tcp:{device_port}"
|
|
215
|
+
)
|
|
216
|
+
return {
|
|
217
|
+
"success": True,
|
|
218
|
+
"device_id": device_id,
|
|
219
|
+
"local_port": local_port,
|
|
220
|
+
"device_port": device_port,
|
|
221
|
+
"message": f"Port forwarding active: localhost:{local_port} -> device:{device_port}"
|
|
222
|
+
}
|
|
223
|
+
else:
|
|
224
|
+
error_msg = result.stderr.strip() or result.stdout.strip()
|
|
225
|
+
logger.error(f"[Android] Port forwarding failed: {error_msg}")
|
|
226
|
+
return {
|
|
227
|
+
"success": False,
|
|
228
|
+
"error": error_msg
|
|
229
|
+
}
|
|
230
|
+
except FileNotFoundError:
|
|
231
|
+
logger.error("[Android] ADB not found in PATH")
|
|
232
|
+
return {
|
|
233
|
+
"success": False,
|
|
234
|
+
"error": "ADB not found. Please install Android SDK Platform Tools"
|
|
235
|
+
}
|
|
236
|
+
except Exception as e:
|
|
237
|
+
logger.error(f"[Android] Port forwarding error: {e}")
|
|
238
|
+
return {
|
|
239
|
+
"success": False,
|
|
240
|
+
"error": str(e)
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
@router.get("/health")
|
|
245
|
+
async def android_health_check():
|
|
246
|
+
"""Android service health check."""
|
|
247
|
+
return {
|
|
248
|
+
"status": "OK",
|
|
249
|
+
"service": "android"
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
@router.get("/relay-status")
|
|
254
|
+
async def get_relay_connection_status():
|
|
255
|
+
"""Get relay connection status for remote Android devices.
|
|
256
|
+
|
|
257
|
+
Returns connection status including whether a relay connection is active
|
|
258
|
+
and the paired Android device.
|
|
259
|
+
"""
|
|
260
|
+
try:
|
|
261
|
+
from services.android import get_current_relay_client
|
|
262
|
+
|
|
263
|
+
relay_client = get_current_relay_client()
|
|
264
|
+
|
|
265
|
+
if relay_client and relay_client.is_connected():
|
|
266
|
+
return {
|
|
267
|
+
"success": True,
|
|
268
|
+
"connected": True,
|
|
269
|
+
"paired": relay_client.is_paired(),
|
|
270
|
+
"connection_type": "relay",
|
|
271
|
+
"device_id": relay_client.paired_device_id,
|
|
272
|
+
"device_name": relay_client.paired_device_name,
|
|
273
|
+
"session_token": relay_client.session_token,
|
|
274
|
+
"qr_data": relay_client.qr_data if not relay_client.is_paired() else None,
|
|
275
|
+
"status": "paired" if relay_client.is_paired() else "waiting_for_pairing"
|
|
276
|
+
}
|
|
277
|
+
else:
|
|
278
|
+
return {
|
|
279
|
+
"success": True,
|
|
280
|
+
"connected": False,
|
|
281
|
+
"paired": False,
|
|
282
|
+
"connection_type": None,
|
|
283
|
+
"device_id": None,
|
|
284
|
+
"device_name": None,
|
|
285
|
+
"status": "disconnected"
|
|
286
|
+
}
|
|
287
|
+
except Exception as e:
|
|
288
|
+
logger.error(f"[Android] Failed to get relay status: {e}")
|
|
289
|
+
return {
|
|
290
|
+
"success": False,
|
|
291
|
+
"connected": False,
|
|
292
|
+
"error": str(e),
|
|
293
|
+
"status": "error"
|
|
294
|
+
}
|