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
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import React, { useState } from 'react';
|
|
2
|
-
import { useAppTheme } from '../hooks/useAppTheme';
|
|
3
2
|
import { useAppStore } from '../store/useAppStore';
|
|
4
3
|
import { INodeOutputDefinition, NodeConnectionType } from '../types/INodeProperties';
|
|
5
4
|
import { useDragVariable } from '../hooks/useDragVariable';
|
|
@@ -121,8 +120,7 @@ const ANDROID_NODE_TYPES = [
|
|
|
121
120
|
];
|
|
122
121
|
|
|
123
122
|
const OutputPanel: React.FC<OutputPanelProps> = ({ nodeId }) => {
|
|
124
|
-
const
|
|
125
|
-
const { currentWorkflow } = useAppStore();
|
|
123
|
+
const currentWorkflow = useAppStore((s) => s.currentWorkflow);
|
|
126
124
|
const [expandedNode, setExpandedNode] = useState<string | null>(null);
|
|
127
125
|
const [isDragging, setIsDragging] = useState(false);
|
|
128
126
|
const [draggedParam, setDraggedParam] = useState<{ nodeId: string; output: string } | null>(null);
|
|
@@ -188,14 +186,15 @@ const OutputPanel: React.FC<OutputPanelProps> = ({ nodeId }) => {
|
|
|
188
186
|
return false;
|
|
189
187
|
};
|
|
190
188
|
|
|
191
|
-
// Helper to check if a node is a config/auxiliary node (connects to config handles)
|
|
189
|
+
// Helper to check if a node is a config/auxiliary node (connects to config handles).
|
|
190
|
+
// Backend auto-derives `uiHints.isConfigNode` from group membership
|
|
191
|
+
// (`memory` / `tool`) at registration time — see
|
|
192
|
+
// services/plugin/base.py::_derive_auto_ui_hints. Plugins can also
|
|
193
|
+
// set the flag explicitly to override.
|
|
192
194
|
const isConfigNode = (nodeType: string | undefined): boolean => {
|
|
193
195
|
if (!nodeType) return false;
|
|
194
196
|
const definition = resolveNodeDescription(nodeType);
|
|
195
|
-
|
|
196
|
-
// Config nodes typically have 'memory' or 'tool' in their group, or have no main input
|
|
197
|
-
const groups = definition.group || [];
|
|
198
|
-
return groups.includes('memory') || groups.includes('tool');
|
|
197
|
+
return definition?.uiHints?.isConfigNode === true;
|
|
199
198
|
};
|
|
200
199
|
|
|
201
200
|
// Get connected nodes with their outputs
|
|
@@ -288,24 +287,11 @@ const OutputPanel: React.FC<OutputPanelProps> = ({ nodeId }) => {
|
|
|
288
287
|
|
|
289
288
|
if (connectedNodes.length === 0) {
|
|
290
289
|
return (
|
|
291
|
-
<div
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
borderRight: `1px solid ${theme.colors.border}`,
|
|
297
|
-
display: 'flex',
|
|
298
|
-
flexDirection: 'column',
|
|
299
|
-
alignItems: 'center',
|
|
300
|
-
justifyContent: 'center'
|
|
301
|
-
}}>
|
|
302
|
-
<p style={{
|
|
303
|
-
margin: 0,
|
|
304
|
-
fontSize: theme.fontSize.sm,
|
|
305
|
-
color: theme.colors.textSecondary,
|
|
306
|
-
fontStyle: 'italic',
|
|
307
|
-
textAlign: 'center'
|
|
308
|
-
}}>
|
|
290
|
+
<div
|
|
291
|
+
className="flex h-full flex-col items-center justify-center border-r border-border-default bg-bg-panel p-3"
|
|
292
|
+
style={{ width: '300px' }}
|
|
293
|
+
>
|
|
294
|
+
<p className="m-0 text-center text-sm italic text-fg-muted">
|
|
309
295
|
No connected nodes.
|
|
310
296
|
<br />
|
|
311
297
|
Connect nodes to see their outputs here.
|
|
@@ -315,140 +301,78 @@ const OutputPanel: React.FC<OutputPanelProps> = ({ nodeId }) => {
|
|
|
315
301
|
}
|
|
316
302
|
|
|
317
303
|
return (
|
|
318
|
-
<div
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
borderRight: `1px solid ${theme.colors.border}`,
|
|
323
|
-
display: 'flex',
|
|
324
|
-
flexDirection: 'column'
|
|
325
|
-
}}>
|
|
304
|
+
<div
|
|
305
|
+
className="flex h-full flex-col border-r border-border-default bg-bg-panel"
|
|
306
|
+
style={{ width: '300px' }}
|
|
307
|
+
>
|
|
326
308
|
{/* Header */}
|
|
327
|
-
<div
|
|
328
|
-
|
|
329
|
-
backgroundColor: theme.colors.backgroundPanel,
|
|
330
|
-
borderBottom: `1px solid ${theme.colors.border}`,
|
|
331
|
-
fontSize: theme.fontSize.sm,
|
|
332
|
-
fontWeight: theme.fontWeight.semibold,
|
|
333
|
-
color: theme.colors.textSecondary,
|
|
334
|
-
textTransform: 'uppercase',
|
|
335
|
-
letterSpacing: '0.1em'
|
|
336
|
-
}}>
|
|
337
|
-
🔗 Connected Outputs
|
|
309
|
+
<div className="border-b border-border-default bg-bg-panel p-3 font-display text-sm font-semibold tracking-[var(--type-tracking-display)] text-fg-default [text-transform:var(--type-uppercase)]">
|
|
310
|
+
Connected Outputs
|
|
338
311
|
</div>
|
|
339
312
|
|
|
340
313
|
{/* Scrollable content */}
|
|
341
|
-
<div
|
|
342
|
-
flex: 1,
|
|
343
|
-
overflowY: 'auto',
|
|
344
|
-
padding: theme.spacing.sm
|
|
345
|
-
}}>
|
|
314
|
+
<div className="flex-1 overflow-y-auto p-2">
|
|
346
315
|
{connectedNodes.map((node) => (
|
|
347
|
-
<div
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
backgroundColor: theme.colors.background,
|
|
352
|
-
overflow: 'hidden'
|
|
353
|
-
}}>
|
|
316
|
+
<div
|
|
317
|
+
key={node.nodeId}
|
|
318
|
+
className="mb-1 overflow-hidden rounded-sm border border-border-default bg-bg-elevated"
|
|
319
|
+
>
|
|
354
320
|
<div
|
|
355
321
|
onClick={() => setExpandedNode(expandedNode === node.nodeId ? null : node.nodeId)}
|
|
356
|
-
|
|
357
|
-
padding: theme.spacing.sm,
|
|
358
|
-
cursor: 'pointer',
|
|
359
|
-
display: 'flex',
|
|
360
|
-
alignItems: 'center',
|
|
361
|
-
justifyContent: 'space-between',
|
|
362
|
-
backgroundColor: theme.colors.backgroundAlt,
|
|
363
|
-
transition: theme.transitions.fast
|
|
364
|
-
}}
|
|
322
|
+
className="flex cursor-pointer items-center justify-between bg-bg-panel p-2 transition-colors"
|
|
365
323
|
>
|
|
366
|
-
<span
|
|
367
|
-
fontSize: theme.fontSize.sm,
|
|
368
|
-
fontWeight: theme.fontWeight.medium,
|
|
369
|
-
color: theme.colors.text
|
|
370
|
-
}}>
|
|
324
|
+
<span className="text-sm font-medium text-fg-default">
|
|
371
325
|
{node.nodeName}
|
|
372
326
|
</span>
|
|
373
|
-
<span
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
327
|
+
<span
|
|
328
|
+
className="text-xs text-fg-muted"
|
|
329
|
+
style={{
|
|
330
|
+
transform: expandedNode === node.nodeId ? 'rotate(180deg)' : 'rotate(0deg)',
|
|
331
|
+
transition: 'transform 0.2s ease'
|
|
332
|
+
}}
|
|
333
|
+
>
|
|
379
334
|
▼
|
|
380
335
|
</span>
|
|
381
336
|
</div>
|
|
382
337
|
|
|
383
338
|
{expandedNode === node.nodeId && (
|
|
384
|
-
<div
|
|
385
|
-
padding: theme.spacing.sm,
|
|
386
|
-
borderTop: `1px solid ${theme.colors.border}`
|
|
387
|
-
}}>
|
|
339
|
+
<div className="border-t border-border-default p-2">
|
|
388
340
|
{node.outputs.length === 0 ? (
|
|
389
|
-
<p
|
|
390
|
-
margin: 0,
|
|
391
|
-
fontSize: theme.fontSize.xs,
|
|
392
|
-
color: theme.colors.textSecondary,
|
|
393
|
-
fontStyle: 'italic',
|
|
394
|
-
padding: theme.spacing.xs
|
|
395
|
-
}}>
|
|
341
|
+
<p className="m-0 p-1 text-xs italic text-fg-muted">
|
|
396
342
|
No output parameters available
|
|
397
343
|
</p>
|
|
398
344
|
) : (
|
|
399
|
-
node.outputs.map((output) =>
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
<div>
|
|
423
|
-
<div style={{
|
|
424
|
-
fontSize: theme.fontSize.sm,
|
|
425
|
-
fontWeight: theme.fontWeight.medium,
|
|
426
|
-
color: theme.colors.text,
|
|
427
|
-
marginBottom: '2px'
|
|
428
|
-
}}>
|
|
429
|
-
{output.displayName}
|
|
345
|
+
node.outputs.map((output) => {
|
|
346
|
+
const isActiveDrag =
|
|
347
|
+
isDragging &&
|
|
348
|
+
draggedParam?.nodeId === node.nodeId &&
|
|
349
|
+
draggedParam?.output === output.name;
|
|
350
|
+
return (
|
|
351
|
+
<div
|
|
352
|
+
key={output.name}
|
|
353
|
+
draggable
|
|
354
|
+
onDragStart={(e) => handleDragStart(e, node.nodeId, output.name)}
|
|
355
|
+
onDragEnd={handleDragEnd}
|
|
356
|
+
className={`mb-1 cursor-grab rounded-sm border border-border-default p-1 transition-colors ${
|
|
357
|
+
isActiveDrag ? 'bg-accent' : 'bg-bg-panel'
|
|
358
|
+
}`}
|
|
359
|
+
>
|
|
360
|
+
<div className="flex items-center justify-between">
|
|
361
|
+
<div>
|
|
362
|
+
<div className="mb-0.5 text-sm font-medium text-fg-default">
|
|
363
|
+
{output.displayName}
|
|
364
|
+
</div>
|
|
365
|
+
<div className="text-xs text-fg-muted">
|
|
366
|
+
{output.type} • {output.description}
|
|
367
|
+
</div>
|
|
430
368
|
</div>
|
|
431
|
-
<div
|
|
432
|
-
|
|
433
|
-
color: theme.colors.textSecondary
|
|
434
|
-
}}>
|
|
435
|
-
{output.type} • {output.description}
|
|
369
|
+
<div className="rounded-sm border border-border-default bg-bg-elevated px-1 py-0.5 font-mono text-xs text-fg-muted">
|
|
370
|
+
{output.name}
|
|
436
371
|
</div>
|
|
437
372
|
</div>
|
|
438
|
-
<div style={{
|
|
439
|
-
fontSize: theme.fontSize.xs,
|
|
440
|
-
color: theme.colors.textSecondary,
|
|
441
|
-
fontFamily: 'monospace',
|
|
442
|
-
padding: `2px ${theme.spacing.xs}`,
|
|
443
|
-
backgroundColor: theme.colors.background,
|
|
444
|
-
borderRadius: theme.borderRadius.sm,
|
|
445
|
-
border: `1px solid ${theme.colors.border}`
|
|
446
|
-
}}>
|
|
447
|
-
{output.name}
|
|
448
|
-
</div>
|
|
449
373
|
</div>
|
|
450
|
-
|
|
451
|
-
)
|
|
374
|
+
);
|
|
375
|
+
})
|
|
452
376
|
)}
|
|
453
377
|
</div>
|
|
454
378
|
)}
|
|
@@ -457,18 +381,11 @@ const OutputPanel: React.FC<OutputPanelProps> = ({ nodeId }) => {
|
|
|
457
381
|
</div>
|
|
458
382
|
|
|
459
383
|
{/* Footer */}
|
|
460
|
-
<div
|
|
461
|
-
|
|
462
|
-
backgroundColor: theme.colors.backgroundPanel,
|
|
463
|
-
borderTop: `1px solid ${theme.colors.border}`,
|
|
464
|
-
fontSize: theme.fontSize.xs,
|
|
465
|
-
color: theme.colors.textSecondary,
|
|
466
|
-
textAlign: 'center'
|
|
467
|
-
}}>
|
|
468
|
-
💡 Drag outputs to parameter fields
|
|
384
|
+
<div className="border-t border-border-default bg-bg-panel p-2 text-center text-xs text-fg-muted">
|
|
385
|
+
Drag outputs to parameter fields
|
|
469
386
|
</div>
|
|
470
387
|
</div>
|
|
471
388
|
);
|
|
472
389
|
};
|
|
473
390
|
|
|
474
|
-
export default OutputPanel;
|
|
391
|
+
export default OutputPanel;
|
|
@@ -18,7 +18,10 @@ import { AI_MODEL_PROVIDER_MAP } from '../lib/aiModelProviders';
|
|
|
18
18
|
|
|
19
19
|
import { resolveNodeDescription } from '../lib/nodeSpec';
|
|
20
20
|
// Map node types to provider keys for AI model nodes
|
|
21
|
-
// Uses the centralized map from
|
|
21
|
+
// Uses the centralized map from aiModelProviders.ts. Local-server
|
|
22
|
+
// providers (ollama, lmstudio) live in that map alongside the cloud
|
|
23
|
+
// providers, so no per-type override is needed here. The remaining
|
|
24
|
+
// aliases below cover renamed-but-still-saved-in-old-workflows types.
|
|
22
25
|
const NODE_TYPE_TO_PROVIDER: Record<string, string> = {
|
|
23
26
|
...AI_MODEL_PROVIDER_MAP,
|
|
24
27
|
// Legacy aliases for backward compatibility
|
|
@@ -26,7 +29,6 @@ const NODE_TYPE_TO_PROVIDER: Record<string, string> = {
|
|
|
26
29
|
'googleChatModel': 'gemini',
|
|
27
30
|
'azureChatModel': 'azure_openai',
|
|
28
31
|
'cohereChatModel': 'cohere',
|
|
29
|
-
'ollamaChatModel': 'ollama',
|
|
30
32
|
};
|
|
31
33
|
|
|
32
34
|
// Collection Renderer - n8n official style
|
|
@@ -983,7 +985,7 @@ const ParameterRenderer: React.FC<ParameterRendererProps> = ({
|
|
|
983
985
|
const [dynamicOptions, setDynamicOptions] = useState<INodePropertyOption[]>([]);
|
|
984
986
|
const [nodeParameters, setNodeParameters] = useState<Record<string, any>>({});
|
|
985
987
|
|
|
986
|
-
const
|
|
988
|
+
const selectedNode = useAppStore((s) => s.selectedNode);
|
|
987
989
|
const { getNodeParameters, sendRequest } = useWebSocket();
|
|
988
990
|
const { getStoredApiKey, hasStoredKey, getStoredModels, getProviderDefaults } = useApiKeys();
|
|
989
991
|
|
|
@@ -4,7 +4,6 @@ import { zodResolver } from '@hookform/resolvers/zod';
|
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import Modal from './ui/Modal';
|
|
6
6
|
import CodeEditor from './ui/CodeEditor';
|
|
7
|
-
import { useAppTheme } from '../hooks/useAppTheme';
|
|
8
7
|
import { useWebSocket } from '../contexts/WebSocketContext';
|
|
9
8
|
import {
|
|
10
9
|
Form,
|
|
@@ -25,6 +24,8 @@ import {
|
|
|
25
24
|
SelectValue,
|
|
26
25
|
} from '@/components/ui/select';
|
|
27
26
|
import { Button } from '@/components/ui/button';
|
|
27
|
+
import { ActionButton } from '@/components/ui/action-button';
|
|
28
|
+
import { Alert, AlertDescription } from '@/components/ui/alert';
|
|
28
29
|
import { Switch } from '@/components/ui/switch';
|
|
29
30
|
|
|
30
31
|
// ---------------------------------------------------------------------------
|
|
@@ -107,7 +108,6 @@ const SkillEditorModal: React.FC<SkillEditorModalProps> = ({
|
|
|
107
108
|
skill,
|
|
108
109
|
onSave,
|
|
109
110
|
}) => {
|
|
110
|
-
const theme = useAppTheme();
|
|
111
111
|
const { sendRequest } = useWebSocket();
|
|
112
112
|
const [activeTab, setActiveTab] = React.useState<'details' | 'instructions'>('details');
|
|
113
113
|
const [submitError, setSubmitError] = React.useState<string | null>(null);
|
|
@@ -157,7 +157,7 @@ const SkillEditorModal: React.FC<SkillEditorModalProps> = ({
|
|
|
157
157
|
const isExisting = !!form.watch('id');
|
|
158
158
|
const tabBaseClass =
|
|
159
159
|
'px-4 py-2 text-sm font-medium border-b-2 border-transparent transition-colors';
|
|
160
|
-
const tabActiveClass = 'border-
|
|
160
|
+
const tabActiveClass = 'border-primary text-foreground';
|
|
161
161
|
const tabInactiveClass = 'text-muted-foreground hover:text-foreground';
|
|
162
162
|
|
|
163
163
|
return (
|
|
@@ -382,27 +382,18 @@ const SkillEditorModal: React.FC<SkillEditorModalProps> = ({
|
|
|
382
382
|
</div>
|
|
383
383
|
|
|
384
384
|
{submitError && (
|
|
385
|
-
<
|
|
386
|
-
|
|
387
|
-
>
|
|
388
|
-
{submitError}
|
|
389
|
-
</div>
|
|
385
|
+
<Alert variant="destructive" className="rounded-none border-x-0 border-b-0">
|
|
386
|
+
<AlertDescription>{submitError}</AlertDescription>
|
|
387
|
+
</Alert>
|
|
390
388
|
)}
|
|
391
389
|
|
|
392
|
-
<div
|
|
393
|
-
className="flex justify-end gap-3 border-t border-border bg-card px-4 py-3"
|
|
394
|
-
style={{ backgroundColor: theme.colors.backgroundPanel }}
|
|
395
|
-
>
|
|
390
|
+
<div className="flex justify-end gap-3 border-t border-border bg-card px-4 py-3">
|
|
396
391
|
<Button type="button" variant="outline" onClick={onClose}>
|
|
397
392
|
Cancel
|
|
398
393
|
</Button>
|
|
399
|
-
<
|
|
400
|
-
type="submit"
|
|
401
|
-
disabled={isSaving}
|
|
402
|
-
className="bg-dracula-purple text-white hover:bg-dracula-purple/90"
|
|
403
|
-
>
|
|
394
|
+
<ActionButton intent="save" type="submit" disabled={isSaving}>
|
|
404
395
|
{isSaving ? 'Saving...' : isExisting ? 'Update Skill' : 'Create Skill'}
|
|
405
|
-
</
|
|
396
|
+
</ActionButton>
|
|
406
397
|
</div>
|
|
407
398
|
</form>
|
|
408
399
|
</Form>
|