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.
- package/README.md +143 -107
- package/client/dist/assets/ActionBar-Du2MSFSz.js +1 -0
- package/client/dist/assets/ApiKeyInput-k2LBmBjb.js +1 -0
- package/client/dist/assets/ApiKeyPanel-C_bV9U0X.js +1 -0
- package/client/dist/assets/ApiUsageSection-CmVfwZzL.js +1 -0
- package/client/dist/assets/EmailPanel-CeKIMGu-.js +1 -0
- package/client/dist/assets/OAuthPanel-KA3t3Q2K.js +1 -0
- package/client/dist/assets/QrPairingPanel-NgNpJNuk.js +1 -0
- package/client/dist/assets/RateLimitSection-Du5YNVIA.js +1 -0
- package/client/dist/assets/StatusCard-DNLyayXc.js +1 -0
- package/client/dist/assets/index-DQ0nwhec.js +257 -0
- package/client/dist/assets/index-DxmbVskS.css +1 -0
- package/client/dist/assets/vendor-flow-CZmBvHRo.js +1 -0
- package/client/dist/assets/vendor-icons-CVrPjN2Q.js +22 -0
- package/client/dist/assets/vendor-markdown-CRou3yQ5.js +62 -0
- package/client/dist/assets/vendor-misc-C4VxKHs5.js +1 -0
- package/client/dist/assets/vendor-query-SzWcOU0G.js +1 -0
- package/client/dist/assets/vendor-radix-Dnos29jG.js +56 -0
- package/client/dist/assets/vendor-react-DvWIbVx0.js +1 -0
- package/client/dist/index.html +37 -3
- package/client/index.html +28 -1
- package/client/package.json +44 -40
- package/client/src/App.tsx +2 -0
- package/client/src/Dashboard.tsx +157 -45
- package/client/src/ParameterPanel.tsx +3 -5
- package/client/src/adapters/nodeSpecToDescription.ts +1 -0
- package/client/src/assets/icons/NodeIcon.tsx +32 -0
- package/client/src/assets/icons/index.ts +4 -0
- package/client/src/assets/icons/stripe.svg +1 -0
- package/client/src/assets/icons/themedGlyphs.ts +404 -0
- package/client/src/components/AIAgentNode.tsx +77 -53
- package/client/src/components/GenericNode.tsx +34 -52
- package/client/src/components/OutputPanel.tsx +64 -147
- package/client/src/components/ParameterRenderer.tsx +5 -3
- package/client/src/components/SkillEditorModal.tsx +9 -18
- package/client/src/components/SquareNode.tsx +97 -115
- package/client/src/components/StartNode.tsx +32 -42
- package/client/src/components/SvgFilterDefs.tsx +54 -0
- package/client/src/components/TeamMonitorNode.tsx +12 -14
- package/client/src/components/ToolkitNode.tsx +35 -60
- package/client/src/components/TriggerNode.tsx +43 -77
- package/client/src/components/__tests__/CredentialsModal.test.tsx +49 -45
- package/client/src/components/credentials/CredentialsModal.tsx +98 -30
- package/client/src/components/credentials/CredentialsPalette.tsx +73 -5
- package/client/src/components/credentials/catalogueAdapter.ts +17 -1
- package/client/src/components/credentials/panels/ApiKeyPanel.tsx +102 -37
- package/client/src/components/credentials/panels/EmailPanel.tsx +7 -19
- package/client/src/components/credentials/panels/OAuthPanel.tsx +5 -1
- package/client/src/components/credentials/panels/QrPairingPanel.tsx +1 -3
- package/client/src/components/credentials/primitives/ActionBar.tsx +7 -11
- package/client/src/components/credentials/primitives/OAuthConnect.tsx +19 -28
- package/client/src/components/credentials/sections/ProviderDefaultsSection.tsx +24 -3
- package/client/src/components/credentials/types.ts +12 -2
- package/client/src/components/credentials/useCredentialPanel.ts +43 -19
- package/client/src/components/icons/AIProviderIcons.tsx +16 -0
- package/client/src/components/onboarding/OnboardingWizard.tsx +23 -63
- package/client/src/components/onboarding/nodeRoleClasses.ts +23 -0
- package/client/src/components/onboarding/steps/CanvasStep.tsx +15 -21
- package/client/src/components/onboarding/steps/ConceptsStep.tsx +2 -11
- package/client/src/components/onboarding/steps/GetStartedStep.tsx +2 -10
- package/client/src/components/parameterPanel/InputSection.tsx +9 -7
- package/client/src/components/parameterPanel/MasterSkillEditor.tsx +84 -198
- package/client/src/components/parameterPanel/MiddleSection.tsx +57 -80
- package/client/src/components/parameterPanel/ToolSchemaEditor.tsx +31 -25
- package/client/src/components/parameterPanel/__tests__/InputSection.test.tsx +7 -2
- package/client/src/components/ui/AIResultModal.tsx +1 -1
- package/client/src/components/ui/CollapsibleSection.tsx +9 -5
- package/client/src/components/ui/CommandPalette.tsx +147 -0
- package/client/src/components/ui/CommandPaletteHost.tsx +189 -0
- package/client/src/components/ui/ComponentItem.tsx +13 -7
- package/client/src/components/ui/ComponentPalette.tsx +24 -13
- package/client/src/components/ui/ConsolePanel.tsx +19 -11
- package/client/src/components/ui/DropCap.tsx +28 -0
- package/client/src/components/ui/EditableNodeLabel.tsx +10 -2
- package/client/src/components/ui/InputNodesPanel.tsx +1 -1
- package/client/src/components/ui/Modal.tsx +38 -6
- package/client/src/components/ui/OutputDisplayPanel.tsx +1 -1
- package/client/src/components/ui/SettingsPanel.tsx +42 -13
- package/client/src/components/ui/StatusBar.tsx +108 -0
- package/client/src/components/ui/ThemeSwitcher.tsx +109 -0
- package/client/src/components/ui/TopToolbar.tsx +42 -25
- package/client/src/components/ui/WorkflowSidebar.tsx +32 -16
- package/client/src/components/ui/action-button.tsx +40 -15
- package/client/src/components/ui/button.tsx +24 -1
- package/client/src/components/ui/dropdown-menu.tsx +24 -2
- package/client/src/components/ui/input.tsx +19 -2
- package/client/src/components/ui/select.tsx +15 -0
- package/client/src/components/ui/textarea.tsx +15 -2
- package/client/src/contexts/AuthContext.tsx +148 -109
- package/client/src/contexts/ThemeContext.tsx +93 -17
- package/client/src/contexts/WebSocketContext.tsx +373 -206
- package/client/src/contexts/__tests__/AuthContext.test.tsx +221 -0
- package/client/src/hooks/__tests__/useDragVariable.test.ts +7 -1
- package/client/src/hooks/__tests__/useWorkflowOpsListener.test.ts +142 -0
- package/client/src/hooks/useAppTheme.ts +209 -7
- package/client/src/hooks/useAutoSkillEdges.ts +7 -2
- package/client/src/hooks/useCatalogueQuery.ts +67 -1
- package/client/src/hooks/useDragVariable.ts +1 -1
- package/client/src/hooks/useNodeAllowlist.ts +115 -8
- package/client/src/hooks/useOnboarding.ts +20 -8
- package/client/src/hooks/useParameterPanel.ts +2 -1
- package/client/src/hooks/useReactFlowNodes.ts +2 -1
- package/client/src/hooks/useSound.ts +185 -0
- package/client/src/hooks/useWorkflowManagement.ts +6 -8
- package/client/src/hooks/useWorkflowOpsListener.ts +90 -0
- package/client/src/index.css +65 -3
- package/client/src/lib/__tests__/connectionConfig.test.ts +91 -0
- package/client/src/lib/aiModelProviders.ts +8 -0
- package/client/src/lib/connectionConfig.ts +107 -0
- package/client/src/lib/queryPersist.ts +13 -5
- package/client/src/lib/sound.ts +393 -0
- package/client/src/main.tsx +20 -0
- package/client/src/store/useAppStore.ts +26 -0
- package/client/src/styles/canvasAnimations.ts +37 -36
- package/client/src/styles/theme.ts +36 -20
- package/client/src/test/setup.ts +1 -0
- package/client/src/themes/atomic.css +253 -0
- package/client/src/themes/base.css +373 -0
- package/client/src/themes/cyber.css +890 -0
- package/client/src/themes/dark.css +70 -0
- package/client/src/themes/edo.css +246 -0
- package/client/src/themes/greek.css +293 -0
- package/client/src/themes/light.css +78 -0
- package/client/src/themes/plague.css +253 -0
- package/client/src/themes/renaissance.css +727 -0
- package/client/src/themes/rot.css +249 -0
- package/client/src/themes/steampunk.css +272 -0
- package/client/src/themes/surveillance.css +289 -0
- package/client/src/themes/wasteland.css +250 -0
- package/client/src/types/INodeProperties.ts +5 -0
- package/client/src/types/NodeTypes.ts +11 -1
- package/client/src/types/__tests__/cloudEvents.test.ts +99 -0
- package/client/src/types/cloudEvents.ts +78 -0
- package/client/src/vite-env.d.ts +7 -0
- package/client/tsconfig.json +1 -1
- package/client/vite.config.js +62 -2
- package/install.ps1 +1 -1
- package/install.sh +1 -1
- package/machina/commands/build.py +51 -7
- package/machina/pyproject.toml +4 -0
- package/machina/supervisor.py +12 -2
- package/machina/tree.py +71 -21
- package/package.json +4 -4
- package/scripts/install.js +16 -1
- package/server/config/ai_cli_providers.json +54 -0
- package/server/config/credential_providers.json +109 -2
- package/server/config/llm_defaults.json +24 -0
- package/server/config/model_registry.json +338 -499
- package/server/config/node_allowlist.json +16 -1
- package/server/config/pricing.json +8 -0
- package/server/constants.py +38 -15
- package/server/core/container.py +2 -2
- package/server/core/credentials_database.py +35 -2
- package/server/core/logging.py +4 -3
- package/server/main.py +99 -13
- package/server/models/node_metadata.py +1 -0
- package/server/nodejs/package.json +8 -6
- package/server/nodejs/src/index.ts +22 -5
- package/server/nodes/README.md +31 -4
- package/server/nodes/agent/_inline.py +2 -0
- package/server/nodes/agent/_specialized.py +6 -3
- package/server/nodes/agent/ai_agent.py +13 -3
- package/server/nodes/agent/chat_agent.py +6 -3
- package/server/nodes/agent/claude_code_agent.py +287 -75
- package/server/nodes/agent/codex_agent.py +239 -0
- package/server/nodes/agent/deep_agent.py +3 -3
- package/server/nodes/agent/rlm_agent.py +3 -3
- package/server/nodes/android/__init__.py +31 -1
- package/server/nodes/android/_base.py +9 -5
- package/server/{services/android_service.py → nodes/android/_dispatcher.py} +2 -2
- package/server/nodes/android/_handlers.py +154 -0
- package/server/nodes/android/_option_loaders.py +44 -0
- package/server/nodes/android/_refresh.py +127 -0
- package/server/{services/android → nodes/android/_relay}/client.py +4 -4
- package/server/{routers/android.py → nodes/android/_router.py} +27 -8
- package/server/nodes/browser/browser.py +2 -2
- package/server/nodes/code/_base.py +6 -2
- package/server/nodes/code/_claude_code.py +134 -0
- package/server/nodes/document/embedding_generator.py +3 -3
- package/server/nodes/document/http_scraper.py +3 -3
- package/server/nodes/document/vector_store.py +5 -5
- package/server/nodes/email/__init__.py +11 -1
- package/server/nodes/email/_filters.py +21 -0
- package/server/{services/himalaya_service.py → nodes/email/_himalaya.py} +6 -10
- package/server/{services/email_service.py → nodes/email/_service.py} +9 -13
- package/server/nodes/email/email_read.py +1 -1
- package/server/nodes/email/email_receive.py +54 -5
- package/server/nodes/email/email_send.py +1 -1
- package/server/nodes/filesystem/shell.py +24 -1
- package/server/nodes/google/__init__.py +55 -1
- package/server/{services/handlers/google_auth.py → nodes/google/_auth_helper.py} +8 -5
- package/server/nodes/google/_base.py +2 -2
- package/server/nodes/google/_credentials.py +5 -5
- package/server/nodes/google/_filters.py +25 -0
- package/server/nodes/google/_handlers.py +57 -0
- package/server/{services/google_oauth.py → nodes/google/_oauth.py} +195 -162
- package/server/nodes/google/_option_loaders.py +107 -0
- package/server/nodes/google/_refresh.py +66 -0
- package/server/nodes/google/_router.py +131 -0
- package/server/nodes/google/gmail_receive.py +41 -4
- package/server/nodes/groups.py +1 -0
- package/server/nodes/location/_credentials.py +45 -1
- package/server/{services/maps.py → nodes/location/_service.py} +18 -3
- package/server/nodes/location/gmaps_create.py +4 -4
- package/server/nodes/location/gmaps_locations.py +4 -4
- package/server/nodes/location/gmaps_nearby_places.py +4 -4
- package/server/nodes/model/_base.py +8 -3
- package/server/nodes/model/_credentials.py +96 -8
- package/server/nodes/model/_local_validator.py +345 -0
- package/server/nodes/model/lmstudio_chat_model.py +23 -0
- package/server/nodes/model/ollama_chat_model.py +25 -0
- package/server/nodes/proxy/_usage.py +2 -2
- package/server/nodes/proxy/proxy_config.py +14 -14
- package/server/nodes/proxy/proxy_request.py +4 -4
- package/server/nodes/scraper/_credentials.py +29 -1
- package/server/nodes/scraper/apify_actor.py +9 -9
- package/server/nodes/scraper/crawlee_scraper.py +5 -5
- package/server/nodes/search/brave_search.py +4 -0
- package/server/nodes/search/perplexity_search.py +9 -0
- package/server/nodes/search/serper_search.py +3 -0
- package/server/nodes/skill/simple_memory.py +12 -0
- package/server/nodes/social/_base.py +2 -2
- package/server/nodes/stripe/__init__.py +46 -0
- package/server/nodes/stripe/_credentials.py +33 -0
- package/server/nodes/stripe/_handlers.py +270 -0
- package/server/nodes/stripe/_install.py +127 -0
- package/server/nodes/stripe/_source.py +174 -0
- package/server/nodes/stripe/stripe_action.py +81 -0
- package/server/nodes/stripe/stripe_receive.py +92 -0
- package/server/nodes/telegram/_credentials.py +52 -1
- package/server/nodes/telegram/_handlers.py +19 -18
- package/server/nodes/telegram/_service.py +134 -32
- package/server/nodes/telegram/telegram_send.py +5 -6
- package/server/nodes/text/file_handler.py +2 -2
- package/server/nodes/text/text_generator.py +2 -2
- package/server/nodes/tool/agent_builder.py +630 -0
- package/server/nodes/tool/task_manager.py +144 -2
- package/server/nodes/twitter/__init__.py +38 -1
- package/server/nodes/twitter/_base.py +7 -7
- package/server/nodes/twitter/_credentials.py +1 -1
- package/server/nodes/twitter/_filters.py +37 -0
- package/server/nodes/twitter/_handlers.py +77 -0
- package/server/nodes/twitter/_oauth.py +124 -0
- package/server/nodes/twitter/_refresh.py +78 -0
- package/server/nodes/twitter/_router.py +29 -0
- package/server/nodes/twitter/twitter_receive.py +4 -0
- package/server/nodes/visuals.json +64 -19
- package/server/nodes/whatsapp/__init__.py +45 -5
- package/server/nodes/whatsapp/_base.py +3 -3
- package/server/nodes/whatsapp/_filters.py +137 -0
- package/server/nodes/whatsapp/_handlers.py +167 -0
- package/server/nodes/whatsapp/_option_loaders.py +68 -0
- package/server/nodes/whatsapp/_refresh.py +62 -0
- package/server/nodes/whatsapp/_runtime.py +1 -1
- package/server/pyproject.toml +29 -7
- package/server/routers/schemas.py +2 -2
- package/server/routers/webhook.py +26 -9
- package/server/routers/websocket.py +149 -810
- package/server/services/ai.py +89 -8
- package/server/services/auth.py +220 -43
- package/server/services/claude_oauth.py +126 -100
- package/server/services/cli_agent/__init__.py +78 -0
- package/server/services/cli_agent/_handlers.py +237 -0
- package/server/services/cli_agent/config.py +112 -0
- package/server/services/cli_agent/factory.py +48 -0
- package/server/services/cli_agent/lockfile.py +141 -0
- package/server/services/cli_agent/mcp_server.py +482 -0
- package/server/services/cli_agent/protocol.py +173 -0
- package/server/services/cli_agent/providers/__init__.py +9 -0
- package/server/services/cli_agent/providers/anthropic_claude.py +419 -0
- package/server/services/cli_agent/providers/google_gemini.py +80 -0
- package/server/services/cli_agent/providers/openai_codex.py +310 -0
- package/server/services/cli_agent/service.py +607 -0
- package/server/services/cli_agent/session.py +618 -0
- package/server/services/cli_agent/types.py +227 -0
- package/server/services/cli_agent/workflow_tools.py +233 -0
- package/server/services/credential_registry.py +26 -1
- package/server/services/deployment/manager.py +26 -145
- package/server/services/deployment/poll_registry.py +59 -0
- package/server/services/event_waiter.py +76 -246
- package/server/services/events/__init__.py +54 -0
- package/server/services/events/cli.py +78 -0
- package/server/services/events/daemon.py +163 -0
- package/server/services/events/envelope.py +281 -0
- package/server/services/events/lifecycle.py +99 -0
- package/server/services/events/oauth_lifecycle.py +534 -0
- package/server/services/events/polling.py +60 -0
- package/server/services/events/push.py +36 -0
- package/server/services/events/source.py +63 -0
- package/server/services/events/triggers.py +118 -0
- package/server/services/events/verifiers/__init__.py +25 -0
- package/server/services/events/verifiers/base.py +28 -0
- package/server/services/events/verifiers/github.py +25 -0
- package/server/services/events/verifiers/hmac_basic.py +32 -0
- package/server/services/events/verifiers/standard_webhooks.py +47 -0
- package/server/services/events/verifiers/stripe.py +42 -0
- package/server/services/events/webhook.py +105 -0
- package/server/services/handlers/tools.py +28 -186
- package/server/services/llm/config.py +7 -0
- package/server/services/llm/factory.py +8 -2
- package/server/services/memory/__init__.py +52 -0
- package/server/services/memory/jsonl.py +80 -0
- package/server/services/memory/markdown.py +65 -0
- package/server/services/memory/state.py +112 -0
- package/server/services/memory/vector_store.py +40 -0
- package/server/services/model_registry.py +76 -0
- package/server/services/node_allowlist.py +71 -15
- package/server/services/node_executor.py +2 -2
- package/server/services/node_output_schemas.py +21 -10
- package/server/services/node_spec.py +1 -1
- package/server/services/oauth_utils.py +1 -1
- package/server/services/plugin/__init__.py +2 -0
- package/server/services/plugin/base.py +44 -2
- package/server/services/plugin/credential.py +288 -1
- package/server/services/plugin/deps.py +105 -0
- package/server/services/plugin/edge_walker.py +12 -4
- package/server/services/plugin/oauth.py +381 -0
- package/server/services/plugin/polling.py +247 -0
- package/server/services/plugin/registry.py +145 -0
- package/server/services/plugin/singleton.py +65 -0
- package/server/services/plugin/ws.py +81 -0
- package/server/services/process_service.py +31 -2
- package/server/services/status_broadcaster.py +155 -238
- package/server/services/temporal/workflow.py +7 -7
- package/server/services/workflow.py +21 -3
- package/server/services/ws_handler_registry.py +111 -28
- package/server/skills/GUIDE.md +16 -1
- package/server/skills/assistant/agent-builder-skill/SKILL.md +166 -0
- package/server/skills/payments_agent/stripe-skill/SKILL.md +306 -0
- package/server/tests/credentials/test_auth_service.py +16 -9
- package/server/tests/credentials/test_credential_broadcasts.py +219 -0
- package/server/tests/credentials/test_google_oauth.py +6 -6
- package/server/tests/credentials/test_oauth_utils.py +1 -1
- package/server/tests/credentials/test_twitter_oauth.py +2 -2
- package/server/tests/credentials/test_websocket_handlers.py +44 -20
- package/server/tests/llm/test_factory.py +1 -0
- package/server/tests/llm/test_wiring.py +5 -1
- package/server/tests/nodes/_compat.py +24 -24
- package/server/tests/nodes/test_agent_builder.py +439 -0
- package/server/tests/nodes/test_ai_tools.py +18 -14
- package/server/tests/nodes/test_code_fs_process.py +17 -8
- package/server/tests/nodes/test_email.py +10 -9
- package/server/tests/nodes/test_google_workspace.py +2 -2
- package/server/tests/nodes/test_specialized_agents.py +100 -53
- package/server/tests/nodes/test_stripe_plugin.py +293 -0
- package/server/tests/nodes/test_telegram_social.py +4 -4
- package/server/tests/nodes/test_twitter.py +1 -1
- package/server/tests/nodes/test_web_automation.py +2 -2
- package/server/tests/nodes/test_whatsapp.py +9 -9
- package/server/tests/services/cli_agent/__init__.py +0 -0
- package/server/tests/services/cli_agent/test_mcp_server.py +432 -0
- package/server/tests/services/cli_agent/test_providers.py +358 -0
- package/server/tests/services/cli_agent/test_service.py +298 -0
- package/server/tests/services/memory/__init__.py +0 -0
- package/server/tests/services/memory/test_jsonl.py +188 -0
- package/server/tests/services/test_events.py +333 -0
- package/server/tests/test_node_spec.py +56 -16
- package/server/tests/test_plugin_helpers.py +116 -0
- package/server/tests/test_plugin_self_containment.py +486 -0
- package/server/tests/test_status_broadcasts.py +425 -0
- package/workflows/{AI Assistant_workflow-1777421105154-0m4snkzjf.json → AI Assistant_workflow-1778504793388-ou1m1tz2x.json } +70 -266
- package/workflows/{AI Employee_workflow-1777720598005-u4cm858dv.json → AI Employee_example_workflow-1777720598005-u4cm858dv.json } +112 -112
- package/workflows/Claude Assistant_workflow-1778380124051-mdibn807c.json +709 -0
- package/client/dist/assets/ActionBar-vzPpSR77.js +0 -1
- package/client/dist/assets/ApiKeyInput-Ds7AKFe8.js +0 -1
- package/client/dist/assets/ApiKeyPanel-gfblELep.js +0 -1
- package/client/dist/assets/ApiUsageSection-BMNWTe2r.js +0 -1
- package/client/dist/assets/EmailPanel-B1Om64p5.js +0 -1
- package/client/dist/assets/OAuthPanel-CXyQYGBz.js +0 -1
- package/client/dist/assets/QrPairingPanel-BgNuI1we.js +0 -1
- package/client/dist/assets/RateLimitSection-YYK8sx1T.js +0 -1
- package/client/dist/assets/StatusCard-DuYA5hJR.js +0 -1
- package/client/dist/assets/index-D9tZfgvi.js +0 -363
- package/client/dist/assets/index-al7snTkG.css +0 -1
- package/client/src/components/credentials/providers.tsx +0 -177
- package/server/routers/google.py +0 -277
- package/server/routers/maps.py +0 -142
- package/server/routers/twitter.py +0 -365
- package/server/services/claude_code_service.py +0 -106
- package/server/services/memory.py +0 -159
- package/server/services/node_option_loaders/__init__.py +0 -77
- package/server/services/node_option_loaders/android_loaders.py +0 -55
- package/server/services/node_option_loaders/google_loaders.py +0 -97
- package/server/services/node_option_loaders/whatsapp_loaders.py +0 -69
- package/server/services/twitter_oauth.py +0 -411
- package/server/services/websocket_client.py +0 -29
- /package/server/{services/android → nodes/android/_relay}/__init__.py +0 -0
- /package/server/{services/android → nodes/android/_relay}/broadcaster.py +0 -0
- /package/server/{services/android → nodes/android/_relay}/manager.py +0 -0
- /package/server/{services/android → nodes/android/_relay}/protocol.py +0 -0
- /package/server/{services/browser_service.py → nodes/browser/_service.py} +0 -0
- /package/server/{services/whatsapp_service.py → nodes/whatsapp/_service.py} +0 -0
- /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
|
+
}
|
package/client/src/vite-env.d.ts
CHANGED
|
@@ -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;
|
package/client/tsconfig.json
CHANGED
package/client/vite.config.js
CHANGED
|
@@ -94,12 +94,72 @@ export default defineConfig(({ mode }) => {
|
|
|
94
94
|
host: true
|
|
95
95
|
},
|
|
96
96
|
build: {
|
|
97
|
-
//
|
|
98
|
-
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
162
|
+
console.log("[0/6] Created .env from template")
|
|
144
163
|
|
|
145
164
|
if not is_postinstall:
|
|
146
|
-
console.log("[1/
|
|
165
|
+
console.log("[1/6] Installing dependencies...")
|
|
147
166
|
run(["pnpm", "install"], cwd=root)
|
|
148
167
|
else:
|
|
149
|
-
console.log("[1/
|
|
168
|
+
console.log("[1/6] Dependencies already installed by package manager")
|
|
150
169
|
|
|
151
|
-
console.log("[2/
|
|
170
|
+
console.log("[2/6] Building client...")
|
|
152
171
|
run(["pnpm", "--filter", "react-flow-client", "run", "build"], cwd=root)
|
|
153
172
|
|
|
154
|
-
|
|
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
|
-
|
|
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():
|
package/machina/pyproject.toml
CHANGED
|
@@ -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
|
|
package/machina/supervisor.py
CHANGED
|
@@ -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
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
|
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.
|
|
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/
|
|
21
|
+
"homepage": "https://github.com/zeenie-ai/MachinaOS#readme",
|
|
22
22
|
"repository": {
|
|
23
23
|
"type": "git",
|
|
24
|
-
"url": "git+https://github.com/
|
|
24
|
+
"url": "git+https://github.com/zeenie-ai/MachinaOS.git"
|
|
25
25
|
},
|
|
26
26
|
"bugs": {
|
|
27
|
-
"url": "https://github.com/
|
|
27
|
+
"url": "https://github.com/zeenie-ai/MachinaOS/issues"
|
|
28
28
|
},
|
|
29
29
|
"bin": {
|
|
30
30
|
"machina": "./bin/cli.js"
|
package/scripts/install.js
CHANGED
|
@@ -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 +=
|
|
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
|
+
}
|