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
@@ -18,7 +18,6 @@ from core.logging import get_logger
18
18
  from services.proxy.exceptions import (
19
19
  BudgetExceededError,
20
20
  NoHealthyProviderError,
21
- ProxyConfigError,
22
21
  ProviderError,
23
22
  )
24
23
  from services.proxy.models import (
@@ -86,10 +85,10 @@ class _ProviderRuntime:
86
85
  freshness_score = min(1.0, len(results) / 10)
87
86
 
88
87
  score = (
89
- _WEIGHT_SUCCESS * success_rate +
90
- _WEIGHT_LATENCY * latency_score +
91
- _WEIGHT_COST * cost_score +
92
- _WEIGHT_FRESHNESS * freshness_score
88
+ _WEIGHT_SUCCESS * success_rate
89
+ + _WEIGHT_LATENCY * latency_score
90
+ + _WEIGHT_COST * cost_score
91
+ + _WEIGHT_FRESHNESS * freshness_score
93
92
  )
94
93
  return round(max(0.0, min(1.0, score)), 4)
95
94
 
@@ -154,9 +153,7 @@ class ProxyService:
154
153
 
155
154
  self._initialized = True
156
155
  provider_names = [p.config.name for p in self._providers.values() if p.config.enabled]
157
- logger.info("Proxy service started",
158
- providers=provider_names,
159
- rules=len(self._routing_rules))
156
+ logger.info("Proxy service started", providers=provider_names, rules=len(self._routing_rules))
160
157
 
161
158
  except Exception as e:
162
159
  logger.error("Failed to start proxy service", error=str(e))
@@ -229,9 +226,7 @@ class ProxyService:
229
226
  # None unless a caller hand-passes them via the same
230
227
  # snake_case convention as the rest of the schema.
231
228
  geo = GeoTarget(
232
- country=parameters.get("proxy_country") or
233
- (rule.required_country if rule else None) or
234
- self._settings.proxy_default_country,
229
+ country=parameters.get("proxy_country") or (rule.required_country if rule else None) or self._settings.proxy_default_country,
235
230
  city=parameters.get("proxy_city"),
236
231
  state=parameters.get("proxy_state"),
237
232
  )
@@ -255,10 +250,7 @@ class ProxyService:
255
250
  session_id=session_id,
256
251
  )
257
252
 
258
- logger.debug("Proxy URL generated",
259
- provider=runtime.config.name,
260
- domain=domain,
261
- country=geo.country)
253
+ logger.debug("Proxy URL generated", provider=runtime.config.name, domain=domain, country=geo.country)
262
254
 
263
255
  return proxy_url
264
256
 
@@ -279,7 +271,7 @@ class ProxyService:
279
271
 
280
272
  # Track daily spend
281
273
  if result.bytes_transferred > 0 and runtime.config.cost_per_gb > 0:
282
- gb = result.bytes_transferred / (1024 ** 3)
274
+ gb = result.bytes_transferred / (1024**3)
283
275
  self._daily_spend_usd += gb * runtime.config.cost_per_gb
284
276
 
285
277
  def get_providers(self) -> List[ProviderStats]:
@@ -356,10 +348,7 @@ class ProxyService:
356
348
  "daily_budget_usd": self._settings.proxy_budget_daily_usd,
357
349
  "total_requests": sum(p.total_requests for p in self._providers.values()),
358
350
  "total_bytes": sum(p.total_bytes for p in self._providers.values()),
359
- "providers": {
360
- name: rt.to_stats().model_dump()
361
- for name, rt in self._providers.items()
362
- },
351
+ "providers": {name: rt.to_stats().model_dump() for name, rt in self._providers.items()},
363
352
  }
364
353
 
365
354
  def reset_daily_spend(self) -> None:
@@ -370,8 +359,7 @@ class ProxyService:
370
359
  """Reload provider configs from database (called after tool/UI changes)."""
371
360
  db_providers = await self._database.get_proxy_providers()
372
361
  await self._load_providers(db_providers)
373
- logger.info("Proxy providers reloaded",
374
- count=len(self._providers))
362
+ logger.info("Proxy providers reloaded", count=len(self._providers))
375
363
 
376
364
  async def _load_providers(self, db_providers: list) -> None:
377
365
  """Build _ProviderRuntime instances from database rows."""
@@ -405,8 +393,7 @@ class ProxyService:
405
393
  runtime.username = username
406
394
  runtime.password = password
407
395
  else:
408
- logger.warning("No credentials for proxy provider",
409
- name=config.name)
396
+ logger.warning("No credentials for proxy provider", name=config.name)
410
397
 
411
398
  self._providers[config.name] = runtime
412
399
 
@@ -441,10 +428,7 @@ class ProxyService:
441
428
 
442
429
  def _pick_best_provider(self) -> Optional[_ProviderRuntime]:
443
430
  """Pick the best healthy provider by composite score."""
444
- candidates = [
445
- rt for rt in self._providers.values()
446
- if rt.config.enabled and rt.has_credentials and rt.is_healthy()
447
- ]
431
+ candidates = [rt for rt in self._providers.values() if rt.config.enabled and rt.has_credentials and rt.is_healthy()]
448
432
 
449
433
  if not candidates:
450
434
  return None
@@ -458,18 +442,20 @@ class ProxyService:
458
442
  db_rules = await self._database.get_proxy_routing_rules()
459
443
  self._routing_rules = []
460
444
  for row in db_rules:
461
- self._routing_rules.append(RoutingRule(
462
- id=row.get("id"),
463
- domain_pattern=row["domain_pattern"],
464
- preferred_providers=json.loads(row.get("preferred_providers", "[]")),
465
- required_country=row.get("required_country"),
466
- session_type=SessionType(row.get("session_type", "rotating")),
467
- sticky_duration_seconds=row.get("sticky_duration_seconds", 300),
468
- max_retries=row.get("max_retries", 3),
469
- failover=row.get("failover", True),
470
- min_success_rate=row.get("min_success_rate", 0.7),
471
- priority=row.get("priority", 0),
472
- ))
445
+ self._routing_rules.append(
446
+ RoutingRule(
447
+ id=row.get("id"),
448
+ domain_pattern=row["domain_pattern"],
449
+ preferred_providers=json.loads(row.get("preferred_providers", "[]")),
450
+ required_country=row.get("required_country"),
451
+ session_type=SessionType(row.get("session_type", "rotating")),
452
+ sticky_duration_seconds=row.get("sticky_duration_seconds", 300),
453
+ max_retries=row.get("max_retries", 3),
454
+ failover=row.get("failover", True),
455
+ min_success_rate=row.get("min_success_rate", 0.7),
456
+ priority=row.get("priority", 0),
457
+ )
458
+ )
473
459
  self._routing_rules.sort(key=lambda r: r.priority)
474
460
 
475
461
 
@@ -20,7 +20,7 @@ class BackendAdapter:
20
20
 
21
21
  @staticmethod
22
22
  def adapt(provider: str, model: str, api_key: str) -> Tuple[str, Dict[str, Any]]:
23
- backend = PROVIDER_TO_BACKEND.get(provider, 'openai')
23
+ backend = PROVIDER_TO_BACKEND.get(provider, "openai")
24
24
  kwargs = {"model_name": model, "api_key": api_key}
25
25
  if provider in PROVIDER_BASE_URLS:
26
26
  kwargs["base_url"] = PROVIDER_BASE_URLS[provider]
@@ -37,20 +37,21 @@ class ChatModelExtractor:
37
37
  @staticmethod
38
38
  async def extract(tool_data: Optional[List[Dict[str, Any]]], auth) -> Tuple[List[str], List[Dict]]:
39
39
  from constants import AI_CHAT_MODEL_TYPES
40
+
40
41
  backends, kwargs_list = [], []
41
42
 
42
43
  if not tool_data:
43
44
  return backends, kwargs_list
44
45
 
45
46
  for tool_info in tool_data:
46
- node_type = tool_info.get('node_type', '')
47
+ node_type = tool_info.get("node_type", "")
47
48
  if node_type not in AI_CHAT_MODEL_TYPES:
48
49
  continue
49
50
 
50
- params = tool_info.get('parameters', {})
51
- provider = params.get('provider', '')
52
- model = params.get('model', '')
53
- api_key = params.get('api_key')
51
+ params = tool_info.get("parameters", {})
52
+ provider = params.get("provider", "")
53
+ model = params.get("model", "")
54
+ api_key = params.get("api_key")
54
55
 
55
56
  if not api_key and auth:
56
57
  api_key = await auth.get_api_key(provider)
@@ -77,28 +78,30 @@ class ToolBridgeAdapter:
77
78
 
78
79
  # Brief descriptions for common tool types (used in RLM REPL context)
79
80
  TOOL_DESCRIPTIONS = {
80
- 'calculatorTool': 'Math operations: add, subtract, multiply, divide, power, sqrt, mod, abs. Args: operation, a, b',
81
- 'currentTimeTool': 'Get current date/time. Args: timezone (optional)',
82
- 'duckduckgoSearch': 'Web search via DuckDuckGo. Args: query, max_results (optional)',
83
- 'pythonExecutor': 'Execute Python code. Args: code (must set output variable)',
84
- 'httpRequest': 'HTTP request. Args: url, method (GET/POST/PUT/DELETE), body (optional)',
85
- 'httpRequestTool': 'HTTP request. Args: url, method (GET/POST/PUT/DELETE), body (optional)',
86
- 'braveSearch': 'Web search via Brave. Args: query',
87
- 'serperSearch': 'Web search via Google/Serper. Args: query',
88
- 'perplexitySearch': 'AI-powered web search via Perplexity. Args: query',
89
- 'crawleeScraper': 'Read/extract content from web pages. Args: url',
90
- 'gmail': 'Send/search/read emails. Args: operation, ...',
91
- 'calendar': 'Manage Google Calendar events. Args: operation, ...',
92
- 'drive': 'Manage Google Drive files. Args: operation, ...',
93
- 'sheets': 'Read/write Google Sheets. Args: operation, ...',
94
- 'tasks': 'Manage Google Tasks. Args: operation, ...',
95
- 'contacts': 'Manage Google Contacts. Args: operation, ...',
96
- 'taskManager': 'Track delegated tasks. Args: operation',
97
- 'timer': 'Wait for duration. Args: duration, unit',
81
+ "calculatorTool": "Math operations: add, subtract, multiply, divide, power, sqrt, mod, abs. Args: operation, a, b",
82
+ "currentTimeTool": "Get current date/time. Args: timezone (optional)",
83
+ "duckduckgoSearch": "Web search via DuckDuckGo. Args: query, max_results (optional)",
84
+ "pythonExecutor": "Execute Python code. Args: code (must set output variable)",
85
+ "httpRequest": "HTTP request. Args: url, method (GET/POST/PUT/DELETE), body (optional)",
86
+ "httpRequestTool": "HTTP request. Args: url, method (GET/POST/PUT/DELETE), body (optional)",
87
+ "braveSearch": "Web search via Brave. Args: query",
88
+ "serperSearch": "Web search via Google/Serper. Args: query",
89
+ "perplexitySearch": "AI-powered web search via Perplexity. Args: query",
90
+ "crawleeScraper": "Read/extract content from web pages. Args: url",
91
+ "gmail": "Send/search/read emails. Args: operation, ...",
92
+ "calendar": "Manage Google Calendar events. Args: operation, ...",
93
+ "drive": "Manage Google Drive files. Args: operation, ...",
94
+ "sheets": "Read/write Google Sheets. Args: operation, ...",
95
+ "tasks": "Manage Google Tasks. Args: operation, ...",
96
+ "contacts": "Manage Google Contacts. Args: operation, ...",
97
+ "taskManager": "Track delegated tasks. Args: operation",
98
+ "timer": "Wait for duration. Args: duration, unit",
98
99
  }
99
100
 
100
101
  @staticmethod
101
- def bridge(tool_data: Optional[List[Dict[str, Any]]], context: Optional[Dict] = None, loop: Optional[asyncio.AbstractEventLoop] = None) -> Dict[str, Dict]:
102
+ def bridge(
103
+ tool_data: Optional[List[Dict[str, Any]]], context: Optional[Dict] = None, loop: Optional[asyncio.AbstractEventLoop] = None
104
+ ) -> Dict[str, Dict]:
102
105
  from constants import AI_AGENT_TYPES, AI_CHAT_MODEL_TYPES
103
106
  from services.handlers.tools import execute_tool
104
107
 
@@ -109,38 +112,38 @@ class ToolBridgeAdapter:
109
112
  tools = {}
110
113
 
111
114
  for tool_info in tool_data:
112
- node_type = tool_info.get('node_type', '')
115
+ node_type = tool_info.get("node_type", "")
113
116
 
114
117
  # Skip agents (delegation) and chat models (handled by ChatModelExtractor)
115
118
  if node_type in AI_AGENT_TYPES or node_type in AI_CHAT_MODEL_TYPES:
116
119
  continue
117
120
 
118
- node_id = tool_info.get('node_id', '')
119
- label = tool_info.get('label', node_type)
120
- params = tool_info.get('parameters', {})
121
+ node_id = tool_info.get("node_id", "")
122
+ label = tool_info.get("label", node_type)
123
+ params = tool_info.get("parameters", {})
121
124
 
122
125
  def _make_sync_wrapper(t_type, t_id, t_params, t_label):
123
126
  def wrapper(**kwargs):
124
127
  config = {
125
- 'node_type': t_type,
126
- 'node_id': t_id,
127
- 'parameters': t_params,
128
- 'label': t_label,
128
+ "node_type": t_type,
129
+ "node_id": t_id,
130
+ "parameters": t_params,
131
+ "label": t_label,
129
132
  }
130
133
  if context:
131
- config['nodes'] = context.get('nodes', [])
132
- config['edges'] = context.get('edges', [])
134
+ config["nodes"] = context.get("nodes", [])
135
+ config["edges"] = context.get("edges", [])
133
136
  future = asyncio.run_coroutine_threadsafe(
134
- execute_tool(t_label, kwargs, config), main_loop,
137
+ execute_tool(t_label, kwargs, config),
138
+ main_loop,
135
139
  )
136
140
  return future.result(timeout=60)
141
+
137
142
  return wrapper
138
143
 
139
144
  # Clean tool name (same pattern as _build_tool_from_node ai.py:2567)
140
- tool_name = re.sub(r'[^a-zA-Z0-9_]', '_', label.lower().replace(' ', '_'))
141
- description = ToolBridgeAdapter.TOOL_DESCRIPTIONS.get(
142
- node_type, f"Execute {label} ({node_type})"
143
- )
145
+ tool_name = re.sub(r"[^a-zA-Z0-9_]", "_", label.lower().replace(" ", "_"))
146
+ description = ToolBridgeAdapter.TOOL_DESCRIPTIONS.get(node_type, f"Execute {label} ({node_type})")
144
147
 
145
148
  tools[tool_name] = {
146
149
  "tool": _make_sync_wrapper(node_type, node_id, params, label),
@@ -2,19 +2,19 @@
2
2
 
3
3
  # MachinaOS provider -> RLM backend mapping
4
4
  PROVIDER_TO_BACKEND = {
5
- 'openai': 'openai',
6
- 'anthropic': 'anthropic',
7
- 'gemini': 'gemini',
8
- 'groq': 'openai',
9
- 'openrouter': 'openrouter',
10
- 'cerebras': 'openai',
5
+ "openai": "openai",
6
+ "anthropic": "anthropic",
7
+ "gemini": "gemini",
8
+ "groq": "openai",
9
+ "openrouter": "openrouter",
10
+ "cerebras": "openai",
11
11
  }
12
12
 
13
13
  # Base URLs for OpenAI-compatible providers
14
14
  PROVIDER_BASE_URLS = {
15
- 'groq': 'https://api.groq.com/openai/v1',
16
- 'openrouter': 'https://openrouter.ai/api/v1',
17
- 'cerebras': 'https://api.cerebras.ai/v1',
15
+ "groq": "https://api.groq.com/openai/v1",
16
+ "openrouter": "https://openrouter.ai/api/v1",
17
+ "cerebras": "https://api.cerebras.ai/v1",
18
18
  }
19
19
 
20
20
  # Default RLM execution parameters
@@ -1,7 +1,7 @@
1
1
  """RLM execution service.
2
2
 
3
3
  Follows the same interface as AIService.execute_agent() / execute_chat_agent()
4
- but replaces LangGraph with RLM's REPL-based execution loop.
4
+ but replaces the agent loop with RLM's REPL-based execution.
5
5
  """
6
6
 
7
7
  import asyncio
@@ -46,34 +46,34 @@ class RLMService:
46
46
 
47
47
  async def broadcast_status(phase: str, details: Dict[str, Any] = None):
48
48
  if broadcaster:
49
- await broadcaster.update_node_status(node_id, "executing", {
50
- "phase": phase, "agent_type": "rlm", **(details or {})
51
- }, workflow_id=workflow_id)
49
+ await broadcaster.update_node_status(
50
+ node_id, "executing", {"phase": phase, "agent_type": "rlm", **(details or {})}, workflow_id=workflow_id
51
+ )
52
52
 
53
53
  try:
54
54
  # === Parameter extraction (same pattern as execute_chat_agent) ===
55
- prompt = parameters.get('prompt', '')
56
- system_message = parameters.get('system_message', '')
55
+ prompt = parameters.get("prompt", "")
56
+ system_message = parameters.get("system_message", "")
57
57
 
58
58
  # Skill injection (reuse ai.py:833 _build_skill_system_prompt)
59
59
  # Collected as supplementary context -- appended to RLM prompt, never replaces it
60
60
  from services.ai import _build_skill_system_prompt
61
+
61
62
  supplementary_context = ""
62
- skill_prompt, has_personality = _build_skill_system_prompt(
63
- skill_data, log_prefix="[RLM]"
64
- )
63
+ skill_prompt, has_personality = _build_skill_system_prompt(skill_data, log_prefix="[RLM]")
65
64
  if skill_prompt:
66
65
  supplementary_context += f"\n\n## Skill Instructions\n{skill_prompt}"
67
66
 
68
67
  # Options flattening (same as execute_chat_agent line 1995)
69
- options = parameters.get('options', {})
68
+ options = parameters.get("options", {})
70
69
  flattened = {**parameters, **options}
71
70
 
72
71
  # Provider/model/API key resolution (same as lines 1998-2014)
73
72
  from services.ai import is_model_valid_for_provider, get_default_model_async
74
- api_key = flattened.get('api_key')
75
- provider = parameters.get('provider', 'openai')
76
- model = parameters.get('model', '')
73
+
74
+ api_key = flattened.get("api_key")
75
+ provider = parameters.get("provider", "openai")
76
+ model = parameters.get("model", "")
77
77
 
78
78
  if not model or not is_model_valid_for_provider(model, provider):
79
79
  model = await get_default_model_async(provider, database)
@@ -83,45 +83,49 @@ class RLMService:
83
83
  if not api_key:
84
84
  raise ValueError(f"API key required for RLM Agent (provider: {provider})")
85
85
 
86
- await broadcast_status("initializing", {
87
- "message": f"Initializing RLM with {provider}/{model}",
88
- "provider": provider, "model": model,
89
- })
86
+ await broadcast_status(
87
+ "initializing",
88
+ {
89
+ "message": f"Initializing RLM with {provider}/{model}",
90
+ "provider": provider,
91
+ "model": model,
92
+ },
93
+ )
90
94
 
91
95
  # === Memory injection (appended to supplementary context, not system prompt) ===
92
- if memory_data and memory_data.get('memory_content'):
93
- memory_text = memory_data['memory_content']
96
+ if memory_data and memory_data.get("memory_content"):
97
+ memory_text = memory_data["memory_content"]
94
98
  supplementary_context += f"\n\n## Conversation History\n{memory_text}"
95
99
 
96
100
  # === Adapter: Map provider to RLM backend ===
97
101
  backend, backend_kwargs = BackendAdapter.adapt(provider, model, api_key)
98
102
 
99
103
  # === Adapter: Extract chat model nodes as other_backends ===
100
- other_backends, other_backend_kwargs = await ChatModelExtractor.extract(
101
- tool_data, self.auth
102
- )
104
+ other_backends, other_backend_kwargs = await ChatModelExtractor.extract(tool_data, self.auth)
103
105
 
104
106
  # === Adapter: Bridge tool nodes as RLM custom_tools ===
105
- await broadcast_status("building_tools", {
106
- "message": "Bridging connected tools..."
107
- })
107
+ await broadcast_status("building_tools", {"message": "Bridging connected tools..."})
108
108
  running_loop = asyncio.get_running_loop()
109
109
  custom_tools = ToolBridgeAdapter.bridge(tool_data, context, loop=running_loop)
110
110
 
111
111
  # === RLM-specific parameters ===
112
- max_iterations = int(flattened.get('max_iterations', DEFAULT_MAX_ITERATIONS))
113
- max_depth = int(flattened.get('max_depth', DEFAULT_MAX_DEPTH))
114
- max_budget = flattened.get('max_budget')
115
- max_timeout = flattened.get('max_timeout')
116
- max_tokens = flattened.get('max_tokens')
117
- verbose = flattened.get('verbose', DEFAULT_VERBOSE)
112
+ max_iterations = int(flattened.get("max_iterations", DEFAULT_MAX_ITERATIONS))
113
+ max_depth = int(flattened.get("max_depth", DEFAULT_MAX_DEPTH))
114
+ max_budget = flattened.get("max_budget")
115
+ max_timeout = flattened.get("max_timeout")
116
+ max_tokens = flattened.get("max_tokens")
117
+ verbose = flattened.get("verbose", DEFAULT_VERBOSE)
118
118
 
119
119
  # === Run RLM in thread pool (RLM is synchronous) ===
120
- await broadcast_status("executing", {
121
- "message": f"RLM executing (max {max_iterations} iterations)...",
122
- "max_iterations": max_iterations, "max_depth": max_depth,
123
- "tool_count": len(custom_tools),
124
- })
120
+ await broadcast_status(
121
+ "executing",
122
+ {
123
+ "message": f"RLM executing (max {max_iterations} iterations)...",
124
+ "max_iterations": max_iterations,
125
+ "max_depth": max_depth,
126
+ "tool_count": len(custom_tools),
127
+ },
128
+ )
125
129
 
126
130
  # Build augmented prompt: MachinaOS context prepended to user prompt.
127
131
  # We do NOT pass custom_system_prompt to RLM because RLM_SYSTEM_PROMPT
@@ -140,36 +144,44 @@ class RLMService:
140
144
  def _run_rlm():
141
145
  from rlm import RLM
142
146
  from rlm.logger import RLMLogger
147
+
143
148
  rlm_instance = RLM(
144
- backend=backend, backend_kwargs=backend_kwargs,
149
+ backend=backend,
150
+ backend_kwargs=backend_kwargs,
145
151
  environment="local",
146
152
  other_backends=other_backends if other_backends else None,
147
153
  other_backend_kwargs=other_backend_kwargs if other_backend_kwargs else None,
148
- max_iterations=max_iterations, max_depth=max_depth,
154
+ max_iterations=max_iterations,
155
+ max_depth=max_depth,
149
156
  max_budget=float(max_budget) if max_budget else None,
150
157
  max_timeout=float(max_timeout) if max_timeout else None,
151
158
  max_tokens=int(max_tokens) if max_tokens else None,
152
159
  custom_tools=custom_tools if custom_tools else None,
153
- logger=RLMLogger(), verbose=verbose,
160
+ logger=RLMLogger(),
161
+ verbose=verbose,
154
162
  )
155
163
  return rlm_instance.completion(augmented_prompt)
156
164
 
157
165
  result = await asyncio.to_thread(_run_rlm)
158
166
 
159
167
  # === Memory save (same pattern as execute_chat_agent) ===
160
- if memory_data and memory_data.get('node_id'):
168
+ if memory_data and memory_data.get("node_id"):
161
169
  from services.memory_store import add_message
162
- session_id = memory_data.get('session_id', 'default')
170
+
171
+ session_id = memory_data.get("session_id", "default")
163
172
  add_message(session_id, "user", prompt)
164
173
  add_message(session_id, "assistant", result.response or "")
165
174
 
166
175
  execution_time = time.time() - start_time
167
176
  iterations = len(result.metadata.get("iterations", [])) if result.metadata else 0
168
177
 
169
- await broadcast_status("completed", {
170
- "message": f"RLM completed in {execution_time:.1f}s",
171
- "iterations": iterations,
172
- })
178
+ await broadcast_status(
179
+ "completed",
180
+ {
181
+ "message": f"RLM completed in {execution_time:.1f}s",
182
+ "iterations": iterations,
183
+ },
184
+ )
173
185
 
174
186
  return {
175
187
  "success": True,
@@ -2,6 +2,7 @@
2
2
  Cron Scheduler Service using APScheduler.
3
3
  Manages scheduled jobs for workflow automation.
4
4
  """
5
+
5
6
  from apscheduler.schedulers.asyncio import AsyncIOScheduler
6
7
  from apscheduler.triggers.cron import CronTrigger
7
8
  from apscheduler.jobstores.base import JobLookupError
@@ -37,13 +38,7 @@ def shutdown_scheduler():
37
38
  logger.info("[Scheduler] Shutdown")
38
39
 
39
40
 
40
- def register_cron_job(
41
- job_id: str,
42
- cron_expression: str,
43
- callback: Callable,
44
- timezone: str = "UTC",
45
- **kwargs
46
- ) -> str:
41
+ def register_cron_job(job_id: str, cron_expression: str, callback: Callable, timezone: str = "UTC", **kwargs) -> str:
47
42
  """
48
43
  Register a cron job with the scheduler.
49
44
 
@@ -66,35 +61,17 @@ def register_cron_job(
66
61
  if len(parts) >= 6:
67
62
  # 6-field format: second minute hour day month weekday
68
63
  trigger = CronTrigger(
69
- second=parts[0],
70
- minute=parts[1],
71
- hour=parts[2],
72
- day=parts[3],
73
- month=parts[4],
74
- day_of_week=parts[5],
75
- timezone=timezone
64
+ second=parts[0], minute=parts[1], hour=parts[2], day=parts[3], month=parts[4], day_of_week=parts[5], timezone=timezone
76
65
  )
77
66
  else:
78
67
  # 5-field format: minute hour day month weekday (default second=0)
79
68
  if len(parts) < 5:
80
- parts.extend(['*'] * (5 - len(parts)))
69
+ parts.extend(["*"] * (5 - len(parts)))
81
70
  trigger = CronTrigger(
82
- second='0',
83
- minute=parts[0],
84
- hour=parts[1],
85
- day=parts[2],
86
- month=parts[3],
87
- day_of_week=parts[4],
88
- timezone=timezone
71
+ second="0", minute=parts[0], hour=parts[1], day=parts[2], month=parts[3], day_of_week=parts[4], timezone=timezone
89
72
  )
90
73
 
91
- scheduler.add_job(
92
- callback,
93
- trigger=trigger,
94
- id=job_id,
95
- replace_existing=True,
96
- kwargs=kwargs
97
- )
74
+ scheduler.add_job(callback, trigger=trigger, id=job_id, replace_existing=True, kwargs=kwargs)
98
75
 
99
76
  logger.info(f"[Scheduler] Registered cron job: {job_id} with expression: {cron_expression}")
100
77
  return job_id
@@ -133,11 +110,7 @@ def get_job_info(job_id: str) -> Optional[Dict]:
133
110
  scheduler = get_scheduler()
134
111
  job = scheduler.get_job(job_id)
135
112
  if job:
136
- return {
137
- "id": job.id,
138
- "next_run_time": job.next_run_time.isoformat() if job.next_run_time else None,
139
- "trigger": str(job.trigger)
140
- }
113
+ return {"id": job.id, "next_run_time": job.next_run_time.isoformat() if job.next_run_time else None, "trigger": str(job.trigger)}
141
114
  return None
142
115
 
143
116
 
@@ -146,10 +119,6 @@ def get_all_jobs() -> list:
146
119
  scheduler = get_scheduler()
147
120
  jobs = scheduler.get_jobs()
148
121
  return [
149
- {
150
- "id": job.id,
151
- "next_run_time": job.next_run_time.isoformat() if job.next_run_time else None,
152
- "trigger": str(job.trigger)
153
- }
122
+ {"id": job.id, "next_run_time": job.next_run_time.isoformat() if job.next_run_time else None, "trigger": str(job.trigger)}
154
123
  for job in jobs
155
124
  ]
@@ -0,0 +1,16 @@
1
+ """Settings domain — Wave 13.3 extraction from ``routers/websocket.py``.
2
+
3
+ Side-effect import registers the 8 settings handlers (user_settings +
4
+ provider_defaults + validated_ai_providers + global_model + compaction
5
+ stats/config) into ``ws_handler_registry``.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from services.ws_handler_registry import register_ws_handlers as _register_ws_handlers
11
+
12
+ from .handlers import WS_HANDLERS as _SETTINGS_WS_HANDLERS
13
+
14
+ _register_ws_handlers(_SETTINGS_WS_HANDLERS)
15
+
16
+ __all__ = ["handlers"]