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,373 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
* themes/base.css — neutral defaults shared by every theme.
|
|
3
|
+
*
|
|
4
|
+
* These are scoped to :root (no data-theme selector) so they apply as
|
|
5
|
+
* fallbacks when a theme block omits the variable. Per-theme blocks
|
|
6
|
+
* always win via specificity (`:root[data-theme="..."]` beats `:root`).
|
|
7
|
+
*
|
|
8
|
+
* Source: design_handoff_machinaos_themes/themes/base.css.
|
|
9
|
+
* ============================================================================ */
|
|
10
|
+
|
|
11
|
+
:root {
|
|
12
|
+
/* Space scale (4 / 8 / 12 / 16 / 24 / 32 / 48 / 64) */
|
|
13
|
+
--space-1: 4px;
|
|
14
|
+
--space-2: 8px;
|
|
15
|
+
--space-3: 12px;
|
|
16
|
+
--space-4: 16px;
|
|
17
|
+
--space-5: 24px;
|
|
18
|
+
--space-6: 32px;
|
|
19
|
+
--space-7: 48px;
|
|
20
|
+
--space-8: 64px;
|
|
21
|
+
|
|
22
|
+
/* New-contract radii — exposed as Tailwind tokens via index.css.
|
|
23
|
+
* Co-exist with shadcn `--radius` (still used by existing primitives). */
|
|
24
|
+
--radius-pill: 999px;
|
|
25
|
+
|
|
26
|
+
/* Motion */
|
|
27
|
+
--dur-fast: 90ms;
|
|
28
|
+
--dur-default: 180ms;
|
|
29
|
+
--dur-slow: 320ms;
|
|
30
|
+
--ease-default: cubic-bezier(0.2, 0.7, 0.3, 1);
|
|
31
|
+
--ease-emphasis: cubic-bezier(0.6, -0.05, 0.3, 1.4);
|
|
32
|
+
--motion-style: smooth;
|
|
33
|
+
|
|
34
|
+
/* Sound (read by JS in a future phase) */
|
|
35
|
+
--sound-pack: none;
|
|
36
|
+
|
|
37
|
+
/* Type case toggle — themes flip between `none` / `uppercase` / `capitalize`. */
|
|
38
|
+
--type-uppercase: none;
|
|
39
|
+
--type-tracking-display: 0;
|
|
40
|
+
--type-scale-base: 14px;
|
|
41
|
+
|
|
42
|
+
/* Cursor + scrollbar */
|
|
43
|
+
--cursor-default: auto;
|
|
44
|
+
--cursor-pointer: pointer;
|
|
45
|
+
|
|
46
|
+
/* Canvas-host background pattern slot — themes override with a CSS
|
|
47
|
+
* gradient or SVG data-url. Default: no pattern. */
|
|
48
|
+
--canvas-grid: none;
|
|
49
|
+
--canvas-grid-opacity: 0.4;
|
|
50
|
+
|
|
51
|
+
/* Node execution pulse colour (Wave 30). Independent of `--node-color`
|
|
52
|
+
* (the plugin accent) so the executing-node glow stays high-contrast
|
|
53
|
+
* against the canvas background regardless of which plugin is running.
|
|
54
|
+
* Each theme overrides this to its most visible accent (Cyber neon
|
|
55
|
+
* cyan, Renaissance gold, Surveillance REC red, etc.). The default
|
|
56
|
+
* `hsl(var(--info))` resolves to a theme-tinted blue under shadcn. */
|
|
57
|
+
--node-pulse-color: hsl(var(--info));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* ============================================================================
|
|
61
|
+
* Reduced-motion override — respects the user's OS-level
|
|
62
|
+
* `prefers-reduced-motion: reduce` setting (DevTools rendering panel
|
|
63
|
+
* also surfaces this).
|
|
64
|
+
*
|
|
65
|
+
* Targets every theme's per-component animation: cyber-flicker /
|
|
66
|
+
* cyber-roll / cyber-blink / cyber-glitch (Cyber), surv-blink
|
|
67
|
+
* (Surveillance), ren-flicker (Renaissance), plus any `transition`
|
|
68
|
+
* on canvas-host pseudo-elements that synthesise motion.
|
|
69
|
+
*
|
|
70
|
+
* Sounds are not motion — left enabled regardless. Settings → Audio
|
|
71
|
+
* → Sound effects is the user-facing audio toggle.
|
|
72
|
+
* ============================================================================ */
|
|
73
|
+
|
|
74
|
+
/* ============================================================================
|
|
75
|
+
* Wave 33: pause every CSS animation when the tab is hidden.
|
|
76
|
+
*
|
|
77
|
+
* Browsers continue advancing CSS keyframe timing on background tabs (RAF
|
|
78
|
+
* is throttled to ~1Hz but `animation` keyframes still accumulate paused
|
|
79
|
+
* frames in the compositor queue). When the tab becomes visible, all
|
|
80
|
+
* paused frames flush at once — with W30's three-layer box-shadow
|
|
81
|
+
* `node-pulse` (peak `0 0 56px 16px color-mix(...)` × 3 layers) running
|
|
82
|
+
* on every executing node, plus Cyber theme's full-viewport
|
|
83
|
+
* `cyber-flicker` (5s opacity) + `cyber-roll` (8s viewport-height
|
|
84
|
+
* translateY), the GPU compositor stalls for 100-200ms. During the stall
|
|
85
|
+
* input events queue but don't dispatch — first click on tab return
|
|
86
|
+
* appears unresponsive.
|
|
87
|
+
*
|
|
88
|
+
* The Dashboard mounts a small `visibilitychange` listener that toggles
|
|
89
|
+
* this attribute on `<html>`. Setting `animation-play-state: paused`
|
|
90
|
+
* flushes the keyframe queue so resume has nothing to catch up on. The
|
|
91
|
+
* dashboard defers the unpause via `requestAnimationFrame` so input
|
|
92
|
+
* dispatch happens before composite.
|
|
93
|
+
* ============================================================================ */
|
|
94
|
+
|
|
95
|
+
html[data-page-hidden] *,
|
|
96
|
+
html[data-page-hidden] *::before,
|
|
97
|
+
html[data-page-hidden] *::after {
|
|
98
|
+
animation-play-state: paused !important;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
@media (prefers-reduced-motion: reduce) {
|
|
102
|
+
/* Cyber */
|
|
103
|
+
:root[data-theme="cyber"] .app-frame,
|
|
104
|
+
:root[data-theme="cyber"] .app-frame::before,
|
|
105
|
+
:root[data-theme="cyber"] .app-frame::after,
|
|
106
|
+
:root[data-theme="cyber"] .canvas::after,
|
|
107
|
+
:root[data-theme="cyber"] .canvas-host::after,
|
|
108
|
+
:root[data-theme="cyber"] .node::before,
|
|
109
|
+
:root[data-theme="cyber"] .sq-node.selected .sq-node-box,
|
|
110
|
+
:root[data-theme="cyber"] .row:hover::after,
|
|
111
|
+
:root[data-theme="cyber"] .statusbar .pip,
|
|
112
|
+
:root[data-theme="cyber"] .cmdk-item.active::after,
|
|
113
|
+
:root[data-theme="cyber"] .v-display:hover,
|
|
114
|
+
/* Surveillance */
|
|
115
|
+
:root[data-theme="surveillance"] .sq-node-box::before,
|
|
116
|
+
:root[data-theme="surveillance"] .statusbar .pip,
|
|
117
|
+
/* Renaissance */
|
|
118
|
+
:root[data-theme="renaissance"] .canvas .ornament,
|
|
119
|
+
/* Generic Tailwind animate-pulse used by node execution pip */
|
|
120
|
+
.animate-pulse,
|
|
121
|
+
/* Wave 21 default node pulse */
|
|
122
|
+
.react-flow__node.executing .node {
|
|
123
|
+
animation: none !important;
|
|
124
|
+
transition: none !important;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* ============================================================================
|
|
129
|
+
* Default canvas-node visuals (Wave 21).
|
|
130
|
+
*
|
|
131
|
+
* Each node component sets `--node-color` inline from its plugin's
|
|
132
|
+
* accent hex (visuals.json). These rules consume that custom property
|
|
133
|
+
* to draw a sensible default border / gradient / shadow so light, dark,
|
|
134
|
+
* and any theme that doesn't define its own `.node` rule still renders
|
|
135
|
+
* correctly. Per-theme CSS in client/src/themes/<theme>.css overrides
|
|
136
|
+
* these with material-specific decorations (vellum, neon, marble, etc.).
|
|
137
|
+
* ============================================================================ */
|
|
138
|
+
|
|
139
|
+
.node {
|
|
140
|
+
position: relative;
|
|
141
|
+
border-radius: 12px;
|
|
142
|
+
border: 2px solid color-mix(in srgb, var(--node-color, hsl(var(--border))) 60%, transparent);
|
|
143
|
+
background:
|
|
144
|
+
linear-gradient(
|
|
145
|
+
135deg,
|
|
146
|
+
color-mix(in srgb, var(--node-color, hsl(var(--card))) 14%, hsl(var(--card))) 0%,
|
|
147
|
+
hsl(var(--card)) 100%
|
|
148
|
+
);
|
|
149
|
+
box-shadow: 0 2px 8px color-mix(in srgb, var(--node-color, #000) 18%, transparent);
|
|
150
|
+
transition:
|
|
151
|
+
transform 0.15s ease,
|
|
152
|
+
border-color 0.15s ease,
|
|
153
|
+
box-shadow 0.15s ease;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.node:hover {
|
|
157
|
+
transform: translateY(-1px);
|
|
158
|
+
box-shadow: 0 4px 14px color-mix(in srgb, var(--node-color, #000) 28%, transparent);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.node.selected {
|
|
162
|
+
border-color: var(--node-color, hsl(var(--ring)));
|
|
163
|
+
box-shadow:
|
|
164
|
+
0 0 0 1px var(--node-color, hsl(var(--ring))),
|
|
165
|
+
0 4px 14px color-mix(in srgb, var(--node-color, #000) 32%, transparent);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/* Pulse during execution — react-flow toggles `.executing` on the wrapper
|
|
169
|
+
via canvasAnimations.ts (`.react-flow__node.executing`). The keyframe
|
|
170
|
+
uses --node-pulse-color (theme-controlled high-contrast accent) NOT
|
|
171
|
+
--node-color (plugin accent), so the glow stays visible against any
|
|
172
|
+
theme background — Cyber's near-black, Renaissance's vellum,
|
|
173
|
+
Surveillance's grey, etc. */
|
|
174
|
+
.react-flow__node.executing .node {
|
|
175
|
+
animation: node-pulse 1.4s ease-in-out infinite;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/* Three-layer pulse for high-visibility executing-node glow:
|
|
179
|
+
* 1. inner solid ring — definitive "this node is live" signal
|
|
180
|
+
* 2. mid soft halo — bleeds outside the node bounds
|
|
181
|
+
* 3. outer atmospheric halo — readable at distant canvas zoom
|
|
182
|
+
*
|
|
183
|
+
* Total reach at peak: ~52px outside the node box (12px ring +
|
|
184
|
+
* 40px outer halo). Peak intensity tuned so the glow doesn't
|
|
185
|
+
* appear blown-out or wash the surrounding canvas — the outer
|
|
186
|
+
* halo is 25% opacity, the ring is 45%. */
|
|
187
|
+
@keyframes node-pulse {
|
|
188
|
+
0%,
|
|
189
|
+
100% {
|
|
190
|
+
box-shadow:
|
|
191
|
+
0 0 0 0 color-mix(in srgb, var(--node-pulse-color) 80%, transparent),
|
|
192
|
+
0 0 14px 2px color-mix(in srgb, var(--node-pulse-color) 50%, transparent),
|
|
193
|
+
0 0 28px 4px color-mix(in srgb, var(--node-pulse-color) 25%, transparent);
|
|
194
|
+
}
|
|
195
|
+
50% {
|
|
196
|
+
box-shadow:
|
|
197
|
+
0 0 0 12px color-mix(in srgb, var(--node-pulse-color) 45%, transparent),
|
|
198
|
+
0 0 32px 8px color-mix(in srgb, var(--node-pulse-color) 65%, transparent),
|
|
199
|
+
0 0 56px 16px color-mix(in srgb, var(--node-pulse-color) 30%, transparent);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/* Square-node default visuals — outer wrapper is layout-only, the inner
|
|
204
|
+
`.sq-node-box` carries the bordered icon-square. Per-theme CSS
|
|
205
|
+
already in `client/src/themes/*.css` overrides these for material
|
|
206
|
+
identity. */
|
|
207
|
+
.sq-node {
|
|
208
|
+
position: relative;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
.sq-node-box {
|
|
212
|
+
border-radius: 10px;
|
|
213
|
+
border: 2px solid color-mix(in srgb, var(--node-color, hsl(var(--border))) 60%, transparent);
|
|
214
|
+
background:
|
|
215
|
+
linear-gradient(
|
|
216
|
+
135deg,
|
|
217
|
+
color-mix(in srgb, var(--node-color, hsl(var(--card))) 18%, hsl(var(--card))) 0%,
|
|
218
|
+
hsl(var(--card)) 100%
|
|
219
|
+
);
|
|
220
|
+
box-shadow: 0 2px 8px color-mix(in srgb, var(--node-color, #000) 18%, transparent);
|
|
221
|
+
transition:
|
|
222
|
+
transform 0.15s ease,
|
|
223
|
+
border-color 0.15s ease,
|
|
224
|
+
box-shadow 0.15s ease;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
.sq-node-box:hover {
|
|
228
|
+
transform: translateY(-1px);
|
|
229
|
+
box-shadow: 0 4px 14px color-mix(in srgb, var(--node-color, #000) 28%, transparent);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.sq-node.selected .sq-node-box {
|
|
233
|
+
border-color: var(--node-color, hsl(var(--ring)));
|
|
234
|
+
box-shadow:
|
|
235
|
+
0 0 0 1px var(--node-color, hsl(var(--ring))),
|
|
236
|
+
0 4px 14px color-mix(in srgb, var(--node-color, #000) 32%, transparent);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.react-flow__node.executing .sq-node-box,
|
|
240
|
+
.sq-node[data-executing] .sq-node-box {
|
|
241
|
+
animation: node-pulse 1.5s ease-in-out infinite;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/* ============================================================================
|
|
245
|
+
* Canvas-host background pattern + cursor (Wave 24).
|
|
246
|
+
*
|
|
247
|
+
* Themes provide per-theme decorative backgrounds via the `--canvas-grid`
|
|
248
|
+
* custom property (CSS gradient or SVG data-url) and per-theme cursors
|
|
249
|
+
* via `--cursor-default`. Both fall back to neutral defaults from `:root`.
|
|
250
|
+
*
|
|
251
|
+
* The pattern is layered on top of React Flow's own background — themes
|
|
252
|
+
* keep their canvas surface colour via shadcn `--background` tokens and
|
|
253
|
+
* this rule adds the decorative grid on top.
|
|
254
|
+
* ============================================================================ */
|
|
255
|
+
|
|
256
|
+
.canvas-host {
|
|
257
|
+
background-image: var(--canvas-grid, none);
|
|
258
|
+
cursor: var(--cursor-default, auto);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/* ============================================================================
|
|
262
|
+
* Default canvas-node inner-element visuals (Wave 26).
|
|
263
|
+
*
|
|
264
|
+
* Status pips, gear buttons, handles, and labels — defaults that fire
|
|
265
|
+
* across all themes that don't override. Status pips are driven by
|
|
266
|
+
* `data-status` set inline by the React component; CSS picks the colour
|
|
267
|
+
* from shadcn semantic tokens. Per-theme CSS in client/src/themes/<theme>.css
|
|
268
|
+
* overrides these for material-specific identity.
|
|
269
|
+
* ============================================================================ */
|
|
270
|
+
|
|
271
|
+
/* Status pip — square-node and rectangular-node variants */
|
|
272
|
+
.sq-node-pip,
|
|
273
|
+
.node-pip {
|
|
274
|
+
background: hsl(var(--muted-foreground));
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
.sq-node-pip[data-status="idle"],
|
|
278
|
+
.node-pip[data-status="idle"] {
|
|
279
|
+
background: hsl(var(--muted-foreground));
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
.sq-node-pip[data-status="executing"],
|
|
283
|
+
.sq-node-pip[data-status="waiting"],
|
|
284
|
+
.node-pip[data-status="executing"],
|
|
285
|
+
.node-pip[data-status="waiting"] {
|
|
286
|
+
background: var(--node-color, hsl(var(--info)));
|
|
287
|
+
box-shadow: 0 0 6px color-mix(in srgb, var(--node-color, hsl(var(--info))) 60%, transparent);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
.sq-node-pip[data-status="success"],
|
|
291
|
+
.node-pip[data-status="success"] {
|
|
292
|
+
background: hsl(var(--success));
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
.sq-node-pip[data-status="error"],
|
|
296
|
+
.node-pip[data-status="error"] {
|
|
297
|
+
background: hsl(var(--destructive));
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/* Gear button defaults */
|
|
301
|
+
.sq-node-gear,
|
|
302
|
+
.node-gear {
|
|
303
|
+
background: hsl(var(--card));
|
|
304
|
+
border: 1px solid hsl(var(--border));
|
|
305
|
+
color: hsl(var(--muted-foreground));
|
|
306
|
+
transition: background-color 0.15s ease, border-color 0.15s ease;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
.sq-node-gear:hover,
|
|
310
|
+
.node-gear:hover {
|
|
311
|
+
background: hsl(var(--accent));
|
|
312
|
+
border-color: hsl(var(--accent-foreground) / 0.2);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/* Handle defaults */
|
|
316
|
+
.sq-node-handle,
|
|
317
|
+
.node-handle {
|
|
318
|
+
background: hsl(var(--background));
|
|
319
|
+
border: 2px solid hsl(var(--muted-foreground));
|
|
320
|
+
transition: background-color 0.15s ease, border-color 0.15s ease;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
.sq-node-handle.out,
|
|
324
|
+
.node-handle.out {
|
|
325
|
+
background: var(--node-color, hsl(var(--primary)));
|
|
326
|
+
border-color: var(--node-color, hsl(var(--primary)));
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
.sq-node-handle.in,
|
|
330
|
+
.node-handle.in {
|
|
331
|
+
background: hsl(var(--background));
|
|
332
|
+
border-color: hsl(var(--muted-foreground));
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/* Label defaults — picks up display typography from theme */
|
|
336
|
+
.sq-node-label,
|
|
337
|
+
.node-label {
|
|
338
|
+
font-family: var(--font-display, var(--font-body));
|
|
339
|
+
letter-spacing: var(--type-tracking-display, 0);
|
|
340
|
+
text-transform: var(--type-uppercase, none);
|
|
341
|
+
color: hsl(var(--foreground));
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/* ============================================================================
|
|
345
|
+
* Status-state box glow (Wave 29).
|
|
346
|
+
*
|
|
347
|
+
* The W26 status-pip rules (.sq-node-pip[data-status="..."]) color the
|
|
348
|
+
* small status indicator. This block adds a complementary glow to the
|
|
349
|
+
* NODE BOX itself for `success` and `error` states, so post-execution
|
|
350
|
+
* outcomes are visible at canvas zoom levels where the pip is too
|
|
351
|
+
* small to read. Per-theme files override these via higher-specificity
|
|
352
|
+
* `:root[data-theme="..."] .sq-node[data-status="..."] .sq-node-box`
|
|
353
|
+
* selectors when they want a material-specific outcome glow.
|
|
354
|
+
* ============================================================================ */
|
|
355
|
+
|
|
356
|
+
.sq-node[data-status="success"] .sq-node-box,
|
|
357
|
+
.react-flow__node[data-status="success"] .node {
|
|
358
|
+
box-shadow:
|
|
359
|
+
0 0 0 1px hsl(var(--success)),
|
|
360
|
+
0 0 14px color-mix(in srgb, hsl(var(--success)) 60%, transparent);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
.sq-node[data-status="error"] .sq-node-box,
|
|
364
|
+
.react-flow__node[data-status="error"] .node {
|
|
365
|
+
box-shadow:
|
|
366
|
+
0 0 0 1px hsl(var(--destructive)),
|
|
367
|
+
0 0 14px color-mix(in srgb, hsl(var(--destructive)) 60%, transparent);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/* TODO(wave-30): mirror data-status from the pip to the outer .sq-node /
|
|
371
|
+
* .react-flow__node wrapper in each canvas-node component so the box
|
|
372
|
+
* glow rules above fire. The wave-29 selectors are pre-positioned;
|
|
373
|
+
* components currently set data-status on the pip only (W26). */
|