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,355 +1,390 @@
|
|
|
1
|
-
"""AI node handlers - AI Agent,
|
|
2
|
-
|
|
3
|
-
from typing import Dict, Any, List, Optional, TYPE_CHECKING
|
|
4
|
-
from core.logging import get_logger
|
|
5
|
-
from constants import ANDROID_SERVICE_NODE_TYPES
|
|
6
|
-
|
|
7
|
-
if TYPE_CHECKING:
|
|
8
|
-
from services.ai import AIService
|
|
9
|
-
from core.database import Database
|
|
10
|
-
|
|
11
|
-
logger = get_logger(__name__)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
async def handle_ai_agent(
|
|
15
|
-
node_id: str,
|
|
16
|
-
node_type: str,
|
|
17
|
-
parameters: Dict[str, Any],
|
|
18
|
-
context: Dict[str, Any],
|
|
19
|
-
ai_service: "AIService",
|
|
20
|
-
database: "Database"
|
|
21
|
-
) -> Dict[str, Any]:
|
|
22
|
-
"""Handle AI agent node execution with memory and tool support.
|
|
23
|
-
|
|
24
|
-
Args:
|
|
25
|
-
node_id: The node ID
|
|
26
|
-
node_type: The node type (aiAgent)
|
|
27
|
-
parameters: Resolved parameters
|
|
28
|
-
context: Execution context with nodes, edges, session_id, start_time, execution_id
|
|
29
|
-
ai_service: The AI service instance
|
|
30
|
-
database: The database instance
|
|
31
|
-
|
|
32
|
-
Returns:
|
|
33
|
-
Execution result dict
|
|
34
|
-
"""
|
|
35
|
-
nodes = context.get('nodes')
|
|
36
|
-
edges = context.get('edges')
|
|
37
|
-
execution_id = context.get('execution_id', 'unknown')
|
|
38
|
-
workflow_id = context.get('workflow_id') # Extract for status broadcasts
|
|
39
|
-
memory_data = None
|
|
40
|
-
tool_data: List[Dict[str, Any]] = [] # Collect connected tool nodes
|
|
41
|
-
|
|
42
|
-
logger.info(f"[AI Agent] Processing node {node_id}, edges={len(edges) if edges else 0}, nodes={len(nodes) if nodes else 0}, workflow_id={workflow_id}")
|
|
43
|
-
|
|
44
|
-
if edges and nodes:
|
|
45
|
-
# Log all edges targeting this AI Agent for debugging
|
|
46
|
-
incoming_edges = [e for e in edges if e.get('target') == node_id]
|
|
47
|
-
logger.info(f"[AI Agent] Incoming edges to {node_id}: {len(incoming_edges)}")
|
|
48
|
-
for e in incoming_edges:
|
|
49
|
-
logger.info(f"[AI Agent] Edge: source={e.get('source')}, targetHandle={e.get('targetHandle')}")
|
|
50
|
-
|
|
51
|
-
# Check for tool edges specifically
|
|
52
|
-
tool_incoming = [e for e in incoming_edges if e.get('targetHandle') == 'input-tools']
|
|
53
|
-
logger.info(f"[AI Agent] Tool edges (input-tools handle): {len(tool_incoming)}")
|
|
54
|
-
|
|
55
|
-
for edge in edges:
|
|
56
|
-
if edge.get('target') != node_id:
|
|
57
|
-
continue
|
|
58
|
-
|
|
59
|
-
target_handle = edge.get('targetHandle')
|
|
60
|
-
source_node_id = edge.get('source')
|
|
61
|
-
source_node = next((n for n in nodes if n.get('id') == source_node_id), None)
|
|
62
|
-
|
|
63
|
-
if not source_node:
|
|
64
|
-
continue
|
|
65
|
-
|
|
66
|
-
# Memory detection - load markdown content for editing
|
|
67
|
-
if target_handle == 'input-memory':
|
|
68
|
-
if source_node.get('type') == 'simpleMemory':
|
|
69
|
-
memory_params = await database.get_node_parameters(source_node_id) or {}
|
|
70
|
-
memory_session_id = memory_params.get('sessionId', 'default')
|
|
71
|
-
window_size = int(memory_params.get('windowSize', 10))
|
|
72
|
-
memory_content = memory_params.get('memoryContent', '# Conversation History\n\n*No messages yet.*\n')
|
|
73
|
-
long_term_enabled = memory_params.get('longTermEnabled', False)
|
|
74
|
-
retrieval_count = int(memory_params.get('retrievalCount', 3))
|
|
75
|
-
|
|
76
|
-
memory_data = {
|
|
77
|
-
'node_id': source_node_id, # For saving updated content
|
|
78
|
-
'session_id': memory_session_id,
|
|
79
|
-
'window_size': window_size,
|
|
80
|
-
'memory_content': memory_content,
|
|
81
|
-
'long_term_enabled': long_term_enabled,
|
|
82
|
-
'retrieval_count': retrieval_count
|
|
83
|
-
}
|
|
84
|
-
logger.debug("AI Agent connected memory node", memory_session=memory_session_id, content_length=len(memory_content))
|
|
85
|
-
|
|
86
|
-
# Tool detection (new) - any node connected to input-tools becomes a tool
|
|
87
|
-
elif target_handle == 'input-tools':
|
|
88
|
-
tool_type = source_node.get('type')
|
|
89
|
-
logger.info(f"[AI Agent] Found tool connected via input-tools: type={tool_type}, node_id={source_node_id}")
|
|
90
|
-
tool_params = await database.get_node_parameters(source_node_id) or {}
|
|
91
|
-
|
|
92
|
-
# Build base tool entry
|
|
93
|
-
tool_entry = {
|
|
94
|
-
'node_id': source_node_id,
|
|
95
|
-
'node_type': tool_type,
|
|
96
|
-
'parameters': tool_params,
|
|
97
|
-
'label': source_node.get('data', {}).get('label', tool_type)
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
# Special handling for androidTool - discover connected Android services
|
|
101
|
-
# Follows n8n Sub-Node pattern
|
|
102
|
-
if tool_type == 'androidTool':
|
|
103
|
-
connected_services = []
|
|
104
|
-
|
|
105
|
-
# Scan edges for Android nodes connected to this toolkit
|
|
106
|
-
for service_edge in edges:
|
|
107
|
-
# Skip if not targeting this androidTool node
|
|
108
|
-
if service_edge.get('target') != source_node_id:
|
|
109
|
-
continue
|
|
110
|
-
|
|
111
|
-
target_handle = service_edge.get('targetHandle')
|
|
112
|
-
# Accept input-main or no handle (ReactFlow may omit handle for single-input nodes)
|
|
113
|
-
if target_handle is not None and target_handle != 'input-main':
|
|
114
|
-
logger.debug(f"[Android Toolkit] Skipping edge with targetHandle: {target_handle}")
|
|
115
|
-
continue
|
|
116
|
-
|
|
117
|
-
android_node_id = service_edge.get('source')
|
|
118
|
-
android_node = next((n for n in nodes if n.get('id') == android_node_id), None)
|
|
119
|
-
|
|
120
|
-
if android_node and android_node.get('type') in ANDROID_SERVICE_NODE_TYPES:
|
|
121
|
-
android_params = await database.get_node_parameters(android_node_id) or {}
|
|
122
|
-
connected_services.append({
|
|
123
|
-
'node_id': android_node_id,
|
|
124
|
-
'node_type': android_node.get('type'),
|
|
125
|
-
'service_id': android_params.get('service_id'),
|
|
126
|
-
'action': android_params.get('action'), # Default action
|
|
127
|
-
'parameters': android_params,
|
|
128
|
-
'label': android_node.get('data', {}).get('label', android_node.get('type'))
|
|
129
|
-
})
|
|
130
|
-
logger.debug(f"Android toolkit connected service: {android_params.get('service_id')}")
|
|
131
|
-
|
|
132
|
-
tool_entry['connected_services'] = connected_services
|
|
133
|
-
logger.debug(f"Android toolkit has {len(connected_services)} connected services")
|
|
134
|
-
|
|
135
|
-
tool_data.append(tool_entry)
|
|
136
|
-
logger.debug(f"AI Agent connected tool: {tool_type}")
|
|
137
|
-
|
|
138
|
-
# Log tool data collection results
|
|
139
|
-
logger.info(f"[AI Agent Handler] Collected tools: count={len(tool_data)}, workflow_id={workflow_id}")
|
|
140
|
-
for td in tool_data:
|
|
141
|
-
logger.info(f"[AI Agent Handler] Tool: type={td.get('node_type')}, node_id={td.get('node_id')}")
|
|
142
|
-
|
|
143
|
-
# Get broadcaster for real-time status updates
|
|
144
|
-
from services.status_broadcaster import get_status_broadcaster
|
|
145
|
-
broadcaster = get_status_broadcaster()
|
|
146
|
-
|
|
147
|
-
return await ai_service.execute_agent(
|
|
148
|
-
node_id,
|
|
149
|
-
parameters,
|
|
150
|
-
memory_data=memory_data,
|
|
151
|
-
tool_data=tool_data if tool_data else None,
|
|
152
|
-
broadcaster=broadcaster,
|
|
153
|
-
workflow_id=workflow_id
|
|
154
|
-
)
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
async def handle_chat_agent(
|
|
158
|
-
node_id: str,
|
|
159
|
-
node_type: str,
|
|
160
|
-
parameters: Dict[str, Any],
|
|
161
|
-
context: Dict[str, Any],
|
|
162
|
-
ai_service: "AIService",
|
|
163
|
-
database: "Database"
|
|
164
|
-
) -> Dict[str, Any]:
|
|
165
|
-
"""Handle
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
- Memory (input-memory): SimpleMemory node for conversation history
|
|
169
|
-
- Skills (input-skill): Provide context/instructions via SKILL.md
|
|
170
|
-
- Tools (input-tools): Tool nodes (httpRequest, etc.) for LangGraph tool calling
|
|
171
|
-
|
|
172
|
-
Args:
|
|
173
|
-
node_id: The node ID
|
|
174
|
-
node_type: The node type (chatAgent)
|
|
175
|
-
parameters: Resolved parameters
|
|
176
|
-
context: Execution context with nodes, edges, session_id, start_time, execution_id
|
|
177
|
-
ai_service: The AI service instance
|
|
178
|
-
database: The database instance
|
|
179
|
-
|
|
180
|
-
Returns:
|
|
181
|
-
Execution result dict
|
|
182
|
-
"""
|
|
183
|
-
nodes = context.get('nodes')
|
|
184
|
-
edges = context.get('edges')
|
|
185
|
-
workflow_id = context.get('workflow_id')
|
|
186
|
-
memory_data = None
|
|
187
|
-
skill_data: List[Dict[str, Any]] = []
|
|
188
|
-
tool_data: List[Dict[str, Any]] = [] # Tools for LangGraph
|
|
189
|
-
input_data: Optional[Dict[str, Any]] = None
|
|
190
|
-
|
|
191
|
-
logger.info(f"[Chat Agent] Processing node {node_id}, workflow_id={workflow_id}")
|
|
192
|
-
|
|
193
|
-
if edges and nodes:
|
|
194
|
-
incoming_edges = [e for e in edges if e.get('target') == node_id]
|
|
195
|
-
logger.debug(f"[Chat Agent] Incoming edges: {len(incoming_edges)}")
|
|
196
|
-
|
|
197
|
-
for edge in edges:
|
|
198
|
-
if edge.get('target') != node_id:
|
|
199
|
-
continue
|
|
200
|
-
|
|
201
|
-
target_handle = edge.get('targetHandle')
|
|
202
|
-
source_node_id = edge.get('source')
|
|
203
|
-
source_node = next((n for n in nodes if n.get('id') == source_node_id), None)
|
|
204
|
-
|
|
205
|
-
if not source_node:
|
|
206
|
-
continue
|
|
207
|
-
|
|
208
|
-
# Memory detection - load markdown content (same as AI Agent)
|
|
209
|
-
if target_handle == 'input-memory':
|
|
210
|
-
if source_node.get('type') == 'simpleMemory':
|
|
211
|
-
memory_params = await database.get_node_parameters(source_node_id) or {}
|
|
212
|
-
memory_session_id = memory_params.get('sessionId', 'default')
|
|
213
|
-
window_size = int(memory_params.get('windowSize', 10))
|
|
214
|
-
memory_content = memory_params.get('memoryContent', '# Conversation History\n\n*No messages yet.*\n')
|
|
215
|
-
long_term_enabled = memory_params.get('longTermEnabled', False)
|
|
216
|
-
retrieval_count = int(memory_params.get('retrievalCount', 3))
|
|
217
|
-
|
|
218
|
-
memory_data = {
|
|
219
|
-
'node_id': source_node_id,
|
|
220
|
-
'session_id': memory_session_id,
|
|
221
|
-
'window_size': window_size,
|
|
222
|
-
'memory_content': memory_content,
|
|
223
|
-
'long_term_enabled': long_term_enabled,
|
|
224
|
-
'retrieval_count': retrieval_count
|
|
225
|
-
}
|
|
226
|
-
logger.info(f"[Chat Agent] Connected memory node: session={memory_session_id}, content_length={len(memory_content)}")
|
|
227
|
-
|
|
228
|
-
# Skill detection - nodes connected to input-skill handle
|
|
229
|
-
elif target_handle == 'input-skill':
|
|
230
|
-
skill_type = source_node.get('type')
|
|
231
|
-
skill_params = await database.get_node_parameters(source_node_id) or {}
|
|
232
|
-
skill_entry = {
|
|
233
|
-
'node_id': source_node_id,
|
|
234
|
-
'node_type': skill_type,
|
|
235
|
-
'skill_name': skill_params.get('skillName', skill_type),
|
|
236
|
-
'parameters': skill_params,
|
|
237
|
-
'label': source_node.get('data', {}).get('label', skill_type)
|
|
238
|
-
}
|
|
239
|
-
skill_data.append(skill_entry)
|
|
240
|
-
logger.debug(f"[Chat Agent] Connected skill: {skill_type}")
|
|
241
|
-
|
|
242
|
-
# Tool detection - nodes connected to input-tools handle (for LangGraph)
|
|
243
|
-
elif target_handle == 'input-tools':
|
|
244
|
-
tool_type = source_node.get('type')
|
|
245
|
-
tool_params = await database.get_node_parameters(source_node_id) or {}
|
|
246
|
-
tool_entry = {
|
|
247
|
-
'node_id': source_node_id,
|
|
248
|
-
'node_type': tool_type,
|
|
249
|
-
'parameters': tool_params,
|
|
250
|
-
'label': source_node.get('data', {}).get('label', tool_type)
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
1
|
+
"""AI node handlers - AI Agent, Zeenie, AI Chat Model, Simple Memory."""
|
|
2
|
+
|
|
3
|
+
from typing import Dict, Any, List, Optional, TYPE_CHECKING
|
|
4
|
+
from core.logging import get_logger
|
|
5
|
+
from constants import ANDROID_SERVICE_NODE_TYPES
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from services.ai import AIService
|
|
9
|
+
from core.database import Database
|
|
10
|
+
|
|
11
|
+
logger = get_logger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
async def handle_ai_agent(
|
|
15
|
+
node_id: str,
|
|
16
|
+
node_type: str,
|
|
17
|
+
parameters: Dict[str, Any],
|
|
18
|
+
context: Dict[str, Any],
|
|
19
|
+
ai_service: "AIService",
|
|
20
|
+
database: "Database"
|
|
21
|
+
) -> Dict[str, Any]:
|
|
22
|
+
"""Handle AI agent node execution with memory and tool support.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
node_id: The node ID
|
|
26
|
+
node_type: The node type (aiAgent)
|
|
27
|
+
parameters: Resolved parameters
|
|
28
|
+
context: Execution context with nodes, edges, session_id, start_time, execution_id
|
|
29
|
+
ai_service: The AI service instance
|
|
30
|
+
database: The database instance
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
Execution result dict
|
|
34
|
+
"""
|
|
35
|
+
nodes = context.get('nodes')
|
|
36
|
+
edges = context.get('edges')
|
|
37
|
+
execution_id = context.get('execution_id', 'unknown')
|
|
38
|
+
workflow_id = context.get('workflow_id') # Extract for status broadcasts
|
|
39
|
+
memory_data = None
|
|
40
|
+
tool_data: List[Dict[str, Any]] = [] # Collect connected tool nodes
|
|
41
|
+
|
|
42
|
+
logger.info(f"[AI Agent] Processing node {node_id}, edges={len(edges) if edges else 0}, nodes={len(nodes) if nodes else 0}, workflow_id={workflow_id}")
|
|
43
|
+
|
|
44
|
+
if edges and nodes:
|
|
45
|
+
# Log all edges targeting this AI Agent for debugging
|
|
46
|
+
incoming_edges = [e for e in edges if e.get('target') == node_id]
|
|
47
|
+
logger.info(f"[AI Agent] Incoming edges to {node_id}: {len(incoming_edges)}")
|
|
48
|
+
for e in incoming_edges:
|
|
49
|
+
logger.info(f"[AI Agent] Edge: source={e.get('source')}, targetHandle={e.get('targetHandle')}")
|
|
50
|
+
|
|
51
|
+
# Check for tool edges specifically
|
|
52
|
+
tool_incoming = [e for e in incoming_edges if e.get('targetHandle') == 'input-tools']
|
|
53
|
+
logger.info(f"[AI Agent] Tool edges (input-tools handle): {len(tool_incoming)}")
|
|
54
|
+
|
|
55
|
+
for edge in edges:
|
|
56
|
+
if edge.get('target') != node_id:
|
|
57
|
+
continue
|
|
58
|
+
|
|
59
|
+
target_handle = edge.get('targetHandle')
|
|
60
|
+
source_node_id = edge.get('source')
|
|
61
|
+
source_node = next((n for n in nodes if n.get('id') == source_node_id), None)
|
|
62
|
+
|
|
63
|
+
if not source_node:
|
|
64
|
+
continue
|
|
65
|
+
|
|
66
|
+
# Memory detection - load markdown content for editing
|
|
67
|
+
if target_handle == 'input-memory':
|
|
68
|
+
if source_node.get('type') == 'simpleMemory':
|
|
69
|
+
memory_params = await database.get_node_parameters(source_node_id) or {}
|
|
70
|
+
memory_session_id = memory_params.get('sessionId', 'default')
|
|
71
|
+
window_size = int(memory_params.get('windowSize', 10))
|
|
72
|
+
memory_content = memory_params.get('memoryContent', '# Conversation History\n\n*No messages yet.*\n')
|
|
73
|
+
long_term_enabled = memory_params.get('longTermEnabled', False)
|
|
74
|
+
retrieval_count = int(memory_params.get('retrievalCount', 3))
|
|
75
|
+
|
|
76
|
+
memory_data = {
|
|
77
|
+
'node_id': source_node_id, # For saving updated content
|
|
78
|
+
'session_id': memory_session_id,
|
|
79
|
+
'window_size': window_size,
|
|
80
|
+
'memory_content': memory_content,
|
|
81
|
+
'long_term_enabled': long_term_enabled,
|
|
82
|
+
'retrieval_count': retrieval_count
|
|
83
|
+
}
|
|
84
|
+
logger.debug("AI Agent connected memory node", memory_session=memory_session_id, content_length=len(memory_content))
|
|
85
|
+
|
|
86
|
+
# Tool detection (new) - any node connected to input-tools becomes a tool
|
|
87
|
+
elif target_handle == 'input-tools':
|
|
88
|
+
tool_type = source_node.get('type')
|
|
89
|
+
logger.info(f"[AI Agent] Found tool connected via input-tools: type={tool_type}, node_id={source_node_id}")
|
|
90
|
+
tool_params = await database.get_node_parameters(source_node_id) or {}
|
|
91
|
+
|
|
92
|
+
# Build base tool entry
|
|
93
|
+
tool_entry = {
|
|
94
|
+
'node_id': source_node_id,
|
|
95
|
+
'node_type': tool_type,
|
|
96
|
+
'parameters': tool_params,
|
|
97
|
+
'label': source_node.get('data', {}).get('label', tool_type)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
# Special handling for androidTool - discover connected Android services
|
|
101
|
+
# Follows n8n Sub-Node pattern
|
|
102
|
+
if tool_type == 'androidTool':
|
|
103
|
+
connected_services = []
|
|
104
|
+
|
|
105
|
+
# Scan edges for Android nodes connected to this toolkit
|
|
106
|
+
for service_edge in edges:
|
|
107
|
+
# Skip if not targeting this androidTool node
|
|
108
|
+
if service_edge.get('target') != source_node_id:
|
|
109
|
+
continue
|
|
110
|
+
|
|
111
|
+
target_handle = service_edge.get('targetHandle')
|
|
112
|
+
# Accept input-main or no handle (ReactFlow may omit handle for single-input nodes)
|
|
113
|
+
if target_handle is not None and target_handle != 'input-main':
|
|
114
|
+
logger.debug(f"[Android Toolkit] Skipping edge with targetHandle: {target_handle}")
|
|
115
|
+
continue
|
|
116
|
+
|
|
117
|
+
android_node_id = service_edge.get('source')
|
|
118
|
+
android_node = next((n for n in nodes if n.get('id') == android_node_id), None)
|
|
119
|
+
|
|
120
|
+
if android_node and android_node.get('type') in ANDROID_SERVICE_NODE_TYPES:
|
|
121
|
+
android_params = await database.get_node_parameters(android_node_id) or {}
|
|
122
|
+
connected_services.append({
|
|
123
|
+
'node_id': android_node_id,
|
|
124
|
+
'node_type': android_node.get('type'),
|
|
125
|
+
'service_id': android_params.get('service_id'),
|
|
126
|
+
'action': android_params.get('action'), # Default action
|
|
127
|
+
'parameters': android_params,
|
|
128
|
+
'label': android_node.get('data', {}).get('label', android_node.get('type'))
|
|
129
|
+
})
|
|
130
|
+
logger.debug(f"Android toolkit connected service: {android_params.get('service_id')}")
|
|
131
|
+
|
|
132
|
+
tool_entry['connected_services'] = connected_services
|
|
133
|
+
logger.debug(f"Android toolkit has {len(connected_services)} connected services")
|
|
134
|
+
|
|
135
|
+
tool_data.append(tool_entry)
|
|
136
|
+
logger.debug(f"AI Agent connected tool: {tool_type}")
|
|
137
|
+
|
|
138
|
+
# Log tool data collection results
|
|
139
|
+
logger.info(f"[AI Agent Handler] Collected tools: count={len(tool_data)}, workflow_id={workflow_id}")
|
|
140
|
+
for td in tool_data:
|
|
141
|
+
logger.info(f"[AI Agent Handler] Tool: type={td.get('node_type')}, node_id={td.get('node_id')}")
|
|
142
|
+
|
|
143
|
+
# Get broadcaster for real-time status updates
|
|
144
|
+
from services.status_broadcaster import get_status_broadcaster
|
|
145
|
+
broadcaster = get_status_broadcaster()
|
|
146
|
+
|
|
147
|
+
return await ai_service.execute_agent(
|
|
148
|
+
node_id,
|
|
149
|
+
parameters,
|
|
150
|
+
memory_data=memory_data,
|
|
151
|
+
tool_data=tool_data if tool_data else None,
|
|
152
|
+
broadcaster=broadcaster,
|
|
153
|
+
workflow_id=workflow_id
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
async def handle_chat_agent(
|
|
158
|
+
node_id: str,
|
|
159
|
+
node_type: str,
|
|
160
|
+
parameters: Dict[str, Any],
|
|
161
|
+
context: Dict[str, Any],
|
|
162
|
+
ai_service: "AIService",
|
|
163
|
+
database: "Database"
|
|
164
|
+
) -> Dict[str, Any]:
|
|
165
|
+
"""Handle Zeenie node execution with skill-based tool calling.
|
|
166
|
+
|
|
167
|
+
Zeenie supports:
|
|
168
|
+
- Memory (input-memory): SimpleMemory node for conversation history
|
|
169
|
+
- Skills (input-skill): Provide context/instructions via SKILL.md
|
|
170
|
+
- Tools (input-tools): Tool nodes (httpRequest, etc.) for LangGraph tool calling
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
node_id: The node ID
|
|
174
|
+
node_type: The node type (chatAgent)
|
|
175
|
+
parameters: Resolved parameters
|
|
176
|
+
context: Execution context with nodes, edges, session_id, start_time, execution_id
|
|
177
|
+
ai_service: The AI service instance
|
|
178
|
+
database: The database instance
|
|
179
|
+
|
|
180
|
+
Returns:
|
|
181
|
+
Execution result dict
|
|
182
|
+
"""
|
|
183
|
+
nodes = context.get('nodes')
|
|
184
|
+
edges = context.get('edges')
|
|
185
|
+
workflow_id = context.get('workflow_id')
|
|
186
|
+
memory_data = None
|
|
187
|
+
skill_data: List[Dict[str, Any]] = []
|
|
188
|
+
tool_data: List[Dict[str, Any]] = [] # Tools for LangGraph
|
|
189
|
+
input_data: Optional[Dict[str, Any]] = None
|
|
190
|
+
|
|
191
|
+
logger.info(f"[Chat Agent] Processing node {node_id}, workflow_id={workflow_id}")
|
|
192
|
+
|
|
193
|
+
if edges and nodes:
|
|
194
|
+
incoming_edges = [e for e in edges if e.get('target') == node_id]
|
|
195
|
+
logger.debug(f"[Chat Agent] Incoming edges: {len(incoming_edges)}")
|
|
196
|
+
|
|
197
|
+
for edge in edges:
|
|
198
|
+
if edge.get('target') != node_id:
|
|
199
|
+
continue
|
|
200
|
+
|
|
201
|
+
target_handle = edge.get('targetHandle')
|
|
202
|
+
source_node_id = edge.get('source')
|
|
203
|
+
source_node = next((n for n in nodes if n.get('id') == source_node_id), None)
|
|
204
|
+
|
|
205
|
+
if not source_node:
|
|
206
|
+
continue
|
|
207
|
+
|
|
208
|
+
# Memory detection - load markdown content (same as AI Agent)
|
|
209
|
+
if target_handle == 'input-memory':
|
|
210
|
+
if source_node.get('type') == 'simpleMemory':
|
|
211
|
+
memory_params = await database.get_node_parameters(source_node_id) or {}
|
|
212
|
+
memory_session_id = memory_params.get('sessionId', 'default')
|
|
213
|
+
window_size = int(memory_params.get('windowSize', 10))
|
|
214
|
+
memory_content = memory_params.get('memoryContent', '# Conversation History\n\n*No messages yet.*\n')
|
|
215
|
+
long_term_enabled = memory_params.get('longTermEnabled', False)
|
|
216
|
+
retrieval_count = int(memory_params.get('retrievalCount', 3))
|
|
217
|
+
|
|
218
|
+
memory_data = {
|
|
219
|
+
'node_id': source_node_id,
|
|
220
|
+
'session_id': memory_session_id,
|
|
221
|
+
'window_size': window_size,
|
|
222
|
+
'memory_content': memory_content,
|
|
223
|
+
'long_term_enabled': long_term_enabled,
|
|
224
|
+
'retrieval_count': retrieval_count
|
|
225
|
+
}
|
|
226
|
+
logger.info(f"[Chat Agent] Connected memory node: session={memory_session_id}, content_length={len(memory_content)}")
|
|
227
|
+
|
|
228
|
+
# Skill detection - nodes connected to input-skill handle
|
|
229
|
+
elif target_handle == 'input-skill':
|
|
230
|
+
skill_type = source_node.get('type')
|
|
231
|
+
skill_params = await database.get_node_parameters(source_node_id) or {}
|
|
232
|
+
skill_entry = {
|
|
233
|
+
'node_id': source_node_id,
|
|
234
|
+
'node_type': skill_type,
|
|
235
|
+
'skill_name': skill_params.get('skillName', skill_type),
|
|
236
|
+
'parameters': skill_params,
|
|
237
|
+
'label': source_node.get('data', {}).get('label', skill_type)
|
|
238
|
+
}
|
|
239
|
+
skill_data.append(skill_entry)
|
|
240
|
+
logger.debug(f"[Chat Agent] Connected skill: {skill_type}")
|
|
241
|
+
|
|
242
|
+
# Tool detection - nodes connected to input-tools handle (for LangGraph)
|
|
243
|
+
elif target_handle == 'input-tools':
|
|
244
|
+
tool_type = source_node.get('type')
|
|
245
|
+
tool_params = await database.get_node_parameters(source_node_id) or {}
|
|
246
|
+
tool_entry = {
|
|
247
|
+
'node_id': source_node_id,
|
|
248
|
+
'node_type': tool_type,
|
|
249
|
+
'parameters': tool_params,
|
|
250
|
+
'label': source_node.get('data', {}).get('label', tool_type)
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
# Special handling for androidTool - discover connected Android services
|
|
254
|
+
# Follows n8n Sub-Node pattern (same as AI Agent)
|
|
255
|
+
if tool_type == 'androidTool':
|
|
256
|
+
connected_services = []
|
|
257
|
+
|
|
258
|
+
# Scan edges for Android nodes connected to this toolkit
|
|
259
|
+
for service_edge in edges:
|
|
260
|
+
# Skip if not targeting this androidTool node
|
|
261
|
+
if service_edge.get('target') != source_node_id:
|
|
262
|
+
continue
|
|
263
|
+
|
|
264
|
+
service_target_handle = service_edge.get('targetHandle')
|
|
265
|
+
# Accept input-main or no handle (ReactFlow may omit handle for single-input nodes)
|
|
266
|
+
if service_target_handle is not None and service_target_handle != 'input-main':
|
|
267
|
+
continue
|
|
268
|
+
|
|
269
|
+
android_node_id = service_edge.get('source')
|
|
270
|
+
android_node = next((n for n in nodes if n.get('id') == android_node_id), None)
|
|
271
|
+
|
|
272
|
+
if android_node and android_node.get('type') in ANDROID_SERVICE_NODE_TYPES:
|
|
273
|
+
android_params = await database.get_node_parameters(android_node_id) or {}
|
|
274
|
+
connected_services.append({
|
|
275
|
+
'node_id': android_node_id,
|
|
276
|
+
'node_type': android_node.get('type'),
|
|
277
|
+
'service_id': android_params.get('service_id'),
|
|
278
|
+
'action': android_params.get('action'),
|
|
279
|
+
'parameters': android_params,
|
|
280
|
+
'label': android_node.get('data', {}).get('label', android_node.get('type'))
|
|
281
|
+
})
|
|
282
|
+
logger.debug(f"[Chat Agent] Android toolkit connected service: {android_params.get('service_id')}")
|
|
283
|
+
|
|
284
|
+
tool_entry['connected_services'] = connected_services
|
|
285
|
+
logger.info(f"[Chat Agent] Android toolkit has {len(connected_services)} connected services")
|
|
286
|
+
|
|
287
|
+
tool_data.append(tool_entry)
|
|
288
|
+
logger.info(f"[Chat Agent] Connected tool: {tool_type} ({tool_entry['label']})")
|
|
289
|
+
|
|
290
|
+
# Input data detection - nodes connected to input-main
|
|
291
|
+
elif target_handle == 'input-main' or target_handle is None:
|
|
292
|
+
source_output = context.get('outputs', {}).get(source_node_id)
|
|
293
|
+
if source_output:
|
|
294
|
+
input_data = source_output
|
|
295
|
+
logger.debug(f"[Chat Agent] Input from {source_node.get('type')}: {list(source_output.keys())}")
|
|
296
|
+
|
|
297
|
+
# Log discovered connections
|
|
298
|
+
logger.info(f"[Chat Agent] Discovered: memory={'yes' if memory_data else 'no'}, {len(skill_data)} skills, {len(tool_data)} tools")
|
|
299
|
+
for td in tool_data:
|
|
300
|
+
logger.debug(f"[Chat Agent] Tool: type={td.get('node_type')}, label={td.get('label')}")
|
|
301
|
+
|
|
302
|
+
# Auto-use input data if prompt is empty (fallback for trigger nodes)
|
|
303
|
+
if not parameters.get('prompt') and input_data:
|
|
304
|
+
prompt = (
|
|
305
|
+
input_data.get('message') or
|
|
306
|
+
input_data.get('text') or
|
|
307
|
+
input_data.get('content') or
|
|
308
|
+
str(input_data)
|
|
309
|
+
)
|
|
310
|
+
parameters = {**parameters, 'prompt': prompt}
|
|
311
|
+
logger.info(f"[Chat Agent] Auto-using input as prompt: {prompt[:100] if len(str(prompt)) > 100 else prompt}...")
|
|
312
|
+
|
|
313
|
+
# Get broadcaster for real-time status updates
|
|
314
|
+
from services.status_broadcaster import get_status_broadcaster
|
|
315
|
+
broadcaster = get_status_broadcaster()
|
|
316
|
+
|
|
317
|
+
# Execute Chat Agent with memory, skills and tools
|
|
318
|
+
return await ai_service.execute_chat_agent(
|
|
319
|
+
node_id,
|
|
320
|
+
parameters,
|
|
321
|
+
memory_data=memory_data,
|
|
322
|
+
skill_data=skill_data if skill_data else None,
|
|
323
|
+
tool_data=tool_data if tool_data else None,
|
|
324
|
+
broadcaster=broadcaster,
|
|
325
|
+
workflow_id=workflow_id
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
async def handle_ai_chat_model(
|
|
330
|
+
node_id: str,
|
|
331
|
+
node_type: str,
|
|
332
|
+
parameters: Dict[str, Any],
|
|
333
|
+
context: Dict[str, Any],
|
|
334
|
+
ai_service: "AIService"
|
|
335
|
+
) -> Dict[str, Any]:
|
|
336
|
+
"""Handle AI chat model node execution.
|
|
337
|
+
|
|
338
|
+
Args:
|
|
339
|
+
node_id: The node ID
|
|
340
|
+
node_type: The node type (openaiChatModel, anthropicChatModel, etc.)
|
|
341
|
+
parameters: Resolved parameters
|
|
342
|
+
context: Execution context
|
|
343
|
+
ai_service: The AI service instance
|
|
344
|
+
|
|
345
|
+
Returns:
|
|
346
|
+
Execution result dict
|
|
347
|
+
"""
|
|
348
|
+
return await ai_service.execute_chat(node_id, node_type, parameters)
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
async def handle_simple_memory(
|
|
352
|
+
node_id: str,
|
|
353
|
+
node_type: str,
|
|
354
|
+
parameters: Dict[str, Any],
|
|
355
|
+
context: Dict[str, Any]
|
|
356
|
+
) -> Dict[str, Any]:
|
|
357
|
+
"""Handle simple memory node execution.
|
|
358
|
+
|
|
359
|
+
Args:
|
|
360
|
+
node_id: The node ID
|
|
361
|
+
node_type: The node type (simpleMemory)
|
|
362
|
+
parameters: Resolved parameters
|
|
363
|
+
context: Execution context
|
|
364
|
+
|
|
365
|
+
Returns:
|
|
366
|
+
Execution result dict with session info and messages
|
|
367
|
+
"""
|
|
368
|
+
from services.memory_store import get_messages, clear_session
|
|
369
|
+
|
|
370
|
+
session_id = parameters.get('sessionId', 'default')
|
|
371
|
+
memory_type = parameters.get('memoryType', 'buffer')
|
|
372
|
+
window_size = int(parameters.get('windowSize', 10)) if memory_type == 'window' else None
|
|
373
|
+
clear_on_run = parameters.get('clearOnRun', False)
|
|
374
|
+
|
|
375
|
+
if clear_on_run:
|
|
376
|
+
cleared = clear_session(session_id)
|
|
377
|
+
logger.info(f"[Memory] Cleared {cleared} messages from session '{session_id}'")
|
|
378
|
+
|
|
379
|
+
messages = get_messages(session_id, window_size)
|
|
380
|
+
|
|
381
|
+
return {
|
|
382
|
+
"success": True,
|
|
383
|
+
"result": {
|
|
384
|
+
"session_id": session_id,
|
|
385
|
+
"messages": messages,
|
|
386
|
+
"message_count": len(messages),
|
|
387
|
+
"memory_type": memory_type,
|
|
388
|
+
"window_size": window_size
|
|
389
|
+
}
|
|
390
|
+
}
|