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,5 +1,4 @@
1
1
  import React, { useState } from 'react';
2
- import { useAppTheme } from '../hooks/useAppTheme';
3
2
  import { useAppStore } from '../store/useAppStore';
4
3
  import { INodeOutputDefinition, NodeConnectionType } from '../types/INodeProperties';
5
4
  import { useDragVariable } from '../hooks/useDragVariable';
@@ -121,8 +120,7 @@ const ANDROID_NODE_TYPES = [
121
120
  ];
122
121
 
123
122
  const OutputPanel: React.FC<OutputPanelProps> = ({ nodeId }) => {
124
- const theme = useAppTheme();
125
- const { currentWorkflow } = useAppStore();
123
+ const currentWorkflow = useAppStore((s) => s.currentWorkflow);
126
124
  const [expandedNode, setExpandedNode] = useState<string | null>(null);
127
125
  const [isDragging, setIsDragging] = useState(false);
128
126
  const [draggedParam, setDraggedParam] = useState<{ nodeId: string; output: string } | null>(null);
@@ -188,14 +186,15 @@ const OutputPanel: React.FC<OutputPanelProps> = ({ nodeId }) => {
188
186
  return false;
189
187
  };
190
188
 
191
- // Helper to check if a node is a config/auxiliary node (connects to config handles)
189
+ // Helper to check if a node is a config/auxiliary node (connects to config handles).
190
+ // Backend auto-derives `uiHints.isConfigNode` from group membership
191
+ // (`memory` / `tool`) at registration time — see
192
+ // services/plugin/base.py::_derive_auto_ui_hints. Plugins can also
193
+ // set the flag explicitly to override.
192
194
  const isConfigNode = (nodeType: string | undefined): boolean => {
193
195
  if (!nodeType) return false;
194
196
  const definition = resolveNodeDescription(nodeType);
195
- if (!definition) return false;
196
- // Config nodes typically have 'memory' or 'tool' in their group, or have no main input
197
- const groups = definition.group || [];
198
- return groups.includes('memory') || groups.includes('tool');
197
+ return definition?.uiHints?.isConfigNode === true;
199
198
  };
200
199
 
201
200
  // Get connected nodes with their outputs
@@ -288,24 +287,11 @@ const OutputPanel: React.FC<OutputPanelProps> = ({ nodeId }) => {
288
287
 
289
288
  if (connectedNodes.length === 0) {
290
289
  return (
291
- <div style={{
292
- width: '300px',
293
- height: '100%',
294
- padding: theme.spacing.md,
295
- backgroundColor: theme.colors.backgroundAlt,
296
- borderRight: `1px solid ${theme.colors.border}`,
297
- display: 'flex',
298
- flexDirection: 'column',
299
- alignItems: 'center',
300
- justifyContent: 'center'
301
- }}>
302
- <p style={{
303
- margin: 0,
304
- fontSize: theme.fontSize.sm,
305
- color: theme.colors.textSecondary,
306
- fontStyle: 'italic',
307
- textAlign: 'center'
308
- }}>
290
+ <div
291
+ className="flex h-full flex-col items-center justify-center border-r border-border-default bg-bg-panel p-3"
292
+ style={{ width: '300px' }}
293
+ >
294
+ <p className="m-0 text-center text-sm italic text-fg-muted">
309
295
  No connected nodes.
310
296
  <br />
311
297
  Connect nodes to see their outputs here.
@@ -315,140 +301,78 @@ const OutputPanel: React.FC<OutputPanelProps> = ({ nodeId }) => {
315
301
  }
316
302
 
317
303
  return (
318
- <div style={{
319
- width: '300px',
320
- height: '100%',
321
- backgroundColor: theme.colors.backgroundAlt,
322
- borderRight: `1px solid ${theme.colors.border}`,
323
- display: 'flex',
324
- flexDirection: 'column'
325
- }}>
304
+ <div
305
+ className="flex h-full flex-col border-r border-border-default bg-bg-panel"
306
+ style={{ width: '300px' }}
307
+ >
326
308
  {/* Header */}
327
- <div style={{
328
- padding: theme.spacing.md,
329
- backgroundColor: theme.colors.backgroundPanel,
330
- borderBottom: `1px solid ${theme.colors.border}`,
331
- fontSize: theme.fontSize.sm,
332
- fontWeight: theme.fontWeight.semibold,
333
- color: theme.colors.textSecondary,
334
- textTransform: 'uppercase',
335
- letterSpacing: '0.1em'
336
- }}>
337
- 🔗 Connected Outputs
309
+ <div className="border-b border-border-default bg-bg-panel p-3 font-display text-sm font-semibold tracking-[var(--type-tracking-display)] text-fg-default [text-transform:var(--type-uppercase)]">
310
+ Connected Outputs
338
311
  </div>
339
312
 
340
313
  {/* Scrollable content */}
341
- <div style={{
342
- flex: 1,
343
- overflowY: 'auto',
344
- padding: theme.spacing.sm
345
- }}>
314
+ <div className="flex-1 overflow-y-auto p-2">
346
315
  {connectedNodes.map((node) => (
347
- <div key={node.nodeId} style={{
348
- marginBottom: theme.spacing.xs,
349
- border: `1px solid ${theme.colors.border}`,
350
- borderRadius: theme.borderRadius.sm,
351
- backgroundColor: theme.colors.background,
352
- overflow: 'hidden'
353
- }}>
316
+ <div
317
+ key={node.nodeId}
318
+ className="mb-1 overflow-hidden rounded-sm border border-border-default bg-bg-elevated"
319
+ >
354
320
  <div
355
321
  onClick={() => setExpandedNode(expandedNode === node.nodeId ? null : node.nodeId)}
356
- style={{
357
- padding: theme.spacing.sm,
358
- cursor: 'pointer',
359
- display: 'flex',
360
- alignItems: 'center',
361
- justifyContent: 'space-between',
362
- backgroundColor: theme.colors.backgroundAlt,
363
- transition: theme.transitions.fast
364
- }}
322
+ className="flex cursor-pointer items-center justify-between bg-bg-panel p-2 transition-colors"
365
323
  >
366
- <span style={{
367
- fontSize: theme.fontSize.sm,
368
- fontWeight: theme.fontWeight.medium,
369
- color: theme.colors.text
370
- }}>
324
+ <span className="text-sm font-medium text-fg-default">
371
325
  {node.nodeName}
372
326
  </span>
373
- <span style={{
374
- fontSize: theme.fontSize.xs,
375
- color: theme.colors.textSecondary,
376
- transform: expandedNode === node.nodeId ? 'rotate(180deg)' : 'rotate(0deg)',
377
- transition: 'transform 0.2s ease'
378
- }}>
327
+ <span
328
+ className="text-xs text-fg-muted"
329
+ style={{
330
+ transform: expandedNode === node.nodeId ? 'rotate(180deg)' : 'rotate(0deg)',
331
+ transition: 'transform 0.2s ease'
332
+ }}
333
+ >
379
334
 
380
335
  </span>
381
336
  </div>
382
337
 
383
338
  {expandedNode === node.nodeId && (
384
- <div style={{
385
- padding: theme.spacing.sm,
386
- borderTop: `1px solid ${theme.colors.border}`
387
- }}>
339
+ <div className="border-t border-border-default p-2">
388
340
  {node.outputs.length === 0 ? (
389
- <p style={{
390
- margin: 0,
391
- fontSize: theme.fontSize.xs,
392
- color: theme.colors.textSecondary,
393
- fontStyle: 'italic',
394
- padding: theme.spacing.xs
395
- }}>
341
+ <p className="m-0 p-1 text-xs italic text-fg-muted">
396
342
  No output parameters available
397
343
  </p>
398
344
  ) : (
399
- node.outputs.map((output) => (
400
- <div
401
- key={output.name}
402
- draggable
403
- onDragStart={(e) => handleDragStart(e, node.nodeId, output.name)}
404
- onDragEnd={handleDragEnd}
405
- style={{
406
- padding: theme.spacing.xs,
407
- marginBottom: theme.spacing.xs,
408
- backgroundColor: isDragging && draggedParam?.nodeId === node.nodeId && draggedParam?.output === output.name
409
- ? theme.colors.focusRing
410
- : theme.colors.backgroundAlt,
411
- border: `1px solid ${theme.colors.border}`,
412
- borderRadius: theme.borderRadius.sm,
413
- cursor: 'grab',
414
- transition: theme.transitions.fast
415
- }}
416
- >
417
- <div style={{
418
- display: 'flex',
419
- alignItems: 'center',
420
- justifyContent: 'space-between'
421
- }}>
422
- <div>
423
- <div style={{
424
- fontSize: theme.fontSize.sm,
425
- fontWeight: theme.fontWeight.medium,
426
- color: theme.colors.text,
427
- marginBottom: '2px'
428
- }}>
429
- {output.displayName}
345
+ node.outputs.map((output) => {
346
+ const isActiveDrag =
347
+ isDragging &&
348
+ draggedParam?.nodeId === node.nodeId &&
349
+ draggedParam?.output === output.name;
350
+ return (
351
+ <div
352
+ key={output.name}
353
+ draggable
354
+ onDragStart={(e) => handleDragStart(e, node.nodeId, output.name)}
355
+ onDragEnd={handleDragEnd}
356
+ className={`mb-1 cursor-grab rounded-sm border border-border-default p-1 transition-colors ${
357
+ isActiveDrag ? 'bg-accent' : 'bg-bg-panel'
358
+ }`}
359
+ >
360
+ <div className="flex items-center justify-between">
361
+ <div>
362
+ <div className="mb-0.5 text-sm font-medium text-fg-default">
363
+ {output.displayName}
364
+ </div>
365
+ <div className="text-xs text-fg-muted">
366
+ {output.type} • {output.description}
367
+ </div>
430
368
  </div>
431
- <div style={{
432
- fontSize: theme.fontSize.xs,
433
- color: theme.colors.textSecondary
434
- }}>
435
- {output.type} • {output.description}
369
+ <div className="rounded-sm border border-border-default bg-bg-elevated px-1 py-0.5 font-mono text-xs text-fg-muted">
370
+ {output.name}
436
371
  </div>
437
372
  </div>
438
- <div style={{
439
- fontSize: theme.fontSize.xs,
440
- color: theme.colors.textSecondary,
441
- fontFamily: 'monospace',
442
- padding: `2px ${theme.spacing.xs}`,
443
- backgroundColor: theme.colors.background,
444
- borderRadius: theme.borderRadius.sm,
445
- border: `1px solid ${theme.colors.border}`
446
- }}>
447
- {output.name}
448
- </div>
449
373
  </div>
450
- </div>
451
- ))
374
+ );
375
+ })
452
376
  )}
453
377
  </div>
454
378
  )}
@@ -457,18 +381,11 @@ const OutputPanel: React.FC<OutputPanelProps> = ({ nodeId }) => {
457
381
  </div>
458
382
 
459
383
  {/* Footer */}
460
- <div style={{
461
- padding: theme.spacing.sm,
462
- backgroundColor: theme.colors.backgroundPanel,
463
- borderTop: `1px solid ${theme.colors.border}`,
464
- fontSize: theme.fontSize.xs,
465
- color: theme.colors.textSecondary,
466
- textAlign: 'center'
467
- }}>
468
- 💡 Drag outputs to parameter fields
384
+ <div className="border-t border-border-default bg-bg-panel p-2 text-center text-xs text-fg-muted">
385
+ Drag outputs to parameter fields
469
386
  </div>
470
387
  </div>
471
388
  );
472
389
  };
473
390
 
474
- export default OutputPanel;
391
+ export default OutputPanel;
@@ -18,7 +18,10 @@ import { AI_MODEL_PROVIDER_MAP } from '../lib/aiModelProviders';
18
18
 
19
19
  import { resolveNodeDescription } from '../lib/nodeSpec';
20
20
  // Map node types to provider keys for AI model nodes
21
- // Uses the centralized map from aiModelNodes + legacy aliases
21
+ // Uses the centralized map from aiModelProviders.ts. Local-server
22
+ // providers (ollama, lmstudio) live in that map alongside the cloud
23
+ // providers, so no per-type override is needed here. The remaining
24
+ // aliases below cover renamed-but-still-saved-in-old-workflows types.
22
25
  const NODE_TYPE_TO_PROVIDER: Record<string, string> = {
23
26
  ...AI_MODEL_PROVIDER_MAP,
24
27
  // Legacy aliases for backward compatibility
@@ -26,7 +29,6 @@ const NODE_TYPE_TO_PROVIDER: Record<string, string> = {
26
29
  'googleChatModel': 'gemini',
27
30
  'azureChatModel': 'azure_openai',
28
31
  'cohereChatModel': 'cohere',
29
- 'ollamaChatModel': 'ollama',
30
32
  };
31
33
 
32
34
  // Collection Renderer - n8n official style
@@ -983,7 +985,7 @@ const ParameterRenderer: React.FC<ParameterRendererProps> = ({
983
985
  const [dynamicOptions, setDynamicOptions] = useState<INodePropertyOption[]>([]);
984
986
  const [nodeParameters, setNodeParameters] = useState<Record<string, any>>({});
985
987
 
986
- const { selectedNode } = useAppStore();
988
+ const selectedNode = useAppStore((s) => s.selectedNode);
987
989
  const { getNodeParameters, sendRequest } = useWebSocket();
988
990
  const { getStoredApiKey, hasStoredKey, getStoredModels, getProviderDefaults } = useApiKeys();
989
991
 
@@ -4,7 +4,6 @@ import { zodResolver } from '@hookform/resolvers/zod';
4
4
  import { z } from 'zod';
5
5
  import Modal from './ui/Modal';
6
6
  import CodeEditor from './ui/CodeEditor';
7
- import { useAppTheme } from '../hooks/useAppTheme';
8
7
  import { useWebSocket } from '../contexts/WebSocketContext';
9
8
  import {
10
9
  Form,
@@ -25,6 +24,8 @@ import {
25
24
  SelectValue,
26
25
  } from '@/components/ui/select';
27
26
  import { Button } from '@/components/ui/button';
27
+ import { ActionButton } from '@/components/ui/action-button';
28
+ import { Alert, AlertDescription } from '@/components/ui/alert';
28
29
  import { Switch } from '@/components/ui/switch';
29
30
 
30
31
  // ---------------------------------------------------------------------------
@@ -107,7 +108,6 @@ const SkillEditorModal: React.FC<SkillEditorModalProps> = ({
107
108
  skill,
108
109
  onSave,
109
110
  }) => {
110
- const theme = useAppTheme();
111
111
  const { sendRequest } = useWebSocket();
112
112
  const [activeTab, setActiveTab] = React.useState<'details' | 'instructions'>('details');
113
113
  const [submitError, setSubmitError] = React.useState<string | null>(null);
@@ -157,7 +157,7 @@ const SkillEditorModal: React.FC<SkillEditorModalProps> = ({
157
157
  const isExisting = !!form.watch('id');
158
158
  const tabBaseClass =
159
159
  'px-4 py-2 text-sm font-medium border-b-2 border-transparent transition-colors';
160
- const tabActiveClass = 'border-dracula-purple text-foreground';
160
+ const tabActiveClass = 'border-primary text-foreground';
161
161
  const tabInactiveClass = 'text-muted-foreground hover:text-foreground';
162
162
 
163
163
  return (
@@ -382,27 +382,18 @@ const SkillEditorModal: React.FC<SkillEditorModalProps> = ({
382
382
  </div>
383
383
 
384
384
  {submitError && (
385
- <div
386
- className="border-t border-border bg-dracula-red/15 px-4 py-3 text-sm text-dracula-red"
387
- >
388
- {submitError}
389
- </div>
385
+ <Alert variant="destructive" className="rounded-none border-x-0 border-b-0">
386
+ <AlertDescription>{submitError}</AlertDescription>
387
+ </Alert>
390
388
  )}
391
389
 
392
- <div
393
- className="flex justify-end gap-3 border-t border-border bg-card px-4 py-3"
394
- style={{ backgroundColor: theme.colors.backgroundPanel }}
395
- >
390
+ <div className="flex justify-end gap-3 border-t border-border bg-card px-4 py-3">
396
391
  <Button type="button" variant="outline" onClick={onClose}>
397
392
  Cancel
398
393
  </Button>
399
- <Button
400
- type="submit"
401
- disabled={isSaving}
402
- className="bg-dracula-purple text-white hover:bg-dracula-purple/90"
403
- >
394
+ <ActionButton intent="save" type="submit" disabled={isSaving}>
404
395
  {isSaving ? 'Saving...' : isExisting ? 'Update Skill' : 'Create Skill'}
405
- </Button>
396
+ </ActionButton>
406
397
  </div>
407
398
  </form>
408
399
  </Form>