machinaos 0.0.76 → 0.0.78
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/README.md +143 -107
- package/client/dist/assets/ActionBar-Du2MSFSz.js +1 -0
- package/client/dist/assets/ApiKeyInput-k2LBmBjb.js +1 -0
- package/client/dist/assets/ApiKeyPanel-C_bV9U0X.js +1 -0
- package/client/dist/assets/ApiUsageSection-CmVfwZzL.js +1 -0
- package/client/dist/assets/EmailPanel-CeKIMGu-.js +1 -0
- package/client/dist/assets/OAuthPanel-KA3t3Q2K.js +1 -0
- package/client/dist/assets/QrPairingPanel-NgNpJNuk.js +1 -0
- package/client/dist/assets/RateLimitSection-Du5YNVIA.js +1 -0
- package/client/dist/assets/StatusCard-DNLyayXc.js +1 -0
- package/client/dist/assets/index-DQ0nwhec.js +257 -0
- package/client/dist/assets/index-DxmbVskS.css +1 -0
- package/client/dist/assets/vendor-flow-CZmBvHRo.js +1 -0
- package/client/dist/assets/vendor-icons-CVrPjN2Q.js +22 -0
- package/client/dist/assets/vendor-markdown-CRou3yQ5.js +62 -0
- package/client/dist/assets/vendor-misc-C4VxKHs5.js +1 -0
- package/client/dist/assets/vendor-query-SzWcOU0G.js +1 -0
- package/client/dist/assets/vendor-radix-Dnos29jG.js +56 -0
- package/client/dist/assets/vendor-react-DvWIbVx0.js +1 -0
- package/client/dist/index.html +37 -3
- package/client/index.html +28 -1
- package/client/package.json +44 -40
- package/client/src/App.tsx +2 -0
- package/client/src/Dashboard.tsx +157 -45
- package/client/src/ParameterPanel.tsx +3 -5
- package/client/src/adapters/nodeSpecToDescription.ts +1 -0
- package/client/src/assets/icons/NodeIcon.tsx +32 -0
- package/client/src/assets/icons/index.ts +4 -0
- package/client/src/assets/icons/stripe.svg +1 -0
- package/client/src/assets/icons/themedGlyphs.ts +404 -0
- package/client/src/components/AIAgentNode.tsx +77 -53
- package/client/src/components/GenericNode.tsx +34 -52
- package/client/src/components/OutputPanel.tsx +64 -147
- package/client/src/components/ParameterRenderer.tsx +5 -3
- package/client/src/components/SkillEditorModal.tsx +9 -18
- package/client/src/components/SquareNode.tsx +97 -115
- package/client/src/components/StartNode.tsx +32 -42
- package/client/src/components/SvgFilterDefs.tsx +54 -0
- package/client/src/components/TeamMonitorNode.tsx +12 -14
- package/client/src/components/ToolkitNode.tsx +35 -60
- package/client/src/components/TriggerNode.tsx +43 -77
- package/client/src/components/__tests__/CredentialsModal.test.tsx +49 -45
- package/client/src/components/credentials/CredentialsModal.tsx +98 -30
- package/client/src/components/credentials/CredentialsPalette.tsx +73 -5
- package/client/src/components/credentials/catalogueAdapter.ts +17 -1
- package/client/src/components/credentials/panels/ApiKeyPanel.tsx +102 -37
- package/client/src/components/credentials/panels/EmailPanel.tsx +7 -19
- package/client/src/components/credentials/panels/OAuthPanel.tsx +5 -1
- package/client/src/components/credentials/panels/QrPairingPanel.tsx +1 -3
- package/client/src/components/credentials/primitives/ActionBar.tsx +7 -11
- package/client/src/components/credentials/primitives/OAuthConnect.tsx +19 -28
- package/client/src/components/credentials/sections/ProviderDefaultsSection.tsx +24 -3
- package/client/src/components/credentials/types.ts +12 -2
- package/client/src/components/credentials/useCredentialPanel.ts +43 -19
- package/client/src/components/icons/AIProviderIcons.tsx +16 -0
- package/client/src/components/onboarding/OnboardingWizard.tsx +23 -63
- package/client/src/components/onboarding/nodeRoleClasses.ts +23 -0
- package/client/src/components/onboarding/steps/CanvasStep.tsx +15 -21
- package/client/src/components/onboarding/steps/ConceptsStep.tsx +2 -11
- package/client/src/components/onboarding/steps/GetStartedStep.tsx +2 -10
- package/client/src/components/parameterPanel/InputSection.tsx +9 -7
- package/client/src/components/parameterPanel/MasterSkillEditor.tsx +84 -198
- package/client/src/components/parameterPanel/MiddleSection.tsx +57 -80
- package/client/src/components/parameterPanel/ToolSchemaEditor.tsx +31 -25
- package/client/src/components/parameterPanel/__tests__/InputSection.test.tsx +7 -2
- package/client/src/components/ui/AIResultModal.tsx +1 -1
- package/client/src/components/ui/CollapsibleSection.tsx +9 -5
- package/client/src/components/ui/CommandPalette.tsx +147 -0
- package/client/src/components/ui/CommandPaletteHost.tsx +189 -0
- package/client/src/components/ui/ComponentItem.tsx +13 -7
- package/client/src/components/ui/ComponentPalette.tsx +24 -13
- package/client/src/components/ui/ConsolePanel.tsx +19 -11
- package/client/src/components/ui/DropCap.tsx +28 -0
- package/client/src/components/ui/EditableNodeLabel.tsx +10 -2
- package/client/src/components/ui/InputNodesPanel.tsx +1 -1
- package/client/src/components/ui/Modal.tsx +38 -6
- package/client/src/components/ui/OutputDisplayPanel.tsx +1 -1
- package/client/src/components/ui/SettingsPanel.tsx +42 -13
- package/client/src/components/ui/StatusBar.tsx +108 -0
- package/client/src/components/ui/ThemeSwitcher.tsx +109 -0
- package/client/src/components/ui/TopToolbar.tsx +42 -25
- package/client/src/components/ui/WorkflowSidebar.tsx +32 -16
- package/client/src/components/ui/action-button.tsx +40 -15
- package/client/src/components/ui/button.tsx +24 -1
- package/client/src/components/ui/dropdown-menu.tsx +24 -2
- package/client/src/components/ui/input.tsx +19 -2
- package/client/src/components/ui/select.tsx +15 -0
- package/client/src/components/ui/textarea.tsx +15 -2
- package/client/src/contexts/AuthContext.tsx +148 -109
- package/client/src/contexts/ThemeContext.tsx +93 -17
- package/client/src/contexts/WebSocketContext.tsx +373 -206
- package/client/src/contexts/__tests__/AuthContext.test.tsx +221 -0
- package/client/src/hooks/__tests__/useDragVariable.test.ts +7 -1
- package/client/src/hooks/__tests__/useWorkflowOpsListener.test.ts +142 -0
- package/client/src/hooks/useAppTheme.ts +209 -7
- package/client/src/hooks/useAutoSkillEdges.ts +7 -2
- package/client/src/hooks/useCatalogueQuery.ts +67 -1
- package/client/src/hooks/useDragVariable.ts +1 -1
- package/client/src/hooks/useNodeAllowlist.ts +115 -8
- package/client/src/hooks/useOnboarding.ts +20 -8
- package/client/src/hooks/useParameterPanel.ts +2 -1
- package/client/src/hooks/useReactFlowNodes.ts +2 -1
- package/client/src/hooks/useSound.ts +185 -0
- package/client/src/hooks/useWorkflowManagement.ts +6 -8
- package/client/src/hooks/useWorkflowOpsListener.ts +90 -0
- package/client/src/index.css +65 -3
- package/client/src/lib/__tests__/connectionConfig.test.ts +91 -0
- package/client/src/lib/aiModelProviders.ts +8 -0
- package/client/src/lib/connectionConfig.ts +107 -0
- package/client/src/lib/queryPersist.ts +13 -5
- package/client/src/lib/sound.ts +393 -0
- package/client/src/main.tsx +20 -0
- package/client/src/store/useAppStore.ts +26 -0
- package/client/src/styles/canvasAnimations.ts +37 -36
- package/client/src/styles/theme.ts +36 -20
- package/client/src/test/setup.ts +1 -0
- package/client/src/themes/atomic.css +253 -0
- package/client/src/themes/base.css +373 -0
- package/client/src/themes/cyber.css +890 -0
- package/client/src/themes/dark.css +70 -0
- package/client/src/themes/edo.css +246 -0
- package/client/src/themes/greek.css +293 -0
- package/client/src/themes/light.css +78 -0
- package/client/src/themes/plague.css +253 -0
- package/client/src/themes/renaissance.css +727 -0
- package/client/src/themes/rot.css +249 -0
- package/client/src/themes/steampunk.css +272 -0
- package/client/src/themes/surveillance.css +289 -0
- package/client/src/themes/wasteland.css +250 -0
- package/client/src/types/INodeProperties.ts +5 -0
- package/client/src/types/NodeTypes.ts +11 -1
- package/client/src/types/__tests__/cloudEvents.test.ts +99 -0
- package/client/src/types/cloudEvents.ts +78 -0
- package/client/src/vite-env.d.ts +7 -0
- package/client/tsconfig.json +1 -1
- package/client/vite.config.js +62 -2
- package/install.ps1 +1 -1
- package/install.sh +1 -1
- package/machina/commands/build.py +51 -7
- package/machina/pyproject.toml +4 -0
- package/machina/supervisor.py +12 -2
- package/machina/tree.py +71 -21
- package/package.json +4 -4
- package/scripts/install.js +16 -1
- package/server/config/ai_cli_providers.json +54 -0
- package/server/config/credential_providers.json +109 -2
- package/server/config/llm_defaults.json +24 -0
- package/server/config/model_registry.json +338 -499
- package/server/config/node_allowlist.json +16 -1
- package/server/config/pricing.json +8 -0
- package/server/constants.py +38 -15
- package/server/core/container.py +2 -2
- package/server/core/credentials_database.py +35 -2
- package/server/core/logging.py +4 -3
- package/server/main.py +99 -13
- package/server/models/node_metadata.py +1 -0
- package/server/nodejs/package.json +8 -6
- package/server/nodejs/src/index.ts +22 -5
- package/server/nodes/README.md +31 -4
- package/server/nodes/agent/_inline.py +2 -0
- package/server/nodes/agent/_specialized.py +6 -3
- package/server/nodes/agent/ai_agent.py +13 -3
- package/server/nodes/agent/chat_agent.py +6 -3
- package/server/nodes/agent/claude_code_agent.py +287 -75
- package/server/nodes/agent/codex_agent.py +239 -0
- package/server/nodes/agent/deep_agent.py +3 -3
- package/server/nodes/agent/rlm_agent.py +3 -3
- package/server/nodes/android/__init__.py +31 -1
- package/server/nodes/android/_base.py +9 -5
- package/server/{services/android_service.py → nodes/android/_dispatcher.py} +2 -2
- package/server/nodes/android/_handlers.py +154 -0
- package/server/nodes/android/_option_loaders.py +44 -0
- package/server/nodes/android/_refresh.py +127 -0
- package/server/{services/android → nodes/android/_relay}/client.py +4 -4
- package/server/{routers/android.py → nodes/android/_router.py} +27 -8
- package/server/nodes/browser/browser.py +2 -2
- package/server/nodes/code/_base.py +6 -2
- package/server/nodes/code/_claude_code.py +134 -0
- package/server/nodes/document/embedding_generator.py +3 -3
- package/server/nodes/document/http_scraper.py +3 -3
- package/server/nodes/document/vector_store.py +5 -5
- package/server/nodes/email/__init__.py +11 -1
- package/server/nodes/email/_filters.py +21 -0
- package/server/{services/himalaya_service.py → nodes/email/_himalaya.py} +6 -10
- package/server/{services/email_service.py → nodes/email/_service.py} +9 -13
- package/server/nodes/email/email_read.py +1 -1
- package/server/nodes/email/email_receive.py +54 -5
- package/server/nodes/email/email_send.py +1 -1
- package/server/nodes/filesystem/shell.py +24 -1
- package/server/nodes/google/__init__.py +55 -1
- package/server/{services/handlers/google_auth.py → nodes/google/_auth_helper.py} +8 -5
- package/server/nodes/google/_base.py +2 -2
- package/server/nodes/google/_credentials.py +5 -5
- package/server/nodes/google/_filters.py +25 -0
- package/server/nodes/google/_handlers.py +57 -0
- package/server/{services/google_oauth.py → nodes/google/_oauth.py} +195 -162
- package/server/nodes/google/_option_loaders.py +107 -0
- package/server/nodes/google/_refresh.py +66 -0
- package/server/nodes/google/_router.py +131 -0
- package/server/nodes/google/gmail_receive.py +41 -4
- package/server/nodes/groups.py +1 -0
- package/server/nodes/location/_credentials.py +45 -1
- package/server/{services/maps.py → nodes/location/_service.py} +18 -3
- package/server/nodes/location/gmaps_create.py +4 -4
- package/server/nodes/location/gmaps_locations.py +4 -4
- package/server/nodes/location/gmaps_nearby_places.py +4 -4
- package/server/nodes/model/_base.py +8 -3
- package/server/nodes/model/_credentials.py +96 -8
- package/server/nodes/model/_local_validator.py +345 -0
- package/server/nodes/model/lmstudio_chat_model.py +23 -0
- package/server/nodes/model/ollama_chat_model.py +25 -0
- package/server/nodes/proxy/_usage.py +2 -2
- package/server/nodes/proxy/proxy_config.py +14 -14
- package/server/nodes/proxy/proxy_request.py +4 -4
- package/server/nodes/scraper/_credentials.py +29 -1
- package/server/nodes/scraper/apify_actor.py +9 -9
- package/server/nodes/scraper/crawlee_scraper.py +5 -5
- package/server/nodes/search/brave_search.py +4 -0
- package/server/nodes/search/perplexity_search.py +9 -0
- package/server/nodes/search/serper_search.py +3 -0
- package/server/nodes/skill/simple_memory.py +12 -0
- package/server/nodes/social/_base.py +2 -2
- package/server/nodes/stripe/__init__.py +46 -0
- package/server/nodes/stripe/_credentials.py +33 -0
- package/server/nodes/stripe/_handlers.py +270 -0
- package/server/nodes/stripe/_install.py +127 -0
- package/server/nodes/stripe/_source.py +174 -0
- package/server/nodes/stripe/stripe_action.py +81 -0
- package/server/nodes/stripe/stripe_receive.py +92 -0
- package/server/nodes/telegram/_credentials.py +52 -1
- package/server/nodes/telegram/_handlers.py +19 -18
- package/server/nodes/telegram/_service.py +134 -32
- package/server/nodes/telegram/telegram_send.py +5 -6
- package/server/nodes/text/file_handler.py +2 -2
- package/server/nodes/text/text_generator.py +2 -2
- package/server/nodes/tool/agent_builder.py +630 -0
- package/server/nodes/tool/task_manager.py +144 -2
- package/server/nodes/twitter/__init__.py +38 -1
- package/server/nodes/twitter/_base.py +7 -7
- package/server/nodes/twitter/_credentials.py +1 -1
- package/server/nodes/twitter/_filters.py +37 -0
- package/server/nodes/twitter/_handlers.py +77 -0
- package/server/nodes/twitter/_oauth.py +124 -0
- package/server/nodes/twitter/_refresh.py +78 -0
- package/server/nodes/twitter/_router.py +29 -0
- package/server/nodes/twitter/twitter_receive.py +4 -0
- package/server/nodes/visuals.json +64 -19
- package/server/nodes/whatsapp/__init__.py +45 -5
- package/server/nodes/whatsapp/_base.py +3 -3
- package/server/nodes/whatsapp/_filters.py +137 -0
- package/server/nodes/whatsapp/_handlers.py +167 -0
- package/server/nodes/whatsapp/_option_loaders.py +68 -0
- package/server/nodes/whatsapp/_refresh.py +62 -0
- package/server/nodes/whatsapp/_runtime.py +1 -1
- package/server/pyproject.toml +29 -7
- package/server/routers/schemas.py +2 -2
- package/server/routers/webhook.py +26 -9
- package/server/routers/websocket.py +149 -810
- package/server/services/ai.py +89 -8
- package/server/services/auth.py +220 -43
- package/server/services/claude_oauth.py +126 -100
- package/server/services/cli_agent/__init__.py +78 -0
- package/server/services/cli_agent/_handlers.py +237 -0
- package/server/services/cli_agent/config.py +112 -0
- package/server/services/cli_agent/factory.py +48 -0
- package/server/services/cli_agent/lockfile.py +141 -0
- package/server/services/cli_agent/mcp_server.py +482 -0
- package/server/services/cli_agent/protocol.py +173 -0
- package/server/services/cli_agent/providers/__init__.py +9 -0
- package/server/services/cli_agent/providers/anthropic_claude.py +419 -0
- package/server/services/cli_agent/providers/google_gemini.py +80 -0
- package/server/services/cli_agent/providers/openai_codex.py +310 -0
- package/server/services/cli_agent/service.py +607 -0
- package/server/services/cli_agent/session.py +618 -0
- package/server/services/cli_agent/types.py +227 -0
- package/server/services/cli_agent/workflow_tools.py +233 -0
- package/server/services/credential_registry.py +26 -1
- package/server/services/deployment/manager.py +26 -145
- package/server/services/deployment/poll_registry.py +59 -0
- package/server/services/event_waiter.py +76 -246
- package/server/services/events/__init__.py +54 -0
- package/server/services/events/cli.py +78 -0
- package/server/services/events/daemon.py +163 -0
- package/server/services/events/envelope.py +281 -0
- package/server/services/events/lifecycle.py +99 -0
- package/server/services/events/oauth_lifecycle.py +534 -0
- package/server/services/events/polling.py +60 -0
- package/server/services/events/push.py +36 -0
- package/server/services/events/source.py +63 -0
- package/server/services/events/triggers.py +118 -0
- package/server/services/events/verifiers/__init__.py +25 -0
- package/server/services/events/verifiers/base.py +28 -0
- package/server/services/events/verifiers/github.py +25 -0
- package/server/services/events/verifiers/hmac_basic.py +32 -0
- package/server/services/events/verifiers/standard_webhooks.py +47 -0
- package/server/services/events/verifiers/stripe.py +42 -0
- package/server/services/events/webhook.py +105 -0
- package/server/services/handlers/tools.py +28 -186
- package/server/services/llm/config.py +7 -0
- package/server/services/llm/factory.py +8 -2
- package/server/services/memory/__init__.py +52 -0
- package/server/services/memory/jsonl.py +80 -0
- package/server/services/memory/markdown.py +65 -0
- package/server/services/memory/state.py +112 -0
- package/server/services/memory/vector_store.py +40 -0
- package/server/services/model_registry.py +76 -0
- package/server/services/node_allowlist.py +71 -15
- package/server/services/node_executor.py +2 -2
- package/server/services/node_output_schemas.py +21 -10
- package/server/services/node_spec.py +1 -1
- package/server/services/oauth_utils.py +1 -1
- package/server/services/plugin/__init__.py +2 -0
- package/server/services/plugin/base.py +44 -2
- package/server/services/plugin/credential.py +288 -1
- package/server/services/plugin/deps.py +105 -0
- package/server/services/plugin/edge_walker.py +12 -4
- package/server/services/plugin/oauth.py +381 -0
- package/server/services/plugin/polling.py +247 -0
- package/server/services/plugin/registry.py +145 -0
- package/server/services/plugin/singleton.py +65 -0
- package/server/services/plugin/ws.py +81 -0
- package/server/services/process_service.py +31 -2
- package/server/services/status_broadcaster.py +155 -238
- package/server/services/temporal/workflow.py +7 -7
- package/server/services/workflow.py +21 -3
- package/server/services/ws_handler_registry.py +111 -28
- package/server/skills/GUIDE.md +16 -1
- package/server/skills/assistant/agent-builder-skill/SKILL.md +166 -0
- package/server/skills/payments_agent/stripe-skill/SKILL.md +306 -0
- package/server/tests/credentials/test_auth_service.py +16 -9
- package/server/tests/credentials/test_credential_broadcasts.py +219 -0
- package/server/tests/credentials/test_google_oauth.py +6 -6
- package/server/tests/credentials/test_oauth_utils.py +1 -1
- package/server/tests/credentials/test_twitter_oauth.py +2 -2
- package/server/tests/credentials/test_websocket_handlers.py +44 -20
- package/server/tests/llm/test_factory.py +1 -0
- package/server/tests/llm/test_wiring.py +5 -1
- package/server/tests/nodes/_compat.py +24 -24
- package/server/tests/nodes/test_agent_builder.py +439 -0
- package/server/tests/nodes/test_ai_tools.py +18 -14
- package/server/tests/nodes/test_code_fs_process.py +17 -8
- package/server/tests/nodes/test_email.py +10 -9
- package/server/tests/nodes/test_google_workspace.py +2 -2
- package/server/tests/nodes/test_specialized_agents.py +100 -53
- package/server/tests/nodes/test_stripe_plugin.py +293 -0
- package/server/tests/nodes/test_telegram_social.py +4 -4
- package/server/tests/nodes/test_twitter.py +1 -1
- package/server/tests/nodes/test_web_automation.py +2 -2
- package/server/tests/nodes/test_whatsapp.py +9 -9
- package/server/tests/services/cli_agent/__init__.py +0 -0
- package/server/tests/services/cli_agent/test_mcp_server.py +432 -0
- package/server/tests/services/cli_agent/test_providers.py +358 -0
- package/server/tests/services/cli_agent/test_service.py +298 -0
- package/server/tests/services/memory/__init__.py +0 -0
- package/server/tests/services/memory/test_jsonl.py +188 -0
- package/server/tests/services/test_events.py +333 -0
- package/server/tests/test_node_spec.py +56 -16
- package/server/tests/test_plugin_helpers.py +116 -0
- package/server/tests/test_plugin_self_containment.py +486 -0
- package/server/tests/test_status_broadcasts.py +425 -0
- package/workflows/{AI Assistant_workflow-1777421105154-0m4snkzjf.json → AI Assistant_workflow-1778504793388-ou1m1tz2x.json } +70 -266
- package/workflows/{AI Employee_workflow-1777720598005-u4cm858dv.json → AI Employee_example_workflow-1777720598005-u4cm858dv.json } +112 -112
- package/workflows/Claude Assistant_workflow-1778380124051-mdibn807c.json +709 -0
- package/client/dist/assets/ActionBar-vzPpSR77.js +0 -1
- package/client/dist/assets/ApiKeyInput-Ds7AKFe8.js +0 -1
- package/client/dist/assets/ApiKeyPanel-gfblELep.js +0 -1
- package/client/dist/assets/ApiUsageSection-BMNWTe2r.js +0 -1
- package/client/dist/assets/EmailPanel-B1Om64p5.js +0 -1
- package/client/dist/assets/OAuthPanel-CXyQYGBz.js +0 -1
- package/client/dist/assets/QrPairingPanel-BgNuI1we.js +0 -1
- package/client/dist/assets/RateLimitSection-YYK8sx1T.js +0 -1
- package/client/dist/assets/StatusCard-DuYA5hJR.js +0 -1
- package/client/dist/assets/index-D9tZfgvi.js +0 -363
- package/client/dist/assets/index-al7snTkG.css +0 -1
- package/client/src/components/credentials/providers.tsx +0 -177
- package/server/routers/google.py +0 -277
- package/server/routers/maps.py +0 -142
- package/server/routers/twitter.py +0 -365
- package/server/services/claude_code_service.py +0 -106
- package/server/services/memory.py +0 -159
- package/server/services/node_option_loaders/__init__.py +0 -77
- package/server/services/node_option_loaders/android_loaders.py +0 -55
- package/server/services/node_option_loaders/google_loaders.py +0 -97
- package/server/services/node_option_loaders/whatsapp_loaders.py +0 -69
- package/server/services/twitter_oauth.py +0 -411
- package/server/services/websocket_client.py +0 -29
- /package/server/{services/android → nodes/android/_relay}/__init__.py +0 -0
- /package/server/{services/android → nodes/android/_relay}/broadcaster.py +0 -0
- /package/server/{services/android → nodes/android/_relay}/manager.py +0 -0
- /package/server/{services/android → nodes/android/_relay}/protocol.py +0 -0
- /package/server/{services/browser_service.py → nodes/browser/_service.py} +0 -0
- /package/server/{services/whatsapp_service.py → nodes/whatsapp/_service.py} +0 -0
- /package/server/skills/{task_agent → assistant}/write-todos-skill/SKILL.md +0 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""WhatsApp service-status refresh callback (Wave 11.I, milestone J).
|
|
2
|
+
|
|
3
|
+
Moved from ``services/status_broadcaster._refresh_whatsapp_status``.
|
|
4
|
+
Plugin packages register their own callback via
|
|
5
|
+
``status_broadcaster.register_service_refresh``; the broadcaster no
|
|
6
|
+
longer hardcodes a per-service refresh.
|
|
7
|
+
|
|
8
|
+
Calls the Go-service ``status`` RPC via the plugin's own client and
|
|
9
|
+
mirrors the result into the broadcaster cache. Silently swallows
|
|
10
|
+
exceptions if the WhatsApp Go service is unavailable -- mirrors
|
|
11
|
+
pre-migration behaviour.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import logging
|
|
17
|
+
import time
|
|
18
|
+
from typing import TYPE_CHECKING
|
|
19
|
+
|
|
20
|
+
from opentelemetry import trace
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from services.status_broadcaster import StatusBroadcaster
|
|
24
|
+
|
|
25
|
+
logger = logging.getLogger(__name__)
|
|
26
|
+
tracer = trace.get_tracer(__name__)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
async def refresh_whatsapp_status(broadcaster: "StatusBroadcaster") -> None:
|
|
30
|
+
"""Refresh WhatsApp cache + broadcast. One pass per
|
|
31
|
+
``_refresh_all_services`` cycle.
|
|
32
|
+
"""
|
|
33
|
+
with tracer.start_as_current_span("broadcaster.refresh_whatsapp") as span:
|
|
34
|
+
try:
|
|
35
|
+
from ._service import get_client
|
|
36
|
+
|
|
37
|
+
client = await get_client()
|
|
38
|
+
status_data = await client.call("status")
|
|
39
|
+
|
|
40
|
+
broadcaster._status["whatsapp"] = {
|
|
41
|
+
"connected": status_data.get("connected", False),
|
|
42
|
+
"has_session": status_data.get("has_session", False),
|
|
43
|
+
"running": status_data.get("running", False),
|
|
44
|
+
"pairing": status_data.get("pairing", False),
|
|
45
|
+
"device_id": status_data.get("device_id"),
|
|
46
|
+
"qr": None,
|
|
47
|
+
"timestamp": time.time(),
|
|
48
|
+
}
|
|
49
|
+
logger.debug(
|
|
50
|
+
"[StatusBroadcaster] Refreshed WhatsApp status: connected=%s",
|
|
51
|
+
status_data.get("connected"),
|
|
52
|
+
)
|
|
53
|
+
await broadcaster.broadcast({
|
|
54
|
+
"type": "whatsapp_status",
|
|
55
|
+
"data": broadcaster._status["whatsapp"],
|
|
56
|
+
})
|
|
57
|
+
span.set_attribute("connected", bool(status_data.get("connected", False)))
|
|
58
|
+
except Exception as exc: # noqa: BLE001
|
|
59
|
+
span.record_exception(exc)
|
|
60
|
+
logger.debug(
|
|
61
|
+
"[StatusBroadcaster] Could not refresh WhatsApp status: %s", exc
|
|
62
|
+
)
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Spawns the binary with cwd inside the project (``<data_dir>/whatsapp``)
|
|
4
4
|
so the SQLite session DB lives next to ``credentials.db`` and survives
|
|
5
5
|
``pnpm install``, version bumps, and worktree switches. Lazy-init from
|
|
6
|
-
``
|
|
6
|
+
``nodes.whatsapp._service.get_client()``; teardown from FastAPI lifespan.
|
|
7
7
|
|
|
8
8
|
Subclasses :class:`BaseProcessSupervisor` for spawning, tree-kill, status
|
|
9
9
|
snapshots, restart policy, and the singleton ``get_instance()`` accessor.
|
package/server/pyproject.toml
CHANGED
|
@@ -43,21 +43,28 @@ dependencies = [
|
|
|
43
43
|
"cryptography>=44.0.0",
|
|
44
44
|
|
|
45
45
|
# AI - All providers (directly imported in ai.py)
|
|
46
|
-
#
|
|
47
|
-
#
|
|
48
|
-
#
|
|
49
|
-
#
|
|
50
|
-
#
|
|
51
|
-
|
|
52
|
-
"langchain-
|
|
46
|
+
# Originally pinned to lockstep with main to neutralise a tool_calls
|
|
47
|
+
# empty-payload regression. Lifted to 1.3.x in response to security
|
|
48
|
+
# advisories GHSA-jcc3-qxqm-r62h (unsafe deserialization in
|
|
49
|
+
# langchain-core <=1.3.2), the langchain-openai DNS-rebinding SSRF
|
|
50
|
+
# advisory (<1.1.14), and the langchain-text-splitters SSRF advisory
|
|
51
|
+
# (<1.1.2). Full backend suite (1018/1018) re-validated after the bump.
|
|
52
|
+
"langchain-core==1.3.3",
|
|
53
|
+
"langchain-openai==1.1.14",
|
|
53
54
|
"langchain-anthropic==1.4.0",
|
|
54
55
|
"anthropic==0.94.0",
|
|
55
56
|
"langchain-google-genai==4.2.1",
|
|
56
57
|
"google-genai==1.72.0",
|
|
57
58
|
"langchain-groq==1.1.2",
|
|
58
59
|
"langchain-cerebras==0.8.2",
|
|
60
|
+
# textChunker plugin (recursive / markdown / token strategies). Bumped
|
|
61
|
+
# to 1.1.2+ alongside langchain-core 1.3.3 to clear the
|
|
62
|
+
# HTMLHeaderTextSplitter SSRF advisory; the 1.1 line requires
|
|
63
|
+
# langchain-core>=1.3, which we now satisfy.
|
|
64
|
+
"langchain-text-splitters==1.1.2",
|
|
59
65
|
"langgraph==1.1.6",
|
|
60
66
|
"deepagents==0.5.2",
|
|
67
|
+
|
|
61
68
|
# Pydantic 2.13 changed validator ordering; pin to main's 2.12 line
|
|
62
69
|
# to keep AIMessage construction/tool-schema generation identical.
|
|
63
70
|
"pydantic==2.12.5",
|
|
@@ -91,6 +98,14 @@ dependencies = [
|
|
|
91
98
|
# Markdown formatting (GFM to platform-native)
|
|
92
99
|
"markdown-it-py>=3.0.0",
|
|
93
100
|
|
|
101
|
+
# Local LLM SDKs — used by `nodes/model/_local_validator.py` to
|
|
102
|
+
# introspect the user's actually-loaded models (context_length,
|
|
103
|
+
# max_output_tokens). Replaces hand-rolled httpx probes against
|
|
104
|
+
# /api/show and /api/v0/models so each SDK's own typed result
|
|
105
|
+
# struct is the source of truth.
|
|
106
|
+
"ollama>=0.6.0",
|
|
107
|
+
"lmstudio>=1.5.0",
|
|
108
|
+
|
|
94
109
|
# Gmail API
|
|
95
110
|
"google-api-python-client>=2.100.0",
|
|
96
111
|
"google-auth>=2.27.0",
|
|
@@ -102,6 +117,11 @@ dependencies = [
|
|
|
102
117
|
|
|
103
118
|
# RLM (Recursive Language Models) agent
|
|
104
119
|
"rlms>=0.1.1",
|
|
120
|
+
|
|
121
|
+
# MCP (Model Context Protocol) — host server for spawned CLI sessions
|
|
122
|
+
# to discover and call MachinaOs tools (mcp__machina__*) the same way
|
|
123
|
+
# VSCode's Claude Code extension does.
|
|
124
|
+
"mcp>=1.0.0",
|
|
105
125
|
]
|
|
106
126
|
|
|
107
127
|
[project.optional-dependencies]
|
|
@@ -116,6 +136,8 @@ dev = [
|
|
|
116
136
|
docs = [
|
|
117
137
|
"beautifulsoup4>=4.12.0",
|
|
118
138
|
"pypdf>=5.0.0",
|
|
139
|
+
# `langchain-text-splitters` moved to top-level dependencies (above) —
|
|
140
|
+
# the textChunker plugin is part of the runtime, not optional.
|
|
119
141
|
]
|
|
120
142
|
keyring = [
|
|
121
143
|
"keyring>=25.0.0", # OS-native credential storage (Windows/macOS/Linux)
|
|
@@ -100,7 +100,7 @@ async def load_options(method: str, body: dict | None = None):
|
|
|
100
100
|
parameter map (e.g. ``{"group_id": "..."}`` for
|
|
101
101
|
whatsappGroupMembers).
|
|
102
102
|
"""
|
|
103
|
-
from services.
|
|
103
|
+
from services.ws_handler_registry import dispatch_load_options
|
|
104
104
|
|
|
105
105
|
params = (body or {}).get("params", body or {}) if isinstance(body, dict) else {}
|
|
106
106
|
options = await dispatch_load_options(method, params)
|
|
@@ -111,7 +111,7 @@ async def load_options(method: str, body: dict | None = None):
|
|
|
111
111
|
async def list_load_options():
|
|
112
112
|
"""Registered loadOptionsMethod names. Editor probes this on boot
|
|
113
113
|
to know which dynamic-option loaders are wired backend-side."""
|
|
114
|
-
from services.
|
|
114
|
+
from services.ws_handler_registry import list_load_options_methods
|
|
115
115
|
|
|
116
116
|
return {"methods": list_load_options_methods()}
|
|
117
117
|
|
|
@@ -1,14 +1,23 @@
|
|
|
1
1
|
"""Dynamic webhook endpoint router for incoming HTTP requests.
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
Two dispatch paths:
|
|
4
|
+
|
|
5
|
+
1. **Plugin-owned WebhookSource** (Wave 12 framework). Plugins register
|
|
6
|
+
a :class:`services.events.WebhookSource` for their path; the router
|
|
7
|
+
verifies the signature, shapes a :class:`WorkflowEvent`, and queues
|
|
8
|
+
it onto the source. The source's owning plugin pulls events via
|
|
9
|
+
``source.emit()`` and dispatches into ``event_waiter``.
|
|
10
|
+
2. **Legacy generic webhook** (pre-framework). Falls through to
|
|
11
|
+
``broadcaster.send_custom_event("webhook_received", …)`` so existing
|
|
12
|
+
``webhookTrigger`` nodes keep working untouched.
|
|
5
13
|
"""
|
|
6
|
-
from fastapi import APIRouter, Request
|
|
14
|
+
from fastapi import APIRouter, HTTPException, Request
|
|
7
15
|
from fastapi.responses import JSONResponse
|
|
8
16
|
from typing import Dict
|
|
9
17
|
import asyncio
|
|
10
18
|
import logging
|
|
11
19
|
|
|
20
|
+
from services.events import WEBHOOK_SOURCES
|
|
12
21
|
from services.status_broadcaster import get_status_broadcaster
|
|
13
22
|
|
|
14
23
|
logger = logging.getLogger(__name__)
|
|
@@ -38,10 +47,21 @@ def resolve_webhook_response(node_id: str, response_data: dict):
|
|
|
38
47
|
async def handle_webhook(path: str, request: Request):
|
|
39
48
|
"""Handle incoming webhook requests.
|
|
40
49
|
|
|
41
|
-
|
|
42
|
-
|
|
50
|
+
Path-handler dispatch (Wave 12) runs first; legacy generic
|
|
51
|
+
dispatch is the fallback for paths nobody has claimed.
|
|
43
52
|
"""
|
|
44
|
-
|
|
53
|
+
source = WEBHOOK_SOURCES.get(path)
|
|
54
|
+
if source is not None:
|
|
55
|
+
try:
|
|
56
|
+
await source.handle(request)
|
|
57
|
+
except HTTPException:
|
|
58
|
+
raise
|
|
59
|
+
except Exception as e:
|
|
60
|
+
logger.exception("[Webhook] %s handler crashed: %s", path, e)
|
|
61
|
+
raise HTTPException(status_code=500, detail=str(e))
|
|
62
|
+
logger.info("[Webhook] %s %s -> %s", request.method, path, type(source).__name__)
|
|
63
|
+
return JSONResponse({"status": "received", "path": path}, status_code=200)
|
|
64
|
+
|
|
45
65
|
body = await request.body()
|
|
46
66
|
json_body = None
|
|
47
67
|
content_type = request.headers.get("content-type", "")
|
|
@@ -63,12 +83,9 @@ async def handle_webhook(path: str, request: Request):
|
|
|
63
83
|
|
|
64
84
|
logger.info(f"[Webhook] Received: {request.method} /webhook/{path}")
|
|
65
85
|
|
|
66
|
-
# Dispatch event using broadcaster (same pattern as WhatsApp)
|
|
67
86
|
broadcaster = get_status_broadcaster()
|
|
68
87
|
await broadcaster.send_custom_event("webhook_received", webhook_data)
|
|
69
88
|
|
|
70
|
-
# For now, always return immediate response
|
|
71
|
-
# TODO: Support responseNode mode by storing Future and waiting
|
|
72
89
|
return JSONResponse(
|
|
73
90
|
content={
|
|
74
91
|
"status": "received",
|