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,15 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { LayoutGrid, GitBranch, Bot, Wrench, ArrowLeftRight } from 'lucide-react';
|
|
3
|
-
|
|
4
|
-
type NodeRole = 'model' | 'skill' | 'agent' | 'workflow' | 'trigger';
|
|
5
|
-
|
|
6
|
-
const ROLE_CLASSES: Record<NodeRole, { card: string; text: string }> = {
|
|
7
|
-
model: { card: 'bg-node-model-soft border-node-model-border', text: 'text-node-model' },
|
|
8
|
-
skill: { card: 'bg-node-skill-soft border-node-skill-border', text: 'text-node-skill' },
|
|
9
|
-
agent: { card: 'bg-node-agent-soft border-node-agent-border', text: 'text-node-agent' },
|
|
10
|
-
workflow: { card: 'bg-node-workflow-soft border-node-workflow-border', text: 'text-node-workflow' },
|
|
11
|
-
trigger: { card: 'bg-node-trigger-soft border-node-trigger-border', text: 'text-node-trigger' },
|
|
12
|
-
};
|
|
3
|
+
import { NODE_ROLE_CLASSES, type NodeRole } from '../nodeRoleClasses';
|
|
13
4
|
|
|
14
5
|
const concepts: { Icon: typeof LayoutGrid; title: string; desc: string; role: NodeRole }[] = [
|
|
15
6
|
{
|
|
@@ -56,7 +47,7 @@ const ConceptsStep: React.FC = () => {
|
|
|
56
47
|
|
|
57
48
|
<div className="flex w-full flex-col gap-2.5">
|
|
58
49
|
{concepts.map((c) => {
|
|
59
|
-
const classes =
|
|
50
|
+
const classes = NODE_ROLE_CLASSES[c.role];
|
|
60
51
|
return (
|
|
61
52
|
<div
|
|
62
53
|
key={c.title}
|
|
@@ -2,15 +2,7 @@ import React from 'react';
|
|
|
2
2
|
import { Play, FlaskConical, BookOpen, Settings } from 'lucide-react';
|
|
3
3
|
import { Card, CardContent } from '@/components/ui/card';
|
|
4
4
|
import { Badge } from '@/components/ui/badge';
|
|
5
|
-
|
|
6
|
-
type NodeRole = 'skill' | 'agent' | 'model' | 'workflow';
|
|
7
|
-
|
|
8
|
-
const ROLE_CLASSES: Record<NodeRole, { card: string; text: string }> = {
|
|
9
|
-
skill: { card: 'bg-node-skill-soft border-node-skill-border', text: 'text-node-skill' },
|
|
10
|
-
agent: { card: 'bg-node-agent-soft border-node-agent-border', text: 'text-node-agent' },
|
|
11
|
-
model: { card: 'bg-node-model-soft border-node-model-border', text: 'text-node-model' },
|
|
12
|
-
workflow: { card: 'bg-node-workflow-soft border-node-workflow-border', text: 'text-node-workflow' },
|
|
13
|
-
};
|
|
5
|
+
import { NODE_ROLE_CLASSES, type NodeRole } from '../nodeRoleClasses';
|
|
14
6
|
|
|
15
7
|
type Tip = {
|
|
16
8
|
Icon: typeof Play;
|
|
@@ -69,7 +61,7 @@ const GetStartedStep: React.FC = () => {
|
|
|
69
61
|
|
|
70
62
|
<div className="flex w-full flex-col gap-2.5">
|
|
71
63
|
{tips.map(({ Icon, title, desc, role }, i) => {
|
|
72
|
-
const classes =
|
|
64
|
+
const classes = NODE_ROLE_CLASSES[role];
|
|
73
65
|
return (
|
|
74
66
|
<Card key={i} className={classes.card}>
|
|
75
67
|
<CardContent className="flex items-start gap-2.5 p-3">
|
|
@@ -155,7 +155,7 @@ const DraggableVar: React.FC<DraggableVarProps> = ({
|
|
|
155
155
|
// ---------------------------------------------------------------------------
|
|
156
156
|
|
|
157
157
|
const InputSection: React.FC<InputSectionProps> = ({ nodeId, visible = true }) => {
|
|
158
|
-
const
|
|
158
|
+
const currentWorkflow = useAppStore((s) => s.currentWorkflow);
|
|
159
159
|
const { getNodeOutput, sendRequest } = useWebSocket();
|
|
160
160
|
const [expandedNodes, setExpandedNodes] = useState<Set<string>>(new Set());
|
|
161
161
|
const [connectedNodes, setConnectedNodes] = useState<NodeData[]>([]);
|
|
@@ -183,13 +183,15 @@ const InputSection: React.FC<InputSectionProps> = ({ nodeId, visible = true }) =
|
|
|
183
183
|
return false;
|
|
184
184
|
};
|
|
185
185
|
|
|
186
|
-
// Helper to check if a node is a config/auxiliary node
|
|
186
|
+
// Helper to check if a node is a config/auxiliary node.
|
|
187
|
+
// Backend auto-derives `uiHints.isConfigNode` from group membership
|
|
188
|
+
// (`memory` / `tool`) at registration time — see
|
|
189
|
+
// services/plugin/base.py::_derive_auto_ui_hints. Plugins can also
|
|
190
|
+
// set the flag explicitly to override.
|
|
187
191
|
const isConfigNode = (nodeType: string | undefined): boolean => {
|
|
188
192
|
if (!nodeType) return false;
|
|
189
193
|
const definition = resolveNodeDescription(nodeType);
|
|
190
|
-
|
|
191
|
-
const groups = definition.group || [];
|
|
192
|
-
return groups.includes('memory') || groups.includes('tool');
|
|
194
|
+
return definition?.uiHints?.isConfigNode === true;
|
|
193
195
|
};
|
|
194
196
|
|
|
195
197
|
const currentNode = nodes.find((node: Node) => node.id === nodeId);
|
|
@@ -516,7 +518,7 @@ const InputSection: React.FC<InputSectionProps> = ({ nodeId, visible = true }) =
|
|
|
516
518
|
{/* Header */}
|
|
517
519
|
<div className="flex shrink-0 items-center gap-2 border-b border-border bg-background px-4 py-3">
|
|
518
520
|
<Database className="h-4 w-4 text-muted-foreground" />
|
|
519
|
-
<span className="text-sm font-semibold text-
|
|
521
|
+
<span className="font-display text-sm font-semibold tracking-[var(--type-tracking-display)] text-fg-default [text-transform:var(--type-uppercase)]">Input Data & Variables</span>
|
|
520
522
|
<Badge variant="info">{connectedNodes.length}</Badge>
|
|
521
523
|
</div>
|
|
522
524
|
|
|
@@ -539,7 +541,7 @@ const InputSection: React.FC<InputSectionProps> = ({ nodeId, visible = true }) =
|
|
|
539
541
|
>
|
|
540
542
|
<div className="flex items-center gap-2">
|
|
541
543
|
<NodeIcon icon={node.icon} className="h-5 w-5 text-lg" />
|
|
542
|
-
<span className="text-sm font-semibold text-
|
|
544
|
+
<span className="font-display text-sm font-semibold text-fg-default">{node.name}</span>
|
|
543
545
|
</div>
|
|
544
546
|
<div className="flex items-center gap-2">
|
|
545
547
|
<Badge variant={node.hasExecutionData ? 'success' : 'warning'}>
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
SelectValue,
|
|
26
26
|
} from '@/components/ui/select';
|
|
27
27
|
|
|
28
|
-
import {
|
|
28
|
+
import { ActionButton } from '@/components/ui/action-button';
|
|
29
29
|
import { Alert as DSAlert, AlertDescription } from '@/components/ui/alert';
|
|
30
30
|
import {
|
|
31
31
|
Tooltip,
|
|
@@ -46,11 +46,11 @@ import {
|
|
|
46
46
|
} from '@/components/ui/alert-dialog';
|
|
47
47
|
import { toast } from 'sonner';
|
|
48
48
|
import { useQuery, useQueryClient } from '@tanstack/react-query';
|
|
49
|
-
import { useAppTheme } from '../../hooks/useAppTheme';
|
|
50
49
|
import { useWebSocket } from '../../contexts/WebSocketContext';
|
|
51
50
|
import { NodeIcon } from '../../assets/icons';
|
|
52
51
|
import { cn } from '@/lib/utils';
|
|
53
52
|
import { useFolderSkills } from '../../hooks/useFolderSkills';
|
|
53
|
+
import { useNodeAllowlist } from '../../hooks/useNodeAllowlist';
|
|
54
54
|
|
|
55
55
|
// Skill configuration stored in node parameters
|
|
56
56
|
// Key is skillName (folder name like 'whatsapp-skill')
|
|
@@ -117,7 +117,6 @@ const MasterSkillEditor: React.FC<MasterSkillEditorProps> = ({
|
|
|
117
117
|
onSkillFolderChange,
|
|
118
118
|
nodeId
|
|
119
119
|
}) => {
|
|
120
|
-
const theme = useAppTheme();
|
|
121
120
|
const { sendRequest } = useWebSocket();
|
|
122
121
|
const [selectedSkillName, setSelectedSkillName] = useState<string | null>(null);
|
|
123
122
|
const [isLoading, setIsLoading] = useState(false);
|
|
@@ -153,7 +152,18 @@ const MasterSkillEditor: React.FC<MasterSkillEditorProps> = ({
|
|
|
153
152
|
},
|
|
154
153
|
staleTime: Infinity,
|
|
155
154
|
});
|
|
156
|
-
|
|
155
|
+
|
|
156
|
+
// Filter out skill folders disabled via the allowlist
|
|
157
|
+
// (server/config/node_allowlist.json -> disabled_skill_folders).
|
|
158
|
+
// Same mode-independent enforcement as the credential-category and
|
|
159
|
+
// node-group blocklists. Use to auto-hide skill folders tied to a
|
|
160
|
+
// disabled feature (e.g. `android_agent` when android nodes +
|
|
161
|
+
// credentials are blocked).
|
|
162
|
+
const { isSkillFolderDisabled } = useNodeAllowlist();
|
|
163
|
+
const availableFolders = useMemo(
|
|
164
|
+
() => (foldersQuery.data ?? []).filter((f) => !isSkillFolderDisabled(f.name)),
|
|
165
|
+
[foldersQuery.data, isSkillFolderDisabled],
|
|
166
|
+
);
|
|
157
167
|
const foldersLoaded = !foldersQuery.isLoading;
|
|
158
168
|
|
|
159
169
|
const folderSkillsQuery = useFolderSkills(skillFolder);
|
|
@@ -507,58 +517,30 @@ const MasterSkillEditor: React.FC<MasterSkillEditorProps> = ({
|
|
|
507
517
|
const isEditingUserSkill = selectedSkillInfo?.isUserSkill && pendingSkillData;
|
|
508
518
|
|
|
509
519
|
return (
|
|
510
|
-
<div
|
|
511
|
-
display: 'flex',
|
|
512
|
-
flex: 1,
|
|
513
|
-
minHeight: 0,
|
|
514
|
-
gap: theme.spacing.md,
|
|
515
|
-
overflow: 'hidden'
|
|
516
|
-
}}>
|
|
520
|
+
<div className="flex flex-1 min-h-0 gap-3 overflow-hidden">
|
|
517
521
|
{/* Left Panel - Skills List */}
|
|
518
|
-
<div
|
|
519
|
-
flex: '0 0 260px',
|
|
520
|
-
display: 'flex',
|
|
521
|
-
flexDirection: 'column',
|
|
522
|
-
backgroundColor: theme.colors.background,
|
|
523
|
-
borderRadius: theme.borderRadius.md,
|
|
524
|
-
border: `1px solid ${theme.colors.border}`,
|
|
525
|
-
overflow: 'hidden'
|
|
526
|
-
}}>
|
|
522
|
+
<div className="flex flex-[0_0_260px] flex-col overflow-hidden rounded-md border border-border-default bg-bg-elevated">
|
|
527
523
|
{/* Header with count and create button */}
|
|
528
|
-
<div
|
|
529
|
-
|
|
530
|
-
borderBottom: `1px solid ${theme.colors.border}`,
|
|
531
|
-
backgroundColor: theme.colors.backgroundAlt,
|
|
532
|
-
display: 'flex',
|
|
533
|
-
alignItems: 'center',
|
|
534
|
-
justifyContent: 'space-between'
|
|
535
|
-
}}>
|
|
536
|
-
<span style={{ fontSize: theme.fontSize.sm, fontWeight: theme.fontWeight.semibold, color: theme.colors.text }}>
|
|
524
|
+
<div className="flex items-center justify-between border-b border-border-default bg-bg-panel p-2">
|
|
525
|
+
<span className="font-display tracking-[var(--type-tracking-display)] [text-transform:var(--type-uppercase)] text-sm font-semibold text-fg-default">
|
|
537
526
|
Skills
|
|
538
527
|
</span>
|
|
539
|
-
<div
|
|
540
|
-
<DSBadge
|
|
541
|
-
style={{ backgroundColor: theme.dracula.purple, color: '#fff' }}
|
|
542
|
-
className="h-5 min-w-5 justify-center rounded-full px-1.5"
|
|
543
|
-
>
|
|
528
|
+
<div className="flex items-center gap-1">
|
|
529
|
+
<DSBadge className="h-5 min-w-5 justify-center rounded-full bg-action-tools px-1.5 text-white">
|
|
544
530
|
{enabledCount}
|
|
545
531
|
</DSBadge>
|
|
546
532
|
<TooltipProvider>
|
|
547
533
|
<Tooltip>
|
|
548
534
|
<TooltipTrigger asChild>
|
|
549
|
-
<
|
|
550
|
-
|
|
551
|
-
variant="outline"
|
|
535
|
+
<ActionButton
|
|
536
|
+
intent="tools"
|
|
552
537
|
onClick={handleCreateSkill}
|
|
553
538
|
disabled={isCreatingNew}
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
borderColor: theme.dracula.green,
|
|
557
|
-
color: theme.dracula.green,
|
|
558
|
-
}}
|
|
539
|
+
className="h-7 px-2"
|
|
540
|
+
aria-label="Create new skill"
|
|
559
541
|
>
|
|
560
542
|
<Plus className="h-3.5 w-3.5" />
|
|
561
|
-
</
|
|
543
|
+
</ActionButton>
|
|
562
544
|
</TooltipTrigger>
|
|
563
545
|
<TooltipContent>Create new skill</TooltipContent>
|
|
564
546
|
</Tooltip>
|
|
@@ -616,7 +598,7 @@ const MasterSkillEditor: React.FC<MasterSkillEditorProps> = ({
|
|
|
616
598
|
</div>
|
|
617
599
|
|
|
618
600
|
{/* Skills List */}
|
|
619
|
-
<div
|
|
601
|
+
<div className="flex-1 overflow-y-auto">
|
|
620
602
|
{folderLoading ? (
|
|
621
603
|
<div className="mt-4 flex items-center justify-center gap-2 text-sm text-muted-foreground">
|
|
622
604
|
<Loader2 className="h-4 w-4 animate-spin" />
|
|
@@ -667,11 +649,11 @@ const MasterSkillEditor: React.FC<MasterSkillEditorProps> = ({
|
|
|
667
649
|
/>
|
|
668
650
|
<NodeIcon icon={skill.icon} className="h-4 w-4 text-base" />
|
|
669
651
|
<span
|
|
670
|
-
className=
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
}
|
|
652
|
+
className={cn(
|
|
653
|
+
'flex-1 overflow-hidden text-sm whitespace-nowrap text-ellipsis',
|
|
654
|
+
isSelected ? 'font-semibold' : 'font-medium',
|
|
655
|
+
isEnabled ? 'text-fg-default' : 'text-fg-muted',
|
|
656
|
+
)}
|
|
675
657
|
>
|
|
676
658
|
{skill.displayName}
|
|
677
659
|
</span>
|
|
@@ -679,23 +661,14 @@ const MasterSkillEditor: React.FC<MasterSkillEditorProps> = ({
|
|
|
679
661
|
<TooltipProvider>
|
|
680
662
|
<Tooltip>
|
|
681
663
|
<TooltipTrigger asChild>
|
|
682
|
-
<div
|
|
683
|
-
className="h-2 w-2 shrink-0 rounded-full"
|
|
684
|
-
style={{ backgroundColor: theme.dracula.orange }}
|
|
685
|
-
/>
|
|
664
|
+
<div className="h-2 w-2 shrink-0 rounded-full bg-warning" />
|
|
686
665
|
</TooltipTrigger>
|
|
687
666
|
<TooltipContent>Customized</TooltipContent>
|
|
688
667
|
</Tooltip>
|
|
689
668
|
</TooltipProvider>
|
|
690
669
|
)}
|
|
691
670
|
{skill.isUserSkill && (
|
|
692
|
-
<DSBadge
|
|
693
|
-
className="h-4 px-1 text-[10px]"
|
|
694
|
-
style={{
|
|
695
|
-
backgroundColor: `${theme.dracula.cyan}20`,
|
|
696
|
-
color: theme.dracula.cyan,
|
|
697
|
-
}}
|
|
698
|
-
>
|
|
671
|
+
<DSBadge className="h-4 bg-info/20 px-1 text-[10px] text-info">
|
|
699
672
|
Custom
|
|
700
673
|
</DSBadge>
|
|
701
674
|
)}
|
|
@@ -709,27 +682,12 @@ const MasterSkillEditor: React.FC<MasterSkillEditorProps> = ({
|
|
|
709
682
|
</div>
|
|
710
683
|
|
|
711
684
|
{/* Right Panel - Skill Editor */}
|
|
712
|
-
<div
|
|
713
|
-
flex: 1,
|
|
714
|
-
display: 'flex',
|
|
715
|
-
flexDirection: 'column',
|
|
716
|
-
backgroundColor: theme.colors.background,
|
|
717
|
-
borderRadius: theme.borderRadius.md,
|
|
718
|
-
border: `1px solid ${theme.colors.border}`,
|
|
719
|
-
overflow: 'hidden'
|
|
720
|
-
}}>
|
|
685
|
+
<div className="flex flex-1 flex-col overflow-hidden rounded-md border border-border-default bg-bg-elevated">
|
|
721
686
|
{/* Creating new skill */}
|
|
722
687
|
{isCreatingNew && pendingSkillData ? (
|
|
723
688
|
<>
|
|
724
689
|
{/* New Skill Header */}
|
|
725
|
-
<div
|
|
726
|
-
padding: theme.spacing.md,
|
|
727
|
-
borderBottom: `1px solid ${theme.colors.border}`,
|
|
728
|
-
backgroundColor: theme.colors.backgroundAlt,
|
|
729
|
-
display: 'flex',
|
|
730
|
-
alignItems: 'center',
|
|
731
|
-
gap: theme.spacing.md
|
|
732
|
-
}}>
|
|
690
|
+
<div className="flex items-center gap-3 border-b border-border-default bg-bg-panel p-3">
|
|
733
691
|
<div
|
|
734
692
|
className="flex h-10 w-10 items-center justify-center rounded-md border-2 border-dashed bg-tint-soft"
|
|
735
693
|
// currentColor is the new skill's brand color;
|
|
@@ -742,104 +700,89 @@ const MasterSkillEditor: React.FC<MasterSkillEditorProps> = ({
|
|
|
742
700
|
? <NodeIcon icon={pendingSkillData.icon} className="h-5 w-5 text-xl" />
|
|
743
701
|
: <Plus className="h-5 w-5" />}
|
|
744
702
|
</div>
|
|
745
|
-
<div
|
|
746
|
-
<div
|
|
747
|
-
fontSize: theme.fontSize.sm,
|
|
748
|
-
fontWeight: theme.fontWeight.semibold,
|
|
749
|
-
color: theme.dracula.green
|
|
750
|
-
}}>
|
|
703
|
+
<div className="flex-1">
|
|
704
|
+
<div className="font-display tracking-[var(--type-tracking-display)] [text-transform:var(--type-uppercase)] text-sm font-semibold text-success">
|
|
751
705
|
Create New Skill
|
|
752
706
|
</div>
|
|
753
|
-
<div
|
|
707
|
+
<div className="mt-0.5 text-xs text-fg-muted">
|
|
754
708
|
Fill in the details below and save
|
|
755
709
|
</div>
|
|
756
710
|
</div>
|
|
757
|
-
<
|
|
758
|
-
size="sm"
|
|
759
|
-
variant="outline"
|
|
760
|
-
onClick={handleCancelCreate}
|
|
761
|
-
style={{
|
|
762
|
-
backgroundColor: `${theme.dracula.red}15`,
|
|
763
|
-
borderColor: `${theme.dracula.red}40`,
|
|
764
|
-
color: theme.dracula.red,
|
|
765
|
-
}}
|
|
766
|
-
>
|
|
711
|
+
<ActionButton intent="stop" onClick={handleCancelCreate} className="h-8">
|
|
767
712
|
<X className="h-3.5 w-3.5" />
|
|
768
713
|
Cancel
|
|
769
|
-
</
|
|
770
|
-
<
|
|
771
|
-
|
|
772
|
-
variant="outline"
|
|
714
|
+
</ActionButton>
|
|
715
|
+
<ActionButton
|
|
716
|
+
intent="save"
|
|
773
717
|
onClick={handleSaveSkill}
|
|
774
718
|
disabled={savingSkill}
|
|
775
|
-
|
|
776
|
-
backgroundColor: `${theme.dracula.green}15`,
|
|
777
|
-
borderColor: `${theme.dracula.green}40`,
|
|
778
|
-
color: theme.dracula.green,
|
|
779
|
-
}}
|
|
719
|
+
className="h-8"
|
|
780
720
|
>
|
|
781
721
|
{savingSkill ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <Save className="h-3.5 w-3.5" />}
|
|
782
722
|
Save
|
|
783
|
-
</
|
|
723
|
+
</ActionButton>
|
|
784
724
|
</div>
|
|
785
725
|
|
|
786
726
|
{/* New Skill Form */}
|
|
787
|
-
<div
|
|
727
|
+
<div
|
|
728
|
+
ref={editorWrapperRef}
|
|
729
|
+
className="flex flex-1 flex-col gap-3 overflow-auto p-3"
|
|
730
|
+
>
|
|
788
731
|
{/* Display Name */}
|
|
789
732
|
<div>
|
|
790
|
-
<label
|
|
733
|
+
<label className="mb-1 block text-xs text-fg-muted">
|
|
791
734
|
Display Name *
|
|
792
735
|
</label>
|
|
793
736
|
<Input
|
|
794
737
|
value={pendingSkillData.display_name}
|
|
795
738
|
onChange={(e) => handlePendingDataChange('display_name', e.target.value)}
|
|
796
739
|
placeholder="My Custom Skill"
|
|
797
|
-
|
|
740
|
+
className="bg-bg-input border-border-default"
|
|
798
741
|
/>
|
|
799
742
|
</div>
|
|
800
743
|
|
|
801
744
|
{/* Description */}
|
|
802
745
|
<div>
|
|
803
|
-
<label
|
|
746
|
+
<label className="mb-1 block text-xs text-fg-muted">
|
|
804
747
|
Description
|
|
805
748
|
</label>
|
|
806
749
|
<Input
|
|
807
750
|
value={pendingSkillData.description}
|
|
808
751
|
onChange={(e) => handlePendingDataChange('description', e.target.value)}
|
|
809
752
|
placeholder="Brief description of what this skill does"
|
|
810
|
-
|
|
753
|
+
className="bg-bg-input border-border-default"
|
|
811
754
|
/>
|
|
812
755
|
</div>
|
|
813
756
|
|
|
814
757
|
{/* Icon and Color */}
|
|
815
|
-
<div
|
|
816
|
-
<div
|
|
817
|
-
<label
|
|
758
|
+
<div className="flex gap-3">
|
|
759
|
+
<div className="w-[100px]">
|
|
760
|
+
<label className="mb-1 block text-xs text-fg-muted">
|
|
818
761
|
Icon (emoji)
|
|
819
762
|
</label>
|
|
820
763
|
<Input
|
|
821
764
|
value={pendingSkillData.icon}
|
|
822
765
|
onChange={(e) => handlePendingDataChange('icon', e.target.value)}
|
|
823
766
|
placeholder=""
|
|
824
|
-
|
|
767
|
+
className="bg-bg-input border-border-default text-center"
|
|
825
768
|
/>
|
|
826
769
|
</div>
|
|
827
|
-
<div
|
|
828
|
-
<label
|
|
770
|
+
<div className="w-20">
|
|
771
|
+
<label className="mb-1 block text-xs text-fg-muted">
|
|
829
772
|
Color
|
|
830
773
|
</label>
|
|
831
774
|
<Input
|
|
832
775
|
type="color"
|
|
833
776
|
value={pendingSkillData.color}
|
|
834
777
|
onChange={(e) => handlePendingDataChange('color', e.target.value)}
|
|
835
|
-
|
|
778
|
+
className="h-8 bg-bg-input border-border-default p-0.5"
|
|
836
779
|
/>
|
|
837
780
|
</div>
|
|
838
781
|
</div>
|
|
839
782
|
|
|
840
783
|
{/* Instructions */}
|
|
841
|
-
<div
|
|
842
|
-
<label
|
|
784
|
+
<div className="flex flex-1 flex-col min-h-[200px]">
|
|
785
|
+
<label className="mb-1 block text-xs text-fg-muted">
|
|
843
786
|
Instructions *
|
|
844
787
|
</label>
|
|
845
788
|
<Textarea
|
|
@@ -847,13 +790,7 @@ const MasterSkillEditor: React.FC<MasterSkillEditorProps> = ({
|
|
|
847
790
|
onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => handlePendingDataChange('instructions', e.target.value)}
|
|
848
791
|
placeholder="# Skill Instructions..."
|
|
849
792
|
spellCheck={false}
|
|
850
|
-
className="flex-1 min-h-0 resize-none font-mono text-[13px] leading-[1.5]"
|
|
851
|
-
style={{
|
|
852
|
-
backgroundColor: theme.colors.backgroundAlt,
|
|
853
|
-
color: theme.colors.text,
|
|
854
|
-
borderColor: theme.colors.border,
|
|
855
|
-
borderRadius: theme.borderRadius.md,
|
|
856
|
-
}}
|
|
793
|
+
className="flex-1 min-h-0 resize-none rounded-md border-border-default bg-bg-input font-mono text-[13px] leading-[1.5] text-fg-default"
|
|
857
794
|
/>
|
|
858
795
|
</div>
|
|
859
796
|
</div>
|
|
@@ -861,46 +798,20 @@ const MasterSkillEditor: React.FC<MasterSkillEditorProps> = ({
|
|
|
861
798
|
) : selectedSkillInfo ? (
|
|
862
799
|
<>
|
|
863
800
|
{/* Skill Header */}
|
|
864
|
-
<div
|
|
865
|
-
padding: theme.spacing.md,
|
|
866
|
-
borderBottom: `1px solid ${theme.colors.border}`,
|
|
867
|
-
backgroundColor: theme.colors.backgroundAlt,
|
|
868
|
-
display: 'flex',
|
|
869
|
-
alignItems: 'center',
|
|
870
|
-
gap: theme.spacing.md
|
|
871
|
-
}}>
|
|
801
|
+
<div className="flex items-center gap-3 border-b border-border-default bg-bg-panel p-3">
|
|
872
802
|
<NodeIcon icon={selectedSkillInfo.icon} className="h-6 w-6 text-2xl" />
|
|
873
|
-
<div
|
|
803
|
+
<div className="flex-1">
|
|
874
804
|
{isEditingUserSkill ? (
|
|
875
805
|
<Input
|
|
876
806
|
value={pendingSkillData?.display_name || ''}
|
|
877
807
|
onChange={(e) => handlePendingDataChange('display_name', e.target.value)}
|
|
878
|
-
|
|
879
|
-
fontSize: theme.fontSize.sm,
|
|
880
|
-
fontWeight: theme.fontWeight.semibold,
|
|
881
|
-
backgroundColor: theme.colors.background,
|
|
882
|
-
borderColor: theme.colors.border,
|
|
883
|
-
marginBottom: 4
|
|
884
|
-
}}
|
|
808
|
+
className="mb-1 bg-bg-elevated border-border-default text-sm font-semibold"
|
|
885
809
|
/>
|
|
886
810
|
) : (
|
|
887
|
-
<div
|
|
888
|
-
fontSize: theme.fontSize.sm,
|
|
889
|
-
fontWeight: theme.fontWeight.semibold,
|
|
890
|
-
color: theme.colors.text,
|
|
891
|
-
display: 'flex',
|
|
892
|
-
alignItems: 'center',
|
|
893
|
-
gap: theme.spacing.sm
|
|
894
|
-
}}>
|
|
811
|
+
<div className="font-display tracking-[var(--type-tracking-display)] [text-transform:var(--type-uppercase)] flex items-center gap-2 text-sm font-semibold text-fg-default">
|
|
895
812
|
{selectedSkillInfo.displayName}
|
|
896
813
|
{selectedSkillConfig?.isCustomized && (
|
|
897
|
-
<DSBadge
|
|
898
|
-
className="h-4 text-xs"
|
|
899
|
-
style={{
|
|
900
|
-
backgroundColor: `${theme.dracula.orange}20`,
|
|
901
|
-
color: theme.dracula.orange,
|
|
902
|
-
}}
|
|
903
|
-
>
|
|
814
|
+
<DSBadge className="h-4 bg-warning/20 text-xs text-warning">
|
|
904
815
|
Customized
|
|
905
816
|
</DSBadge>
|
|
906
817
|
)}
|
|
@@ -911,14 +822,10 @@ const MasterSkillEditor: React.FC<MasterSkillEditorProps> = ({
|
|
|
911
822
|
value={pendingSkillData?.description || ''}
|
|
912
823
|
onChange={(e) => handlePendingDataChange('description', e.target.value)}
|
|
913
824
|
placeholder="Description"
|
|
914
|
-
|
|
915
|
-
fontSize: theme.fontSize.xs,
|
|
916
|
-
backgroundColor: theme.colors.background,
|
|
917
|
-
borderColor: theme.colors.border,
|
|
918
|
-
}}
|
|
825
|
+
className="bg-bg-elevated border-border-default text-xs"
|
|
919
826
|
/>
|
|
920
827
|
) : (
|
|
921
|
-
<div
|
|
828
|
+
<div className="mt-0.5 text-xs text-fg-muted">
|
|
922
829
|
{selectedSkillInfo.description}
|
|
923
830
|
</div>
|
|
924
831
|
)}
|
|
@@ -928,35 +835,22 @@ const MasterSkillEditor: React.FC<MasterSkillEditorProps> = ({
|
|
|
928
835
|
{isEditingUserSkill && (
|
|
929
836
|
<>
|
|
930
837
|
{hasUnsavedChanges && (
|
|
931
|
-
<
|
|
932
|
-
|
|
933
|
-
variant="outline"
|
|
838
|
+
<ActionButton
|
|
839
|
+
intent="save"
|
|
934
840
|
onClick={handleSaveSkill}
|
|
935
841
|
disabled={savingSkill}
|
|
936
|
-
|
|
937
|
-
backgroundColor: `${theme.dracula.green}15`,
|
|
938
|
-
borderColor: `${theme.dracula.green}40`,
|
|
939
|
-
color: theme.dracula.green,
|
|
940
|
-
}}
|
|
842
|
+
className="h-8"
|
|
941
843
|
>
|
|
942
844
|
{savingSkill ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <Save className="h-3.5 w-3.5" />}
|
|
943
845
|
Save
|
|
944
|
-
</
|
|
846
|
+
</ActionButton>
|
|
945
847
|
)}
|
|
946
848
|
<AlertDialog>
|
|
947
849
|
<AlertDialogTrigger asChild>
|
|
948
|
-
<
|
|
949
|
-
size="sm"
|
|
950
|
-
variant="outline"
|
|
951
|
-
style={{
|
|
952
|
-
backgroundColor: `${theme.dracula.red}15`,
|
|
953
|
-
borderColor: `${theme.dracula.red}40`,
|
|
954
|
-
color: theme.dracula.red,
|
|
955
|
-
}}
|
|
956
|
-
>
|
|
850
|
+
<ActionButton intent="stop" className="h-8">
|
|
957
851
|
<Trash2 className="h-3.5 w-3.5" />
|
|
958
852
|
Delete
|
|
959
|
-
</
|
|
853
|
+
</ActionButton>
|
|
960
854
|
</AlertDialogTrigger>
|
|
961
855
|
<AlertDialogContent>
|
|
962
856
|
<AlertDialogHeader>
|
|
@@ -982,25 +876,23 @@ const MasterSkillEditor: React.FC<MasterSkillEditorProps> = ({
|
|
|
982
876
|
|
|
983
877
|
{/* Reset Button for built-in skills */}
|
|
984
878
|
{!isEditingUserSkill && selectedSkillConfig?.isCustomized && (
|
|
985
|
-
<
|
|
986
|
-
|
|
987
|
-
variant="outline"
|
|
879
|
+
<ActionButton
|
|
880
|
+
intent="config"
|
|
988
881
|
onClick={() => handleResetToDefault(selectedSkillName!)}
|
|
989
882
|
disabled={isLoading}
|
|
990
|
-
|
|
991
|
-
backgroundColor: `${theme.dracula.orange}15`,
|
|
992
|
-
borderColor: `${theme.dracula.orange}40`,
|
|
993
|
-
color: theme.dracula.orange,
|
|
994
|
-
}}
|
|
883
|
+
className="h-8"
|
|
995
884
|
>
|
|
996
885
|
{isLoading ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <RotateCcw className="h-3.5 w-3.5" />}
|
|
997
886
|
Reset
|
|
998
|
-
</
|
|
887
|
+
</ActionButton>
|
|
999
888
|
)}
|
|
1000
889
|
</div>
|
|
1001
890
|
|
|
1002
891
|
{/* Skill Instructions Editor */}
|
|
1003
|
-
<div
|
|
892
|
+
<div
|
|
893
|
+
ref={editorWrapperRef}
|
|
894
|
+
className="flex flex-1 flex-col overflow-hidden p-3"
|
|
895
|
+
>
|
|
1004
896
|
{isLoading ? (
|
|
1005
897
|
<div className="flex flex-1 items-center justify-center gap-2 text-sm text-muted-foreground">
|
|
1006
898
|
<Loader2 className="h-4 w-4 animate-spin" />
|
|
@@ -1022,13 +914,7 @@ const MasterSkillEditor: React.FC<MasterSkillEditorProps> = ({
|
|
|
1022
914
|
}}
|
|
1023
915
|
placeholder="Loading skill instructions..."
|
|
1024
916
|
spellCheck={false}
|
|
1025
|
-
className="flex-1 min-h-0 resize-none font-mono text-[13px] leading-[1.5]"
|
|
1026
|
-
style={{
|
|
1027
|
-
backgroundColor: theme.colors.backgroundAlt,
|
|
1028
|
-
color: theme.colors.text,
|
|
1029
|
-
borderColor: theme.colors.border,
|
|
1030
|
-
borderRadius: theme.borderRadius.md,
|
|
1031
|
-
}}
|
|
917
|
+
className="flex-1 min-h-0 resize-none rounded-md border-border-default bg-bg-input font-mono text-[13px] leading-[1.5] text-fg-default"
|
|
1032
918
|
/>
|
|
1033
919
|
)}
|
|
1034
920
|
|