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