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,151 +1,151 @@
|
|
|
1
|
-
"""Database operations routes (replaces frontend storage)."""
|
|
2
|
-
|
|
3
|
-
from fastapi import APIRouter, Depends
|
|
4
|
-
from pydantic import BaseModel
|
|
5
|
-
from typing import Dict, Any, Optional, List
|
|
6
|
-
|
|
7
|
-
from core.container import container
|
|
8
|
-
from core.database import Database
|
|
9
|
-
from core.logging import get_logger
|
|
10
|
-
|
|
11
|
-
logger = get_logger(__name__)
|
|
12
|
-
router = APIRouter(prefix="/api/database", tags=["database"])
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class NodeParameterRequest(BaseModel):
|
|
16
|
-
node_id: str
|
|
17
|
-
parameters: Dict[str, Any]
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
class WorkflowSaveRequest(BaseModel):
|
|
21
|
-
workflow_id: str
|
|
22
|
-
name: str
|
|
23
|
-
data: Dict[str, Any]
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
@router.post("/node-parameters")
|
|
27
|
-
async def save_node_parameters(
|
|
28
|
-
request: NodeParameterRequest,
|
|
29
|
-
database: Database = Depends(lambda: container.database())
|
|
30
|
-
):
|
|
31
|
-
"""Save node parameters (replaces frontend Dexie)."""
|
|
32
|
-
try:
|
|
33
|
-
success = await database.save_node_parameters(request.node_id, request.parameters)
|
|
34
|
-
return {"success": success}
|
|
35
|
-
except Exception as e:
|
|
36
|
-
logger.error("Failed to save node parameters", error=str(e))
|
|
37
|
-
return {"success": False, "error": str(e)}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
@router.get("/node-parameters/{node_id}")
|
|
41
|
-
async def get_node_parameters(
|
|
42
|
-
node_id: str,
|
|
43
|
-
database: Database = Depends(lambda: container.database())
|
|
44
|
-
):
|
|
45
|
-
"""Get node parameters (replaces frontend Dexie)."""
|
|
46
|
-
try:
|
|
47
|
-
parameters = await database.get_node_parameters(node_id)
|
|
48
|
-
return {"success": True, "parameters": parameters}
|
|
49
|
-
except Exception as e:
|
|
50
|
-
logger.error("Failed to get node parameters", error=str(e))
|
|
51
|
-
return {"success": False, "error": str(e)}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
@router.delete("/node-parameters/{node_id}")
|
|
55
|
-
async def delete_node_parameters(
|
|
56
|
-
node_id: str,
|
|
57
|
-
database: Database = Depends(lambda: container.database())
|
|
58
|
-
):
|
|
59
|
-
"""Delete node parameters (replaces frontend Dexie)."""
|
|
60
|
-
try:
|
|
61
|
-
success = await database.delete_node_parameters(node_id)
|
|
62
|
-
return {"success": success}
|
|
63
|
-
except Exception as e:
|
|
64
|
-
logger.error("Failed to delete node parameters", error=str(e))
|
|
65
|
-
return {"success": False, "error": str(e)}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
# ============================================================================
|
|
69
|
-
# Workflow Operations
|
|
70
|
-
# ============================================================================
|
|
71
|
-
|
|
72
|
-
@router.post("/workflows")
|
|
73
|
-
async def save_workflow(
|
|
74
|
-
request: WorkflowSaveRequest,
|
|
75
|
-
database: Database = Depends(lambda: container.database())
|
|
76
|
-
):
|
|
77
|
-
"""Save workflow to database."""
|
|
78
|
-
try:
|
|
79
|
-
success = await database.save_workflow(
|
|
80
|
-
workflow_id=request.workflow_id,
|
|
81
|
-
name=request.name,
|
|
82
|
-
data=request.data
|
|
83
|
-
)
|
|
84
|
-
return {"success": success, "workflow_id": request.workflow_id}
|
|
85
|
-
except Exception as e:
|
|
86
|
-
logger.error("Failed to save workflow", error=str(e))
|
|
87
|
-
return {"success": False, "error": str(e)}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
@router.get("/workflows")
|
|
91
|
-
async def get_all_workflows(
|
|
92
|
-
database: Database = Depends(lambda: container.database())
|
|
93
|
-
):
|
|
94
|
-
"""Get all workflows."""
|
|
95
|
-
try:
|
|
96
|
-
workflows = await database.get_all_workflows()
|
|
97
|
-
return {
|
|
98
|
-
"success": True,
|
|
99
|
-
"workflows": [
|
|
100
|
-
{
|
|
101
|
-
"id": w.id,
|
|
102
|
-
"name": w.name,
|
|
103
|
-
"nodeCount": len(w.data.get("nodes", [])) if w.data else 0,
|
|
104
|
-
"createdAt": w.created_at.isoformat() if w.created_at else None,
|
|
105
|
-
"lastModified": w.updated_at.isoformat() if w.updated_at else None
|
|
106
|
-
}
|
|
107
|
-
for w in workflows
|
|
108
|
-
]
|
|
109
|
-
}
|
|
110
|
-
except Exception as e:
|
|
111
|
-
logger.error("Failed to get workflows", error=str(e))
|
|
112
|
-
return {"success": False, "error": str(e)}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
@router.get("/workflows/{workflow_id}")
|
|
116
|
-
async def get_workflow(
|
|
117
|
-
workflow_id: str,
|
|
118
|
-
database: Database = Depends(lambda: container.database())
|
|
119
|
-
):
|
|
120
|
-
"""Get workflow by ID."""
|
|
121
|
-
try:
|
|
122
|
-
workflow = await database.get_workflow(workflow_id)
|
|
123
|
-
if workflow:
|
|
124
|
-
return {
|
|
125
|
-
"success": True,
|
|
126
|
-
"workflow": {
|
|
127
|
-
"id": workflow.id,
|
|
128
|
-
"name": workflow.name,
|
|
129
|
-
"data": workflow.data,
|
|
130
|
-
"createdAt": workflow.created_at.isoformat() if workflow.created_at else None,
|
|
131
|
-
"lastModified": workflow.updated_at.isoformat() if workflow.updated_at else None
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
return {"success": False, "error": "Workflow not found"}
|
|
135
|
-
except Exception as e:
|
|
136
|
-
logger.error("Failed to get workflow", error=str(e))
|
|
137
|
-
return {"success": False, "error": str(e)}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
@router.delete("/workflows/{workflow_id}")
|
|
141
|
-
async def delete_workflow(
|
|
142
|
-
workflow_id: str,
|
|
143
|
-
database: Database = Depends(lambda: container.database())
|
|
144
|
-
):
|
|
145
|
-
"""Delete workflow."""
|
|
146
|
-
try:
|
|
147
|
-
success = await database.delete_workflow(workflow_id)
|
|
148
|
-
return {"success": success, "workflow_id": workflow_id}
|
|
149
|
-
except Exception as e:
|
|
150
|
-
logger.error("Failed to delete workflow", error=str(e))
|
|
1
|
+
"""Database operations routes (replaces frontend storage)."""
|
|
2
|
+
|
|
3
|
+
from fastapi import APIRouter, Depends
|
|
4
|
+
from pydantic import BaseModel
|
|
5
|
+
from typing import Dict, Any, Optional, List
|
|
6
|
+
|
|
7
|
+
from core.container import container
|
|
8
|
+
from core.database import Database
|
|
9
|
+
from core.logging import get_logger
|
|
10
|
+
|
|
11
|
+
logger = get_logger(__name__)
|
|
12
|
+
router = APIRouter(prefix="/api/database", tags=["database"])
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class NodeParameterRequest(BaseModel):
|
|
16
|
+
node_id: str
|
|
17
|
+
parameters: Dict[str, Any]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class WorkflowSaveRequest(BaseModel):
|
|
21
|
+
workflow_id: str
|
|
22
|
+
name: str
|
|
23
|
+
data: Dict[str, Any]
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@router.post("/node-parameters")
|
|
27
|
+
async def save_node_parameters(
|
|
28
|
+
request: NodeParameterRequest,
|
|
29
|
+
database: Database = Depends(lambda: container.database())
|
|
30
|
+
):
|
|
31
|
+
"""Save node parameters (replaces frontend Dexie)."""
|
|
32
|
+
try:
|
|
33
|
+
success = await database.save_node_parameters(request.node_id, request.parameters)
|
|
34
|
+
return {"success": success}
|
|
35
|
+
except Exception as e:
|
|
36
|
+
logger.error("Failed to save node parameters", error=str(e))
|
|
37
|
+
return {"success": False, "error": str(e)}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@router.get("/node-parameters/{node_id}")
|
|
41
|
+
async def get_node_parameters(
|
|
42
|
+
node_id: str,
|
|
43
|
+
database: Database = Depends(lambda: container.database())
|
|
44
|
+
):
|
|
45
|
+
"""Get node parameters (replaces frontend Dexie)."""
|
|
46
|
+
try:
|
|
47
|
+
parameters = await database.get_node_parameters(node_id)
|
|
48
|
+
return {"success": True, "parameters": parameters}
|
|
49
|
+
except Exception as e:
|
|
50
|
+
logger.error("Failed to get node parameters", error=str(e))
|
|
51
|
+
return {"success": False, "error": str(e)}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@router.delete("/node-parameters/{node_id}")
|
|
55
|
+
async def delete_node_parameters(
|
|
56
|
+
node_id: str,
|
|
57
|
+
database: Database = Depends(lambda: container.database())
|
|
58
|
+
):
|
|
59
|
+
"""Delete node parameters (replaces frontend Dexie)."""
|
|
60
|
+
try:
|
|
61
|
+
success = await database.delete_node_parameters(node_id)
|
|
62
|
+
return {"success": success}
|
|
63
|
+
except Exception as e:
|
|
64
|
+
logger.error("Failed to delete node parameters", error=str(e))
|
|
65
|
+
return {"success": False, "error": str(e)}
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
# ============================================================================
|
|
69
|
+
# Workflow Operations
|
|
70
|
+
# ============================================================================
|
|
71
|
+
|
|
72
|
+
@router.post("/workflows")
|
|
73
|
+
async def save_workflow(
|
|
74
|
+
request: WorkflowSaveRequest,
|
|
75
|
+
database: Database = Depends(lambda: container.database())
|
|
76
|
+
):
|
|
77
|
+
"""Save workflow to database."""
|
|
78
|
+
try:
|
|
79
|
+
success = await database.save_workflow(
|
|
80
|
+
workflow_id=request.workflow_id,
|
|
81
|
+
name=request.name,
|
|
82
|
+
data=request.data
|
|
83
|
+
)
|
|
84
|
+
return {"success": success, "workflow_id": request.workflow_id}
|
|
85
|
+
except Exception as e:
|
|
86
|
+
logger.error("Failed to save workflow", error=str(e))
|
|
87
|
+
return {"success": False, "error": str(e)}
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
@router.get("/workflows")
|
|
91
|
+
async def get_all_workflows(
|
|
92
|
+
database: Database = Depends(lambda: container.database())
|
|
93
|
+
):
|
|
94
|
+
"""Get all workflows."""
|
|
95
|
+
try:
|
|
96
|
+
workflows = await database.get_all_workflows()
|
|
97
|
+
return {
|
|
98
|
+
"success": True,
|
|
99
|
+
"workflows": [
|
|
100
|
+
{
|
|
101
|
+
"id": w.id,
|
|
102
|
+
"name": w.name,
|
|
103
|
+
"nodeCount": len(w.data.get("nodes", [])) if w.data else 0,
|
|
104
|
+
"createdAt": w.created_at.isoformat() if w.created_at else None,
|
|
105
|
+
"lastModified": w.updated_at.isoformat() if w.updated_at else None
|
|
106
|
+
}
|
|
107
|
+
for w in workflows
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
except Exception as e:
|
|
111
|
+
logger.error("Failed to get workflows", error=str(e))
|
|
112
|
+
return {"success": False, "error": str(e)}
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
@router.get("/workflows/{workflow_id}")
|
|
116
|
+
async def get_workflow(
|
|
117
|
+
workflow_id: str,
|
|
118
|
+
database: Database = Depends(lambda: container.database())
|
|
119
|
+
):
|
|
120
|
+
"""Get workflow by ID."""
|
|
121
|
+
try:
|
|
122
|
+
workflow = await database.get_workflow(workflow_id)
|
|
123
|
+
if workflow:
|
|
124
|
+
return {
|
|
125
|
+
"success": True,
|
|
126
|
+
"workflow": {
|
|
127
|
+
"id": workflow.id,
|
|
128
|
+
"name": workflow.name,
|
|
129
|
+
"data": workflow.data,
|
|
130
|
+
"createdAt": workflow.created_at.isoformat() if workflow.created_at else None,
|
|
131
|
+
"lastModified": workflow.updated_at.isoformat() if workflow.updated_at else None
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return {"success": False, "error": "Workflow not found"}
|
|
135
|
+
except Exception as e:
|
|
136
|
+
logger.error("Failed to get workflow", error=str(e))
|
|
137
|
+
return {"success": False, "error": str(e)}
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
@router.delete("/workflows/{workflow_id}")
|
|
141
|
+
async def delete_workflow(
|
|
142
|
+
workflow_id: str,
|
|
143
|
+
database: Database = Depends(lambda: container.database())
|
|
144
|
+
):
|
|
145
|
+
"""Delete workflow."""
|
|
146
|
+
try:
|
|
147
|
+
success = await database.delete_workflow(workflow_id)
|
|
148
|
+
return {"success": success, "workflow_id": workflow_id}
|
|
149
|
+
except Exception as e:
|
|
150
|
+
logger.error("Failed to delete workflow", error=str(e))
|
|
151
151
|
return {"success": False, "error": str(e)}
|
package/server/routers/maps.py
CHANGED
|
@@ -1,142 +1,142 @@
|
|
|
1
|
-
"""Google Maps service routes."""
|
|
2
|
-
|
|
3
|
-
from fastapi import APIRouter, Depends, HTTPException
|
|
4
|
-
from pydantic import BaseModel
|
|
5
|
-
from typing import Dict, Any, Optional
|
|
6
|
-
import httpx
|
|
7
|
-
|
|
8
|
-
from core.container import container
|
|
9
|
-
from services.maps import MapsService
|
|
10
|
-
from services.status_broadcaster import get_status_broadcaster
|
|
11
|
-
from core.logging import get_logger
|
|
12
|
-
|
|
13
|
-
logger = get_logger(__name__)
|
|
14
|
-
router = APIRouter(prefix="/python", tags=["maps"])
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class GoogleMapsRequest(BaseModel):
|
|
18
|
-
node_id: str
|
|
19
|
-
node_type: str
|
|
20
|
-
parameters: Dict[str, Any]
|
|
21
|
-
api_key: Optional[str] = None
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class ApiKeyValidationRequest(BaseModel):
|
|
25
|
-
api_key: str
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
@router.post("/maps/validate-key")
|
|
29
|
-
async def validate_google_maps_key(request: ApiKeyValidationRequest):
|
|
30
|
-
"""Validate Google Maps API key and broadcast status via WebSocket."""
|
|
31
|
-
broadcaster = get_status_broadcaster()
|
|
32
|
-
|
|
33
|
-
try:
|
|
34
|
-
api_key = request.api_key.strip()
|
|
35
|
-
if not api_key:
|
|
36
|
-
await broadcaster.update_api_key_status(
|
|
37
|
-
provider="google_maps",
|
|
38
|
-
valid=False,
|
|
39
|
-
message="API key is required"
|
|
40
|
-
)
|
|
41
|
-
raise HTTPException(status_code=400, detail="API key is required")
|
|
42
|
-
|
|
43
|
-
# Test the API key with a simple geocoding request
|
|
44
|
-
async with httpx.AsyncClient() as client:
|
|
45
|
-
response = await client.get(
|
|
46
|
-
"https://maps.googleapis.com/maps/api/geocode/json",
|
|
47
|
-
params={
|
|
48
|
-
"address": "1600 Amphitheatre Parkway, Mountain View, CA",
|
|
49
|
-
"key": api_key
|
|
50
|
-
},
|
|
51
|
-
timeout=10.0
|
|
52
|
-
)
|
|
53
|
-
|
|
54
|
-
data = response.json()
|
|
55
|
-
|
|
56
|
-
if data.get("status") == "OK":
|
|
57
|
-
await broadcaster.update_api_key_status(
|
|
58
|
-
provider="google_maps",
|
|
59
|
-
valid=True,
|
|
60
|
-
message="API key validated successfully"
|
|
61
|
-
)
|
|
62
|
-
return {
|
|
63
|
-
"success": True,
|
|
64
|
-
"valid": True,
|
|
65
|
-
"message": "Google Maps API key is valid"
|
|
66
|
-
}
|
|
67
|
-
elif data.get("status") == "REQUEST_DENIED":
|
|
68
|
-
error_msg = data.get("error_message", "Invalid API key")
|
|
69
|
-
await broadcaster.update_api_key_status(
|
|
70
|
-
provider="google_maps",
|
|
71
|
-
valid=False,
|
|
72
|
-
message=error_msg
|
|
73
|
-
)
|
|
74
|
-
return {
|
|
75
|
-
"success": True,
|
|
76
|
-
"valid": False,
|
|
77
|
-
"message": error_msg
|
|
78
|
-
}
|
|
79
|
-
else:
|
|
80
|
-
# Other statuses like ZERO_RESULTS still mean the key works
|
|
81
|
-
await broadcaster.update_api_key_status(
|
|
82
|
-
provider="google_maps",
|
|
83
|
-
valid=True,
|
|
84
|
-
message="API key validated"
|
|
85
|
-
)
|
|
86
|
-
return {
|
|
87
|
-
"success": True,
|
|
88
|
-
"valid": True,
|
|
89
|
-
"message": f"API key is valid (status: {data.get('status')})"
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
except httpx.TimeoutException:
|
|
93
|
-
await broadcaster.update_api_key_status(
|
|
94
|
-
provider="google_maps",
|
|
95
|
-
valid=False,
|
|
96
|
-
message="Validation request timed out"
|
|
97
|
-
)
|
|
98
|
-
raise HTTPException(status_code=504, detail="Validation request timed out")
|
|
99
|
-
except httpx.RequestError as e:
|
|
100
|
-
await broadcaster.update_api_key_status(
|
|
101
|
-
provider="google_maps",
|
|
102
|
-
valid=False,
|
|
103
|
-
message=f"Network error: {str(e)}"
|
|
104
|
-
)
|
|
105
|
-
raise HTTPException(status_code=503, detail=f"Network error: {str(e)}")
|
|
106
|
-
except HTTPException:
|
|
107
|
-
raise
|
|
108
|
-
except Exception as e:
|
|
109
|
-
logger.error(f"API key validation error: {e}")
|
|
110
|
-
await broadcaster.update_api_key_status(
|
|
111
|
-
provider="google_maps",
|
|
112
|
-
valid=False,
|
|
113
|
-
message=f"Validation failed: {str(e)}"
|
|
114
|
-
)
|
|
115
|
-
raise HTTPException(status_code=500, detail=f"Validation failed: {str(e)}")
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
@router.post("/createmap/execute")
|
|
119
|
-
async def execute_createmap_node(
|
|
120
|
-
request: GoogleMapsRequest,
|
|
121
|
-
maps_service: MapsService = Depends(lambda: container.maps_service())
|
|
122
|
-
):
|
|
123
|
-
"""Execute Create Map node - Google Maps initialization."""
|
|
124
|
-
return await maps_service.create_map(request.node_id, request.parameters)
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
@router.post("/addlocations/execute")
|
|
128
|
-
async def execute_addlocations_node(
|
|
129
|
-
request: GoogleMapsRequest,
|
|
130
|
-
maps_service: MapsService = Depends(lambda: container.maps_service())
|
|
131
|
-
):
|
|
132
|
-
"""Execute Add Locations node - Google Maps Geocoding."""
|
|
133
|
-
return await maps_service.geocode_location(request.node_id, request.parameters)
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
@router.post("/shownearbyplaces/execute")
|
|
137
|
-
async def execute_shownearbyplaces_node(
|
|
138
|
-
request: GoogleMapsRequest,
|
|
139
|
-
maps_service: MapsService = Depends(lambda: container.maps_service())
|
|
140
|
-
):
|
|
141
|
-
"""Execute Show Nearby Places node - Google Places API."""
|
|
1
|
+
"""Google Maps service routes."""
|
|
2
|
+
|
|
3
|
+
from fastapi import APIRouter, Depends, HTTPException
|
|
4
|
+
from pydantic import BaseModel
|
|
5
|
+
from typing import Dict, Any, Optional
|
|
6
|
+
import httpx
|
|
7
|
+
|
|
8
|
+
from core.container import container
|
|
9
|
+
from services.maps import MapsService
|
|
10
|
+
from services.status_broadcaster import get_status_broadcaster
|
|
11
|
+
from core.logging import get_logger
|
|
12
|
+
|
|
13
|
+
logger = get_logger(__name__)
|
|
14
|
+
router = APIRouter(prefix="/python", tags=["maps"])
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class GoogleMapsRequest(BaseModel):
|
|
18
|
+
node_id: str
|
|
19
|
+
node_type: str
|
|
20
|
+
parameters: Dict[str, Any]
|
|
21
|
+
api_key: Optional[str] = None
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ApiKeyValidationRequest(BaseModel):
|
|
25
|
+
api_key: str
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@router.post("/maps/validate-key")
|
|
29
|
+
async def validate_google_maps_key(request: ApiKeyValidationRequest):
|
|
30
|
+
"""Validate Google Maps API key and broadcast status via WebSocket."""
|
|
31
|
+
broadcaster = get_status_broadcaster()
|
|
32
|
+
|
|
33
|
+
try:
|
|
34
|
+
api_key = request.api_key.strip()
|
|
35
|
+
if not api_key:
|
|
36
|
+
await broadcaster.update_api_key_status(
|
|
37
|
+
provider="google_maps",
|
|
38
|
+
valid=False,
|
|
39
|
+
message="API key is required"
|
|
40
|
+
)
|
|
41
|
+
raise HTTPException(status_code=400, detail="API key is required")
|
|
42
|
+
|
|
43
|
+
# Test the API key with a simple geocoding request
|
|
44
|
+
async with httpx.AsyncClient() as client:
|
|
45
|
+
response = await client.get(
|
|
46
|
+
"https://maps.googleapis.com/maps/api/geocode/json",
|
|
47
|
+
params={
|
|
48
|
+
"address": "1600 Amphitheatre Parkway, Mountain View, CA",
|
|
49
|
+
"key": api_key
|
|
50
|
+
},
|
|
51
|
+
timeout=10.0
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
data = response.json()
|
|
55
|
+
|
|
56
|
+
if data.get("status") == "OK":
|
|
57
|
+
await broadcaster.update_api_key_status(
|
|
58
|
+
provider="google_maps",
|
|
59
|
+
valid=True,
|
|
60
|
+
message="API key validated successfully"
|
|
61
|
+
)
|
|
62
|
+
return {
|
|
63
|
+
"success": True,
|
|
64
|
+
"valid": True,
|
|
65
|
+
"message": "Google Maps API key is valid"
|
|
66
|
+
}
|
|
67
|
+
elif data.get("status") == "REQUEST_DENIED":
|
|
68
|
+
error_msg = data.get("error_message", "Invalid API key")
|
|
69
|
+
await broadcaster.update_api_key_status(
|
|
70
|
+
provider="google_maps",
|
|
71
|
+
valid=False,
|
|
72
|
+
message=error_msg
|
|
73
|
+
)
|
|
74
|
+
return {
|
|
75
|
+
"success": True,
|
|
76
|
+
"valid": False,
|
|
77
|
+
"message": error_msg
|
|
78
|
+
}
|
|
79
|
+
else:
|
|
80
|
+
# Other statuses like ZERO_RESULTS still mean the key works
|
|
81
|
+
await broadcaster.update_api_key_status(
|
|
82
|
+
provider="google_maps",
|
|
83
|
+
valid=True,
|
|
84
|
+
message="API key validated"
|
|
85
|
+
)
|
|
86
|
+
return {
|
|
87
|
+
"success": True,
|
|
88
|
+
"valid": True,
|
|
89
|
+
"message": f"API key is valid (status: {data.get('status')})"
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
except httpx.TimeoutException:
|
|
93
|
+
await broadcaster.update_api_key_status(
|
|
94
|
+
provider="google_maps",
|
|
95
|
+
valid=False,
|
|
96
|
+
message="Validation request timed out"
|
|
97
|
+
)
|
|
98
|
+
raise HTTPException(status_code=504, detail="Validation request timed out")
|
|
99
|
+
except httpx.RequestError as e:
|
|
100
|
+
await broadcaster.update_api_key_status(
|
|
101
|
+
provider="google_maps",
|
|
102
|
+
valid=False,
|
|
103
|
+
message=f"Network error: {str(e)}"
|
|
104
|
+
)
|
|
105
|
+
raise HTTPException(status_code=503, detail=f"Network error: {str(e)}")
|
|
106
|
+
except HTTPException:
|
|
107
|
+
raise
|
|
108
|
+
except Exception as e:
|
|
109
|
+
logger.error(f"API key validation error: {e}")
|
|
110
|
+
await broadcaster.update_api_key_status(
|
|
111
|
+
provider="google_maps",
|
|
112
|
+
valid=False,
|
|
113
|
+
message=f"Validation failed: {str(e)}"
|
|
114
|
+
)
|
|
115
|
+
raise HTTPException(status_code=500, detail=f"Validation failed: {str(e)}")
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@router.post("/createmap/execute")
|
|
119
|
+
async def execute_createmap_node(
|
|
120
|
+
request: GoogleMapsRequest,
|
|
121
|
+
maps_service: MapsService = Depends(lambda: container.maps_service())
|
|
122
|
+
):
|
|
123
|
+
"""Execute Create Map node - Google Maps initialization."""
|
|
124
|
+
return await maps_service.create_map(request.node_id, request.parameters)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
@router.post("/addlocations/execute")
|
|
128
|
+
async def execute_addlocations_node(
|
|
129
|
+
request: GoogleMapsRequest,
|
|
130
|
+
maps_service: MapsService = Depends(lambda: container.maps_service())
|
|
131
|
+
):
|
|
132
|
+
"""Execute Add Locations node - Google Maps Geocoding."""
|
|
133
|
+
return await maps_service.geocode_location(request.node_id, request.parameters)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
@router.post("/shownearbyplaces/execute")
|
|
137
|
+
async def execute_shownearbyplaces_node(
|
|
138
|
+
request: GoogleMapsRequest,
|
|
139
|
+
maps_service: MapsService = Depends(lambda: container.maps_service())
|
|
140
|
+
):
|
|
141
|
+
"""Execute Show Nearby Places node - Google Places API."""
|
|
142
142
|
return await maps_service.find_nearby_places(request.node_id, request.parameters)
|