ouroboros-ai 0.31.2.dev18__tar.gz → 0.31.2.dev20__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.

Potentially problematic release.


This version of ouroboros-ai might be problematic. Click here for more details.

Files changed (747) hide show
  1. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/PKG-INFO +1 -1
  2. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/_version.py +2 -2
  3. ouroboros_ai-0.31.2.dev20/src/ouroboros/mcp/tools/bridge_mixin.py +104 -0
  4. ouroboros_ai-0.31.2.dev20/src/ouroboros/orchestrator/agent_runtime_context.py +45 -0
  5. ouroboros_ai-0.31.2.dev20/src/ouroboros/orchestrator/control_bus.py +163 -0
  6. ouroboros_ai-0.31.2.dev20/tests/unit/mcp/tools/test_bridge_mixin_runtime_context.py +111 -0
  7. ouroboros_ai-0.31.2.dev20/tests/unit/orchestrator/test_agent_runtime_context.py +63 -0
  8. ouroboros_ai-0.31.2.dev20/tests/unit/orchestrator/test_control_bus.py +271 -0
  9. ouroboros_ai-0.31.2.dev18/src/ouroboros/mcp/tools/bridge_mixin.py +0 -52
  10. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/.claude/settings.json +0 -0
  11. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/.claude-plugin/.mcp.json +0 -0
  12. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/.claude-plugin/marketplace.json +0 -0
  13. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/.claude-plugin/plugin.json +0 -0
  14. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/.env.example +0 -0
  15. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  16. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  17. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  18. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  19. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/.github/workflows/dev-publish.yml +0 -0
  20. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/.github/workflows/lint.yml +0 -0
  21. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/.github/workflows/release.yml +0 -0
  22. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/.github/workflows/test.yml +0 -0
  23. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/.gitignore +0 -0
  24. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/.mcp.json +0 -0
  25. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/.ouroboros/mechanical.toml +0 -0
  26. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/.ouroboros/seeds/seed_73827177a2a3.yaml +0 -0
  27. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/.ouroboros/seeds/seed_78c8e6e41813.yaml +0 -0
  28. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/.pre-commit-config.yaml +0 -0
  29. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/.python-version +0 -0
  30. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/CHANGELOG.md +0 -0
  31. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/CLAUDE.md +0 -0
  32. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/CODE_OF_CONDUCT.md +0 -0
  33. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/CONTRIBUTING.md +0 -0
  34. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/Code-Review-Claude.md +0 -0
  35. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/Code-Review-Codex.md +0 -0
  36. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/HANDOFF.md +0 -0
  37. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/LICENSE +0 -0
  38. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/README.ko.md +0 -0
  39. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/README.md +0 -0
  40. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/SECURITY.md +0 -0
  41. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/UNINSTALL.md +0 -0
  42. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/commands/cancel.md +0 -0
  43. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/commands/evaluate.md +0 -0
  44. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/commands/evolve.md +0 -0
  45. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/commands/help.md +0 -0
  46. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/commands/interview.md +0 -0
  47. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/commands/ralph.md +0 -0
  48. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/commands/run.md +0 -0
  49. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/commands/seed.md +0 -0
  50. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/commands/setup.md +0 -0
  51. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/commands/status.md +0 -0
  52. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/commands/tutorial.md +0 -0
  53. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/commands/unstuck.md +0 -0
  54. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/commands/welcome.md +0 -0
  55. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/crates/ouroboros-tui/.gitignore +0 -0
  56. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/crates/ouroboros-tui/Cargo.lock +0 -0
  57. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/crates/ouroboros-tui/Cargo.toml +0 -0
  58. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/crates/ouroboros-tui/README.md +0 -0
  59. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/crates/ouroboros-tui/src/db.rs +0 -0
  60. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/crates/ouroboros-tui/src/main.rs +0 -0
  61. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/crates/ouroboros-tui/src/mock.rs +0 -0
  62. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/crates/ouroboros-tui/src/state.rs +0 -0
  63. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
  64. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/crates/ouroboros-tui/src/views/execution.rs +0 -0
  65. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
  66. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/crates/ouroboros-tui/src/views/logs.rs +0 -0
  67. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/crates/ouroboros-tui/src/views/mod.rs +0 -0
  68. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
  69. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/README.md +0 -0
  70. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/api/README.md +0 -0
  71. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/api/core.md +0 -0
  72. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/api/mcp.md +0 -0
  73. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/architecture.md +0 -0
  74. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/cli-reference.md +0 -0
  75. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/config-reference.md +0 -0
  76. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/contributing/agent-os-kernel-terminology.md +0 -0
  77. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/contributing/architecture-overview.md +0 -0
  78. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/contributing/findings-registry.md +0 -0
  79. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/contributing/issue-quality-policy.md +0 -0
  80. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/contributing/key-patterns.md +0 -0
  81. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/contributing/testing-guide.md +0 -0
  82. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/events.md +0 -0
  83. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/examples/mcp-config.yaml +0 -0
  84. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/examples/workflows/design-code-verify.md +0 -0
  85. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/examples/workflows/research-to-deliverable.md +0 -0
  86. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/getting-started.md +0 -0
  87. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/guides/evaluation-pipeline.md +0 -0
  88. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/guides/evolution-loop.md +0 -0
  89. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
  90. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/guides/mcp-best-practices.md +0 -0
  91. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/guides/mcp-bridge.md +0 -0
  92. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/guides/ooo-skill-dispatch-router.md +0 -0
  93. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/guides/opencode-subagent-bridge.md +0 -0
  94. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/guides/qa-backends.md +0 -0
  95. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/guides/seed-authoring.md +0 -0
  96. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/guides/tui-usage.md +0 -0
  97. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/images/PLACEHOLDER_README.md +0 -0
  98. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/images/ouroboros.png +0 -0
  99. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/platform-support.md +0 -0
  100. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/rfc/disposable-memory.md +0 -0
  101. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/rfc/mesh.md +0 -0
  102. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/runtime-capability-matrix.md +0 -0
  103. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/runtime-guides/claude-code.md +0 -0
  104. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/runtime-guides/codex.md +0 -0
  105. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/runtime-guides/gemini.md +0 -0
  106. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/runtime-guides/hermes.md +0 -0
  107. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/docs/runtime-guides/opencode.md +0 -0
  108. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/examples/coordinator_test_seed.yaml +0 -0
  109. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/examples/dummy_seed.yaml +0 -0
  110. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/examples/parallel_subac_test_seed.yaml +0 -0
  111. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/examples/subac_test_seed.yaml +0 -0
  112. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/examples/task_manager/README.md +0 -0
  113. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/examples/task_manager/__init__.py +0 -0
  114. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/examples/task_manager/__main__.py +0 -0
  115. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/examples/task_manager/cli.py +0 -0
  116. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/examples/task_manager/models.py +0 -0
  117. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/examples/task_manager/storage.py +0 -0
  118. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/examples/test_display.py +0 -0
  119. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/hooks/hooks.json +0 -0
  120. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/llms-full.txt +0 -0
  121. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/llms.txt +0 -0
  122. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/project-context.md +0 -0
  123. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/pyproject.toml +0 -0
  124. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/scripts/drift-monitor.py +0 -0
  125. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/scripts/install.sh +0 -0
  126. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/scripts/keyword-detector.py +0 -0
  127. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/scripts/mcp-serve.sh +0 -0
  128. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/scripts/ralph-rewind.py +0 -0
  129. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/scripts/ralph.py +0 -0
  130. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/scripts/ralph.sh +0 -0
  131. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/scripts/session-start.py +0 -0
  132. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/scripts/sync-plugin-version.py +0 -0
  133. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/scripts/version-check.py +0 -0
  134. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/skills/brownfield/SKILL.md +0 -0
  135. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/skills/cancel/SKILL.md +0 -0
  136. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/skills/evaluate/SKILL.md +0 -0
  137. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/skills/evolve/SKILL.md +0 -0
  138. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/skills/help/SKILL.md +0 -0
  139. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/skills/interview/SKILL.md +0 -0
  140. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/skills/pm/SKILL.md +0 -0
  141. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/skills/publish/SKILL.md +0 -0
  142. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/skills/qa/SKILL.md +0 -0
  143. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/skills/ralph/SKILL.md +0 -0
  144. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/skills/resume-session/SKILL.md +0 -0
  145. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/skills/run/SKILL.md +0 -0
  146. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/skills/seed/SKILL.md +0 -0
  147. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/skills/setup/SKILL.md +0 -0
  148. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/skills/status/SKILL.md +0 -0
  149. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/skills/tutorial/SKILL.md +0 -0
  150. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/skills/unstuck/SKILL.md +0 -0
  151. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/skills/update/SKILL.md +0 -0
  152. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/skills/welcome/SKILL.md +0 -0
  153. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/__init__.py +0 -0
  154. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/__main__.py +0 -0
  155. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/__init__.py +0 -0
  156. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/advocate.md +0 -0
  157. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/analysis-agent.md +0 -0
  158. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/architect.md +0 -0
  159. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/breadth-keeper.md +0 -0
  160. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/code-executor.md +0 -0
  161. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/codebase-explorer.md +0 -0
  162. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/consensus-reviewer.md +0 -0
  163. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/contrarian.md +0 -0
  164. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/evaluator.md +0 -0
  165. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/hacker.md +0 -0
  166. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/judge.md +0 -0
  167. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/loader.py +0 -0
  168. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/ontologist.md +0 -0
  169. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/ontology-analyst.md +0 -0
  170. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/qa-judge.md +0 -0
  171. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/research-agent.md +0 -0
  172. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/researcher.md +0 -0
  173. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/seed-architect.md +0 -0
  174. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/seed-closer.md +0 -0
  175. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/semantic-evaluator.md +0 -0
  176. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/simplifier.md +0 -0
  177. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/agents/socratic-interviewer.md +0 -0
  178. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/bigbang/__init__.py +0 -0
  179. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/bigbang/ambiguity.py +0 -0
  180. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/bigbang/brownfield.py +0 -0
  181. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/bigbang/explore.py +0 -0
  182. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/bigbang/interview.py +0 -0
  183. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/bigbang/pm_completion.py +0 -0
  184. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/bigbang/pm_document.py +0 -0
  185. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/bigbang/pm_interview.py +0 -0
  186. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/bigbang/pm_seed.py +0 -0
  187. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/bigbang/question_classifier.py +0 -0
  188. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/bigbang/seed_generator.py +0 -0
  189. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/claude_permissions.py +0 -0
  190. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/__init__.py +0 -0
  191. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/commands/__init__.py +0 -0
  192. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/commands/cancel.py +0 -0
  193. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/commands/codex.py +0 -0
  194. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/commands/config.py +0 -0
  195. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/commands/detect.py +0 -0
  196. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/commands/init.py +0 -0
  197. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/commands/mcp.py +0 -0
  198. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/commands/mcp_doctor.py +0 -0
  199. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/commands/pm.py +0 -0
  200. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/commands/resume.py +0 -0
  201. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/commands/run.py +0 -0
  202. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/commands/setup.py +0 -0
  203. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/commands/status.py +0 -0
  204. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/commands/tui.py +0 -0
  205. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/commands/uninstall.py +0 -0
  206. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/formatters/__init__.py +0 -0
  207. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/formatters/panels.py +0 -0
  208. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/formatters/progress.py +0 -0
  209. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/formatters/prompting.py +0 -0
  210. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/formatters/tables.py +0 -0
  211. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
  212. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/jsonc.py +0 -0
  213. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/main.py +0 -0
  214. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/cli/opencode_config.py +0 -0
  215. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/codex/__init__.py +0 -0
  216. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/codex/artifacts.py +0 -0
  217. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/codex/cli_policy.py +0 -0
  218. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/codex/ouroboros.md +0 -0
  219. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/codex_permissions.py +0 -0
  220. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/config/__init__.py +0 -0
  221. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/config/loader.py +0 -0
  222. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/config/models.py +0 -0
  223. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/__init__.py +0 -0
  224. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/ac_tree.py +0 -0
  225. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/context.py +0 -0
  226. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/directive.py +0 -0
  227. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/errors.py +0 -0
  228. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/file_lock.py +0 -0
  229. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/git_workflow.py +0 -0
  230. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/initial_context.py +0 -0
  231. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/json_utils.py +0 -0
  232. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/lineage.py +0 -0
  233. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/ontology_aspect.py +0 -0
  234. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/ontology_questions.py +0 -0
  235. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/project_paths.py +0 -0
  236. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/retry.py +0 -0
  237. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/security.py +0 -0
  238. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/seed.py +0 -0
  239. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/seed_contract.py +0 -0
  240. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/seed_contract_prompt.py +0 -0
  241. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/text.py +0 -0
  242. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/ttl_cache.py +0 -0
  243. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/types.py +0 -0
  244. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/core/worktree.py +0 -0
  245. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/evaluation/__init__.py +0 -0
  246. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/evaluation/artifact_collector.py +0 -0
  247. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/evaluation/checklist.py +0 -0
  248. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/evaluation/consensus.py +0 -0
  249. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/evaluation/detector.py +0 -0
  250. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/evaluation/json_utils.py +0 -0
  251. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/evaluation/languages.py +0 -0
  252. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/evaluation/mechanical.py +0 -0
  253. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/evaluation/models.py +0 -0
  254. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/evaluation/pipeline.py +0 -0
  255. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/evaluation/semantic.py +0 -0
  256. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/evaluation/trigger.py +0 -0
  257. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/evaluation/verification_artifacts.py +0 -0
  258. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/events/__init__.py +0 -0
  259. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/events/base.py +0 -0
  260. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/events/control.py +0 -0
  261. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/events/decomposition.py +0 -0
  262. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/events/evaluation.py +0 -0
  263. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/events/interview.py +0 -0
  264. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/events/lineage.py +0 -0
  265. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/events/ontology.py +0 -0
  266. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/evolution/__init__.py +0 -0
  267. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/evolution/convergence.py +0 -0
  268. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/evolution/loop.py +0 -0
  269. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/evolution/projector.py +0 -0
  270. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/evolution/reflect.py +0 -0
  271. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/evolution/regression.py +0 -0
  272. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/evolution/wonder.py +0 -0
  273. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/execution/__init__.py +0 -0
  274. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/execution/atomicity.py +0 -0
  275. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/execution/decomposition.py +0 -0
  276. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/execution/double_diamond.py +0 -0
  277. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/execution/subagent.py +0 -0
  278. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/hermes/__init__.py +0 -0
  279. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/hermes/artifacts.py +0 -0
  280. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/__init__.py +0 -0
  281. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/bridge/__init__.py +0 -0
  282. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/bridge/bridge.py +0 -0
  283. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/bridge/config.py +0 -0
  284. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/bridge/factory.py +0 -0
  285. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/client/__init__.py +0 -0
  286. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/client/adapter.py +0 -0
  287. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/client/manager.py +0 -0
  288. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/client/protocol.py +0 -0
  289. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/errors.py +0 -0
  290. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/job_manager.py +0 -0
  291. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/resources/__init__.py +0 -0
  292. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/resources/handlers.py +0 -0
  293. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/server/__init__.py +0 -0
  294. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/server/adapter.py +0 -0
  295. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/server/protocol.py +0 -0
  296. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/server/security.py +0 -0
  297. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/tools/__init__.py +0 -0
  298. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/tools/ac_tree_hud_handler.py +0 -0
  299. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/tools/ac_tree_hud_render.py +0 -0
  300. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
  301. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
  302. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/tools/dashboard.py +0 -0
  303. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/tools/definitions.py +0 -0
  304. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
  305. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/tools/evolution_handlers.py +0 -0
  306. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/tools/execution_handlers.py +0 -0
  307. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
  308. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
  309. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/tools/qa.py +0 -0
  310. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
  311. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/tools/registry.py +0 -0
  312. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/tools/subagent.py +0 -0
  313. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/mcp/types.py +0 -0
  314. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/observability/__init__.py +0 -0
  315. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/observability/drift.py +0 -0
  316. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/observability/logging.py +0 -0
  317. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/observability/retrospective.py +0 -0
  318. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/opencode/__init__.py +0 -0
  319. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/opencode/plugin/__init__.py +0 -0
  320. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/opencode/plugin/opencode-plugin.d.ts +0 -0
  321. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/opencode/plugin/ouroboros-bridge.test.ts +0 -0
  322. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/opencode/plugin/ouroboros-bridge.ts +0 -0
  323. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/opencode/plugin/package.json +0 -0
  324. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/opencode/plugin/tsconfig.json +0 -0
  325. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/__init__.py +0 -0
  326. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/adapter.py +0 -0
  327. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/capabilities.py +0 -0
  328. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/codex_cli_runtime.py +0 -0
  329. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
  330. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/control_plane.py +0 -0
  331. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/coordinator.py +0 -0
  332. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
  333. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/events.py +0 -0
  334. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
  335. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
  336. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/gemini_cli_runtime.py +0 -0
  337. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/heartbeat.py +0 -0
  338. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/hermes_runtime.py +0 -0
  339. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/level_context.py +0 -0
  340. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/mcp_config.py +0 -0
  341. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
  342. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/opencode_event_normalizer.py +0 -0
  343. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/opencode_runtime.py +0 -0
  344. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/parallel_executor.py +0 -0
  345. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
  346. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/policy.py +0 -0
  347. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/rate_limit.py +0 -0
  348. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/runner.py +0 -0
  349. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
  350. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
  351. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/session.py +0 -0
  352. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/orchestrator/workflow_state.py +0 -0
  353. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/persistence/__init__.py +0 -0
  354. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/persistence/brownfield.py +0 -0
  355. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/persistence/checkpoint.py +0 -0
  356. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/persistence/event_store.py +0 -0
  357. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/persistence/migrations/__init__.py +0 -0
  358. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/persistence/migrations/runner.py +0 -0
  359. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
  360. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
  361. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/persistence/schema.py +0 -0
  362. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/persistence/uow.py +0 -0
  363. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/plugin/__init__.py +0 -0
  364. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/plugin/agents/__init__.py +0 -0
  365. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/plugin/agents/pool.py +0 -0
  366. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/plugin/agents/registry.py +0 -0
  367. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
  368. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/plugin/orchestration/router.py +0 -0
  369. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
  370. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/plugin/skills/__init__.py +0 -0
  371. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/plugin/skills/docs.py +0 -0
  372. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/plugin/skills/executor.py +0 -0
  373. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/plugin/skills/keywords.py +0 -0
  374. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/plugin/skills/registry.py +0 -0
  375. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/pm/__init__.py +0 -0
  376. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/pm/handoff.py +0 -0
  377. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/pm/renderer.py +0 -0
  378. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/providers/__init__.py +0 -0
  379. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/providers/anthropic_adapter.py +0 -0
  380. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/providers/base.py +0 -0
  381. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/providers/claude_code_adapter.py +0 -0
  382. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/providers/codex_cli_adapter.py +0 -0
  383. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/providers/codex_cli_stream.py +0 -0
  384. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/providers/factory.py +0 -0
  385. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/providers/gemini_cli_adapter.py +0 -0
  386. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/providers/gemini_event_normalizer.py +0 -0
  387. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/providers/litellm_adapter.py +0 -0
  388. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/providers/opencode_adapter.py +0 -0
  389. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/py.typed +0 -0
  390. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/resilience/__init__.py +0 -0
  391. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/resilience/lateral.py +0 -0
  392. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/resilience/recovery.py +0 -0
  393. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/resilience/stagnation.py +0 -0
  394. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/router/__init__.py +0 -0
  395. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/router/command_parser.py +0 -0
  396. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/router/dispatch.py +0 -0
  397. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/router/registry.py +0 -0
  398. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/router/types.py +0 -0
  399. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/routing/__init__.py +0 -0
  400. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/routing/complexity.py +0 -0
  401. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/routing/downgrade.py +0 -0
  402. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/routing/escalation.py +0 -0
  403. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/routing/router.py +0 -0
  404. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/routing/tiers.py +0 -0
  405. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/sandbox.py +0 -0
  406. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/secondary/__init__.py +0 -0
  407. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/secondary/scheduler.py +0 -0
  408. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/secondary/todo_registry.py +0 -0
  409. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/skills/__init__.py +0 -0
  410. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/skills/artifacts.py +0 -0
  411. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/strategies/__init__.py +0 -0
  412. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/strategies/devil_advocate.py +0 -0
  413. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/__init__.py +0 -0
  414. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/app.py +0 -0
  415. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/components/__init__.py +0 -0
  416. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/components/agents_panel.py +0 -0
  417. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/components/event_log.py +0 -0
  418. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/components/progress.py +0 -0
  419. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/components/token_tracker.py +0 -0
  420. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/events.py +0 -0
  421. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/screens/__init__.py +0 -0
  422. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
  423. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/screens/dashboard.py +0 -0
  424. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
  425. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
  426. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/screens/debug.py +0 -0
  427. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/screens/execution.py +0 -0
  428. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
  429. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
  430. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
  431. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/screens/logs.py +0 -0
  432. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/screens/session_selector.py +0 -0
  433. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/widgets/__init__.py +0 -0
  434. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
  435. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
  436. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
  437. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
  438. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
  439. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
  440. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
  441. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
  442. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/verification/__init__.py +0 -0
  443. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/verification/extractor.py +0 -0
  444. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/verification/models.py +0 -0
  445. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/src/ouroboros/verification/verifier.py +0 -0
  446. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/__init__.py +0 -0
  447. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/conftest.py +0 -0
  448. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/e2e/__init__.py +0 -0
  449. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/e2e/conftest.py +0 -0
  450. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/e2e/mcp_bridge_test_config.yaml +0 -0
  451. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/e2e/test_cli_commands.py +0 -0
  452. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/e2e/test_full_workflow.py +0 -0
  453. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/e2e/test_session_persistence.py +0 -0
  454. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/fixtures/router/skills/frontmatter-body/run/SKILL.md +0 -0
  455. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/fixtures/test_atomicity_seed.yml +0 -0
  456. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/integration/__init__.py +0 -0
  457. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/integration/conftest.py +0 -0
  458. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/integration/mcp/__init__.py +0 -0
  459. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/integration/mcp/bridge/__init__.py +0 -0
  460. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/integration/mcp/bridge/test_bridge_server_to_server.py +0 -0
  461. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/integration/mcp/conftest.py +0 -0
  462. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/integration/mcp/test_client_adapter.py +0 -0
  463. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/integration/mcp/test_client_manager.py +0 -0
  464. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/integration/mcp/test_server_adapter.py +0 -0
  465. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/integration/plugin/test_orchestration.py +0 -0
  466. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/integration/test_cancel_subprocess_termination.py +0 -0
  467. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
  468. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/integration/test_codex_skill_fallback.py +0 -0
  469. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/integration/test_codex_skill_smoke.py +0 -0
  470. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/integration/test_entry_point.py +0 -0
  471. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/test-execution-plan.md +0 -0
  472. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/__init__.py +0 -0
  473. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/agents/__init__.py +0 -0
  474. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/agents/test_loader.py +0 -0
  475. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/bigbang/__init__.py +0 -0
  476. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/bigbang/test_ambiguity.py +0 -0
  477. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/bigbang/test_brownfield.py +0 -0
  478. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/bigbang/test_classifier_context.py +0 -0
  479. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/bigbang/test_decide_later_items.py +0 -0
  480. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/bigbang/test_explore.py +0 -0
  481. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/bigbang/test_interview.py +0 -0
  482. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/bigbang/test_interview_async_io.py +0 -0
  483. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/bigbang/test_interview_no_web_search_hint.py +0 -0
  484. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/bigbang/test_interview_research_prefix.py +0 -0
  485. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/bigbang/test_pm_completion.py +0 -0
  486. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
  487. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
  488. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/bigbang/test_pm_interview.py +0 -0
  489. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
  490. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
  491. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
  492. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/bigbang/test_question_classifier.py +0 -0
  493. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/bigbang/test_seed_generator.py +0 -0
  494. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/__init__.py +0 -0
  495. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/commands/test_tui_command.py +0 -0
  496. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/conftest.py +0 -0
  497. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/formatters/__init__.py +0 -0
  498. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/formatters/test_console.py +0 -0
  499. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/formatters/test_panels.py +0 -0
  500. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/formatters/test_progress.py +0 -0
  501. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/formatters/test_prompting.py +0 -0
  502. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/formatters/test_tables.py +0 -0
  503. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
  504. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_bridge_plugin_hardening.py +0 -0
  505. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_bridge_plugin_lifecycle.py +0 -0
  506. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_cancel.py +0 -0
  507. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_codex_command.py +0 -0
  508. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_config.py +0 -0
  509. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_doc_commands.py +0 -0
  510. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
  511. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_init_runtime.py +0 -0
  512. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_jsonc.py +0 -0
  513. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_main.py +0 -0
  514. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_mcp_doctor.py +0 -0
  515. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
  516. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_mcp_shell_env.py +0 -0
  517. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
  518. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_mcp_validate_transport_stderr.py +0 -0
  519. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_opencode_config.py +0 -0
  520. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_pm.py +0 -0
  521. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_pm_brownfield.py +0 -0
  522. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_pm_completion.py +0 -0
  523. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_pm_interactive_logging.py +0 -0
  524. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_pm_missing_litellm.py +0 -0
  525. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_pm_overwrite.py +0 -0
  526. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_pm_runtime_adapter.py +0 -0
  527. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_pm_select_repos.py +0 -0
  528. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_resume.py +0 -0
  529. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_run_qa.py +0 -0
  530. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_setup.py +0 -0
  531. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/cli/test_uninstall.py +0 -0
  532. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/codex/test_cli_policy.py +0 -0
  533. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/config/__init__.py +0 -0
  534. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/config/test_loader.py +0 -0
  535. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/config/test_loader_env.py +0 -0
  536. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/config/test_models.py +0 -0
  537. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/core/__init__.py +0 -0
  538. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/core/test_ac_tree.py +0 -0
  539. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/core/test_context.py +0 -0
  540. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/core/test_directive.py +0 -0
  541. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/core/test_errors.py +0 -0
  542. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/core/test_file_lock.py +0 -0
  543. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/core/test_git_workflow.py +0 -0
  544. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/core/test_initial_context.py +0 -0
  545. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/core/test_lineage.py +0 -0
  546. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/core/test_ontology_aspect.py +0 -0
  547. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/core/test_ontology_questions.py +0 -0
  548. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/core/test_retry.py +0 -0
  549. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/core/test_security.py +0 -0
  550. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/core/test_seed.py +0 -0
  551. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/core/test_ttl_cache.py +0 -0
  552. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/core/test_types.py +0 -0
  553. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/core/test_worktree.py +0 -0
  554. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/evaluation/__init__.py +0 -0
  555. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/evaluation/test_artifact_collector_file_prefix.py +0 -0
  556. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/evaluation/test_checklist.py +0 -0
  557. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/evaluation/test_consensus.py +0 -0
  558. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/evaluation/test_detector.py +0 -0
  559. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/evaluation/test_json_utils.py +0 -0
  560. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/evaluation/test_languages.py +0 -0
  561. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/evaluation/test_mechanical.py +0 -0
  562. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/evaluation/test_models.py +0 -0
  563. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/evaluation/test_pipeline_stage1_reuse.py +0 -0
  564. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/evaluation/test_pipeline_trigger_consensus.py +0 -0
  565. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/evaluation/test_review_fixes.py +0 -0
  566. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/evaluation/test_semantic.py +0 -0
  567. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/evaluation/test_trigger.py +0 -0
  568. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/evaluation/test_trigger_consensus.py +0 -0
  569. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/evaluation/test_verification_artifacts.py +0 -0
  570. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/events/__init__.py +0 -0
  571. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/events/test_base.py +0 -0
  572. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/events/test_control_events.py +0 -0
  573. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/events/test_decomposition_events.py +0 -0
  574. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/evolution/test_wonder_scope.py +0 -0
  575. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/execution/__init__.py +0 -0
  576. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/execution/test_atomicity.py +0 -0
  577. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/execution/test_decomposition.py +0 -0
  578. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/execution/test_double_diamond.py +0 -0
  579. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/execution/test_subagent_isolation.py +0 -0
  580. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/hermes/test_artifacts.py +0 -0
  581. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/__init__.py +0 -0
  582. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/bridge/__init__.py +0 -0
  583. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/bridge/test_bridge.py +0 -0
  584. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/bridge/test_config.py +0 -0
  585. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/bridge/test_factory.py +0 -0
  586. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/bridge/test_handler_wiring.py +0 -0
  587. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/bridge/test_stability.py +0 -0
  588. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/client/__init__.py +0 -0
  589. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/client/test_adapter.py +0 -0
  590. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/client/test_adapter_transport_lifecycle.py +0 -0
  591. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/client/test_manager.py +0 -0
  592. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/conftest.py +0 -0
  593. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/server/__init__.py +0 -0
  594. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/server/test_adapter.py +0 -0
  595. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/server/test_security.py +0 -0
  596. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/test_errors.py +0 -0
  597. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/test_job_manager.py +0 -0
  598. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/test_types.py +0 -0
  599. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/__init__.py +0 -0
  600. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/conftest.py +0 -0
  601. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_ac_tree_hud_footer.py +0 -0
  602. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_ac_tree_hud_handler.py +0 -0
  603. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_ac_tree_hud_handler_completed.py +0 -0
  604. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_ac_tree_hud_handler_cursor_changed.py +0 -0
  605. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_ac_tree_hud_handler_invalid_session.py +0 -0
  606. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_ac_tree_hud_handler_no_execution.py +0 -0
  607. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_ac_tree_hud_handler_waiting.py +0 -0
  608. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_ac_tree_hud_max_nodes.py +0 -0
  609. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth2.py +0 -0
  610. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth3.py +0 -0
  611. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_ac_tree_hud_status_icons.py +0 -0
  612. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_ac_tree_hud_truncation.py +0 -0
  613. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
  614. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_checklist_verify.py +0 -0
  615. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_definitions.py +0 -0
  616. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_evaluate_multi_ac.py +0 -0
  617. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_handler_subagent_wiring.py +0 -0
  618. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_interview_done_streak.py +0 -0
  619. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_interview_reopen_seed_ready.py +0 -0
  620. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_lateral_think_handler.py +0 -0
  621. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_mcp_manager_wiring.py +0 -0
  622. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
  623. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
  624. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_qa_parser.py +0 -0
  625. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_registry.py +0 -0
  626. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_round5_fixes.py +0 -0
  627. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/mcp/tools/test_subagent.py +0 -0
  628. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/observability/__init__.py +0 -0
  629. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/observability/test_drift.py +0 -0
  630. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/observability/test_logging.py +0 -0
  631. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/observability/test_retrospective.py +0 -0
  632. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/__init__.py +0 -0
  633. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_adapter.py +0 -0
  634. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_capabilities.py +0 -0
  635. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
  636. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_codex_recursion_guard.py +0 -0
  637. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
  638. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_control_plane.py +0 -0
  639. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_coordinator.py +0 -0
  640. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
  641. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_events.py +0 -0
  642. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
  643. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
  644. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_gemini_cli_runtime.py +0 -0
  645. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_hermes_runtime.py +0 -0
  646. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
  647. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_level_context.py +0 -0
  648. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_mcp_config.py +0 -0
  649. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
  650. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_opencode_runtime.py +0 -0
  651. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
  652. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_parallel_executor_atomic_judgment.py +0 -0
  653. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_parallel_executor_recursive_depth.py +0 -0
  654. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
  655. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_policy.py +0 -0
  656. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_rate_limit.py +0 -0
  657. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_runner.py +0 -0
  658. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
  659. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
  660. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
  661. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_sandbox_class.py +0 -0
  662. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_seed_prompt.py +0 -0
  663. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_session.py +0 -0
  664. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/orchestrator/test_workflow_state.py +0 -0
  665. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/persistence/__init__.py +0 -0
  666. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/persistence/test_brownfield_store.py +0 -0
  667. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/persistence/test_checkpoint.py +0 -0
  668. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/persistence/test_event_store.py +0 -0
  669. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/persistence/test_schema.py +0 -0
  670. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/persistence/test_uow.py +0 -0
  671. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/plugin/__init__.py +0 -0
  672. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/plugin/agents/__init__.py +0 -0
  673. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/plugin/agents/test_registry.py +0 -0
  674. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/plugin/orchestration/__init__.py +0 -0
  675. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
  676. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/plugin/skills/__init__.py +0 -0
  677. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/plugin/skills/test_keywords.py +0 -0
  678. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/plugin/skills/test_registry.py +0 -0
  679. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/pm/__init__.py +0 -0
  680. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/pm/test_renderer.py +0 -0
  681. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/providers/__init__.py +0 -0
  682. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/providers/test_base.py +0 -0
  683. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/providers/test_claude_code_adapter.py +0 -0
  684. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
  685. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/providers/test_factory.py +0 -0
  686. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/providers/test_gemini_cli_adapter.py +0 -0
  687. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/providers/test_litellm_adapter.py +0 -0
  688. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/providers/test_opencode_adapter.py +0 -0
  689. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/resilience/__init__.py +0 -0
  690. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/resilience/test_lateral.py +0 -0
  691. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/resilience/test_recovery.py +0 -0
  692. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/resilience/test_stagnation.py +0 -0
  693. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/router/__init__.py +0 -0
  694. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/router/test_command_parser.py +0 -0
  695. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/router/test_dispatch.py +0 -0
  696. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/router/test_dispatch_result_shapes.py +0 -0
  697. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/router/test_extract_first_argument.py +0 -0
  698. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/router/test_invalid_dispatch_input_types.py +0 -0
  699. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/router/test_malformed_unknown_dispatch_errors.py +0 -0
  700. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/router/test_not_handled_resolution.py +0 -0
  701. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/router/test_registry.py +0 -0
  702. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/router/test_repository_dispatch_guard.py +0 -0
  703. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/router/test_router_resolution_pipeline.py +0 -0
  704. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/router/test_typed_frontmatter_fields.py +0 -0
  705. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/router/test_valid_dispatch_normalization.py +0 -0
  706. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/routing/__init__.py +0 -0
  707. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/routing/test_complexity.py +0 -0
  708. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/routing/test_downgrade.py +0 -0
  709. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/routing/test_escalation.py +0 -0
  710. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/routing/test_router.py +0 -0
  711. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/routing/test_tiers.py +0 -0
  712. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/scripts/test_keyword_detector.py +0 -0
  713. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/scripts/test_session_start.py +0 -0
  714. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/scripts/test_version_check.py +0 -0
  715. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/secondary/__init__.py +0 -0
  716. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/secondary/test_scheduler.py +0 -0
  717. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/secondary/test_todo_registry.py +0 -0
  718. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/skills/test_skill_artifacts.py +0 -0
  719. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/test_artifact_collector.py +0 -0
  720. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/test_codex_artifacts.py +0 -0
  721. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/test_convergence.py +0 -0
  722. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/test_dashboard.py +0 -0
  723. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/test_dependencies_configured.py +0 -0
  724. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/test_evolve_rewind.py +0 -0
  725. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/test_evolve_step.py +0 -0
  726. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/test_graceful_shutdown.py +0 -0
  727. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/test_lineage.py +0 -0
  728. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/test_main_entry_point.py +0 -0
  729. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/test_module_structure.py +0 -0
  730. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/test_project_initialization.py +0 -0
  731. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/test_projector_directives.py +0 -0
  732. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/test_projector_rewind.py +0 -0
  733. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/test_ralph_parser.py +0 -0
  734. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/test_ralph_rewind.py +0 -0
  735. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/test_regression.py +0 -0
  736. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/test_tooling_configuration.py +0 -0
  737. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/test_verification.py +0 -0
  738. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/tui/__init__.py +0 -0
  739. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/tui/test_app.py +0 -0
  740. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/tui/test_cancelled_display.py +0 -0
  741. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/tui/test_events.py +0 -0
  742. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/tui/test_lineage_viewer.py +0 -0
  743. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/tui/test_screens.py +0 -0
  744. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/tui/test_session_selector_replay.py +0 -0
  745. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tests/unit/tui/test_widgets.py +0 -0
  746. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/tools/sync_github_project.py +0 -0
  747. {ouroboros_ai-0.31.2.dev18 → ouroboros_ai-0.31.2.dev20}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ouroboros-ai
3
- Version: 0.31.2.dev18
3
+ Version: 0.31.2.dev20
4
4
  Summary: Specification-first workflow engine for AI coding agents. Works with Claude Code and Codex CLI.
5
5
  Author-email: Q00 <jqyu.lee@gmail.com>
6
6
  License-File: LICENSE
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.31.2.dev18'
22
- __version_tuple__ = version_tuple = (0, 31, 2, 'dev18')
21
+ __version__ = version = '0.31.2.dev20'
22
+ __version_tuple__ = version_tuple = (0, 31, 2, 'dev20')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -0,0 +1,104 @@
1
+ """BridgeAwareMixin for MCP tool handlers that need external MCP access.
2
+
3
+ Handlers that inherit from this mixin will automatically receive
4
+ an MCPClientManager reference when an MCPBridge is configured,
5
+ via loop-based injection in the composition root.
6
+
7
+ This module exposes two equivalent injection helpers:
8
+
9
+ * :func:`inject_bridge` — original entry point. Accepts a raw
10
+ ``MCPBridge`` instance and populates the mixin fields.
11
+ * :func:`inject_runtime_context` — context-aware entry point added by
12
+ #474. Accepts an :class:`AgentRuntimeContext` and pulls the bridge
13
+ off it. Subsequent ``mcp_manager`` plumbing migrations (#474 PR-3
14
+ through PR-5) gradually swap call sites at the composition root from
15
+ the legacy form to this one, then move handler internals to read
16
+ ``context.mcp_bridge`` directly instead of ``self.mcp_manager``.
17
+
18
+ Both helpers are additive: the legacy form continues to work for
19
+ callers that have not yet adopted the runtime context, so the
20
+ migration can land in small reviewable slices without a flag day.
21
+ """
22
+
23
+ from __future__ import annotations
24
+
25
+ from dataclasses import dataclass, field
26
+ from typing import TYPE_CHECKING, Any
27
+
28
+ if TYPE_CHECKING:
29
+ from ouroboros.orchestrator.agent_runtime_context import AgentRuntimeContext
30
+
31
+
32
+ @dataclass
33
+ class BridgeAwareMixin:
34
+ """Mixin for handlers that need access to external MCP servers.
35
+
36
+ Provides ``mcp_manager`` and ``mcp_tool_prefix`` fields that are
37
+ injected by the composition root when an MCPBridge is configured.
38
+ Both fields default to None/"" so handlers work without a bridge.
39
+
40
+ Usage::
41
+
42
+ @dataclass
43
+ class MyHandler(BridgeAwareMixin):
44
+ other_field: str = ""
45
+
46
+ async def handle(self, arguments):
47
+ if self.mcp_manager:
48
+ tools = await self.mcp_manager.list_all_tools()
49
+ """
50
+
51
+ mcp_manager: Any | None = field(default=None, repr=False)
52
+ mcp_tool_prefix: str = ""
53
+
54
+
55
+ def inject_bridge(handler: object, bridge: object | None) -> bool:
56
+ """Inject bridge manager into a BridgeAwareMixin handler.
57
+
58
+ Args:
59
+ handler: A tool handler, possibly BridgeAwareMixin.
60
+ bridge: An MCPBridge instance (must have .manager and .tool_prefix).
61
+
62
+ Returns:
63
+ True if injection was performed, False otherwise.
64
+ """
65
+ if bridge is None or not isinstance(handler, BridgeAwareMixin):
66
+ return False
67
+
68
+ handler.mcp_manager = getattr(bridge, "manager", None)
69
+ handler.mcp_tool_prefix = getattr(bridge, "tool_prefix", "")
70
+ return True
71
+
72
+
73
+ def inject_runtime_context(
74
+ handler: object,
75
+ context: AgentRuntimeContext | None,
76
+ ) -> bool:
77
+ """Inject the ``AgentRuntimeContext``'s bridge into a mixin handler.
78
+
79
+ Equivalent to calling :func:`inject_bridge` with
80
+ ``context.mcp_bridge`` but accepts the runtime context directly.
81
+ This is the entry point subsequent #474 PRs use at the composition
82
+ root so handlers can reach the bridge through the same context
83
+ object that already carries the EventStore and the
84
+ :class:`ControlBus` (per #476 Q1's narrow-membership commitment).
85
+
86
+ Args:
87
+ handler: A tool handler, possibly :class:`BridgeAwareMixin`.
88
+ context: The :class:`AgentRuntimeContext` carrying the runtime's
89
+ optional MCP bridge. Passing ``None`` is treated as
90
+ "no bridge available" and skips injection — that keeps the
91
+ non-MCP code paths valid.
92
+
93
+ Returns:
94
+ ``True`` if injection was performed; ``False`` otherwise.
95
+
96
+ The function is intentionally a thin adapter so the legacy
97
+ :func:`inject_bridge` code path remains the single source of truth
98
+ for the actual attribute write. When the migration is complete and
99
+ every caller flows through this helper, the legacy entry point can
100
+ be deprecated without behaviour change.
101
+ """
102
+ if context is None:
103
+ return False
104
+ return inject_bridge(handler, context.mcp_bridge)
@@ -0,0 +1,45 @@
1
+ """``AgentRuntimeContext`` — the runtime-offering side of #476 Q1.
2
+
3
+ The runtime context describes *what the orchestrator runtime offers* a
4
+ handler — the EventStore it appends into, optional capability sources,
5
+ and the :class:`ControlBus` that lets handlers react to directive events.
6
+ The context is intentionally narrow: per the maintainer commitment in
7
+ #476 Q1, every new field added later must include a one-line PR-body
8
+ justification so the type does not drift into a service locator.
9
+
10
+ This first step keeps the membership minimal:
11
+
12
+ * ``event_store`` — the persistence boundary handlers already share.
13
+ * ``runtime_backend`` / ``llm_backend`` — informational labels existing
14
+ callers (rate-limit, telemetry) already pass alongside the bridge.
15
+ * ``mcp_bridge`` — the existing capability source from #280's bridge
16
+ work; optional so non-MCP code paths stay valid.
17
+ * ``control`` — the :class:`ControlBus` introduced alongside this
18
+ context; ``None`` while #474's migration is in progress so existing
19
+ callers compile unchanged.
20
+
21
+ Subsequent issues (#474, #475) wire concrete handlers to consume the
22
+ context. This module deliberately does *not* import any handler-side
23
+ type so that adopting the context becomes a one-import change.
24
+ """
25
+
26
+ from __future__ import annotations
27
+
28
+ from dataclasses import dataclass
29
+ from typing import TYPE_CHECKING
30
+
31
+ if TYPE_CHECKING:
32
+ from ouroboros.mcp.bridge.bridge import MCPBridge
33
+ from ouroboros.orchestrator.control_bus import ControlBus
34
+ from ouroboros.persistence.event_store import EventStore
35
+
36
+
37
+ @dataclass(frozen=True, slots=True)
38
+ class AgentRuntimeContext:
39
+ """Minimal, narrow-membership runtime context handed to MCP handlers."""
40
+
41
+ event_store: EventStore
42
+ runtime_backend: str | None = None
43
+ llm_backend: str | None = None
44
+ mcp_bridge: MCPBridge | None = None
45
+ control: ControlBus | None = None
@@ -0,0 +1,163 @@
1
+ """In-process ControlBus for ``control.directive.emitted`` events.
2
+
3
+ The bus is the *reactive* surface paired with the *observational* event
4
+ factory landed in #492. Subscribers register a predicate and a handler;
5
+ when callsites publish a directive event onto the bus, every matching
6
+ handler fires concurrently on its own task. A slow or failing handler
7
+ never blocks other handlers or the publisher.
8
+
9
+ Per the maintainer alignment in #476 Q1, the bus is exposed as
10
+ ``AgentRuntimeContext.control`` (see :mod:`agent_runtime_context`). The
11
+ context describes *what the runtime offers*; the bus describes *where
12
+ directives flow*. Two different concerns, two different names.
13
+
14
+ Scope choices baked in here:
15
+
16
+ * The bus does *not* know about persistence. EventStore stays simple;
17
+ callsites call :meth:`ControlBus.publish` themselves after
18
+ :meth:`EventStore.append`. This honours the "no service locator"
19
+ guardrail from #476 Q1 (narrow membership for the runtime context) and
20
+ keeps the bus a pure in-process primitive that future callers — for
21
+ example the #474 ``AgentRuntimeContext`` migration and #475
22
+ ``evolve_step`` / ``unstuck`` / ``ralph`` wiring — can adopt
23
+ incrementally.
24
+
25
+ * Cross-runtime delivery is a *separate* concern; that is the Mesh
26
+ (sub-RFC :doc:`../../docs/rfc/mesh`). The Mesh, when it lands, can
27
+ reuse this surface or wrap it.
28
+
29
+ * Forging resistance is *not* a goal. The cooperative-trust model from
30
+ #476 explicitly accepts that any in-process actor can publish; the bus
31
+ does not police identity.
32
+ """
33
+
34
+ from __future__ import annotations
35
+
36
+ import asyncio
37
+ from collections.abc import Awaitable, Callable
38
+ from dataclasses import dataclass, field
39
+ import logging
40
+ from typing import TYPE_CHECKING, Any
41
+
42
+ if TYPE_CHECKING:
43
+ from ouroboros.events.base import BaseEvent
44
+
45
+
46
+ logger = logging.getLogger(__name__)
47
+
48
+
49
+ Predicate = Callable[["BaseEvent"], bool]
50
+ Handler = Callable[["BaseEvent"], Awaitable[None]]
51
+
52
+
53
+ @dataclass(frozen=True, slots=True)
54
+ class SubscriptionHandle:
55
+ """Opaque token returned by :meth:`ControlBus.subscribe`.
56
+
57
+ Callers pass it back to :meth:`ControlBus.unsubscribe` to detach.
58
+ Handles are scoped to the bus that created them so identical local
59
+ integer IDs from different buses cannot detach each other.
60
+ """
61
+
62
+ _id: int
63
+ _owner: Any
64
+
65
+
66
+ @dataclass(slots=True)
67
+ class _Subscription:
68
+ """One predicate/handler pair tracked by the bus."""
69
+
70
+ handle: SubscriptionHandle
71
+ predicate: Predicate
72
+ handler: Handler
73
+
74
+
75
+ @dataclass(slots=True)
76
+ class ControlBus:
77
+ """Concurrent in-process publish/subscribe surface for control events.
78
+
79
+ The bus is intended to live on :class:`AgentRuntimeContext` for the
80
+ lifetime of an orchestrator session. It is **not** thread-safe in the
81
+ classic shared-memory sense; it expects a single asyncio event loop.
82
+ """
83
+
84
+ _subscriptions: list[_Subscription] = field(default_factory=list)
85
+ _next_id: int = 0
86
+ _owner: object = field(default_factory=object)
87
+ _tasks: set[asyncio.Task[None]] = field(default_factory=set)
88
+ _spawn: Callable[[Awaitable[None]], asyncio.Task[None]] | None = None
89
+
90
+ def subscribe(self, predicate: Predicate, handler: Handler) -> SubscriptionHandle:
91
+ """Register *handler* to be invoked when *predicate* returns ``True``.
92
+
93
+ Args:
94
+ predicate: Pure synchronous filter on the event. Predicate
95
+ exceptions are treated like ``False`` and logged so a
96
+ broken predicate cannot starve other subscribers.
97
+ handler: Async callable invoked once per matching event. The
98
+ handler is awaited on its own task so a slow handler does
99
+ not block fast ones.
100
+
101
+ Returns:
102
+ A :class:`SubscriptionHandle` accepted by
103
+ :meth:`unsubscribe`.
104
+ """
105
+ handle = SubscriptionHandle(_id=self._next_id, _owner=self._owner)
106
+ self._next_id += 1
107
+ self._subscriptions.append(
108
+ _Subscription(handle=handle, predicate=predicate, handler=handler)
109
+ )
110
+ return handle
111
+
112
+ def unsubscribe(self, handle: SubscriptionHandle) -> None:
113
+ """Remove the subscription identified by *handle*.
114
+
115
+ Idempotent: detaching an unknown or already-removed handle is a
116
+ no-op.
117
+ """
118
+ if handle._owner is not self._owner:
119
+ return
120
+ self._subscriptions = [sub for sub in self._subscriptions if sub.handle != handle]
121
+
122
+ def publish(self, event: BaseEvent) -> tuple[asyncio.Task[None], ...]:
123
+ """Spawn a delivery task for every matching subscription.
124
+
125
+ Returns a tuple of the spawned tasks so tests can ``await`` them.
126
+ Production callers can ignore the return value: handler errors
127
+ are logged on the task so they cannot poison the publisher.
128
+
129
+ A subscription whose predicate raises an exception is treated as
130
+ non-matching for that event; the predicate is not unsubscribed.
131
+ """
132
+ spawned: list[asyncio.Task[None]] = []
133
+ for sub in tuple(self._subscriptions):
134
+ try:
135
+ if not sub.predicate(event):
136
+ continue
137
+ except Exception as exc: # noqa: BLE001 — predicate isolation
138
+ logger.warning(
139
+ "control_bus.predicate_raised",
140
+ extra={"handle_id": sub.handle._id, "error": repr(exc)},
141
+ )
142
+ continue
143
+
144
+ spawned.append(self._spawn_handler(sub.handler, event))
145
+ return tuple(spawned)
146
+
147
+ def _spawn_handler(self, handler: Handler, event: BaseEvent) -> asyncio.Task[None]:
148
+ """Run *handler* on its own task with structured error isolation."""
149
+ spawn = self._spawn or asyncio.ensure_future
150
+ task = spawn(self._invoke_handler(handler, event))
151
+ self._tasks.add(task)
152
+ task.add_done_callback(self._tasks.discard)
153
+ return task
154
+
155
+ @staticmethod
156
+ async def _invoke_handler(handler: Handler, event: BaseEvent) -> None:
157
+ try:
158
+ await handler(event)
159
+ except Exception as exc: # noqa: BLE001 — handler isolation
160
+ logger.warning(
161
+ "control_bus.handler_raised",
162
+ extra={"event_type": event.type, "error": repr(exc)},
163
+ )
@@ -0,0 +1,111 @@
1
+ """Unit tests for the AgentRuntimeContext-aware bridge injection helper.
2
+
3
+ Issue: #474 PR-1 of the AgentRuntimeContext + ControlBus migration.
4
+ The new ``inject_runtime_context`` helper is purely additive — the
5
+ legacy ``inject_bridge`` continues to work, and handler internals are
6
+ unchanged. Subsequent migration PRs swap composition-root call sites
7
+ from the legacy form to this one, then move handler internals to read
8
+ ``context.mcp_bridge`` directly.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ from dataclasses import dataclass, field
14
+ from typing import Any
15
+
16
+ from ouroboros.mcp.tools.bridge_mixin import (
17
+ BridgeAwareMixin,
18
+ inject_bridge,
19
+ inject_runtime_context,
20
+ )
21
+ from ouroboros.orchestrator.agent_runtime_context import AgentRuntimeContext
22
+ from ouroboros.persistence.event_store import EventStore
23
+
24
+
25
+ @dataclass
26
+ class _FakeBridge:
27
+ """Minimal stand-in for ``MCPBridge`` carrying the two attributes the mixin reads."""
28
+
29
+ manager: Any = None
30
+ tool_prefix: str = ""
31
+
32
+
33
+ @dataclass
34
+ class _FakeHandler(BridgeAwareMixin):
35
+ """Subclass that does nothing extra — exercises the mixin in isolation."""
36
+
37
+ extra_field: str = field(default="")
38
+
39
+
40
+ def _runtime_context(bridge: _FakeBridge | None = None) -> AgentRuntimeContext:
41
+ """Build a minimal runtime context for tests."""
42
+ store = EventStore("sqlite+aiosqlite:///:memory:")
43
+ return AgentRuntimeContext(event_store=store, mcp_bridge=bridge)
44
+
45
+
46
+ class TestInjectRuntimeContext:
47
+ def test_injects_bridge_from_context(self) -> None:
48
+ """A handler with the mixin receives the bridge from context.mcp_bridge."""
49
+ manager = object()
50
+ bridge = _FakeBridge(manager=manager, tool_prefix="ext_")
51
+ context = _runtime_context(bridge=bridge)
52
+ handler = _FakeHandler()
53
+
54
+ assert inject_runtime_context(handler, context) is True
55
+ assert handler.mcp_manager is manager
56
+ assert handler.mcp_tool_prefix == "ext_"
57
+
58
+ def test_returns_false_when_context_is_none(self) -> None:
59
+ """``None`` context is treated as 'no bridge' — non-MCP paths stay valid."""
60
+ handler = _FakeHandler()
61
+ assert inject_runtime_context(handler, None) is False
62
+ assert handler.mcp_manager is None
63
+ assert handler.mcp_tool_prefix == ""
64
+
65
+ def test_returns_false_when_context_has_no_bridge(self) -> None:
66
+ """A context without an mcp_bridge does not write to the handler."""
67
+ context = _runtime_context(bridge=None)
68
+ handler = _FakeHandler()
69
+
70
+ assert inject_runtime_context(handler, context) is False
71
+ assert handler.mcp_manager is None
72
+
73
+ def test_returns_false_when_handler_lacks_mixin(self) -> None:
74
+ """Handlers that do not inherit from BridgeAwareMixin are skipped."""
75
+
76
+ class _BareHandler:
77
+ mcp_manager: Any = None
78
+ mcp_tool_prefix: str = ""
79
+
80
+ bridge = _FakeBridge(manager=object(), tool_prefix="ext_")
81
+ context = _runtime_context(bridge=bridge)
82
+ handler = _BareHandler()
83
+
84
+ assert inject_runtime_context(handler, context) is False
85
+ assert handler.mcp_manager is None
86
+ assert handler.mcp_tool_prefix == ""
87
+
88
+ def test_legacy_inject_bridge_still_works(self) -> None:
89
+ """The original entry point keeps the same contract."""
90
+ manager = object()
91
+ bridge = _FakeBridge(manager=manager, tool_prefix="ext_")
92
+ handler = _FakeHandler()
93
+
94
+ assert inject_bridge(handler, bridge) is True
95
+ assert handler.mcp_manager is manager
96
+ assert handler.mcp_tool_prefix == "ext_"
97
+
98
+ def test_runtime_context_and_legacy_paths_are_equivalent(self) -> None:
99
+ """Both helpers must produce the same handler state for the same bridge."""
100
+ manager = object()
101
+ bridge = _FakeBridge(manager=manager, tool_prefix="ext_")
102
+ context = _runtime_context(bridge=bridge)
103
+
104
+ legacy = _FakeHandler()
105
+ modern = _FakeHandler()
106
+
107
+ inject_bridge(legacy, bridge)
108
+ inject_runtime_context(modern, context)
109
+
110
+ assert legacy.mcp_manager is modern.mcp_manager
111
+ assert legacy.mcp_tool_prefix == modern.mcp_tool_prefix
@@ -0,0 +1,63 @@
1
+ """Unit tests for :class:`AgentRuntimeContext`.
2
+
3
+ Issue: #515 / #474 Q1. The context is intentionally narrow: it must
4
+ remain frozen, slot-based, and only carry the minimal fields the
5
+ maintainer alignment in #476 Q1 specified.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import dataclasses
11
+
12
+ import pytest
13
+
14
+ from ouroboros.orchestrator.agent_runtime_context import AgentRuntimeContext
15
+ from ouroboros.orchestrator.control_bus import ControlBus
16
+ from ouroboros.persistence.event_store import EventStore
17
+
18
+
19
+ def test_context_is_frozen_and_slotted() -> None:
20
+ """The dataclass must reject attribute mutation post-construction."""
21
+ store = EventStore("sqlite+aiosqlite:///:memory:")
22
+ context = AgentRuntimeContext(event_store=store)
23
+
24
+ assert dataclasses.is_dataclass(context)
25
+ assert context.runtime_backend is None
26
+ assert context.llm_backend is None
27
+ assert context.mcp_bridge is None
28
+ assert context.control is None
29
+
30
+ with pytest.raises(dataclasses.FrozenInstanceError):
31
+ context.runtime_backend = "codex_cli" # type: ignore[misc]
32
+
33
+
34
+ def test_context_carries_optional_control_bus() -> None:
35
+ """The optional ControlBus slot is the reactive surface for #515."""
36
+ store = EventStore("sqlite+aiosqlite:///:memory:")
37
+ bus = ControlBus()
38
+ context = AgentRuntimeContext(event_store=store, control=bus)
39
+
40
+ assert context.control is bus
41
+ # Existing handlers that do not opt into the bus still see the
42
+ # default ``None`` and remain valid.
43
+ no_bus = AgentRuntimeContext(event_store=store)
44
+ assert no_bus.control is None
45
+
46
+
47
+ def test_context_membership_is_narrow() -> None:
48
+ """Adding a field requires a deliberate PR (no service-locator drift).
49
+
50
+ This regression test pins the field set so reviewers see explicit
51
+ diffs when the membership grows. If this assertion fails because a
52
+ field was added, the PR must include a justification line per the
53
+ #476 Q1 narrow-membership commitment.
54
+ """
55
+ expected = {
56
+ "event_store",
57
+ "runtime_backend",
58
+ "llm_backend",
59
+ "mcp_bridge",
60
+ "control",
61
+ }
62
+ actual = {f.name for f in dataclasses.fields(AgentRuntimeContext)}
63
+ assert actual == expected