machinaos 0.0.76 → 0.0.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/README.md +143 -107
  2. package/client/dist/assets/ActionBar-Du2MSFSz.js +1 -0
  3. package/client/dist/assets/ApiKeyInput-k2LBmBjb.js +1 -0
  4. package/client/dist/assets/ApiKeyPanel-C_bV9U0X.js +1 -0
  5. package/client/dist/assets/ApiUsageSection-CmVfwZzL.js +1 -0
  6. package/client/dist/assets/EmailPanel-CeKIMGu-.js +1 -0
  7. package/client/dist/assets/OAuthPanel-KA3t3Q2K.js +1 -0
  8. package/client/dist/assets/QrPairingPanel-NgNpJNuk.js +1 -0
  9. package/client/dist/assets/RateLimitSection-Du5YNVIA.js +1 -0
  10. package/client/dist/assets/StatusCard-DNLyayXc.js +1 -0
  11. package/client/dist/assets/index-DQ0nwhec.js +257 -0
  12. package/client/dist/assets/index-DxmbVskS.css +1 -0
  13. package/client/dist/assets/vendor-flow-CZmBvHRo.js +1 -0
  14. package/client/dist/assets/vendor-icons-CVrPjN2Q.js +22 -0
  15. package/client/dist/assets/vendor-markdown-CRou3yQ5.js +62 -0
  16. package/client/dist/assets/vendor-misc-C4VxKHs5.js +1 -0
  17. package/client/dist/assets/vendor-query-SzWcOU0G.js +1 -0
  18. package/client/dist/assets/vendor-radix-Dnos29jG.js +56 -0
  19. package/client/dist/assets/vendor-react-DvWIbVx0.js +1 -0
  20. package/client/dist/index.html +37 -3
  21. package/client/index.html +28 -1
  22. package/client/package.json +44 -40
  23. package/client/src/App.tsx +2 -0
  24. package/client/src/Dashboard.tsx +157 -45
  25. package/client/src/ParameterPanel.tsx +3 -5
  26. package/client/src/adapters/nodeSpecToDescription.ts +1 -0
  27. package/client/src/assets/icons/NodeIcon.tsx +32 -0
  28. package/client/src/assets/icons/index.ts +4 -0
  29. package/client/src/assets/icons/stripe.svg +1 -0
  30. package/client/src/assets/icons/themedGlyphs.ts +404 -0
  31. package/client/src/components/AIAgentNode.tsx +77 -53
  32. package/client/src/components/GenericNode.tsx +34 -52
  33. package/client/src/components/OutputPanel.tsx +64 -147
  34. package/client/src/components/ParameterRenderer.tsx +5 -3
  35. package/client/src/components/SkillEditorModal.tsx +9 -18
  36. package/client/src/components/SquareNode.tsx +97 -115
  37. package/client/src/components/StartNode.tsx +32 -42
  38. package/client/src/components/SvgFilterDefs.tsx +54 -0
  39. package/client/src/components/TeamMonitorNode.tsx +12 -14
  40. package/client/src/components/ToolkitNode.tsx +35 -60
  41. package/client/src/components/TriggerNode.tsx +43 -77
  42. package/client/src/components/__tests__/CredentialsModal.test.tsx +49 -45
  43. package/client/src/components/credentials/CredentialsModal.tsx +98 -30
  44. package/client/src/components/credentials/CredentialsPalette.tsx +73 -5
  45. package/client/src/components/credentials/catalogueAdapter.ts +17 -1
  46. package/client/src/components/credentials/panels/ApiKeyPanel.tsx +102 -37
  47. package/client/src/components/credentials/panels/EmailPanel.tsx +7 -19
  48. package/client/src/components/credentials/panels/OAuthPanel.tsx +5 -1
  49. package/client/src/components/credentials/panels/QrPairingPanel.tsx +1 -3
  50. package/client/src/components/credentials/primitives/ActionBar.tsx +7 -11
  51. package/client/src/components/credentials/primitives/OAuthConnect.tsx +19 -28
  52. package/client/src/components/credentials/sections/ProviderDefaultsSection.tsx +24 -3
  53. package/client/src/components/credentials/types.ts +12 -2
  54. package/client/src/components/credentials/useCredentialPanel.ts +43 -19
  55. package/client/src/components/icons/AIProviderIcons.tsx +16 -0
  56. package/client/src/components/onboarding/OnboardingWizard.tsx +23 -63
  57. package/client/src/components/onboarding/nodeRoleClasses.ts +23 -0
  58. package/client/src/components/onboarding/steps/CanvasStep.tsx +15 -21
  59. package/client/src/components/onboarding/steps/ConceptsStep.tsx +2 -11
  60. package/client/src/components/onboarding/steps/GetStartedStep.tsx +2 -10
  61. package/client/src/components/parameterPanel/InputSection.tsx +9 -7
  62. package/client/src/components/parameterPanel/MasterSkillEditor.tsx +84 -198
  63. package/client/src/components/parameterPanel/MiddleSection.tsx +57 -80
  64. package/client/src/components/parameterPanel/ToolSchemaEditor.tsx +31 -25
  65. package/client/src/components/parameterPanel/__tests__/InputSection.test.tsx +7 -2
  66. package/client/src/components/ui/AIResultModal.tsx +1 -1
  67. package/client/src/components/ui/CollapsibleSection.tsx +9 -5
  68. package/client/src/components/ui/CommandPalette.tsx +147 -0
  69. package/client/src/components/ui/CommandPaletteHost.tsx +189 -0
  70. package/client/src/components/ui/ComponentItem.tsx +13 -7
  71. package/client/src/components/ui/ComponentPalette.tsx +24 -13
  72. package/client/src/components/ui/ConsolePanel.tsx +19 -11
  73. package/client/src/components/ui/DropCap.tsx +28 -0
  74. package/client/src/components/ui/EditableNodeLabel.tsx +10 -2
  75. package/client/src/components/ui/InputNodesPanel.tsx +1 -1
  76. package/client/src/components/ui/Modal.tsx +38 -6
  77. package/client/src/components/ui/OutputDisplayPanel.tsx +1 -1
  78. package/client/src/components/ui/SettingsPanel.tsx +42 -13
  79. package/client/src/components/ui/StatusBar.tsx +108 -0
  80. package/client/src/components/ui/ThemeSwitcher.tsx +109 -0
  81. package/client/src/components/ui/TopToolbar.tsx +42 -25
  82. package/client/src/components/ui/WorkflowSidebar.tsx +32 -16
  83. package/client/src/components/ui/action-button.tsx +40 -15
  84. package/client/src/components/ui/button.tsx +24 -1
  85. package/client/src/components/ui/dropdown-menu.tsx +24 -2
  86. package/client/src/components/ui/input.tsx +19 -2
  87. package/client/src/components/ui/select.tsx +15 -0
  88. package/client/src/components/ui/textarea.tsx +15 -2
  89. package/client/src/contexts/AuthContext.tsx +148 -109
  90. package/client/src/contexts/ThemeContext.tsx +93 -17
  91. package/client/src/contexts/WebSocketContext.tsx +373 -206
  92. package/client/src/contexts/__tests__/AuthContext.test.tsx +221 -0
  93. package/client/src/hooks/__tests__/useDragVariable.test.ts +7 -1
  94. package/client/src/hooks/__tests__/useWorkflowOpsListener.test.ts +142 -0
  95. package/client/src/hooks/useAppTheme.ts +209 -7
  96. package/client/src/hooks/useAutoSkillEdges.ts +7 -2
  97. package/client/src/hooks/useCatalogueQuery.ts +67 -1
  98. package/client/src/hooks/useDragVariable.ts +1 -1
  99. package/client/src/hooks/useNodeAllowlist.ts +115 -8
  100. package/client/src/hooks/useOnboarding.ts +20 -8
  101. package/client/src/hooks/useParameterPanel.ts +2 -1
  102. package/client/src/hooks/useReactFlowNodes.ts +2 -1
  103. package/client/src/hooks/useSound.ts +185 -0
  104. package/client/src/hooks/useWorkflowManagement.ts +6 -8
  105. package/client/src/hooks/useWorkflowOpsListener.ts +90 -0
  106. package/client/src/index.css +65 -3
  107. package/client/src/lib/__tests__/connectionConfig.test.ts +91 -0
  108. package/client/src/lib/aiModelProviders.ts +8 -0
  109. package/client/src/lib/connectionConfig.ts +107 -0
  110. package/client/src/lib/queryPersist.ts +13 -5
  111. package/client/src/lib/sound.ts +393 -0
  112. package/client/src/main.tsx +20 -0
  113. package/client/src/store/useAppStore.ts +26 -0
  114. package/client/src/styles/canvasAnimations.ts +37 -36
  115. package/client/src/styles/theme.ts +36 -20
  116. package/client/src/test/setup.ts +1 -0
  117. package/client/src/themes/atomic.css +253 -0
  118. package/client/src/themes/base.css +373 -0
  119. package/client/src/themes/cyber.css +890 -0
  120. package/client/src/themes/dark.css +70 -0
  121. package/client/src/themes/edo.css +246 -0
  122. package/client/src/themes/greek.css +293 -0
  123. package/client/src/themes/light.css +78 -0
  124. package/client/src/themes/plague.css +253 -0
  125. package/client/src/themes/renaissance.css +727 -0
  126. package/client/src/themes/rot.css +249 -0
  127. package/client/src/themes/steampunk.css +272 -0
  128. package/client/src/themes/surveillance.css +289 -0
  129. package/client/src/themes/wasteland.css +250 -0
  130. package/client/src/types/INodeProperties.ts +5 -0
  131. package/client/src/types/NodeTypes.ts +11 -1
  132. package/client/src/types/__tests__/cloudEvents.test.ts +99 -0
  133. package/client/src/types/cloudEvents.ts +78 -0
  134. package/client/src/vite-env.d.ts +7 -0
  135. package/client/tsconfig.json +1 -1
  136. package/client/vite.config.js +62 -2
  137. package/install.ps1 +1 -1
  138. package/install.sh +1 -1
  139. package/machina/commands/build.py +51 -7
  140. package/machina/pyproject.toml +4 -0
  141. package/machina/supervisor.py +12 -2
  142. package/machina/tree.py +71 -21
  143. package/package.json +4 -4
  144. package/scripts/install.js +16 -1
  145. package/server/config/ai_cli_providers.json +54 -0
  146. package/server/config/credential_providers.json +109 -2
  147. package/server/config/llm_defaults.json +24 -0
  148. package/server/config/model_registry.json +338 -499
  149. package/server/config/node_allowlist.json +16 -1
  150. package/server/config/pricing.json +8 -0
  151. package/server/constants.py +38 -15
  152. package/server/core/container.py +2 -2
  153. package/server/core/credentials_database.py +35 -2
  154. package/server/core/logging.py +4 -3
  155. package/server/main.py +99 -13
  156. package/server/models/node_metadata.py +1 -0
  157. package/server/nodejs/package.json +8 -6
  158. package/server/nodejs/src/index.ts +22 -5
  159. package/server/nodes/README.md +31 -4
  160. package/server/nodes/agent/_inline.py +2 -0
  161. package/server/nodes/agent/_specialized.py +6 -3
  162. package/server/nodes/agent/ai_agent.py +13 -3
  163. package/server/nodes/agent/chat_agent.py +6 -3
  164. package/server/nodes/agent/claude_code_agent.py +287 -75
  165. package/server/nodes/agent/codex_agent.py +239 -0
  166. package/server/nodes/agent/deep_agent.py +3 -3
  167. package/server/nodes/agent/rlm_agent.py +3 -3
  168. package/server/nodes/android/__init__.py +31 -1
  169. package/server/nodes/android/_base.py +9 -5
  170. package/server/{services/android_service.py → nodes/android/_dispatcher.py} +2 -2
  171. package/server/nodes/android/_handlers.py +154 -0
  172. package/server/nodes/android/_option_loaders.py +44 -0
  173. package/server/nodes/android/_refresh.py +127 -0
  174. package/server/{services/android → nodes/android/_relay}/client.py +4 -4
  175. package/server/{routers/android.py → nodes/android/_router.py} +27 -8
  176. package/server/nodes/browser/browser.py +2 -2
  177. package/server/nodes/code/_base.py +6 -2
  178. package/server/nodes/code/_claude_code.py +134 -0
  179. package/server/nodes/document/embedding_generator.py +3 -3
  180. package/server/nodes/document/http_scraper.py +3 -3
  181. package/server/nodes/document/vector_store.py +5 -5
  182. package/server/nodes/email/__init__.py +11 -1
  183. package/server/nodes/email/_filters.py +21 -0
  184. package/server/{services/himalaya_service.py → nodes/email/_himalaya.py} +6 -10
  185. package/server/{services/email_service.py → nodes/email/_service.py} +9 -13
  186. package/server/nodes/email/email_read.py +1 -1
  187. package/server/nodes/email/email_receive.py +54 -5
  188. package/server/nodes/email/email_send.py +1 -1
  189. package/server/nodes/filesystem/shell.py +24 -1
  190. package/server/nodes/google/__init__.py +55 -1
  191. package/server/{services/handlers/google_auth.py → nodes/google/_auth_helper.py} +8 -5
  192. package/server/nodes/google/_base.py +2 -2
  193. package/server/nodes/google/_credentials.py +5 -5
  194. package/server/nodes/google/_filters.py +25 -0
  195. package/server/nodes/google/_handlers.py +57 -0
  196. package/server/{services/google_oauth.py → nodes/google/_oauth.py} +195 -162
  197. package/server/nodes/google/_option_loaders.py +107 -0
  198. package/server/nodes/google/_refresh.py +66 -0
  199. package/server/nodes/google/_router.py +131 -0
  200. package/server/nodes/google/gmail_receive.py +41 -4
  201. package/server/nodes/groups.py +1 -0
  202. package/server/nodes/location/_credentials.py +45 -1
  203. package/server/{services/maps.py → nodes/location/_service.py} +18 -3
  204. package/server/nodes/location/gmaps_create.py +4 -4
  205. package/server/nodes/location/gmaps_locations.py +4 -4
  206. package/server/nodes/location/gmaps_nearby_places.py +4 -4
  207. package/server/nodes/model/_base.py +8 -3
  208. package/server/nodes/model/_credentials.py +96 -8
  209. package/server/nodes/model/_local_validator.py +345 -0
  210. package/server/nodes/model/lmstudio_chat_model.py +23 -0
  211. package/server/nodes/model/ollama_chat_model.py +25 -0
  212. package/server/nodes/proxy/_usage.py +2 -2
  213. package/server/nodes/proxy/proxy_config.py +14 -14
  214. package/server/nodes/proxy/proxy_request.py +4 -4
  215. package/server/nodes/scraper/_credentials.py +29 -1
  216. package/server/nodes/scraper/apify_actor.py +9 -9
  217. package/server/nodes/scraper/crawlee_scraper.py +5 -5
  218. package/server/nodes/search/brave_search.py +4 -0
  219. package/server/nodes/search/perplexity_search.py +9 -0
  220. package/server/nodes/search/serper_search.py +3 -0
  221. package/server/nodes/skill/simple_memory.py +12 -0
  222. package/server/nodes/social/_base.py +2 -2
  223. package/server/nodes/stripe/__init__.py +46 -0
  224. package/server/nodes/stripe/_credentials.py +33 -0
  225. package/server/nodes/stripe/_handlers.py +270 -0
  226. package/server/nodes/stripe/_install.py +127 -0
  227. package/server/nodes/stripe/_source.py +174 -0
  228. package/server/nodes/stripe/stripe_action.py +81 -0
  229. package/server/nodes/stripe/stripe_receive.py +92 -0
  230. package/server/nodes/telegram/_credentials.py +52 -1
  231. package/server/nodes/telegram/_handlers.py +19 -18
  232. package/server/nodes/telegram/_service.py +134 -32
  233. package/server/nodes/telegram/telegram_send.py +5 -6
  234. package/server/nodes/text/file_handler.py +2 -2
  235. package/server/nodes/text/text_generator.py +2 -2
  236. package/server/nodes/tool/agent_builder.py +630 -0
  237. package/server/nodes/tool/task_manager.py +144 -2
  238. package/server/nodes/twitter/__init__.py +38 -1
  239. package/server/nodes/twitter/_base.py +7 -7
  240. package/server/nodes/twitter/_credentials.py +1 -1
  241. package/server/nodes/twitter/_filters.py +37 -0
  242. package/server/nodes/twitter/_handlers.py +77 -0
  243. package/server/nodes/twitter/_oauth.py +124 -0
  244. package/server/nodes/twitter/_refresh.py +78 -0
  245. package/server/nodes/twitter/_router.py +29 -0
  246. package/server/nodes/twitter/twitter_receive.py +4 -0
  247. package/server/nodes/visuals.json +64 -19
  248. package/server/nodes/whatsapp/__init__.py +45 -5
  249. package/server/nodes/whatsapp/_base.py +3 -3
  250. package/server/nodes/whatsapp/_filters.py +137 -0
  251. package/server/nodes/whatsapp/_handlers.py +167 -0
  252. package/server/nodes/whatsapp/_option_loaders.py +68 -0
  253. package/server/nodes/whatsapp/_refresh.py +62 -0
  254. package/server/nodes/whatsapp/_runtime.py +1 -1
  255. package/server/pyproject.toml +29 -7
  256. package/server/routers/schemas.py +2 -2
  257. package/server/routers/webhook.py +26 -9
  258. package/server/routers/websocket.py +149 -810
  259. package/server/services/ai.py +89 -8
  260. package/server/services/auth.py +220 -43
  261. package/server/services/claude_oauth.py +126 -100
  262. package/server/services/cli_agent/__init__.py +78 -0
  263. package/server/services/cli_agent/_handlers.py +237 -0
  264. package/server/services/cli_agent/config.py +112 -0
  265. package/server/services/cli_agent/factory.py +48 -0
  266. package/server/services/cli_agent/lockfile.py +141 -0
  267. package/server/services/cli_agent/mcp_server.py +482 -0
  268. package/server/services/cli_agent/protocol.py +173 -0
  269. package/server/services/cli_agent/providers/__init__.py +9 -0
  270. package/server/services/cli_agent/providers/anthropic_claude.py +419 -0
  271. package/server/services/cli_agent/providers/google_gemini.py +80 -0
  272. package/server/services/cli_agent/providers/openai_codex.py +310 -0
  273. package/server/services/cli_agent/service.py +607 -0
  274. package/server/services/cli_agent/session.py +618 -0
  275. package/server/services/cli_agent/types.py +227 -0
  276. package/server/services/cli_agent/workflow_tools.py +233 -0
  277. package/server/services/credential_registry.py +26 -1
  278. package/server/services/deployment/manager.py +26 -145
  279. package/server/services/deployment/poll_registry.py +59 -0
  280. package/server/services/event_waiter.py +76 -246
  281. package/server/services/events/__init__.py +54 -0
  282. package/server/services/events/cli.py +78 -0
  283. package/server/services/events/daemon.py +163 -0
  284. package/server/services/events/envelope.py +281 -0
  285. package/server/services/events/lifecycle.py +99 -0
  286. package/server/services/events/oauth_lifecycle.py +534 -0
  287. package/server/services/events/polling.py +60 -0
  288. package/server/services/events/push.py +36 -0
  289. package/server/services/events/source.py +63 -0
  290. package/server/services/events/triggers.py +118 -0
  291. package/server/services/events/verifiers/__init__.py +25 -0
  292. package/server/services/events/verifiers/base.py +28 -0
  293. package/server/services/events/verifiers/github.py +25 -0
  294. package/server/services/events/verifiers/hmac_basic.py +32 -0
  295. package/server/services/events/verifiers/standard_webhooks.py +47 -0
  296. package/server/services/events/verifiers/stripe.py +42 -0
  297. package/server/services/events/webhook.py +105 -0
  298. package/server/services/handlers/tools.py +28 -186
  299. package/server/services/llm/config.py +7 -0
  300. package/server/services/llm/factory.py +8 -2
  301. package/server/services/memory/__init__.py +52 -0
  302. package/server/services/memory/jsonl.py +80 -0
  303. package/server/services/memory/markdown.py +65 -0
  304. package/server/services/memory/state.py +112 -0
  305. package/server/services/memory/vector_store.py +40 -0
  306. package/server/services/model_registry.py +76 -0
  307. package/server/services/node_allowlist.py +71 -15
  308. package/server/services/node_executor.py +2 -2
  309. package/server/services/node_output_schemas.py +21 -10
  310. package/server/services/node_spec.py +1 -1
  311. package/server/services/oauth_utils.py +1 -1
  312. package/server/services/plugin/__init__.py +2 -0
  313. package/server/services/plugin/base.py +44 -2
  314. package/server/services/plugin/credential.py +288 -1
  315. package/server/services/plugin/deps.py +105 -0
  316. package/server/services/plugin/edge_walker.py +12 -4
  317. package/server/services/plugin/oauth.py +381 -0
  318. package/server/services/plugin/polling.py +247 -0
  319. package/server/services/plugin/registry.py +145 -0
  320. package/server/services/plugin/singleton.py +65 -0
  321. package/server/services/plugin/ws.py +81 -0
  322. package/server/services/process_service.py +31 -2
  323. package/server/services/status_broadcaster.py +155 -238
  324. package/server/services/temporal/workflow.py +7 -7
  325. package/server/services/workflow.py +21 -3
  326. package/server/services/ws_handler_registry.py +111 -28
  327. package/server/skills/GUIDE.md +16 -1
  328. package/server/skills/assistant/agent-builder-skill/SKILL.md +166 -0
  329. package/server/skills/payments_agent/stripe-skill/SKILL.md +306 -0
  330. package/server/tests/credentials/test_auth_service.py +16 -9
  331. package/server/tests/credentials/test_credential_broadcasts.py +219 -0
  332. package/server/tests/credentials/test_google_oauth.py +6 -6
  333. package/server/tests/credentials/test_oauth_utils.py +1 -1
  334. package/server/tests/credentials/test_twitter_oauth.py +2 -2
  335. package/server/tests/credentials/test_websocket_handlers.py +44 -20
  336. package/server/tests/llm/test_factory.py +1 -0
  337. package/server/tests/llm/test_wiring.py +5 -1
  338. package/server/tests/nodes/_compat.py +24 -24
  339. package/server/tests/nodes/test_agent_builder.py +439 -0
  340. package/server/tests/nodes/test_ai_tools.py +18 -14
  341. package/server/tests/nodes/test_code_fs_process.py +17 -8
  342. package/server/tests/nodes/test_email.py +10 -9
  343. package/server/tests/nodes/test_google_workspace.py +2 -2
  344. package/server/tests/nodes/test_specialized_agents.py +100 -53
  345. package/server/tests/nodes/test_stripe_plugin.py +293 -0
  346. package/server/tests/nodes/test_telegram_social.py +4 -4
  347. package/server/tests/nodes/test_twitter.py +1 -1
  348. package/server/tests/nodes/test_web_automation.py +2 -2
  349. package/server/tests/nodes/test_whatsapp.py +9 -9
  350. package/server/tests/services/cli_agent/__init__.py +0 -0
  351. package/server/tests/services/cli_agent/test_mcp_server.py +432 -0
  352. package/server/tests/services/cli_agent/test_providers.py +358 -0
  353. package/server/tests/services/cli_agent/test_service.py +298 -0
  354. package/server/tests/services/memory/__init__.py +0 -0
  355. package/server/tests/services/memory/test_jsonl.py +188 -0
  356. package/server/tests/services/test_events.py +333 -0
  357. package/server/tests/test_node_spec.py +56 -16
  358. package/server/tests/test_plugin_helpers.py +116 -0
  359. package/server/tests/test_plugin_self_containment.py +486 -0
  360. package/server/tests/test_status_broadcasts.py +425 -0
  361. package/workflows/{AI Assistant_workflow-1777421105154-0m4snkzjf.json → AI Assistant_workflow-1778504793388-ou1m1tz2x.json } +70 -266
  362. package/workflows/{AI Employee_workflow-1777720598005-u4cm858dv.json → AI Employee_example_workflow-1777720598005-u4cm858dv.json } +112 -112
  363. package/workflows/Claude Assistant_workflow-1778380124051-mdibn807c.json +709 -0
  364. package/client/dist/assets/ActionBar-vzPpSR77.js +0 -1
  365. package/client/dist/assets/ApiKeyInput-Ds7AKFe8.js +0 -1
  366. package/client/dist/assets/ApiKeyPanel-gfblELep.js +0 -1
  367. package/client/dist/assets/ApiUsageSection-BMNWTe2r.js +0 -1
  368. package/client/dist/assets/EmailPanel-B1Om64p5.js +0 -1
  369. package/client/dist/assets/OAuthPanel-CXyQYGBz.js +0 -1
  370. package/client/dist/assets/QrPairingPanel-BgNuI1we.js +0 -1
  371. package/client/dist/assets/RateLimitSection-YYK8sx1T.js +0 -1
  372. package/client/dist/assets/StatusCard-DuYA5hJR.js +0 -1
  373. package/client/dist/assets/index-D9tZfgvi.js +0 -363
  374. package/client/dist/assets/index-al7snTkG.css +0 -1
  375. package/client/src/components/credentials/providers.tsx +0 -177
  376. package/server/routers/google.py +0 -277
  377. package/server/routers/maps.py +0 -142
  378. package/server/routers/twitter.py +0 -365
  379. package/server/services/claude_code_service.py +0 -106
  380. package/server/services/memory.py +0 -159
  381. package/server/services/node_option_loaders/__init__.py +0 -77
  382. package/server/services/node_option_loaders/android_loaders.py +0 -55
  383. package/server/services/node_option_loaders/google_loaders.py +0 -97
  384. package/server/services/node_option_loaders/whatsapp_loaders.py +0 -69
  385. package/server/services/twitter_oauth.py +0 -411
  386. package/server/services/websocket_client.py +0 -29
  387. /package/server/{services/android → nodes/android/_relay}/__init__.py +0 -0
  388. /package/server/{services/android → nodes/android/_relay}/broadcaster.py +0 -0
  389. /package/server/{services/android → nodes/android/_relay}/manager.py +0 -0
  390. /package/server/{services/android → nodes/android/_relay}/protocol.py +0 -0
  391. /package/server/{services/browser_service.py → nodes/browser/_service.py} +0 -0
  392. /package/server/{services/whatsapp_service.py → nodes/whatsapp/_service.py} +0 -0
  393. /package/server/skills/{task_agent → assistant}/write-todos-skill/SKILL.md +0 -0
@@ -0,0 +1,78 @@
1
+ /**
2
+ * CloudEvents v1.0 envelope — mirrors the backend Pydantic `WorkflowEvent`
3
+ * (`server/services/events/envelope.py`) so the FE can statically type
4
+ * payloads broadcast over the WebSocket without falling back to `any`.
5
+ *
6
+ * Spec: https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md
7
+ *
8
+ * Wire shape on the WebSocket today (preserved end-to-end across the
9
+ * PartySocket / TanStack-Query swap):
10
+ *
11
+ * {
12
+ * "type": "credential_catalogue_updated", // legacy outer routing key
13
+ * "data": {
14
+ * "specversion": "1.0",
15
+ * "id": "<uuid>",
16
+ * "source": "machinaos://services/credentials",
17
+ * "type": "credential.api_key.saved", // CloudEvents `type`
18
+ * "time": "2026-05-06T12:34:56.789Z",
19
+ * "subject": "openai",
20
+ * "datacontenttype": "application/json",
21
+ * "data": { "provider": "openai", ... }
22
+ * }
23
+ * }
24
+ *
25
+ * Future Wave 12 sources (`stripe.*`, `telegram.*`, `task.*`) will use the
26
+ * same envelope. The `matchesType` helper provides server-parity glob
27
+ * dispatch (mirrors `WorkflowEvent.matches_type` in envelope.py).
28
+ *
29
+ * Pytest invariant `server/tests/test_credential_broadcasts.py` locks the
30
+ * backend shape; the FE vitest counterpart locks this interface.
31
+ */
32
+
33
+ export interface WorkflowEvent<TData = unknown> {
34
+ // CloudEvents v1.0 required fields (ordered to match envelope.py).
35
+ specversion: '1.0';
36
+ id: string;
37
+ source: string;
38
+ type: string;
39
+ /**
40
+ * ISO 8601 string. The backend serialises `datetime` via Pydantic's
41
+ * `model_dump(mode="json")` which produces RFC 3339 UTC timestamps.
42
+ */
43
+ time: string;
44
+ subject?: string;
45
+ datacontenttype?: string;
46
+ dataschema?: string;
47
+ data: TData;
48
+
49
+ // CloudEvents extension attributes used by MachinaOs.
50
+ // `model_config = ConfigDict(extra="allow")` on the Pydantic side means
51
+ // additional fields may appear and should be tolerated; cast through
52
+ // `WorkflowEvent<T> & {extra?: unknown}` if you need to read them.
53
+ workflow_id?: string | null;
54
+ trigger_node_id?: string | null;
55
+ correlation_id?: string | null;
56
+ }
57
+
58
+ /**
59
+ * Glob-style match on the CloudEvents `type` field.
60
+ *
61
+ * Mirrors `WorkflowEvent.matches_type` in `server/services/events/envelope.py`.
62
+ * Test parity is locked by `client/src/types/__tests__/cloudEvents.test.ts`
63
+ * vs the corresponding pytest cases.
64
+ *
65
+ * matchesType(e, 'stripe.charge.succeeded') // exact
66
+ * matchesType(e, 'stripe.charge.*') // prefix glob
67
+ * matchesType(e, 'stripe.*') // prefix glob (1 segment)
68
+ * matchesType(e, 'all') // wildcard
69
+ * matchesType(e, '') // wildcard
70
+ */
71
+ export function matchesType(event: WorkflowEvent, pattern: string): boolean {
72
+ if (!pattern || pattern === 'all') return true;
73
+ if (pattern.endsWith('.*')) {
74
+ const prefix = pattern.slice(0, -2);
75
+ return event.type === prefix || event.type.startsWith(prefix + '.');
76
+ }
77
+ return event.type === pattern;
78
+ }
@@ -1,4 +1,11 @@
1
1
  /// <reference types="vite/client" />
2
+ /// <reference types="google.maps" />
3
+ // `google.maps` namespace is exposed via @types/google.maps. tsc 5.x
4
+ // auto-loads all @types/* packages, but tsgo (TypeScript 7 native
5
+ // preview) does not pick the namespace up reliably under pnpm's
6
+ // symlinked node_modules layout — the explicit reference here is the
7
+ // canonical fix per https://developers.google.com/maps/documentation/javascript/using-typescript
8
+ // and works for both compilers.
2
9
 
3
10
  interface ImportMetaEnv {
4
11
  readonly VITE_ANDROID_RELAY_URL: string;
@@ -19,7 +19,7 @@
19
19
  "noUnusedLocals": true,
20
20
  "noUnusedParameters": true,
21
21
  "noFallthroughCasesInSwitch": true,
22
- "baseUrl": ".",
22
+ "typeRoots": ["./node_modules/@types"],
23
23
  "paths": {
24
24
  "@/*": ["./src/*"]
25
25
  }
@@ -94,12 +94,72 @@ export default defineConfig(({ mode }) => {
94
94
  host: true
95
95
  },
96
96
  build: {
97
- // antd + reactflow are large libraries - this is expected
98
- chunkSizeWarningLimit: 1500,
97
+ // ES2022 unlocks native `findLast`, optional-chaining-assignment,
98
+ // class-fields without polyfills. Browser baseline: Chrome 94+,
99
+ // Firefox 93+, Safari 15.4+ — within React 19 / Tailwind 4's range.
100
+ target: 'es2022',
101
+ // Lowered from 1500 KB once manualChunks splits out the heavy libs.
102
+ // 850 KB covers the largest legitimate chunk today (`vendor-icons`,
103
+ // ~800 KB raw / 210 KB gz from lucide-react + @lobehub/icons brand
104
+ // SVGs that resist tree-shaking). The cap still catches new chunk
105
+ // bloat in the entry / route bundles.
106
+ chunkSizeWarningLimit: 850,
99
107
  // Emit sourcemaps only when running the bundle analyzer so the
100
108
  // visualizer can attribute bytes to source files accurately.
101
109
  // Skipped in normal production builds to keep build time down.
102
110
  sourcemap: analyze,
111
+ rollupOptions: {
112
+ output: {
113
+ // Split heavy npm libs into their own cacheable chunks so the
114
+ // main bundle stays lean and unrelated dependency churn doesn't
115
+ // bust the user's cache. Group rationale:
116
+ // vendor-react — core framework + form runtime
117
+ // vendor-flow — reactflow is huge and only canvas pages use it
118
+ // vendor-radix — accessibility primitives, used widely
119
+ // vendor-icons — lucide + lobehub brand icons
120
+ // vendor-query — TanStack Query + persistence
121
+ // vendor-markdown — markdown rendering stack (chat / docs panels)
122
+ // vendor-misc — small but heavyweight utilities
123
+ // Anything not listed falls into the default route/entry chunks.
124
+ manualChunks: {
125
+ 'vendor-react': [
126
+ 'react',
127
+ 'react-dom',
128
+ 'react-hook-form',
129
+ '@hookform/resolvers',
130
+ ],
131
+ 'vendor-flow': ['reactflow'],
132
+ 'vendor-radix': [
133
+ 'radix-ui',
134
+ '@radix-ui/react-collapsible',
135
+ '@radix-ui/react-dialog',
136
+ '@radix-ui/react-slot',
137
+ ],
138
+ 'vendor-icons': ['lucide-react', '@lobehub/icons'],
139
+ 'vendor-query': [
140
+ '@tanstack/react-query',
141
+ '@tanstack/query-sync-storage-persister',
142
+ '@tanstack/react-query-persist-client',
143
+ '@lukemorales/query-key-factory',
144
+ ],
145
+ 'vendor-markdown': [
146
+ 'react-markdown',
147
+ 'remark-gfm',
148
+ 'remark-breaks',
149
+ 'prismjs',
150
+ 'react-simple-code-editor',
151
+ '@uiw/react-json-view',
152
+ ],
153
+ 'vendor-misc': [
154
+ 'idb-keyval',
155
+ 'fuzzysort',
156
+ 'cmdk',
157
+ 'sonner',
158
+ 'qrcode.react',
159
+ ],
160
+ },
161
+ },
162
+ },
103
163
  },
104
164
  }
105
165
  })
package/install.ps1 CHANGED
@@ -1,5 +1,5 @@
1
1
  # MachinaOS Installer for Windows
2
- # Usage: iwr -useb https://raw.githubusercontent.com/trohitg/MachinaOS/main/install.ps1 | iex
2
+ # Usage: iwr -useb https://raw.githubusercontent.com/zeenie-ai/MachinaOS/main/install.ps1 | iex
3
3
  #
4
4
  # This script installs MachinaOS and its dependencies:
5
5
  # - Node.js 22+ (via winget/choco)
package/install.sh CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env bash
2
2
  # MachinaOS Installer
3
- # Usage: curl -fsSL https://raw.githubusercontent.com/trohitg/MachinaOS/main/install.sh | bash
3
+ # Usage: curl -fsSL https://raw.githubusercontent.com/zeenie-ai/MachinaOS/main/install.sh | bash
4
4
  #
5
5
  # This script installs MachinaOS and its dependencies:
6
6
  # - Node.js 22+ (via brew/apt/dnf/pacman)
@@ -23,6 +23,25 @@ from machina.colors import console
23
23
  from machina.platform_ import project_root
24
24
 
25
25
 
26
+ # Source dirs / entry-point modules under ``server/`` that ``machina build``
27
+ # pre-compiles to optimised bytecode in step [5/6]. Public so tests and
28
+ # ``scripts/install.js`` (which mirrors this list) stay in sync — both
29
+ # the install pipeline and tests should read this constant rather than
30
+ # duplicate the list. Excludes ``.venv/`` (uv compiles deps at install
31
+ # time and some site-packages contain non-Python templates) and
32
+ # ``tests/`` (ships outside the production tarball).
33
+ COMPILEALL_SOURCE_DIRS: tuple[str, ...] = (
34
+ "services",
35
+ "core",
36
+ "nodes",
37
+ "routers",
38
+ "models",
39
+ "middleware",
40
+ "main.py",
41
+ "constants.py",
42
+ )
43
+
44
+
26
45
  # ---------------------------------------------------------------- helpers
27
46
 
28
47
  def _which_python() -> str | None:
@@ -135,28 +154,53 @@ def build_command() -> None:
135
154
  env_path = root / ".env"
136
155
  template_path = root / ".env.template"
137
156
 
138
- # Step markers go through ``console.log`` so each [N/5] line is
157
+ # Step markers go through ``console.log`` so each [N/6] line is
139
158
  # timestamped — diff between consecutive timestamps is the wall-clock
140
159
  # cost of that step, no manual instrumentation needed.
141
160
  if not env_path.exists() and template_path.exists():
142
161
  shutil.copy2(template_path, env_path)
143
- console.log("[0/5] Created .env from template")
162
+ console.log("[0/6] Created .env from template")
144
163
 
145
164
  if not is_postinstall:
146
- console.log("[1/5] Installing dependencies...")
165
+ console.log("[1/6] Installing dependencies...")
147
166
  run(["pnpm", "install"], cwd=root)
148
167
  else:
149
- console.log("[1/5] Dependencies already installed by package manager")
168
+ console.log("[1/6] Dependencies already installed by package manager")
150
169
 
151
- console.log("[2/5] Building client...")
170
+ console.log("[2/6] Building client...")
152
171
  run(["pnpm", "--filter", "react-flow-client", "run", "build"], cwd=root)
153
172
 
154
- console.log("[3/4] Installing Python dependencies...")
173
+ # Pre-bundle the Node.js sidecar (server/nodejs) with esbuild so the
174
+ # production `npm start` runs `node dist/index.js` instead of
175
+ # interpreting `tsx src/index.ts`. Saves ~500ms-1s of cold start
176
+ # whenever the executor is launched. The bundle keeps Express
177
+ # external (it stays in node_modules), so the patch flow is intact.
178
+ console.log("[3/6] Building Node.js sidecar...")
179
+ run(["pnpm", "--filter", "machinaos-nodejs-executor", "run", "build"], cwd=root)
180
+
181
+ console.log("[4/6] Installing Python dependencies...")
155
182
  if not (server_dir / ".venv").exists():
156
183
  run(["uv", "venv"], cwd=server_dir)
157
184
  run(["uv", "sync"], cwd=server_dir)
158
185
 
159
- console.log("[4/4] Verifying edgymeow binary...")
186
+ # Pre-compile our Python sources to optimised bytecode (.opt-1.pyc).
187
+ # `-O` strips `assert` statements + `__debug__` branches; `-q`
188
+ # silences per-file output (errors still print); `-j 0` parallelises
189
+ # across all CPU cores. Cuts a measurable few seconds off cold
190
+ # start by avoiding source-to-bytecode work on first import.
191
+ #
192
+ # Scoped to the project's own source dirs — `uv sync` already
193
+ # compiles `.venv/` packages, and `tests/` ships outside the
194
+ # tarball. Compiling `.venv/` is wasted work and fails on cookiecutter
195
+ # template files inside packages like crawlee that aren't real Python.
196
+ console.log("[5/6] Compiling Python bytecode...")
197
+ run(
198
+ ["uv", "run", "python", "-O", "-m", "compileall", "-q", "-j", "0", *COMPILEALL_SOURCE_DIRS],
199
+ cwd=server_dir,
200
+ check=False, # missing pyc is non-fatal — runtime regenerates as needed
201
+ )
202
+
203
+ console.log("[6/6] Verifying edgymeow binary...")
160
204
  bin_name = "edgymeow-server.exe" if sys.platform == "win32" else "edgymeow-server"
161
205
  edgymeow_bin = root / "node_modules" / "edgymeow" / "bin" / bin_name
162
206
  if edgymeow_bin.exists():
@@ -9,6 +9,10 @@ dependencies = [
9
9
  "psutil>=6",
10
10
  "anyio>=4",
11
11
  "python-dotenv>=1",
12
+ # Required on Windows for the supervisor's Job Object (machina/tree.py).
13
+ # Without it, child processes survive abnormal supervisor exit (SIGKILL,
14
+ # BSOD, console close) and accumulate as orphans across dev restarts.
15
+ # Floor 308 is the first release shipping prebuilt wheels for Python 3.13.
12
16
  "pywin32>=308; platform_system == 'Windows'",
13
17
  ]
14
18
 
@@ -287,9 +287,19 @@ class Manager:
287
287
  stderr=subprocess.PIPE,
288
288
  **spawn_kwargs,
289
289
  ) as proc:
290
- if sys.platform == "win32":
291
- add_to_job(proc.pid)
292
290
  color = spec.color or "white"
291
+ if sys.platform == "win32":
292
+ # Best-effort enrollment in the supervisor's Job Object so
293
+ # the OS tree-kills the child if the supervisor itself
294
+ # dies abnormally. Loud warning (from tree.py) on failure.
295
+ if not add_to_job(proc.pid):
296
+ emit(
297
+ spec.name,
298
+ "yellow",
299
+ f"WARN: pid={proc.pid} not enrolled in Job Object -- "
300
+ f"orphan risk if supervisor crashes",
301
+ stream="stderr",
302
+ )
293
303
  emit(spec.name, color, f"started pid={proc.pid}")
294
304
  # Register for force-kill access on second Ctrl-C; deregister on
295
305
  # exit so a restarted-then-died service doesn't leave a stale entry.
package/machina/tree.py CHANGED
@@ -48,40 +48,90 @@ def signal_group(pid: int, sig: signal.Signals = signal.SIGTERM) -> None:
48
48
  # ---------------------------------------------------------------- Windows Job Object
49
49
 
50
50
  class _JobObject:
51
- """Lazy-imported wrapper around a Windows Job Object."""
51
+ """Lazy-imported wrapper around a Windows Job Object.
52
52
 
53
+ Failure modes are surfaced to stderr instead of swallowed. When this
54
+ fails the supervisor cannot tree-kill children if it itself dies
55
+ abnormally (SIGKILL, BSOD, console close), so silent failure leads
56
+ directly to orphan-process accumulation on Windows.
57
+ """
58
+
59
+ # Win10/11 supports nested jobs, but the parent must allow it. When
60
+ # the supervisor was launched from another process that already put
61
+ # us inside a Job Object (npm/pnpm/conhost wrappers occasionally do
62
+ # this), AssignProcessToJobObject succeeds at the API level but the
63
+ # child silently lands in the OUTER job, not ours. We detect that
64
+ # via IsProcessInJob in ``add()`` and warn explicitly.
53
65
  def __init__(self) -> None:
54
66
  self._handle = None
55
67
  self._win32job = None
56
- if sys.platform == "win32":
57
- try:
58
- import win32job # type: ignore[import-not-found]
59
-
60
- self._win32job = win32job
61
- self._handle = win32job.CreateJobObject(None, "")
62
- info = win32job.QueryInformationJobObject(
63
- self._handle, win32job.JobObjectExtendedLimitInformation
64
- )
65
- info["BasicLimitInformation"]["LimitFlags"] |= (
66
- win32job.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
67
- )
68
- win32job.SetInformationJobObject(
69
- self._handle, win32job.JobObjectExtendedLimitInformation, info
70
- )
71
- except Exception: # pywin32 missing or denied
72
- self._handle = None
68
+ if sys.platform != "win32":
69
+ return
70
+ try:
71
+ import win32job # type: ignore[import-not-found]
72
+ except ImportError as e:
73
+ sys.stderr.write(
74
+ f"[supervisor] WARN: pywin32 import failed ({e}). "
75
+ f"Children will NOT be tree-killed if the supervisor dies "
76
+ f"abnormally on Windows. Reinstall via: pip install --force-reinstall pywin32\n"
77
+ )
78
+ return
79
+ try:
80
+ self._win32job = win32job
81
+ self._handle = win32job.CreateJobObject(None, "")
82
+ info = win32job.QueryInformationJobObject(
83
+ self._handle, win32job.JobObjectExtendedLimitInformation
84
+ )
85
+ info["BasicLimitInformation"]["LimitFlags"] |= (
86
+ win32job.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
87
+ )
88
+ win32job.SetInformationJobObject(
89
+ self._handle, win32job.JobObjectExtendedLimitInformation, info
90
+ )
91
+ except Exception as e:
92
+ sys.stderr.write(
93
+ f"[supervisor] WARN: Job Object init failed: {e!r}. "
94
+ f"Tree-kill on abnormal supervisor exit will not work.\n"
95
+ )
96
+ self._handle = None
97
+ self._win32job = None
73
98
 
74
99
  def add(self, pid: int) -> bool:
75
- """Enroll ``pid`` in the job. Returns False when unavailable."""
100
+ """Enroll ``pid`` in the job. Returns False when enrollment did
101
+ not actually take effect.
102
+
103
+ ``AssignProcessToJobObject`` can return success even when the
104
+ child remains in a different job (inherited from an outer
105
+ wrapper that doesn't allow nesting). We verify with
106
+ ``IsProcessInJob`` so the caller learns the truth.
107
+ """
76
108
  if self._handle is None or self._win32job is None:
77
109
  return False
78
110
  try:
79
111
  import win32api # type: ignore[import-not-found]
80
-
112
+ except ImportError as e:
113
+ sys.stderr.write(f"[supervisor] WARN: win32api import failed ({e})\n")
114
+ return False
115
+ try:
116
+ # PROCESS_ALL_ACCESS = 0x1F0FFF
81
117
  handle = win32api.OpenProcess(0x1F0FFF, False, pid)
82
118
  self._win32job.AssignProcessToJobObject(self._handle, handle)
119
+ in_our_job = self._win32job.IsProcessInJob(handle, self._handle)
120
+ if not in_our_job:
121
+ in_some_job = self._win32job.IsProcessInJob(handle, None)
122
+ sys.stderr.write(
123
+ f"[supervisor] WARN: pid={pid} did not enter our Job Object "
124
+ f"(already in another job: {in_some_job}). Likely cause: "
125
+ f"this supervisor was launched from a wrapper (npm/pnpm/conhost) "
126
+ f"whose own Job Object disallows nesting. Tree-kill on abnormal "
127
+ f"supervisor exit will not reach this child.\n"
128
+ )
129
+ return False
83
130
  return True
84
- except Exception:
131
+ except Exception as e:
132
+ sys.stderr.write(
133
+ f"[supervisor] WARN: AssignProcessToJobObject(pid={pid}) failed: {e!r}\n"
134
+ )
85
135
  return False
86
136
 
87
137
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "machinaos",
3
- "version": "0.0.76",
3
+ "version": "0.0.78",
4
4
  "description": "Open source workflow automation platform with AI agents, React Flow, and n8n-inspired architecture",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -18,13 +18,13 @@
18
18
  ],
19
19
  "author": "Rohit G <trohitg@gmail.com>",
20
20
  "license": "MIT",
21
- "homepage": "https://github.com/trohitg/MachinaOS#readme",
21
+ "homepage": "https://github.com/zeenie-ai/MachinaOS#readme",
22
22
  "repository": {
23
23
  "type": "git",
24
- "url": "git+https://github.com/trohitg/MachinaOS.git"
24
+ "url": "git+https://github.com/zeenie-ai/MachinaOS.git"
25
25
  },
26
26
  "bugs": {
27
- "url": "https://github.com/trohitg/MachinaOS/issues"
27
+ "url": "https://github.com/zeenie-ai/MachinaOS/issues"
28
28
  },
29
29
  "bin": {
30
30
  "machina": "./bin/cli.js"
@@ -159,7 +159,7 @@ try {
159
159
  // Calculate total steps
160
160
  let totalSteps = 1; // .env always
161
161
  if (!clientDistExists) totalSteps += 2; // client deps + build
162
- totalSteps += 1; // Python deps always
162
+ totalSteps += 2; // Python deps + bytecode compile
163
163
  let step = 0;
164
164
 
165
165
  // Create .env if needed
@@ -198,6 +198,21 @@ try {
198
198
  }
199
199
  run('uv sync', serverDir, 600000); // 10 min timeout
200
200
 
201
+ // Pre-compile our Python sources to optimised bytecode (.opt-1.pyc).
202
+ // `-O` strips assertions and `__debug__` branches; `-q` silences
203
+ // per-file output; `-j 0` parallelises across CPU cores. Scoped to
204
+ // our own source dirs — `uv sync` already compiles `.venv/` and
205
+ // some site-packages contain non-Python template files that would
206
+ // log spurious errors. Failure is non-fatal: the runtime regenerates
207
+ // missing .pyc on first import. Trims a few seconds off cold start.
208
+ step++;
209
+ console.log(`[${step}/${totalSteps}] Compiling Python bytecode...`);
210
+ try {
211
+ run('uv run python -O -m compileall -q -j 0 services core nodes routers models middleware main.py constants.py', serverDir, 120000);
212
+ } catch (err) {
213
+ console.log(` Warning: bytecode compilation failed (non-fatal): ${err.message}`);
214
+ }
215
+
201
216
  // WhatsApp RPC is now an npm dependency - binary downloaded via postinstall
202
217
  console.log('');
203
218
  console.log('Done!');
@@ -0,0 +1,54 @@
1
+ {
2
+ "claude": {
3
+ "package_name": "@anthropic-ai/claude-code",
4
+ "binary_name": "claude",
5
+ "login_argv": ["claude", "login"],
6
+ "auth_status_argv": ["claude", "--print", "-p", "ok"],
7
+ "ide_lock_env_var": "CLAUDE_IDE_LOCK",
8
+ "ide_lockfile_dir": "~/.claude/ide",
9
+ "default_model": "claude-sonnet-4-6",
10
+ "default_max_turns": 10,
11
+ "default_max_budget_usd": 5.0,
12
+ "default_allowed_tools": "Read,Edit,Bash,Glob,Grep,Write,Skill,WebSearch,WebFetch",
13
+ "default_permission_mode": "acceptEdits",
14
+ "supports": [
15
+ "max_budget",
16
+ "max_turns",
17
+ "session_id",
18
+ "resume",
19
+ "mcp_runtime",
20
+ "json_cost",
21
+ "ide_lockfile"
22
+ ]
23
+ },
24
+ "codex": {
25
+ "package_name": "@openai/codex",
26
+ "binary_name": "codex",
27
+ "login_argv": ["codex", "login"],
28
+ "auth_status_argv": ["codex", "--version"],
29
+ "ide_lock_env_var": null,
30
+ "ide_lockfile_dir": null,
31
+ "default_model": "gpt-5.2-codex",
32
+ "default_sandbox": "workspace-write",
33
+ "default_ask_for_approval": "never",
34
+ "supports": [
35
+ "sandbox"
36
+ ]
37
+ },
38
+ "gemini": {
39
+ "package_name": "@google/gemini-cli",
40
+ "binary_name": "gemini",
41
+ "login_argv": ["gemini", "auth", "login"],
42
+ "auth_status_argv": ["gemini", "--version"],
43
+ "ide_lock_env_var": "GEMINI_IDE_LOCK",
44
+ "ide_lockfile_dir": "<tmpdir>/gemini/ide",
45
+ "default_model": "gemini-2.5-pro",
46
+ "supports": [
47
+ "session_id",
48
+ "resume",
49
+ "sandbox",
50
+ "mcp_runtime",
51
+ "ide_lockfile"
52
+ ]
53
+ }
54
+ }