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
@@ -10,12 +10,7 @@ from services import event_waiter
10
10
  logger = get_logger(__name__)
11
11
 
12
12
 
13
- async def handle_trigger_node(
14
- node_id: str,
15
- node_type: str,
16
- parameters: Dict[str, Any],
17
- context: Dict[str, Any]
18
- ) -> Dict[str, Any]:
13
+ async def handle_trigger_node(node_id: str, node_type: str, parameters: Dict[str, Any], context: Dict[str, Any]) -> Dict[str, Any]:
19
14
  """Handle trigger node execution (webhook, whatsapp, etc.).
20
15
 
21
16
  Uses event_waiter module to register waiter and await matching event.
@@ -31,8 +26,9 @@ async def handle_trigger_node(
31
26
  Execution result dict with event data
32
27
  """
33
28
  from services.status_broadcaster import get_status_broadcaster
29
+
34
30
  start_time = time.time()
35
- execution_id = context.get('execution_id', 'unknown')
31
+ execution_id = context.get("execution_id", "unknown")
36
32
 
37
33
  # Get trigger configuration
38
34
  config = event_waiter.get_trigger_config(node_type)
@@ -44,7 +40,7 @@ async def handle_trigger_node(
44
40
  "node_type": node_type,
45
41
  "error": f"Unknown trigger type: {node_type}",
46
42
  "execution_time": time.time() - start_time,
47
- "timestamp": datetime.now().isoformat()
43
+ "timestamp": datetime.now().isoformat(),
48
44
  }
49
45
 
50
46
  try:
@@ -67,20 +63,26 @@ async def handle_trigger_node(
67
63
  waiter = await event_waiter.register(node_type, node_id, parameters)
68
64
 
69
65
  # Get workflow_id from context for per-workflow status scoping (n8n pattern)
70
- workflow_id = context.get('workflow_id')
66
+ workflow_id = context.get("workflow_id")
71
67
 
72
68
  # Broadcast waiting status to frontend
73
69
  broadcaster = get_status_broadcaster()
74
70
  logger.info("Broadcasting waiting status", node_id=node_id, execution_id=execution_id)
75
- await broadcaster.update_node_status(node_id, "waiting", {
76
- "message": f"Waiting for {config.display_name}...",
77
- "event_type": config.event_type,
78
- "waiter_id": waiter.id
79
- }, workflow_id=workflow_id)
80
-
81
- logger.info("Trigger waiting for event", node_id=node_id, node_type=node_type,
82
- event_type=config.event_type, execution_id=execution_id,
83
- backend_mode=event_waiter.get_backend_mode())
71
+ await broadcaster.update_node_status(
72
+ node_id,
73
+ "waiting",
74
+ {"message": f"Waiting for {config.display_name}...", "event_type": config.event_type, "waiter_id": waiter.id},
75
+ workflow_id=workflow_id,
76
+ )
77
+
78
+ logger.info(
79
+ "Trigger waiting for event",
80
+ node_id=node_id,
81
+ node_type=node_type,
82
+ event_type=config.event_type,
83
+ execution_id=execution_id,
84
+ backend_mode=event_waiter.get_backend_mode(),
85
+ )
84
86
 
85
87
  # Wait for event indefinitely (user cancels via cancel_event_wait)
86
88
  # Uses wait_for_event which handles both Redis Streams and asyncio.Future modes
@@ -95,7 +97,7 @@ async def handle_trigger_node(
95
97
  "node_type": node_type,
96
98
  "result": event_data,
97
99
  "execution_time": time.time() - start_time,
98
- "timestamp": datetime.now().isoformat()
100
+ "timestamp": datetime.now().isoformat(),
99
101
  }
100
102
 
101
103
  except asyncio.CancelledError:
@@ -106,17 +108,16 @@ async def handle_trigger_node(
106
108
  "node_type": node_type,
107
109
  "error": "Cancelled by user",
108
110
  "execution_time": time.time() - start_time,
109
- "timestamp": datetime.now().isoformat()
111
+ "timestamp": datetime.now().isoformat(),
110
112
  }
111
113
 
112
114
  except Exception as e:
113
- logger.error("Trigger execution failed", node_id=node_id, node_type=node_type,
114
- execution_id=execution_id, error=str(e))
115
+ logger.error("Trigger execution failed", node_id=node_id, node_type=node_type, execution_id=execution_id, error=str(e))
115
116
  return {
116
117
  "success": False,
117
118
  "node_id": node_id,
118
119
  "node_type": node_type,
119
120
  "error": str(e),
120
121
  "execution_time": time.time() - start_time,
121
- "timestamp": datetime.now().isoformat()
122
+ "timestamp": datetime.now().isoformat(),
122
123
  }
@@ -18,9 +18,11 @@ logger = get_logger(__name__)
18
18
  # Provider config dataclass
19
19
  # ---------------------------------------------------------------------------
20
20
 
21
+
21
22
  @dataclass
22
23
  class ProviderConfig:
23
24
  """Metadata for a single LLM provider."""
25
+
24
26
  name: str
25
27
  default_model: str
26
28
  detection_patterns: Tuple[str, ...]
@@ -35,6 +37,7 @@ class ProviderConfig:
35
37
  # Load config/llm_defaults.json once at import time
36
38
  # ---------------------------------------------------------------------------
37
39
 
40
+
38
41
  def _load_llm_defaults() -> Dict[str, Any]:
39
42
  config_path = Path(__file__).parent.parent.parent / "config" / "llm_defaults.json"
40
43
  try:
@@ -68,6 +71,7 @@ _AUTH_OVERRIDES: Dict[str, Dict[str, str]] = {
68
71
  # Provider registry -- built dynamically from llm_defaults.json
69
72
  # ---------------------------------------------------------------------------
70
73
 
74
+
71
75
  def _build_provider_configs() -> Dict[str, ProviderConfig]:
72
76
  """Build ProviderConfig entries from llm_defaults.json."""
73
77
  providers = LLM_DEFAULTS.get("providers", {})
@@ -100,6 +104,7 @@ def get_provider_config(provider: str) -> Optional[ProviderConfig]:
100
104
  # Provider detection from model name
101
105
  # ---------------------------------------------------------------------------
102
106
 
107
+
103
108
  def detect_provider_from_model(model: str) -> str:
104
109
  model_lower = model.lower()
105
110
  for name, cfg in PROVIDER_CONFIGS.items():
@@ -114,7 +119,7 @@ def is_model_valid_for_provider(model: str, provider: str) -> bool:
114
119
  # match any "lmstudio"/"ollama" substring. Treat as always-valid;
115
120
  # the upstream API will 404 a genuinely missing model. See the
116
121
  # mirror in services/ai.py for the full rationale.
117
- if provider in ('openrouter', 'ollama', 'lmstudio'):
122
+ if provider in ("openrouter", "ollama", "lmstudio"):
118
123
  return True
119
124
  cfg = PROVIDER_CONFIGS.get(provider)
120
125
  if not cfg:
@@ -127,6 +132,7 @@ def is_model_valid_for_provider(model: str, provider: str) -> bool:
127
132
  # Default model helpers
128
133
  # ---------------------------------------------------------------------------
129
134
 
135
+
130
136
  def get_default_model(provider: str) -> str:
131
137
  cfg = PROVIDER_CONFIGS.get(provider)
132
138
  return cfg.default_model if cfg else "gpt-5.2"
@@ -148,9 +154,11 @@ async def get_default_model_async(provider: str, database) -> str:
148
154
  # Max-tokens / temperature resolution
149
155
  # ---------------------------------------------------------------------------
150
156
 
157
+
151
158
  def resolve_max_tokens(params: dict, model: str, provider: str) -> int:
152
159
  """Resolve max_tokens: user param -> model registry -> llm_defaults -> 4096."""
153
160
  from services.model_registry import get_model_registry
161
+
154
162
  registry = get_model_registry()
155
163
  model_max = registry.get_max_output_tokens(model, provider)
156
164
 
@@ -167,6 +175,7 @@ def resolve_max_tokens(params: dict, model: str, provider: str) -> int:
167
175
  def resolve_temperature(params: dict, model: str, provider: str, thinking_enabled: bool) -> float:
168
176
  """Resolve temperature with model-specific constraints."""
169
177
  from services.model_registry import get_model_registry
178
+
170
179
  registry = get_model_registry()
171
180
 
172
181
  user_temp = float(params.get("temperature", 0.7))
@@ -16,10 +16,16 @@ _DEDICATED_PROVIDERS = frozenset({"anthropic", "openai", "gemini", "openrouter"}
16
16
  # Local servers (ollama, lmstudio) expose OpenAI-compatible /v1 endpoints, so they fall
17
17
  # through to OpenAIProvider with base_url from llm_defaults.json — same path as deepseek/
18
18
  # kimi/mistral. The user's custom URL rides via the existing {provider}_proxy credential.
19
- NATIVE_PROVIDERS = _DEDICATED_PROVIDERS | frozenset({
20
- "xai", "deepseek", "kimi", "mistral",
21
- "ollama", "lmstudio",
22
- })
19
+ NATIVE_PROVIDERS = _DEDICATED_PROVIDERS | frozenset(
20
+ {
21
+ "xai",
22
+ "deepseek",
23
+ "kimi",
24
+ "mistral",
25
+ "ollama",
26
+ "lmstudio",
27
+ }
28
+ )
23
29
 
24
30
 
25
31
  def create_provider(
@@ -35,25 +41,31 @@ def create_provider(
35
41
  """
36
42
  if provider == "anthropic":
37
43
  from services.llm.providers.anthropic import AnthropicProvider
44
+
38
45
  return AnthropicProvider(api_key, proxy_url=proxy_url)
39
46
 
40
47
  if provider == "openai":
41
48
  from services.llm.providers.openai import OpenAIProvider
49
+
42
50
  return OpenAIProvider(api_key, proxy_url=proxy_url)
43
51
 
44
52
  if provider == "gemini":
45
53
  from services.llm.providers.gemini import GeminiProvider
54
+
46
55
  return GeminiProvider(api_key, proxy_url=proxy_url)
47
56
 
48
57
  if provider == "openrouter":
49
58
  from services.llm.providers.openrouter import OpenRouterProvider
59
+
50
60
  return OpenRouterProvider(api_key, proxy_url=proxy_url)
51
61
 
52
62
  # OpenAI-compatible providers: use OpenAIProvider with base_url from config
53
63
  from services.llm.config import get_provider_config
64
+
54
65
  config = get_provider_config(provider)
55
66
  if config and config.base_url:
56
67
  from services.llm.providers.openai import OpenAIProvider
68
+
57
69
  return OpenAIProvider(api_key, base_url=config.base_url, proxy_url=proxy_url)
58
70
 
59
71
  raise ValueError(f"Unknown provider: {provider}")
@@ -11,11 +11,7 @@ def is_valid_message_content(content: Any) -> bool:
11
11
  if content is None:
12
12
  return False
13
13
  if isinstance(content, list):
14
- return any(
15
- (isinstance(b, dict) and b.get("text", "").strip())
16
- or (isinstance(b, str) and b.strip())
17
- for b in content
18
- )
14
+ return any((isinstance(b, dict) and b.get("text", "").strip()) or (isinstance(b, str) and b.strip()) for b in content)
19
15
  if isinstance(content, str):
20
16
  return bool(content.strip())
21
17
  return bool(content)
@@ -13,6 +13,7 @@ from typing import Any, Dict, List, Optional, Protocol, runtime_checkable
13
13
  # Shared data types
14
14
  # ---------------------------------------------------------------------------
15
15
 
16
+
16
17
  @dataclass
17
18
  class ThinkingConfig:
18
19
  """Unified thinking/reasoning configuration.
@@ -23,16 +24,18 @@ class ThinkingConfig:
23
24
  - Gemini 3+: thinking_level (low/medium/high)
24
25
  - Groq Qwen3: reasoning_format (parsed/hidden)
25
26
  """
27
+
26
28
  enabled: bool = False
27
29
  budget: int = 2048
28
30
  effort: str = "medium"
29
- level: str = "medium" # Gemini 3+ thinking_level
31
+ level: str = "medium" # Gemini 3+ thinking_level
30
32
  format: str = "parsed"
31
33
 
32
34
 
33
35
  @dataclass
34
36
  class ToolDef:
35
37
  """Tool definition passed to the LLM."""
38
+
36
39
  name: str
37
40
  description: str
38
41
  parameters: Dict[str, Any] # JSON Schema
@@ -41,6 +44,7 @@ class ToolDef:
41
44
  @dataclass
42
45
  class ToolCall:
43
46
  """A tool invocation returned by the LLM."""
47
+
44
48
  id: str
45
49
  name: str
46
50
  args: Dict[str, Any]
@@ -49,6 +53,7 @@ class ToolCall:
49
53
  @dataclass
50
54
  class Message:
51
55
  """Normalized chat message."""
56
+
52
57
  role: str # system | user | assistant | tool
53
58
  content: str = ""
54
59
  tool_calls: List[ToolCall] = field(default_factory=list)
@@ -59,6 +64,7 @@ class Message:
59
64
  @dataclass
60
65
  class Usage:
61
66
  """Token usage metrics."""
67
+
62
68
  input_tokens: int = 0
63
69
  output_tokens: int = 0
64
70
  total_tokens: int = 0
@@ -70,6 +76,7 @@ class Usage:
70
76
  @dataclass
71
77
  class LLMResponse:
72
78
  """Normalized response from any LLM provider."""
79
+
73
80
  content: str = ""
74
81
  thinking: Optional[str] = None
75
82
  tool_calls: List[ToolCall] = field(default_factory=list)
@@ -83,6 +90,7 @@ class LLMResponse:
83
90
  # Provider protocol (structural typing)
84
91
  # ---------------------------------------------------------------------------
85
92
 
93
+
86
94
  @runtime_checkable
87
95
  class LLMProvider(Protocol):
88
96
  provider_name: str
@@ -7,7 +7,12 @@ from typing import Any, Dict, List, Optional
7
7
 
8
8
  from core.logging import get_logger
9
9
  from services.llm.protocol import (
10
- LLMResponse, Message, ThinkingConfig, ToolCall, ToolDef, Usage,
10
+ LLMResponse,
11
+ Message,
12
+ ThinkingConfig,
13
+ ToolCall,
14
+ ToolDef,
15
+ Usage,
11
16
  )
12
17
 
13
18
  logger = get_logger(__name__)
@@ -18,6 +23,7 @@ class AnthropicProvider:
18
23
 
19
24
  def __init__(self, api_key: str, *, proxy_url: Optional[str] = None):
20
25
  import anthropic
26
+
21
27
  kwargs: Dict[str, Any] = {"api_key": api_key}
22
28
  if proxy_url:
23
29
  kwargs["base_url"] = proxy_url
@@ -71,6 +77,7 @@ class AnthropicProvider:
71
77
 
72
78
  async def fetch_models(self, api_key: str) -> List[str]:
73
79
  import httpx
80
+
74
81
  async with httpx.AsyncClient() as client:
75
82
  r = await client.get(
76
83
  "https://api.anthropic.com/v1/models",
@@ -117,12 +124,14 @@ class AnthropicProvider:
117
124
  if m.content:
118
125
  content.append({"type": "text", "text": m.content})
119
126
  for tc in m.tool_calls:
120
- content.append({
121
- "type": "tool_use",
122
- "id": tc.id,
123
- "name": tc.name,
124
- "input": tc.args,
125
- })
127
+ content.append(
128
+ {
129
+ "type": "tool_use",
130
+ "id": tc.id,
131
+ "name": tc.name,
132
+ "input": tc.args,
133
+ }
134
+ )
126
135
  return {"role": "assistant", "content": content}
127
136
 
128
137
  return {"role": role, "content": m.content}
@@ -146,11 +155,13 @@ class AnthropicProvider:
146
155
  elif block.type == "thinking":
147
156
  thinking_parts.append(block.thinking)
148
157
  elif block.type == "tool_use":
149
- tool_calls.append(ToolCall(
150
- id=block.id,
151
- name=block.name,
152
- args=block.input if isinstance(block.input, dict) else json.loads(block.input),
153
- ))
158
+ tool_calls.append(
159
+ ToolCall(
160
+ id=block.id,
161
+ name=block.name,
162
+ args=block.input if isinstance(block.input, dict) else json.loads(block.input),
163
+ )
164
+ )
154
165
 
155
166
  usage = Usage(
156
167
  input_tokens=getattr(resp.usage, "input_tokens", 0),
@@ -6,7 +6,12 @@ from typing import Any, Dict, List, Optional
6
6
 
7
7
  from core.logging import get_logger
8
8
  from services.llm.protocol import (
9
- LLMResponse, Message, ThinkingConfig, ToolCall, ToolDef, Usage,
9
+ LLMResponse,
10
+ Message,
11
+ ThinkingConfig,
12
+ ToolCall,
13
+ ToolDef,
14
+ Usage,
10
15
  )
11
16
 
12
17
  logger = get_logger(__name__)
@@ -17,6 +22,7 @@ class GeminiProvider:
17
22
 
18
23
  def __init__(self, api_key: str, *, proxy_url: Optional[str] = None):
19
24
  from google import genai
25
+
20
26
  kwargs: Dict[str, Any] = {"api_key": api_key}
21
27
  if proxy_url:
22
28
  kwargs["http_options"] = {"base_url": proxy_url}
@@ -74,6 +80,7 @@ class GeminiProvider:
74
80
 
75
81
  async def fetch_models(self, api_key: str) -> List[str]:
76
82
  import httpx
83
+
77
84
  async with httpx.AsyncClient() as client:
78
85
  r = await client.get(
79
86
  f"https://generativelanguage.googleapis.com/v1beta/models?key={api_key}",
@@ -103,13 +110,19 @@ class GeminiProvider:
103
110
  continue
104
111
 
105
112
  if m.role == "tool":
106
- contents.append({
107
- "role": "function",
108
- "parts": [{"function_response": {
109
- "name": m.name or "",
110
- "response": {"result": m.content},
111
- }}],
112
- })
113
+ contents.append(
114
+ {
115
+ "role": "function",
116
+ "parts": [
117
+ {
118
+ "function_response": {
119
+ "name": m.name or "",
120
+ "response": {"result": m.content},
121
+ }
122
+ }
123
+ ],
124
+ }
125
+ )
113
126
  continue
114
127
 
115
128
  if m.role == "assistant" and m.tool_calls:
@@ -117,10 +130,14 @@ class GeminiProvider:
117
130
  if m.content:
118
131
  parts.append({"text": m.content})
119
132
  for tc in m.tool_calls:
120
- parts.append({"function_call": {
121
- "name": tc.name,
122
- "args": tc.args,
123
- }})
133
+ parts.append(
134
+ {
135
+ "function_call": {
136
+ "name": tc.name,
137
+ "args": tc.args,
138
+ }
139
+ }
140
+ )
124
141
  contents.append({"role": "model", "parts": parts})
125
142
  continue
126
143
 
@@ -133,11 +150,13 @@ class GeminiProvider:
133
150
  @staticmethod
134
151
  def _to_api_tool(tool: ToolDef) -> Dict[str, Any]:
135
152
  return {
136
- "function_declarations": [{
137
- "name": tool.name,
138
- "description": tool.description,
139
- "parameters": tool.parameters,
140
- }]
153
+ "function_declarations": [
154
+ {
155
+ "name": tool.name,
156
+ "description": tool.description,
157
+ "parameters": tool.parameters,
158
+ }
159
+ ]
141
160
  }
142
161
 
143
162
  def _normalize(self, resp: Any, model: str) -> LLMResponse:
@@ -152,11 +171,13 @@ class GeminiProvider:
152
171
  elif hasattr(part, "function_call") and part.function_call:
153
172
  fc = part.function_call
154
173
  args = dict(fc.args) if fc.args else {}
155
- tool_calls.append(ToolCall(
156
- id=fc.name, # Gemini doesn't have separate IDs
157
- name=fc.name,
158
- args=args,
159
- ))
174
+ tool_calls.append(
175
+ ToolCall(
176
+ id=fc.name, # Gemini doesn't have separate IDs
177
+ name=fc.name,
178
+ args=args,
179
+ )
180
+ )
160
181
  elif hasattr(part, "text") and part.text:
161
182
  text_parts.append(part.text)
162
183
 
@@ -11,7 +11,12 @@ from typing import Any, Dict, List, Optional
11
11
 
12
12
  from core.logging import get_logger
13
13
  from services.llm.protocol import (
14
- LLMResponse, Message, ThinkingConfig, ToolCall, ToolDef, Usage,
14
+ LLMResponse,
15
+ Message,
16
+ ThinkingConfig,
17
+ ToolCall,
18
+ ToolDef,
19
+ Usage,
15
20
  )
16
21
 
17
22
  logger = get_logger(__name__)
@@ -22,6 +27,7 @@ class OpenAIProvider:
22
27
 
23
28
  def __init__(self, api_key: str, *, proxy_url: Optional[str] = None, base_url: Optional[str] = None):
24
29
  import openai
30
+
25
31
  kwargs: Dict[str, Any] = {"api_key": api_key}
26
32
  url = proxy_url or base_url
27
33
  if url:
@@ -143,11 +149,13 @@ class OpenAIProvider:
143
149
  if msg.tool_calls:
144
150
  for tc in msg.tool_calls:
145
151
  args = tc.function.arguments
146
- tool_calls.append(ToolCall(
147
- id=tc.id,
148
- name=tc.function.name,
149
- args=json.loads(args) if isinstance(args, str) else args,
150
- ))
152
+ tool_calls.append(
153
+ ToolCall(
154
+ id=tc.id,
155
+ name=tc.function.name,
156
+ args=json.loads(args) if isinstance(args, str) else args,
157
+ )
158
+ )
151
159
 
152
160
  u = resp.usage
153
161
  usage = Usage(
@@ -6,7 +6,10 @@ from typing import Any, Dict, List, Optional
6
6
 
7
7
  from core.logging import get_logger
8
8
  from services.llm.protocol import (
9
- LLMResponse, Message, ThinkingConfig, ToolDef,
9
+ LLMResponse,
10
+ Message,
11
+ ThinkingConfig,
12
+ ToolDef,
10
13
  )
11
14
  from services.llm.providers.openai import OpenAIProvider
12
15
 
@@ -18,6 +21,7 @@ class OpenRouterProvider(OpenAIProvider):
18
21
 
19
22
  def __init__(self, api_key: str, *, proxy_url: Optional[str] = None):
20
23
  import openai
24
+
21
25
  kwargs: Dict[str, Any] = {
22
26
  "api_key": api_key,
23
27
  "base_url": proxy_url or "https://openrouter.ai/api/v1",
@@ -51,6 +55,7 @@ class OpenRouterProvider(OpenAIProvider):
51
55
 
52
56
  async def fetch_models(self, api_key: str) -> List[str]:
53
57
  import httpx
58
+
54
59
  async with httpx.AsyncClient() as client:
55
60
  r = await client.get(
56
61
  "https://openrouter.ai/api/v1/models",
@@ -215,8 +215,7 @@ def _walk_tokens(tokens: list, result: list, depth: int = 0) -> None:
215
215
  if table_row:
216
216
  table_rows.append(table_row)
217
217
  table_row = []
218
- elif ttype in ("thead_open", "thead_close", "tbody_open", "tbody_close",
219
- "th_open", "th_close", "td_open", "td_close"):
218
+ elif ttype in ("thead_open", "thead_close", "tbody_open", "tbody_close", "th_open", "th_close", "td_open", "td_close"):
220
219
  pass # Handled via tr_open/close and inline collection
221
220
  elif ttype == "html_block" or ttype == "html_inline":
222
221
  result.append(token.content)
@@ -4,7 +4,7 @@ Reorganised from the single-file ``services/memory.py`` so each
4
4
  storage format / concern owns its own module:
5
5
 
6
6
  - :mod:`services.memory.markdown` — markdown parse/append/trim
7
- (used by aiAgent / chatAgent / deep_agent / rlm_agent)
7
+ (used by aiAgent / chatAgent / rlm_agent)
8
8
  - :mod:`services.memory.jsonl` — Anthropic Messages JSONL
9
9
  parse/append/trim (used by claude_code_agent's session bridge)
10
10
  - :mod:`services.memory.vector_store` — per-session
@@ -35,7 +35,7 @@ from services.memory.jsonl import (
35
35
 
36
36
  __all__ = [
37
37
  # Markdown helpers — used by every agent bridge (aiAgent /
38
- # chatAgent / deep_agent / rlm_agent / claude_code_agent).
38
+ # chatAgent / rlm_agent / claude_code_agent).
39
39
  "parse_memory_markdown",
40
40
  "append_to_memory_markdown",
41
41
  "trim_markdown_window",
@@ -51,7 +51,10 @@ def parse_jsonl(text: str) -> List[BaseMessage]:
51
51
 
52
52
 
53
53
  def append_message(
54
- text: str, role: str, content: str, **metadata: Any,
54
+ text: str,
55
+ role: str,
56
+ content: str,
57
+ **metadata: Any,
55
58
  ) -> str:
56
59
  """Append one Anthropic Messages-format line to a JSONL string.
57
60
 
@@ -59,7 +62,8 @@ def append_message(
59
62
  a trailing newline so successive appends concatenate cleanly.
60
63
  """
61
64
  line = json.dumps(
62
- {"role": role, "content": content, **metadata}, ensure_ascii=False,
65
+ {"role": role, "content": content, **metadata},
66
+ ensure_ascii=False,
63
67
  )
64
68
  if text and not text.endswith("\n"):
65
69
  text = text + "\n"
@@ -2,8 +2,8 @@
2
2
 
3
3
  Parse, append, and trim conversation history stored in the bespoke
4
4
  ``### **Human/Assistant** (timestamp)`` markdown format. Used by
5
- aiAgent, chatAgent, deep_agent, and rlm_agent for persistent memory
6
- across turns. The claude_code_agent bridge uses the JSONL helpers in
5
+ aiAgent, chatAgent, and rlm_agent for persistent memory across turns.
6
+ The claude_code_agent bridge uses the JSONL helpers in
7
7
  :mod:`services.memory.jsonl` instead.
8
8
  """
9
9
 
@@ -25,7 +25,7 @@ def parse_memory_markdown(content: str) -> List[BaseMessage]:
25
25
  response content
26
26
  """
27
27
  messages: List[BaseMessage] = []
28
- pattern = r'### \*\*(Human|Assistant)\*\*[^\n]*\n(.*?)(?=\n### \*\*|$)'
28
+ pattern = r"### \*\*(Human|Assistant)\*\*[^\n]*\n(.*?)(?=\n### \*\*|$)"
29
29
  for role, text in re.findall(pattern, content, re.DOTALL):
30
30
  text = text.strip()
31
31
  if text:
@@ -47,14 +47,14 @@ def trim_markdown_window(content: str, window_size: int) -> tuple:
47
47
  """Keep the last ``window_size`` message PAIRS; return
48
48
  ``(trimmed_content, removed_texts)``. Removed texts are returned
49
49
  so callers can hand them to the long-term vector store."""
50
- pattern = r'(### \*\*(Human|Assistant)\*\*[^\n]*\n.*?)(?=\n### \*\*|$)'
50
+ pattern = r"(### \*\*(Human|Assistant)\*\*[^\n]*\n.*?)(?=\n### \*\*|$)"
51
51
  blocks = [m[0] for m in re.findall(pattern, content, re.DOTALL)]
52
52
 
53
53
  if len(blocks) <= window_size * 2:
54
54
  return content, []
55
55
 
56
- keep = blocks[-(window_size * 2):]
57
- removed = blocks[:-(window_size * 2)]
56
+ keep = blocks[-(window_size * 2) :]
57
+ removed = blocks[: -(window_size * 2)]
58
58
 
59
59
  removed_texts: List[str] = []
60
60
  for block in removed:
@@ -93,15 +93,16 @@ async def clear_agent_session_state(
93
93
  await db.save_node_parameters(memory_node_id, params)
94
94
  cleared_memory_node = True
95
95
  logger.info(
96
- "[Memory] Cleared simpleMemory node fields memory_node=%s "
97
- "(memory_content reset + last_session_id wiped)",
96
+ "[Memory] Cleared simpleMemory node fields memory_node=%s " "(memory_content reset + last_session_id wiped)",
98
97
  memory_node_id,
99
98
  )
100
99
 
101
100
  logger.info(
102
- "[Memory] Cleared agent session state session=%s workflow_id=%s "
103
- "vector_store=%s todo_keys=%s memory_node=%s",
104
- session_id, workflow_id, cleared_vector_store, cleared_todo_keys,
101
+ "[Memory] Cleared agent session state session=%s workflow_id=%s " "vector_store=%s todo_keys=%s memory_node=%s",
102
+ session_id,
103
+ workflow_id,
104
+ cleared_vector_store,
105
+ cleared_todo_keys,
105
106
  cleared_memory_node,
106
107
  )
107
108