multiagentos 0.4.2__tar.gz → 0.4.3__tar.gz
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.
- {multiagentos-0.4.2 → multiagentos-0.4.3}/PKG-INFO +26 -5
- {multiagentos-0.4.2 → multiagentos-0.4.3}/README.md +25 -4
- {multiagentos-0.4.2 → multiagentos-0.4.3}/multiagentos/cli.py +6 -4
- {multiagentos-0.4.2 → multiagentos-0.4.3}/multiagentos/mcp_service.py +128 -43
- {multiagentos-0.4.2 → multiagentos-0.4.3}/multiagentos.egg-info/PKG-INFO +26 -5
- {multiagentos-0.4.2 → multiagentos-0.4.3}/multiagentos.egg-info/SOURCES.txt +2 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/pyproject.toml +1 -1
- multiagentos-0.4.3/tests/test_mcp_service.py +222 -0
- multiagentos-0.4.3/tests/test_tunnel_installer_script.py +47 -0
- multiagentos-0.4.3/tests/test_tunnel_launchd_scripts.py +21 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_windows_launcher.py +1 -0
- multiagentos-0.4.2/tests/test_mcp_service.py +0 -121
- {multiagentos-0.4.2 → multiagentos-0.4.3}/agents/__init__.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/agents/catalog.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/agents/registry.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/__init__.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/approval.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/artifacts.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/chat_agent_bridge.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/chat_agent_registry.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/chat_agent_router.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/chat_session.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/__init__.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/agent.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/agent_execution_runtime.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/ai.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/approval.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/capability.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/chat_agent.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/checkpoint.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/discovery.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/execution.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/execution_cursor.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/execution_limits.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/github.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/handoff.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/health.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/human_review.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/ide.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/idempotency.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/mcp.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/memory.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/model_runtime.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/planning.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/policy_decision.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/profile.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/quota.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/recovery.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/replay.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/repository.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/resume.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/runtime.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/streaming.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/tool_ledger.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/work_unit.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/delegation.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/execution_limits.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/execution_state.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/handoff.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/lifecycle.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/memory.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/multi_agent_workflow.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/orchestrator.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/planning.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/policy_decision.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/recovery_audit.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/registry.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/routing.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/security.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/state.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/core/tool_ledger.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/installer/__init__.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/installer/init.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/integrations/__init__.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/integrations/github/__init__.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/integrations/github/gateway.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/integrations/openai/__init__.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/integrations/openai/chat_agent.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/multiagentos/__init__.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/multiagentos/windows_launcher.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/multiagentos.egg-info/dependency_links.txt +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/multiagentos.egg-info/entry_points.txt +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/multiagentos.egg-info/requires.txt +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/multiagentos.egg-info/top_level.txt +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/profiles/__init__.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/profiles/common.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/profiles/detector.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/profiles/registry.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/profiles/resolver.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/__init__.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/agent/__init__.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/agent/ide.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/agent/model.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/agent/model_backed.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/agent/process.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/agent_execution_runtime.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/builtin_tools.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/capability.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/chat_adapter_registry.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/chat_config.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/chat_execution.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/config/__init__.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/config/loader.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/discovery.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/execution_config.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/execution_registry.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/git.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/github.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/github_probe.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/harness.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/health.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/ide/__init__.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/ide/bridge.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/ide/registry.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/ide/runtime.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/local/__init__.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/local/filesystem.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/local/patch.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/local/path_security.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/local/permissions.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/local/process.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/local/shell.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/mcp/__init__.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/mcp/agent_execution_runtime_server.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/mcp/client.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/mcp/config.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/mcp/durable_bridge.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/mcp/policy.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/mcp/proxy.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/mcp/server.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/mcp/session.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/mcp/streamable_http.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/__init__.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/ai_runtime.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/cli.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/config.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/credentials.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/factory.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/http.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/invoker.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/materializer.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/native.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/providers.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/registry.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/runtime_loader.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model_control.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/multi_agent.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/observability.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/policy.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/process.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/quota.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/repository.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/repository_tools.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/status.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/streaming.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/tool_calling.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/validation.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/setup.cfg +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_agent_execution_runtime.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_agent_execution_runtime_api.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_agent_plugin.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_agents_and_handoff.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_ai_runtime.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_approval_boundary.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_builtin_tools.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_chat_adapter_registry.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_chat_agent_bridge.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_chat_agent_router_session.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_chat_agents.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_chat_config.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_chat_execution.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_cli.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_cli_providers.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_cli_run_resume.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_config_loader.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_configured_model_cli.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_core_runtime.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_credentials.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_durable_runtime_contracts.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_execution_config.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_execution_harness.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_execution_limits.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_execution_registry.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_git_runtime.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_github_contract.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_github_probe.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_github_runtime.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_http_model_adapter.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_human_review_persistence.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_ide_bridge.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_ide_runtime.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_ide_tool_calling.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_local_process.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_local_tool_runtime.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_mcp_cost_boundary.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_mcp_durable_execution.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_mcp_policy.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_mcp_runtime.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_mcp_sdk_compatibility.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_mcp_server.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_mcp_streamable_http.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_model_agent.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_model_backed_agent.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_model_capability.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_model_control.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_model_control_routing.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_model_factory.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_model_failover.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_model_health.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_model_intelligence_sync.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_model_runtime.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_multi_agent_runtime.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_multi_agent_workflow.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_native_provider_tool_calling.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_no_legacy_runtime_name.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_observability.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_openai_chat_agent.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_orchestrator.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_persistent_model_cli.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_planning_state.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_policy_decision_evidence.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_profile_contracts.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_profiles_installer.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_project_memory.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_project_routing.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_provider_config.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_provider_discovery.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_provider_materializer.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_provider_registry.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_provider_runtime_loader.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_quota_helpers.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_quota_intelligence.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_quota_provider_metadata.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_quota_routing.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_recovery_audit_source_guard.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_recovery_authorization_contract.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_release_security_boundaries.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_repository_runtime.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_repository_tools.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_routing_explainability.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_runtime_adapters.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_runtime_execution_inspection.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_runtime_recovery_contract.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_runtime_recovery_resume_gate.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_runtime_security_boundary.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_streaming_runtime.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_tool_calling_runtime.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_tool_ledger_runtime.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_tunnel_client_mcp_health.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_tunnel_client_runtime_status.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_unified_checkpoints.py +0 -0
- {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_validation_runtime.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: multiagentos
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.3
|
|
4
4
|
Summary: Cost-free, local-first, GitHub-native multi-agent development orchestration
|
|
5
5
|
Project-URL: Homepage, https://github.com/eaglesjo/MultiAgentOS
|
|
6
6
|
Project-URL: Repository, https://github.com/eaglesjo/MultiAgentOS
|
|
@@ -213,7 +213,21 @@ multiagentos mcp install --path C:\\Users\\<you>\\Documents\\your-project --allo
|
|
|
213
213
|
multiagentos mcp status
|
|
214
214
|
```
|
|
215
215
|
|
|
216
|
-
|
|
216
|
+
Each managed project gets its own OS service identity. Use a different port for each simultaneously running project:
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
multiagentos mcp install --path /absolute/path/to/project1 --port 8000 --allow-write
|
|
220
|
+
multiagentos mcp install --path /absolute/path/to/project2 --port 8001 --allow-write
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Then inspect or remove a specific project service:
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
multiagentos mcp status --path /absolute/path/to/project1
|
|
227
|
+
multiagentos mcp uninstall --path /absolute/path/to/project1
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
The service identity is derived from the resolved project path, so multiple projects can coexist without sharing the same OS service registration. See [Windows MCP Service](docs/WINDOWS_MCP_SERVICE.md) and [macOS MCP Service](docs/MACOS_MCP_SERVICE.md) for lifecycle details.
|
|
217
231
|
|
|
218
232
|
## Terminology
|
|
219
233
|
|
|
@@ -304,11 +318,18 @@ multiagentos mcp install --path . --allow-write
|
|
|
304
318
|
Check or remove the service with:
|
|
305
319
|
|
|
306
320
|
```bash
|
|
307
|
-
multiagentos mcp status
|
|
308
|
-
multiagentos mcp uninstall
|
|
321
|
+
multiagentos mcp status --path .
|
|
322
|
+
multiagentos mcp uninstall --path .
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
For multiple projects, assign each project a different port:
|
|
326
|
+
|
|
327
|
+
```bash
|
|
328
|
+
multiagentos mcp install --path /absolute/path/to/project1 --port 8000 --allow-write
|
|
329
|
+
multiagentos mcp install --path /absolute/path/to/project2 --port 8001 --allow-write
|
|
309
330
|
```
|
|
310
331
|
|
|
311
|
-
|
|
332
|
+
Each managed service listens only on `127.0.0.1` and keeps its logs under that project's `.multiagentos/logs/`.
|
|
312
333
|
|
|
313
334
|
## Configuration
|
|
314
335
|
|
|
@@ -196,7 +196,21 @@ multiagentos mcp install --path C:\\Users\\<you>\\Documents\\your-project --allo
|
|
|
196
196
|
multiagentos mcp status
|
|
197
197
|
```
|
|
198
198
|
|
|
199
|
-
|
|
199
|
+
Each managed project gets its own OS service identity. Use a different port for each simultaneously running project:
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
multiagentos mcp install --path /absolute/path/to/project1 --port 8000 --allow-write
|
|
203
|
+
multiagentos mcp install --path /absolute/path/to/project2 --port 8001 --allow-write
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Then inspect or remove a specific project service:
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
multiagentos mcp status --path /absolute/path/to/project1
|
|
210
|
+
multiagentos mcp uninstall --path /absolute/path/to/project1
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
The service identity is derived from the resolved project path, so multiple projects can coexist without sharing the same OS service registration. See [Windows MCP Service](docs/WINDOWS_MCP_SERVICE.md) and [macOS MCP Service](docs/MACOS_MCP_SERVICE.md) for lifecycle details.
|
|
200
214
|
|
|
201
215
|
## Terminology
|
|
202
216
|
|
|
@@ -287,11 +301,18 @@ multiagentos mcp install --path . --allow-write
|
|
|
287
301
|
Check or remove the service with:
|
|
288
302
|
|
|
289
303
|
```bash
|
|
290
|
-
multiagentos mcp status
|
|
291
|
-
multiagentos mcp uninstall
|
|
304
|
+
multiagentos mcp status --path .
|
|
305
|
+
multiagentos mcp uninstall --path .
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
For multiple projects, assign each project a different port:
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
multiagentos mcp install --path /absolute/path/to/project1 --port 8000 --allow-write
|
|
312
|
+
multiagentos mcp install --path /absolute/path/to/project2 --port 8001 --allow-write
|
|
292
313
|
```
|
|
293
314
|
|
|
294
|
-
|
|
315
|
+
Each managed service listens only on `127.0.0.1` and keeps its logs under that project's `.multiagentos/logs/`.
|
|
295
316
|
|
|
296
317
|
## Configuration
|
|
297
318
|
|
|
@@ -318,12 +318,14 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
318
318
|
mcp_install.add_argument("--allow-process", action="store_true", help="enable shell execution")
|
|
319
319
|
|
|
320
320
|
mcp_uninstall = mcp_sub.add_parser(
|
|
321
|
-
"uninstall", help="remove the local Streamable HTTP MCP OS-managed service"
|
|
321
|
+
"uninstall", help="remove the local Streamable HTTP MCP OS-managed service for a project"
|
|
322
322
|
)
|
|
323
|
+
mcp_uninstall.add_argument("--path", default=".", help="project root")
|
|
323
324
|
|
|
324
325
|
mcp_status = mcp_sub.add_parser(
|
|
325
|
-
"status", help="show the local Streamable HTTP MCP OS-managed service status"
|
|
326
|
+
"status", help="show the local Streamable HTTP MCP OS-managed service status for a project"
|
|
326
327
|
)
|
|
328
|
+
mcp_status.add_argument("--path", default=".", help="project root")
|
|
327
329
|
|
|
328
330
|
github = subparsers.add_parser("github", help="use Agent Execution Runtime GitHub runtime")
|
|
329
331
|
github_sub = github.add_subparsers(dest="github_command", required=True)
|
|
@@ -583,12 +585,12 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
583
585
|
|
|
584
586
|
if args.command == "mcp" and args.mcp_command == "uninstall":
|
|
585
587
|
from multiagentos.mcp_service import uninstall_mcp_service
|
|
586
|
-
print(uninstall_mcp_service())
|
|
588
|
+
print(uninstall_mcp_service(Path(args.path).expanduser().resolve()))
|
|
587
589
|
return 0
|
|
588
590
|
|
|
589
591
|
if args.command == "mcp" and args.mcp_command == "status":
|
|
590
592
|
from multiagentos.mcp_service import mcp_service_status
|
|
591
|
-
print(mcp_service_status())
|
|
593
|
+
print(mcp_service_status(Path(args.path).expanduser().resolve()))
|
|
592
594
|
return 0
|
|
593
595
|
|
|
594
596
|
if args.command == "github" and args.github_command == "probe":
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import getpass
|
|
6
|
+
import hashlib
|
|
6
7
|
import os
|
|
7
8
|
import plistlib
|
|
8
9
|
import shutil
|
|
@@ -18,6 +19,22 @@ LABEL = "com.eaglesjo.multiagentos.mcp"
|
|
|
18
19
|
WINDOWS_TASK_NAME = "MultiAgentOS Local MCP"
|
|
19
20
|
LAUNCH_AGENTS_DIR = Path.home() / "Library" / "LaunchAgents"
|
|
20
21
|
PLIST_PATH = LAUNCH_AGENTS_DIR / f"{LABEL}.plist"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _service_id(project_root: Path) -> str:
|
|
25
|
+
return hashlib.sha256(str(project_root).encode("utf-8")).hexdigest()[:12]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _service_label(project_root: Path) -> str:
|
|
29
|
+
return f"{LABEL}.{_service_id(project_root)}"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _windows_task_name(project_root: Path) -> str:
|
|
33
|
+
return f"{WINDOWS_TASK_NAME} ({_service_id(project_root)})"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _plist_path(project_root: Path) -> Path:
|
|
37
|
+
return LAUNCH_AGENTS_DIR / f"{_service_label(project_root)}.plist"
|
|
21
38
|
WINDOWS_TASK_NS = "http://schemas.microsoft.com/windows/2004/02/mit/task"
|
|
22
39
|
|
|
23
40
|
|
|
@@ -44,8 +61,8 @@ def _schtasks(*args: str, check: bool = True) -> subprocess.CompletedProcess[str
|
|
|
44
61
|
)
|
|
45
62
|
|
|
46
63
|
|
|
47
|
-
def _target() -> str:
|
|
48
|
-
return f"gui/{os.getuid()}/{
|
|
64
|
+
def _target(project_root: Path) -> str:
|
|
65
|
+
return f"gui/{os.getuid()}/{_service_label(project_root)}"
|
|
49
66
|
|
|
50
67
|
|
|
51
68
|
def _validate_install_args(project_root: Path, host: str, port: int) -> Path:
|
|
@@ -169,6 +186,31 @@ def _wait_for_endpoint(host: str, port: int, *, timeout: float = 30.0) -> bool:
|
|
|
169
186
|
return False
|
|
170
187
|
|
|
171
188
|
|
|
189
|
+
def _wait_for_service_unloaded(target: str, *, timeout: float = 5.0) -> None:
|
|
190
|
+
"""Wait until launchd no longer reports a service target."""
|
|
191
|
+
deadline = time.monotonic() + timeout
|
|
192
|
+
while time.monotonic() < deadline:
|
|
193
|
+
result = _launchctl("print", target, check=False)
|
|
194
|
+
if result.returncode != 0:
|
|
195
|
+
return
|
|
196
|
+
time.sleep(0.1)
|
|
197
|
+
raise RuntimeError(f"launchd service did not unload within {timeout:.1f}s: {target}")
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def _write_plist_atomically(plist_path: Path, plist: dict) -> None:
|
|
201
|
+
"""Write a launchd plist atomically so launchd never sees a partial file."""
|
|
202
|
+
plist_path.parent.mkdir(parents=True, exist_ok=True)
|
|
203
|
+
fd, temp_name = tempfile.mkstemp(prefix=f".{plist_path.name}.", suffix=".tmp", dir=plist_path.parent)
|
|
204
|
+
try:
|
|
205
|
+
with os.fdopen(fd, "wb") as handle:
|
|
206
|
+
handle.write(plistlib.dumps(plist))
|
|
207
|
+
handle.flush()
|
|
208
|
+
os.fsync(handle.fileno())
|
|
209
|
+
os.replace(temp_name, plist_path)
|
|
210
|
+
finally:
|
|
211
|
+
Path(temp_name).unlink(missing_ok=True)
|
|
212
|
+
|
|
213
|
+
|
|
172
214
|
def install_mcp_service(
|
|
173
215
|
project_root: Path,
|
|
174
216
|
*,
|
|
@@ -216,7 +258,7 @@ def _install_macos(
|
|
|
216
258
|
LAUNCH_AGENTS_DIR.mkdir(parents=True, exist_ok=True)
|
|
217
259
|
|
|
218
260
|
plist = {
|
|
219
|
-
"Label":
|
|
261
|
+
"Label": _service_label(project_root),
|
|
220
262
|
"ProgramArguments": program_arguments,
|
|
221
263
|
"WorkingDirectory": str(project_root),
|
|
222
264
|
"RunAtLoad": True,
|
|
@@ -227,21 +269,65 @@ def _install_macos(
|
|
|
227
269
|
"StandardErrorPath": str(logs / "mcp-launchd.error.log"),
|
|
228
270
|
"EnvironmentVariables": {"PYTHONUNBUFFERED": "1"},
|
|
229
271
|
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
_launchctl("bootout", _target(), check=False)
|
|
272
|
+
plist_path = _plist_path(project_root)
|
|
273
|
+
target = _target(project_root)
|
|
233
274
|
domain = f"gui/{os.getuid()}"
|
|
234
|
-
|
|
235
|
-
if
|
|
236
|
-
|
|
275
|
+
|
|
276
|
+
previous_plist = plist_path.read_bytes() if plist_path.exists() else None
|
|
277
|
+
_launchctl("bootout", target, check=False)
|
|
278
|
+
_wait_for_service_unloaded(target)
|
|
279
|
+
|
|
280
|
+
try:
|
|
281
|
+
_write_plist_atomically(plist_path, plist)
|
|
282
|
+
|
|
283
|
+
bootstrap = _launchctl("bootstrap", domain, str(plist_path), check=False)
|
|
284
|
+
if bootstrap.returncode != 0:
|
|
237
285
|
raise subprocess.CalledProcessError(
|
|
238
286
|
bootstrap.returncode,
|
|
239
287
|
bootstrap.args,
|
|
240
288
|
output=bootstrap.stdout,
|
|
241
289
|
stderr=bootstrap.stderr,
|
|
242
290
|
)
|
|
243
|
-
|
|
244
|
-
|
|
291
|
+
|
|
292
|
+
kickstart = _launchctl("kickstart", "-k", target, check=False)
|
|
293
|
+
if kickstart.returncode != 0:
|
|
294
|
+
raise subprocess.CalledProcessError(
|
|
295
|
+
kickstart.returncode,
|
|
296
|
+
kickstart.args,
|
|
297
|
+
output=kickstart.stdout,
|
|
298
|
+
stderr=kickstart.stderr,
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
if not _wait_for_endpoint(host, port):
|
|
302
|
+
raise RuntimeError(
|
|
303
|
+
"launchd registered the MultiAgentOS local MCP service, "
|
|
304
|
+
f"but http://{host}:{port}/mcp did not start within 30 seconds."
|
|
305
|
+
)
|
|
306
|
+
|
|
307
|
+
_launchctl("print", target)
|
|
308
|
+
except Exception:
|
|
309
|
+
# Never leave a half-installed project service behind. Restore the
|
|
310
|
+
# previous project plist when one existed, without touching other
|
|
311
|
+
# project-scoped launchd services.
|
|
312
|
+
_launchctl("bootout", target, check=False)
|
|
313
|
+
try:
|
|
314
|
+
_wait_for_service_unloaded(target)
|
|
315
|
+
except Exception:
|
|
316
|
+
pass
|
|
317
|
+
|
|
318
|
+
if previous_plist is None:
|
|
319
|
+
plist_path.unlink(missing_ok=True)
|
|
320
|
+
else:
|
|
321
|
+
try:
|
|
322
|
+
plist_path.write_bytes(previous_plist)
|
|
323
|
+
restored = _launchctl("bootstrap", domain, str(plist_path), check=False)
|
|
324
|
+
if restored.returncode == 0:
|
|
325
|
+
_launchctl("kickstart", "-k", target, check=False)
|
|
326
|
+
except Exception:
|
|
327
|
+
# Preserve the original install failure; the failed install
|
|
328
|
+
# must not mask it with a best-effort rollback error.
|
|
329
|
+
pass
|
|
330
|
+
raise
|
|
245
331
|
|
|
246
332
|
return (
|
|
247
333
|
"MultiAgentOS local MCP service installed and started. "
|
|
@@ -260,6 +346,9 @@ def _install_windows(
|
|
|
260
346
|
logs = project_root / ".multiagentos" / "logs"
|
|
261
347
|
logs.mkdir(parents=True, exist_ok=True)
|
|
262
348
|
|
|
349
|
+
_schtasks("/End", "/TN", WINDOWS_TASK_NAME, check=False)
|
|
350
|
+
_schtasks("/Delete", "/TN", WINDOWS_TASK_NAME, "/F", check=False)
|
|
351
|
+
|
|
263
352
|
xml = _windows_task_xml(program_arguments, project_root=project_root)
|
|
264
353
|
xml_path = None
|
|
265
354
|
try:
|
|
@@ -279,7 +368,7 @@ def _install_windows(
|
|
|
279
368
|
"/XML",
|
|
280
369
|
xml_path,
|
|
281
370
|
"/TN",
|
|
282
|
-
|
|
371
|
+
_windows_task_name(project_root),
|
|
283
372
|
"/F",
|
|
284
373
|
check=False,
|
|
285
374
|
)
|
|
@@ -294,7 +383,7 @@ def _install_windows(
|
|
|
294
383
|
f"(exit code {result.returncode}): {detail}"
|
|
295
384
|
)
|
|
296
385
|
|
|
297
|
-
run = _schtasks("/Run", "/TN",
|
|
386
|
+
run = _schtasks("/Run", "/TN", _windows_task_name(project_root), check=False)
|
|
298
387
|
if run.returncode != 0:
|
|
299
388
|
raise subprocess.CalledProcessError(
|
|
300
389
|
run.returncode,
|
|
@@ -316,48 +405,44 @@ def _install_windows(
|
|
|
316
405
|
)
|
|
317
406
|
|
|
318
407
|
|
|
319
|
-
def uninstall_mcp_service() -> str:
|
|
320
|
-
"""Stop and remove the managed local MCP service."""
|
|
408
|
+
def uninstall_mcp_service(project_root: Path = Path(".")) -> str:
|
|
409
|
+
"""Stop and remove the managed local MCP service for a project."""
|
|
321
410
|
_require_supported_platform()
|
|
411
|
+
project_root = _validate_install_args(project_root, "127.0.0.1", 8000)
|
|
322
412
|
if sys.platform == "darwin":
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
413
|
+
label = _service_label(project_root)
|
|
414
|
+
target = _target(project_root)
|
|
415
|
+
_launchctl("bootout", target, check=False)
|
|
416
|
+
_wait_for_service_unloaded(target)
|
|
417
|
+
_plist_path(project_root).unlink(missing_ok=True)
|
|
418
|
+
return f"MultiAgentOS local MCP service removed: {label}"
|
|
419
|
+
|
|
420
|
+
task_name = _windows_task_name(project_root)
|
|
421
|
+
_schtasks("/End", "/TN", task_name, check=False)
|
|
327
422
|
_schtasks("/End", "/TN", WINDOWS_TASK_NAME, check=False)
|
|
328
|
-
result = _schtasks("/Delete", "/TN",
|
|
423
|
+
result = _schtasks("/Delete", "/TN", task_name, "/F", check=False)
|
|
424
|
+
_schtasks("/Delete", "/TN", WINDOWS_TASK_NAME, "/F", check=False)
|
|
329
425
|
if result.returncode not in {0, 1}:
|
|
330
|
-
raise subprocess.CalledProcessError(
|
|
331
|
-
|
|
332
|
-
result.args,
|
|
333
|
-
output=result.stdout,
|
|
334
|
-
stderr=result.stderr,
|
|
335
|
-
)
|
|
336
|
-
return f"MultiAgentOS local MCP service removed: {WINDOWS_TASK_NAME}"
|
|
426
|
+
raise subprocess.CalledProcessError(result.returncode, result.args, output=result.stdout, stderr=result.stderr)
|
|
427
|
+
return f"MultiAgentOS local MCP service removed: {task_name}"
|
|
337
428
|
|
|
338
429
|
|
|
339
|
-
def mcp_service_status() -> str:
|
|
340
|
-
"""Return the status for the managed local MCP service."""
|
|
430
|
+
def mcp_service_status(project_root: Path = Path(".")) -> str:
|
|
431
|
+
"""Return the status for the managed local MCP service for a project."""
|
|
341
432
|
_require_supported_platform()
|
|
433
|
+
project_root = _validate_install_args(project_root, "127.0.0.1", 8000)
|
|
342
434
|
if sys.platform == "darwin":
|
|
343
|
-
|
|
435
|
+
label = _service_label(project_root)
|
|
436
|
+
result = _launchctl("print", _target(project_root), check=False)
|
|
344
437
|
if result.returncode == 0:
|
|
345
438
|
return result.stdout.strip()
|
|
346
|
-
return f"MultiAgentOS local MCP service is not installed: {
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
"/TN",
|
|
351
|
-
WINDOWS_TASK_NAME,
|
|
352
|
-
"/FO",
|
|
353
|
-
"LIST",
|
|
354
|
-
"/V",
|
|
355
|
-
check=False,
|
|
356
|
-
)
|
|
439
|
+
return f"MultiAgentOS local MCP service is not installed: {label}"
|
|
440
|
+
|
|
441
|
+
task_name = _windows_task_name(project_root)
|
|
442
|
+
result = _schtasks("/Query", "/TN", task_name, "/FO", "LIST", "/V", check=False)
|
|
357
443
|
if result.returncode == 0:
|
|
358
444
|
return result.stdout.strip()
|
|
359
|
-
return f"MultiAgentOS local MCP service is not installed: {
|
|
360
|
-
|
|
445
|
+
return f"MultiAgentOS local MCP service is not installed: {task_name}"
|
|
361
446
|
|
|
362
447
|
__all__ = [
|
|
363
448
|
"LABEL",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: multiagentos
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.3
|
|
4
4
|
Summary: Cost-free, local-first, GitHub-native multi-agent development orchestration
|
|
5
5
|
Project-URL: Homepage, https://github.com/eaglesjo/MultiAgentOS
|
|
6
6
|
Project-URL: Repository, https://github.com/eaglesjo/MultiAgentOS
|
|
@@ -213,7 +213,21 @@ multiagentos mcp install --path C:\\Users\\<you>\\Documents\\your-project --allo
|
|
|
213
213
|
multiagentos mcp status
|
|
214
214
|
```
|
|
215
215
|
|
|
216
|
-
|
|
216
|
+
Each managed project gets its own OS service identity. Use a different port for each simultaneously running project:
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
multiagentos mcp install --path /absolute/path/to/project1 --port 8000 --allow-write
|
|
220
|
+
multiagentos mcp install --path /absolute/path/to/project2 --port 8001 --allow-write
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Then inspect or remove a specific project service:
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
multiagentos mcp status --path /absolute/path/to/project1
|
|
227
|
+
multiagentos mcp uninstall --path /absolute/path/to/project1
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
The service identity is derived from the resolved project path, so multiple projects can coexist without sharing the same OS service registration. See [Windows MCP Service](docs/WINDOWS_MCP_SERVICE.md) and [macOS MCP Service](docs/MACOS_MCP_SERVICE.md) for lifecycle details.
|
|
217
231
|
|
|
218
232
|
## Terminology
|
|
219
233
|
|
|
@@ -304,11 +318,18 @@ multiagentos mcp install --path . --allow-write
|
|
|
304
318
|
Check or remove the service with:
|
|
305
319
|
|
|
306
320
|
```bash
|
|
307
|
-
multiagentos mcp status
|
|
308
|
-
multiagentos mcp uninstall
|
|
321
|
+
multiagentos mcp status --path .
|
|
322
|
+
multiagentos mcp uninstall --path .
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
For multiple projects, assign each project a different port:
|
|
326
|
+
|
|
327
|
+
```bash
|
|
328
|
+
multiagentos mcp install --path /absolute/path/to/project1 --port 8000 --allow-write
|
|
329
|
+
multiagentos mcp install --path /absolute/path/to/project2 --port 8001 --allow-write
|
|
309
330
|
```
|
|
310
331
|
|
|
311
|
-
|
|
332
|
+
Each managed service listens only on `127.0.0.1` and keeps its logs under that project's `.multiagentos/logs/`.
|
|
312
333
|
|
|
313
334
|
## Configuration
|
|
314
335
|
|
|
@@ -242,6 +242,8 @@ tests/test_tool_calling_runtime.py
|
|
|
242
242
|
tests/test_tool_ledger_runtime.py
|
|
243
243
|
tests/test_tunnel_client_mcp_health.py
|
|
244
244
|
tests/test_tunnel_client_runtime_status.py
|
|
245
|
+
tests/test_tunnel_installer_script.py
|
|
246
|
+
tests/test_tunnel_launchd_scripts.py
|
|
245
247
|
tests/test_unified_checkpoints.py
|
|
246
248
|
tests/test_validation_runtime.py
|
|
247
249
|
tests/test_windows_launcher.py
|