monkeybot 2.1.1__tar.gz → 2.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (569) hide show
  1. {monkeybot-2.1.1 → monkeybot-2.2.0}/.dockerignore +0 -3
  2. monkeybot-2.2.0/.github/workflows/live-eval-smoke.yml +199 -0
  3. {monkeybot-2.1.1 → monkeybot-2.2.0}/.github/workflows/prepare-release.yml +1 -1
  4. {monkeybot-2.1.1 → monkeybot-2.2.0}/.github/workflows/publish-release.yml +53 -2
  5. {monkeybot-2.1.1 → monkeybot-2.2.0}/.gitignore +1 -3
  6. {monkeybot-2.1.1 → monkeybot-2.2.0}/BACKLOG.md +7 -7
  7. {monkeybot-2.1.1 → monkeybot-2.2.0}/CHANGELOG.md +44 -0
  8. monkeybot-2.2.0/CONTRIBUTING.md +42 -0
  9. monkeybot-2.2.0/PKG-INFO +180 -0
  10. monkeybot-2.2.0/README.md +98 -0
  11. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/pyproject.toml +4 -2
  12. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/skills/monkeybot/SKILL.md +3 -1
  13. monkeybot-2.2.0/cli/src/monkeybot_cli/__init__.py +8 -0
  14. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/commands/chat.py +8 -1
  15. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/commands/doctor.py +111 -11
  16. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/commands/run_cmd.py +2 -3
  17. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/commands/validate.py +2 -1
  18. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/compat.py +1 -1
  19. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/config_resolve.py +6 -12
  20. monkeybot-2.2.0/cli/src/monkeybot_cli/gateway_health.py +71 -0
  21. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/scaffold.py +27 -51
  22. monkeybot-2.2.0/cli/src/monkeybot_cli/scaffold_defaults/Dockerfile +27 -0
  23. monkeybot-2.2.0/cli/src/monkeybot_cli/scaffold_defaults/browser/SKILL.md +15 -0
  24. monkeybot-2.2.0/cli/src/monkeybot_cli/scaffold_defaults/dockerignore +5 -0
  25. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/scaffold_defaults/env.example +1 -0
  26. monkeybot-2.1.1/monkeybot_config_example/mcp.example.json → monkeybot-2.2.0/cli/src/monkeybot_cli/scaffold_defaults/mcp.json +3 -6
  27. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/scaffold_defaults/monkeybot.example.yaml +5 -2
  28. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_chat_errors.py +1 -0
  29. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_cli.py +64 -7
  30. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_config_resolve.py +12 -1
  31. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_extras_catalog.py +1 -1
  32. monkeybot-2.2.0/cli/tests/test_gateway_health.py +135 -0
  33. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_opensandbox_lifecycle.py +2 -2
  34. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_run_cmd.py +3 -2
  35. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_scaffold.py +15 -10
  36. {monkeybot-2.1.1 → monkeybot-2.2.0}/docker/Dockerfile +3 -2
  37. {monkeybot-2.1.1 → monkeybot-2.2.0}/docker/docker-compose.sandbox.yml +9 -9
  38. {monkeybot-2.1.1 → monkeybot-2.2.0}/docker/opensandbox.docker.toml +1 -1
  39. monkeybot-2.2.0/docker/sandbox.Dockerfile +9 -0
  40. monkeybot-2.2.0/docker-compose.yml +13 -0
  41. monkeybot-2.2.0/docs/agent-layout.md +109 -0
  42. {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/browser-mcp.md +33 -23
  43. monkeybot-2.2.0/docs/cloud-deployment-design.md +96 -0
  44. {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/deploy-aws-agentcore.md +8 -2
  45. {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/deploy-pattern-a-container.md +82 -41
  46. {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/deploy-pattern-b-serverless.md +25 -3
  47. {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/deploy-pattern-c-agent-platform.md +23 -7
  48. {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/deploy-pattern-d-realtime.md +22 -15
  49. {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/features.md +31 -10
  50. {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/getting-started.md +25 -7
  51. monkeybot-2.2.0/docs/live-evals.md +64 -0
  52. {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/mcp.md +11 -12
  53. {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/observability-runbook.md +15 -8
  54. {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/progressive-mcp-tools.md +8 -4
  55. {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/skills.md +20 -3
  56. {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/sse-gateway-ui.md +1 -1
  57. {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/assertions.py +39 -5
  58. monkeybot-2.2.0/evals/diff.py +123 -0
  59. {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/models.py +4 -32
  60. {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/persistence.py +12 -5
  61. {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/report.py +25 -5
  62. {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/runner.py +15 -0
  63. {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/scenario_loader.py +5 -16
  64. {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/scenarios/mcp/tool_invoke.yaml +3 -2
  65. {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/scenarios/memory/recall_cross_session.yaml +1 -1
  66. {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/scenarios/memory/recall_single_session.yaml +1 -1
  67. monkeybot-2.2.0/evals/scenarios/tools/core_read.yaml +10 -0
  68. {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/scorer.py +49 -30
  69. monkeybot-2.2.0/evals/smoke_agent/.env.example +5 -0
  70. {monkeybot-2.1.1/demo_agent → monkeybot-2.2.0/evals/smoke_agent}/.gitignore +1 -0
  71. monkeybot-2.2.0/evals/smoke_agent/monkeybot_config/command_allowlist.yaml +33 -0
  72. monkeybot-2.2.0/evals/smoke_agent/monkeybot_config/monkeybot.yaml +52 -0
  73. monkeybot-2.2.0/evals/smoke_agent/pyproject.toml +13 -0
  74. monkeybot-2.2.0/evals/smoke_agent/skills/browser/SKILL.md +8 -0
  75. {monkeybot-2.1.1/demo_agent → monkeybot-2.2.0/evals/smoke_agent}/uv.lock +395 -1033
  76. {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/suites/smoke.yaml +1 -1
  77. {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/test_assertions.py +22 -0
  78. monkeybot-2.2.0/evals/test_diff.py +86 -0
  79. {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/test_report.py +35 -1
  80. monkeybot-2.2.0/evals/test_scorer.py +53 -0
  81. monkeybot-2.2.0/examples/README.md +34 -0
  82. {monkeybot-2.1.1 → monkeybot-2.2.0}/examples/skills/diagnostics/README.md +1 -1
  83. {monkeybot-2.1.1 → monkeybot-2.2.0}/examples/skills/diagnostics/SKILL.md +5 -10
  84. {monkeybot-2.1.1/demo_agent/workspace → monkeybot-2.2.0/examples}/skills/image-generator/SKILL.md +6 -8
  85. {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/pyproject.toml +2 -2
  86. {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/src/browser_mcp/playbooks.py +4 -2
  87. {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/src/browser_mcp/screenshots.py +2 -8
  88. {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/tests/test_playbooks.py +7 -0
  89. {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/tests/test_screenshots.py +12 -2
  90. {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/uv.lock +542 -542
  91. {monkeybot-2.1.1 → monkeybot-2.2.0}/pyproject.toml +4 -4
  92. {monkeybot-2.1.1 → monkeybot-2.2.0}/pytest.ini +2 -3
  93. {monkeybot-2.1.1 → monkeybot-2.2.0}/scripts/release.py +88 -26
  94. {monkeybot-2.1.1 → monkeybot-2.2.0}/scripts/verify_memory.py +2 -1
  95. monkeybot-2.2.0/src/monkeybot/__init__.py +8 -0
  96. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/config/runtime_env.py +44 -9
  97. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/config/yaml_loader.py +6 -12
  98. monkeybot-2.2.0/src/monkeybot/core/layout.py +198 -0
  99. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/sqlite.py +5 -4
  100. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/subagents/subagent_proto.py +5 -21
  101. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/subagents/subagent_worker.py +3 -10
  102. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/core_tool_executor.py +5 -4
  103. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/patch.py +4 -4
  104. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/sandbox_executor.py +124 -30
  105. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/workspace_service.py +73 -19
  106. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/workspace_tools.py +2 -1
  107. monkeybot-2.2.0/src/monkeybot/core/workspace_layout.py +26 -0
  108. monkeybot-2.2.0/src/monkeybot/gateway/bootstrap.py +67 -0
  109. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/main.py +14 -11
  110. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/realtime/__init__.py +14 -1
  111. monkeybot-2.2.0/src/monkeybot/gateway/realtime/app.py +127 -0
  112. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/realtime/routes.py +4 -10
  113. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/realtime_main.py +12 -10
  114. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/app.py +16 -30
  115. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/cli/test_main.py +3 -1
  116. monkeybot-2.2.0/tests/conftest.py +43 -0
  117. monkeybot-2.2.0/tests/core/test_agent_layout.py +165 -0
  118. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_context.py +1 -1
  119. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_core_tool_executor.py +2 -0
  120. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_history.py +1 -1
  121. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_runtime_env.py +22 -2
  122. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_sandbox_executor.py +95 -1
  123. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_workspace_layout.py +12 -2
  124. monkeybot-2.2.0/tests/core/test_workspace_symlinks.py +67 -0
  125. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/sse/test_routes.py +8 -2
  126. monkeybot-2.2.0/tests/gateway/test_otel_lifespan.py +97 -0
  127. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/skills/test_generate_image_script.py +2 -2
  128. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/test_packaging_config.py +10 -1
  129. monkeybot-2.2.0/tests/test_release_script.py +151 -0
  130. {monkeybot-2.1.1 → monkeybot-2.2.0}/uv.lock +2561 -2431
  131. monkeybot-2.1.1/.github/workflows/live-eval-smoke.yml +0 -158
  132. monkeybot-2.1.1/AGENTS.md +0 -34
  133. monkeybot-2.1.1/PKG-INFO +0 -318
  134. monkeybot-2.1.1/README.md +0 -237
  135. monkeybot-2.1.1/cli/src/monkeybot_cli/__init__.py +0 -3
  136. monkeybot-2.1.1/cli/src/monkeybot_cli/gateway_health.py +0 -34
  137. monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/mcp.json +0 -49
  138. monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/setup-workspace.sh +0 -24
  139. monkeybot-2.1.1/demo_agent/.env.example +0 -21
  140. monkeybot-2.1.1/demo_agent/docker-compose.langfuse.yml +0 -159
  141. monkeybot-2.1.1/demo_agent/docker-compose.observability.yml +0 -31
  142. monkeybot-2.1.1/demo_agent/firebase.json +0 -11
  143. monkeybot-2.1.1/demo_agent/firestore.indexes.json +0 -14
  144. monkeybot-2.1.1/demo_agent/pyproject.toml +0 -17
  145. monkeybot-2.1.1/demo_agent/run.sh +0 -532
  146. monkeybot-2.1.1/docker/Dockerfile.demo-sandbox +0 -8
  147. monkeybot-2.1.1/docker-compose.evals.yml +0 -24
  148. monkeybot-2.1.1/docker-compose.yml +0 -29
  149. monkeybot-2.1.1/docs/chat-tui-improvements.md +0 -220
  150. monkeybot-2.1.1/docs/cli-pypi-distribution.md +0 -264
  151. monkeybot-2.1.1/docs/cloud-deployment-design.md +0 -555
  152. monkeybot-2.1.1/docs/eval-pr-scorecard.md +0 -417
  153. monkeybot-2.1.1/docs/monkeycleaner-cli-prettier.md +0 -38
  154. monkeybot-2.1.1/docs/realtime-streaming-design.md +0 -542
  155. monkeybot-2.1.1/evals/Dockerfile +0 -20
  156. monkeybot-2.1.1/evals/main.py +0 -259
  157. monkeybot-2.1.1/evals/pyproject.toml +0 -32
  158. monkeybot-2.1.1/evals/requirements.txt +0 -9
  159. monkeybot-2.1.1/evals/scenarios/operator/.gitkeep +0 -0
  160. monkeybot-2.1.1/evals/scenarios/tools/core_read.yaml +0 -11
  161. monkeybot-2.1.1/evals/store.py +0 -60
  162. monkeybot-2.1.1/evals/uv.lock +0 -2153
  163. monkeybot-2.1.1/evals/ws_manager.py +0 -46
  164. monkeybot-2.1.1/examples/README.md +0 -63
  165. monkeybot-2.1.1/examples/skills/browser/SKILL.md +0 -14
  166. monkeybot-2.1.1/examples/skills/image-generator/SKILL.md +0 -10
  167. monkeybot-2.1.1/examples/skills/image-generator/generate_image.py +0 -199
  168. monkeybot-2.1.1/monkeybot_config_example/command_allowlist.example.yaml +0 -61
  169. monkeybot-2.1.1/monkeybot_config_example/monkeybot.example.yaml +0 -209
  170. monkeybot-2.1.1/monkeybot_config_example/opensandbox.docker.example.toml +0 -51
  171. monkeybot-2.1.1/monkeybot_config_example/otel-collector.demo-dual.example.yaml +0 -46
  172. monkeybot-2.1.1/monkeybot_config_example/otel-collector.demo.example.yaml +0 -35
  173. monkeybot-2.1.1/src/monkeybot/__init__.py +0 -3
  174. monkeybot-2.1.1/src/monkeybot/core/workspace_layout.py +0 -27
  175. monkeybot-2.1.1/src/monkeybot/gateway/bootstrap.py +0 -18
  176. monkeybot-2.1.1/src/monkeybot/gateway/realtime/app.py +0 -321
  177. monkeybot-2.1.1/testing/BENCH_NOTES.md +0 -226
  178. monkeybot-2.1.1/testing/bench.py +0 -560
  179. monkeybot-2.1.1/testing/bots/devbot/AGENT.md +0 -27
  180. monkeybot-2.1.1/testing/bots/devbot/MEMORY.md +0 -12
  181. monkeybot-2.1.1/testing/bots/devbot/config.yaml +0 -17
  182. monkeybot-2.1.1/testing/bots/devbot/skills/file-ops/SKILL.md +0 -24
  183. monkeybot-2.1.1/testing/bots/devbot/webhook.py +0 -20
  184. monkeybot-2.1.1/tests/conftest.py +0 -11
  185. monkeybot-2.1.1/tests/core/test_workspace_symlinks.py +0 -50
  186. monkeybot-2.1.1/tests/gateway/test_otel_lifespan.py +0 -49
  187. monkeybot-2.1.1/tests/test_release_script.py +0 -41
  188. {monkeybot-2.1.1 → monkeybot-2.2.0}/.github/workflows/ci.yml +0 -0
  189. {monkeybot-2.1.1 → monkeybot-2.2.0}/.pre-commit-config.yaml +0 -0
  190. {monkeybot-2.1.1 → monkeybot-2.2.0}/LICENSE +0 -0
  191. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/skills/monkeybot/references/config-sections.md +0 -0
  192. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/chat_renderer.py +0 -0
  193. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/chat_session.py +0 -0
  194. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/chat_status_bar.py +0 -0
  195. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/chat_theme.py +0 -0
  196. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/chat_tool_display.py +0 -0
  197. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/chat_tui.py +0 -0
  198. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/chat_tui_widgets.py +0 -0
  199. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/commands/__init__.py +0 -0
  200. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/commands/loop.py +0 -0
  201. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/commands/new.py +0 -0
  202. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/commands/talk.py +0 -0
  203. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/exit_commands.py +0 -0
  204. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/extras_catalog.py +0 -0
  205. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/main.py +0 -0
  206. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/opensandbox_lifecycle.py +0 -0
  207. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/output.py +0 -0
  208. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/providers.py +0 -0
  209. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/realtime/__init__.py +0 -0
  210. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/realtime/audio_io.py +0 -0
  211. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/realtime/client.py +0 -0
  212. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/realtime/gateway_manager.py +0 -0
  213. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/realtime/push_to_talk.py +0 -0
  214. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/realtime/session.py +0 -0
  215. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/realtime/session_controller.py +0 -0
  216. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/realtime/talk_ui.py +0 -0
  217. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/realtime/wire_encode.py +0 -0
  218. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/runtime_python.py +0 -0
  219. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/scaffold_defaults/AGENT.md +0 -0
  220. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/scaffold_defaults/__init__.py +0 -0
  221. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/scaffold_defaults/command_allowlist.yaml +0 -0
  222. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/scaffold_defaults/otel-collector.example.yaml +0 -0
  223. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/scaffold_defaults/permissions.yaml +0 -0
  224. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/session_controller.py +0 -0
  225. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/terminal_markdown.py +0 -0
  226. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_chat_e2e.py +0 -0
  227. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_chat_grounding.py +0 -0
  228. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_chat_renderer_parity.py +0 -0
  229. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_chat_session.py +0 -0
  230. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_chat_status_bar.py +0 -0
  231. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_chat_theme.py +0 -0
  232. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_chat_tool_display.py +0 -0
  233. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_chat_tui.py +0 -0
  234. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_doctor.py +0 -0
  235. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_realtime_session_controller.py +0 -0
  236. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_runtime_python.py +0 -0
  237. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_terminal_markdown.py +0 -0
  238. {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/uv.lock +0 -0
  239. {monkeybot-2.1.1 → monkeybot-2.2.0/docs/assets}/logo.png +0 -0
  240. {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/otel-collector.example.yaml +0 -0
  241. {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/eval_config.yaml +0 -0
  242. {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/scenarios/context/summarization_trigger.yaml +0 -0
  243. {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/scenarios/multi_turn/task_tracking.yaml +0 -0
  244. {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/scenarios/skills/skill_invocation.yaml +0 -0
  245. {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/scenarios/subagents/dispatch_complete.yaml +0 -0
  246. {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/scenarios/tools/core_read_error.yaml +0 -0
  247. /monkeybot-2.1.1/monkeybot_config_example/AGENT.example.md → /monkeybot-2.2.0/evals/smoke_agent/monkeybot_config/AGENT.md +0 -0
  248. /monkeybot-2.1.1/monkeybot_config_example/permissions.example.yaml → /monkeybot-2.2.0/evals/smoke_agent/monkeybot_config/permissions.yaml +0 -0
  249. {monkeybot-2.1.1/demo_agent → monkeybot-2.2.0/evals/smoke_agent}/workspace/.gitkeep +0 -0
  250. {monkeybot-2.1.1/demo_agent/workspace/browser/Screenshots → monkeybot-2.2.0/evals/smoke_agent/workspace/skills/browser/playbooks}/.gitkeep +0 -0
  251. {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/test_judge.py +0 -0
  252. {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/test_runner_sse.py +0 -0
  253. {monkeybot-2.1.1 → monkeybot-2.2.0}/examples/agentcore/handler.py +0 -0
  254. {monkeybot-2.1.1 → monkeybot-2.2.0}/examples/agentcore/runtime_app.py +0 -0
  255. {monkeybot-2.1.1 → monkeybot-2.2.0}/examples/agentengine/handler.py +0 -0
  256. {monkeybot-2.1.1 → monkeybot-2.2.0}/examples/cloud-functions/main.py +0 -0
  257. {monkeybot-2.1.1 → monkeybot-2.2.0}/examples/lambda/handler.py +0 -0
  258. {monkeybot-2.1.1/demo_agent/workspace → monkeybot-2.2.0/examples}/skills/browser/SKILL.md +0 -0
  259. {monkeybot-2.1.1/demo_agent/workspace → monkeybot-2.2.0/examples}/skills/browser/playbooks/.gitkeep +0 -0
  260. {monkeybot-2.1.1 → monkeybot-2.2.0}/examples/skills/diagnostics/__init__.py +0 -0
  261. {monkeybot-2.1.1 → monkeybot-2.2.0}/examples/skills/diagnostics/diagnostics.py +0 -0
  262. {monkeybot-2.1.1/demo_agent/workspace → monkeybot-2.2.0/examples}/skills/image-generator/generate_image.py +0 -0
  263. {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/src/browser_mcp/__init__.py +0 -0
  264. {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/src/browser_mcp/assets/NOTICE.md +0 -0
  265. {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/src/browser_mcp/assets/dom_tree.js +0 -0
  266. {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/src/browser_mcp/assets/pa_driver.js +0 -0
  267. {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/src/browser_mcp/dom_indexing.py +0 -0
  268. {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/src/browser_mcp/server.py +0 -0
  269. {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/tests/test_dom_indexing.py +0 -0
  270. {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/tests/test_indexed_tools.py +0 -0
  271. {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/tests/test_server_shutdown.py +0 -0
  272. {monkeybot-2.1.1 → monkeybot-2.2.0}/scripts/create_schema.py +0 -0
  273. {monkeybot-2.1.1 → monkeybot-2.2.0}/scripts/precommit-pytest.sh +0 -0
  274. {monkeybot-2.1.1 → monkeybot-2.2.0}/scripts/smoke_global_cli.sh +0 -0
  275. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/cli/__init__.py +0 -0
  276. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/cli/__main__.py +0 -0
  277. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/cli/audio_io.py +0 -0
  278. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/cli/gateway_manager.py +0 -0
  279. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/cli/main.py +0 -0
  280. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/cli/push_to_talk.py +0 -0
  281. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/cli/realtime_client.py +0 -0
  282. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/__init__.py +0 -0
  283. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/attachments/__init__.py +0 -0
  284. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/attachments/catalog.py +0 -0
  285. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/attachments/config.py +0 -0
  286. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/attachments/freeze.py +0 -0
  287. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/attachments/resolve.py +0 -0
  288. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/attachments/store.py +0 -0
  289. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/attachments/text.py +0 -0
  290. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/attachments/tools.py +0 -0
  291. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/bootstrap.py +0 -0
  292. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/config/__init__.py +0 -0
  293. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/config/realtime_config.py +0 -0
  294. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/config/settings.py +0 -0
  295. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/config/validation.py +0 -0
  296. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/context/__init__.py +0 -0
  297. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/context/campaign_context.py +0 -0
  298. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/context/common.py +0 -0
  299. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/context/curator.py +0 -0
  300. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/context/epoch.py +0 -0
  301. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/context/memory_prompt.py +0 -0
  302. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/context/tool_output_policy.py +0 -0
  303. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/context/tool_result_ingress.py +0 -0
  304. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/context/tool_shapers.py +0 -0
  305. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/hooks/__init__.py +0 -0
  306. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/llm/__init__.py +0 -0
  307. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/llm/provider.py +0 -0
  308. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/llm/realtime_provider.py +0 -0
  309. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/llm/usage.py +0 -0
  310. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/logging_utils.py +0 -0
  311. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/mcp/__init__.py +0 -0
  312. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/mcp/mcp_client.py +0 -0
  313. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/mcp/ports_mcp.py +0 -0
  314. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/memory/__init__.py +0 -0
  315. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/memory/hook.py +0 -0
  316. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/memory/index_format.py +0 -0
  317. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/memory/integrity.py +0 -0
  318. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/memory/organizer.py +0 -0
  319. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/memory/storage_ops.py +0 -0
  320. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/memory/subsystem.py +0 -0
  321. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/messages/__init__.py +0 -0
  322. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/messages/convert_provider.py +0 -0
  323. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/messages/tool_integrity.py +0 -0
  324. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/messages/transform_context.py +0 -0
  325. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/path_safety.py +0 -0
  326. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/__init__.py +0 -0
  327. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/backends.py +0 -0
  328. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/db.py +0 -0
  329. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/durable_runs.py +0 -0
  330. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/firestore.py +0 -0
  331. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/firestore_scheduled_loops.py +0 -0
  332. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/history.py +0 -0
  333. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/postgres.py +0 -0
  334. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/runs.py +0 -0
  335. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/scheduled_loops.py +0 -0
  336. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/session_turn_locks.py +0 -0
  337. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/sqlite_backend.py +0 -0
  338. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/thread_summary.py +0 -0
  339. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/transcript.py +0 -0
  340. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/usage.py +0 -0
  341. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/prompts/__init__.py +0 -0
  342. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/prompts/harness_prompt.py +0 -0
  343. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/prompts/prompt.py +0 -0
  344. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/runtime/__init__.py +0 -0
  345. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/runtime/context_budget.py +0 -0
  346. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/runtime/events.py +0 -0
  347. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/runtime/input_admission.py +0 -0
  348. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/runtime/loop.py +0 -0
  349. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/runtime/provider_stream_mapper.py +0 -0
  350. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/runtime/realtime_loop.py +0 -0
  351. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/runtime/utterance_buffer.py +0 -0
  352. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/subagents/__init__.py +0 -0
  353. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/subagents/worker_pool.py +0 -0
  354. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/testing/__init__.py +0 -0
  355. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/testing/mocks_provider.py +0 -0
  356. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/testing/mocks_realtime_provider.py +0 -0
  357. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/__init__.py +0 -0
  358. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/inspector.py +0 -0
  359. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/loop_inspector.py +0 -0
  360. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/permission.py +0 -0
  361. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/spill_inventory.py +0 -0
  362. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/terminal.py +0 -0
  363. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/text_normalize.py +0 -0
  364. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/types.py +0 -0
  365. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/types/__init__.py +0 -0
  366. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/types/content_blocks.py +0 -0
  367. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/types/interfaces.py +0 -0
  368. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/types/types_tools.py +0 -0
  369. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/workspace/__init__.py +0 -0
  370. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/workspace/factory.py +0 -0
  371. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/workspace/gcs.py +0 -0
  372. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/workspace/local.py +0 -0
  373. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/workspace/protocol.py +0 -0
  374. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/workspace/s3.py +0 -0
  375. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/__init__.py +0 -0
  376. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/realtime/deps.py +0 -0
  377. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/realtime/errors.py +0 -0
  378. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/realtime/guardrails.py +0 -0
  379. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/realtime/manager.py +0 -0
  380. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/realtime/metrics.py +0 -0
  381. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/realtime/session.py +0 -0
  382. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/realtime/wire.py +0 -0
  383. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/__init__.py +0 -0
  384. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/loop_port.py +0 -0
  385. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/models.py +0 -0
  386. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/reply_body.py +0 -0
  387. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/routes.py +0 -0
  388. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/scheduler_routes.py +0 -0
  389. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/scheduler_wiring.py +0 -0
  390. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/session_bus.py +0 -0
  391. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/sse.py +0 -0
  392. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/workspace_layout.py +0 -0
  393. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/observability/__init__.py +0 -0
  394. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/observability/_state.py +0 -0
  395. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/observability/instrumentation.py +0 -0
  396. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/observability/propagation.py +0 -0
  397. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/observability/spans.py +0 -0
  398. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/__init__.py +0 -0
  399. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/_openai_compat.py +0 -0
  400. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/_utils.py +0 -0
  401. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/bedrock.py +0 -0
  402. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/claude.py +0 -0
  403. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/gemini.py +0 -0
  404. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/gemini_live.py +0 -0
  405. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/huggingface.py +0 -0
  406. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/nvidia.py +0 -0
  407. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/ollama.py +0 -0
  408. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/openai.py +0 -0
  409. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/pricing.py +0 -0
  410. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/sampling.py +0 -0
  411. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/vertex_claude.py +0 -0
  412. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/scaffold/__init__.py +0 -0
  413. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/scheduler/__init__.py +0 -0
  414. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/scheduler/__main__.py +0 -0
  415. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/scheduler/engine.py +0 -0
  416. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/scheduler/http_invoker.py +0 -0
  417. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/scheduler/interval.py +0 -0
  418. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/scheduler/tick_result.py +0 -0
  419. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/scheduler/worker.py +0 -0
  420. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/subagents/__init__.py +0 -0
  421. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/subagents/worker/__init__.py +0 -0
  422. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/subagents/worker/__main__.py +0 -0
  423. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/web_search/__init__.py +0 -0
  424. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/web_search/backends/__init__.py +0 -0
  425. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/web_search/backends/duckduckgo.py +0 -0
  426. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/web_search/backends/firecrawl.py +0 -0
  427. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/web_search/backends/tavily.py +0 -0
  428. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/web_search/protocol.py +0 -0
  429. {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/web_search/tool.py +0 -0
  430. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/__init__.py +0 -0
  431. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/acceptance/test_observability_acceptance.py +0 -0
  432. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/cli/__init__.py +0 -0
  433. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/cli/test_gateway_manager.py +0 -0
  434. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/cli/test_push_to_talk.py +0 -0
  435. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/cli/test_realtime_client.py +0 -0
  436. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/__init__.py +0 -0
  437. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/memory/fake_workspace_storage.py +0 -0
  438. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/memory/test_hook_with_storage.py +0 -0
  439. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/memory/test_index_format.py +0 -0
  440. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/memory/test_organizer_with_storage.py +0 -0
  441. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/memory/test_subsystem.py +0 -0
  442. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_attachment_freeze.py +0 -0
  443. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_bootstrap.py +0 -0
  444. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_config_extensions.py +0 -0
  445. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_content_blocks.py +0 -0
  446. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_context_budget.py +0 -0
  447. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_context_curator.py +0 -0
  448. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_context_epoch.py +0 -0
  449. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_doom_loop.py +0 -0
  450. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_durable_events.py +0 -0
  451. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_durable_runs.py +0 -0
  452. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_events.py +0 -0
  453. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_firestore_history.py +0 -0
  454. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_firestore_scheduled_loops.py +0 -0
  455. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_gemini_history_replay.py +0 -0
  456. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_harness_prompt.py +0 -0
  457. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_hooks.py +0 -0
  458. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_input_admission.py +0 -0
  459. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_inspector.py +0 -0
  460. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_logging_utils.py +0 -0
  461. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_loop.py +0 -0
  462. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_loop_hooks.py +0 -0
  463. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_loop_observability.py +0 -0
  464. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_loop_transcript.py +0 -0
  465. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_mcp_client.py +0 -0
  466. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_memory.py +0 -0
  467. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_memory_hook.py +0 -0
  468. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_memory_organizer.py +0 -0
  469. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_memory_prompt.py +0 -0
  470. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_message_pipeline.py +0 -0
  471. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_mocks_realtime_provider.py +0 -0
  472. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_patch.py +0 -0
  473. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_permission.py +0 -0
  474. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_prompt.py +0 -0
  475. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_provider_contract.py +0 -0
  476. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_provider_stream_mapper.py +0 -0
  477. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_realtime_loop.py +0 -0
  478. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_replace_fuzzy.py +0 -0
  479. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_run_command_parse.py +0 -0
  480. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_runs.py +0 -0
  481. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_scheduled_loops.py +0 -0
  482. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_session_turn_locks.py +0 -0
  483. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_settlement.py +0 -0
  484. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_spill_inventory.py +0 -0
  485. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_storage_backends.py +0 -0
  486. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_subagent_proto.py +0 -0
  487. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_subagent_trace_propagation.py +0 -0
  488. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_subagent_worker_paths.py +0 -0
  489. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_terminal.py +0 -0
  490. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_tool_integrity.py +0 -0
  491. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_tool_result_ingress.py +0 -0
  492. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_tool_shapers.py +0 -0
  493. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_transcript.py +0 -0
  494. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_truncated_tool_batch.py +0 -0
  495. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_usage.py +0 -0
  496. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_usage_migration.py +0 -0
  497. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_utterance_buffer.py +0 -0
  498. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_worker_pool.py +0 -0
  499. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_workspace_write_scope.py +0 -0
  500. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/workspace/test_factory.py +0 -0
  501. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/workspace/test_local_storage.py +0 -0
  502. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/workspace/test_protocol_contract.py +0 -0
  503. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/__init__.py +0 -0
  504. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/conftest.py +0 -0
  505. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/eval_hook.py +0 -0
  506. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/scenario_runner.py +0 -0
  507. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/scenarios/context_curation.yaml +0 -0
  508. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/scenarios/memory_write_inject.yaml +0 -0
  509. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/scenarios/subagent_roundtrip.yaml +0 -0
  510. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/scenarios/tool_read.yaml +0 -0
  511. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/scenarios/tool_search_memory.yaml +0 -0
  512. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/scenarios/turn_completion.yaml +0 -0
  513. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/test_agent_behavior.py +0 -0
  514. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/test_memory_integrity.py +0 -0
  515. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/__init__.py +0 -0
  516. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/realtime/__init__.py +0 -0
  517. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/realtime/test_app.py +0 -0
  518. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/realtime/test_deps.py +0 -0
  519. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/realtime/test_guardrails.py +0 -0
  520. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/realtime/test_manager.py +0 -0
  521. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/realtime/test_metrics.py +0 -0
  522. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/realtime/test_routes_client_text.py +0 -0
  523. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/realtime/test_session.py +0 -0
  524. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/realtime/test_wire.py +0 -0
  525. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/sse/test_attachments.py +0 -0
  526. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/sse/test_create_session_model.py +0 -0
  527. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/sse/test_scheduler_routes.py +0 -0
  528. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/sse/test_session_bus.py +0 -0
  529. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/sse/test_transcript_wiring.py +0 -0
  530. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/test_otel_fastapi.py +0 -0
  531. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/test_pending_response_endpoints.py +0 -0
  532. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/test_realtime_main.py +0 -0
  533. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/test_resolve_provider.py +0 -0
  534. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/test_sse_events.py +0 -0
  535. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/integration/__init__.py +0 -0
  536. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/integration/test_mb_e2e_simple_reply.py +0 -0
  537. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/integration/test_observability_integration.py +0 -0
  538. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/integration/test_prompt_caching_integration.py +0 -0
  539. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/observability/conftest.py +0 -0
  540. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/observability/test_init.py +0 -0
  541. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/observability/test_instrumentation.py +0 -0
  542. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/observability/test_loop_hook_spans.py +0 -0
  543. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/observability/test_propagation.py +0 -0
  544. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/observability/test_span_contract.py +0 -0
  545. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/observability/test_spans.py +0 -0
  546. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/observability/test_truncate.py +0 -0
  547. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/observability/test_turn_complete_trace.py +0 -0
  548. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/conftest.py +0 -0
  549. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_anthropic_cache.py +0 -0
  550. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_anthropic_history.py +0 -0
  551. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_bedrock_estimate.py +0 -0
  552. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_gemini_live.py +0 -0
  553. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_gemini_usage.py +0 -0
  554. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_huggingface.py +0 -0
  555. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_nvidia.py +0 -0
  556. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_ollama.py +0 -0
  557. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_openai_compat_usage.py +0 -0
  558. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_openai_history.py +0 -0
  559. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_pricing.py +0 -0
  560. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_safe_parse_tool_args.py +0 -0
  561. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_sampling.py +0 -0
  562. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_source_grep_gates.py +0 -0
  563. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_vertex_claude_history.py +0 -0
  564. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/scheduler/test_engine.py +0 -0
  565. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/scheduler/test_interval.py +0 -0
  566. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/skills/__init__.py +0 -0
  567. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/test_cold_start.py +0 -0
  568. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/web_search/__init__.py +0 -0
  569. {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/web_search/test_web_search.py +0 -0
@@ -7,9 +7,6 @@
7
7
  **/.pytest_cache
8
8
  **/.mypy_cache
9
9
  **/.ruff_cache
10
- demo_agent/.emonk
11
- demo_agent/workspace/data/*.db
12
- demo_agent/workspace/data/*.db-*
13
10
  **/.env
14
11
  **/*.db-shm
15
12
  **/*.db-wal
@@ -0,0 +1,199 @@
1
+ name: Live eval smoke
2
+
3
+ # Runs the live eval smoke suite (see docs/live-evals.md) and posts a Markdown
4
+ # scorecard. LLM-judge calls cost money and take minutes, so this does not run on
5
+ # ordinary feature-branch -> develop PRs. Trigger points:
6
+ # (a) any PR from develop into main (release-promotion gate; --fail-on-regression)
7
+ # (b) any PR that touches a dependency lockfile (catches silent SDK breakage,
8
+ # e.g. provider request/response shape changes, that code review won't see)
9
+ # (c) every push to main (scores the new release; report-only, never fails the build)
10
+ # (d) manual: Actions tab -> Live eval smoke -> Run workflow
11
+ # The scorecard always lands on the workflow run's Summary page; PR events also get it
12
+ # as a PR comment. The run JSON is uploaded as an artifact — download two of them and
13
+ # compare with `uv run python -m evals.diff <old.json> <new.json>`.
14
+ #
15
+ # Cost/time budget: smoke suite is ~7 scenarios x 2-5 turns x (agent call + judge call).
16
+ # Expect roughly $0.50-2.00 and 5-10 minutes per run depending on model pricing.
17
+ #
18
+ # Secrets required: NVIDIA_API_KEY only (https://build.nvidia.com — free tier). The agent
19
+ # and the judge both run on NVIDIA-hosted models through the same key, pinned to two
20
+ # *different* models below so the judge isn't grading its own output and scoring doesn't
21
+ # silently drift.
22
+
23
+ on:
24
+ pull_request:
25
+ push:
26
+ branches: [main]
27
+ workflow_dispatch:
28
+
29
+ permissions:
30
+ contents: read
31
+ pull-requests: write
32
+
33
+ jobs:
34
+ gate:
35
+ runs-on: ubuntu-latest
36
+ outputs:
37
+ run: ${{ steps.decide.outputs.run }}
38
+ steps:
39
+ - uses: actions/checkout@v4
40
+ with:
41
+ fetch-depth: 0
42
+
43
+ - id: decide
44
+ env:
45
+ EVENT_NAME: ${{ github.event_name }}
46
+ BASE_REF: ${{ github.base_ref }}
47
+ HEAD_REF: ${{ github.head_ref }}
48
+ BASE_SHA: ${{ github.event.pull_request.base.sha }}
49
+ HEAD_SHA: ${{ github.event.pull_request.head.sha }}
50
+ run: |
51
+ run=false
52
+ # Push to main and manual dispatch always run; PRs are gated below.
53
+ if [[ "$EVENT_NAME" != "pull_request" ]]; then
54
+ run=true
55
+ else
56
+ if [[ "$BASE_REF" == "main" && "$HEAD_REF" == "develop" ]]; then
57
+ run=true
58
+ fi
59
+ changed="$(git diff --name-only "$BASE_SHA" "$HEAD_SHA")"
60
+ for f in uv.lock cli/uv.lock evals/smoke_agent/uv.lock; do
61
+ if grep -qxF "$f" <<<"$changed"; then
62
+ run=true
63
+ fi
64
+ done
65
+ fi
66
+ echo "run=$run" >> "$GITHUB_OUTPUT"
67
+
68
+ secrets:
69
+ needs: gate
70
+ if: needs.gate.outputs.run == 'true'
71
+ runs-on: ubuntu-latest
72
+ steps:
73
+ - name: Require live-eval secrets
74
+ env:
75
+ NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
76
+ run: |
77
+ if [[ -z "$NVIDIA_API_KEY" ]]; then
78
+ echo "::error::Live eval smoke requires the NVIDIA_API_KEY repository secret (agent + judge models, https://build.nvidia.com)"
79
+ exit 1
80
+ fi
81
+
82
+ live-eval:
83
+ needs: [gate, secrets]
84
+ if: needs.gate.outputs.run == 'true'
85
+ runs-on: ubuntu-latest
86
+ timeout-minutes: 30
87
+ steps:
88
+ - uses: actions/checkout@v4
89
+
90
+ - uses: astral-sh/setup-uv@v5
91
+ with:
92
+ version: "latest"
93
+
94
+ - name: Sync root deps (evals/report.py needs deepeval, langfuse)
95
+ run: uv sync --extra evals
96
+
97
+ - name: Sync smoke_agent deps
98
+ working-directory: evals/smoke_agent
99
+ run: uv sync
100
+
101
+ - name: Boot monkeybot gateway (evals/smoke_agent workspace)
102
+ working-directory: evals/smoke_agent
103
+ env:
104
+ NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
105
+ # Pin agent model for CI; env beats monkeybot.yaml.
106
+ MODEL_PROVIDER: nvidia
107
+ MODEL_NAME: meta/llama-3.3-70b-instruct
108
+ # smoke_agent monkeybot.yaml sets runtime.port: 8080; the health check and
109
+ # AGENT_URL below expect 8787, so pin PORT explicitly (env beats yaml).
110
+ PORT: "8787"
111
+ SANDBOX_ENABLED: "false" # no Docker socket in this runner
112
+ # Small context window so context/summarization_trigger.yaml actually crosses the
113
+ # real summarization threshold; the other smoke scenarios are short enough to fit.
114
+ MODEL_CONTEXT_WINDOW: "8000"
115
+ run: |
116
+ uv run -m monkeybot.gateway.main > /tmp/gateway.log 2>&1 &
117
+ echo $! > /tmp/gateway.pid
118
+ for i in $(seq 1 30); do
119
+ if curl -sf http://127.0.0.1:8787/health > /dev/null; then
120
+ echo "gateway healthy"
121
+ exit 0
122
+ fi
123
+ sleep 2
124
+ done
125
+ echo "gateway did not become healthy" >&2
126
+ cat /tmp/gateway.log >&2
127
+ exit 1
128
+
129
+ - name: Run smoke suite report
130
+ env:
131
+ AGENT_URL: http://127.0.0.1:8787
132
+ # Judge on a different free NVIDIA-hosted model than the agent (same key).
133
+ JUDGE_PROVIDER: nvidia
134
+ JUDGE_MODEL: nvidia/llama-3.3-nemotron-super-49b-v1
135
+ NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
136
+ # Scorecard metadata: report the model the gateway actually ran.
137
+ MODEL_PROVIDER: nvidia
138
+ MODEL_NAME: meta/llama-3.3-70b-instruct
139
+ EVENT_NAME: ${{ github.event_name }}
140
+ run: |
141
+ # PRs are a gate and must block on regressions; main pushes and manual runs
142
+ # just score the build and always report. --fail-on-regression always blocks on
143
+ # this run's own scenario errors/failures. It does NOT require evals/baselines/
144
+ # smoke.json to exist (that's the separate --require-baseline flag, intentionally
145
+ # omitted below) — no trusted baseline has been committed yet. Once one has
146
+ # (`uv run python -m evals.report --suite smoke --update-baseline`, committed),
147
+ # add --require-baseline here too so a missing/deleted file can't silently skip
148
+ # the token/cost/latency drift checks.
149
+ flags=""
150
+ if [[ "$EVENT_NAME" == "pull_request" ]]; then
151
+ flags="--fail-on-regression"
152
+ fi
153
+ uv run python -m evals.report \
154
+ --suite smoke \
155
+ --baseline evals/baselines/smoke.json \
156
+ $flags \
157
+ | tee eval-report.md
158
+
159
+ - name: Publish report to run summary
160
+ if: always()
161
+ run: |
162
+ if [[ -f eval-report.md ]]; then
163
+ cat eval-report.md >> "$GITHUB_STEP_SUMMARY"
164
+ else
165
+ echo '`FAIL` — no report produced; see the job logs.' >> "$GITHUB_STEP_SUMMARY"
166
+ fi
167
+
168
+ - name: Post report as PR comment
169
+ if: always() && github.event_name == 'pull_request'
170
+ uses: actions/github-script@v7
171
+ with:
172
+ script: |
173
+ const fs = require("fs");
174
+ const body = fs.existsSync("eval-report.md")
175
+ ? fs.readFileSync("eval-report.md", "utf8")
176
+ : "## monkeybot Eval Scorecard\n\n`FAIL` — the report step did not complete " +
177
+ "(gateway boot or the report command itself errored before writing a report). " +
178
+ "See the workflow run logs for details.";
179
+ await github.rest.issues.createComment({
180
+ issue_number: context.issue.number,
181
+ owner: context.repo.owner,
182
+ repo: context.repo.repo,
183
+ body,
184
+ });
185
+
186
+ - name: Upload run + report artifacts
187
+ if: always()
188
+ uses: actions/upload-artifact@v4
189
+ with:
190
+ name: live-eval-smoke-${{ github.run_id }}
191
+ path: |
192
+ evals/runs/
193
+ eval-report.md
194
+ if-no-files-found: ignore
195
+
196
+ - name: Stop gateway
197
+ if: always()
198
+ working-directory: evals/smoke_agent
199
+ run: kill "$(cat /tmp/gateway.pid)" 2>/dev/null || true
@@ -7,7 +7,7 @@ on:
7
7
  description: "Which package to release"
8
8
  required: true
9
9
  type: choice
10
- options: [core, cli]
10
+ options: [core, browser, cli, all]
11
11
  bump:
12
12
  description: "Version bump"
13
13
  required: true
@@ -9,6 +9,7 @@ name: Publish release
9
9
  # Workflow publish-release.yml / Environment pypi
10
10
  # monkeybot-cli: Owner human-plus-machine / Repo monkeybot /
11
11
  # Workflow publish-release.yml / Environment pypi-cli
12
+ # monkeybot-browser-mcp: same workflow / Environment pypi-browser
12
13
  #
13
14
  # GitHub: create Environments named exactly `pypi` and `pypi-cli`.
14
15
  on:
@@ -17,6 +18,8 @@ on:
17
18
  paths:
18
19
  - "pyproject.toml"
19
20
  - "cli/pyproject.toml"
21
+ - "integrations/browser-mcp/pyproject.toml"
22
+ - "docker/sandbox.Dockerfile"
20
23
  - "CHANGELOG.md"
21
24
 
22
25
  permissions:
@@ -68,14 +71,15 @@ jobs:
68
71
  skip-existing: true
69
72
 
70
73
  pypi-cli:
71
- needs: [publish, pypi-core]
74
+ needs: [publish, pypi-core, pypi-browser]
72
75
  # Run when cli is in the release set. If core wasn't released this run,
73
76
  # pypi-core is skipped — treat that as success so cli can still publish.
74
77
  if: |
75
78
  always() &&
76
79
  needs.publish.result == 'success' &&
77
80
  contains(format(',{0},', needs.publish.outputs.packages), ',cli,') &&
78
- (needs.pypi-core.result == 'success' || needs.pypi-core.result == 'skipped')
81
+ (needs.pypi-core.result == 'success' || needs.pypi-core.result == 'skipped') &&
82
+ (needs.pypi-browser.result == 'success' || needs.pypi-browser.result == 'skipped')
79
83
  runs-on: ubuntu-latest
80
84
  environment:
81
85
  name: pypi-cli
@@ -96,3 +100,50 @@ jobs:
96
100
  with:
97
101
  packages-dir: dist/cli
98
102
  skip-existing: true
103
+
104
+ pypi-browser:
105
+ needs: publish
106
+ if: contains(format(',{0},', needs.publish.outputs.packages), ',browser,')
107
+ runs-on: ubuntu-latest
108
+ environment:
109
+ name: pypi-browser
110
+ url: https://pypi.org/p/monkeybot-browser-mcp
111
+ permissions:
112
+ id-token: write
113
+ contents: read
114
+ steps:
115
+ - uses: actions/checkout@v4
116
+ - uses: astral-sh/setup-uv@v5
117
+ - uses: actions/setup-python@v5
118
+ with:
119
+ python-version: "3.12"
120
+ - name: Build browser MCP
121
+ run: uv build --out-dir dist/browser integrations/browser-mcp
122
+ - name: Publish browser MCP to PyPI
123
+ uses: pypa/gh-action-pypi-publish@release/v1
124
+ with:
125
+ packages-dir: dist/browser
126
+ skip-existing: true
127
+
128
+ sandbox-image:
129
+ needs: publish
130
+ if: contains(format(',{0},', needs.publish.outputs.packages), ',core,')
131
+ runs-on: ubuntu-latest
132
+ permissions:
133
+ contents: read
134
+ packages: write
135
+ steps:
136
+ - uses: actions/checkout@v4
137
+ - uses: docker/login-action@v3
138
+ with:
139
+ registry: ghcr.io
140
+ username: ${{ github.actor }}
141
+ password: ${{ secrets.GITHUB_TOKEN }}
142
+ - id: version
143
+ run: echo "value=$(python -c \"import re; print(re.search(r'^version = \\\"([^\\\"]+)', open('pyproject.toml').read(), re.M).group(1))\")" >> "$GITHUB_OUTPUT"
144
+ - uses: docker/build-push-action@v6
145
+ with:
146
+ context: .
147
+ file: docker/sandbox.Dockerfile
148
+ push: true
149
+ tags: ghcr.io/human-plus-machine/monkeybot-sandbox:${{ steps.version.outputs.value }}
@@ -9,9 +9,6 @@ internal/
9
9
  # Local scaffolded harness config (defaults ship in monkeybot-cli scaffold_defaults/)
10
10
  /monkeybot_config/
11
11
 
12
- # Demo agent live config (materialized from monkeybot_config_example/ by demo_agent/run.sh)
13
- demo_agent/monkeybot_config/
14
-
15
12
  # Live eval run artifacts (only evals/baselines/ is versioned)
16
13
  /evals/runs/
17
14
 
@@ -40,6 +37,7 @@ data/
40
37
  htmlcov/
41
38
  .mypy_cache/
42
39
  .ruff_cache/
40
+ .deepeval/
43
41
 
44
42
  # macOS
45
43
  .DS_Store
@@ -13,7 +13,7 @@
13
13
  - **Memory accuracy verification** — script exists (`scripts/verify_memory.py`) but needs a real eval strategy, not a one-off script.
14
14
 
15
15
  ### 3. Scheduler
16
- - Wire a `Scheduler` into the FastAPI lifespan as an optional background task when `config.yaml` has `scheduler.jobs` (reference: `legacy/src/monkeybot/core/scheduler.py`).
16
+ - Wire a `Scheduler` into the FastAPI lifespan as an optional background task when `config.yaml` has `scheduler.jobs`.
17
17
  - Needs significant design work for cloud runtimes: Lambda/Cloud Functions have no persistent process, GKE/ECS can use sidecar or CronJob, etc. Think through heartbeat / self-scheduling before implementing.
18
18
 
19
19
  ### 4. Sandbox Workspace Protection
@@ -30,8 +30,8 @@
30
30
  - Worker pool: standalone `python -m monkeybot.subagents.worker` consumes queued runs with atomic `claim()` (recommended for production — its own event loop, scales independently of the gateway). `MONKEYBOT_WORKER_POOL=1` runs the same loop in-process on the gateway and is development-only (competes with the SSE event loop).
31
31
 
32
32
  ### 7. CLI-managed optional service dependencies
33
- - `monkeybot chat` / `run` only spawn the gateway process; they don't start the Docker-backed optional services some `monkeybot.yaml` configs require: OpenSandbox (`sandbox.enabled`), Firestore emulator (`paths.db_url: firestore://...`), or the observability stack (Phoenix/Langfuse/OTel collector). `demo_agent/run.sh` currently does this orchestration via bash (build/start/health-check/cleanup), which means the CLI alone can't fully run an agent that uses those features.
34
- - Decide and implement: should the CLI (`doctor`, `run`, `chat`) detect these from config and actually start/stop the containers (matching `run.sh` behavior, retiring the bash script), or just validate/warn with remediation hints while the user manages Docker manually?
33
+ - `monkeybot chat` / `run` only spawn the gateway process; they don't start the Docker-backed optional services some `monkeybot.yaml` configs require: OpenSandbox (`sandbox.enabled`), Firestore emulator (`paths.db_url: firestore://...`), or the observability stack (Phoenix/Langfuse/OTel collector). Those used to be orchestrated by a demo `run.sh`; the CLI alone still can't fully run an agent that uses those features.
34
+ - Decide and implement: should the CLI (`doctor`, `run`, `chat`) detect these from config and actually start/stop the containers, or just validate/warn with remediation hints while the user manages Docker manually?
35
35
  - Open sub-questions if going the "CLI starts services" route: where do per-project Docker assets live (`opensandbox.docker.toml`, OTel collector yaml, compose files) — agent-project-owned files referenced from `monkeybot.yaml`, or CLI-shipped generic templates; and is the sandbox worker image (project-specific extra deps) something the CLI should build, or stay manual/documented.
36
36
 
37
37
  ---
@@ -39,9 +39,9 @@
39
39
  ## Do Later
40
40
 
41
41
  ### Connectors
42
- - **CLI gateway** — interactive stdin/stdout (reference: `legacy/src/monkeybot/gateway/cli.py`).
43
- - **Webhook gateway** — generic HTTP + HMAC (reference: `legacy/src/monkeybot/gateway/webhook.py`).
44
- - **`python -m monkeybot` CLI** — `run` / `serve` / `usage` / `schedule` subcommands (reference: `legacy/src/monkeybot/cli.py`).
42
+ - **CLI gateway** — interactive stdin/stdout beyond the existing `monkeybot chat` / `talk` clients.
43
+ - **Webhook gateway** — generic HTTP + HMAC ingress for third-party chat products.
44
+ - **Expanded `python -m monkeybot` surface** — additional operator subcommands (`usage` / `schedule`, etc.) as needed.
45
45
 
46
46
  ### Cloud Deployments
47
47
  - **GCP server** — GCE / GKE deployment option (docs + examples exist; no IaC).
@@ -56,7 +56,7 @@
56
56
  - **INDEX.md size cap** *(deferred 2026-05-15)* — `MemoryOrganizer` appends without bound; acceptable for now via `ContextCurator` selection. When indices grow wastefully large, cap with a sliding window (N=200, archive to `INDEX.archive.md`) in `core/memory_organizer.py`.
57
57
 
58
58
  ### MCP
59
- - **MCP distro linkage** — confirm `monkeybot_config_example/monkeybot.example.yaml` paths (`paths.mcp_config`, `paths.skills_path`) match deployment; smoke-test against real MCP servers beyond the bundled LangChain docs URL.
59
+ - **MCP distro linkage** — confirm scaffolded `monkeybot.yaml` paths (`paths.mcp_config`, `paths.skills_path`) match deployment; smoke-test against real MCP servers beyond the bundled examples.
60
60
 
61
61
  ### Future platforms *(not scheduled)*
62
62
 
@@ -6,10 +6,50 @@ the project adheres to [Semantic Versioning](https://semver.org/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [core v2.2.0] - 2026-07-13
10
+
11
+ ### Added
12
+
13
+ - Canonical agent-root layout and a read-only virtual `skills/` root.
14
+
15
+ ### Changed
16
+
17
+ - Remote sandboxes require an explicit compute-only capability setting.
18
+
19
+ ### Breaking
20
+
21
+ - Workspace or skills symlinks that resolve outside their respective roots are now rejected. Move their targets inside the agent's `workspace/`, `data/`, or `skills/` layout.
22
+
23
+ ## [browser v0.2.0] - 2026-07-13
24
+
25
+ ### Added
26
+
27
+ - Browser MCP package release supporting the canonical agent layout.
28
+
29
+ ## [cli v0.3.0] - 2026-07-13
30
+
31
+ ### Added
32
+
33
+ - Agent scaffolds now include the canonical layout, Dockerfile, and disabled browser MCP configuration.
34
+
35
+ ### Fixed
36
+
37
+ - `monkeybot chat` no longer adopts a stale gateway on a busy port: it refuses to spawn when the port is already in use (suggesting `/bye`, stopping `monkeybot run`, or `--attach`), and `wait_for_health` rejects a `/health` 200 if the child process has already exited.
38
+
39
+ ## [0.2.1] - 2026-07-13
40
+
41
+ ### Added
42
+
43
+ - First PyPI release of **monkeybot-cli** (Trusted Publishing) — install with `uv tool install monkeybot-cli`.
44
+
45
+
9
46
  ## [2.1.1] - 2026-07-13
10
47
 
11
48
  ### Added
12
49
 
50
+ - Evals: `response_regex` and `response_not_contains` deterministic assertions; run files now persist per-turn prompt/response text, and `python -m evals.diff` pinpoints the exact turn behind a regression between two runs.
51
+ - Live eval smoke workflow now also runs on every push to `main` (report-only, scorecard on the run Summary page) and on manual dispatch, in addition to the existing PR gates.
52
+ - Live evals need only `NVIDIA_API_KEY`: the deepeval judge can now run on build.nvidia.com models (`JUDGE_PROVIDER=nvidia`) via NVIDIA's OpenAI-compatible endpoint, and CI pins agent (`meta/llama-3.3-70b-instruct`) and judge (`nvidia/llama-3.3-nemotron-super-49b-v1`) to two different free NVIDIA-hosted models. The workflow also now sets `MODEL_PROVIDER`/`MODEL_NAME` explicitly — previously it booted whatever `demo_agent`'s committed config said (ollama, which doesn't exist in CI).
13
53
  - Repo-root `monkeybot_config_example/` — full-option human-readable config templates (`.example` filenames).
14
54
  - `monkeybot new` also scaffolds `permissions.yaml`.
15
55
  - `monkeybot new` writes an agent-project `pyproject.toml` with a PyPI `monkeybot[<provider>]>=2.1.0,<3` dependency (plain `uv sync` after scaffold).
@@ -18,6 +58,10 @@ the project adheres to [Semantic Versioning](https://semver.org/).
18
58
  - README / getting-started / onboarding skill lead with `uv tool install monkeybot-cli` (clone is contributor-only).
19
59
  - **monkeybot-cli** declares published core bound `monkeybot[cli]>=2.1.0,<3` (local clones still use `[tool.uv.sources]`).
20
60
 
61
+ ### Removed
62
+
63
+ - Evals FastAPI service (`evals/main.py`, in-memory store, WebSocket fan-out, Dockerfile, `docker-compose.evals.yml`) — nothing consumed its HTTP/WS API; `python -m evals.report` is the single execution path. `google-genai` (Gemini judge dep) moved into the root `evals` extra.
64
+
21
65
  ### Changed
22
66
 
23
67
  - `monkeybot doctor` remediation for missing extras: add `monkeybot[<extra>]` to agent deps + `uv sync` (keeps `uv sync --extra` only when the agent defines project-level optionals).
@@ -0,0 +1,42 @@
1
+ # Contributing
2
+
3
+ Thanks for helping improve monkeybot. Report bugs and doc gaps via [issues](https://github.com/human-plus-machine/monkeybot/issues); PRs for fixes and improvements are welcome.
4
+
5
+ ## Developing the harness
6
+
7
+ Clone only if you are changing monkeybot itself (end users should use `uv tool install monkeybot-cli` — see the [README](README.md)):
8
+
9
+ ```bash
10
+ git clone https://github.com/human-plus-machine/monkeybot.git
11
+ cd monkeybot && uv sync
12
+ cd cli && uv sync
13
+ uv tool install --editable .
14
+ ```
15
+
16
+ For live eval smoke runs against a local gateway, use [`evals/smoke_agent/`](evals/smoke_agent/) (see [docs/live-evals.md](docs/live-evals.md)).
17
+
18
+ ### Checks
19
+
20
+ CI runs `mypy` on `src/monkeybot` and pytest (root, `cli/`, `integrations/browser-mcp/`), plus standalone eval self-checks. Before submitting:
21
+
22
+ ```bash
23
+ uv run pytest
24
+ uv run mypy src/monkeybot
25
+ ```
26
+
27
+ `ruff` is useful locally but is not a CI gate today.
28
+
29
+ > [!NOTE]
30
+ > Do not run the root pytest suite with a scaffolded `monkeybot_config/` + `workspace/` at the repo root — that layout can make a couple of workspace-resolution tests fail. CI uses a clean tree.
31
+
32
+ ## Releasing
33
+
34
+ `develop` is the working branch; `main` always reflects the latest release.
35
+
36
+ 1. Anyone runs the **Prepare release** workflow (Actions tab → Prepare release → Run workflow), choosing `core`, `browser`, or `cli` and a version bump. It bumps the package's `pyproject.toml`, moves the `CHANGELOG.md` `Unreleased` section into a dated entry on a `release/<package>-v<version>` branch, and opens a PR from that branch into `main` (`develop` itself is untouched until the PR merges, so an abandoned release PR leaves no trace).
37
+ 2. An admin reviews and **merges the PR** (branch protection on `main` restricts who can merge). Use a regular merge commit, not squash, so `main`'s history and the release tag line up with what was reviewed.
38
+ 3. The **Publish release** workflow runs automatically on that merge: it tags the new version, creates a GitHub Release from the changelog entry, Trusted-Publishes the released package(s) to PyPI (core and browser before CLI when both ship), publishes the sandbox image with a core release, and merges `main` back into `develop` so the two branches don't drift apart.
39
+
40
+ One-time setup (repo Settings → Branches → add rule for `main`): require a pull request before merging, and restrict who can push to matching branches to Admins. That's the only access control needed — anyone can prepare a release, only admins can promote it to `main`.
41
+
42
+ **Before relying on this:** `develop` and `main` currently have diverged history (independent commits on each side). Reconcile them once with a manual merge before running the first automated release, or the first release PR may show unrelated changes or conflicts. `CHANGELOG.md` is shared across both packages — `core` and `cli` versions are bumped independently but their release notes live in the same file. The current versions already on `main` (`core` 2.0.0, `cli` 0.1.7) predate this tooling and have no changelog entry, so the first `publish` run intentionally skips tagging them rather than creating a release with empty notes; tagging starts from the next real version bump.
@@ -0,0 +1,180 @@
1
+ Metadata-Version: 2.4
2
+ Name: monkeybot
3
+ Version: 2.2.0
4
+ Summary: monkeybot agent harness — FastAPI SSE gateway, owned loop, SQLite, and MCP.
5
+ License: MIT
6
+ License-File: LICENSE
7
+ Requires-Python: >=3.11
8
+ Requires-Dist: aiosqlite>=0.20.0
9
+ Requires-Dist: fastapi>=0.115.0
10
+ Requires-Dist: google-genai>=1.0.0
11
+ Requires-Dist: httpx>=0.27.0
12
+ Requires-Dist: mcp>=1.0.0
13
+ Requires-Dist: pydantic>=2.10.0
14
+ Requires-Dist: python-dotenv>=1.0.0
15
+ Requires-Dist: python-ulid>=2.0.0
16
+ Requires-Dist: pyyaml>=6.0.2
17
+ Requires-Dist: uvicorn[standard]>=0.32.0
18
+ Provides-Extra: aws
19
+ Requires-Dist: boto3>=1.34.0; extra == 'aws'
20
+ Provides-Extra: bedrock
21
+ Requires-Dist: anthropic[bedrock]>=0.40.0; extra == 'bedrock'
22
+ Requires-Dist: boto3>=1.34.0; extra == 'bedrock'
23
+ Provides-Extra: claude
24
+ Requires-Dist: anthropic>=0.40.0; extra == 'claude'
25
+ Provides-Extra: cli
26
+ Requires-Dist: typer>=0.12.0; extra == 'cli'
27
+ Requires-Dist: websockets>=14.0; extra == 'cli'
28
+ Provides-Extra: cli-realtime
29
+ Requires-Dist: pyaudio>=0.2.11; extra == 'cli-realtime'
30
+ Requires-Dist: pynput>=1.7.6; extra == 'cli-realtime'
31
+ Requires-Dist: typer>=0.12.0; extra == 'cli-realtime'
32
+ Requires-Dist: websockets>=14.0; extra == 'cli-realtime'
33
+ Provides-Extra: council
34
+ Requires-Dist: google-cloud-storage>=2.18.0; extra == 'council'
35
+ Provides-Extra: evals
36
+ Requires-Dist: deepeval>=3.0.0; extra == 'evals'
37
+ Requires-Dist: google-genai>=1.0.0; extra == 'evals'
38
+ Requires-Dist: langfuse>=3.0.0; extra == 'evals'
39
+ Provides-Extra: firestore
40
+ Requires-Dist: google-cloud-firestore>=2.16.0; extra == 'firestore'
41
+ Provides-Extra: gcs
42
+ Requires-Dist: google-cloud-storage>=2.18.0; extra == 'gcs'
43
+ Provides-Extra: gemini
44
+ Requires-Dist: google-genai>=1.0.0; extra == 'gemini'
45
+ Provides-Extra: huggingface
46
+ Requires-Dist: openai>=1.0; extra == 'huggingface'
47
+ Requires-Dist: tiktoken>=0.7.0; extra == 'huggingface'
48
+ Provides-Extra: nvidia
49
+ Requires-Dist: openai>=1.0; extra == 'nvidia'
50
+ Requires-Dist: tiktoken>=0.7.0; extra == 'nvidia'
51
+ Provides-Extra: observability
52
+ Requires-Dist: opentelemetry-api>=1.28; extra == 'observability'
53
+ Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.28; extra == 'observability'
54
+ Requires-Dist: opentelemetry-instrumentation-fastapi>=0.62b1; extra == 'observability'
55
+ Requires-Dist: opentelemetry-sdk>=1.28; extra == 'observability'
56
+ Provides-Extra: ollama
57
+ Requires-Dist: openai>=1.0; extra == 'ollama'
58
+ Requires-Dist: tiktoken>=0.7.0; extra == 'ollama'
59
+ Provides-Extra: openai
60
+ Requires-Dist: openai>=1.0; extra == 'openai'
61
+ Requires-Dist: tiktoken>=0.7.0; extra == 'openai'
62
+ Provides-Extra: postgres
63
+ Requires-Dist: asyncpg>=0.29.0; extra == 'postgres'
64
+ Provides-Extra: realtime
65
+ Requires-Dist: websockets>=14.0; extra == 'realtime'
66
+ Provides-Extra: realtime-gemini
67
+ Requires-Dist: google-genai>=1.0.0; extra == 'realtime-gemini'
68
+ Requires-Dist: websockets>=14.0; extra == 'realtime-gemini'
69
+ Provides-Extra: sandbox
70
+ Requires-Dist: opensandbox>=0.1.7; extra == 'sandbox'
71
+ Provides-Extra: scheduler
72
+ Requires-Dist: croniter>=2.0; extra == 'scheduler'
73
+ Provides-Extra: vertex
74
+ Requires-Dist: google-api-python-client>=2.150.0; extra == 'vertex'
75
+ Requires-Dist: google-auth>=2.35.0; extra == 'vertex'
76
+ Requires-Dist: google-genai>=1.0.0; extra == 'vertex'
77
+ Provides-Extra: vertex-claude
78
+ Requires-Dist: anthropic[vertex]>=0.40.0; extra == 'vertex-claude'
79
+ Provides-Extra: web-search
80
+ Requires-Dist: ddgs>=7.0; extra == 'web-search'
81
+ Description-Content-Type: text/markdown
82
+
83
+ # monkeybot
84
+
85
+ <div align="center">
86
+ <img src="docs/assets/logo.png" alt="monkeybot Logo" width="600" />
87
+
88
+ <br />
89
+
90
+ *Multi-cloud agent harness — GCP-first docs, portable runtime*
91
+
92
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
93
+
94
+ </div>
95
+
96
+ monkeybot is an owned agent runtime for tool-using LLMs: a FastAPI SSE gateway, pluggable storage, MCP tools, skills, and memory. Run locally with zero cloud dependencies, or ship the same container image anywhere Docker runs.
97
+
98
+ Docs and examples are **GCP-first** (Vertex, GCS, Cloud Run); AWS paths ship in the Pattern guides. See [Cloud deployment — Positioning](docs/cloud-deployment-design.md#positioning).
99
+
100
+ > [!NOTE]
101
+ > Skills under `SKILLS_PATH` execute Python code — only add skills from trusted sources.
102
+
103
+ ## Quick start
104
+
105
+ Install [uv](https://docs.astral.sh/uv/), then:
106
+
107
+ ```bash
108
+ uv tool install monkeybot-cli
109
+
110
+ monkeybot new --dest ./my-agent --provider openai --yes
111
+ cd my-agent
112
+ uv sync
113
+ cp .env.example .env # add provider keys
114
+ monkeybot doctor
115
+ monkeybot chat
116
+ ```
117
+
118
+ Upgrade the CLI with `uv tool upgrade monkeybot-cli`. Full walkthrough: **[Getting Started](docs/getting-started.md)**.
119
+
120
+ ## What you get
121
+
122
+ - **SSE gateway** — sessions, streaming, health; wire your own UI or use the CLI
123
+ - **Realtime talk** — WebSocket voice/text via `monkeybot talk`
124
+ - **MCP + skills** — stdio/HTTP tools and trusted Python skill bundles
125
+ - **Pluggable storage** — SQLite by default; Postgres, Firestore, GCS, S3
126
+ - **Multi-provider** — Gemini/Vertex, OpenAI, Anthropic, Bedrock, Ollama, and more
127
+
128
+ ## CLI
129
+
130
+ | Command | Purpose |
131
+ |---|---|
132
+ | `monkeybot new` | Scaffold config, workspace, agent `pyproject.toml`, `.env.example` |
133
+ | `monkeybot validate` | Check `monkeybot.yaml`, paths, and MCP config |
134
+ | `monkeybot doctor` | Verify Python, extras, credentials, and port |
135
+ | `monkeybot run` | Start the SSE gateway in the foreground |
136
+ | `monkeybot chat` | Talk over SSE (spawns the gateway; `--attach` to join one) |
137
+ | `monkeybot talk` | Realtime voice/text over WebSocket (`--text` for typed input) |
138
+
139
+ ```bash
140
+ monkeybot chat # spawn gateway + REPL
141
+ monkeybot run # terminal 1: gateway with logs
142
+ monkeybot chat --attach # terminal 2: attach to it
143
+ ```
144
+
145
+ Provider extras live on the **agent** `pyproject.toml` (`monkeybot[<provider>]`), not the global CLI. See [Getting Started](docs/getting-started.md) and [Features — CLI](docs/features.md#16-cli).
146
+
147
+ ## Agent skill
148
+
149
+ ```bash
150
+ npx skills add human-plus-machine/monkeybot --skill monkeybot
151
+ ```
152
+
153
+ Walks through install, scaffold, config, and first chat. Source: [`cli/skills/monkeybot/`](cli/skills/monkeybot/).
154
+
155
+ ## Documentation
156
+
157
+ | Guide | Description |
158
+ |---|---|
159
+ | [Getting Started](docs/getting-started.md) | Install, configure, sessions + SSE from the CLI |
160
+ | [Features](docs/features.md) | Architecture, capabilities, CLI, task queue |
161
+ | [SSE gateway and custom UI](docs/sse-gateway-ui.md) | HTTP + SSE endpoints, event types, CORS |
162
+ | [Skills](docs/skills.md) | Skill directory layout and `SKILL.md` discovery |
163
+ | [Model Context Protocol](docs/mcp.md) | MCP config, env interpolation, OAuth2 |
164
+ | [Cloud deployment](docs/cloud-deployment-design.md) | Positioning + Patterns A–D index |
165
+ | [Live evals](docs/live-evals.md) | Smoke suite, local + CI scorecard |
166
+ | [Observability](docs/observability-runbook.md) | OpenTelemetry tracing runbook |
167
+
168
+ Integrations matrix and roadmap: [CHANGELOG](CHANGELOG.md) · [BACKLOG](BACKLOG.md).
169
+
170
+ ## Contributing
171
+
172
+ Clone only if you are changing the harness. Setup, checks, and the release workflow are in **[CONTRIBUTING.md](CONTRIBUTING.md)**. Live eval smoke fixture: [`evals/smoke_agent/`](evals/smoke_agent/).
173
+
174
+ ## Support
175
+
176
+ Search or open an issue in the [GitHub issue tracker](https://github.com/human-plus-machine/monkeybot/issues).
177
+
178
+ ## License
179
+
180
+ MIT — see [`LICENSE`](LICENSE).