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,289 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
* themes/surveillance.css — institutional grey, CCTV crosshair overlays.
|
|
3
|
+
*
|
|
4
|
+
* Bureaucratic, cold, all corners and IDs. Reads like a 1970s panopticon
|
|
5
|
+
* control room. Ported from
|
|
6
|
+
* design_handoff_machinaos_themes/themes/surveillance.css.
|
|
7
|
+
* ============================================================================ */
|
|
8
|
+
|
|
9
|
+
:root[data-theme="surveillance"] {
|
|
10
|
+
--bg-app: #1a1c1e;
|
|
11
|
+
--bg-panel: #232628;
|
|
12
|
+
--bg-canvas: #0a0c0e;
|
|
13
|
+
--bg-elevated: #2c3034;
|
|
14
|
+
--bg-input: #0a0c0e;
|
|
15
|
+
--bg-hover: rgba(232, 38, 38, 0.08);
|
|
16
|
+
--bg-active: rgba(232, 38, 38, 0.18);
|
|
17
|
+
--bg-overlay: rgba(0, 0, 0, 0.85);
|
|
18
|
+
|
|
19
|
+
--border-default: #3a3e42;
|
|
20
|
+
--border-strong: #5a5e62;
|
|
21
|
+
--border-focus: #e82626;
|
|
22
|
+
--ornament-frame: none;
|
|
23
|
+
|
|
24
|
+
--fg-default: #c8ccd0;
|
|
25
|
+
--fg-muted: #888c90;
|
|
26
|
+
--fg-faint: #585c60;
|
|
27
|
+
--fg-on-accent: #ffffff;
|
|
28
|
+
--fg-on-success: #0a0c0e;
|
|
29
|
+
--fg-on-danger: #ffffff;
|
|
30
|
+
--fg-on-warning: #0a0c0e;
|
|
31
|
+
|
|
32
|
+
--phosphor: #6acc6a;
|
|
33
|
+
--amber: #d8a020;
|
|
34
|
+
--concrete: #888c90;
|
|
35
|
+
--rec-red: #e82626;
|
|
36
|
+
|
|
37
|
+
--font-display: 'Anonymous Pro', 'IBM Plex Mono', monospace;
|
|
38
|
+
--font-body: 'IBM Plex Mono', 'Anonymous Pro', monospace;
|
|
39
|
+
--font-mono: 'IBM Plex Mono', monospace;
|
|
40
|
+
--type-scale-base: 13px;
|
|
41
|
+
--type-tracking-display: 0.10em;
|
|
42
|
+
--type-uppercase: uppercase;
|
|
43
|
+
|
|
44
|
+
--radius-sm: 0px;
|
|
45
|
+
--radius-md: 0px;
|
|
46
|
+
--radius-lg: 0px;
|
|
47
|
+
--radius-pill: 0px;
|
|
48
|
+
|
|
49
|
+
--dur-fast: 60ms;
|
|
50
|
+
--dur-default: 140ms;
|
|
51
|
+
--dur-slow: 240ms;
|
|
52
|
+
--ease-default: linear;
|
|
53
|
+
--ease-emphasis: linear;
|
|
54
|
+
--motion-style: scanline;
|
|
55
|
+
--sound-pack: telex;
|
|
56
|
+
|
|
57
|
+
/* Wave 30: REC-red executing pulse — matches the surv-blink LED
|
|
58
|
+
* rhythm and reads against the grey CCTV canvas. */
|
|
59
|
+
--node-pulse-color: hsl(var(--destructive));
|
|
60
|
+
|
|
61
|
+
/* Cursor — CCTV snooper reticle (REC-red crosshair with center dot) */
|
|
62
|
+
--cursor-default: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'><g stroke='%23e82626' stroke-width='1' fill='none'><circle cx='12' cy='12' r='8'/><path d='M12 1 L12 6 M12 18 L12 23 M1 12 L6 12 M18 12 L23 12'/><circle cx='12' cy='12' r='1.5' fill='%23e82626'/></g></svg>") 12 12, crosshair;
|
|
63
|
+
--cursor-pointer: pointer;
|
|
64
|
+
|
|
65
|
+
/* Canvas backplane — CCTV crosshair + corner brackets + 40px grain grid */
|
|
66
|
+
--canvas-grid:
|
|
67
|
+
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1920' height='1080'><g stroke='%23e82626' stroke-width='1' fill='none' opacity='0.18'><path d='M40 40 H120 M40 40 V120 M1880 40 H1800 M1880 40 V120 M40 1040 H120 M40 1040 V960 M1880 1040 H1800 M1880 1040 V960'/><circle cx='960' cy='540' r='40' opacity='0.2'/><path d='M960 480 V600 M900 540 H1020' opacity='0.25'/></g></svg>"),
|
|
68
|
+
repeating-linear-gradient(0deg, transparent 0 3px, rgba(106,204,106,0.04) 3px 4px),
|
|
69
|
+
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='40' height='40'><g stroke='%23888c90' stroke-width='0.4' fill='none' opacity='0.12'><path d='M0 20 H40 M20 0 V40'/></g></svg>");
|
|
70
|
+
--canvas-grid-opacity: 1;
|
|
71
|
+
|
|
72
|
+
--scrollbar-track: #1a1c1e;
|
|
73
|
+
--scrollbar-thumb: #5a5e62;
|
|
74
|
+
|
|
75
|
+
/* Shadcn HSL bridge */
|
|
76
|
+
--background: 210 6% 11%;
|
|
77
|
+
--foreground: 210 8% 80%;
|
|
78
|
+
--card: 210 7% 19%;
|
|
79
|
+
--card-foreground: 210 8% 80%;
|
|
80
|
+
--popover: 210 7% 19%;
|
|
81
|
+
--popover-foreground: 210 8% 80%;
|
|
82
|
+
|
|
83
|
+
--primary: 0 81% 53%; /* REC red */
|
|
84
|
+
--primary-foreground: 0 0% 100%;
|
|
85
|
+
--secondary: 210 6% 16%;
|
|
86
|
+
--secondary-foreground: 210 8% 80%;
|
|
87
|
+
--muted: 210 6% 16%;
|
|
88
|
+
--muted-foreground: 210 3% 56%;
|
|
89
|
+
--accent: 120 49% 61%; /* phosphor green */
|
|
90
|
+
--accent-foreground: 210 8% 5%;
|
|
91
|
+
|
|
92
|
+
--destructive: 0 81% 53%;
|
|
93
|
+
--destructive-foreground: 0 0% 100%;
|
|
94
|
+
--success: 120 49% 61%;
|
|
95
|
+
--warning: 41 74% 49%;
|
|
96
|
+
--info: 213 51% 56%;
|
|
97
|
+
|
|
98
|
+
--border: 213 5% 36%;
|
|
99
|
+
--input: 213 5% 36%;
|
|
100
|
+
--ring: 0 81% 53%;
|
|
101
|
+
|
|
102
|
+
/* Action role bridge */
|
|
103
|
+
--action-run: 120 49% 61%;
|
|
104
|
+
--action-run-soft: 120 49% 61% / 0.16;
|
|
105
|
+
--action-run-hover: 120 49% 61% / 0.30;
|
|
106
|
+
--action-run-border: 120 49% 61% / 0.7;
|
|
107
|
+
|
|
108
|
+
--action-stop: 0 81% 53%;
|
|
109
|
+
--action-stop-soft: 0 81% 53% / 0.18;
|
|
110
|
+
--action-stop-hover: 0 81% 53% / 0.32;
|
|
111
|
+
--action-stop-border: 0 81% 53% / 0.7;
|
|
112
|
+
|
|
113
|
+
--action-save: 120 49% 61%;
|
|
114
|
+
--action-save-soft: 120 49% 61% / 0.18;
|
|
115
|
+
--action-save-hover: 120 49% 61% / 0.32;
|
|
116
|
+
--action-save-border: 120 49% 61% / 0.7;
|
|
117
|
+
|
|
118
|
+
--action-config: 41 74% 49%;
|
|
119
|
+
--action-config-soft: 41 74% 49% / 0.16;
|
|
120
|
+
--action-config-hover: 41 74% 49% / 0.30;
|
|
121
|
+
--action-config-border: 41 74% 49% / 0.6;
|
|
122
|
+
|
|
123
|
+
--action-secret: 0 81% 53%;
|
|
124
|
+
--action-secret-soft: 0 81% 53% / 0.16;
|
|
125
|
+
--action-secret-hover: 0 81% 53% / 0.30;
|
|
126
|
+
--action-secret-border: 0 81% 53% / 0.6;
|
|
127
|
+
|
|
128
|
+
--action-tools: 213 51% 56%;
|
|
129
|
+
--action-tools-soft: 213 51% 56% / 0.16;
|
|
130
|
+
--action-tools-hover: 213 51% 56% / 0.30;
|
|
131
|
+
--action-tools-border: 213 51% 56% / 0.6;
|
|
132
|
+
|
|
133
|
+
--tint-soft: 16%;
|
|
134
|
+
--tint-border: 45%;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/* Body — monitor scanlines */
|
|
138
|
+
:root[data-theme="surveillance"] body {
|
|
139
|
+
background:
|
|
140
|
+
repeating-linear-gradient(0deg, transparent 0, transparent 2px, rgba(0,0,0,0.18) 2px, rgba(0,0,0,0.18) 3px),
|
|
141
|
+
var(--bg-app);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
:root[data-theme="surveillance"] ::selection {
|
|
145
|
+
background: rgba(232, 38, 38, 0.5);
|
|
146
|
+
color: #ffffff;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/* Phosphor scrollbars */
|
|
150
|
+
:root[data-theme="surveillance"] ::-webkit-scrollbar-thumb {
|
|
151
|
+
background: #5a5e62;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/* ── Per-component decorations (Wave 16 port from handoff) ─── */
|
|
155
|
+
|
|
156
|
+
:root[data-theme="surveillance"] .toolbar,
|
|
157
|
+
:root[data-theme="surveillance"] .sidebar,
|
|
158
|
+
:root[data-theme="surveillance"] .palette,
|
|
159
|
+
:root[data-theme="surveillance"] .chat { background: var(--bg-panel); }
|
|
160
|
+
:root[data-theme="surveillance"] .toolbar { border-bottom: 1px solid var(--border-strong); }
|
|
161
|
+
:root[data-theme="surveillance"] .sidebar { border-right: 1px solid var(--border-strong); }
|
|
162
|
+
:root[data-theme="surveillance"] .palette { border-left: 1px solid var(--border-strong); }
|
|
163
|
+
:root[data-theme="surveillance"] .chat { border-top: 1px solid var(--border-strong); }
|
|
164
|
+
|
|
165
|
+
/* CANVAS — CCTV grid + crosshair.
|
|
166
|
+
*
|
|
167
|
+
* NOTE: the corner-bracket / centre-reticle / REC-text SVG is declared at a
|
|
168
|
+
* fixed 1920x1080 viewport (matches the upstream handoff). On viewports
|
|
169
|
+
* larger than 1920x1080 it tiles; on smaller viewports it's clipped to
|
|
170
|
+
* canvas bounds. The CCTV-monitor framing reads as intentional at typical
|
|
171
|
+
* desktop sizes. Replacing it with a `preserveAspectRatio="xMidYMid slice"`
|
|
172
|
+
* SVG that scales would lose the pixel-pitch authenticity the design calls
|
|
173
|
+
* for, so this is a known limitation, not a bug. The 40px crosshair grid
|
|
174
|
+
* (third layer) is correctly tiled across the full canvas at any size. */
|
|
175
|
+
:root[data-theme="surveillance"] .canvas {
|
|
176
|
+
background:
|
|
177
|
+
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1920' height='1080'><g stroke='%23e82626' stroke-width='1' fill='none' opacity='0.18'><path d='M40 40 H120 M40 40 V120 M1880 40 H1800 M1880 40 V120 M40 1040 H120 M40 1040 V960 M1880 1040 H1800 M1880 1040 V960'/><circle cx='960' cy='540' r='40' opacity='0.2'/><path d='M960 480 V600 M900 540 H1020' opacity='0.25'/></g><text x='80' y='80' fill='%23e82626' font-family='monospace' font-size='14' opacity='0.5'>● REC</text><text x='80' y='1020' fill='%23e82626' font-family='monospace' font-size='12' opacity='0.4'>CAM-04 / 19:42:08</text></svg>"),
|
|
178
|
+
repeating-linear-gradient(0deg, transparent 0, transparent 3px, rgba(106,204,106,0.04) 3px, rgba(106,204,106,0.04) 4px),
|
|
179
|
+
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='40' height='40'><g stroke='%23888c90' stroke-width='0.4' fill='none' opacity='0.12'><path d='M0 20 H40 M20 0 V40'/></g></svg>"),
|
|
180
|
+
var(--bg-canvas);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/* TYPOGRAPHY */
|
|
184
|
+
:root[data-theme="surveillance"] body { font-family: var(--font-body); color: var(--fg-default); font-size: 13px; }
|
|
185
|
+
:root[data-theme="surveillance"] h1, :root[data-theme="surveillance"] h2, :root[data-theme="surveillance"] h3,
|
|
186
|
+
:root[data-theme="surveillance"] .v-display {
|
|
187
|
+
font-family: var(--font-display); letter-spacing: 0.10em; text-transform: uppercase; color: var(--fg-default);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/* SQUARE NODE — case file dossier */
|
|
191
|
+
:root[data-theme="surveillance"] .sq-node-box {
|
|
192
|
+
background: var(--bg-elevated);
|
|
193
|
+
border: 1px solid var(--border-strong); border-radius: 0;
|
|
194
|
+
box-shadow: none;
|
|
195
|
+
color: var(--fg-default);
|
|
196
|
+
position: relative;
|
|
197
|
+
}
|
|
198
|
+
:root[data-theme="surveillance"] .sq-node-box::before {
|
|
199
|
+
content: ''; position: absolute; top: 4px; right: 4px; width: 6px; height: 6px;
|
|
200
|
+
background: hsl(var(--primary)); border-radius: 50%; box-shadow: 0 0 4px hsl(var(--primary));
|
|
201
|
+
animation: surv-blink 1.4s steps(2) infinite;
|
|
202
|
+
}
|
|
203
|
+
@keyframes surv-blink { 50% { opacity: 0.2; } }
|
|
204
|
+
:root[data-theme="surveillance"] .sq-node.selected .sq-node-box {
|
|
205
|
+
border: 1px solid hsl(var(--primary)); box-shadow: 0 0 0 1px hsl(var(--primary)), 0 0 8px rgba(232,38,38,0.4);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/* Wave 29: Surveillance executing nodes blink the REC red glow, matching
|
|
209
|
+
* the corner LED's surv-blink rhythm. Mirrors the analog-camera "live"
|
|
210
|
+
* indicator language. Higher specificity than base.css's generic rule. */
|
|
211
|
+
/* Wave 30.1: dedicated executing-pulse keyframe that animates
|
|
212
|
+
* BOX-SHADOW only. The original `surv-blink` keyframe (LED corner
|
|
213
|
+
* dot) animates opacity to 0.2, which when applied to whole nodes
|
|
214
|
+
* faded the entire node body. This pulses the REC-red glow
|
|
215
|
+
* intensity while the node stays solid. */
|
|
216
|
+
@keyframes surv-pulse-exec {
|
|
217
|
+
0%, 49% {
|
|
218
|
+
box-shadow:
|
|
219
|
+
0 0 0 2px hsl(var(--destructive)),
|
|
220
|
+
0 0 28px 4px rgba(232, 38, 38, 0.7),
|
|
221
|
+
0 0 56px 14px rgba(232, 38, 38, 0.3);
|
|
222
|
+
}
|
|
223
|
+
50%, 100% {
|
|
224
|
+
box-shadow:
|
|
225
|
+
0 0 0 2px hsl(var(--destructive)),
|
|
226
|
+
0 0 12px 2px rgba(232, 38, 38, 0.45),
|
|
227
|
+
0 0 24px 6px rgba(232, 38, 38, 0.12);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
:root[data-theme="surveillance"] .sq-node[data-executing] .sq-node-box,
|
|
232
|
+
:root[data-theme="surveillance"] .react-flow__node.executing .sq-node-box,
|
|
233
|
+
:root[data-theme="surveillance"] .react-flow__node.executing .node {
|
|
234
|
+
animation: surv-pulse-exec 1.0s steps(2) infinite;
|
|
235
|
+
border: 1px solid hsl(var(--destructive));
|
|
236
|
+
}
|
|
237
|
+
:root[data-theme="surveillance"] .sq-node-pip { border-radius: 0; }
|
|
238
|
+
:root[data-theme="surveillance"] .sq-node-gear { background: hsl(var(--primary)); color: white; border-radius: 0; border: none; }
|
|
239
|
+
:root[data-theme="surveillance"] .sq-node-handle { border-radius: 0; background: var(--phosphor); }
|
|
240
|
+
:root[data-theme="surveillance"] .sq-node-handle.out { background: hsl(var(--primary)); }
|
|
241
|
+
:root[data-theme="surveillance"] .sq-node-label { font-family: var(--font-display); letter-spacing: 0.10em; font-size: 10px; text-transform: uppercase; }
|
|
242
|
+
|
|
243
|
+
/* ACTIONS — terminal command */
|
|
244
|
+
:root[data-theme="surveillance"] .action-btn {
|
|
245
|
+
font-family: var(--font-display); font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase;
|
|
246
|
+
border-radius: 0; border-width: 1px;
|
|
247
|
+
}
|
|
248
|
+
:root[data-theme="surveillance"] .action-run { background: transparent; color: var(--phosphor); border-color: var(--phosphor); }
|
|
249
|
+
:root[data-theme="surveillance"] .action-deploy { background: hsl(var(--primary)); color: white; border-color: hsl(var(--primary)); }
|
|
250
|
+
:root[data-theme="surveillance"] .action-save { background: transparent; color: var(--amber); border-color: var(--amber); }
|
|
251
|
+
:root[data-theme="surveillance"] .action-stop { background: hsl(var(--primary)); color: white; border-color: hsl(var(--primary)); }
|
|
252
|
+
|
|
253
|
+
/* CARDS */
|
|
254
|
+
:root[data-theme="surveillance"] .wf-card,
|
|
255
|
+
:root[data-theme="surveillance"] .cat,
|
|
256
|
+
:root[data-theme="surveillance"] .comp,
|
|
257
|
+
:root[data-theme="surveillance"] .settings-section,
|
|
258
|
+
:root[data-theme="surveillance"] .cred-card {
|
|
259
|
+
background: var(--bg-elevated); border: 1px solid var(--border-default); border-radius: 0;
|
|
260
|
+
}
|
|
261
|
+
:root[data-theme="surveillance"] .wf-card.selected { border: 1px solid hsl(var(--primary)); background: hsl(var(--danger-soft)); }
|
|
262
|
+
:root[data-theme="surveillance"] .cat-tile { background: hsl(var(--primary)); color: white; border-radius: 0; }
|
|
263
|
+
:root[data-theme="surveillance"] .cat-name { font-family: var(--font-display); }
|
|
264
|
+
:root[data-theme="surveillance"] .comp-ico { background: var(--bg-panel); color: var(--phosphor); border: 1px solid var(--border-strong); border-radius: 0; }
|
|
265
|
+
|
|
266
|
+
/* CHAT */
|
|
267
|
+
:root[data-theme="surveillance"] .chat-msg { border-radius: 0; }
|
|
268
|
+
:root[data-theme="surveillance"] .chat-msg-user { background: var(--bg-panel); border: 1px solid hsl(var(--primary)); }
|
|
269
|
+
:root[data-theme="surveillance"] .chat-msg-bot { background: var(--bg-elevated); border-left: 3px solid var(--phosphor); border-top: 1px solid var(--border-default); border-right: 1px solid var(--border-default); border-bottom: 1px solid var(--border-default); }
|
|
270
|
+
|
|
271
|
+
/* STATUS BAR */
|
|
272
|
+
:root[data-theme="surveillance"] .statusbar {
|
|
273
|
+
background: hsl(var(--primary)); color: white; border-top: none;
|
|
274
|
+
font-family: var(--font-mono); letter-spacing: 0.10em; text-transform: uppercase;
|
|
275
|
+
}
|
|
276
|
+
:root[data-theme="surveillance"] .statusbar .pip { background: white; box-shadow: 0 0 4px white; border-radius: 0; }
|
|
277
|
+
|
|
278
|
+
/* MODAL */
|
|
279
|
+
:root[data-theme="surveillance"] .modal {
|
|
280
|
+
background: var(--bg-elevated); border: 1px solid hsl(var(--primary)); border-radius: 0;
|
|
281
|
+
box-shadow: 0 0 0 4px rgba(232,38,38,0.08), 0 30px 80px rgba(0,0,0,0.8);
|
|
282
|
+
}
|
|
283
|
+
:root[data-theme="surveillance"] .modal-head { border-bottom: 1px solid hsl(var(--primary)); background: var(--bg-panel); }
|
|
284
|
+
:root[data-theme="surveillance"] .modal-title { font-family: var(--font-display); color: hsl(var(--primary)); letter-spacing: 0.14em; }
|
|
285
|
+
|
|
286
|
+
/* CMDK */
|
|
287
|
+
:root[data-theme="surveillance"] .cmdk { background: var(--bg-elevated); border: 1px solid hsl(var(--primary)); border-radius: 0; }
|
|
288
|
+
:root[data-theme="surveillance"] .cmdk-item.active { background: hsl(var(--primary)); color: white; }
|
|
289
|
+
:root[data-theme="surveillance"] .cmdk-item.active::before { content: '> '; }
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
* themes/wasteland.css — irradiated dust, rust, hand-painted warnings on
|
|
3
|
+
* scrap metal. Reads like a Mad Max settlement.
|
|
4
|
+
* Ported from design_handoff_machinaos_themes/themes/wasteland.css.
|
|
5
|
+
* ============================================================================ */
|
|
6
|
+
|
|
7
|
+
:root[data-theme="wasteland"] {
|
|
8
|
+
--bg-app: #2a2018;
|
|
9
|
+
--bg-panel: #3a2c1c;
|
|
10
|
+
--bg-canvas: #1a1410;
|
|
11
|
+
--bg-elevated: #4a3826;
|
|
12
|
+
--bg-input: #1a1410;
|
|
13
|
+
--bg-hover: rgba(232, 140, 40, 0.10);
|
|
14
|
+
--bg-active: rgba(232, 140, 40, 0.22);
|
|
15
|
+
--bg-overlay: rgba(20, 12, 6, 0.78);
|
|
16
|
+
|
|
17
|
+
--border-default: #6a4a28;
|
|
18
|
+
--border-strong: #8a3a18;
|
|
19
|
+
--border-focus: #e88a28;
|
|
20
|
+
--ornament-frame: none;
|
|
21
|
+
|
|
22
|
+
--fg-default: #e8d8a8;
|
|
23
|
+
--fg-muted: #b89868;
|
|
24
|
+
--fg-faint: #786040;
|
|
25
|
+
--fg-on-accent: #1a1410;
|
|
26
|
+
--fg-on-success: #1a1410;
|
|
27
|
+
--fg-on-danger: #e8d8a8;
|
|
28
|
+
--fg-on-warning: #1a1410;
|
|
29
|
+
|
|
30
|
+
--rust: #8a3a18;
|
|
31
|
+
--bone: #d8c8a0;
|
|
32
|
+
--rad: #c8d038;
|
|
33
|
+
--ochre: #e88a28;
|
|
34
|
+
|
|
35
|
+
--font-display: 'Special Elite', 'Black Ops One', monospace;
|
|
36
|
+
--font-body: 'Special Elite', 'Courier Prime', monospace;
|
|
37
|
+
--font-mono: 'VT323', 'Courier New', monospace;
|
|
38
|
+
--type-scale-base: 14px;
|
|
39
|
+
--type-tracking-display: 0.10em;
|
|
40
|
+
--type-uppercase: uppercase;
|
|
41
|
+
|
|
42
|
+
--radius-sm: 0px;
|
|
43
|
+
--radius-md: 0px;
|
|
44
|
+
--radius-lg: 0px;
|
|
45
|
+
--radius-pill: 0px;
|
|
46
|
+
|
|
47
|
+
--dur-fast: 60ms;
|
|
48
|
+
--dur-default: 180ms;
|
|
49
|
+
--dur-slow: 320ms;
|
|
50
|
+
--ease-default: cubic-bezier(0.6, 0, 0.4, 1);
|
|
51
|
+
--ease-emphasis: cubic-bezier(0.6, 0, 0.4, 1);
|
|
52
|
+
--motion-style: jittery;
|
|
53
|
+
--sound-pack: scrap;
|
|
54
|
+
|
|
55
|
+
/* Wave 30: radioactive-yellow pulse — high-contrast against ochre
|
|
56
|
+
* dust + matches the rust-belt accent palette. */
|
|
57
|
+
--node-pulse-color: hsl(var(--accent));
|
|
58
|
+
|
|
59
|
+
--cursor-default: auto;
|
|
60
|
+
--cursor-pointer: pointer;
|
|
61
|
+
--scrollbar-track: #2a2018;
|
|
62
|
+
--scrollbar-thumb: #8a3a18;
|
|
63
|
+
|
|
64
|
+
/* Shadcn HSL bridge */
|
|
65
|
+
--background: 30 28% 13%;
|
|
66
|
+
--foreground: 41 53% 78%;
|
|
67
|
+
--card: 28 32% 22%;
|
|
68
|
+
--card-foreground: 41 53% 78%;
|
|
69
|
+
--popover: 28 32% 22%;
|
|
70
|
+
--popover-foreground: 41 53% 78%;
|
|
71
|
+
|
|
72
|
+
--primary: 28 80% 53%; /* ochre */
|
|
73
|
+
--primary-foreground: 24 28% 8%;
|
|
74
|
+
--secondary: 28 36% 17%;
|
|
75
|
+
--secondary-foreground: 41 53% 78%;
|
|
76
|
+
--muted: 28 36% 17%;
|
|
77
|
+
--muted-foreground: 35 36% 56%;
|
|
78
|
+
--accent: 64 56% 51%; /* radioactive */
|
|
79
|
+
--accent-foreground: 24 28% 8%;
|
|
80
|
+
|
|
81
|
+
--destructive: 6 75% 41%;
|
|
82
|
+
--destructive-foreground: 41 53% 78%;
|
|
83
|
+
--success: 64 56% 41%;
|
|
84
|
+
--warning: 64 56% 51%;
|
|
85
|
+
--info: 28 80% 53%;
|
|
86
|
+
|
|
87
|
+
--border: 32 47% 28%;
|
|
88
|
+
--input: 32 47% 28%;
|
|
89
|
+
--ring: 28 80% 53%;
|
|
90
|
+
|
|
91
|
+
/* Action role bridge */
|
|
92
|
+
--action-run: 64 56% 41%;
|
|
93
|
+
--action-run-soft: 64 56% 41% / 0.20;
|
|
94
|
+
--action-run-hover: 64 56% 41% / 0.34;
|
|
95
|
+
--action-run-border: 64 56% 41% / 0.7;
|
|
96
|
+
|
|
97
|
+
--action-stop: 6 75% 41%;
|
|
98
|
+
--action-stop-soft: 6 75% 41% / 0.22;
|
|
99
|
+
--action-stop-hover: 6 75% 41% / 0.36;
|
|
100
|
+
--action-stop-border: 6 75% 41% / 0.7;
|
|
101
|
+
|
|
102
|
+
--action-save: 28 80% 53%;
|
|
103
|
+
--action-save-soft: 28 80% 53% / 0.20;
|
|
104
|
+
--action-save-hover: 28 80% 53% / 0.34;
|
|
105
|
+
--action-save-border: 28 80% 53% / 0.7;
|
|
106
|
+
|
|
107
|
+
--action-config: 64 56% 51%;
|
|
108
|
+
--action-config-soft: 64 56% 51% / 0.18;
|
|
109
|
+
--action-config-hover: 64 56% 51% / 0.32;
|
|
110
|
+
--action-config-border: 64 56% 51% / 0.6;
|
|
111
|
+
|
|
112
|
+
--action-secret: 28 80% 53%;
|
|
113
|
+
--action-secret-soft: 28 80% 53% / 0.16;
|
|
114
|
+
--action-secret-hover: 28 80% 53% / 0.30;
|
|
115
|
+
--action-secret-border: 28 80% 53% / 0.6;
|
|
116
|
+
|
|
117
|
+
--action-tools: 64 56% 51%;
|
|
118
|
+
--action-tools-soft: 64 56% 51% / 0.18;
|
|
119
|
+
--action-tools-hover: 64 56% 51% / 0.32;
|
|
120
|
+
--action-tools-border: 64 56% 51% / 0.6;
|
|
121
|
+
|
|
122
|
+
--tint-soft: 18%;
|
|
123
|
+
--tint-border: 45%;
|
|
124
|
+
|
|
125
|
+
/* Canvas backplane — cracked-earth fissures on 200x200 tile */
|
|
126
|
+
--canvas-grid:
|
|
127
|
+
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='200' height='200'><g stroke='%23e88a28' stroke-width='0.4' fill='none' opacity='0.10'><path d='M40 10 Q60 60 30 100 Q10 140 50 180 M120 0 Q140 80 100 140 M180 30 Q160 80 190 130'/></g></svg>");
|
|
128
|
+
--canvas-grid-opacity: 1;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/* Body — dust + grit texture */
|
|
132
|
+
:root[data-theme="wasteland"] body {
|
|
133
|
+
background:
|
|
134
|
+
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='300' height='300'><filter id='d'><feTurbulence baseFrequency='0.9' numOctaves='3'/><feColorMatrix values='0 0 0 0 0.55 0 0 0 0 0.40 0 0 0 0 0.18 0 0 0 0.16 0'/></filter><rect width='300' height='300' filter='url(%23d)'/></svg>"),
|
|
135
|
+
var(--bg-app);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
:root[data-theme="wasteland"] ::selection {
|
|
139
|
+
background: rgba(232, 138, 40, 0.5);
|
|
140
|
+
color: #1a1410;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* Wasteland scrollbars — rust thumb on dust track */
|
|
144
|
+
:root[data-theme="wasteland"] ::-webkit-scrollbar {
|
|
145
|
+
width: 12px;
|
|
146
|
+
height: 12px;
|
|
147
|
+
}
|
|
148
|
+
:root[data-theme="wasteland"] ::-webkit-scrollbar-track {
|
|
149
|
+
background: var(--scrollbar-track);
|
|
150
|
+
}
|
|
151
|
+
:root[data-theme="wasteland"] ::-webkit-scrollbar-thumb {
|
|
152
|
+
background: var(--scrollbar-thumb);
|
|
153
|
+
border-radius: var(--radius-sm, 0);
|
|
154
|
+
}
|
|
155
|
+
:root[data-theme="wasteland"] ::-webkit-scrollbar-thumb:hover {
|
|
156
|
+
background: color-mix(in srgb, var(--scrollbar-thumb) 80%, white);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/* ── Per-component decorations (Wave 16 port from handoff) ─── */
|
|
160
|
+
|
|
161
|
+
:root[data-theme="wasteland"] .toolbar,
|
|
162
|
+
:root[data-theme="wasteland"] .sidebar,
|
|
163
|
+
:root[data-theme="wasteland"] .palette,
|
|
164
|
+
:root[data-theme="wasteland"] .chat {
|
|
165
|
+
background:
|
|
166
|
+
linear-gradient(180deg, transparent 60%, rgba(0,0,0,0.3)),
|
|
167
|
+
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='300' height='300'><filter id='r'><feTurbulence baseFrequency='0.5' numOctaves='2'/><feColorMatrix values='0 0 0 0 0.54 0 0 0 0 0.22 0 0 0 0 0.10 0 0 0 0.18 0'/></filter><rect width='300' height='300' filter='url(%23r)'/></svg>"),
|
|
168
|
+
var(--bg-panel);
|
|
169
|
+
}
|
|
170
|
+
:root[data-theme="wasteland"] .toolbar { border-bottom: 2px solid var(--rust); box-shadow: inset 0 -1px 0 hsl(var(--accent)); }
|
|
171
|
+
:root[data-theme="wasteland"] .sidebar { border-right: 2px solid var(--rust); }
|
|
172
|
+
:root[data-theme="wasteland"] .palette { border-left: 2px solid var(--rust); }
|
|
173
|
+
:root[data-theme="wasteland"] .chat { border-top: 2px solid var(--rust); }
|
|
174
|
+
|
|
175
|
+
/* CANVAS — cracked earth */
|
|
176
|
+
:root[data-theme="wasteland"] .canvas {
|
|
177
|
+
background:
|
|
178
|
+
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='200' height='200'><g stroke='%23e88a28' stroke-width='0.4' fill='none' opacity='0.10'><path d='M40 10 Q60 60 30 100 Q10 140 50 180 M120 0 Q140 80 100 140 M180 30 Q160 80 190 130'/></g></svg>"),
|
|
179
|
+
var(--bg-canvas);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/* TYPOGRAPHY — typewritten */
|
|
183
|
+
:root[data-theme="wasteland"] body { font-family: var(--font-body); color: var(--fg-default); }
|
|
184
|
+
:root[data-theme="wasteland"] h1, :root[data-theme="wasteland"] h2, :root[data-theme="wasteland"] h3,
|
|
185
|
+
:root[data-theme="wasteland"] .v-display {
|
|
186
|
+
font-family: var(--font-display); letter-spacing: 0.08em; text-transform: uppercase; color: hsl(var(--accent));
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/* SQUARE NODE — scrap metal plate, hand-stenciled */
|
|
190
|
+
:root[data-theme="wasteland"] .sq-node-box {
|
|
191
|
+
background:
|
|
192
|
+
linear-gradient(180deg, rgba(232,140,40,0.06), transparent),
|
|
193
|
+
var(--bg-elevated);
|
|
194
|
+
border: 2px solid var(--rust); border-radius: 0;
|
|
195
|
+
box-shadow: inset 0 0 0 1px rgba(0,0,0,0.4), 2px 2px 0 var(--rust);
|
|
196
|
+
color: hsl(var(--accent));
|
|
197
|
+
position: relative;
|
|
198
|
+
}
|
|
199
|
+
:root[data-theme="wasteland"] .sq-node-box::before {
|
|
200
|
+
content: ''; position: absolute; inset: 2px;
|
|
201
|
+
background: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='100' height='100'><filter id='s'><feTurbulence baseFrequency='2' numOctaves='1'/><feColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.18 0'/></filter><rect width='100' height='100' filter='url(%23s)'/></svg>");
|
|
202
|
+
pointer-events: none;
|
|
203
|
+
}
|
|
204
|
+
:root[data-theme="wasteland"] .sq-node.selected .sq-node-box { border-color: hsl(var(--accent)); box-shadow: 0 0 0 2px hsl(var(--info) / 0.25), 2px 2px 0 var(--rust); }
|
|
205
|
+
:root[data-theme="wasteland"] .sq-node-gear { background: var(--rust); color: hsl(var(--accent)); border: 1px solid hsl(var(--accent)); border-radius: 0; }
|
|
206
|
+
:root[data-theme="wasteland"] .sq-node-handle.out { background: hsl(var(--accent)); }
|
|
207
|
+
:root[data-theme="wasteland"] .sq-node-label { font-family: var(--font-display); letter-spacing: 0.10em; }
|
|
208
|
+
|
|
209
|
+
/* ACTIONS — stenciled */
|
|
210
|
+
:root[data-theme="wasteland"] .action-btn {
|
|
211
|
+
font-family: var(--font-display); letter-spacing: 0.10em; text-transform: uppercase;
|
|
212
|
+
border-radius: 0; border-width: 2px; border-style: dashed;
|
|
213
|
+
}
|
|
214
|
+
:root[data-theme="wasteland"] .action-run { background: hsl(var(--success-soft)); color: hsl(var(--success)); border-color: hsl(var(--success)); border-style: solid; }
|
|
215
|
+
:root[data-theme="wasteland"] .action-deploy { background: hsl(var(--info-soft)); color: hsl(var(--accent)); border-color: hsl(var(--accent)); border-style: solid; }
|
|
216
|
+
:root[data-theme="wasteland"] .action-save { background: hsl(var(--warning-soft)); color: hsl(var(--warning)); border-color: hsl(var(--warning)); border-style: solid; }
|
|
217
|
+
:root[data-theme="wasteland"] .action-stop { background: hsl(var(--danger-soft)); color: hsl(var(--danger)); border-color: hsl(var(--danger)); border-style: solid; }
|
|
218
|
+
|
|
219
|
+
/* CARDS */
|
|
220
|
+
:root[data-theme="wasteland"] .wf-card,
|
|
221
|
+
:root[data-theme="wasteland"] .cat,
|
|
222
|
+
:root[data-theme="wasteland"] .comp,
|
|
223
|
+
:root[data-theme="wasteland"] .settings-section,
|
|
224
|
+
:root[data-theme="wasteland"] .cred-card {
|
|
225
|
+
background: var(--bg-elevated); border: 1px solid var(--rust); border-radius: 0;
|
|
226
|
+
}
|
|
227
|
+
:root[data-theme="wasteland"] .wf-card.selected { border-color: hsl(var(--accent)); box-shadow: inset 3px 0 0 hsl(var(--accent)); }
|
|
228
|
+
:root[data-theme="wasteland"] .cat-tile { background: var(--rust); color: hsl(var(--accent)); border-radius: 0; }
|
|
229
|
+
:root[data-theme="wasteland"] .comp-ico { background: var(--bg-input); color: hsl(var(--accent)); border: 1px solid var(--rust); border-radius: 0; }
|
|
230
|
+
|
|
231
|
+
/* CHAT */
|
|
232
|
+
:root[data-theme="wasteland"] .chat-msg { border-radius: 0; }
|
|
233
|
+
:root[data-theme="wasteland"] .chat-msg-user { background: hsl(var(--info-soft)); border: 1px solid hsl(var(--accent)); }
|
|
234
|
+
:root[data-theme="wasteland"] .chat-msg-bot { background: var(--bg-elevated); border: 1px solid var(--rust); }
|
|
235
|
+
|
|
236
|
+
/* STATUS BAR */
|
|
237
|
+
:root[data-theme="wasteland"] .statusbar {
|
|
238
|
+
background: var(--bg-input); color: hsl(var(--accent)); border-top: 2px dashed var(--rust);
|
|
239
|
+
font-family: var(--font-mono); letter-spacing: 0.10em;
|
|
240
|
+
}
|
|
241
|
+
:root[data-theme="wasteland"] .statusbar .pip { background: var(--rad); box-shadow: 0 0 6px var(--rad); border-radius: 0; }
|
|
242
|
+
|
|
243
|
+
/* MODAL */
|
|
244
|
+
:root[data-theme="wasteland"] .modal { background: var(--bg-elevated); border: 3px solid hsl(var(--accent)); border-radius: 0; box-shadow: 6px 6px 0 var(--rust); }
|
|
245
|
+
:root[data-theme="wasteland"] .modal-head { border-bottom: 2px dashed var(--rust); background: var(--bg-panel); }
|
|
246
|
+
:root[data-theme="wasteland"] .modal-title { font-family: var(--font-display); color: hsl(var(--accent)); letter-spacing: 0.12em; }
|
|
247
|
+
|
|
248
|
+
/* CMDK */
|
|
249
|
+
:root[data-theme="wasteland"] .cmdk { background: var(--bg-elevated); border: 3px solid hsl(var(--accent)); border-radius: 0; }
|
|
250
|
+
:root[data-theme="wasteland"] .cmdk-item.active { background: var(--bg-active); color: hsl(var(--accent)); border-left: 3px solid var(--rust); }
|
|
@@ -213,6 +213,11 @@ export interface INodeUIHints {
|
|
|
213
213
|
isConsoleSink?: boolean;
|
|
214
214
|
/** Agent panels show the connected-skills section. */
|
|
215
215
|
hasSkills?: boolean;
|
|
216
|
+
/** InputSection / OutputPanel: this node is auxiliary configuration
|
|
217
|
+
* (memory, tool). Its panel inherits the parent's main inputs
|
|
218
|
+
* instead of showing direct upstream connections. Auto-derived on
|
|
219
|
+
* the backend from group membership; plugins can override. */
|
|
220
|
+
isConfigNode?: boolean;
|
|
216
221
|
}
|
|
217
222
|
|
|
218
223
|
export interface INodeTypeDescription {
|
|
@@ -25,4 +25,14 @@ export interface NodeData {
|
|
|
25
25
|
disabled?: boolean; // Skip execution when true (n8n-style disable)
|
|
26
26
|
customIcon?: string; // Custom icon: emoji, text, or image URL (http://, https://, data:, or /)
|
|
27
27
|
[key: string]: any;
|
|
28
|
-
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* CSSProperties extended to accept arbitrary CSS custom properties (e.g.
|
|
32
|
+
* `--node-color`). React's CSSProperties type rejects custom-property keys
|
|
33
|
+
* by default; this NodeStyle alias lets canvas-node components pass the
|
|
34
|
+
* per-definition node accent through to per-theme decorative CSS via a
|
|
35
|
+
* `--node-color` variable.
|
|
36
|
+
*/
|
|
37
|
+
import type { CSSProperties } from 'react';
|
|
38
|
+
export type NodeStyle = CSSProperties & Record<`--${string}`, string | number>;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parity tests for the FE `WorkflowEvent` interface + `matchesType` helper
|
|
3
|
+
* vs the backend `WorkflowEvent.matches_type` Pydantic method.
|
|
4
|
+
*
|
|
5
|
+
* Mirrors the cases in `server/tests/services/test_events.py::test_matches_type_glob`
|
|
6
|
+
* exactly so a future divergence (in the server-side regex or the FE
|
|
7
|
+
* regex) fails one or both suites.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { describe, it, expect } from 'vitest';
|
|
11
|
+
import { matchesType, type WorkflowEvent } from '../cloudEvents';
|
|
12
|
+
|
|
13
|
+
const sample: WorkflowEvent = {
|
|
14
|
+
specversion: '1.0',
|
|
15
|
+
id: 'abc123',
|
|
16
|
+
source: 'stripe://x',
|
|
17
|
+
type: 'stripe.charge.succeeded',
|
|
18
|
+
time: '2026-05-06T12:00:00Z',
|
|
19
|
+
data: {},
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
describe('matchesType', () => {
|
|
23
|
+
it('matches the wildcard "all"', () => {
|
|
24
|
+
expect(matchesType(sample, 'all')).toBe(true);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('matches the empty string as wildcard', () => {
|
|
28
|
+
expect(matchesType(sample, '')).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('matches an exact type', () => {
|
|
32
|
+
expect(matchesType(sample, 'stripe.charge.succeeded')).toBe(true);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('matches a leaf-prefix glob', () => {
|
|
36
|
+
expect(matchesType(sample, 'stripe.charge.*')).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('matches a root-prefix glob', () => {
|
|
40
|
+
expect(matchesType(sample, 'stripe.*')).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('returns false for a non-matching prefix glob', () => {
|
|
44
|
+
expect(matchesType(sample, 'payment_intent.*')).toBe(false);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('returns false for a non-matching exact type', () => {
|
|
48
|
+
expect(matchesType(sample, 'stripe.charge.failed')).toBe(false);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('treats the prefix-only form as exact (no trailing dot)', () => {
|
|
52
|
+
// Server-side parity: matches_type('stripe') only matches type='stripe',
|
|
53
|
+
// NOT 'stripe.charge.succeeded' — the glob form requires '.*' to span.
|
|
54
|
+
expect(matchesType(sample, 'stripe')).toBe(false);
|
|
55
|
+
const root: WorkflowEvent = { ...sample, type: 'stripe' };
|
|
56
|
+
expect(matchesType(root, 'stripe')).toBe(true);
|
|
57
|
+
expect(matchesType(root, 'stripe.*')).toBe(true);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
describe('WorkflowEvent shape', () => {
|
|
62
|
+
it('parses a backend-emitted credential_catalogue_updated payload', () => {
|
|
63
|
+
// Sample shape from server/services/status_broadcaster.py's
|
|
64
|
+
// broadcast_credential_event — copy of what hits the WS today.
|
|
65
|
+
const payload = {
|
|
66
|
+
type: 'credential_catalogue_updated',
|
|
67
|
+
data: {
|
|
68
|
+
specversion: '1.0',
|
|
69
|
+
id: 'a1b2c3d4',
|
|
70
|
+
source: 'machinaos://services/credentials',
|
|
71
|
+
type: 'credential.api_key.saved',
|
|
72
|
+
time: '2026-05-06T12:34:56.789Z',
|
|
73
|
+
subject: 'openai',
|
|
74
|
+
datacontenttype: 'application/json',
|
|
75
|
+
data: { provider: 'openai' },
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
const envelope = payload.data as WorkflowEvent<{ provider: string }>;
|
|
79
|
+
expect(envelope.specversion).toBe('1.0');
|
|
80
|
+
expect(envelope.type).toBe('credential.api_key.saved');
|
|
81
|
+
expect(envelope.subject).toBe('openai');
|
|
82
|
+
expect(envelope.data.provider).toBe('openai');
|
|
83
|
+
expect(matchesType(envelope, 'credential.api_key.*')).toBe(true);
|
|
84
|
+
expect(matchesType(envelope, 'credential.*')).toBe(true);
|
|
85
|
+
expect(matchesType(envelope, 'stripe.*')).toBe(false);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('preserves CloudEvents extension attributes when present', () => {
|
|
89
|
+
const event: WorkflowEvent = {
|
|
90
|
+
...sample,
|
|
91
|
+
workflow_id: 'wf_42',
|
|
92
|
+
trigger_node_id: 'trigger_abc',
|
|
93
|
+
correlation_id: 'corr_xyz',
|
|
94
|
+
};
|
|
95
|
+
expect(event.workflow_id).toBe('wf_42');
|
|
96
|
+
expect(event.trigger_node_id).toBe('trigger_abc');
|
|
97
|
+
expect(event.correlation_id).toBe('corr_xyz');
|
|
98
|
+
});
|
|
99
|
+
});
|