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.
Files changed (252) hide show
  1. {multiagentos-0.4.2 → multiagentos-0.4.3}/PKG-INFO +26 -5
  2. {multiagentos-0.4.2 → multiagentos-0.4.3}/README.md +25 -4
  3. {multiagentos-0.4.2 → multiagentos-0.4.3}/multiagentos/cli.py +6 -4
  4. {multiagentos-0.4.2 → multiagentos-0.4.3}/multiagentos/mcp_service.py +128 -43
  5. {multiagentos-0.4.2 → multiagentos-0.4.3}/multiagentos.egg-info/PKG-INFO +26 -5
  6. {multiagentos-0.4.2 → multiagentos-0.4.3}/multiagentos.egg-info/SOURCES.txt +2 -0
  7. {multiagentos-0.4.2 → multiagentos-0.4.3}/pyproject.toml +1 -1
  8. multiagentos-0.4.3/tests/test_mcp_service.py +222 -0
  9. multiagentos-0.4.3/tests/test_tunnel_installer_script.py +47 -0
  10. multiagentos-0.4.3/tests/test_tunnel_launchd_scripts.py +21 -0
  11. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_windows_launcher.py +1 -0
  12. multiagentos-0.4.2/tests/test_mcp_service.py +0 -121
  13. {multiagentos-0.4.2 → multiagentos-0.4.3}/agents/__init__.py +0 -0
  14. {multiagentos-0.4.2 → multiagentos-0.4.3}/agents/catalog.py +0 -0
  15. {multiagentos-0.4.2 → multiagentos-0.4.3}/agents/registry.py +0 -0
  16. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/__init__.py +0 -0
  17. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/approval.py +0 -0
  18. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/artifacts.py +0 -0
  19. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/chat_agent_bridge.py +0 -0
  20. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/chat_agent_registry.py +0 -0
  21. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/chat_agent_router.py +0 -0
  22. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/chat_session.py +0 -0
  23. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/__init__.py +0 -0
  24. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/agent.py +0 -0
  25. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/agent_execution_runtime.py +0 -0
  26. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/ai.py +0 -0
  27. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/approval.py +0 -0
  28. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/capability.py +0 -0
  29. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/chat_agent.py +0 -0
  30. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/checkpoint.py +0 -0
  31. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/discovery.py +0 -0
  32. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/execution.py +0 -0
  33. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/execution_cursor.py +0 -0
  34. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/execution_limits.py +0 -0
  35. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/github.py +0 -0
  36. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/handoff.py +0 -0
  37. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/health.py +0 -0
  38. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/human_review.py +0 -0
  39. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/ide.py +0 -0
  40. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/idempotency.py +0 -0
  41. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/mcp.py +0 -0
  42. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/memory.py +0 -0
  43. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/model_runtime.py +0 -0
  44. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/planning.py +0 -0
  45. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/policy_decision.py +0 -0
  46. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/profile.py +0 -0
  47. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/quota.py +0 -0
  48. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/recovery.py +0 -0
  49. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/replay.py +0 -0
  50. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/repository.py +0 -0
  51. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/resume.py +0 -0
  52. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/runtime.py +0 -0
  53. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/streaming.py +0 -0
  54. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/tool_ledger.py +0 -0
  55. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/contracts/work_unit.py +0 -0
  56. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/delegation.py +0 -0
  57. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/execution_limits.py +0 -0
  58. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/execution_state.py +0 -0
  59. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/handoff.py +0 -0
  60. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/lifecycle.py +0 -0
  61. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/memory.py +0 -0
  62. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/multi_agent_workflow.py +0 -0
  63. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/orchestrator.py +0 -0
  64. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/planning.py +0 -0
  65. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/policy_decision.py +0 -0
  66. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/recovery_audit.py +0 -0
  67. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/registry.py +0 -0
  68. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/routing.py +0 -0
  69. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/security.py +0 -0
  70. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/state.py +0 -0
  71. {multiagentos-0.4.2 → multiagentos-0.4.3}/core/tool_ledger.py +0 -0
  72. {multiagentos-0.4.2 → multiagentos-0.4.3}/installer/__init__.py +0 -0
  73. {multiagentos-0.4.2 → multiagentos-0.4.3}/installer/init.py +0 -0
  74. {multiagentos-0.4.2 → multiagentos-0.4.3}/integrations/__init__.py +0 -0
  75. {multiagentos-0.4.2 → multiagentos-0.4.3}/integrations/github/__init__.py +0 -0
  76. {multiagentos-0.4.2 → multiagentos-0.4.3}/integrations/github/gateway.py +0 -0
  77. {multiagentos-0.4.2 → multiagentos-0.4.3}/integrations/openai/__init__.py +0 -0
  78. {multiagentos-0.4.2 → multiagentos-0.4.3}/integrations/openai/chat_agent.py +0 -0
  79. {multiagentos-0.4.2 → multiagentos-0.4.3}/multiagentos/__init__.py +0 -0
  80. {multiagentos-0.4.2 → multiagentos-0.4.3}/multiagentos/windows_launcher.py +0 -0
  81. {multiagentos-0.4.2 → multiagentos-0.4.3}/multiagentos.egg-info/dependency_links.txt +0 -0
  82. {multiagentos-0.4.2 → multiagentos-0.4.3}/multiagentos.egg-info/entry_points.txt +0 -0
  83. {multiagentos-0.4.2 → multiagentos-0.4.3}/multiagentos.egg-info/requires.txt +0 -0
  84. {multiagentos-0.4.2 → multiagentos-0.4.3}/multiagentos.egg-info/top_level.txt +0 -0
  85. {multiagentos-0.4.2 → multiagentos-0.4.3}/profiles/__init__.py +0 -0
  86. {multiagentos-0.4.2 → multiagentos-0.4.3}/profiles/common.py +0 -0
  87. {multiagentos-0.4.2 → multiagentos-0.4.3}/profiles/detector.py +0 -0
  88. {multiagentos-0.4.2 → multiagentos-0.4.3}/profiles/registry.py +0 -0
  89. {multiagentos-0.4.2 → multiagentos-0.4.3}/profiles/resolver.py +0 -0
  90. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/__init__.py +0 -0
  91. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/agent/__init__.py +0 -0
  92. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/agent/ide.py +0 -0
  93. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/agent/model.py +0 -0
  94. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/agent/model_backed.py +0 -0
  95. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/agent/process.py +0 -0
  96. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/agent_execution_runtime.py +0 -0
  97. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/builtin_tools.py +0 -0
  98. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/capability.py +0 -0
  99. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/chat_adapter_registry.py +0 -0
  100. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/chat_config.py +0 -0
  101. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/chat_execution.py +0 -0
  102. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/config/__init__.py +0 -0
  103. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/config/loader.py +0 -0
  104. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/discovery.py +0 -0
  105. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/execution_config.py +0 -0
  106. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/execution_registry.py +0 -0
  107. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/git.py +0 -0
  108. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/github.py +0 -0
  109. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/github_probe.py +0 -0
  110. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/harness.py +0 -0
  111. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/health.py +0 -0
  112. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/ide/__init__.py +0 -0
  113. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/ide/bridge.py +0 -0
  114. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/ide/registry.py +0 -0
  115. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/ide/runtime.py +0 -0
  116. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/local/__init__.py +0 -0
  117. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/local/filesystem.py +0 -0
  118. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/local/patch.py +0 -0
  119. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/local/path_security.py +0 -0
  120. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/local/permissions.py +0 -0
  121. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/local/process.py +0 -0
  122. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/local/shell.py +0 -0
  123. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/mcp/__init__.py +0 -0
  124. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/mcp/agent_execution_runtime_server.py +0 -0
  125. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/mcp/client.py +0 -0
  126. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/mcp/config.py +0 -0
  127. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/mcp/durable_bridge.py +0 -0
  128. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/mcp/policy.py +0 -0
  129. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/mcp/proxy.py +0 -0
  130. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/mcp/server.py +0 -0
  131. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/mcp/session.py +0 -0
  132. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/mcp/streamable_http.py +0 -0
  133. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/__init__.py +0 -0
  134. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/ai_runtime.py +0 -0
  135. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/cli.py +0 -0
  136. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/config.py +0 -0
  137. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/credentials.py +0 -0
  138. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/factory.py +0 -0
  139. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/http.py +0 -0
  140. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/invoker.py +0 -0
  141. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/materializer.py +0 -0
  142. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/native.py +0 -0
  143. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/providers.py +0 -0
  144. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/registry.py +0 -0
  145. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model/runtime_loader.py +0 -0
  146. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/model_control.py +0 -0
  147. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/multi_agent.py +0 -0
  148. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/observability.py +0 -0
  149. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/policy.py +0 -0
  150. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/process.py +0 -0
  151. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/quota.py +0 -0
  152. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/repository.py +0 -0
  153. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/repository_tools.py +0 -0
  154. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/status.py +0 -0
  155. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/streaming.py +0 -0
  156. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/tool_calling.py +0 -0
  157. {multiagentos-0.4.2 → multiagentos-0.4.3}/runtime/validation.py +0 -0
  158. {multiagentos-0.4.2 → multiagentos-0.4.3}/setup.cfg +0 -0
  159. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_agent_execution_runtime.py +0 -0
  160. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_agent_execution_runtime_api.py +0 -0
  161. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_agent_plugin.py +0 -0
  162. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_agents_and_handoff.py +0 -0
  163. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_ai_runtime.py +0 -0
  164. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_approval_boundary.py +0 -0
  165. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_builtin_tools.py +0 -0
  166. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_chat_adapter_registry.py +0 -0
  167. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_chat_agent_bridge.py +0 -0
  168. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_chat_agent_router_session.py +0 -0
  169. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_chat_agents.py +0 -0
  170. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_chat_config.py +0 -0
  171. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_chat_execution.py +0 -0
  172. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_cli.py +0 -0
  173. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_cli_providers.py +0 -0
  174. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_cli_run_resume.py +0 -0
  175. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_config_loader.py +0 -0
  176. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_configured_model_cli.py +0 -0
  177. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_core_runtime.py +0 -0
  178. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_credentials.py +0 -0
  179. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_durable_runtime_contracts.py +0 -0
  180. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_execution_config.py +0 -0
  181. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_execution_harness.py +0 -0
  182. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_execution_limits.py +0 -0
  183. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_execution_registry.py +0 -0
  184. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_git_runtime.py +0 -0
  185. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_github_contract.py +0 -0
  186. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_github_probe.py +0 -0
  187. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_github_runtime.py +0 -0
  188. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_http_model_adapter.py +0 -0
  189. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_human_review_persistence.py +0 -0
  190. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_ide_bridge.py +0 -0
  191. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_ide_runtime.py +0 -0
  192. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_ide_tool_calling.py +0 -0
  193. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_local_process.py +0 -0
  194. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_local_tool_runtime.py +0 -0
  195. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_mcp_cost_boundary.py +0 -0
  196. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_mcp_durable_execution.py +0 -0
  197. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_mcp_policy.py +0 -0
  198. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_mcp_runtime.py +0 -0
  199. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_mcp_sdk_compatibility.py +0 -0
  200. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_mcp_server.py +0 -0
  201. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_mcp_streamable_http.py +0 -0
  202. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_model_agent.py +0 -0
  203. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_model_backed_agent.py +0 -0
  204. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_model_capability.py +0 -0
  205. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_model_control.py +0 -0
  206. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_model_control_routing.py +0 -0
  207. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_model_factory.py +0 -0
  208. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_model_failover.py +0 -0
  209. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_model_health.py +0 -0
  210. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_model_intelligence_sync.py +0 -0
  211. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_model_runtime.py +0 -0
  212. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_multi_agent_runtime.py +0 -0
  213. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_multi_agent_workflow.py +0 -0
  214. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_native_provider_tool_calling.py +0 -0
  215. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_no_legacy_runtime_name.py +0 -0
  216. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_observability.py +0 -0
  217. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_openai_chat_agent.py +0 -0
  218. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_orchestrator.py +0 -0
  219. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_persistent_model_cli.py +0 -0
  220. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_planning_state.py +0 -0
  221. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_policy_decision_evidence.py +0 -0
  222. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_profile_contracts.py +0 -0
  223. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_profiles_installer.py +0 -0
  224. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_project_memory.py +0 -0
  225. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_project_routing.py +0 -0
  226. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_provider_config.py +0 -0
  227. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_provider_discovery.py +0 -0
  228. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_provider_materializer.py +0 -0
  229. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_provider_registry.py +0 -0
  230. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_provider_runtime_loader.py +0 -0
  231. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_quota_helpers.py +0 -0
  232. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_quota_intelligence.py +0 -0
  233. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_quota_provider_metadata.py +0 -0
  234. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_quota_routing.py +0 -0
  235. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_recovery_audit_source_guard.py +0 -0
  236. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_recovery_authorization_contract.py +0 -0
  237. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_release_security_boundaries.py +0 -0
  238. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_repository_runtime.py +0 -0
  239. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_repository_tools.py +0 -0
  240. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_routing_explainability.py +0 -0
  241. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_runtime_adapters.py +0 -0
  242. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_runtime_execution_inspection.py +0 -0
  243. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_runtime_recovery_contract.py +0 -0
  244. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_runtime_recovery_resume_gate.py +0 -0
  245. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_runtime_security_boundary.py +0 -0
  246. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_streaming_runtime.py +0 -0
  247. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_tool_calling_runtime.py +0 -0
  248. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_tool_ledger_runtime.py +0 -0
  249. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_tunnel_client_mcp_health.py +0 -0
  250. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_tunnel_client_runtime_status.py +0 -0
  251. {multiagentos-0.4.2 → multiagentos-0.4.3}/tests/test_unified_checkpoints.py +0 -0
  252. {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.2
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
- Both platforms keep the MCP server on `127.0.0.1:8000`. See [Windows MCP Service](docs/WINDOWS_MCP_SERVICE.md) and [macOS MCP Service](docs/MACOS_MCP_SERVICE.md) for lifecycle details.
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
- The managed service listens only on `127.0.0.1:8000` and keeps its logs under `.multiagentos/logs/`.
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
- Both platforms keep the MCP server on `127.0.0.1:8000`. See [Windows MCP Service](docs/WINDOWS_MCP_SERVICE.md) and [macOS MCP Service](docs/MACOS_MCP_SERVICE.md) for lifecycle details.
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
- The managed service listens only on `127.0.0.1:8000` and keeps its logs under `.multiagentos/logs/`.
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()}/{LABEL}"
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": 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
- PLIST_PATH.write_bytes(plistlib.dumps(plist))
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
- bootstrap = _launchctl("bootstrap", domain, str(PLIST_PATH), check=False)
235
- if bootstrap.returncode != 0:
236
- if "service already loaded" not in bootstrap.stderr.lower():
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
- _launchctl("kickstart", "-k", _target())
244
- _launchctl("print", _target())
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
- WINDOWS_TASK_NAME,
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", WINDOWS_TASK_NAME, check=False)
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
- _launchctl("bootout", _target(), check=False)
324
- PLIST_PATH.unlink(missing_ok=True)
325
- return f"MultiAgentOS local MCP service removed: {LABEL}"
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", WINDOWS_TASK_NAME, "/F", check=False)
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
- result.returncode,
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
- result = _launchctl("print", _target(), check=False)
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: {LABEL}"
347
-
348
- result = _schtasks(
349
- "/Query",
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: {WINDOWS_TASK_NAME}"
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.2
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
- Both platforms keep the MCP server on `127.0.0.1:8000`. See [Windows MCP Service](docs/WINDOWS_MCP_SERVICE.md) and [macOS MCP Service](docs/MACOS_MCP_SERVICE.md) for lifecycle details.
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
- The managed service listens only on `127.0.0.1:8000` and keeps its logs under `.multiagentos/logs/`.
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "multiagentos"
7
- version = "0.4.2"
7
+ version = "0.4.3"
8
8
  description = "Cost-free, local-first, GitHub-native multi-agent development orchestration"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"