machinaos 0.0.78 → 0.0.80

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 (743) hide show
  1. package/.env.template +74 -5
  2. package/{workflows/AI Assistant_workflow-1778504793388-ou1m1tz2x.json → .machina/workflows/AI Assistant_example_workflow-1779017037684-e2e5da7a.json } +164 -105
  3. package/{workflows/AI Employee_example_workflow-1777720598005-u4cm858dv.json → .machina/workflows/AI Employee_example_workflow-1779102911870-cbc76c82.json } +582 -328
  4. package/{workflows/Claude Assistant_workflow-1778380124051-mdibn807c.json → .machina/workflows/Claude Assistant_example_workflow-1779095939967-2369cff4.json } +152 -83
  5. package/README.md +5 -2
  6. package/bin/cli.js +2 -2
  7. package/{machina → cli}/__main__.py +11 -7
  8. package/cli/_common.py +122 -0
  9. package/cli/buildenv.py +40 -0
  10. package/cli/cli.py +204 -0
  11. package/{machina → cli}/colors.py +10 -2
  12. package/cli/commands/__init__.py +1 -0
  13. package/cli/commands/_temporal_specs.py +59 -0
  14. package/{machina → cli}/commands/build.py +35 -45
  15. package/cli/commands/clean.py +141 -0
  16. package/cli/commands/daemon/__init__.py +47 -0
  17. package/cli/commands/daemon/_state.py +97 -0
  18. package/cli/commands/daemon/restart.py +14 -0
  19. package/cli/commands/daemon/start.py +49 -0
  20. package/cli/commands/daemon/status.py +20 -0
  21. package/cli/commands/daemon/stop.py +22 -0
  22. package/{machina → cli}/commands/dev.py +32 -42
  23. package/{machina → cli}/commands/docs.py +13 -11
  24. package/{machina → cli}/commands/start.py +69 -62
  25. package/{machina → cli}/commands/stop.py +7 -10
  26. package/{machina → cli}/commands/version.py +12 -6
  27. package/cli/config.py +170 -0
  28. package/cli/platform_.py +169 -0
  29. package/{machina → cli}/ports.py +42 -3
  30. package/{machina → cli}/run.py +29 -2
  31. package/{machina → cli}/supervisor.py +29 -12
  32. package/{machina → cli}/tcp.py +6 -2
  33. package/{machina → cli}/tree.py +38 -11
  34. package/client/dist/assets/{ActionBar-Du2MSFSz.js → ActionBar-Cjr3TF7g.js} +1 -1
  35. package/client/dist/assets/{ApiKeyInput-k2LBmBjb.js → ApiKeyInput-DIJE2PVA.js} +1 -1
  36. package/client/dist/assets/{ApiKeyPanel-C_bV9U0X.js → ApiKeyPanel-CPmye7uh.js} +1 -1
  37. package/client/dist/assets/{ApiUsageSection-CmVfwZzL.js → ApiUsageSection-TF_7gH2D.js} +1 -1
  38. package/client/dist/assets/{EmailPanel-CeKIMGu-.js → EmailPanel-Bs-xvbKR.js} +1 -1
  39. package/client/dist/assets/{OAuthPanel-KA3t3Q2K.js → OAuthPanel-BDtVJhAV.js} +1 -1
  40. package/client/dist/assets/{QrPairingPanel-NgNpJNuk.js → QrPairingPanel-BwJehTuZ.js} +1 -1
  41. package/client/dist/assets/{RateLimitSection-Du5YNVIA.js → RateLimitSection-CfNOoPIS.js} +1 -1
  42. package/client/dist/assets/{StatusCard-DNLyayXc.js → StatusCard-DkwIrgdP.js} +1 -1
  43. package/client/dist/assets/index-P2FzntoL.js +165 -0
  44. package/client/dist/index.html +1 -1
  45. package/client/package.json +1 -1
  46. package/client/src/Dashboard.tsx +128 -76
  47. package/client/src/adapters/nodeSpecToDescription.ts +7 -0
  48. package/client/src/assets/icons/index.test.ts +10 -0
  49. package/client/src/assets/icons/index.ts +16 -3
  50. package/client/src/components/AIAgentNode.tsx +8 -8
  51. package/client/src/components/ParameterRenderer.tsx +6 -3
  52. package/client/src/components/SkillEditorModal.tsx +1 -0
  53. package/client/src/components/credentials/panels/EmailPanel.tsx +2 -0
  54. package/client/src/components/credentials/sections/ProviderDefaultsSection.tsx +2 -0
  55. package/client/src/components/credentials/sections/RateLimitSection.tsx +1 -0
  56. package/client/src/components/icons/AIProviderIcons.tsx +1 -0
  57. package/client/src/components/maps/GoogleMapsPicker.tsx +1 -0
  58. package/client/src/components/parameterPanel/InputSection.tsx +1 -0
  59. package/client/src/components/parameterPanel/MasterSkillEditor.tsx +1 -0
  60. package/client/src/components/parameterPanel/OutputSection.tsx +1 -0
  61. package/client/src/components/ui/ComponentPalette.tsx +1 -0
  62. package/client/src/components/ui/MapSelector.tsx +1 -0
  63. package/client/src/components/ui/NodeContextMenu.tsx +3 -3
  64. package/client/src/components/ui/SettingsPanel.tsx +1 -0
  65. package/client/src/components/ui/action-button.tsx +1 -0
  66. package/client/src/components/ui/badge.tsx +1 -0
  67. package/client/src/components/ui/button.tsx +1 -0
  68. package/client/src/components/ui/form.tsx +1 -0
  69. package/client/src/components/ui/tabs.tsx +1 -0
  70. package/client/src/contexts/AuthContext.tsx +1 -0
  71. package/client/src/contexts/ThemeContext.tsx +1 -0
  72. package/client/src/contexts/WebSocketContext.tsx +104 -34
  73. package/client/src/hooks/__tests__/useApiKeys.test.ts +2 -2
  74. package/client/src/hooks/useReactFlowNodes.ts +1 -0
  75. package/client/src/hooks/useWorkflowValidation.ts +142 -0
  76. package/client/src/lib/nodeSpec.ts +1 -0
  77. package/client/src/test/providers.tsx +1 -0
  78. package/client/src/types/__tests__/cloudEvents.test.ts +5 -2
  79. package/client/src/types/cloudEvents.ts +19 -7
  80. package/client/src/utils/nodeUtils.ts +1 -1
  81. package/client/src/utils/workflow.ts +8 -2
  82. package/client/src/utils/workflowExport.ts +60 -3
  83. package/package.json +24 -23
  84. package/scripts/install.js +16 -27
  85. package/scripts/migrate_icons.py +3 -1
  86. package/scripts/migrate_skill_icons.py +6 -7
  87. package/scripts/postinstall.js +11 -9
  88. package/server/config/ai_cli_providers.json +2 -3
  89. package/server/config/credential_providers.json +15 -15
  90. package/server/config/llm_defaults.json +1 -1
  91. package/server/config/model_registry.json +416 -611
  92. package/server/constants.py +285 -223
  93. package/server/core/__init__.py +1 -1
  94. package/server/core/cache.py +9 -29
  95. package/server/core/cleanup.py +12 -24
  96. package/server/core/config.py +148 -24
  97. package/server/core/container.py +68 -59
  98. package/server/core/credential_backends.py +5 -13
  99. package/server/core/credentials_database.py +13 -43
  100. package/server/core/database.py +292 -353
  101. package/server/core/health.py +4 -5
  102. package/server/core/logging.py +241 -87
  103. package/server/core/paths.py +285 -0
  104. package/server/core/tracing.py +2 -8
  105. package/server/gunicorn.conf.py +1 -0
  106. package/server/main.py +150 -74
  107. package/server/middleware/auth.py +18 -24
  108. package/server/models/__init__.py +1 -1
  109. package/server/models/auth.py +5 -12
  110. package/server/models/database.py +36 -68
  111. package/server/models/node_metadata.py +25 -18
  112. package/server/nodejs/dist/index.js +107 -0
  113. package/server/nodes/README.md +11 -5
  114. package/server/nodes/__init__.py +1 -1
  115. package/server/nodes/_visuals.py +146 -14
  116. package/server/nodes/agent/_events.py +124 -0
  117. package/server/nodes/agent/_handles.py +15 -29
  118. package/server/nodes/agent/_inline.py +28 -25
  119. package/server/nodes/agent/_specialized.py +30 -15
  120. package/server/nodes/agent/{ai_agent.py → ai_agent/__init__.py} +33 -17
  121. package/server/nodes/agent/ai_agent/meta.json +3 -0
  122. package/server/nodes/agent/{ai_employee.py → ai_employee/__init__.py} +5 -2
  123. package/server/nodes/agent/ai_employee/meta.json +3 -0
  124. package/server/nodes/agent/{android_agent.py → android_agent/__init__.py} +1 -1
  125. package/server/nodes/agent/android_agent/meta.json +3 -0
  126. package/server/nodes/agent/{autonomous_agent.py → autonomous_agent/__init__.py} +2 -1
  127. package/server/nodes/agent/autonomous_agent/meta.json +3 -0
  128. package/server/nodes/agent/{chat_agent.py → chat_agent/__init__.py} +29 -12
  129. package/server/nodes/agent/chat_agent/meta.json +3 -0
  130. package/server/nodes/agent/{claude_code_agent.py → claude_code_agent/__init__.py} +192 -95
  131. package/server/nodes/agent/claude_code_agent/_handlers.py +169 -0
  132. package/server/{services/claude_oauth.py → nodes/agent/claude_code_agent/_oauth.py} +26 -13
  133. package/server/nodes/agent/claude_code_agent/_pool.py +1020 -0
  134. package/server/nodes/agent/claude_code_agent/_provider.py +513 -0
  135. package/server/nodes/agent/claude_code_agent/_skills.py +245 -0
  136. package/server/nodes/agent/claude_code_agent/meta.json +3 -0
  137. package/server/nodes/agent/{codex_agent.py → codex_agent/__init__.py} +26 -35
  138. package/server/nodes/agent/codex_agent/meta.json +3 -0
  139. package/server/nodes/agent/{coding_agent.py → coding_agent/__init__.py} +1 -1
  140. package/server/nodes/agent/coding_agent/meta.json +3 -0
  141. package/server/nodes/agent/{consumer_agent.py → consumer_agent/__init__.py} +1 -1
  142. package/server/nodes/agent/consumer_agent/meta.json +3 -0
  143. package/server/nodes/agent/{orchestrator_agent.py → orchestrator_agent/__init__.py} +5 -2
  144. package/server/nodes/agent/orchestrator_agent/meta.json +3 -0
  145. package/server/nodes/agent/{payments_agent.py → payments_agent/__init__.py} +1 -1
  146. package/server/nodes/agent/payments_agent/meta.json +3 -0
  147. package/server/nodes/agent/{productivity_agent.py → productivity_agent/__init__.py} +1 -1
  148. package/server/nodes/agent/productivity_agent/meta.json +3 -0
  149. package/server/nodes/agent/{rlm_agent.py → rlm_agent/__init__.py} +18 -17
  150. package/server/nodes/agent/rlm_agent/meta.json +3 -0
  151. package/server/nodes/agent/{social_agent.py → social_agent/__init__.py} +1 -1
  152. package/server/nodes/agent/social_agent/meta.json +3 -0
  153. package/server/nodes/agent/{task_agent.py → task_agent/__init__.py} +1 -1
  154. package/server/nodes/agent/task_agent/meta.json +3 -0
  155. package/server/nodes/agent/{tool_agent.py → tool_agent/__init__.py} +1 -1
  156. package/server/nodes/agent/tool_agent/meta.json +3 -0
  157. package/server/nodes/agent/{travel_agent.py → travel_agent/__init__.py} +1 -1
  158. package/server/nodes/agent/travel_agent/meta.json +3 -0
  159. package/server/nodes/agent/{web_agent.py → web_agent/__init__.py} +1 -1
  160. package/server/nodes/agent/web_agent/meta.json +3 -0
  161. package/server/nodes/android/__init__.py +24 -0
  162. package/server/nodes/android/_base.py +93 -76
  163. package/server/nodes/android/_dispatcher.py +140 -223
  164. package/server/nodes/android/_events.py +154 -0
  165. package/server/nodes/android/_handlers.py +13 -7
  166. package/server/nodes/android/_option_loaders.py +1 -4
  167. package/server/nodes/android/_refresh.py +27 -37
  168. package/server/nodes/android/_relay/broadcaster.py +25 -41
  169. package/server/nodes/android/_relay/client.py +23 -42
  170. package/server/nodes/android/_relay/manager.py +1 -0
  171. package/server/nodes/android/_relay/protocol.py +6 -0
  172. package/server/nodes/android/_router.py +48 -133
  173. package/server/nodes/android/{airplane_mode_control.py → airplane_mode_control/__init__.py} +2 -1
  174. package/server/nodes/android/airplane_mode_control/meta.json +3 -0
  175. package/server/nodes/android/{app_launcher.py → app_launcher/__init__.py} +2 -1
  176. package/server/nodes/android/app_launcher/meta.json +3 -0
  177. package/server/nodes/android/{app_list.py → app_list/__init__.py} +2 -1
  178. package/server/nodes/android/app_list/meta.json +3 -0
  179. package/server/nodes/android/{audio_automation.py → audio_automation/__init__.py} +2 -1
  180. package/server/nodes/android/audio_automation/meta.json +3 -0
  181. package/server/nodes/android/{battery_monitor.py → battery_monitor/__init__.py} +2 -1
  182. package/server/nodes/android/battery_monitor/meta.json +3 -0
  183. package/server/nodes/android/{bluetooth_automation.py → bluetooth_automation/__init__.py} +2 -1
  184. package/server/nodes/android/bluetooth_automation/meta.json +3 -0
  185. package/server/nodes/android/{camera_control.py → camera_control/__init__.py} +2 -1
  186. package/server/nodes/android/camera_control/meta.json +3 -0
  187. package/server/nodes/android/{device_state_automation.py → device_state_automation/__init__.py} +2 -1
  188. package/server/nodes/android/device_state_automation/meta.json +3 -0
  189. package/server/nodes/android/{environmental_sensors.py → environmental_sensors/__init__.py} +2 -1
  190. package/server/nodes/android/environmental_sensors/meta.json +3 -0
  191. package/server/nodes/android/{location.py → location/__init__.py} +2 -1
  192. package/server/nodes/android/location/meta.json +3 -0
  193. package/server/nodes/android/{media_control.py → media_control/__init__.py} +2 -1
  194. package/server/nodes/android/media_control/meta.json +3 -0
  195. package/server/nodes/android/{motion_detection.py → motion_detection/__init__.py} +2 -1
  196. package/server/nodes/android/motion_detection/meta.json +3 -0
  197. package/server/nodes/android/{network_monitor.py → network_monitor/__init__.py} +2 -1
  198. package/server/nodes/android/network_monitor/meta.json +3 -0
  199. package/server/nodes/android/{screen_control_automation.py → screen_control_automation/__init__.py} +2 -1
  200. package/server/nodes/android/screen_control_automation/meta.json +3 -0
  201. package/server/nodes/android/{system_info.py → system_info/__init__.py} +2 -1
  202. package/server/nodes/android/system_info/meta.json +3 -0
  203. package/server/nodes/android/{wifi_automation.py → wifi_automation/__init__.py} +2 -1
  204. package/server/nodes/android/wifi_automation/meta.json +3 -0
  205. package/server/nodes/browser/__init__.py +22 -1
  206. package/server/nodes/browser/_install.py +63 -0
  207. package/server/nodes/browser/_service.py +21 -25
  208. package/server/nodes/browser/{browser.py → browser/__init__.py} +58 -25
  209. package/server/nodes/browser/browser/meta.json +3 -0
  210. package/server/nodes/chat/{chat_history.py → chat_history/__init__.py} +2 -4
  211. package/server/nodes/chat/chat_history/meta.json +3 -0
  212. package/server/nodes/chat/{chat_send.py → chat_send/__init__.py} +2 -4
  213. package/server/nodes/chat/chat_send/icon.svg +1 -0
  214. package/server/nodes/chat/chat_send/meta.json +3 -0
  215. package/server/nodes/code/_base.py +1 -1
  216. package/server/nodes/code/{javascript_executor.py → javascript_executor/__init__.py} +5 -5
  217. package/server/nodes/code/javascript_executor/meta.json +3 -0
  218. package/server/nodes/code/{python_executor.py → python_executor/__init__.py} +32 -14
  219. package/server/nodes/code/python_executor/meta.json +3 -0
  220. package/server/nodes/code/{typescript_executor.py → typescript_executor/__init__.py} +5 -5
  221. package/server/nodes/code/typescript_executor/meta.json +3 -0
  222. package/server/nodes/document/{document_parser.py → document_parser/__init__.py} +26 -15
  223. package/server/nodes/document/document_parser/meta.json +3 -0
  224. package/server/nodes/document/{embedding_generator.py → embedding_generator/__init__.py} +16 -9
  225. package/server/nodes/document/embedding_generator/meta.json +3 -0
  226. package/server/nodes/document/{file_downloader.py → file_downloader/__init__.py} +30 -20
  227. package/server/nodes/document/file_downloader/meta.json +3 -0
  228. package/server/nodes/document/{http_scraper.py → http_scraper/__init__.py} +31 -21
  229. package/server/nodes/document/http_scraper/meta.json +3 -0
  230. package/server/nodes/document/{text_chunker.py → text_chunker/__init__.py} +17 -12
  231. package/server/nodes/document/text_chunker/meta.json +3 -0
  232. package/server/nodes/document/{vector_store.py → vector_store/__init__.py} +88 -72
  233. package/server/nodes/document/vector_store/meta.json +3 -0
  234. package/server/nodes/email/__init__.py +9 -2
  235. package/server/nodes/email/_events.py +54 -0
  236. package/server/nodes/email/_filters.py +3 -3
  237. package/server/nodes/email/_himalaya.py +95 -50
  238. package/server/nodes/email/_service.py +23 -13
  239. package/server/nodes/email/{email_read.py → email_read/__init__.py} +23 -11
  240. package/server/nodes/email/email_read/icon.svg +6 -0
  241. package/server/nodes/email/email_read/meta.json +3 -0
  242. package/server/nodes/email/{email_receive.py → email_receive/__init__.py} +45 -23
  243. package/server/nodes/email/email_receive/meta.json +3 -0
  244. package/server/nodes/email/{email_send.py → email_send/__init__.py} +13 -7
  245. package/server/nodes/email/email_send/meta.json +3 -0
  246. package/server/nodes/filesystem/_backend.py +1 -5
  247. package/server/nodes/filesystem/{file_modify.py → file_modify/__init__.py} +10 -5
  248. package/server/nodes/filesystem/file_modify/meta.json +3 -0
  249. package/server/nodes/filesystem/{file_read.py → file_read/__init__.py} +7 -3
  250. package/server/nodes/filesystem/file_read/meta.json +3 -0
  251. package/server/nodes/filesystem/{fs_search.py → fs_search/__init__.py} +11 -3
  252. package/server/nodes/filesystem/fs_search/meta.json +3 -0
  253. package/server/nodes/filesystem/{shell.py → shell/__init__.py} +12 -5
  254. package/server/nodes/filesystem/shell/meta.json +3 -0
  255. package/server/nodes/google/__init__.py +12 -0
  256. package/server/nodes/google/_auth_helper.py +7 -13
  257. package/server/nodes/google/_base.py +14 -11
  258. package/server/nodes/google/_credentials.py +2 -1
  259. package/server/nodes/google/_events.py +47 -0
  260. package/server/nodes/google/_filters.py +3 -3
  261. package/server/nodes/google/_gmail.py +70 -47
  262. package/server/nodes/google/_handlers.py +3 -1
  263. package/server/nodes/google/_oauth.py +25 -11
  264. package/server/nodes/google/_option_loaders.py +9 -30
  265. package/server/nodes/google/_refresh.py +8 -12
  266. package/server/nodes/google/_router.py +4 -5
  267. package/server/nodes/google/{calendar.py → calendar/__init__.py} +87 -64
  268. package/server/nodes/google/calendar/meta.json +3 -0
  269. package/server/nodes/google/{contacts.py → contacts/__init__.py} +84 -72
  270. package/server/nodes/google/contacts/meta.json +3 -0
  271. package/server/nodes/google/{drive.py → drive/__init__.py} +87 -72
  272. package/server/nodes/google/drive/meta.json +3 -0
  273. package/server/nodes/google/{gmail.py → gmail/__init__.py} +73 -39
  274. package/server/nodes/google/gmail/meta.json +3 -0
  275. package/server/nodes/google/{gmail_receive.py → gmail_receive/__init__.py} +31 -24
  276. package/server/nodes/google/gmail_receive/icon.svg +7 -0
  277. package/server/nodes/google/gmail_receive/meta.json +3 -0
  278. package/server/nodes/google/google.svg +7 -0
  279. package/server/nodes/google/{sheets.py → sheets/__init__.py} +54 -42
  280. package/server/nodes/google/sheets/meta.json +3 -0
  281. package/server/nodes/google/{tasks.py → tasks/__init__.py} +56 -43
  282. package/server/nodes/google/tasks/meta.json +3 -0
  283. package/server/nodes/groups.py +28 -28
  284. package/server/nodes/location/__init__.py +31 -1
  285. package/server/nodes/location/_credentials.py +1 -6
  286. package/server/nodes/location/_service.py +88 -107
  287. package/server/nodes/location/{gmaps_create.py → gmaps_create/__init__.py} +6 -6
  288. package/server/nodes/location/gmaps_create/meta.json +3 -0
  289. package/server/nodes/location/{gmaps_locations.py → gmaps_locations/__init__.py} +8 -6
  290. package/server/nodes/location/gmaps_locations/meta.json +3 -0
  291. package/server/nodes/location/{gmaps_nearby_places.py → gmaps_nearby_places/__init__.py} +8 -6
  292. package/server/nodes/location/gmaps_nearby_places/meta.json +3 -0
  293. package/server/nodes/model/_base.py +10 -7
  294. package/server/nodes/model/_credentials.py +10 -10
  295. package/server/nodes/model/_local_validator.py +28 -24
  296. package/server/nodes/model/{anthropic_chat_model.py → anthropic_chat_model/__init__.py} +5 -3
  297. package/server/nodes/model/anthropic_chat_model/meta.json +3 -0
  298. package/server/nodes/model/{cerebras_chat_model.py → cerebras_chat_model/__init__.py} +5 -3
  299. package/server/nodes/model/cerebras_chat_model/meta.json +3 -0
  300. package/server/nodes/model/{deepseek_chat_model.py → deepseek_chat_model/__init__.py} +8 -4
  301. package/server/nodes/model/deepseek_chat_model/meta.json +3 -0
  302. package/server/nodes/model/{gemini_chat_model.py → gemini_chat_model/__init__.py} +5 -3
  303. package/server/nodes/model/gemini_chat_model/meta.json +3 -0
  304. package/server/nodes/model/{groq_chat_model.py → groq_chat_model/__init__.py} +2 -2
  305. package/server/nodes/model/groq_chat_model/meta.json +3 -0
  306. package/server/nodes/model/{kimi_chat_model.py → kimi_chat_model/__init__.py} +2 -2
  307. package/server/nodes/model/kimi_chat_model/meta.json +3 -0
  308. package/server/nodes/model/{lmstudio_chat_model.py → lmstudio_chat_model/__init__.py} +2 -2
  309. package/server/nodes/model/lmstudio_chat_model/meta.json +3 -0
  310. package/server/nodes/model/{mistral_chat_model.py → mistral_chat_model/__init__.py} +2 -2
  311. package/server/nodes/model/mistral_chat_model/meta.json +3 -0
  312. package/server/nodes/model/{ollama_chat_model.py → ollama_chat_model/__init__.py} +2 -2
  313. package/server/nodes/model/ollama_chat_model/meta.json +3 -0
  314. package/server/nodes/model/{openai_chat_model.py → openai_chat_model/__init__.py} +8 -4
  315. package/server/nodes/model/openai_chat_model/meta.json +3 -0
  316. package/server/nodes/model/{openrouter_chat_model.py → openrouter_chat_model/__init__.py} +8 -4
  317. package/server/nodes/model/openrouter_chat_model/meta.json +3 -0
  318. package/server/nodes/proxy/_usage.py +14 -15
  319. package/server/nodes/proxy/{proxy_config.py → proxy_config/__init__.py} +39 -30
  320. package/server/nodes/proxy/proxy_config/meta.json +3 -0
  321. package/server/nodes/proxy/{proxy_request.py → proxy_request/__init__.py} +30 -16
  322. package/server/nodes/proxy/proxy_request/meta.json +3 -0
  323. package/server/nodes/proxy/{proxy_status.py → proxy_status/__init__.py} +2 -0
  324. package/server/nodes/proxy/proxy_status/meta.json +3 -0
  325. package/server/nodes/scheduler/{cron_scheduler.py → cron_scheduler/__init__.py} +96 -23
  326. package/server/nodes/scheduler/cron_scheduler/_workflow.py +155 -0
  327. package/server/nodes/scheduler/cron_scheduler/meta.json +3 -0
  328. package/server/nodes/scheduler/{timer.py → timer/__init__.py} +6 -5
  329. package/server/nodes/scheduler/timer/meta.json +3 -0
  330. package/server/nodes/scraper/_credentials.py +0 -1
  331. package/server/nodes/scraper/{apify_actor.py → apify_actor/__init__.py} +44 -35
  332. package/server/nodes/scraper/apify_actor/icon.svg +5 -0
  333. package/server/nodes/scraper/apify_actor/meta.json +3 -0
  334. package/server/nodes/scraper/{crawlee_scraper.py → crawlee_scraper/__init__.py} +96 -57
  335. package/server/nodes/scraper/crawlee_scraper/meta.json +3 -0
  336. package/server/nodes/search/{brave_search.py → brave_search/__init__.py} +6 -5
  337. package/server/nodes/search/brave_search/icon.svg +3 -0
  338. package/server/nodes/search/brave_search/meta.json +3 -0
  339. package/server/nodes/search/{duckduckgo_search.py → duckduckgo_search/__init__.py} +17 -6
  340. package/server/nodes/search/duckduckgo_search/meta.json +3 -0
  341. package/server/nodes/search/{perplexity_search.py → perplexity_search/__init__.py} +4 -5
  342. package/server/nodes/search/perplexity_search/icon.svg +3 -0
  343. package/server/nodes/search/perplexity_search/meta.json +3 -0
  344. package/server/nodes/search/{serper_search.py → serper_search/__init__.py} +32 -25
  345. package/server/nodes/search/serper_search/icon.svg +3 -0
  346. package/server/nodes/search/serper_search/meta.json +3 -0
  347. package/server/nodes/skill/__init__.py +21 -1
  348. package/server/nodes/skill/_expander.py +75 -0
  349. package/server/nodes/skill/{master_skill.py → master_skill/__init__.py} +2 -8
  350. package/server/nodes/skill/master_skill/_events.py +84 -0
  351. package/server/nodes/skill/master_skill/meta.json +3 -0
  352. package/server/nodes/skill/{simple_memory.py → simple_memory/__init__.py} +8 -16
  353. package/server/nodes/skill/simple_memory/meta.json +3 -0
  354. package/server/nodes/social/_base.py +223 -231
  355. package/server/nodes/social/{social_receive.py → social_receive/__init__.py} +38 -13
  356. package/server/nodes/social/social_receive/meta.json +3 -0
  357. package/server/nodes/social/{social_send.py → social_send/__init__.py} +71 -29
  358. package/server/nodes/social/social_send/icon.svg +1 -0
  359. package/server/nodes/social/social_send/meta.json +3 -0
  360. package/server/nodes/stripe/__init__.py +7 -3
  361. package/server/nodes/stripe/_credentials.py +0 -1
  362. package/server/nodes/stripe/_handlers.py +18 -7
  363. package/server/nodes/stripe/_install.py +14 -15
  364. package/server/nodes/stripe/_source.py +5 -5
  365. package/server/nodes/stripe/icon.svg +1 -0
  366. package/server/nodes/stripe/meta.json +3 -0
  367. package/server/nodes/stripe/stripe_action.py +4 -4
  368. package/server/nodes/stripe/stripe_receive.py +6 -9
  369. package/server/nodes/telegram/__init__.py +13 -0
  370. package/server/nodes/telegram/_credentials.py +2 -7
  371. package/server/nodes/telegram/_events.py +167 -0
  372. package/server/nodes/telegram/_filters.py +3 -11
  373. package/server/nodes/telegram/_handlers.py +17 -7
  374. package/server/nodes/telegram/_refresh.py +24 -34
  375. package/server/nodes/telegram/_service.py +29 -45
  376. package/server/nodes/telegram/meta.json +3 -0
  377. package/server/nodes/telegram/telegram.svg +3 -0
  378. package/server/nodes/telegram/telegram_receive.py +38 -18
  379. package/server/nodes/telegram/telegram_send.py +21 -19
  380. package/server/nodes/text/{file_handler.py → file_handler/__init__.py} +7 -1
  381. package/server/nodes/text/file_handler/meta.json +3 -0
  382. package/server/nodes/text/{text_generator.py → text_generator/__init__.py} +2 -1
  383. package/server/nodes/text/text_generator/meta.json +3 -0
  384. package/server/nodes/tool/{agent_builder.py → agent_builder/__init__.py} +105 -100
  385. package/server/nodes/tool/agent_builder/_events.py +91 -0
  386. package/server/nodes/tool/agent_builder/meta.json +3 -0
  387. package/server/nodes/tool/{calculator_tool.py → calculator_tool/__init__.py} +19 -7
  388. package/server/nodes/tool/calculator_tool/meta.json +3 -0
  389. package/server/nodes/tool/{current_time_tool.py → current_time_tool/__init__.py} +6 -4
  390. package/server/nodes/tool/current_time_tool/meta.json +3 -0
  391. package/server/nodes/tool/{task_manager.py → task_manager/__init__.py} +17 -18
  392. package/server/nodes/tool/task_manager/meta.json +3 -0
  393. package/server/nodes/tool/{write_todos.py → write_todos/__init__.py} +20 -6
  394. package/server/nodes/tool/write_todos/meta.json +3 -0
  395. package/server/nodes/trigger/{chat_trigger.py → chat_trigger/__init__.py} +11 -7
  396. package/server/nodes/trigger/chat_trigger/_events.py +53 -0
  397. package/server/nodes/trigger/chat_trigger/meta.json +3 -0
  398. package/server/nodes/trigger/{task_trigger.py → task_trigger/__init__.py} +10 -7
  399. package/server/nodes/trigger/task_trigger/meta.json +3 -0
  400. package/server/nodes/trigger/{webhook_trigger.py → webhook_trigger/__init__.py} +10 -7
  401. package/server/nodes/trigger/webhook_trigger/_events.py +54 -0
  402. package/server/nodes/trigger/webhook_trigger/meta.json +3 -0
  403. package/server/nodes/twitter/__init__.py +7 -1
  404. package/server/nodes/twitter/_base.py +86 -61
  405. package/server/nodes/twitter/_credentials.py +7 -5
  406. package/server/nodes/twitter/_events.py +101 -0
  407. package/server/nodes/twitter/_filters.py +9 -9
  408. package/server/nodes/twitter/_handlers.py +3 -1
  409. package/server/nodes/twitter/_oauth.py +1 -2
  410. package/server/nodes/twitter/_refresh.py +8 -12
  411. package/server/nodes/twitter/{twitter_receive.py → twitter_receive/__init__.py} +7 -7
  412. package/server/nodes/twitter/twitter_receive/icon.svg +1 -0
  413. package/server/nodes/twitter/twitter_receive/meta.json +3 -0
  414. package/server/nodes/twitter/{twitter_search.py → twitter_search/__init__.py} +16 -11
  415. package/server/nodes/twitter/twitter_search/icon.svg +1 -0
  416. package/server/nodes/twitter/twitter_search/meta.json +3 -0
  417. package/server/nodes/twitter/{twitter_send.py → twitter_send/__init__.py} +60 -27
  418. package/server/nodes/twitter/twitter_send/icon.svg +1 -0
  419. package/server/nodes/twitter/twitter_send/meta.json +3 -0
  420. package/server/nodes/twitter/{twitter_user.py → twitter_user/__init__.py} +34 -19
  421. package/server/nodes/twitter/twitter_user/icon.svg +1 -0
  422. package/server/nodes/twitter/twitter_user/meta.json +3 -0
  423. package/server/nodes/utility/{console.py → console/__init__.py} +17 -22
  424. package/server/nodes/utility/console/meta.json +3 -0
  425. package/server/nodes/utility/{http_request.py → http_request/__init__.py} +9 -6
  426. package/server/nodes/utility/http_request/meta.json +3 -0
  427. package/server/nodes/utility/{process_manager.py → process_manager/__init__.py} +10 -6
  428. package/server/nodes/utility/process_manager/meta.json +3 -0
  429. package/server/nodes/utility/team_monitor/meta.json +3 -0
  430. package/server/nodes/utility/{webhook_response.py → webhook_response/__init__.py} +12 -7
  431. package/server/nodes/utility/webhook_response/meta.json +3 -0
  432. package/server/nodes/visuals.json +69 -251
  433. package/server/nodes/whatsapp/__init__.py +24 -0
  434. package/server/nodes/whatsapp/_base.py +283 -338
  435. package/server/nodes/whatsapp/_credentials.py +44 -0
  436. package/server/nodes/whatsapp/_events.py +277 -0
  437. package/server/nodes/whatsapp/_filters.py +36 -37
  438. package/server/nodes/whatsapp/_handlers.py +2 -0
  439. package/server/nodes/whatsapp/_option_loaders.py +1 -3
  440. package/server/nodes/whatsapp/_refresh.py +13 -18
  441. package/server/nodes/whatsapp/_runtime.py +9 -6
  442. package/server/nodes/whatsapp/_service.py +89 -152
  443. package/server/nodes/whatsapp/meta.json +3 -0
  444. package/server/nodes/whatsapp/whatsapp_db.py +116 -54
  445. package/server/nodes/whatsapp/whatsapp_receive.py +30 -13
  446. package/server/nodes/whatsapp/whatsapp_send.py +60 -37
  447. package/server/nodes/workflow/{start.py → start/__init__.py} +1 -4
  448. package/server/nodes/workflow/start/meta.json +3 -0
  449. package/server/package-lock.json +3 -3
  450. package/server/package.json +3 -0
  451. package/server/pyproject.toml +39 -10
  452. package/server/requirements.txt +3 -5
  453. package/server/routers/__init__.py +1 -1
  454. package/server/routers/auth.py +16 -56
  455. package/server/routers/database.py +27 -50
  456. package/server/routers/nodejs_compat.py +25 -87
  457. package/server/routers/schemas.py +66 -2
  458. package/server/routers/webhook.py +12 -12
  459. package/server/routers/websocket.py +312 -1716
  460. package/server/routers/workflow.py +28 -53
  461. package/server/scripts/smoke_test_skills.py +178 -0
  462. package/server/services/__init__.py +1 -1
  463. package/server/services/_supervisor/process.py +9 -3
  464. package/server/services/_supervisor/registry.py +3 -3
  465. package/server/services/_supervisor/util.py +1 -1
  466. package/server/services/agent_team.py +15 -43
  467. package/server/services/agent_teams/__init__.py +17 -0
  468. package/server/services/agent_teams/handlers.py +195 -0
  469. package/server/services/ai.py +853 -1108
  470. package/server/services/auth.py +10 -34
  471. package/server/services/chat_client.py +5 -34
  472. package/server/services/circuit_breaker.py +2 -6
  473. package/server/services/cli_agent/__init__.py +28 -4
  474. package/server/services/cli_agent/_cli_auth.py +61 -0
  475. package/server/services/cli_agent/_handlers.py +24 -183
  476. package/server/services/cli_agent/config.py +5 -8
  477. package/server/services/cli_agent/factory.py +168 -22
  478. package/server/services/cli_agent/jsonl_watcher.py +380 -0
  479. package/server/services/cli_agent/lockfile.py +9 -2
  480. package/server/services/cli_agent/mcp_server.py +110 -34
  481. package/server/services/cli_agent/protocol.py +37 -19
  482. package/server/services/cli_agent/providers/__init__.py +8 -4
  483. package/server/services/cli_agent/providers/google_gemini.py +11 -5
  484. package/server/services/cli_agent/providers/openai_codex.py +34 -34
  485. package/server/services/cli_agent/service.py +245 -83
  486. package/server/services/cli_agent/session.py +409 -229
  487. package/server/services/cli_agent/transports/__init__.py +47 -0
  488. package/server/services/cli_agent/transports/base.py +111 -0
  489. package/server/services/cli_agent/transports/posix.py +196 -0
  490. package/server/services/cli_agent/transports/windows.py +189 -0
  491. package/server/services/cli_agent/types.py +45 -18
  492. package/server/services/cli_agent/workflow_tools.py +28 -15
  493. package/server/services/compaction.py +68 -52
  494. package/server/services/credential_registry.py +6 -20
  495. package/server/services/credentials/__init__.py +18 -0
  496. package/server/services/credentials/handlers.py +196 -0
  497. package/server/services/deployment/__init__.py +12 -1
  498. package/server/services/deployment/canary_registry.py +137 -0
  499. package/server/services/deployment/handlers.py +382 -0
  500. package/server/services/deployment/manager.py +653 -163
  501. package/server/services/deployment/poll_registry.py +2 -6
  502. package/server/services/deployment/state.py +2 -0
  503. package/server/services/deployment/triggers.py +87 -93
  504. package/server/services/event_waiter.py +47 -54
  505. package/server/services/events/__init__.py +11 -0
  506. package/server/services/events/admin_handlers.py +368 -0
  507. package/server/services/events/daemon.py +3 -1
  508. package/server/services/events/dispatch.py +188 -0
  509. package/server/services/events/envelope.py +264 -45
  510. package/server/services/events/oauth_lifecycle.py +98 -42
  511. package/server/services/events/triggers.py +3 -13
  512. package/server/services/events/verifiers/hmac_basic.py +1 -1
  513. package/server/services/events/verifiers/standard_webhooks.py +2 -4
  514. package/server/services/events/webhook.py +2 -3
  515. package/server/services/example_loader.py +73 -15
  516. package/server/services/execution/cache.py +36 -76
  517. package/server/services/execution/conditions.py +7 -20
  518. package/server/services/execution/dlq.py +20 -24
  519. package/server/services/execution/executor.py +234 -265
  520. package/server/services/execution/models.py +40 -46
  521. package/server/services/execution/recovery.py +23 -46
  522. package/server/services/handlers/__init__.py +12 -16
  523. package/server/services/handlers/todo.py +3 -6
  524. package/server/services/handlers/tools.py +143 -194
  525. package/server/services/handlers/triggers.py +24 -23
  526. package/server/services/llm/config.py +10 -1
  527. package/server/services/llm/factory.py +16 -4
  528. package/server/services/llm/messages.py +1 -5
  529. package/server/services/llm/protocol.py +9 -1
  530. package/server/services/llm/providers/anthropic.py +23 -12
  531. package/server/services/llm/providers/gemini.py +43 -22
  532. package/server/services/llm/providers/openai.py +14 -6
  533. package/server/services/llm/providers/openrouter.py +6 -1
  534. package/server/services/markdown_formatter.py +1 -2
  535. package/server/services/memory/__init__.py +2 -2
  536. package/server/services/memory/jsonl.py +6 -2
  537. package/server/services/memory/markdown.py +6 -6
  538. package/server/services/memory/state.py +6 -5
  539. package/server/services/memory_store.py +8 -12
  540. package/server/services/model_registry.py +22 -20
  541. package/server/services/node_executor.py +85 -80
  542. package/server/services/node_output_schemas.py +4 -7
  543. package/server/services/node_registry.py +40 -4
  544. package/server/services/node_spec.py +3 -7
  545. package/server/services/nodejs_client.py +4 -14
  546. package/server/services/oauth_utils.py +11 -7
  547. package/server/services/parameter_resolver.py +30 -36
  548. package/server/services/plugin/base.py +321 -38
  549. package/server/services/plugin/connection.py +12 -7
  550. package/server/services/plugin/credential.py +80 -22
  551. package/server/services/plugin/edge_walker.py +128 -105
  552. package/server/services/plugin/identifiers.py +48 -0
  553. package/server/services/plugin/interceptor.py +1 -1
  554. package/server/services/plugin/oauth.py +25 -21
  555. package/server/services/plugin/operation.py +1 -1
  556. package/server/services/plugin/polling.py +151 -26
  557. package/server/services/plugin/registry.py +52 -4
  558. package/server/services/plugin/routing.py +6 -9
  559. package/server/services/plugin/scaling.py +36 -18
  560. package/server/services/plugin/service_factories.py +95 -0
  561. package/server/services/plugin/shutdown_hooks.py +103 -0
  562. package/server/services/plugin/social_provider_registry.py +80 -0
  563. package/server/services/plugin/ws.py +2 -1
  564. package/server/services/pricing.py +26 -40
  565. package/server/services/pricing_handlers.py +90 -0
  566. package/server/services/process_service.py +33 -32
  567. package/server/services/proxy/models.py +15 -9
  568. package/server/services/proxy/service.py +26 -40
  569. package/server/services/rlm/adapters.py +43 -40
  570. package/server/services/rlm/constants.py +9 -9
  571. package/server/services/rlm/service.py +57 -45
  572. package/server/services/scheduler.py +8 -39
  573. package/server/services/settings/__init__.py +16 -0
  574. package/server/services/settings/handlers.py +275 -0
  575. package/server/services/skill_loader.py +53 -45
  576. package/server/services/skill_prompt.py +8 -6
  577. package/server/services/skills/__init__.py +23 -0
  578. package/server/services/skills/handlers.py +479 -0
  579. package/server/services/status_broadcaster.py +314 -291
  580. package/server/services/temporal/__init__.py +22 -1
  581. package/server/services/temporal/_handlers.py +65 -0
  582. package/server/services/temporal/_install.py +158 -0
  583. package/server/services/temporal/_refresh.py +57 -0
  584. package/server/services/temporal/_retry_policies.py +85 -0
  585. package/server/services/temporal/_runtime.py +181 -0
  586. package/server/services/temporal/_supervised_runtime.py +102 -0
  587. package/server/services/temporal/activities.py +168 -11
  588. package/server/services/temporal/agent_activities.py +683 -0
  589. package/server/services/temporal/agent_workflow.py +601 -0
  590. package/server/services/temporal/client.py +58 -13
  591. package/server/services/temporal/executor.py +2 -3
  592. package/server/services/temporal/plugin_activities.py +37 -2
  593. package/server/services/temporal/plugin_registry.py +82 -0
  594. package/server/services/temporal/polling_trigger_workflow.py +267 -0
  595. package/server/services/temporal/schedules.py +220 -0
  596. package/server/services/temporal/search_attributes.py +177 -0
  597. package/server/services/temporal/trigger_listener_workflow.py +378 -0
  598. package/server/services/temporal/worker.py +111 -18
  599. package/server/services/temporal/workflow.py +259 -40
  600. package/server/services/temporal/ws_client.py +22 -11
  601. package/server/services/text.py +14 -28
  602. package/server/services/tracked_http.py +29 -49
  603. package/server/services/user_auth.py +7 -21
  604. package/server/services/workflow.py +28 -20
  605. package/server/services/workflow_import.py +351 -0
  606. package/server/services/workflow_ops.py +4 -0
  607. package/server/services/workflow_storage/__init__.py +18 -0
  608. package/server/services/workflow_storage/handlers.py +132 -0
  609. package/server/services/workflow_validator.py +209 -0
  610. package/server/services/ws_handler_registry.py +80 -9
  611. package/server/skills/assistant/agent-builder-skill/SKILL.md +6 -6
  612. package/server/tests/conftest.py +54 -3
  613. package/server/tests/credentials/test_auth_service.py +9 -21
  614. package/server/tests/credentials/test_credential_broadcasts.py +116 -22
  615. package/server/tests/credentials/test_credentials_database.py +12 -38
  616. package/server/tests/credentials/test_encryption.py +3 -9
  617. package/server/tests/credentials/test_google_oauth.py +1 -3
  618. package/server/tests/credentials/test_oauth_utils.py +31 -38
  619. package/server/tests/credentials/test_twitter_oauth.py +1 -3
  620. package/server/tests/credentials/test_websocket_handlers.py +37 -72
  621. package/server/tests/fixtures/tool_names_snapshot.json +78 -0
  622. package/server/tests/llm/test_factory.py +12 -4
  623. package/server/tests/llm/test_providers.py +25 -32
  624. package/server/tests/llm/test_wiring.py +27 -22
  625. package/server/tests/nodes/_compat.py +4 -5
  626. package/server/tests/nodes/_harness.py +31 -24
  627. package/server/tests/nodes/_mocks.py +2 -6
  628. package/server/tests/nodes/test_agent_builder.py +43 -35
  629. package/server/tests/nodes/test_ai_agents.py +29 -24
  630. package/server/tests/nodes/test_ai_chat_models.py +3 -9
  631. package/server/tests/nodes/test_ai_tools.py +29 -24
  632. package/server/tests/nodes/test_android.py +34 -64
  633. package/server/tests/nodes/test_chat_utility.py +2 -2
  634. package/server/tests/nodes/test_code_fs_process.py +26 -84
  635. package/server/tests/nodes/test_document.py +23 -47
  636. package/server/tests/nodes/test_email.py +88 -51
  637. package/server/tests/nodes/test_google_workspace.py +26 -20
  638. package/server/tests/nodes/test_http_proxy.py +43 -89
  639. package/server/tests/nodes/test_search.py +3 -9
  640. package/server/tests/nodes/test_specialized_agents.py +58 -162
  641. package/server/tests/nodes/test_stripe_plugin.py +25 -5
  642. package/server/tests/nodes/test_telegram_social.py +33 -37
  643. package/server/tests/nodes/test_twitter.py +59 -150
  644. package/server/tests/nodes/test_web_automation.py +21 -51
  645. package/server/tests/nodes/test_whatsapp.py +13 -19
  646. package/server/tests/nodes/test_workflow_triggers.py +16 -45
  647. package/server/tests/services/cli_agent/test_claude_session_events.py +201 -0
  648. package/server/tests/services/cli_agent/test_jsonl_watcher.py +190 -0
  649. package/server/tests/services/cli_agent/test_mcp_server.py +67 -29
  650. package/server/tests/services/cli_agent/test_providers.py +236 -47
  651. package/server/tests/services/cli_agent/test_service.py +9 -7
  652. package/server/tests/services/memory/test_jsonl.py +30 -25
  653. package/server/tests/services/test_events.py +26 -7
  654. package/server/tests/services/test_identifiers.py +122 -0
  655. package/server/tests/services/test_process_lifecycle.py +129 -0
  656. package/server/tests/services/test_supervisor.py +0 -1
  657. package/server/tests/temporal/__init__.py +0 -0
  658. package/server/tests/temporal/test_agent_workflow.py +215 -0
  659. package/server/tests/temporal/test_dispatch.py +231 -0
  660. package/server/tests/test_admin_handlers.py +394 -0
  661. package/server/tests/test_auto_skill.py +4 -2
  662. package/server/tests/test_canary_registry.py +310 -0
  663. package/server/tests/test_chat_trigger_canary_producer.py +101 -0
  664. package/server/tests/test_cloudevents_node_parameters.py +129 -0
  665. package/server/tests/test_credential_icon.py +115 -0
  666. package/server/tests/test_cron_canary.py +511 -0
  667. package/server/tests/test_deployment_canary_listener.py +692 -0
  668. package/server/tests/test_event_framework_phase_a.py +537 -0
  669. package/server/tests/test_no_raw_prints.py +131 -0
  670. package/server/tests/test_node_spec.py +196 -103
  671. package/server/tests/test_parameter_resolver.py +20 -20
  672. package/server/tests/test_plugin_contract.py +76 -49
  673. package/server/tests/test_plugin_helpers.py +0 -1
  674. package/server/tests/test_plugin_self_containment.py +40 -47
  675. package/server/tests/test_polling_trigger_workflow.py +572 -0
  676. package/server/tests/test_retry_policies.py +146 -0
  677. package/server/tests/test_service_factories.py +168 -0
  678. package/server/tests/test_shutdown_hooks.py +199 -0
  679. package/server/tests/test_social_provider_registry.py +177 -0
  680. package/server/tests/test_status_broadcasts.py +214 -63
  681. package/server/tests/test_task_trigger_canary_producer.py +131 -0
  682. package/server/tests/test_telegram_trigger_canary_producer.py +113 -0
  683. package/server/tests/test_tool_registry.py +110 -0
  684. package/server/tests/test_trigger_listener_workflow.py +365 -0
  685. package/server/tests/test_whatsapp_trigger_canary_producer.py +164 -0
  686. package/server/tests/test_workflow_ops.py +1 -3
  687. package/server/tests/test_workflow_validator.py +791 -0
  688. package/server/uv.lock +3539 -0
  689. package/client/dist/assets/index-DQ0nwhec.js +0 -257
  690. package/client/src/assets/icons/apify/index.ts +0 -19
  691. package/client/src/assets/icons/browser/index.ts +0 -17
  692. package/client/src/assets/icons/email/index.ts +0 -22
  693. package/client/src/assets/icons/google/index.ts +0 -34
  694. package/client/src/assets/icons/llm/deepseek.svg +0 -1
  695. package/client/src/assets/icons/llm/index.ts +0 -18
  696. package/client/src/assets/icons/llm/kimi.svg +0 -1
  697. package/client/src/assets/icons/llm/mistral.svg +0 -1
  698. package/client/src/assets/icons/search/index.ts +0 -28
  699. package/client/src/assets/icons/telegram/index.ts +0 -19
  700. package/machina/buildenv.py +0 -44
  701. package/machina/cli.py +0 -55
  702. package/machina/commands/__init__.py +0 -1
  703. package/machina/commands/clean.py +0 -80
  704. package/machina/commands/daemon.py +0 -150
  705. package/machina/config.py +0 -93
  706. package/machina/platform_.py +0 -37
  707. package/machina/pyproject.toml +0 -33
  708. package/server/nodes/agent/deep_agent.py +0 -103
  709. package/server/services/agents/__init__.py +0 -9
  710. package/server/services/agents/adapters.py +0 -199
  711. package/server/services/agents/constants.py +0 -10
  712. package/server/services/agents/service.py +0 -297
  713. package/server/services/cli_agent/providers/anthropic_claude.py +0 -419
  714. /package/{machina → cli}/README.md +0 -0
  715. /package/{machina → cli}/__init__.py +0 -0
  716. /package/{client/src/assets/icons/apify → server/credentials/icons}/apify.svg +0 -0
  717. /package/{client/src/assets/icons/search/brave.svg → server/credentials/icons/brave_search.svg} +0 -0
  718. /package/{client/src/assets/icons/email/read.svg → server/credentials/icons/email_himalaya.svg} +0 -0
  719. /package/{client/src/assets/icons/search → server/credentials/icons}/perplexity.svg +0 -0
  720. /package/{client/src/assets/icons/search/google.svg → server/credentials/icons/serper.svg} +0 -0
  721. /package/{client/src/assets → server/credentials}/icons/stripe.svg +0 -0
  722. /package/{client/src/assets/icons/twitter/x.svg → server/credentials/icons/twitter.svg} +0 -0
  723. /package/{client/src/assets/icons/browser/chrome.svg → server/nodes/browser/browser/icon.svg} +0 -0
  724. /package/{client/src/assets/icons/chat/chat.svg → server/nodes/chat/chat_history/icon.svg} +0 -0
  725. /package/{client/src/assets/icons/code/javascript.svg → server/nodes/code/javascript_executor/icon.svg} +0 -0
  726. /package/{client/src/assets/icons/code/python.svg → server/nodes/code/python_executor/icon.svg} +0 -0
  727. /package/{client/src/assets/icons/code/typescript.svg → server/nodes/code/typescript_executor/icon.svg} +0 -0
  728. /package/{client/src/assets/icons/email/receive.svg → server/nodes/email/email_receive/icon.svg} +0 -0
  729. /package/{client/src/assets/icons/email/send.svg → server/nodes/email/email_send/icon.svg} +0 -0
  730. /package/{client/src/assets/icons/google/calendar.svg → server/nodes/google/calendar/icon.svg} +0 -0
  731. /package/{client/src/assets/icons/google/contacts.svg → server/nodes/google/contacts/icon.svg} +0 -0
  732. /package/{client/src/assets/icons/google/drive.svg → server/nodes/google/drive/icon.svg} +0 -0
  733. /package/{client/src/assets/icons/google/gmail.svg → server/nodes/google/gmail/icon.svg} +0 -0
  734. /package/{client/src/assets/icons/google/sheets.svg → server/nodes/google/sheets/icon.svg} +0 -0
  735. /package/{client/src/assets/icons/google/tasks.svg → server/nodes/google/tasks/icon.svg} +0 -0
  736. /package/{client/src/assets/icons/search/duckduckgo.svg → server/nodes/search/duckduckgo_search/icon.svg} +0 -0
  737. /package/{client/src/assets/icons/social/social.svg → server/nodes/social/social_receive/icon.svg} +0 -0
  738. /package/{client/src/assets/icons/telegram/telegram.svg → server/nodes/telegram/icon.svg} +0 -0
  739. /package/server/nodes/utility/{team_monitor.py → team_monitor/__init__.py} +0 -0
  740. /package/{client/src/assets/icons/whatsapp/whatsapp-db.svg → server/nodes/whatsapp/icon_whatsappDb.svg} +0 -0
  741. /package/{client/src/assets/icons/whatsapp/whatsapp-receive.svg → server/nodes/whatsapp/icon_whatsappReceive.svg} +0 -0
  742. /package/{client/src/assets/icons/whatsapp/whatsapp-send.svg → server/nodes/whatsapp/icon_whatsappSend.svg} +0 -0
  743. /package/{client/src/assets/icons → server/nodes}/whatsapp/whatsapp.svg +0 -0
@@ -0,0 +1,63 @@
1
+ """``agent-browser`` local install — mirrors ``claude_binary_path``.
2
+
3
+ Same pattern as ``nodes/agent/claude_code_agent/_oauth.py``: ``npm
4
+ install <pkg> --prefix <package_dir("browser")/npm>`` on first call,
5
+ return the resolved binary path. No coupling to the workspace
6
+ ``package.json``.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import shutil
12
+ import subprocess
13
+ import sys
14
+ from typing import Optional
15
+
16
+ from core.logging import get_logger
17
+ from core.paths import package_dir
18
+
19
+ logger = get_logger(__name__)
20
+
21
+ _NPM_SPEC = "agent-browser@latest"
22
+
23
+
24
+ def agent_browser_binary_path() -> Optional[str]:
25
+ """Return path to the agent-browser CLI, installing on miss."""
26
+ npm_root = package_dir("browser") / "npm"
27
+ bin_name = "agent-browser.cmd" if sys.platform == "win32" else "agent-browser"
28
+ bin_path = npm_root / "node_modules" / ".bin" / bin_name
29
+
30
+ if bin_path.exists():
31
+ return str(bin_path)
32
+
33
+ npm_cmd = shutil.which("npm")
34
+ if not npm_cmd:
35
+ logger.warning("[browser] npm not on PATH; cannot install %s", _NPM_SPEC)
36
+ return None
37
+
38
+ logger.info("[browser] installing %s into %s", _NPM_SPEC, npm_root)
39
+ npm_root.mkdir(parents=True, exist_ok=True)
40
+ result = subprocess.run(
41
+ [npm_cmd, "install", _NPM_SPEC, "--prefix", str(npm_root), "--no-audit", "--no-fund"],
42
+ capture_output=True,
43
+ text=True,
44
+ )
45
+ if result.returncode != 0 or not bin_path.exists():
46
+ logger.error("[browser] npm install failed: %s", result.stderr.strip())
47
+ return None
48
+
49
+ # Fetch the Chrome-for-Testing runtime (agent-browser's documented
50
+ # post-install step — downloads ~150MB chromium on first use).
51
+ runtime = subprocess.run(
52
+ [str(bin_path), "install"],
53
+ capture_output=True,
54
+ text=True,
55
+ )
56
+ if runtime.returncode != 0:
57
+ logger.warning("[browser] chromium runtime install failed: %s", runtime.stderr.strip())
58
+
59
+ logger.info("[browser] agent-browser installed at %s", bin_path)
60
+ return str(bin_path)
61
+
62
+
63
+ __all__ = ["agent_browser_binary_path"]
@@ -1,23 +1,19 @@
1
1
  """Thin wrapper around agent-browser CLI.
2
2
 
3
- Stateless client — finds the binary via npx, runs commands via subprocess,
4
- parses JSON output. The agent-browser daemon manages its own lifecycle
5
- (auto-starts, persists between commands).
3
+ Stateless client — finds the binary via :mod:`nodes.browser._install`,
4
+ runs commands via subprocess, parses JSON output. The agent-browser
5
+ daemon manages its own lifecycle (auto-starts, persists between
6
+ commands).
6
7
 
7
8
  Invocation strategy
8
9
  -------------------
9
- agent-browser is a pinned project dependency (see package.json). Rather than
10
- locating its shim manually per-platform, we invoke it via ``npx --no-install``:
11
-
12
- [shutil.which("npx"), "--no-install", "agent-browser", ...args]
13
-
14
- This matches the pattern used by ``claude_code_service.py`` and is how npm
15
- intends locally-pinned CLIs to be invoked. npx handles all the
16
- cross-platform concerns (local ``node_modules/.bin/`` resolution, Windows
17
- .CMD vs POSIX shell shim, shebang interpretation) so we don't have to.
18
-
19
- ``--no-install`` makes the call fail loudly if agent-browser isn't in the
20
- lockfile, instead of silently pulling from the registry at runtime.
10
+ agent-browser is a MachinaOs-managed local install (see
11
+ ``nodes/browser/_install.py``) same pattern as Claude Code's
12
+ project-local CLI. The binary lives at
13
+ ``<package_dir("browser")>/npm/node_modules/.bin/agent-browser[.cmd]``
14
+ and is installed via ``npm install agent-browser --prefix <...>`` on
15
+ first use. No dependency on the workspace ``package.json`` /
16
+ ``node_modules`` / pnpm lockfile.
21
17
 
22
18
  All subprocess calls use ``shell=False`` with list argv — Python handles
23
19
  Windows .CMD files natively via ``CreateProcessW``, avoiding the BatBadBut
@@ -26,11 +22,11 @@ Windows .CMD files natively via ``CreateProcessW``, avoiding the BatBadBut
26
22
 
27
23
  import asyncio
28
24
  import json
29
- import shutil
30
25
  import subprocess
31
26
  from typing import Any, Dict, List, Optional
32
27
 
33
28
  from core.logging import get_logger
29
+ from nodes.browser._install import agent_browser_binary_path
34
30
  from services._supervisor.util import kill_tree
35
31
 
36
32
  logger = get_logger(__name__)
@@ -71,7 +67,8 @@ class BrowserService:
71
67
  """
72
68
  argv = [
73
69
  *self._prefix,
74
- "--session", session,
70
+ "--session",
71
+ session,
75
72
  "--json",
76
73
  ]
77
74
  if headed:
@@ -156,16 +153,15 @@ _instance: Optional[BrowserService] = None
156
153
 
157
154
 
158
155
  def _find_agent_browser_cmd() -> Optional[List[str]]:
159
- """Locate agent-browser via npx (pinned to project lockfile).
156
+ """Resolve agent-browser via the local-install helper.
160
157
 
161
- Uses ``npx --no-install`` so the call fails loudly if the package is
162
- missing, rather than silently pulling from the registry at runtime.
163
- Returns None if npx itself is not on PATH (Node.js not installed).
158
+ Calls :func:`nodes.browser._install.agent_browser_binary_path`,
159
+ which installs the npm package into :func:`core.paths.package_dir`
160
+ on first use (mirroring the claude_code_agent precedent). Returns
161
+ None when ``npm`` is unavailable (Node toolchain missing).
164
162
  """
165
- npx = shutil.which("npx")
166
- if not npx:
167
- return None
168
- return [npx, "--no-install", "agent-browser"]
163
+ binary = agent_browser_binary_path()
164
+ return [binary] if binary else None
169
165
 
170
166
 
171
167
  def get_browser_service() -> Optional[BrowserService]:
@@ -18,6 +18,7 @@ from pydantic import BaseModel, ConfigDict, Field
18
18
 
19
19
  from core.logging import get_logger
20
20
  from services.plugin import ActionNode, NodeContext, Operation, TaskQueue
21
+ from services.plugin.base import NodeUserError
21
22
 
22
23
  logger = get_logger(__name__)
23
24
 
@@ -44,6 +45,7 @@ def _find_browser_via_registry(exe_name: str) -> Optional[str]:
44
45
  """
45
46
  try:
46
47
  import winreg
48
+
47
49
  for hive in (winreg.HKEY_LOCAL_MACHINE, winreg.HKEY_CURRENT_USER):
48
50
  try:
49
51
  key = winreg.OpenKey(
@@ -85,13 +87,13 @@ def _resolve_browser(selection: str, custom_path: str) -> Optional[str]:
85
87
  def _req(p: Dict[str, Any], key: str) -> str:
86
88
  v = (p.get(key) or "").strip()
87
89
  if not v:
88
- raise ValueError(f"{key} is required")
90
+ raise NodeUserError(f"{key} is required")
89
91
  return v
90
92
 
91
93
 
92
94
  def _req_sel(s: str) -> str:
93
95
  if not s:
94
- raise ValueError("selector is required")
96
+ raise NodeUserError("selector is required")
95
97
  return s
96
98
 
97
99
 
@@ -151,15 +153,24 @@ class BrowserParams(BaseModel):
151
153
  """
152
154
 
153
155
  operation: Literal[
154
- "navigate", "click", "type", "fill", "screenshot", "snapshot",
155
- "get_text", "get_html", "eval", "wait", "scroll", "select",
156
- "console", "errors", "batch",
156
+ "navigate",
157
+ "click",
158
+ "type",
159
+ "fill",
160
+ "screenshot",
161
+ "snapshot",
162
+ "get_text",
163
+ "get_html",
164
+ "eval",
165
+ "wait",
166
+ "scroll",
167
+ "select",
168
+ "console",
169
+ "errors",
170
+ "batch",
157
171
  ] = Field(
158
172
  default="navigate",
159
- description=(
160
- "Browser operation. Typical flow: navigate -> snapshot -> "
161
- "interact using @eN refs -> snapshot."
162
- ),
173
+ description=("Browser operation. Typical flow: navigate -> snapshot -> " "interact using @eN refs -> snapshot."),
163
174
  )
164
175
 
165
176
  # Operation-scoped fields
@@ -172,9 +183,19 @@ class BrowserParams(BaseModel):
172
183
  default="",
173
184
  description="CSS selector or @eN ref from snapshot.",
174
185
  json_schema_extra={
175
- "displayOptions": {"show": {"operation": [
176
- "click", "type", "fill", "get_text", "get_html", "wait", "select",
177
- ]}},
186
+ "displayOptions": {
187
+ "show": {
188
+ "operation": [
189
+ "click",
190
+ "type",
191
+ "fill",
192
+ "get_text",
193
+ "get_html",
194
+ "wait",
195
+ "select",
196
+ ]
197
+ }
198
+ },
178
199
  },
179
200
  )
180
201
  text: str = Field(
@@ -200,7 +221,9 @@ class BrowserParams(BaseModel):
200
221
  json_schema_extra={"displayOptions": {"show": {"operation": ["scroll"]}}},
201
222
  )
202
223
  amount: int = Field(
203
- default=500, ge=1, le=20000,
224
+ default=500,
225
+ ge=1,
226
+ le=20000,
204
227
  description="Pixels to scroll.",
205
228
  json_schema_extra={"displayOptions": {"show": {"operation": ["scroll"]}}},
206
229
  )
@@ -229,12 +252,17 @@ class BrowserParams(BaseModel):
229
252
  json_schema_extra={"displayOptions": {"show": {"operation": ["screenshot"]}}},
230
253
  )
231
254
  screenshot_quality: int = Field(
232
- default=85, ge=1, le=100,
255
+ default=85,
256
+ ge=1,
257
+ le=100,
233
258
  description="JPEG quality (1-100).",
234
259
  json_schema_extra={
235
- "displayOptions": {"show": {
236
- "operation": ["screenshot"], "screenshot_format": ["jpeg"],
237
- }},
260
+ "displayOptions": {
261
+ "show": {
262
+ "operation": ["screenshot"],
263
+ "screenshot_format": ["jpeg"],
264
+ }
265
+ },
238
266
  },
239
267
  )
240
268
 
@@ -278,11 +306,15 @@ class BrowserParams(BaseModel):
278
306
  description="Proxy URL (e.g. http://user:pass@host:port).",
279
307
  )
280
308
  action_delay: int = Field(
281
- default=0, ge=0, le=60000,
309
+ default=0,
310
+ ge=0,
311
+ le=60000,
282
312
  description="Delay before each action in milliseconds (for stealth).",
283
313
  )
284
314
  timeout: int = Field(
285
- default=30, ge=1, le=600,
315
+ default=30,
316
+ ge=1,
317
+ le=600,
286
318
  description="Per-action timeout in seconds.",
287
319
  )
288
320
 
@@ -304,6 +336,8 @@ class BrowserNode(ActionNode):
304
336
  group = ("browser", "tool")
305
337
  description = "Interactive browser automation via agent-browser CLI"
306
338
  component_kind = "square"
339
+ tool_name = "browser"
340
+ tool_description = "Control a web browser interactively. Use snapshot to see the page (returns accessibility tree with @eN refs). Then click/type/fill with those refs. Workflow: navigate -> snapshot -> interact -> snapshot. Operations: navigate, click, type, fill, screenshot, snapshot, get_text, get_html, eval, wait, scroll, select, batch."
307
341
  handles = (
308
342
  {"name": "input-main", "kind": "input", "position": "left", "label": "Input", "role": "main"},
309
343
  {"name": "output-main", "kind": "output", "position": "right", "label": "Output", "role": "main"},
@@ -317,7 +351,7 @@ class BrowserNode(ActionNode):
317
351
 
318
352
  @Operation("dispatch")
319
353
  async def dispatch(self, ctx: NodeContext, params: BrowserParams) -> BrowserOutput:
320
- from ._service import get_browser_service
354
+ from .._service import get_browser_service
321
355
 
322
356
  svc = get_browser_service()
323
357
  if not svc:
@@ -326,10 +360,7 @@ class BrowserNode(ActionNode):
326
360
  )
327
361
 
328
362
  op = params.operation
329
- session = (
330
- params.session.strip()
331
- or f"machina_{ctx.raw.get('execution_id', 'default')}"
332
- )
363
+ session = params.session.strip() or f"machina_{ctx.raw.get('execution_id', 'default')}"
333
364
  timeout = params.timeout
334
365
  browser_sel = params.browser or "chrome"
335
366
  if browser_sel == "bundled":
@@ -354,7 +385,9 @@ class BrowserNode(ActionNode):
354
385
  if op == "batch":
355
386
  cmds = json.loads(params.commands or "[]")
356
387
  data = await svc.run(
357
- ["batch", "--json"], session, timeout,
388
+ ["batch", "--json"],
389
+ session,
390
+ timeout,
358
391
  stdin=json.dumps(cmds).encode(),
359
392
  **run_kw,
360
393
  )
@@ -0,0 +1,3 @@
1
+ {
2
+ "color": "#ff79c6"
3
+ }
@@ -38,10 +38,8 @@ class ChatHistoryNode(ActionNode):
38
38
  description = "Retrieve chat conversation history"
39
39
  component_kind = "square"
40
40
  handles = (
41
- {"name": "input-main", "kind": "input", "position": "left",
42
- "label": "Input", "role": "main"},
43
- {"name": "output-main", "kind": "output", "position": "right",
44
- "label": "Output", "role": "main"},
41
+ {"name": "input-main", "kind": "input", "position": "left", "label": "Input", "role": "main"},
42
+ {"name": "output-main", "kind": "output", "position": "right", "label": "Output", "role": "main"},
45
43
  )
46
44
  annotations = {"destructive": False, "readonly": True, "open_world": True}
47
45
  task_queue = TaskQueue.DEFAULT
@@ -0,0 +1,3 @@
1
+ {
2
+ "color": "#8be9fd"
3
+ }
@@ -42,10 +42,8 @@ class ChatSendNode(ActionNode):
42
42
  description = "Send messages to chat conversations"
43
43
  component_kind = "square"
44
44
  handles = (
45
- {"name": "input-main", "kind": "input", "position": "left",
46
- "label": "Input", "role": "main"},
47
- {"name": "output-main", "kind": "output", "position": "right",
48
- "label": "Output", "role": "main"},
45
+ {"name": "input-main", "kind": "input", "position": "left", "label": "Input", "role": "main"},
46
+ {"name": "output-main", "kind": "output", "position": "right", "label": "Output", "role": "main"},
49
47
  )
50
48
  annotations = {"destructive": False, "readonly": False, "open_world": True}
51
49
  task_queue = TaskQueue.DEFAULT
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#4A90D9"><path d="M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z"/></svg>
@@ -0,0 +1,3 @@
1
+ {
2
+ "color": "#8be9fd"
3
+ }
@@ -11,7 +11,7 @@ from typing import Any, Optional
11
11
 
12
12
  from pydantic import BaseModel, ConfigDict, Field
13
13
 
14
- from services.plugin import ActionNode, NodeContext, Operation, TaskQueue
14
+ from services.plugin import ActionNode, TaskQueue
15
15
 
16
16
 
17
17
  class CodeExecutorParams(BaseModel):
@@ -6,7 +6,7 @@ from typing import Any
6
6
 
7
7
  from services.plugin import NodeContext, NodeUserError, Operation
8
8
 
9
- from ._base import CodeExecutorBase, CodeExecutorParams
9
+ from .._base import CodeExecutorBase, CodeExecutorParams
10
10
 
11
11
 
12
12
  class JavaScriptExecutorNode(CodeExecutorBase):
@@ -14,6 +14,8 @@ class JavaScriptExecutorNode(CodeExecutorBase):
14
14
  display_name = "JavaScript Executor"
15
15
  subtitle = "Run JS"
16
16
  description = "Execute JavaScript code via persistent Node.js server"
17
+ tool_name = "javascript_code"
18
+ tool_description = "Execute JavaScript code for calculations, data processing, and JSON manipulation. Set output variable with result."
17
19
 
18
20
  @Operation("execute")
19
21
  async def execute_op(self, ctx: NodeContext, params: CodeExecutorParams) -> Any:
@@ -21,7 +23,7 @@ class JavaScriptExecutorNode(CodeExecutorBase):
21
23
  persistent Node.js server via the shared NodeJSClient singleton."""
22
24
  from aiohttp import ClientConnectorError
23
25
 
24
- from ._nodejs import get_nodejs_client
26
+ from .._nodejs import get_nodejs_client
25
27
 
26
28
  if not params.code.strip():
27
29
  raise NodeUserError("No code provided")
@@ -48,9 +50,7 @@ class JavaScriptExecutorNode(CodeExecutorBase):
48
50
  ) from exc
49
51
 
50
52
  if not result.get("success"):
51
- raise NodeUserError(
52
- result.get("error") or "JavaScript executor failed"
53
- )
53
+ raise NodeUserError(result.get("error") or "JavaScript executor failed")
54
54
  return {
55
55
  "output": result.get("output"),
56
56
  "console_output": result.get("console_output", ""),
@@ -0,0 +1,3 @@
1
+ {
2
+ "color": "#ffb86c"
3
+ }
@@ -6,15 +6,13 @@ from typing import Any
6
6
 
7
7
  from services.plugin import NodeContext, NodeUserError, Operation
8
8
 
9
- from ._base import CodeExecutorBase, CodeExecutorParams
9
+ from .._base import CodeExecutorBase, CodeExecutorParams
10
10
 
11
11
 
12
12
  # Names available in the sandbox namespace -- kept here so the
13
13
  # error-handler can list them when the LLM tries `import X` and hits
14
14
  # the "no __import__" wall.
15
- _SANDBOX_NAMES = (
16
- "math, json, datetime, timedelta, re, random, Counter, defaultdict"
17
- )
15
+ _SANDBOX_NAMES = "math, json, datetime, timedelta, re, random, Counter, defaultdict"
18
16
 
19
17
 
20
18
  class PythonExecutorNode(CodeExecutorBase):
@@ -22,6 +20,8 @@ class PythonExecutorNode(CodeExecutorBase):
22
20
  display_name = "Python Executor"
23
21
  subtitle = "Run Python"
24
22
  description = "Execute Python code for calculations, data processing, and automation"
23
+ tool_name = "python_code"
24
+ tool_description = "Execute Python code for calculations, data processing, and automation. Available: math, json, datetime, Counter, defaultdict. Set output variable with result."
25
25
 
26
26
  @Operation("execute")
27
27
  async def execute_op(self, ctx: NodeContext, params: CodeExecutorParams) -> Any:
@@ -52,13 +52,33 @@ class PythonExecutorNode(CodeExecutorBase):
52
52
  print(*args, **kwargs)
53
53
 
54
54
  safe_builtins = {
55
- "abs": abs, "all": all, "any": any, "bool": bool,
56
- "dict": dict, "enumerate": enumerate, "filter": filter,
57
- "float": float, "int": int, "len": len, "list": list,
58
- "map": map, "max": max, "min": min, "print": captured_print,
59
- "range": range, "round": round, "set": set, "sorted": sorted,
60
- "str": str, "sum": sum, "tuple": tuple, "type": type, "zip": zip,
61
- "True": True, "False": False, "None": None,
55
+ "abs": abs,
56
+ "all": all,
57
+ "any": any,
58
+ "bool": bool,
59
+ "dict": dict,
60
+ "enumerate": enumerate,
61
+ "filter": filter,
62
+ "float": float,
63
+ "int": int,
64
+ "len": len,
65
+ "list": list,
66
+ "map": map,
67
+ "max": max,
68
+ "min": min,
69
+ "print": captured_print,
70
+ "range": range,
71
+ "round": round,
72
+ "set": set,
73
+ "sorted": sorted,
74
+ "str": str,
75
+ "sum": sum,
76
+ "tuple": tuple,
77
+ "type": type,
78
+ "zip": zip,
79
+ "True": True,
80
+ "False": False,
81
+ "None": None,
62
82
  # Pre-injected modules — match the documented sandbox contract
63
83
  # (skill docs, CLAUDE.md). No __import__: callers reference these
64
84
  # by name, e.g. ``datetime.datetime.now()`` not ``import datetime``.
@@ -113,9 +133,7 @@ class PythonExecutorNode(CodeExecutorBase):
113
133
 
114
134
  captured = stdout_capture.getvalue()
115
135
  suffix = f"\n\nstdout before error:\n{captured}" if captured else ""
116
- raise NodeUserError(
117
- f"{err_type}{line_info}: {err_msg}{suffix}"
118
- ) from exc
136
+ raise NodeUserError(f"{err_type}{line_info}: {err_msg}{suffix}") from exc
119
137
 
120
138
  return {
121
139
  "output": namespace.get("output"),
@@ -0,0 +1,3 @@
1
+ {
2
+ "color": "#ffb86c"
3
+ }
@@ -6,7 +6,7 @@ from typing import Any
6
6
 
7
7
  from services.plugin import NodeContext, NodeUserError, Operation
8
8
 
9
- from ._base import CodeExecutorBase, CodeExecutorParams
9
+ from .._base import CodeExecutorBase, CodeExecutorParams
10
10
 
11
11
 
12
12
  class TypeScriptExecutorNode(CodeExecutorBase):
@@ -14,13 +14,15 @@ class TypeScriptExecutorNode(CodeExecutorBase):
14
14
  display_name = "TypeScript Executor"
15
15
  subtitle = "Run TS"
16
16
  description = "Execute TypeScript code via persistent Node.js server with type safety"
17
+ tool_name = "typescript_code"
18
+ tool_description = "Execute TypeScript code via persistent Node.js server with type safety. Set output variable with result."
17
19
 
18
20
  @Operation("execute")
19
21
  async def execute_op(self, ctx: NodeContext, params: CodeExecutorParams) -> Any:
20
22
  """Inlined from handlers/code.py (Wave 11.D.2)."""
21
23
  from aiohttp import ClientConnectorError
22
24
 
23
- from ._nodejs import get_nodejs_client
25
+ from .._nodejs import get_nodejs_client
24
26
 
25
27
  if not params.code.strip():
26
28
  raise NodeUserError("No code provided")
@@ -44,9 +46,7 @@ class TypeScriptExecutorNode(CodeExecutorBase):
44
46
  ) from exc
45
47
 
46
48
  if not result.get("success"):
47
- raise NodeUserError(
48
- result.get("error") or "TypeScript executor failed"
49
- )
49
+ raise NodeUserError(result.get("error") or "TypeScript executor failed")
50
50
  return {
51
51
  "output": result.get("output"),
52
52
  "console_output": result.get("console_output", ""),
@@ -0,0 +1,3 @@
1
+ {
2
+ "color": "#ffb86c"
3
+ }
@@ -16,24 +16,28 @@ logger = get_logger(__name__)
16
16
 
17
17
  def _parse_file_sync(path: Path, parser: str) -> str:
18
18
  """Synchronous file parsing — runs in thread pool."""
19
- if parser == 'pypdf':
19
+ if parser == "pypdf":
20
20
  from pypdf import PdfReader
21
- return "\n\n".join(p.extract_text() or '' for p in PdfReader(str(path)).pages)
22
- if parser == 'marker':
21
+
22
+ return "\n\n".join(p.extract_text() or "" for p in PdfReader(str(path)).pages)
23
+ if parser == "marker":
23
24
  from marker.converters.pdf import PdfConverter
24
25
  from marker.models import create_model_dict
26
+
25
27
  converter = PdfConverter(artifact_dict=create_model_dict())
26
28
  result = converter(str(path))
27
- return result.markdown if hasattr(result, 'markdown') else str(result)
28
- if parser == 'unstructured':
29
+ return result.markdown if hasattr(result, "markdown") else str(result)
30
+ if parser == "unstructured":
29
31
  from unstructured.partition.auto import partition
32
+
30
33
  return "\n\n".join(str(el) for el in partition(str(path)))
31
- if parser == 'beautifulsoup':
34
+ if parser == "beautifulsoup":
32
35
  from bs4 import BeautifulSoup
33
- soup = BeautifulSoup(path.read_text(errors='ignore'), 'html.parser')
36
+
37
+ soup = BeautifulSoup(path.read_text(errors="ignore"), "html.parser")
34
38
  for s in soup(["script", "style"]):
35
39
  s.decompose()
36
- return soup.get_text(separator='\n')
40
+ return soup.get_text(separator="\n")
37
41
  raise ValueError(f"Unknown parser: {parser}")
38
42
 
39
43
 
@@ -88,7 +92,7 @@ class DocumentParserNode(ActionNode):
88
92
  parser = params.parser
89
93
  explicit_path = params.file_path
90
94
  input_dir = params.input_dir
91
- file_pattern = params.file_pattern or '*.pdf'
95
+ file_pattern = params.file_pattern or "*.pdf"
92
96
 
93
97
  paths: list[Path] = []
94
98
  if explicit_path:
@@ -103,13 +107,20 @@ class DocumentParserNode(ActionNode):
103
107
  for path in paths:
104
108
  try:
105
109
  content = await asyncio.to_thread(_parse_file_sync, path, parser)
106
- documents.append({
107
- 'source': str(path), 'filename': path.name,
108
- 'content': content, 'length': len(content), 'parser': parser,
109
- })
110
+ documents.append(
111
+ {
112
+ "source": str(path),
113
+ "filename": path.name,
114
+ "content": content,
115
+ "length": len(content),
116
+ "parser": parser,
117
+ }
118
+ )
110
119
  except Exception as e:
111
- failed.append({'file': str(path), 'error': str(e)})
120
+ failed.append({"file": str(path), "error": str(e)})
112
121
 
113
122
  return DocumentParserOutput(
114
- documents=documents, parsed_count=len(documents), failed=failed,
123
+ documents=documents,
124
+ parsed_count=len(documents),
125
+ failed=failed,
115
126
  )
@@ -0,0 +1,3 @@
1
+ {
2
+ "color": "#bd93f9"
3
+ }