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
package/server/main.py
CHANGED
|
@@ -1,289 +1,289 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Modern FastAPI backend for React Flow workflow automation platform.
|
|
3
|
-
|
|
4
|
-
Refactored with dependency injection, modular services, and clean architecture.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
# Performance: Install uvloop if available (Linux/macOS only)
|
|
8
|
-
try:
|
|
9
|
-
import uvloop
|
|
10
|
-
uvloop.install()
|
|
11
|
-
except ImportError:
|
|
12
|
-
pass # Windows - uvloop not available, use default asyncio
|
|
13
|
-
|
|
14
|
-
import os
|
|
15
|
-
from datetime import datetime
|
|
16
|
-
from contextlib import asynccontextmanager
|
|
17
|
-
|
|
18
|
-
# Note: We don't register custom signal handlers.
|
|
19
|
-
# uvicorn already handles SIGINT (Ctrl+C) and SIGTERM (docker stop) gracefully.
|
|
20
|
-
# Adding custom handlers that raise KeyboardInterrupt causes cascading errors
|
|
21
|
-
# during async operations (WebSocket handlers, logging, etc.).
|
|
22
|
-
|
|
23
|
-
from fastapi import FastAPI
|
|
24
|
-
from fastapi.middleware.cors import CORSMiddleware
|
|
25
|
-
from fastapi.responses import ORJSONResponse
|
|
26
|
-
|
|
27
|
-
from core.container import container
|
|
28
|
-
from core.config import Settings
|
|
29
|
-
from core.logging import configure_logging, get_logger, setup_websocket_logging, shutdown_websocket_logging
|
|
30
|
-
from routers import workflow, database, maps, nodejs_compat, android, websocket, webhook, auth
|
|
31
|
-
|
|
32
|
-
# Initialize settings and logging
|
|
33
|
-
settings = Settings()
|
|
34
|
-
configure_logging(settings)
|
|
35
|
-
logger = get_logger(__name__)
|
|
36
|
-
|
|
37
|
-
# Suppress noisy loggers
|
|
38
|
-
import logging
|
|
39
|
-
logging.getLogger("apscheduler").setLevel(logging.WARNING)
|
|
40
|
-
logging.getLogger("apscheduler.scheduler").setLevel(logging.WARNING)
|
|
41
|
-
logging.getLogger("apscheduler.executors").setLevel(logging.WARNING)
|
|
42
|
-
logging.getLogger("uvicorn").setLevel(logging.WARNING)
|
|
43
|
-
logging.getLogger("uvicorn.access").setLevel(logging.WARNING)
|
|
44
|
-
logging.getLogger("uvicorn.error").setLevel(logging.WARNING)
|
|
45
|
-
logging.getLogger("watchfiles").setLevel(logging.WARNING)
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
@asynccontextmanager
|
|
49
|
-
async def lifespan(app: FastAPI):
|
|
50
|
-
"""Application lifespan management."""
|
|
51
|
-
# Startup
|
|
52
|
-
logger.info("Starting React Flow Python Services")
|
|
53
|
-
|
|
54
|
-
# Wire dependency injection
|
|
55
|
-
container.wire(modules=[
|
|
56
|
-
"routers.workflow",
|
|
57
|
-
"routers.database",
|
|
58
|
-
"routers.maps",
|
|
59
|
-
"routers.nodejs_compat",
|
|
60
|
-
"routers.android",
|
|
61
|
-
"routers.websocket",
|
|
62
|
-
"routers.webhook",
|
|
63
|
-
"routers.auth",
|
|
64
|
-
"middleware.auth"
|
|
65
|
-
])
|
|
66
|
-
|
|
67
|
-
# Start services
|
|
68
|
-
await container.database().startup()
|
|
69
|
-
await container.cache().startup()
|
|
70
|
-
|
|
71
|
-
# Initialize event waiter with cache service for Redis Streams support
|
|
72
|
-
from services import event_waiter
|
|
73
|
-
event_waiter.set_cache_service(container.cache())
|
|
74
|
-
|
|
75
|
-
# Start APScheduler for cron jobs
|
|
76
|
-
from services.scheduler import start_scheduler, shutdown_scheduler
|
|
77
|
-
start_scheduler()
|
|
78
|
-
|
|
79
|
-
# Initialize execution engine recovery sweeper
|
|
80
|
-
from services.execution import (
|
|
81
|
-
ExecutionCache,
|
|
82
|
-
RecoverySweeper,
|
|
83
|
-
set_recovery_sweeper,
|
|
84
|
-
)
|
|
85
|
-
execution_cache = ExecutionCache(container.cache())
|
|
86
|
-
recovery_sweeper = RecoverySweeper(execution_cache)
|
|
87
|
-
set_recovery_sweeper(recovery_sweeper)
|
|
88
|
-
|
|
89
|
-
# Scan for incomplete executions on startup
|
|
90
|
-
if settings.redis_enabled:
|
|
91
|
-
incomplete = await recovery_sweeper.scan_on_startup()
|
|
92
|
-
if incomplete:
|
|
93
|
-
logger.info("Found incomplete executions on startup",
|
|
94
|
-
count=len(incomplete),
|
|
95
|
-
execution_ids=incomplete)
|
|
96
|
-
|
|
97
|
-
# Start background recovery sweeper
|
|
98
|
-
await recovery_sweeper.start()
|
|
99
|
-
logger.info("Execution recovery sweeper started")
|
|
100
|
-
|
|
101
|
-
# Start WebSocket logging handler to broadcast logs to frontend
|
|
102
|
-
import asyncio
|
|
103
|
-
loop = asyncio.get_running_loop()
|
|
104
|
-
setup_websocket_logging(loop)
|
|
105
|
-
logger.info("WebSocket logging handler started")
|
|
106
|
-
|
|
107
|
-
# Initialize Temporal if enabled
|
|
108
|
-
temporal_worker_manager = None
|
|
109
|
-
if settings.temporal_enabled:
|
|
110
|
-
try:
|
|
111
|
-
from services.temporal import TemporalClientWrapper, TemporalExecutor
|
|
112
|
-
from services.temporal.worker import TemporalWorkerManager
|
|
113
|
-
|
|
114
|
-
logger.info(
|
|
115
|
-
"Initializing Temporal integration",
|
|
116
|
-
server_address=settings.temporal_server_address,
|
|
117
|
-
namespace=settings.temporal_namespace,
|
|
118
|
-
task_queue=settings.temporal_task_queue,
|
|
119
|
-
)
|
|
120
|
-
|
|
121
|
-
# Connect Temporal client
|
|
122
|
-
temporal_client_wrapper = container.temporal_client()
|
|
123
|
-
temporal_client = await temporal_client_wrapper.connect()
|
|
124
|
-
|
|
125
|
-
# Create and set the Temporal executor on WorkflowService
|
|
126
|
-
temporal_executor = TemporalExecutor(
|
|
127
|
-
client=temporal_client,
|
|
128
|
-
task_queue=settings.temporal_task_queue,
|
|
129
|
-
)
|
|
130
|
-
container.workflow_service().set_temporal_executor(temporal_executor)
|
|
131
|
-
|
|
132
|
-
# Start embedded Temporal worker
|
|
133
|
-
temporal_worker_manager = TemporalWorkerManager(
|
|
134
|
-
client=temporal_client,
|
|
135
|
-
task_queue=settings.temporal_task_queue,
|
|
136
|
-
)
|
|
137
|
-
await temporal_worker_manager.start()
|
|
138
|
-
|
|
139
|
-
logger.info("Temporal integration initialized successfully")
|
|
140
|
-
|
|
141
|
-
except Exception as e:
|
|
142
|
-
logger.error(f"Failed to initialize Temporal: {str(e)}")
|
|
143
|
-
logger.warning("Falling back to Redis/sequential execution")
|
|
144
|
-
|
|
145
|
-
logger.info("Services started successfully")
|
|
146
|
-
yield
|
|
147
|
-
|
|
148
|
-
# Shutdown
|
|
149
|
-
# Stop WebSocket logging handler
|
|
150
|
-
shutdown_websocket_logging()
|
|
151
|
-
|
|
152
|
-
# Stop Temporal worker if running
|
|
153
|
-
if temporal_worker_manager is not None:
|
|
154
|
-
await temporal_worker_manager.stop()
|
|
155
|
-
logger.info("Temporal worker stopped")
|
|
156
|
-
|
|
157
|
-
# Disconnect Temporal client if connected
|
|
158
|
-
if settings.temporal_enabled:
|
|
159
|
-
try:
|
|
160
|
-
await container.temporal_client().disconnect()
|
|
161
|
-
except Exception:
|
|
162
|
-
pass
|
|
163
|
-
|
|
164
|
-
# Close Android relay client (prevents "Unclosed client session" warning)
|
|
165
|
-
from services.android.manager import close_relay_client
|
|
166
|
-
await close_relay_client(clear_stored_session=False)
|
|
167
|
-
|
|
168
|
-
# Stop recovery sweeper first
|
|
169
|
-
if settings.redis_enabled:
|
|
170
|
-
await recovery_sweeper.stop()
|
|
171
|
-
logger.info("Execution recovery sweeper stopped")
|
|
172
|
-
|
|
173
|
-
shutdown_scheduler() # Stop APScheduler
|
|
174
|
-
await container.cache().shutdown()
|
|
175
|
-
await container.database().shutdown()
|
|
176
|
-
logger.info("Services shutdown complete")
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
# Create FastAPI app
|
|
180
|
-
app = FastAPI(
|
|
181
|
-
title="React Flow Python Services",
|
|
182
|
-
version="3.0.0",
|
|
183
|
-
description="Modern workflow automation backend with AI and Maps integration",
|
|
184
|
-
lifespan=lifespan,
|
|
185
|
-
default_response_class=ORJSONResponse
|
|
186
|
-
)
|
|
187
|
-
|
|
188
|
-
# Add exception handler middleware BEFORE CORS to catch all errors
|
|
189
|
-
from fastapi import Request, status
|
|
190
|
-
from fastapi.responses import JSONResponse
|
|
191
|
-
from starlette.middleware.base import BaseHTTPMiddleware
|
|
192
|
-
|
|
193
|
-
class CatchAllExceptionsMiddleware(BaseHTTPMiddleware):
|
|
194
|
-
async def dispatch(self, request: Request, call_next):
|
|
195
|
-
try:
|
|
196
|
-
return await call_next(request)
|
|
197
|
-
except Exception as e:
|
|
198
|
-
import traceback
|
|
199
|
-
traceback.print_exc()
|
|
200
|
-
logger.error(f"Unhandled exception: {type(e).__name__}: {str(e)}", exc_info=True)
|
|
201
|
-
return JSONResponse(
|
|
202
|
-
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
203
|
-
content={
|
|
204
|
-
"success": False,
|
|
205
|
-
"error": f"{type(e).__name__}: {str(e)}",
|
|
206
|
-
"detail": "Internal server error"
|
|
207
|
-
}
|
|
208
|
-
)
|
|
209
|
-
|
|
210
|
-
app.add_middleware(CatchAllExceptionsMiddleware)
|
|
211
|
-
|
|
212
|
-
# Add Auth middleware (checks JWT cookie for protected routes)
|
|
213
|
-
from middleware.auth import AuthMiddleware
|
|
214
|
-
app.add_middleware(AuthMiddleware)
|
|
215
|
-
|
|
216
|
-
# Add CORS middleware (must be AFTER exception middleware)
|
|
217
|
-
logger.info("Configuring CORS middleware",
|
|
218
|
-
origins_count=len(settings.cors_origins),
|
|
219
|
-
origins=settings.cors_origins)
|
|
220
|
-
app.add_middleware(
|
|
221
|
-
CORSMiddleware,
|
|
222
|
-
allow_origins=settings.cors_origins,
|
|
223
|
-
allow_credentials=True,
|
|
224
|
-
allow_methods=["*"],
|
|
225
|
-
allow_headers=["*"],
|
|
226
|
-
expose_headers=["*"],
|
|
227
|
-
)
|
|
228
|
-
|
|
229
|
-
# Include routers
|
|
230
|
-
app.include_router(auth.router) # Auth routes (login, register, logout, status)
|
|
231
|
-
app.include_router(nodejs_compat.router) # Node.js compatibility (includes root endpoints)
|
|
232
|
-
app.include_router(workflow.router)
|
|
233
|
-
app.include_router(database.router)
|
|
234
|
-
app.include_router(maps.router)
|
|
235
|
-
app.include_router(android.router)
|
|
236
|
-
app.include_router(websocket.router)
|
|
237
|
-
app.include_router(webhook.router)
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
@app.get("/health")
|
|
241
|
-
async def health_check():
|
|
242
|
-
"""Detailed health check."""
|
|
243
|
-
from services import event_waiter
|
|
244
|
-
from services.execution import get_recovery_sweeper
|
|
245
|
-
|
|
246
|
-
sweeper = get_recovery_sweeper()
|
|
247
|
-
|
|
248
|
-
# Check Temporal status
|
|
249
|
-
temporal_status = {
|
|
250
|
-
"enabled": settings.temporal_enabled,
|
|
251
|
-
"connected": False,
|
|
252
|
-
}
|
|
253
|
-
if settings.temporal_enabled:
|
|
254
|
-
try:
|
|
255
|
-
temporal_status["connected"] = container.temporal_client().is_connected
|
|
256
|
-
temporal_status["server_address"] = settings.temporal_server_address
|
|
257
|
-
temporal_status["task_queue"] = settings.temporal_task_queue
|
|
258
|
-
except Exception:
|
|
259
|
-
pass
|
|
260
|
-
|
|
261
|
-
return {
|
|
262
|
-
"status": "OK",
|
|
263
|
-
"service": "python",
|
|
264
|
-
"version": "3.2.0", # Bumped for Temporal integration
|
|
265
|
-
"environment": "development" if settings.debug else "production",
|
|
266
|
-
"redis_enabled": settings.redis_enabled,
|
|
267
|
-
"event_waiter_mode": event_waiter.get_backend_mode(),
|
|
268
|
-
"execution_engine": {
|
|
269
|
-
"enabled": settings.redis_enabled,
|
|
270
|
-
"recovery_sweeper": sweeper is not None and sweeper._running,
|
|
271
|
-
},
|
|
272
|
-
"temporal": temporal_status,
|
|
273
|
-
"timestamp": datetime.now().isoformat()
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
if __name__ == "__main__":
|
|
278
|
-
import uvicorn
|
|
279
|
-
logger.info("Starting React Flow Python Services",
|
|
280
|
-
host=settings.host, port=settings.port, debug=settings.debug)
|
|
281
|
-
uvicorn.run(
|
|
282
|
-
"main:app",
|
|
283
|
-
host=settings.host,
|
|
284
|
-
port=settings.port,
|
|
285
|
-
reload=settings.debug,
|
|
286
|
-
reload_dirs=["."] if settings.debug else None,
|
|
287
|
-
reload_excludes=["*.pyc", "__pycache__", "*.log", "*.db"] if settings.debug else None,
|
|
288
|
-
workers=1 if settings.debug else settings.workers
|
|
1
|
+
"""
|
|
2
|
+
Modern FastAPI backend for React Flow workflow automation platform.
|
|
3
|
+
|
|
4
|
+
Refactored with dependency injection, modular services, and clean architecture.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
# Performance: Install uvloop if available (Linux/macOS only)
|
|
8
|
+
try:
|
|
9
|
+
import uvloop
|
|
10
|
+
uvloop.install()
|
|
11
|
+
except ImportError:
|
|
12
|
+
pass # Windows - uvloop not available, use default asyncio
|
|
13
|
+
|
|
14
|
+
import os
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
from contextlib import asynccontextmanager
|
|
17
|
+
|
|
18
|
+
# Note: We don't register custom signal handlers.
|
|
19
|
+
# uvicorn already handles SIGINT (Ctrl+C) and SIGTERM (docker stop) gracefully.
|
|
20
|
+
# Adding custom handlers that raise KeyboardInterrupt causes cascading errors
|
|
21
|
+
# during async operations (WebSocket handlers, logging, etc.).
|
|
22
|
+
|
|
23
|
+
from fastapi import FastAPI
|
|
24
|
+
from fastapi.middleware.cors import CORSMiddleware
|
|
25
|
+
from fastapi.responses import ORJSONResponse
|
|
26
|
+
|
|
27
|
+
from core.container import container
|
|
28
|
+
from core.config import Settings
|
|
29
|
+
from core.logging import configure_logging, get_logger, setup_websocket_logging, shutdown_websocket_logging
|
|
30
|
+
from routers import workflow, database, maps, nodejs_compat, android, websocket, webhook, auth
|
|
31
|
+
|
|
32
|
+
# Initialize settings and logging
|
|
33
|
+
settings = Settings()
|
|
34
|
+
configure_logging(settings)
|
|
35
|
+
logger = get_logger(__name__)
|
|
36
|
+
|
|
37
|
+
# Suppress noisy loggers
|
|
38
|
+
import logging
|
|
39
|
+
logging.getLogger("apscheduler").setLevel(logging.WARNING)
|
|
40
|
+
logging.getLogger("apscheduler.scheduler").setLevel(logging.WARNING)
|
|
41
|
+
logging.getLogger("apscheduler.executors").setLevel(logging.WARNING)
|
|
42
|
+
logging.getLogger("uvicorn").setLevel(logging.WARNING)
|
|
43
|
+
logging.getLogger("uvicorn.access").setLevel(logging.WARNING)
|
|
44
|
+
logging.getLogger("uvicorn.error").setLevel(logging.WARNING)
|
|
45
|
+
logging.getLogger("watchfiles").setLevel(logging.WARNING)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@asynccontextmanager
|
|
49
|
+
async def lifespan(app: FastAPI):
|
|
50
|
+
"""Application lifespan management."""
|
|
51
|
+
# Startup
|
|
52
|
+
logger.info("Starting React Flow Python Services")
|
|
53
|
+
|
|
54
|
+
# Wire dependency injection
|
|
55
|
+
container.wire(modules=[
|
|
56
|
+
"routers.workflow",
|
|
57
|
+
"routers.database",
|
|
58
|
+
"routers.maps",
|
|
59
|
+
"routers.nodejs_compat",
|
|
60
|
+
"routers.android",
|
|
61
|
+
"routers.websocket",
|
|
62
|
+
"routers.webhook",
|
|
63
|
+
"routers.auth",
|
|
64
|
+
"middleware.auth"
|
|
65
|
+
])
|
|
66
|
+
|
|
67
|
+
# Start services
|
|
68
|
+
await container.database().startup()
|
|
69
|
+
await container.cache().startup()
|
|
70
|
+
|
|
71
|
+
# Initialize event waiter with cache service for Redis Streams support
|
|
72
|
+
from services import event_waiter
|
|
73
|
+
event_waiter.set_cache_service(container.cache())
|
|
74
|
+
|
|
75
|
+
# Start APScheduler for cron jobs
|
|
76
|
+
from services.scheduler import start_scheduler, shutdown_scheduler
|
|
77
|
+
start_scheduler()
|
|
78
|
+
|
|
79
|
+
# Initialize execution engine recovery sweeper
|
|
80
|
+
from services.execution import (
|
|
81
|
+
ExecutionCache,
|
|
82
|
+
RecoverySweeper,
|
|
83
|
+
set_recovery_sweeper,
|
|
84
|
+
)
|
|
85
|
+
execution_cache = ExecutionCache(container.cache())
|
|
86
|
+
recovery_sweeper = RecoverySweeper(execution_cache)
|
|
87
|
+
set_recovery_sweeper(recovery_sweeper)
|
|
88
|
+
|
|
89
|
+
# Scan for incomplete executions on startup
|
|
90
|
+
if settings.redis_enabled:
|
|
91
|
+
incomplete = await recovery_sweeper.scan_on_startup()
|
|
92
|
+
if incomplete:
|
|
93
|
+
logger.info("Found incomplete executions on startup",
|
|
94
|
+
count=len(incomplete),
|
|
95
|
+
execution_ids=incomplete)
|
|
96
|
+
|
|
97
|
+
# Start background recovery sweeper
|
|
98
|
+
await recovery_sweeper.start()
|
|
99
|
+
logger.info("Execution recovery sweeper started")
|
|
100
|
+
|
|
101
|
+
# Start WebSocket logging handler to broadcast logs to frontend
|
|
102
|
+
import asyncio
|
|
103
|
+
loop = asyncio.get_running_loop()
|
|
104
|
+
setup_websocket_logging(loop)
|
|
105
|
+
logger.info("WebSocket logging handler started")
|
|
106
|
+
|
|
107
|
+
# Initialize Temporal if enabled
|
|
108
|
+
temporal_worker_manager = None
|
|
109
|
+
if settings.temporal_enabled:
|
|
110
|
+
try:
|
|
111
|
+
from services.temporal import TemporalClientWrapper, TemporalExecutor
|
|
112
|
+
from services.temporal.worker import TemporalWorkerManager
|
|
113
|
+
|
|
114
|
+
logger.info(
|
|
115
|
+
"Initializing Temporal integration",
|
|
116
|
+
server_address=settings.temporal_server_address,
|
|
117
|
+
namespace=settings.temporal_namespace,
|
|
118
|
+
task_queue=settings.temporal_task_queue,
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
# Connect Temporal client
|
|
122
|
+
temporal_client_wrapper = container.temporal_client()
|
|
123
|
+
temporal_client = await temporal_client_wrapper.connect()
|
|
124
|
+
|
|
125
|
+
# Create and set the Temporal executor on WorkflowService
|
|
126
|
+
temporal_executor = TemporalExecutor(
|
|
127
|
+
client=temporal_client,
|
|
128
|
+
task_queue=settings.temporal_task_queue,
|
|
129
|
+
)
|
|
130
|
+
container.workflow_service().set_temporal_executor(temporal_executor)
|
|
131
|
+
|
|
132
|
+
# Start embedded Temporal worker
|
|
133
|
+
temporal_worker_manager = TemporalWorkerManager(
|
|
134
|
+
client=temporal_client,
|
|
135
|
+
task_queue=settings.temporal_task_queue,
|
|
136
|
+
)
|
|
137
|
+
await temporal_worker_manager.start()
|
|
138
|
+
|
|
139
|
+
logger.info("Temporal integration initialized successfully")
|
|
140
|
+
|
|
141
|
+
except Exception as e:
|
|
142
|
+
logger.error(f"Failed to initialize Temporal: {str(e)}")
|
|
143
|
+
logger.warning("Falling back to Redis/sequential execution")
|
|
144
|
+
|
|
145
|
+
logger.info("Services started successfully")
|
|
146
|
+
yield
|
|
147
|
+
|
|
148
|
+
# Shutdown
|
|
149
|
+
# Stop WebSocket logging handler
|
|
150
|
+
shutdown_websocket_logging()
|
|
151
|
+
|
|
152
|
+
# Stop Temporal worker if running
|
|
153
|
+
if temporal_worker_manager is not None:
|
|
154
|
+
await temporal_worker_manager.stop()
|
|
155
|
+
logger.info("Temporal worker stopped")
|
|
156
|
+
|
|
157
|
+
# Disconnect Temporal client if connected
|
|
158
|
+
if settings.temporal_enabled:
|
|
159
|
+
try:
|
|
160
|
+
await container.temporal_client().disconnect()
|
|
161
|
+
except Exception:
|
|
162
|
+
pass
|
|
163
|
+
|
|
164
|
+
# Close Android relay client (prevents "Unclosed client session" warning)
|
|
165
|
+
from services.android.manager import close_relay_client
|
|
166
|
+
await close_relay_client(clear_stored_session=False)
|
|
167
|
+
|
|
168
|
+
# Stop recovery sweeper first
|
|
169
|
+
if settings.redis_enabled:
|
|
170
|
+
await recovery_sweeper.stop()
|
|
171
|
+
logger.info("Execution recovery sweeper stopped")
|
|
172
|
+
|
|
173
|
+
shutdown_scheduler() # Stop APScheduler
|
|
174
|
+
await container.cache().shutdown()
|
|
175
|
+
await container.database().shutdown()
|
|
176
|
+
logger.info("Services shutdown complete")
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
# Create FastAPI app
|
|
180
|
+
app = FastAPI(
|
|
181
|
+
title="React Flow Python Services",
|
|
182
|
+
version="3.0.0",
|
|
183
|
+
description="Modern workflow automation backend with AI and Maps integration",
|
|
184
|
+
lifespan=lifespan,
|
|
185
|
+
default_response_class=ORJSONResponse
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
# Add exception handler middleware BEFORE CORS to catch all errors
|
|
189
|
+
from fastapi import Request, status
|
|
190
|
+
from fastapi.responses import JSONResponse
|
|
191
|
+
from starlette.middleware.base import BaseHTTPMiddleware
|
|
192
|
+
|
|
193
|
+
class CatchAllExceptionsMiddleware(BaseHTTPMiddleware):
|
|
194
|
+
async def dispatch(self, request: Request, call_next):
|
|
195
|
+
try:
|
|
196
|
+
return await call_next(request)
|
|
197
|
+
except Exception as e:
|
|
198
|
+
import traceback
|
|
199
|
+
traceback.print_exc()
|
|
200
|
+
logger.error(f"Unhandled exception: {type(e).__name__}: {str(e)}", exc_info=True)
|
|
201
|
+
return JSONResponse(
|
|
202
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
203
|
+
content={
|
|
204
|
+
"success": False,
|
|
205
|
+
"error": f"{type(e).__name__}: {str(e)}",
|
|
206
|
+
"detail": "Internal server error"
|
|
207
|
+
}
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
app.add_middleware(CatchAllExceptionsMiddleware)
|
|
211
|
+
|
|
212
|
+
# Add Auth middleware (checks JWT cookie for protected routes)
|
|
213
|
+
from middleware.auth import AuthMiddleware
|
|
214
|
+
app.add_middleware(AuthMiddleware)
|
|
215
|
+
|
|
216
|
+
# Add CORS middleware (must be AFTER exception middleware)
|
|
217
|
+
logger.info("Configuring CORS middleware",
|
|
218
|
+
origins_count=len(settings.cors_origins),
|
|
219
|
+
origins=settings.cors_origins)
|
|
220
|
+
app.add_middleware(
|
|
221
|
+
CORSMiddleware,
|
|
222
|
+
allow_origins=settings.cors_origins,
|
|
223
|
+
allow_credentials=True,
|
|
224
|
+
allow_methods=["*"],
|
|
225
|
+
allow_headers=["*"],
|
|
226
|
+
expose_headers=["*"],
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
# Include routers
|
|
230
|
+
app.include_router(auth.router) # Auth routes (login, register, logout, status)
|
|
231
|
+
app.include_router(nodejs_compat.router) # Node.js compatibility (includes root endpoints)
|
|
232
|
+
app.include_router(workflow.router)
|
|
233
|
+
app.include_router(database.router)
|
|
234
|
+
app.include_router(maps.router)
|
|
235
|
+
app.include_router(android.router)
|
|
236
|
+
app.include_router(websocket.router)
|
|
237
|
+
app.include_router(webhook.router)
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
@app.get("/health")
|
|
241
|
+
async def health_check():
|
|
242
|
+
"""Detailed health check."""
|
|
243
|
+
from services import event_waiter
|
|
244
|
+
from services.execution import get_recovery_sweeper
|
|
245
|
+
|
|
246
|
+
sweeper = get_recovery_sweeper()
|
|
247
|
+
|
|
248
|
+
# Check Temporal status
|
|
249
|
+
temporal_status = {
|
|
250
|
+
"enabled": settings.temporal_enabled,
|
|
251
|
+
"connected": False,
|
|
252
|
+
}
|
|
253
|
+
if settings.temporal_enabled:
|
|
254
|
+
try:
|
|
255
|
+
temporal_status["connected"] = container.temporal_client().is_connected
|
|
256
|
+
temporal_status["server_address"] = settings.temporal_server_address
|
|
257
|
+
temporal_status["task_queue"] = settings.temporal_task_queue
|
|
258
|
+
except Exception:
|
|
259
|
+
pass
|
|
260
|
+
|
|
261
|
+
return {
|
|
262
|
+
"status": "OK",
|
|
263
|
+
"service": "python",
|
|
264
|
+
"version": "3.2.0", # Bumped for Temporal integration
|
|
265
|
+
"environment": "development" if settings.debug else "production",
|
|
266
|
+
"redis_enabled": settings.redis_enabled,
|
|
267
|
+
"event_waiter_mode": event_waiter.get_backend_mode(),
|
|
268
|
+
"execution_engine": {
|
|
269
|
+
"enabled": settings.redis_enabled,
|
|
270
|
+
"recovery_sweeper": sweeper is not None and sweeper._running,
|
|
271
|
+
},
|
|
272
|
+
"temporal": temporal_status,
|
|
273
|
+
"timestamp": datetime.now().isoformat()
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
if __name__ == "__main__":
|
|
278
|
+
import uvicorn
|
|
279
|
+
logger.info("Starting React Flow Python Services",
|
|
280
|
+
host=settings.host, port=settings.port, debug=settings.debug)
|
|
281
|
+
uvicorn.run(
|
|
282
|
+
"main:app",
|
|
283
|
+
host=settings.host,
|
|
284
|
+
port=settings.port,
|
|
285
|
+
reload=settings.debug,
|
|
286
|
+
reload_dirs=["."] if settings.debug else None,
|
|
287
|
+
reload_excludes=["*.pyc", "__pycache__", "*.log", "*.db"] if settings.debug else None,
|
|
288
|
+
workers=1 if settings.debug else settings.workers
|
|
289
289
|
)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
"""Middleware package for FastAPI application."""
|
|
2
|
-
|
|
3
|
-
from middleware.auth import AuthMiddleware
|
|
4
|
-
|
|
5
|
-
__all__ = ["AuthMiddleware"]
|
|
1
|
+
"""Middleware package for FastAPI application."""
|
|
2
|
+
|
|
3
|
+
from middleware.auth import AuthMiddleware
|
|
4
|
+
|
|
5
|
+
__all__ = ["AuthMiddleware"]
|