machinaos 0.0.1 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.template +71 -71
- package/LICENSE +21 -21
- package/README.md +145 -87
- package/bin/cli.js +62 -106
- package/client/.dockerignore +45 -45
- package/client/Dockerfile +68 -68
- package/client/dist/assets/index-DFSC53FP.css +1 -0
- package/client/dist/assets/index-fJ-1gTf5.js +613 -0
- package/client/dist/index.html +14 -0
- package/client/eslint.config.js +34 -16
- package/client/nginx.conf +66 -66
- package/client/package.json +61 -48
- package/client/src/App.tsx +27 -27
- package/client/src/Dashboard.tsx +1200 -1172
- package/client/src/ParameterPanel.tsx +302 -300
- package/client/src/components/AIAgentNode.tsx +315 -321
- package/client/src/components/APIKeyValidator.tsx +117 -117
- package/client/src/components/ClaudeChatModelNode.tsx +17 -17
- package/client/src/components/CredentialsModal.tsx +1200 -306
- package/client/src/components/GeminiChatModelNode.tsx +17 -17
- package/client/src/components/GenericNode.tsx +356 -356
- package/client/src/components/LocationParameterPanel.tsx +153 -153
- package/client/src/components/ModelNode.tsx +285 -285
- package/client/src/components/OpenAIChatModelNode.tsx +17 -17
- package/client/src/components/OutputPanel.tsx +470 -470
- package/client/src/components/ParameterRenderer.tsx +1873 -1873
- package/client/src/components/SkillEditorModal.tsx +3 -3
- package/client/src/components/SquareNode.tsx +812 -796
- package/client/src/components/ToolkitNode.tsx +365 -365
- package/client/src/components/auth/LoginPage.tsx +247 -247
- package/client/src/components/auth/ProtectedRoute.tsx +59 -59
- package/client/src/components/base/BaseChatModelNode.tsx +270 -270
- package/client/src/components/icons/AIProviderIcons.tsx +50 -50
- package/client/src/components/maps/GoogleMapsPicker.tsx +136 -136
- package/client/src/components/maps/MapsPreviewPanel.tsx +109 -109
- package/client/src/components/maps/index.ts +25 -25
- package/client/src/components/parameterPanel/InputSection.tsx +1094 -1094
- package/client/src/components/parameterPanel/LocationPanelLayout.tsx +64 -64
- package/client/src/components/parameterPanel/MapsSection.tsx +91 -91
- package/client/src/components/parameterPanel/MiddleSection.tsx +867 -571
- package/client/src/components/parameterPanel/OutputSection.tsx +80 -80
- package/client/src/components/parameterPanel/ParameterPanelLayout.tsx +81 -81
- package/client/src/components/parameterPanel/ToolSchemaEditor.tsx +436 -436
- package/client/src/components/parameterPanel/index.ts +41 -41
- package/client/src/components/shared/DataPanel.tsx +142 -142
- package/client/src/components/shared/JSONTreeRenderer.tsx +105 -105
- package/client/src/components/ui/AIResultModal.tsx +203 -203
- package/client/src/components/ui/ApiKeyInput.tsx +93 -0
- package/client/src/components/ui/CodeEditor.tsx +81 -81
- package/client/src/components/ui/CollapsibleSection.tsx +87 -87
- package/client/src/components/ui/ComponentItem.tsx +153 -153
- package/client/src/components/ui/ComponentPalette.tsx +320 -320
- package/client/src/components/ui/ConsolePanel.tsx +151 -43
- package/client/src/components/ui/ErrorBoundary.tsx +195 -195
- package/client/src/components/ui/InputNodesPanel.tsx +203 -203
- package/client/src/components/ui/MapSelector.tsx +313 -313
- package/client/src/components/ui/Modal.tsx +151 -148
- package/client/src/components/ui/NodeOutputPanel.tsx +1150 -1150
- package/client/src/components/ui/OutputDisplayPanel.tsx +381 -381
- package/client/src/components/ui/QRCodeDisplay.tsx +182 -0
- package/client/src/components/ui/TopToolbar.tsx +736 -736
- package/client/src/components/ui/WorkflowSidebar.tsx +293 -293
- package/client/src/config/antdTheme.ts +186 -186
- package/client/src/contexts/AuthContext.tsx +221 -221
- package/client/src/contexts/ThemeContext.tsx +42 -42
- package/client/src/contexts/WebSocketContext.tsx +2144 -1971
- package/client/src/factories/baseChatModelFactory.ts +255 -255
- package/client/src/hooks/useAndroidOperations.ts +118 -164
- package/client/src/hooks/useApiKeyValidation.ts +106 -106
- package/client/src/hooks/useApiKeys.ts +238 -238
- package/client/src/hooks/useAppTheme.ts +17 -17
- package/client/src/hooks/useComponentPalette.ts +50 -50
- package/client/src/hooks/useDragAndDrop.ts +123 -123
- package/client/src/hooks/useDragVariable.ts +88 -88
- package/client/src/hooks/useExecution.ts +319 -313
- package/client/src/hooks/useParameterPanel.ts +176 -176
- package/client/src/hooks/useReactFlowNodes.ts +188 -188
- package/client/src/hooks/useToolSchema.ts +209 -209
- package/client/src/hooks/useWhatsApp.ts +196 -196
- package/client/src/hooks/useWorkflowManagement.ts +45 -45
- package/client/src/index.css +314 -314
- package/client/src/nodeDefinitions/aiAgentNodes.ts +335 -335
- package/client/src/nodeDefinitions/aiModelNodes.ts +340 -340
- package/client/src/nodeDefinitions/androidServiceNodes.ts +383 -383
- package/client/src/nodeDefinitions/chatNodes.ts +135 -135
- package/client/src/nodeDefinitions/codeNodes.ts +54 -54
- package/client/src/nodeDefinitions/index.ts +14 -14
- package/client/src/nodeDefinitions/locationNodes.ts +462 -462
- package/client/src/nodeDefinitions/schedulerNodes.ts +220 -220
- package/client/src/nodeDefinitions/skillNodes.ts +17 -5
- package/client/src/nodeDefinitions/utilityNodes.ts +284 -284
- package/client/src/nodeDefinitions/whatsappNodes.ts +821 -865
- package/client/src/nodeDefinitions.ts +101 -103
- package/client/src/services/dynamicParameterService.ts +95 -95
- package/client/src/services/execution/aiAgentExecutionService.ts +34 -34
- package/client/src/services/executionService.ts +227 -231
- package/client/src/services/workflowApi.ts +91 -91
- package/client/src/store/useAppStore.ts +578 -581
- package/client/src/styles/theme.ts +513 -508
- package/client/src/styles/zIndex.ts +16 -16
- package/client/src/types/ComponentTypes.ts +38 -38
- package/client/src/types/INodeProperties.ts +287 -287
- package/client/src/types/NodeTypes.ts +27 -27
- package/client/src/utils/formatters.ts +32 -32
- package/client/src/utils/googleMapsLoader.ts +139 -139
- package/client/src/utils/locationUtils.ts +84 -84
- package/client/src/utils/nodeUtils.ts +30 -30
- package/client/src/utils/workflow.ts +29 -29
- package/client/src/vite-env.d.ts +12 -12
- package/client/tailwind.config.js +59 -59
- package/client/tsconfig.json +25 -25
- package/client/vite.config.js +35 -35
- package/package.json +78 -70
- package/scripts/build.js +153 -45
- package/scripts/clean.js +40 -40
- package/scripts/start.js +234 -210
- package/scripts/stop.js +301 -325
- package/server/.dockerignore +44 -44
- package/server/Dockerfile +45 -45
- package/server/constants.py +244 -249
- package/server/core/cache.py +460 -460
- package/server/core/config.py +127 -127
- package/server/core/container.py +98 -98
- package/server/core/database.py +1296 -1210
- package/server/core/logging.py +313 -313
- package/server/main.py +288 -288
- package/server/middleware/__init__.py +5 -5
- package/server/middleware/auth.py +89 -89
- package/server/models/auth.py +52 -52
- package/server/models/cache.py +24 -24
- package/server/models/database.py +235 -210
- package/server/models/nodes.py +435 -455
- package/server/pyproject.toml +75 -72
- package/server/requirements.txt +83 -83
- package/server/routers/android.py +294 -294
- package/server/routers/auth.py +203 -203
- package/server/routers/database.py +150 -150
- package/server/routers/maps.py +141 -141
- package/server/routers/nodejs_compat.py +288 -288
- package/server/routers/webhook.py +90 -90
- package/server/routers/websocket.py +2239 -2127
- package/server/routers/whatsapp.py +761 -761
- package/server/routers/workflow.py +199 -199
- package/server/services/ai.py +2444 -2414
- package/server/services/android_service.py +588 -588
- package/server/services/auth.py +130 -130
- package/server/services/chat_client.py +160 -160
- package/server/services/deployment/manager.py +706 -706
- package/server/services/event_waiter.py +675 -785
- package/server/services/execution/executor.py +1351 -1351
- package/server/services/execution/models.py +1 -1
- package/server/services/handlers/__init__.py +122 -126
- package/server/services/handlers/ai.py +390 -355
- package/server/services/handlers/android.py +69 -260
- package/server/services/handlers/code.py +278 -278
- package/server/services/handlers/http.py +193 -193
- package/server/services/handlers/tools.py +146 -32
- package/server/services/handlers/triggers.py +107 -107
- package/server/services/handlers/utility.py +822 -822
- package/server/services/handlers/whatsapp.py +423 -476
- package/server/services/maps.py +288 -288
- package/server/services/memory_store.py +103 -103
- package/server/services/node_executor.py +372 -375
- package/server/services/scheduler.py +155 -155
- package/server/services/skill_loader.py +1 -1
- package/server/services/status_broadcaster.py +834 -826
- package/server/services/temporal/__init__.py +23 -23
- package/server/services/temporal/activities.py +344 -344
- package/server/services/temporal/client.py +76 -76
- package/server/services/temporal/executor.py +147 -147
- package/server/services/temporal/worker.py +251 -251
- package/server/services/temporal/workflow.py +355 -355
- package/server/services/temporal/ws_client.py +236 -236
- package/server/services/text.py +110 -110
- package/server/services/user_auth.py +172 -172
- package/server/services/websocket_client.py +29 -29
- package/server/services/workflow.py +597 -597
- package/server/skills/android-skill/SKILL.md +4 -4
- package/server/skills/code-skill/SKILL.md +123 -89
- package/server/skills/maps-skill/SKILL.md +3 -3
- package/server/skills/memory-skill/SKILL.md +1 -1
- package/server/skills/web-search-skill/SKILL.md +154 -0
- package/server/skills/whatsapp-skill/SKILL.md +3 -3
- package/server/uv.lock +461 -100
- package/server/whatsapp-rpc/.dockerignore +30 -30
- package/server/whatsapp-rpc/Dockerfile +44 -44
- package/server/whatsapp-rpc/Dockerfile.web +17 -17
- package/server/whatsapp-rpc/README.md +139 -139
- package/server/whatsapp-rpc/bin/whatsapp-rpc-server +0 -0
- package/server/whatsapp-rpc/cli.js +95 -95
- package/server/whatsapp-rpc/configs/config.yaml +6 -6
- package/server/whatsapp-rpc/docker-compose.yml +35 -35
- package/server/whatsapp-rpc/docs/API.md +410 -410
- package/server/whatsapp-rpc/node_modules/.package-lock.json +259 -0
- package/server/whatsapp-rpc/node_modules/chalk/license +9 -0
- package/server/whatsapp-rpc/node_modules/chalk/package.json +83 -0
- package/server/whatsapp-rpc/node_modules/chalk/readme.md +297 -0
- package/server/whatsapp-rpc/node_modules/chalk/source/index.d.ts +325 -0
- package/server/whatsapp-rpc/node_modules/chalk/source/index.js +225 -0
- package/server/whatsapp-rpc/node_modules/chalk/source/utilities.js +33 -0
- package/server/whatsapp-rpc/node_modules/chalk/source/vendor/ansi-styles/index.d.ts +236 -0
- package/server/whatsapp-rpc/node_modules/chalk/source/vendor/ansi-styles/index.js +223 -0
- package/server/whatsapp-rpc/node_modules/chalk/source/vendor/supports-color/browser.d.ts +1 -0
- package/server/whatsapp-rpc/node_modules/chalk/source/vendor/supports-color/browser.js +34 -0
- package/server/whatsapp-rpc/node_modules/chalk/source/vendor/supports-color/index.d.ts +55 -0
- package/server/whatsapp-rpc/node_modules/chalk/source/vendor/supports-color/index.js +190 -0
- package/server/whatsapp-rpc/node_modules/commander/LICENSE +22 -0
- package/server/whatsapp-rpc/node_modules/commander/Readme.md +1148 -0
- package/server/whatsapp-rpc/node_modules/commander/esm.mjs +16 -0
- package/server/whatsapp-rpc/node_modules/commander/index.js +26 -0
- package/server/whatsapp-rpc/node_modules/commander/lib/argument.js +145 -0
- package/server/whatsapp-rpc/node_modules/commander/lib/command.js +2179 -0
- package/server/whatsapp-rpc/node_modules/commander/lib/error.js +43 -0
- package/server/whatsapp-rpc/node_modules/commander/lib/help.js +462 -0
- package/server/whatsapp-rpc/node_modules/commander/lib/option.js +329 -0
- package/server/whatsapp-rpc/node_modules/commander/lib/suggestSimilar.js +100 -0
- package/server/whatsapp-rpc/node_modules/commander/package-support.json +16 -0
- package/server/whatsapp-rpc/node_modules/commander/package.json +80 -0
- package/server/whatsapp-rpc/node_modules/commander/typings/esm.d.mts +3 -0
- package/server/whatsapp-rpc/node_modules/commander/typings/index.d.ts +884 -0
- package/server/whatsapp-rpc/node_modules/cross-spawn/LICENSE +21 -0
- package/server/whatsapp-rpc/node_modules/cross-spawn/README.md +89 -0
- package/server/whatsapp-rpc/node_modules/cross-spawn/index.js +39 -0
- package/server/whatsapp-rpc/node_modules/cross-spawn/lib/enoent.js +59 -0
- package/server/whatsapp-rpc/node_modules/cross-spawn/lib/parse.js +91 -0
- package/server/whatsapp-rpc/node_modules/cross-spawn/lib/util/escape.js +47 -0
- package/server/whatsapp-rpc/node_modules/cross-spawn/lib/util/readShebang.js +23 -0
- package/server/whatsapp-rpc/node_modules/cross-spawn/lib/util/resolveCommand.js +52 -0
- package/server/whatsapp-rpc/node_modules/cross-spawn/package.json +73 -0
- package/server/whatsapp-rpc/node_modules/execa/index.d.ts +955 -0
- package/server/whatsapp-rpc/node_modules/execa/index.js +309 -0
- package/server/whatsapp-rpc/node_modules/execa/lib/command.js +119 -0
- package/server/whatsapp-rpc/node_modules/execa/lib/error.js +87 -0
- package/server/whatsapp-rpc/node_modules/execa/lib/kill.js +102 -0
- package/server/whatsapp-rpc/node_modules/execa/lib/pipe.js +42 -0
- package/server/whatsapp-rpc/node_modules/execa/lib/promise.js +36 -0
- package/server/whatsapp-rpc/node_modules/execa/lib/stdio.js +49 -0
- package/server/whatsapp-rpc/node_modules/execa/lib/stream.js +133 -0
- package/server/whatsapp-rpc/node_modules/execa/lib/verbose.js +19 -0
- package/server/whatsapp-rpc/node_modules/execa/license +9 -0
- package/server/whatsapp-rpc/node_modules/execa/package.json +90 -0
- package/server/whatsapp-rpc/node_modules/execa/readme.md +822 -0
- package/server/whatsapp-rpc/node_modules/get-stream/license +9 -0
- package/server/whatsapp-rpc/node_modules/get-stream/package.json +53 -0
- package/server/whatsapp-rpc/node_modules/get-stream/readme.md +291 -0
- package/server/whatsapp-rpc/node_modules/get-stream/source/array-buffer.js +84 -0
- package/server/whatsapp-rpc/node_modules/get-stream/source/array.js +32 -0
- package/server/whatsapp-rpc/node_modules/get-stream/source/buffer.js +20 -0
- package/server/whatsapp-rpc/node_modules/get-stream/source/contents.js +101 -0
- package/server/whatsapp-rpc/node_modules/get-stream/source/index.d.ts +119 -0
- package/server/whatsapp-rpc/node_modules/get-stream/source/index.js +5 -0
- package/server/whatsapp-rpc/node_modules/get-stream/source/string.js +36 -0
- package/server/whatsapp-rpc/node_modules/get-stream/source/utils.js +11 -0
- package/server/whatsapp-rpc/node_modules/get-them-args/LICENSE +21 -0
- package/server/whatsapp-rpc/node_modules/get-them-args/README.md +95 -0
- package/server/whatsapp-rpc/node_modules/get-them-args/index.js +97 -0
- package/server/whatsapp-rpc/node_modules/get-them-args/package.json +36 -0
- package/server/whatsapp-rpc/node_modules/human-signals/LICENSE +201 -0
- package/server/whatsapp-rpc/node_modules/human-signals/README.md +168 -0
- package/server/whatsapp-rpc/node_modules/human-signals/build/src/core.js +273 -0
- package/server/whatsapp-rpc/node_modules/human-signals/build/src/main.d.ts +73 -0
- package/server/whatsapp-rpc/node_modules/human-signals/build/src/main.js +70 -0
- package/server/whatsapp-rpc/node_modules/human-signals/build/src/realtime.js +16 -0
- package/server/whatsapp-rpc/node_modules/human-signals/build/src/signals.js +34 -0
- package/server/whatsapp-rpc/node_modules/human-signals/package.json +61 -0
- package/server/whatsapp-rpc/node_modules/is-stream/index.d.ts +81 -0
- package/server/whatsapp-rpc/node_modules/is-stream/index.js +29 -0
- package/server/whatsapp-rpc/node_modules/is-stream/license +9 -0
- package/server/whatsapp-rpc/node_modules/is-stream/package.json +44 -0
- package/server/whatsapp-rpc/node_modules/is-stream/readme.md +60 -0
- package/server/whatsapp-rpc/node_modules/isexe/LICENSE +15 -0
- package/server/whatsapp-rpc/node_modules/isexe/README.md +51 -0
- package/server/whatsapp-rpc/node_modules/isexe/index.js +57 -0
- package/server/whatsapp-rpc/node_modules/isexe/mode.js +41 -0
- package/server/whatsapp-rpc/node_modules/isexe/package.json +31 -0
- package/server/whatsapp-rpc/node_modules/isexe/test/basic.js +221 -0
- package/server/whatsapp-rpc/node_modules/isexe/windows.js +42 -0
- package/server/whatsapp-rpc/node_modules/kill-port/.editorconfig +12 -0
- package/server/whatsapp-rpc/node_modules/kill-port/.gitattributes +1 -0
- package/server/whatsapp-rpc/node_modules/kill-port/LICENSE +21 -0
- package/server/whatsapp-rpc/node_modules/kill-port/README.md +140 -0
- package/server/whatsapp-rpc/node_modules/kill-port/cli.js +25 -0
- package/server/whatsapp-rpc/node_modules/kill-port/example.js +21 -0
- package/server/whatsapp-rpc/node_modules/kill-port/index.js +46 -0
- package/server/whatsapp-rpc/node_modules/kill-port/logo.png +0 -0
- package/server/whatsapp-rpc/node_modules/kill-port/package.json +41 -0
- package/server/whatsapp-rpc/node_modules/kill-port/pnpm-lock.yaml +4606 -0
- package/server/whatsapp-rpc/node_modules/kill-port/test.js +16 -0
- package/server/whatsapp-rpc/node_modules/merge-stream/LICENSE +21 -0
- package/server/whatsapp-rpc/node_modules/merge-stream/README.md +78 -0
- package/server/whatsapp-rpc/node_modules/merge-stream/index.js +41 -0
- package/server/whatsapp-rpc/node_modules/merge-stream/package.json +19 -0
- package/server/whatsapp-rpc/node_modules/mimic-fn/index.d.ts +52 -0
- package/server/whatsapp-rpc/node_modules/mimic-fn/index.js +71 -0
- package/server/whatsapp-rpc/node_modules/mimic-fn/license +9 -0
- package/server/whatsapp-rpc/node_modules/mimic-fn/package.json +45 -0
- package/server/whatsapp-rpc/node_modules/mimic-fn/readme.md +90 -0
- package/server/whatsapp-rpc/node_modules/npm-run-path/index.d.ts +90 -0
- package/server/whatsapp-rpc/node_modules/npm-run-path/index.js +52 -0
- package/server/whatsapp-rpc/node_modules/npm-run-path/license +9 -0
- package/server/whatsapp-rpc/node_modules/npm-run-path/node_modules/path-key/index.d.ts +31 -0
- package/server/whatsapp-rpc/node_modules/npm-run-path/node_modules/path-key/index.js +12 -0
- package/server/whatsapp-rpc/node_modules/npm-run-path/node_modules/path-key/license +9 -0
- package/server/whatsapp-rpc/node_modules/npm-run-path/node_modules/path-key/package.json +41 -0
- package/server/whatsapp-rpc/node_modules/npm-run-path/node_modules/path-key/readme.md +57 -0
- package/server/whatsapp-rpc/node_modules/npm-run-path/package.json +49 -0
- package/server/whatsapp-rpc/node_modules/npm-run-path/readme.md +104 -0
- package/server/whatsapp-rpc/node_modules/onetime/index.d.ts +59 -0
- package/server/whatsapp-rpc/node_modules/onetime/index.js +41 -0
- package/server/whatsapp-rpc/node_modules/onetime/license +9 -0
- package/server/whatsapp-rpc/node_modules/onetime/package.json +45 -0
- package/server/whatsapp-rpc/node_modules/onetime/readme.md +94 -0
- package/server/whatsapp-rpc/node_modules/path-key/index.d.ts +40 -0
- package/server/whatsapp-rpc/node_modules/path-key/index.js +16 -0
- package/server/whatsapp-rpc/node_modules/path-key/license +9 -0
- package/server/whatsapp-rpc/node_modules/path-key/package.json +39 -0
- package/server/whatsapp-rpc/node_modules/path-key/readme.md +61 -0
- package/server/whatsapp-rpc/node_modules/shebang-command/index.js +19 -0
- package/server/whatsapp-rpc/node_modules/shebang-command/license +9 -0
- package/server/whatsapp-rpc/node_modules/shebang-command/package.json +34 -0
- package/server/whatsapp-rpc/node_modules/shebang-command/readme.md +34 -0
- package/server/whatsapp-rpc/node_modules/shebang-regex/index.d.ts +22 -0
- package/server/whatsapp-rpc/node_modules/shebang-regex/index.js +2 -0
- package/server/whatsapp-rpc/node_modules/shebang-regex/license +9 -0
- package/server/whatsapp-rpc/node_modules/shebang-regex/package.json +35 -0
- package/server/whatsapp-rpc/node_modules/shebang-regex/readme.md +33 -0
- package/server/whatsapp-rpc/node_modules/shell-exec/LICENSE +21 -0
- package/server/whatsapp-rpc/node_modules/shell-exec/README.md +60 -0
- package/server/whatsapp-rpc/node_modules/shell-exec/index.js +47 -0
- package/server/whatsapp-rpc/node_modules/shell-exec/package.json +29 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/LICENSE.txt +16 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/README.md +74 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/browser.d.ts +12 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/browser.d.ts.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/browser.js +10 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/browser.js.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/index.d.ts +48 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/index.d.ts.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/index.js +279 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/index.js.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/package.json +3 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/signals.d.ts +29 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/signals.d.ts.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/signals.js +42 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/cjs/signals.js.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/browser.d.ts +12 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/browser.d.ts.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/browser.js +4 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/browser.js.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/index.d.ts +48 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/index.d.ts.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/index.js +275 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/index.js.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/package.json +3 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/signals.d.ts +29 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/signals.d.ts.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/signals.js +39 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/dist/mjs/signals.js.map +1 -0
- package/server/whatsapp-rpc/node_modules/signal-exit/package.json +106 -0
- package/server/whatsapp-rpc/node_modules/strip-final-newline/index.js +14 -0
- package/server/whatsapp-rpc/node_modules/strip-final-newline/license +9 -0
- package/server/whatsapp-rpc/node_modules/strip-final-newline/package.json +43 -0
- package/server/whatsapp-rpc/node_modules/strip-final-newline/readme.md +35 -0
- package/server/whatsapp-rpc/node_modules/which/CHANGELOG.md +166 -0
- package/server/whatsapp-rpc/node_modules/which/LICENSE +15 -0
- package/server/whatsapp-rpc/node_modules/which/README.md +54 -0
- package/server/whatsapp-rpc/node_modules/which/bin/node-which +52 -0
- package/server/whatsapp-rpc/node_modules/which/package.json +43 -0
- package/server/whatsapp-rpc/node_modules/which/which.js +125 -0
- package/server/whatsapp-rpc/package-lock.json +272 -0
- package/server/whatsapp-rpc/package.json +30 -30
- package/server/whatsapp-rpc/schema.json +1294 -1294
- package/server/whatsapp-rpc/scripts/clean.cjs +66 -66
- package/server/whatsapp-rpc/scripts/cli.js +162 -162
- package/server/whatsapp-rpc/src/go/whatsapp/history.go +166 -166
- package/server/whatsapp-rpc/src/python/pyproject.toml +15 -15
- package/server/whatsapp-rpc/src/python/whatsapp_rpc/__init__.py +4 -4
- package/server/whatsapp-rpc/src/python/whatsapp_rpc/client.py +427 -427
- package/server/whatsapp-rpc/web/app.py +609 -609
- package/server/whatsapp-rpc/web/requirements.txt +6 -6
- package/server/whatsapp-rpc/web/rpc_client.py +427 -427
- package/server/whatsapp-rpc/web/static/openapi.yaml +59 -59
- package/server/whatsapp-rpc/web/templates/base.html +149 -149
- package/server/whatsapp-rpc/web/templates/contacts.html +240 -240
- package/server/whatsapp-rpc/web/templates/dashboard.html +319 -319
- package/server/whatsapp-rpc/web/templates/groups.html +328 -328
- package/server/whatsapp-rpc/web/templates/messages.html +465 -465
- package/server/whatsapp-rpc/web/templates/messaging.html +680 -680
- package/server/whatsapp-rpc/web/templates/send.html +258 -258
- package/server/whatsapp-rpc/web/templates/settings.html +459 -459
- package/client/src/components/ui/AndroidSettingsPanel.tsx +0 -401
- package/client/src/components/ui/WhatsAppSettingsPanel.tsx +0 -345
- package/client/src/nodeDefinitions/androidDeviceNodes.ts +0 -140
- package/docker-compose.prod.yml +0 -107
- package/docker-compose.yml +0 -104
- package/docs-MachinaOs/README.md +0 -85
- package/docs-MachinaOs/deployment/docker.mdx +0 -228
- package/docs-MachinaOs/deployment/production.mdx +0 -345
- package/docs-MachinaOs/docs.json +0 -75
- package/docs-MachinaOs/faq.mdx +0 -309
- package/docs-MachinaOs/favicon.svg +0 -5
- package/docs-MachinaOs/installation.mdx +0 -160
- package/docs-MachinaOs/introduction.mdx +0 -114
- package/docs-MachinaOs/logo/dark.svg +0 -6
- package/docs-MachinaOs/logo/light.svg +0 -6
- package/docs-MachinaOs/nodes/ai-agent.mdx +0 -216
- package/docs-MachinaOs/nodes/ai-models.mdx +0 -240
- package/docs-MachinaOs/nodes/android.mdx +0 -411
- package/docs-MachinaOs/nodes/overview.mdx +0 -181
- package/docs-MachinaOs/nodes/schedulers.mdx +0 -316
- package/docs-MachinaOs/nodes/webhooks.mdx +0 -330
- package/docs-MachinaOs/nodes/whatsapp.mdx +0 -305
- package/docs-MachinaOs/quickstart.mdx +0 -119
- package/docs-MachinaOs/tutorials/ai-agent-workflow.mdx +0 -177
- package/docs-MachinaOs/tutorials/android-automation.mdx +0 -242
- package/docs-MachinaOs/tutorials/first-workflow.mdx +0 -134
- package/docs-MachinaOs/tutorials/whatsapp-automation.mdx +0 -185
- package/nul +0 -0
- package/scripts/check-ports.ps1 +0 -33
- package/scripts/kill-port.ps1 +0 -154
|
@@ -1,251 +1,251 @@
|
|
|
1
|
-
"""Temporal worker for distributed node execution.
|
|
2
|
-
|
|
3
|
-
Uses class-based activities with shared aiohttp session for proper
|
|
4
|
-
connection pooling across concurrent activity executions.
|
|
5
|
-
|
|
6
|
-
The worker polls the task queue and executes:
|
|
7
|
-
- MachinaWorkflow: Orchestrates the graph, schedules node activities
|
|
8
|
-
- NodeExecutionActivities: Executes individual nodes with shared session
|
|
9
|
-
|
|
10
|
-
Multiple workers can be started on different machines for horizontal scaling.
|
|
11
|
-
Each node activity can execute on any available worker in the cluster.
|
|
12
|
-
|
|
13
|
-
References:
|
|
14
|
-
- https://docs.temporal.io/develop/python/python-sdk-sync-vs-async
|
|
15
|
-
- https://docs.temporal.io/develop/worker-performance
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
import asyncio
|
|
19
|
-
from typing import Optional
|
|
20
|
-
|
|
21
|
-
import aiohttp
|
|
22
|
-
from temporalio.client import Client
|
|
23
|
-
from temporalio.runtime import Runtime, TelemetryConfig
|
|
24
|
-
from temporalio.worker import Worker
|
|
25
|
-
|
|
26
|
-
from core.logging import get_logger
|
|
27
|
-
from .workflow import MachinaWorkflow
|
|
28
|
-
print(f"[Worker Import] MachinaWorkflow loaded from: {MachinaWorkflow.__module__}")
|
|
29
|
-
from .activities import (
|
|
30
|
-
NodeExecutionActivities,
|
|
31
|
-
create_shared_session,
|
|
32
|
-
execute_node_activity,
|
|
33
|
-
)
|
|
34
|
-
|
|
35
|
-
logger = get_logger(__name__)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def create_runtime() -> Runtime:
|
|
39
|
-
"""Create a Temporal runtime with worker heartbeating disabled.
|
|
40
|
-
|
|
41
|
-
Disables the runtime-level worker heartbeating feature to avoid
|
|
42
|
-
the warning on older Temporal server versions that don't support it.
|
|
43
|
-
"""
|
|
44
|
-
return Runtime(
|
|
45
|
-
telemetry=TelemetryConfig(),
|
|
46
|
-
worker_heartbeat_interval=None, # Disable runtime heartbeating
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
class TemporalWorkerManager:
|
|
51
|
-
"""Manages the Temporal worker lifecycle with shared resources.
|
|
52
|
-
|
|
53
|
-
Creates a shared aiohttp.ClientSession that is passed to the activity
|
|
54
|
-
class, following Temporal's recommended dependency injection pattern.
|
|
55
|
-
"""
|
|
56
|
-
|
|
57
|
-
def __init__(
|
|
58
|
-
self,
|
|
59
|
-
client: Client,
|
|
60
|
-
task_queue: str = "machina-tasks",
|
|
61
|
-
pool_size: int = 100,
|
|
62
|
-
):
|
|
63
|
-
"""Initialize the worker manager.
|
|
64
|
-
|
|
65
|
-
Args:
|
|
66
|
-
client: Connected Temporal client
|
|
67
|
-
task_queue: Task queue name to poll
|
|
68
|
-
pool_size: Connection pool size for aiohttp session
|
|
69
|
-
"""
|
|
70
|
-
self.client = client
|
|
71
|
-
self.task_queue = task_queue
|
|
72
|
-
self.pool_size = pool_size
|
|
73
|
-
self._worker: Optional[Worker] = None
|
|
74
|
-
self._worker_task: Optional[asyncio.Task] = None
|
|
75
|
-
self._session: Optional[aiohttp.ClientSession] = None
|
|
76
|
-
self._activities: Optional[NodeExecutionActivities] = None
|
|
77
|
-
|
|
78
|
-
@property
|
|
79
|
-
def is_running(self) -> bool:
|
|
80
|
-
"""Check if the worker is running."""
|
|
81
|
-
return self._worker_task is not None and not self._worker_task.done()
|
|
82
|
-
|
|
83
|
-
async def start(self) -> None:
|
|
84
|
-
"""Start the Temporal worker in the background."""
|
|
85
|
-
if self.is_running:
|
|
86
|
-
logger.warning("Temporal worker already running")
|
|
87
|
-
return
|
|
88
|
-
|
|
89
|
-
# Create shared aiohttp session with connection pooling
|
|
90
|
-
self._session = await create_shared_session(self.pool_size)
|
|
91
|
-
|
|
92
|
-
# Create activity instance with shared session
|
|
93
|
-
self._activities = NodeExecutionActivities(self._session)
|
|
94
|
-
|
|
95
|
-
# Create worker with class-based activity
|
|
96
|
-
# For class-based activities, pass the bound method (instance.method)
|
|
97
|
-
self._worker = Worker(
|
|
98
|
-
self.client,
|
|
99
|
-
task_queue=self.task_queue,
|
|
100
|
-
workflows=[MachinaWorkflow],
|
|
101
|
-
activities=[self._activities.execute_node_activity], # Pass bound method
|
|
102
|
-
# Allow concurrent activity execution for parallel branches
|
|
103
|
-
max_concurrent_activities=self.pool_size,
|
|
104
|
-
max_concurrent_workflow_tasks=10,
|
|
105
|
-
)
|
|
106
|
-
|
|
107
|
-
logger.info(
|
|
108
|
-
"Starting Temporal worker",
|
|
109
|
-
task_queue=self.task_queue,
|
|
110
|
-
pool_size=self.pool_size,
|
|
111
|
-
)
|
|
112
|
-
print(f"[Worker] Starting with pool_size={self.pool_size}")
|
|
113
|
-
|
|
114
|
-
# Run worker in background task
|
|
115
|
-
self._worker_task = asyncio.create_task(
|
|
116
|
-
self._run_worker(),
|
|
117
|
-
name="temporal-worker",
|
|
118
|
-
)
|
|
119
|
-
|
|
120
|
-
async def _run_worker(self) -> None:
|
|
121
|
-
"""Run the worker (background task)."""
|
|
122
|
-
try:
|
|
123
|
-
await self._worker.run()
|
|
124
|
-
except asyncio.CancelledError:
|
|
125
|
-
logger.info("Temporal worker cancelled")
|
|
126
|
-
except Exception as e:
|
|
127
|
-
logger.error(f"Temporal worker error: {str(e)}")
|
|
128
|
-
raise
|
|
129
|
-
|
|
130
|
-
async def stop(self) -> None:
|
|
131
|
-
"""Stop the Temporal worker and cleanup resources."""
|
|
132
|
-
if not self.is_running:
|
|
133
|
-
return
|
|
134
|
-
|
|
135
|
-
logger.info("Stopping Temporal worker")
|
|
136
|
-
|
|
137
|
-
if self._worker_task:
|
|
138
|
-
self._worker_task.cancel()
|
|
139
|
-
try:
|
|
140
|
-
await self._worker_task
|
|
141
|
-
except asyncio.CancelledError:
|
|
142
|
-
pass
|
|
143
|
-
self._worker_task = None
|
|
144
|
-
|
|
145
|
-
# Close shared session
|
|
146
|
-
if self._session and not self._session.closed:
|
|
147
|
-
await self._session.close()
|
|
148
|
-
print("[Worker] Closed shared session")
|
|
149
|
-
|
|
150
|
-
self._worker = None
|
|
151
|
-
self._session = None
|
|
152
|
-
self._activities = None
|
|
153
|
-
logger.info("Temporal worker stopped")
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
async def run_standalone_worker(
|
|
157
|
-
server_address: str = "localhost:7233",
|
|
158
|
-
namespace: str = "default",
|
|
159
|
-
task_queue: str = "machina-tasks",
|
|
160
|
-
pool_size: int = 100,
|
|
161
|
-
) -> None:
|
|
162
|
-
"""Run the Temporal worker as a standalone process.
|
|
163
|
-
|
|
164
|
-
This can be used for running workers separately from the main server,
|
|
165
|
-
enabling horizontal scaling across multiple machines.
|
|
166
|
-
|
|
167
|
-
Example:
|
|
168
|
-
# Start multiple workers for horizontal scaling
|
|
169
|
-
python -m services.temporal.worker
|
|
170
|
-
|
|
171
|
-
Args:
|
|
172
|
-
server_address: Temporal server address
|
|
173
|
-
namespace: Temporal namespace
|
|
174
|
-
task_queue: Task queue to poll
|
|
175
|
-
pool_size: Connection pool size
|
|
176
|
-
"""
|
|
177
|
-
logger.info(
|
|
178
|
-
"Starting standalone Temporal worker",
|
|
179
|
-
server_address=server_address,
|
|
180
|
-
namespace=namespace,
|
|
181
|
-
task_queue=task_queue,
|
|
182
|
-
)
|
|
183
|
-
|
|
184
|
-
print(f"[Worker] Connecting to {server_address}")
|
|
185
|
-
print(f"[Worker] Namespace: {namespace}")
|
|
186
|
-
print(f"[Worker] Task Queue: {task_queue}")
|
|
187
|
-
print(f"[Worker] Pool Size: {pool_size}")
|
|
188
|
-
|
|
189
|
-
# Use custom runtime with heartbeating disabled to avoid warning on older servers
|
|
190
|
-
runtime = create_runtime()
|
|
191
|
-
client = await Client.connect(server_address, namespace=namespace, runtime=runtime)
|
|
192
|
-
|
|
193
|
-
# Create shared session and activities
|
|
194
|
-
session = await create_shared_session(pool_size)
|
|
195
|
-
activities = NodeExecutionActivities(session)
|
|
196
|
-
|
|
197
|
-
try:
|
|
198
|
-
worker = Worker(
|
|
199
|
-
client,
|
|
200
|
-
task_queue=task_queue,
|
|
201
|
-
workflows=[MachinaWorkflow],
|
|
202
|
-
activities=[activities.execute_node_activity], # Pass bound method
|
|
203
|
-
max_concurrent_activities=pool_size,
|
|
204
|
-
max_concurrent_workflow_tasks=10,
|
|
205
|
-
)
|
|
206
|
-
|
|
207
|
-
print("[Worker] Running. Press Ctrl+C to stop.")
|
|
208
|
-
logger.info("Worker running. Press Ctrl+C to stop.")
|
|
209
|
-
await worker.run()
|
|
210
|
-
|
|
211
|
-
finally:
|
|
212
|
-
# Cleanup session on shutdown
|
|
213
|
-
if not session.closed:
|
|
214
|
-
await session.close()
|
|
215
|
-
print("[Worker] Session closed")
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
async def create_worker(
|
|
219
|
-
client: Client,
|
|
220
|
-
task_queue: str = "machina-tasks",
|
|
221
|
-
session: Optional[aiohttp.ClientSession] = None,
|
|
222
|
-
) -> Worker:
|
|
223
|
-
"""Create a worker instance for use in tests or custom setups.
|
|
224
|
-
|
|
225
|
-
Args:
|
|
226
|
-
client: Connected Temporal client
|
|
227
|
-
task_queue: Task queue name
|
|
228
|
-
session: Optional shared aiohttp session (created if not provided)
|
|
229
|
-
|
|
230
|
-
Returns:
|
|
231
|
-
Configured Worker instance (not started)
|
|
232
|
-
"""
|
|
233
|
-
if session is None:
|
|
234
|
-
session = await create_shared_session()
|
|
235
|
-
|
|
236
|
-
activities = NodeExecutionActivities(session)
|
|
237
|
-
|
|
238
|
-
return Worker(
|
|
239
|
-
client,
|
|
240
|
-
task_queue=task_queue,
|
|
241
|
-
workflows=[MachinaWorkflow],
|
|
242
|
-
activities=[activities.execute_node_activity], # Pass bound method
|
|
243
|
-
max_concurrent_activities=100,
|
|
244
|
-
max_concurrent_workflow_tasks=10,
|
|
245
|
-
)
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
if __name__ == "__main__":
|
|
249
|
-
# Allow running worker standalone
|
|
250
|
-
# Usage: python -m services.temporal.worker
|
|
251
|
-
asyncio.run(run_standalone_worker())
|
|
1
|
+
"""Temporal worker for distributed node execution.
|
|
2
|
+
|
|
3
|
+
Uses class-based activities with shared aiohttp session for proper
|
|
4
|
+
connection pooling across concurrent activity executions.
|
|
5
|
+
|
|
6
|
+
The worker polls the task queue and executes:
|
|
7
|
+
- MachinaWorkflow: Orchestrates the graph, schedules node activities
|
|
8
|
+
- NodeExecutionActivities: Executes individual nodes with shared session
|
|
9
|
+
|
|
10
|
+
Multiple workers can be started on different machines for horizontal scaling.
|
|
11
|
+
Each node activity can execute on any available worker in the cluster.
|
|
12
|
+
|
|
13
|
+
References:
|
|
14
|
+
- https://docs.temporal.io/develop/python/python-sdk-sync-vs-async
|
|
15
|
+
- https://docs.temporal.io/develop/worker-performance
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
import asyncio
|
|
19
|
+
from typing import Optional
|
|
20
|
+
|
|
21
|
+
import aiohttp
|
|
22
|
+
from temporalio.client import Client
|
|
23
|
+
from temporalio.runtime import Runtime, TelemetryConfig
|
|
24
|
+
from temporalio.worker import Worker
|
|
25
|
+
|
|
26
|
+
from core.logging import get_logger
|
|
27
|
+
from .workflow import MachinaWorkflow
|
|
28
|
+
print(f"[Worker Import] MachinaWorkflow loaded from: {MachinaWorkflow.__module__}")
|
|
29
|
+
from .activities import (
|
|
30
|
+
NodeExecutionActivities,
|
|
31
|
+
create_shared_session,
|
|
32
|
+
execute_node_activity,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
logger = get_logger(__name__)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def create_runtime() -> Runtime:
|
|
39
|
+
"""Create a Temporal runtime with worker heartbeating disabled.
|
|
40
|
+
|
|
41
|
+
Disables the runtime-level worker heartbeating feature to avoid
|
|
42
|
+
the warning on older Temporal server versions that don't support it.
|
|
43
|
+
"""
|
|
44
|
+
return Runtime(
|
|
45
|
+
telemetry=TelemetryConfig(),
|
|
46
|
+
worker_heartbeat_interval=None, # Disable runtime heartbeating
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class TemporalWorkerManager:
|
|
51
|
+
"""Manages the Temporal worker lifecycle with shared resources.
|
|
52
|
+
|
|
53
|
+
Creates a shared aiohttp.ClientSession that is passed to the activity
|
|
54
|
+
class, following Temporal's recommended dependency injection pattern.
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
def __init__(
|
|
58
|
+
self,
|
|
59
|
+
client: Client,
|
|
60
|
+
task_queue: str = "machina-tasks",
|
|
61
|
+
pool_size: int = 100,
|
|
62
|
+
):
|
|
63
|
+
"""Initialize the worker manager.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
client: Connected Temporal client
|
|
67
|
+
task_queue: Task queue name to poll
|
|
68
|
+
pool_size: Connection pool size for aiohttp session
|
|
69
|
+
"""
|
|
70
|
+
self.client = client
|
|
71
|
+
self.task_queue = task_queue
|
|
72
|
+
self.pool_size = pool_size
|
|
73
|
+
self._worker: Optional[Worker] = None
|
|
74
|
+
self._worker_task: Optional[asyncio.Task] = None
|
|
75
|
+
self._session: Optional[aiohttp.ClientSession] = None
|
|
76
|
+
self._activities: Optional[NodeExecutionActivities] = None
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def is_running(self) -> bool:
|
|
80
|
+
"""Check if the worker is running."""
|
|
81
|
+
return self._worker_task is not None and not self._worker_task.done()
|
|
82
|
+
|
|
83
|
+
async def start(self) -> None:
|
|
84
|
+
"""Start the Temporal worker in the background."""
|
|
85
|
+
if self.is_running:
|
|
86
|
+
logger.warning("Temporal worker already running")
|
|
87
|
+
return
|
|
88
|
+
|
|
89
|
+
# Create shared aiohttp session with connection pooling
|
|
90
|
+
self._session = await create_shared_session(self.pool_size)
|
|
91
|
+
|
|
92
|
+
# Create activity instance with shared session
|
|
93
|
+
self._activities = NodeExecutionActivities(self._session)
|
|
94
|
+
|
|
95
|
+
# Create worker with class-based activity
|
|
96
|
+
# For class-based activities, pass the bound method (instance.method)
|
|
97
|
+
self._worker = Worker(
|
|
98
|
+
self.client,
|
|
99
|
+
task_queue=self.task_queue,
|
|
100
|
+
workflows=[MachinaWorkflow],
|
|
101
|
+
activities=[self._activities.execute_node_activity], # Pass bound method
|
|
102
|
+
# Allow concurrent activity execution for parallel branches
|
|
103
|
+
max_concurrent_activities=self.pool_size,
|
|
104
|
+
max_concurrent_workflow_tasks=10,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
logger.info(
|
|
108
|
+
"Starting Temporal worker",
|
|
109
|
+
task_queue=self.task_queue,
|
|
110
|
+
pool_size=self.pool_size,
|
|
111
|
+
)
|
|
112
|
+
print(f"[Worker] Starting with pool_size={self.pool_size}")
|
|
113
|
+
|
|
114
|
+
# Run worker in background task
|
|
115
|
+
self._worker_task = asyncio.create_task(
|
|
116
|
+
self._run_worker(),
|
|
117
|
+
name="temporal-worker",
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
async def _run_worker(self) -> None:
|
|
121
|
+
"""Run the worker (background task)."""
|
|
122
|
+
try:
|
|
123
|
+
await self._worker.run()
|
|
124
|
+
except asyncio.CancelledError:
|
|
125
|
+
logger.info("Temporal worker cancelled")
|
|
126
|
+
except Exception as e:
|
|
127
|
+
logger.error(f"Temporal worker error: {str(e)}")
|
|
128
|
+
raise
|
|
129
|
+
|
|
130
|
+
async def stop(self) -> None:
|
|
131
|
+
"""Stop the Temporal worker and cleanup resources."""
|
|
132
|
+
if not self.is_running:
|
|
133
|
+
return
|
|
134
|
+
|
|
135
|
+
logger.info("Stopping Temporal worker")
|
|
136
|
+
|
|
137
|
+
if self._worker_task:
|
|
138
|
+
self._worker_task.cancel()
|
|
139
|
+
try:
|
|
140
|
+
await self._worker_task
|
|
141
|
+
except asyncio.CancelledError:
|
|
142
|
+
pass
|
|
143
|
+
self._worker_task = None
|
|
144
|
+
|
|
145
|
+
# Close shared session
|
|
146
|
+
if self._session and not self._session.closed:
|
|
147
|
+
await self._session.close()
|
|
148
|
+
print("[Worker] Closed shared session")
|
|
149
|
+
|
|
150
|
+
self._worker = None
|
|
151
|
+
self._session = None
|
|
152
|
+
self._activities = None
|
|
153
|
+
logger.info("Temporal worker stopped")
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
async def run_standalone_worker(
|
|
157
|
+
server_address: str = "localhost:7233",
|
|
158
|
+
namespace: str = "default",
|
|
159
|
+
task_queue: str = "machina-tasks",
|
|
160
|
+
pool_size: int = 100,
|
|
161
|
+
) -> None:
|
|
162
|
+
"""Run the Temporal worker as a standalone process.
|
|
163
|
+
|
|
164
|
+
This can be used for running workers separately from the main server,
|
|
165
|
+
enabling horizontal scaling across multiple machines.
|
|
166
|
+
|
|
167
|
+
Example:
|
|
168
|
+
# Start multiple workers for horizontal scaling
|
|
169
|
+
python -m services.temporal.worker
|
|
170
|
+
|
|
171
|
+
Args:
|
|
172
|
+
server_address: Temporal server address
|
|
173
|
+
namespace: Temporal namespace
|
|
174
|
+
task_queue: Task queue to poll
|
|
175
|
+
pool_size: Connection pool size
|
|
176
|
+
"""
|
|
177
|
+
logger.info(
|
|
178
|
+
"Starting standalone Temporal worker",
|
|
179
|
+
server_address=server_address,
|
|
180
|
+
namespace=namespace,
|
|
181
|
+
task_queue=task_queue,
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
print(f"[Worker] Connecting to {server_address}")
|
|
185
|
+
print(f"[Worker] Namespace: {namespace}")
|
|
186
|
+
print(f"[Worker] Task Queue: {task_queue}")
|
|
187
|
+
print(f"[Worker] Pool Size: {pool_size}")
|
|
188
|
+
|
|
189
|
+
# Use custom runtime with heartbeating disabled to avoid warning on older servers
|
|
190
|
+
runtime = create_runtime()
|
|
191
|
+
client = await Client.connect(server_address, namespace=namespace, runtime=runtime)
|
|
192
|
+
|
|
193
|
+
# Create shared session and activities
|
|
194
|
+
session = await create_shared_session(pool_size)
|
|
195
|
+
activities = NodeExecutionActivities(session)
|
|
196
|
+
|
|
197
|
+
try:
|
|
198
|
+
worker = Worker(
|
|
199
|
+
client,
|
|
200
|
+
task_queue=task_queue,
|
|
201
|
+
workflows=[MachinaWorkflow],
|
|
202
|
+
activities=[activities.execute_node_activity], # Pass bound method
|
|
203
|
+
max_concurrent_activities=pool_size,
|
|
204
|
+
max_concurrent_workflow_tasks=10,
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
print("[Worker] Running. Press Ctrl+C to stop.")
|
|
208
|
+
logger.info("Worker running. Press Ctrl+C to stop.")
|
|
209
|
+
await worker.run()
|
|
210
|
+
|
|
211
|
+
finally:
|
|
212
|
+
# Cleanup session on shutdown
|
|
213
|
+
if not session.closed:
|
|
214
|
+
await session.close()
|
|
215
|
+
print("[Worker] Session closed")
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
async def create_worker(
|
|
219
|
+
client: Client,
|
|
220
|
+
task_queue: str = "machina-tasks",
|
|
221
|
+
session: Optional[aiohttp.ClientSession] = None,
|
|
222
|
+
) -> Worker:
|
|
223
|
+
"""Create a worker instance for use in tests or custom setups.
|
|
224
|
+
|
|
225
|
+
Args:
|
|
226
|
+
client: Connected Temporal client
|
|
227
|
+
task_queue: Task queue name
|
|
228
|
+
session: Optional shared aiohttp session (created if not provided)
|
|
229
|
+
|
|
230
|
+
Returns:
|
|
231
|
+
Configured Worker instance (not started)
|
|
232
|
+
"""
|
|
233
|
+
if session is None:
|
|
234
|
+
session = await create_shared_session()
|
|
235
|
+
|
|
236
|
+
activities = NodeExecutionActivities(session)
|
|
237
|
+
|
|
238
|
+
return Worker(
|
|
239
|
+
client,
|
|
240
|
+
task_queue=task_queue,
|
|
241
|
+
workflows=[MachinaWorkflow],
|
|
242
|
+
activities=[activities.execute_node_activity], # Pass bound method
|
|
243
|
+
max_concurrent_activities=100,
|
|
244
|
+
max_concurrent_workflow_tasks=10,
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
if __name__ == "__main__":
|
|
249
|
+
# Allow running worker standalone
|
|
250
|
+
# Usage: python -m services.temporal.worker
|
|
251
|
+
asyncio.run(run_standalone_worker())
|