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.
Files changed (393) hide show
  1. package/README.md +143 -107
  2. package/client/dist/assets/ActionBar-Du2MSFSz.js +1 -0
  3. package/client/dist/assets/ApiKeyInput-k2LBmBjb.js +1 -0
  4. package/client/dist/assets/ApiKeyPanel-C_bV9U0X.js +1 -0
  5. package/client/dist/assets/ApiUsageSection-CmVfwZzL.js +1 -0
  6. package/client/dist/assets/EmailPanel-CeKIMGu-.js +1 -0
  7. package/client/dist/assets/OAuthPanel-KA3t3Q2K.js +1 -0
  8. package/client/dist/assets/QrPairingPanel-NgNpJNuk.js +1 -0
  9. package/client/dist/assets/RateLimitSection-Du5YNVIA.js +1 -0
  10. package/client/dist/assets/StatusCard-DNLyayXc.js +1 -0
  11. package/client/dist/assets/index-DQ0nwhec.js +257 -0
  12. package/client/dist/assets/index-DxmbVskS.css +1 -0
  13. package/client/dist/assets/vendor-flow-CZmBvHRo.js +1 -0
  14. package/client/dist/assets/vendor-icons-CVrPjN2Q.js +22 -0
  15. package/client/dist/assets/vendor-markdown-CRou3yQ5.js +62 -0
  16. package/client/dist/assets/vendor-misc-C4VxKHs5.js +1 -0
  17. package/client/dist/assets/vendor-query-SzWcOU0G.js +1 -0
  18. package/client/dist/assets/vendor-radix-Dnos29jG.js +56 -0
  19. package/client/dist/assets/vendor-react-DvWIbVx0.js +1 -0
  20. package/client/dist/index.html +37 -3
  21. package/client/index.html +28 -1
  22. package/client/package.json +44 -40
  23. package/client/src/App.tsx +2 -0
  24. package/client/src/Dashboard.tsx +157 -45
  25. package/client/src/ParameterPanel.tsx +3 -5
  26. package/client/src/adapters/nodeSpecToDescription.ts +1 -0
  27. package/client/src/assets/icons/NodeIcon.tsx +32 -0
  28. package/client/src/assets/icons/index.ts +4 -0
  29. package/client/src/assets/icons/stripe.svg +1 -0
  30. package/client/src/assets/icons/themedGlyphs.ts +404 -0
  31. package/client/src/components/AIAgentNode.tsx +77 -53
  32. package/client/src/components/GenericNode.tsx +34 -52
  33. package/client/src/components/OutputPanel.tsx +64 -147
  34. package/client/src/components/ParameterRenderer.tsx +5 -3
  35. package/client/src/components/SkillEditorModal.tsx +9 -18
  36. package/client/src/components/SquareNode.tsx +97 -115
  37. package/client/src/components/StartNode.tsx +32 -42
  38. package/client/src/components/SvgFilterDefs.tsx +54 -0
  39. package/client/src/components/TeamMonitorNode.tsx +12 -14
  40. package/client/src/components/ToolkitNode.tsx +35 -60
  41. package/client/src/components/TriggerNode.tsx +43 -77
  42. package/client/src/components/__tests__/CredentialsModal.test.tsx +49 -45
  43. package/client/src/components/credentials/CredentialsModal.tsx +98 -30
  44. package/client/src/components/credentials/CredentialsPalette.tsx +73 -5
  45. package/client/src/components/credentials/catalogueAdapter.ts +17 -1
  46. package/client/src/components/credentials/panels/ApiKeyPanel.tsx +102 -37
  47. package/client/src/components/credentials/panels/EmailPanel.tsx +7 -19
  48. package/client/src/components/credentials/panels/OAuthPanel.tsx +5 -1
  49. package/client/src/components/credentials/panels/QrPairingPanel.tsx +1 -3
  50. package/client/src/components/credentials/primitives/ActionBar.tsx +7 -11
  51. package/client/src/components/credentials/primitives/OAuthConnect.tsx +19 -28
  52. package/client/src/components/credentials/sections/ProviderDefaultsSection.tsx +24 -3
  53. package/client/src/components/credentials/types.ts +12 -2
  54. package/client/src/components/credentials/useCredentialPanel.ts +43 -19
  55. package/client/src/components/icons/AIProviderIcons.tsx +16 -0
  56. package/client/src/components/onboarding/OnboardingWizard.tsx +23 -63
  57. package/client/src/components/onboarding/nodeRoleClasses.ts +23 -0
  58. package/client/src/components/onboarding/steps/CanvasStep.tsx +15 -21
  59. package/client/src/components/onboarding/steps/ConceptsStep.tsx +2 -11
  60. package/client/src/components/onboarding/steps/GetStartedStep.tsx +2 -10
  61. package/client/src/components/parameterPanel/InputSection.tsx +9 -7
  62. package/client/src/components/parameterPanel/MasterSkillEditor.tsx +84 -198
  63. package/client/src/components/parameterPanel/MiddleSection.tsx +57 -80
  64. package/client/src/components/parameterPanel/ToolSchemaEditor.tsx +31 -25
  65. package/client/src/components/parameterPanel/__tests__/InputSection.test.tsx +7 -2
  66. package/client/src/components/ui/AIResultModal.tsx +1 -1
  67. package/client/src/components/ui/CollapsibleSection.tsx +9 -5
  68. package/client/src/components/ui/CommandPalette.tsx +147 -0
  69. package/client/src/components/ui/CommandPaletteHost.tsx +189 -0
  70. package/client/src/components/ui/ComponentItem.tsx +13 -7
  71. package/client/src/components/ui/ComponentPalette.tsx +24 -13
  72. package/client/src/components/ui/ConsolePanel.tsx +19 -11
  73. package/client/src/components/ui/DropCap.tsx +28 -0
  74. package/client/src/components/ui/EditableNodeLabel.tsx +10 -2
  75. package/client/src/components/ui/InputNodesPanel.tsx +1 -1
  76. package/client/src/components/ui/Modal.tsx +38 -6
  77. package/client/src/components/ui/OutputDisplayPanel.tsx +1 -1
  78. package/client/src/components/ui/SettingsPanel.tsx +42 -13
  79. package/client/src/components/ui/StatusBar.tsx +108 -0
  80. package/client/src/components/ui/ThemeSwitcher.tsx +109 -0
  81. package/client/src/components/ui/TopToolbar.tsx +42 -25
  82. package/client/src/components/ui/WorkflowSidebar.tsx +32 -16
  83. package/client/src/components/ui/action-button.tsx +40 -15
  84. package/client/src/components/ui/button.tsx +24 -1
  85. package/client/src/components/ui/dropdown-menu.tsx +24 -2
  86. package/client/src/components/ui/input.tsx +19 -2
  87. package/client/src/components/ui/select.tsx +15 -0
  88. package/client/src/components/ui/textarea.tsx +15 -2
  89. package/client/src/contexts/AuthContext.tsx +148 -109
  90. package/client/src/contexts/ThemeContext.tsx +93 -17
  91. package/client/src/contexts/WebSocketContext.tsx +373 -206
  92. package/client/src/contexts/__tests__/AuthContext.test.tsx +221 -0
  93. package/client/src/hooks/__tests__/useDragVariable.test.ts +7 -1
  94. package/client/src/hooks/__tests__/useWorkflowOpsListener.test.ts +142 -0
  95. package/client/src/hooks/useAppTheme.ts +209 -7
  96. package/client/src/hooks/useAutoSkillEdges.ts +7 -2
  97. package/client/src/hooks/useCatalogueQuery.ts +67 -1
  98. package/client/src/hooks/useDragVariable.ts +1 -1
  99. package/client/src/hooks/useNodeAllowlist.ts +115 -8
  100. package/client/src/hooks/useOnboarding.ts +20 -8
  101. package/client/src/hooks/useParameterPanel.ts +2 -1
  102. package/client/src/hooks/useReactFlowNodes.ts +2 -1
  103. package/client/src/hooks/useSound.ts +185 -0
  104. package/client/src/hooks/useWorkflowManagement.ts +6 -8
  105. package/client/src/hooks/useWorkflowOpsListener.ts +90 -0
  106. package/client/src/index.css +65 -3
  107. package/client/src/lib/__tests__/connectionConfig.test.ts +91 -0
  108. package/client/src/lib/aiModelProviders.ts +8 -0
  109. package/client/src/lib/connectionConfig.ts +107 -0
  110. package/client/src/lib/queryPersist.ts +13 -5
  111. package/client/src/lib/sound.ts +393 -0
  112. package/client/src/main.tsx +20 -0
  113. package/client/src/store/useAppStore.ts +26 -0
  114. package/client/src/styles/canvasAnimations.ts +37 -36
  115. package/client/src/styles/theme.ts +36 -20
  116. package/client/src/test/setup.ts +1 -0
  117. package/client/src/themes/atomic.css +253 -0
  118. package/client/src/themes/base.css +373 -0
  119. package/client/src/themes/cyber.css +890 -0
  120. package/client/src/themes/dark.css +70 -0
  121. package/client/src/themes/edo.css +246 -0
  122. package/client/src/themes/greek.css +293 -0
  123. package/client/src/themes/light.css +78 -0
  124. package/client/src/themes/plague.css +253 -0
  125. package/client/src/themes/renaissance.css +727 -0
  126. package/client/src/themes/rot.css +249 -0
  127. package/client/src/themes/steampunk.css +272 -0
  128. package/client/src/themes/surveillance.css +289 -0
  129. package/client/src/themes/wasteland.css +250 -0
  130. package/client/src/types/INodeProperties.ts +5 -0
  131. package/client/src/types/NodeTypes.ts +11 -1
  132. package/client/src/types/__tests__/cloudEvents.test.ts +99 -0
  133. package/client/src/types/cloudEvents.ts +78 -0
  134. package/client/src/vite-env.d.ts +7 -0
  135. package/client/tsconfig.json +1 -1
  136. package/client/vite.config.js +62 -2
  137. package/install.ps1 +1 -1
  138. package/install.sh +1 -1
  139. package/machina/commands/build.py +51 -7
  140. package/machina/pyproject.toml +4 -0
  141. package/machina/supervisor.py +12 -2
  142. package/machina/tree.py +71 -21
  143. package/package.json +4 -4
  144. package/scripts/install.js +16 -1
  145. package/server/config/ai_cli_providers.json +54 -0
  146. package/server/config/credential_providers.json +109 -2
  147. package/server/config/llm_defaults.json +24 -0
  148. package/server/config/model_registry.json +338 -499
  149. package/server/config/node_allowlist.json +16 -1
  150. package/server/config/pricing.json +8 -0
  151. package/server/constants.py +38 -15
  152. package/server/core/container.py +2 -2
  153. package/server/core/credentials_database.py +35 -2
  154. package/server/core/logging.py +4 -3
  155. package/server/main.py +99 -13
  156. package/server/models/node_metadata.py +1 -0
  157. package/server/nodejs/package.json +8 -6
  158. package/server/nodejs/src/index.ts +22 -5
  159. package/server/nodes/README.md +31 -4
  160. package/server/nodes/agent/_inline.py +2 -0
  161. package/server/nodes/agent/_specialized.py +6 -3
  162. package/server/nodes/agent/ai_agent.py +13 -3
  163. package/server/nodes/agent/chat_agent.py +6 -3
  164. package/server/nodes/agent/claude_code_agent.py +287 -75
  165. package/server/nodes/agent/codex_agent.py +239 -0
  166. package/server/nodes/agent/deep_agent.py +3 -3
  167. package/server/nodes/agent/rlm_agent.py +3 -3
  168. package/server/nodes/android/__init__.py +31 -1
  169. package/server/nodes/android/_base.py +9 -5
  170. package/server/{services/android_service.py → nodes/android/_dispatcher.py} +2 -2
  171. package/server/nodes/android/_handlers.py +154 -0
  172. package/server/nodes/android/_option_loaders.py +44 -0
  173. package/server/nodes/android/_refresh.py +127 -0
  174. package/server/{services/android → nodes/android/_relay}/client.py +4 -4
  175. package/server/{routers/android.py → nodes/android/_router.py} +27 -8
  176. package/server/nodes/browser/browser.py +2 -2
  177. package/server/nodes/code/_base.py +6 -2
  178. package/server/nodes/code/_claude_code.py +134 -0
  179. package/server/nodes/document/embedding_generator.py +3 -3
  180. package/server/nodes/document/http_scraper.py +3 -3
  181. package/server/nodes/document/vector_store.py +5 -5
  182. package/server/nodes/email/__init__.py +11 -1
  183. package/server/nodes/email/_filters.py +21 -0
  184. package/server/{services/himalaya_service.py → nodes/email/_himalaya.py} +6 -10
  185. package/server/{services/email_service.py → nodes/email/_service.py} +9 -13
  186. package/server/nodes/email/email_read.py +1 -1
  187. package/server/nodes/email/email_receive.py +54 -5
  188. package/server/nodes/email/email_send.py +1 -1
  189. package/server/nodes/filesystem/shell.py +24 -1
  190. package/server/nodes/google/__init__.py +55 -1
  191. package/server/{services/handlers/google_auth.py → nodes/google/_auth_helper.py} +8 -5
  192. package/server/nodes/google/_base.py +2 -2
  193. package/server/nodes/google/_credentials.py +5 -5
  194. package/server/nodes/google/_filters.py +25 -0
  195. package/server/nodes/google/_handlers.py +57 -0
  196. package/server/{services/google_oauth.py → nodes/google/_oauth.py} +195 -162
  197. package/server/nodes/google/_option_loaders.py +107 -0
  198. package/server/nodes/google/_refresh.py +66 -0
  199. package/server/nodes/google/_router.py +131 -0
  200. package/server/nodes/google/gmail_receive.py +41 -4
  201. package/server/nodes/groups.py +1 -0
  202. package/server/nodes/location/_credentials.py +45 -1
  203. package/server/{services/maps.py → nodes/location/_service.py} +18 -3
  204. package/server/nodes/location/gmaps_create.py +4 -4
  205. package/server/nodes/location/gmaps_locations.py +4 -4
  206. package/server/nodes/location/gmaps_nearby_places.py +4 -4
  207. package/server/nodes/model/_base.py +8 -3
  208. package/server/nodes/model/_credentials.py +96 -8
  209. package/server/nodes/model/_local_validator.py +345 -0
  210. package/server/nodes/model/lmstudio_chat_model.py +23 -0
  211. package/server/nodes/model/ollama_chat_model.py +25 -0
  212. package/server/nodes/proxy/_usage.py +2 -2
  213. package/server/nodes/proxy/proxy_config.py +14 -14
  214. package/server/nodes/proxy/proxy_request.py +4 -4
  215. package/server/nodes/scraper/_credentials.py +29 -1
  216. package/server/nodes/scraper/apify_actor.py +9 -9
  217. package/server/nodes/scraper/crawlee_scraper.py +5 -5
  218. package/server/nodes/search/brave_search.py +4 -0
  219. package/server/nodes/search/perplexity_search.py +9 -0
  220. package/server/nodes/search/serper_search.py +3 -0
  221. package/server/nodes/skill/simple_memory.py +12 -0
  222. package/server/nodes/social/_base.py +2 -2
  223. package/server/nodes/stripe/__init__.py +46 -0
  224. package/server/nodes/stripe/_credentials.py +33 -0
  225. package/server/nodes/stripe/_handlers.py +270 -0
  226. package/server/nodes/stripe/_install.py +127 -0
  227. package/server/nodes/stripe/_source.py +174 -0
  228. package/server/nodes/stripe/stripe_action.py +81 -0
  229. package/server/nodes/stripe/stripe_receive.py +92 -0
  230. package/server/nodes/telegram/_credentials.py +52 -1
  231. package/server/nodes/telegram/_handlers.py +19 -18
  232. package/server/nodes/telegram/_service.py +134 -32
  233. package/server/nodes/telegram/telegram_send.py +5 -6
  234. package/server/nodes/text/file_handler.py +2 -2
  235. package/server/nodes/text/text_generator.py +2 -2
  236. package/server/nodes/tool/agent_builder.py +630 -0
  237. package/server/nodes/tool/task_manager.py +144 -2
  238. package/server/nodes/twitter/__init__.py +38 -1
  239. package/server/nodes/twitter/_base.py +7 -7
  240. package/server/nodes/twitter/_credentials.py +1 -1
  241. package/server/nodes/twitter/_filters.py +37 -0
  242. package/server/nodes/twitter/_handlers.py +77 -0
  243. package/server/nodes/twitter/_oauth.py +124 -0
  244. package/server/nodes/twitter/_refresh.py +78 -0
  245. package/server/nodes/twitter/_router.py +29 -0
  246. package/server/nodes/twitter/twitter_receive.py +4 -0
  247. package/server/nodes/visuals.json +64 -19
  248. package/server/nodes/whatsapp/__init__.py +45 -5
  249. package/server/nodes/whatsapp/_base.py +3 -3
  250. package/server/nodes/whatsapp/_filters.py +137 -0
  251. package/server/nodes/whatsapp/_handlers.py +167 -0
  252. package/server/nodes/whatsapp/_option_loaders.py +68 -0
  253. package/server/nodes/whatsapp/_refresh.py +62 -0
  254. package/server/nodes/whatsapp/_runtime.py +1 -1
  255. package/server/pyproject.toml +29 -7
  256. package/server/routers/schemas.py +2 -2
  257. package/server/routers/webhook.py +26 -9
  258. package/server/routers/websocket.py +149 -810
  259. package/server/services/ai.py +89 -8
  260. package/server/services/auth.py +220 -43
  261. package/server/services/claude_oauth.py +126 -100
  262. package/server/services/cli_agent/__init__.py +78 -0
  263. package/server/services/cli_agent/_handlers.py +237 -0
  264. package/server/services/cli_agent/config.py +112 -0
  265. package/server/services/cli_agent/factory.py +48 -0
  266. package/server/services/cli_agent/lockfile.py +141 -0
  267. package/server/services/cli_agent/mcp_server.py +482 -0
  268. package/server/services/cli_agent/protocol.py +173 -0
  269. package/server/services/cli_agent/providers/__init__.py +9 -0
  270. package/server/services/cli_agent/providers/anthropic_claude.py +419 -0
  271. package/server/services/cli_agent/providers/google_gemini.py +80 -0
  272. package/server/services/cli_agent/providers/openai_codex.py +310 -0
  273. package/server/services/cli_agent/service.py +607 -0
  274. package/server/services/cli_agent/session.py +618 -0
  275. package/server/services/cli_agent/types.py +227 -0
  276. package/server/services/cli_agent/workflow_tools.py +233 -0
  277. package/server/services/credential_registry.py +26 -1
  278. package/server/services/deployment/manager.py +26 -145
  279. package/server/services/deployment/poll_registry.py +59 -0
  280. package/server/services/event_waiter.py +76 -246
  281. package/server/services/events/__init__.py +54 -0
  282. package/server/services/events/cli.py +78 -0
  283. package/server/services/events/daemon.py +163 -0
  284. package/server/services/events/envelope.py +281 -0
  285. package/server/services/events/lifecycle.py +99 -0
  286. package/server/services/events/oauth_lifecycle.py +534 -0
  287. package/server/services/events/polling.py +60 -0
  288. package/server/services/events/push.py +36 -0
  289. package/server/services/events/source.py +63 -0
  290. package/server/services/events/triggers.py +118 -0
  291. package/server/services/events/verifiers/__init__.py +25 -0
  292. package/server/services/events/verifiers/base.py +28 -0
  293. package/server/services/events/verifiers/github.py +25 -0
  294. package/server/services/events/verifiers/hmac_basic.py +32 -0
  295. package/server/services/events/verifiers/standard_webhooks.py +47 -0
  296. package/server/services/events/verifiers/stripe.py +42 -0
  297. package/server/services/events/webhook.py +105 -0
  298. package/server/services/handlers/tools.py +28 -186
  299. package/server/services/llm/config.py +7 -0
  300. package/server/services/llm/factory.py +8 -2
  301. package/server/services/memory/__init__.py +52 -0
  302. package/server/services/memory/jsonl.py +80 -0
  303. package/server/services/memory/markdown.py +65 -0
  304. package/server/services/memory/state.py +112 -0
  305. package/server/services/memory/vector_store.py +40 -0
  306. package/server/services/model_registry.py +76 -0
  307. package/server/services/node_allowlist.py +71 -15
  308. package/server/services/node_executor.py +2 -2
  309. package/server/services/node_output_schemas.py +21 -10
  310. package/server/services/node_spec.py +1 -1
  311. package/server/services/oauth_utils.py +1 -1
  312. package/server/services/plugin/__init__.py +2 -0
  313. package/server/services/plugin/base.py +44 -2
  314. package/server/services/plugin/credential.py +288 -1
  315. package/server/services/plugin/deps.py +105 -0
  316. package/server/services/plugin/edge_walker.py +12 -4
  317. package/server/services/plugin/oauth.py +381 -0
  318. package/server/services/plugin/polling.py +247 -0
  319. package/server/services/plugin/registry.py +145 -0
  320. package/server/services/plugin/singleton.py +65 -0
  321. package/server/services/plugin/ws.py +81 -0
  322. package/server/services/process_service.py +31 -2
  323. package/server/services/status_broadcaster.py +155 -238
  324. package/server/services/temporal/workflow.py +7 -7
  325. package/server/services/workflow.py +21 -3
  326. package/server/services/ws_handler_registry.py +111 -28
  327. package/server/skills/GUIDE.md +16 -1
  328. package/server/skills/assistant/agent-builder-skill/SKILL.md +166 -0
  329. package/server/skills/payments_agent/stripe-skill/SKILL.md +306 -0
  330. package/server/tests/credentials/test_auth_service.py +16 -9
  331. package/server/tests/credentials/test_credential_broadcasts.py +219 -0
  332. package/server/tests/credentials/test_google_oauth.py +6 -6
  333. package/server/tests/credentials/test_oauth_utils.py +1 -1
  334. package/server/tests/credentials/test_twitter_oauth.py +2 -2
  335. package/server/tests/credentials/test_websocket_handlers.py +44 -20
  336. package/server/tests/llm/test_factory.py +1 -0
  337. package/server/tests/llm/test_wiring.py +5 -1
  338. package/server/tests/nodes/_compat.py +24 -24
  339. package/server/tests/nodes/test_agent_builder.py +439 -0
  340. package/server/tests/nodes/test_ai_tools.py +18 -14
  341. package/server/tests/nodes/test_code_fs_process.py +17 -8
  342. package/server/tests/nodes/test_email.py +10 -9
  343. package/server/tests/nodes/test_google_workspace.py +2 -2
  344. package/server/tests/nodes/test_specialized_agents.py +100 -53
  345. package/server/tests/nodes/test_stripe_plugin.py +293 -0
  346. package/server/tests/nodes/test_telegram_social.py +4 -4
  347. package/server/tests/nodes/test_twitter.py +1 -1
  348. package/server/tests/nodes/test_web_automation.py +2 -2
  349. package/server/tests/nodes/test_whatsapp.py +9 -9
  350. package/server/tests/services/cli_agent/__init__.py +0 -0
  351. package/server/tests/services/cli_agent/test_mcp_server.py +432 -0
  352. package/server/tests/services/cli_agent/test_providers.py +358 -0
  353. package/server/tests/services/cli_agent/test_service.py +298 -0
  354. package/server/tests/services/memory/__init__.py +0 -0
  355. package/server/tests/services/memory/test_jsonl.py +188 -0
  356. package/server/tests/services/test_events.py +333 -0
  357. package/server/tests/test_node_spec.py +56 -16
  358. package/server/tests/test_plugin_helpers.py +116 -0
  359. package/server/tests/test_plugin_self_containment.py +486 -0
  360. package/server/tests/test_status_broadcasts.py +425 -0
  361. package/workflows/{AI Assistant_workflow-1777421105154-0m4snkzjf.json → AI Assistant_workflow-1778504793388-ou1m1tz2x.json } +70 -266
  362. package/workflows/{AI Employee_workflow-1777720598005-u4cm858dv.json → AI Employee_example_workflow-1777720598005-u4cm858dv.json } +112 -112
  363. package/workflows/Claude Assistant_workflow-1778380124051-mdibn807c.json +709 -0
  364. package/client/dist/assets/ActionBar-vzPpSR77.js +0 -1
  365. package/client/dist/assets/ApiKeyInput-Ds7AKFe8.js +0 -1
  366. package/client/dist/assets/ApiKeyPanel-gfblELep.js +0 -1
  367. package/client/dist/assets/ApiUsageSection-BMNWTe2r.js +0 -1
  368. package/client/dist/assets/EmailPanel-B1Om64p5.js +0 -1
  369. package/client/dist/assets/OAuthPanel-CXyQYGBz.js +0 -1
  370. package/client/dist/assets/QrPairingPanel-BgNuI1we.js +0 -1
  371. package/client/dist/assets/RateLimitSection-YYK8sx1T.js +0 -1
  372. package/client/dist/assets/StatusCard-DuYA5hJR.js +0 -1
  373. package/client/dist/assets/index-D9tZfgvi.js +0 -363
  374. package/client/dist/assets/index-al7snTkG.css +0 -1
  375. package/client/src/components/credentials/providers.tsx +0 -177
  376. package/server/routers/google.py +0 -277
  377. package/server/routers/maps.py +0 -142
  378. package/server/routers/twitter.py +0 -365
  379. package/server/services/claude_code_service.py +0 -106
  380. package/server/services/memory.py +0 -159
  381. package/server/services/node_option_loaders/__init__.py +0 -77
  382. package/server/services/node_option_loaders/android_loaders.py +0 -55
  383. package/server/services/node_option_loaders/google_loaders.py +0 -97
  384. package/server/services/node_option_loaders/whatsapp_loaders.py +0 -69
  385. package/server/services/twitter_oauth.py +0 -411
  386. package/server/services/websocket_client.py +0 -29
  387. /package/server/{services/android → nodes/android/_relay}/__init__.py +0 -0
  388. /package/server/{services/android → nodes/android/_relay}/broadcaster.py +0 -0
  389. /package/server/{services/android → nodes/android/_relay}/manager.py +0 -0
  390. /package/server/{services/android → nodes/android/_relay}/protocol.py +0 -0
  391. /package/server/{services/browser_service.py → nodes/browser/_service.py} +0 -0
  392. /package/server/{services/whatsapp_service.py → nodes/whatsapp/_service.py} +0 -0
  393. /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
+ });