monkeybot 3.0.3__tar.gz → 3.0.4__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 (647) hide show
  1. {monkeybot-3.0.3 → monkeybot-3.0.4}/CHANGELOG.md +12 -0
  2. {monkeybot-3.0.3 → monkeybot-3.0.4}/PKG-INFO +1 -1
  3. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/skills/monkeybot/SKILL.md +3 -1
  4. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/skills/monkeybot/references/config-sections.md +1 -1
  5. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/extras_catalog.py +2 -1
  6. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/providers.py +11 -0
  7. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold.py +1 -0
  8. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/env.example +4 -1
  9. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/monkeybot.example.yaml +1 -1
  10. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_extras_catalog.py +5 -0
  11. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_scaffold.py +1 -0
  12. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/features.md +4 -2
  13. {monkeybot-3.0.3 → monkeybot-3.0.4}/pyproject.toml +1 -1
  14. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/bootstrap.py +5 -1
  15. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/config/settings.py +15 -3
  16. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/config/validation.py +8 -12
  17. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/__init__.py +2 -0
  18. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/config.py +15 -0
  19. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/loop_usage.py +6 -1
  20. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/app.py +14 -2
  21. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/ollama.py +86 -16
  22. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_config_extensions.py +22 -0
  23. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_config.py +23 -19
  24. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/test_resolve_provider.py +30 -2
  25. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_ollama.py +102 -0
  26. {monkeybot-3.0.3 → monkeybot-3.0.4}/uv.lock +1 -1
  27. {monkeybot-3.0.3 → monkeybot-3.0.4}/.dockerignore +0 -0
  28. {monkeybot-3.0.3 → monkeybot-3.0.4}/.github/workflows/ci.yml +0 -0
  29. {monkeybot-3.0.3 → monkeybot-3.0.4}/.github/workflows/live-eval-smoke.yml +0 -0
  30. {monkeybot-3.0.3 → monkeybot-3.0.4}/.github/workflows/prepare-release.yml +0 -0
  31. {monkeybot-3.0.3 → monkeybot-3.0.4}/.github/workflows/publish-release.yml +0 -0
  32. {monkeybot-3.0.3 → monkeybot-3.0.4}/.gitignore +0 -0
  33. {monkeybot-3.0.3 → monkeybot-3.0.4}/.pre-commit-config.yaml +0 -0
  34. {monkeybot-3.0.3 → monkeybot-3.0.4}/BACKLOG.md +0 -0
  35. {monkeybot-3.0.3 → monkeybot-3.0.4}/CONTRIBUTING.md +0 -0
  36. {monkeybot-3.0.3 → monkeybot-3.0.4}/LICENSE +0 -0
  37. {monkeybot-3.0.3 → monkeybot-3.0.4}/README.md +0 -0
  38. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/pyproject.toml +0 -0
  39. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/__init__.py +0 -0
  40. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/chat_file_index.py +0 -0
  41. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/chat_local_shell.py +0 -0
  42. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/chat_renderer.py +0 -0
  43. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/chat_session.py +0 -0
  44. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/chat_status_bar.py +0 -0
  45. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/chat_theme.py +0 -0
  46. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/chat_tool_display.py +0 -0
  47. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/chat_tui.py +0 -0
  48. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/chat_tui_widgets.py +0 -0
  49. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/commands/__init__.py +0 -0
  50. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/commands/chat.py +0 -0
  51. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/commands/doctor.py +0 -0
  52. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/commands/loop.py +0 -0
  53. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/commands/new.py +0 -0
  54. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/commands/refresh.py +0 -0
  55. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/commands/run_cmd.py +0 -0
  56. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/commands/talk.py +0 -0
  57. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/commands/validate.py +0 -0
  58. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/compat.py +0 -0
  59. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/config_resolve.py +0 -0
  60. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/exit_commands.py +0 -0
  61. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/gateway_health.py +0 -0
  62. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/main.py +0 -0
  63. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/opensandbox_lifecycle.py +0 -0
  64. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/output.py +0 -0
  65. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/process_tree.py +0 -0
  66. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/realtime/__init__.py +0 -0
  67. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/realtime/audio_io.py +0 -0
  68. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/realtime/client.py +0 -0
  69. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/realtime/gateway_manager.py +0 -0
  70. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/realtime/push_to_talk.py +0 -0
  71. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/realtime/session.py +0 -0
  72. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/realtime/session_controller.py +0 -0
  73. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/realtime/talk_ui.py +0 -0
  74. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/realtime/wire_encode.py +0 -0
  75. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/runtime_python.py +0 -0
  76. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/AGENT.md +0 -0
  77. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/Dockerfile +0 -0
  78. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/__init__.py +0 -0
  79. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/browser/SKILL.md +0 -0
  80. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/command_allowlist.yaml +0 -0
  81. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/dockerignore +0 -0
  82. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/image-generator/SKILL.md +0 -0
  83. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/image-generator/generate_image.py +0 -0
  84. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/loop/SKILL.md +0 -0
  85. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/mcp.json +0 -0
  86. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/opensandbox.docker.toml +0 -0
  87. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/otel-collector.example.yaml +0 -0
  88. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/permissions.yaml +0 -0
  89. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/session_controller.py +0 -0
  90. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/terminal_markdown.py +0 -0
  91. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_continue.py +0 -0
  92. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_e2e.py +0 -0
  93. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_errors.py +0 -0
  94. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_file_index.py +0 -0
  95. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_grounding.py +0 -0
  96. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_local_shell.py +0 -0
  97. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_renderer_parity.py +0 -0
  98. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_session.py +0 -0
  99. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_status_bar.py +0 -0
  100. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_theme.py +0 -0
  101. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_tool_display.py +0 -0
  102. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_tui.py +0 -0
  103. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_cli.py +0 -0
  104. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_config_resolve.py +0 -0
  105. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_doctor.py +0 -0
  106. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_gateway_health.py +0 -0
  107. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_opensandbox_lifecycle.py +0 -0
  108. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_realtime_session_controller.py +0 -0
  109. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_run_cmd.py +0 -0
  110. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_runtime_python.py +0 -0
  111. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_terminal_markdown.py +0 -0
  112. {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/uv.lock +0 -0
  113. {monkeybot-3.0.3 → monkeybot-3.0.4}/docker/Dockerfile +0 -0
  114. {monkeybot-3.0.3 → monkeybot-3.0.4}/docker/docker-compose.sandbox.yml +0 -0
  115. {monkeybot-3.0.3 → monkeybot-3.0.4}/docker/opensandbox.docker.toml +0 -0
  116. {monkeybot-3.0.3 → monkeybot-3.0.4}/docker/sandbox.Dockerfile +0 -0
  117. {monkeybot-3.0.3 → monkeybot-3.0.4}/docker-compose.yml +0 -0
  118. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/agent-layout.md +0 -0
  119. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/assets/logo.png +0 -0
  120. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/browser-mcp.md +0 -0
  121. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/cloud-deployment-design.md +0 -0
  122. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/deploy-aws-agentcore.md +0 -0
  123. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/deploy-pattern-a-container.md +0 -0
  124. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/deploy-pattern-b-serverless.md +0 -0
  125. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/deploy-pattern-c-agent-platform.md +0 -0
  126. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/deploy-pattern-d-realtime.md +0 -0
  127. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/getting-started.md +0 -0
  128. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/knowledge-layer-fixes.md +0 -0
  129. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/live-evals.md +0 -0
  130. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/mcp.md +0 -0
  131. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/memory-graph-split-plan.md +0 -0
  132. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/migrations/agent-scope-namespacing.md +0 -0
  133. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/migrations/memory-outbox.sql +0 -0
  134. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/observability-runbook.md +0 -0
  135. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/otel-collector.example.yaml +0 -0
  136. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/progressive-loop-tools.md +0 -0
  137. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/progressive-mcp-tools.md +0 -0
  138. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/skills.md +0 -0
  139. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/spill-dynamic-design.md +0 -0
  140. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/sse-gateway-ui.md +0 -0
  141. {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/workspace-index-design.md +0 -0
  142. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/TEST_COVERAGE.md +0 -0
  143. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/assertions.py +0 -0
  144. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/diff.py +0 -0
  145. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/eval_config.yaml +0 -0
  146. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/models.py +0 -0
  147. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/persistence.py +0 -0
  148. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/report.py +0 -0
  149. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/runner.py +0 -0
  150. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenario_loader.py +0 -0
  151. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/context/summarization_trigger.yaml +0 -0
  152. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/mcp/get_prompt.yaml +0 -0
  153. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/mcp/list_resources.yaml +0 -0
  154. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/mcp/tool_invoke.yaml +0 -0
  155. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/memory/recall_cross_session.yaml +0 -0
  156. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/memory/recall_single_session.yaml +0 -0
  157. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/multi_turn/task_tracking.yaml +0 -0
  158. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/skills/skill_invocation.yaml +0 -0
  159. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/subagents/dispatch_complete.yaml +0 -0
  160. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/tools/core_read.yaml +0 -0
  161. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/tools/core_read_error.yaml +0 -0
  162. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/tools/core_run_command.yaml +0 -0
  163. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/tools/core_run_command_sandbox.yaml +0 -0
  164. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/tools/core_write.yaml +0 -0
  165. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scorer.py +0 -0
  166. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/.env.example +0 -0
  167. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/.gitignore +0 -0
  168. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/fixture_mcp_server.py +0 -0
  169. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/monkeybot_config/AGENT.md +0 -0
  170. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/monkeybot_config/command_allowlist.yaml +0 -0
  171. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/monkeybot_config/mcp.json +0 -0
  172. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/monkeybot_config/monkeybot.yaml +0 -0
  173. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/monkeybot_config/permissions.yaml +0 -0
  174. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/pyproject.toml +0 -0
  175. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/skills/browser/SKILL.md +0 -0
  176. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/uv.lock +0 -0
  177. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/workspace/.gitkeep +0 -0
  178. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/workspace/skills/browser/playbooks/.gitkeep +0 -0
  179. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/suites/smoke.yaml +0 -0
  180. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/test_assertions.py +0 -0
  181. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/test_diff.py +0 -0
  182. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/test_judge.py +0 -0
  183. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/test_report.py +0 -0
  184. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/test_runner_sse.py +0 -0
  185. {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/test_scorer.py +0 -0
  186. {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/README.md +0 -0
  187. {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/agentcore/handler.py +0 -0
  188. {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/agentcore/runtime_app.py +0 -0
  189. {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/agentengine/handler.py +0 -0
  190. {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/cloud-functions/main.py +0 -0
  191. {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/lambda/handler.py +0 -0
  192. {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/skills/browser/SKILL.md +0 -0
  193. {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/skills/browser/playbooks/.gitkeep +0 -0
  194. {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/skills/diagnostics/README.md +0 -0
  195. {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/skills/diagnostics/SKILL.md +0 -0
  196. {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/skills/diagnostics/__init__.py +0 -0
  197. {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/skills/diagnostics/diagnostics.py +0 -0
  198. {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/skills/image-generator/SKILL.md +0 -0
  199. {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/skills/image-generator/generate_image.py +0 -0
  200. {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/pyproject.toml +0 -0
  201. {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/scripts/agentcore_smoke.py +0 -0
  202. {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/src/browser_mcp/__init__.py +0 -0
  203. {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/src/browser_mcp/agentcore.py +0 -0
  204. {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/src/browser_mcp/assets/NOTICE.md +0 -0
  205. {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/src/browser_mcp/assets/dom_tree.js +0 -0
  206. {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/src/browser_mcp/assets/pa_driver.js +0 -0
  207. {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/src/browser_mcp/dom_indexing.py +0 -0
  208. {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/src/browser_mcp/playbooks.py +0 -0
  209. {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/src/browser_mcp/playwright_helpers.py +0 -0
  210. {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/src/browser_mcp/screenshots.py +0 -0
  211. {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/src/browser_mcp/server.py +0 -0
  212. {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/tests/test_agentcore.py +0 -0
  213. {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/tests/test_dom_indexing.py +0 -0
  214. {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/tests/test_in_app_cdp.py +0 -0
  215. {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/tests/test_indexed_tools.py +0 -0
  216. {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/tests/test_playbooks.py +0 -0
  217. {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/tests/test_playwright_helpers.py +0 -0
  218. {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/tests/test_screenshots.py +0 -0
  219. {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/tests/test_server_shutdown.py +0 -0
  220. {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/uv.lock +0 -0
  221. {monkeybot-3.0.3 → monkeybot-3.0.4}/pytest.ini +0 -0
  222. {monkeybot-3.0.3 → monkeybot-3.0.4}/scripts/create_schema.py +0 -0
  223. {monkeybot-3.0.3 → monkeybot-3.0.4}/scripts/precommit-pytest.sh +0 -0
  224. {monkeybot-3.0.3 → monkeybot-3.0.4}/scripts/release.py +0 -0
  225. {monkeybot-3.0.3 → monkeybot-3.0.4}/scripts/smoke_global_cli.sh +0 -0
  226. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/__init__.py +0 -0
  227. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/cli/__init__.py +0 -0
  228. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/cli/__main__.py +0 -0
  229. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/cli/audio_io.py +0 -0
  230. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/cli/gateway_manager.py +0 -0
  231. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/cli/main.py +0 -0
  232. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/cli/push_to_talk.py +0 -0
  233. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/cli/realtime_client.py +0 -0
  234. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/computer/__init__.py +0 -0
  235. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/computer/approvals.py +0 -0
  236. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/computer/permissions.py +0 -0
  237. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/computer/safety.py +0 -0
  238. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/computer/tools.py +0 -0
  239. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/__init__.py +0 -0
  240. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/attachments/__init__.py +0 -0
  241. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/attachments/catalog.py +0 -0
  242. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/attachments/config.py +0 -0
  243. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/attachments/freeze.py +0 -0
  244. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/attachments/resolve.py +0 -0
  245. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/attachments/store.py +0 -0
  246. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/attachments/text.py +0 -0
  247. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/attachments/tools.py +0 -0
  248. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/config/__init__.py +0 -0
  249. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/config/realtime_config.py +0 -0
  250. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/config/runtime_env.py +0 -0
  251. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/config/yaml_loader.py +0 -0
  252. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/context/__init__.py +0 -0
  253. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/context/campaign_context.py +0 -0
  254. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/context/common.py +0 -0
  255. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/context/epoch.py +0 -0
  256. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/context/tool_output_policy.py +0 -0
  257. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/context/tool_result_ingress.py +0 -0
  258. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/context/tool_shapers.py +0 -0
  259. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/hooks/__init__.py +0 -0
  260. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/captions.py +0 -0
  261. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/chunking.py +0 -0
  262. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/embeddings/__init__.py +0 -0
  263. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/embeddings/base.py +0 -0
  264. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/embeddings/factory.py +0 -0
  265. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/embeddings/gemini.py +0 -0
  266. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/embeddings/nvidia.py +0 -0
  267. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/embeddings/openai_compat.py +0 -0
  268. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/embeddings/sanitize.py +0 -0
  269. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/evidence_guard.py +0 -0
  270. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/extractors.py +0 -0
  271. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/fusion.py +0 -0
  272. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/hook.py +0 -0
  273. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/indexer.py +0 -0
  274. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/links.py +0 -0
  275. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/salience.py +0 -0
  276. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/sqlite_index.py +0 -0
  277. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/subsystem.py +0 -0
  278. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/tool.py +0 -0
  279. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/types.py +0 -0
  280. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/layout.py +0 -0
  281. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/llm/__init__.py +0 -0
  282. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/llm/provider.py +0 -0
  283. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/llm/realtime_provider.py +0 -0
  284. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/llm/usage.py +0 -0
  285. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/lockfile_names.py +0 -0
  286. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/logging_utils.py +0 -0
  287. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/mcp/__init__.py +0 -0
  288. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/mcp/mcp_client.py +0 -0
  289. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/mcp/ports_mcp.py +0 -0
  290. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/__init__.py +0 -0
  291. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/config.py +0 -0
  292. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/hook.py +0 -0
  293. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/ids.py +0 -0
  294. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/ingest.py +0 -0
  295. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/migrate_layout.py +0 -0
  296. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/observability.py +0 -0
  297. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/outbox.py +0 -0
  298. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/palace.py +0 -0
  299. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/subsystem.py +0 -0
  300. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/uri.py +0 -0
  301. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/writer.py +0 -0
  302. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/messages/__init__.py +0 -0
  303. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/messages/convert_provider.py +0 -0
  304. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/messages/tool_integrity.py +0 -0
  305. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/messages/transform_context.py +0 -0
  306. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/path_safety.py +0 -0
  307. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/__init__.py +0 -0
  308. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/backends.py +0 -0
  309. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/db.py +0 -0
  310. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/durable_runs.py +0 -0
  311. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/errors.py +0 -0
  312. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/firestore.indexes.json +0 -0
  313. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/firestore.py +0 -0
  314. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/firestore_scheduled_loops.py +0 -0
  315. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/history.py +0 -0
  316. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/postgres.py +0 -0
  317. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/runs.py +0 -0
  318. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/scheduled_loops.py +0 -0
  319. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/session_turn_locks.py +0 -0
  320. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/sqlite.py +0 -0
  321. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/sqlite_backend.py +0 -0
  322. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/sqlite_vector.py +0 -0
  323. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/thread_summary.py +0 -0
  324. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/transcript.py +0 -0
  325. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/transcript_analyzer.py +0 -0
  326. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/usage.py +0 -0
  327. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/usage_buckets.py +0 -0
  328. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/prompts/__init__.py +0 -0
  329. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/prompts/harness_prompt.py +0 -0
  330. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/prompts/headings.py +0 -0
  331. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/prompts/prompt.py +0 -0
  332. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/__init__.py +0 -0
  333. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/context_budget.py +0 -0
  334. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/doom_loop.py +0 -0
  335. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/events.py +0 -0
  336. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/history_compaction.py +0 -0
  337. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/input_admission.py +0 -0
  338. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/loop.py +0 -0
  339. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/loop_hooks.py +0 -0
  340. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/loop_messages.py +0 -0
  341. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/loop_ports.py +0 -0
  342. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/provider_stream_mapper.py +0 -0
  343. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/realtime_loop.py +0 -0
  344. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/tool_batch.py +0 -0
  345. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/tool_dispatch.py +0 -0
  346. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/turn_loop.py +0 -0
  347. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/utterance_buffer.py +0 -0
  348. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/subagents/__init__.py +0 -0
  349. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/subagents/progress_publish.py +0 -0
  350. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/subagents/subagent_proto.py +0 -0
  351. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/subagents/subagent_worker.py +0 -0
  352. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/subagents/worker_pool.py +0 -0
  353. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/testing/__init__.py +0 -0
  354. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/testing/mocks_provider.py +0 -0
  355. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/testing/mocks_realtime_provider.py +0 -0
  356. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/__init__.py +0 -0
  357. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/core_tool_executor.py +0 -0
  358. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/fs_isolation.py +0 -0
  359. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/inspector.py +0 -0
  360. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/loop_inspector.py +0 -0
  361. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/patch.py +0 -0
  362. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/permission.py +0 -0
  363. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/sandbox_executor.py +0 -0
  364. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/spill_inventory.py +0 -0
  365. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/terminal.py +0 -0
  366. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/text_normalize.py +0 -0
  367. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/tool_hint.py +0 -0
  368. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/tool_kind.py +0 -0
  369. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/types.py +0 -0
  370. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/workspace_service.py +0 -0
  371. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/types/__init__.py +0 -0
  372. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/types/content_blocks.py +0 -0
  373. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/types/interfaces.py +0 -0
  374. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/types/types_tools.py +0 -0
  375. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/workspace/__init__.py +0 -0
  376. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/workspace/factory.py +0 -0
  377. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/workspace/gcs.py +0 -0
  378. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/workspace/local.py +0 -0
  379. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/workspace/protocol.py +0 -0
  380. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/workspace/s3.py +0 -0
  381. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/workspace_layout.py +0 -0
  382. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/__init__.py +0 -0
  383. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/bootstrap.py +0 -0
  384. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/main.py +0 -0
  385. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/pending_response_bus.py +0 -0
  386. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime/__init__.py +0 -0
  387. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime/app.py +0 -0
  388. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime/deps.py +0 -0
  389. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime/errors.py +0 -0
  390. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime/guardrails.py +0 -0
  391. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime/manager.py +0 -0
  392. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime/metrics.py +0 -0
  393. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime/routes.py +0 -0
  394. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime/session.py +0 -0
  395. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime/wire.py +0 -0
  396. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime_main.py +0 -0
  397. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/__init__.py +0 -0
  398. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/loop_port.py +0 -0
  399. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/models.py +0 -0
  400. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/reply_body.py +0 -0
  401. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/routes.py +0 -0
  402. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/scheduler_routes.py +0 -0
  403. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/scheduler_wiring.py +0 -0
  404. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/session_bus.py +0 -0
  405. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/sse.py +0 -0
  406. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/workspace_layout.py +0 -0
  407. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/observability/__init__.py +0 -0
  408. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/observability/_state.py +0 -0
  409. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/observability/instrumentation.py +0 -0
  410. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/observability/propagation.py +0 -0
  411. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/observability/spans.py +0 -0
  412. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/observability/sqlite_exporter.py +0 -0
  413. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/__init__.py +0 -0
  414. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/_bedrock_converse.py +0 -0
  415. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/_openai_compat.py +0 -0
  416. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/_utils.py +0 -0
  417. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/bedrock.py +0 -0
  418. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/claude.py +0 -0
  419. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/gemini.py +0 -0
  420. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/gemini_live.py +0 -0
  421. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/huggingface.py +0 -0
  422. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/model_capabilities.py +0 -0
  423. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/nvidia.py +0 -0
  424. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/openai.py +0 -0
  425. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/openrouter.py +0 -0
  426. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/pricing.py +0 -0
  427. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/sampling.py +0 -0
  428. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/vertex_claude.py +0 -0
  429. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/scaffold/__init__.py +0 -0
  430. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/scheduler/__init__.py +0 -0
  431. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/scheduler/__main__.py +0 -0
  432. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/scheduler/engine.py +0 -0
  433. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/scheduler/http_invoker.py +0 -0
  434. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/scheduler/interval.py +0 -0
  435. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/scheduler/tick_result.py +0 -0
  436. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/scheduler/worker.py +0 -0
  437. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/subagents/__init__.py +0 -0
  438. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/subagents/worker/__init__.py +0 -0
  439. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/subagents/worker/__main__.py +0 -0
  440. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/todo_list/__init__.py +0 -0
  441. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/todo_list/store.py +0 -0
  442. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/todo_list/tool.py +0 -0
  443. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/web_search/__init__.py +0 -0
  444. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/web_search/backends/__init__.py +0 -0
  445. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/web_search/backends/duckduckgo.py +0 -0
  446. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/web_search/backends/firecrawl.py +0 -0
  447. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/web_search/backends/tavily.py +0 -0
  448. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/web_search/protocol.py +0 -0
  449. {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/web_search/tool.py +0 -0
  450. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/__init__.py +0 -0
  451. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/acceptance/test_observability_acceptance.py +0 -0
  452. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/cli/__init__.py +0 -0
  453. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/cli/test_gateway_manager.py +0 -0
  454. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/cli/test_main.py +0 -0
  455. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/cli/test_push_to_talk.py +0 -0
  456. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/cli/test_realtime_client.py +0 -0
  457. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/computer/__init__.py +0 -0
  458. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/computer/test_approvals.py +0 -0
  459. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/computer/test_computer_tools.py +0 -0
  460. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/computer/test_package_init.py +0 -0
  461. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/computer/test_path_policy.py +0 -0
  462. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/computer/test_permissions.py +0 -0
  463. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/computer/test_subagent_exclusion.py +0 -0
  464. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/computer/test_wiring.py +0 -0
  465. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/conftest.py +0 -0
  466. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/__init__.py +0 -0
  467. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/fixtures/bitbucket_dc_style_pr.diff +0 -0
  468. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/memory/helpers.py +0 -0
  469. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/memory/in_memory_palace.py +0 -0
  470. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/memory/test_mempalace.py +0 -0
  471. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/memory/test_review_fixes.py +0 -0
  472. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_agent_layout.py +0 -0
  473. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_attachment_freeze.py +0 -0
  474. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_attachment_store.py +0 -0
  475. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_bootstrap.py +0 -0
  476. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_content_blocks.py +0 -0
  477. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_context.py +0 -0
  478. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_context_budget.py +0 -0
  479. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_context_epoch.py +0 -0
  480. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_core_tool_executor.py +0 -0
  481. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_doom_loop.py +0 -0
  482. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_durable_events.py +0 -0
  483. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_durable_runs.py +0 -0
  484. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_empty_completion.py +0 -0
  485. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_events.py +0 -0
  486. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_evidence_guard.py +0 -0
  487. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_firestore_history.py +0 -0
  488. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_firestore_scheduled_loops.py +0 -0
  489. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_firestore_usage.py +0 -0
  490. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_fs_isolation.py +0 -0
  491. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_gemini_history_replay.py +0 -0
  492. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_harness_prompt.py +0 -0
  493. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_history.py +0 -0
  494. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_history_compaction_split.py +0 -0
  495. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_hooks.py +0 -0
  496. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_input_admission.py +0 -0
  497. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_inspector.py +0 -0
  498. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_chunking.py +0 -0
  499. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_chunking_rank.py +0 -0
  500. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_embeddings.py +0 -0
  501. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_fts.py +0 -0
  502. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_fusion.py +0 -0
  503. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_fusion_ann.py +0 -0
  504. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_hook.py +0 -0
  505. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_indexer.py +0 -0
  506. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_links.py +0 -0
  507. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_media.py +0 -0
  508. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_salience.py +0 -0
  509. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_single_writer.py +0 -0
  510. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_subsystem.py +0 -0
  511. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_vectors.py +0 -0
  512. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_layout.py +0 -0
  513. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_logging_utils.py +0 -0
  514. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_loop.py +0 -0
  515. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_loop_hooks.py +0 -0
  516. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_loop_observability.py +0 -0
  517. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_loop_transcript.py +0 -0
  518. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_mcp_client.py +0 -0
  519. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_memory_layout_migrate.py +0 -0
  520. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_message_pipeline.py +0 -0
  521. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_mocks_realtime_provider.py +0 -0
  522. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_patch.py +0 -0
  523. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_path_safety.py +0 -0
  524. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_permission.py +0 -0
  525. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_pricing.py +0 -0
  526. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_progress_publish.py +0 -0
  527. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_prompt.py +0 -0
  528. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_provider_contract.py +0 -0
  529. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_provider_stream_mapper.py +0 -0
  530. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_realtime_loop.py +0 -0
  531. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_replace_fuzzy.py +0 -0
  532. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_run_command_parse.py +0 -0
  533. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_runs.py +0 -0
  534. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_runtime_env.py +0 -0
  535. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_sandbox_executor.py +0 -0
  536. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_scheduled_loops.py +0 -0
  537. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_session_turn_locks.py +0 -0
  538. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_settlement.py +0 -0
  539. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_spill_dynamic.py +0 -0
  540. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_spill_inventory.py +0 -0
  541. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_storage_backends.py +0 -0
  542. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_subagent_proto.py +0 -0
  543. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_subagent_trace_propagation.py +0 -0
  544. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_subagent_worker_paths.py +0 -0
  545. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_terminal.py +0 -0
  546. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_thread_summary_wire.py +0 -0
  547. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_tool_def_schema.py +0 -0
  548. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_tool_integrity.py +0 -0
  549. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_tool_result_ingress.py +0 -0
  550. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_tool_shapers.py +0 -0
  551. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_transcript.py +0 -0
  552. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_transcript_analyzer.py +0 -0
  553. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_truncated_tool_batch.py +0 -0
  554. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_usage.py +0 -0
  555. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_usage_migration.py +0 -0
  556. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_utterance_buffer.py +0 -0
  557. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_worker_pool.py +0 -0
  558. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_workspace_layout.py +0 -0
  559. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_workspace_symlinks.py +0 -0
  560. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_workspace_write_scope.py +0 -0
  561. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/workspace/test_factory.py +0 -0
  562. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/workspace/test_local_storage.py +0 -0
  563. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/workspace/test_protocol_contract.py +0 -0
  564. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/__init__.py +0 -0
  565. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/eval_hook.py +0 -0
  566. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenario_runner.py +0 -0
  567. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/context_curation.yaml +0 -0
  568. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/memory_write_inject.yaml +0 -0
  569. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/subagent_roundtrip.yaml +0 -0
  570. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_glob_grep.yaml +0 -0
  571. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_load_file.yaml +0 -0
  572. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_loops.yaml +0 -0
  573. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_read.yaml +0 -0
  574. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_replace_apply_patch.yaml +0 -0
  575. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_run_command.yaml +0 -0
  576. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_search_knowledge.yaml +0 -0
  577. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_search_memory.yaml +0 -0
  578. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_todo_list.yaml +0 -0
  579. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_web_search.yaml +0 -0
  580. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_write.yaml +0 -0
  581. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/turn_completion.yaml +0 -0
  582. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/test_agent_behavior.py +0 -0
  583. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/test_memory_knowledge_routing.py +0 -0
  584. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/__init__.py +0 -0
  585. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/realtime/__init__.py +0 -0
  586. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/realtime/test_app.py +0 -0
  587. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/realtime/test_deps.py +0 -0
  588. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/realtime/test_guardrails.py +0 -0
  589. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/realtime/test_manager.py +0 -0
  590. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/realtime/test_metrics.py +0 -0
  591. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/realtime/test_routes_client_text.py +0 -0
  592. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/realtime/test_session.py +0 -0
  593. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/realtime/test_wire.py +0 -0
  594. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/sse/test_attachments.py +0 -0
  595. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/sse/test_create_session_model.py +0 -0
  596. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/sse/test_routes.py +0 -0
  597. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/sse/test_scheduler_routes.py +0 -0
  598. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/sse/test_session_bus.py +0 -0
  599. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/sse/test_transcript_wiring.py +0 -0
  600. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/test_otel_fastapi.py +0 -0
  601. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/test_otel_lifespan.py +0 -0
  602. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/test_pending_response_endpoints.py +0 -0
  603. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/test_realtime_main.py +0 -0
  604. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/test_sse_events.py +0 -0
  605. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/test_subagent_event_publisher.py +0 -0
  606. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/integration/__init__.py +0 -0
  607. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/integration/test_mb_e2e_simple_reply.py +0 -0
  608. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/integration/test_observability_integration.py +0 -0
  609. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/integration/test_prompt_caching_integration.py +0 -0
  610. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/observability/conftest.py +0 -0
  611. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/observability/test_init.py +0 -0
  612. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/observability/test_instrumentation.py +0 -0
  613. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/observability/test_loop_hook_spans.py +0 -0
  614. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/observability/test_propagation.py +0 -0
  615. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/observability/test_span_contract.py +0 -0
  616. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/observability/test_spans.py +0 -0
  617. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/observability/test_sqlite_exporter.py +0 -0
  618. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/observability/test_truncate.py +0 -0
  619. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/observability/test_turn_complete_trace.py +0 -0
  620. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/conftest.py +0 -0
  621. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_anthropic_cache.py +0 -0
  622. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_anthropic_history.py +0 -0
  623. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_bedrock_converse.py +0 -0
  624. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_bedrock_estimate.py +0 -0
  625. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_gemini_live.py +0 -0
  626. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_gemini_usage.py +0 -0
  627. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_huggingface.py +0 -0
  628. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_model_capabilities.py +0 -0
  629. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_nvidia.py +0 -0
  630. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_openai_compat_usage.py +0 -0
  631. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_openai_history.py +0 -0
  632. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_pricing.py +0 -0
  633. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_safe_parse_tool_args.py +0 -0
  634. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_sampling.py +0 -0
  635. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_sonnet5_sampling.py +0 -0
  636. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_source_grep_gates.py +0 -0
  637. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_vertex_claude_history.py +0 -0
  638. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/scheduler/test_engine.py +0 -0
  639. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/scheduler/test_interval.py +0 -0
  640. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/skills/__init__.py +0 -0
  641. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/skills/test_generate_image_script.py +0 -0
  642. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/test_cold_start.py +0 -0
  643. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/test_packaging_config.py +0 -0
  644. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/test_release_script.py +0 -0
  645. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/todo_list/test_todo_list.py +0 -0
  646. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/web_search/__init__.py +0 -0
  647. {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/web_search/test_web_search.py +0 -0
@@ -6,6 +6,18 @@ the project adheres to [Semantic Versioning](https://semver.org/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ### CLI
10
+
11
+ ### Changed
12
+
13
+ - CLI extras catalog / `monkeybot new` provider menu lists `ollama-cloud` and `ollama-local` instead of a single `ollama` row. `--with ollama` and `--provider ollama` still work.
14
+
15
+ ## [core v3.0.4] - 2026-08-28
16
+
17
+ ### Added
18
+
19
+ - Explicit `ollama-cloud` and `ollama-local` provider ids so Cloud always hits `https://ollama.com` even when a leftover local `OLLAMA_BASE_URL` is set. Legacy `ollama` still auto-routes from env.
20
+
9
21
  ## [core v3.0.3] - 2026-08-23
10
22
 
11
23
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: monkeybot
3
- Version: 3.0.3
3
+ Version: 3.0.4
4
4
  Summary: monkeybot agent harness — FastAPI SSE gateway, owned loop, SQLite, and MCP.
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -111,7 +111,9 @@ uv sync
111
111
  | `vertex-claude` | `GCP_PROJECT_ID` / `GOOGLE_CLOUD_PROJECT` / `ANTHROPIC_VERTEX_PROJECT_ID` (ADC) | `monkeybot[vertex-claude]` |
112
112
  | `aws_bedrock` | `AWS_ACCESS_KEY_ID` / `AWS_PROFILE` + `AWS_REGION` | `monkeybot[bedrock]` |
113
113
  | `huggingface` | `HF_TOKEN` (or `HUGGINGFACE_API_KEY`) | `monkeybot[huggingface]` |
114
- | `ollama` | None required — `OLLAMA_BASE_URL` (default `http://localhost:11434`) for a non-default server | `monkeybot[ollama]` |
114
+ | `ollama-cloud` | `OLLAMA_API_KEY` | `monkeybot[ollama]` |
115
+ | `ollama-local` | None required — `OLLAMA_BASE_URL` (default `http://localhost:11434`) | `monkeybot[ollama]` |
116
+ | `ollama` | Legacy auto-route (key + blank URL = cloud; explicit URL wins) | `monkeybot[ollama]` |
115
117
 
116
118
  **Agent-first dependencies.** The CLI is thin — it does **not** install provider/storage extras globally. `monkeybot new` scaffolds a `pyproject.toml` with the selected provider (and any `--with` extras). Run plain `uv sync` in the agent directory. `monkeybot run` / `chat` spawn the gateway from that project's interpreter (`.venv/bin/python`, else `uv run python`), and `doctor` checks extras in that same interpreter. For a config-only tree (just `monkeybot_config/`, no `pyproject.toml`) the gateway uses the CLI's interpreter when it already has MonkeyBot 3.x (and MemPalace if memory is on). If memory is enabled and that interpreter cannot import MemPalace, `run` / `chat` provision a cached CLI-managed venv under `~/.cache/monkeybot/runtimes/` holding `monkeybot[memory]` pinned to the running core (never rewrites a `pyproject.toml`). `doctor` reuses that cache when it is already present. Otherwise extras must be installed in the CLI env (`uv tool install --with 'monkeybot[<extra>]' monkeybot-cli`).
117
119
 
@@ -45,7 +45,7 @@ Validate check ids: `paths.agent_md.exists`, `paths.skills_path.exists`, `paths.
45
45
  | `max_turns` | `1000` | Hard cap on turns per run |
46
46
  | `summarization_model` | (main model) | Cheaper model for history summarization (env `CONTEXT_SUMMARIZATION_MODEL`) |
47
47
 
48
- Validate check ids: `model.provider.supported`, `model.name.present`. Supported YAML providers: `gemini`/`vertex`, `openai`, `anthropic`, `vertex-claude`, `huggingface`, `ollama`, `aws_bedrock`, `fake`.
48
+ Validate check ids: `model.provider.supported`, `model.name.present`. Supported YAML providers: `gemini`/`vertex`, `openai`, `anthropic`, `vertex-claude`, `huggingface`, `ollama-cloud`, `ollama-local`, `ollama`, `aws_bedrock`, `fake`.
49
49
 
50
50
  ## `gcp` / `anthropic_vertex` (non-secret identifiers)
51
51
 
@@ -24,7 +24,8 @@ PROVIDER_CHOICES: tuple[ExtraChoice, ...] = (
24
24
  ExtraChoice("vertex-claude", "Claude on Vertex AI"),
25
25
  ExtraChoice("aws_bedrock", "AWS Bedrock"),
26
26
  ExtraChoice("huggingface", "Hugging Face"),
27
- ExtraChoice("ollama", "Ollama (local)"),
27
+ ExtraChoice("ollama-cloud", "Ollama Cloud"),
28
+ ExtraChoice("ollama-local", "Ollama (local)"),
28
29
  ExtraChoice("nvidia", "NVIDIA NIM"),
29
30
  ExtraChoice("openrouter", "OpenRouter"),
30
31
  )
@@ -59,6 +59,17 @@ PROVIDER_SPECS: dict[str, ProviderSpec] = {
59
59
  (),
60
60
  credentials_optional=True,
61
61
  ),
62
+ "ollama-cloud": ProviderSpec(
63
+ ("ollama-cloud", "ollama_cloud"),
64
+ "ollama",
65
+ ("OLLAMA_API_KEY",),
66
+ ),
67
+ "ollama-local": ProviderSpec(
68
+ ("ollama-local", "ollama_local"),
69
+ "ollama",
70
+ (),
71
+ credentials_optional=True,
72
+ ),
62
73
  "fake": ProviderSpec(("fake",), None, (), credentials_optional=True),
63
74
  }
64
75
 
@@ -138,6 +138,7 @@ def ensure_workspace(dest: Path, *, force: bool) -> list[str]:
138
138
  "browser/playbooks",
139
139
  "browser/Screenshots",
140
140
  "generated-media/images",
141
+ "generated-media/video",
141
142
  ):
142
143
  path = workspace / rel
143
144
  path.mkdir(parents=True, exist_ok=True)
@@ -28,7 +28,10 @@ DB_URL=sqlite:///data/monkeybot.db
28
28
  # Hugging Face
29
29
  # HF_TOKEN=
30
30
 
31
- # Ollama (local modelsno API key needed)
31
+ # Ollama Cloud (model.provider: ollama-cloud)key from ollama.com/settings/keys
32
+ # OLLAMA_API_KEY=
33
+
34
+ # Ollama local (model.provider: ollama-local) — no API key needed
32
35
  # OLLAMA_BASE_URL=http://localhost:11434
33
36
 
34
37
  # Optional web search
@@ -87,7 +87,7 @@ paths:
87
87
  workspace_root: ./workspace
88
88
 
89
89
  model:
90
- # gemini | openai | anthropic | vertex-claude | huggingface | ollama | nvidia | openrouter | aws_bedrock | fake
90
+ # gemini | openai | anthropic | vertex-claude | huggingface | ollama-cloud | ollama-local | ollama | nvidia | openrouter | aws_bedrock | fake
91
91
  provider: gemini
92
92
  name: gemini-3.1-flash-live-preview
93
93
  temperature: 0.7
@@ -21,6 +21,8 @@ def test_normalize_extra_token_features_and_providers() -> None:
21
21
  assert normalize_extra_token("anthropic") == "claude"
22
22
  assert normalize_extra_token("aws_bedrock") == "bedrock"
23
23
  assert normalize_extra_token("claude") == "claude"
24
+ assert normalize_extra_token("ollama-cloud") == "ollama"
25
+ assert normalize_extra_token("ollama-local") == "ollama"
24
26
  assert normalize_extra_token("fake") is None
25
27
  assert normalize_extra_token("not-a-real-extra") is None
26
28
 
@@ -42,6 +44,9 @@ def test_extra_module_covers_catalog_extras() -> None:
42
44
  def test_provider_extra_name() -> None:
43
45
  assert provider_extra_name("openai") == "openai"
44
46
  assert provider_extra_name("anthropic") == "claude"
47
+ assert provider_extra_name("ollama-cloud") == "ollama"
48
+ assert provider_extra_name("ollama-local") == "ollama"
49
+ assert provider_extra_name("ollama") == "ollama"
45
50
  assert provider_extra_name("fake") is None
46
51
 
47
52
 
@@ -37,6 +37,7 @@ def test_run_new_creates_bundle(tmp_path: Path) -> None:
37
37
  assert (tmp_path / "workspace" / ".gitkeep").is_file()
38
38
  assert (tmp_path / "workspace" / "browser" / "playbooks").is_dir()
39
39
  assert (tmp_path / "workspace" / "generated-media" / "images").is_dir()
40
+ assert (tmp_path / "workspace" / "generated-media" / "video").is_dir()
40
41
  assert not (tmp_path / "workspace" / "skills").exists()
41
42
  assert (tmp_path / "Dockerfile").is_file()
42
43
  assert (tmp_path / ".dockerignore").is_file()
@@ -221,6 +221,7 @@ Each section follows: **Purpose** · **Key files** · **How it works** · **Depe
221
221
  | `vertex_anthropic` | vertex-claude | anthropic-messages | `cache_control` |
222
222
  | `aws_bedrock` | — | anthropic-messages | `cache_control` |
223
223
  | `huggingface` / `nvidia` / `ollama` | — | openai-compat | none |
224
+ | `ollama-cloud` / `ollama-local` | ollama_cloud, ollama_local | openai-compat | none |
224
225
  | `fake` | — | fake | gateway/test only |
225
226
 
226
227
  **Auth:** see CLI `monkeybot doctor` and `cli/.../providers.py` (`PROVIDER_SPECS`).
@@ -232,7 +233,7 @@ Each section follows: **Purpose** · **Key files** · **How it works** · **Depe
232
233
  - `count_input_tokens()` must match the same payload shape as `stream()` (summarization triggers, tool budgets).
233
234
  - Provider resolution via `MODEL_PROVIDER` aliases (`gemini` → `google_vertexai`, `vertex-claude` → `vertex_anthropic`).
234
235
  - Optional extras in `pyproject.toml`: `gemini`, `openai`, `claude`, `vertex-claude`, `bedrock`, `huggingface`, `ollama`, `nvidia`.
235
- - `ollama`, `huggingface`, and `nvidia` share the OpenAI-compatible streaming core (`providers/_openai_compat.py`) and only differ in base URL / auth; `ollama` runs against a local server (`OLLAMA_BASE_URL`, default `http://localhost:11434`) and needs no API key; `nvidia` hits `https://integrate.api.nvidia.com/v1` and needs a free `NVIDIA_API_KEY` from build.nvidia.com.
236
+ - `ollama`, `huggingface`, and `nvidia` share the OpenAI-compatible streaming core (`providers/_openai_compat.py`) and only differ in base URL / auth. Prefer explicit ids: `ollama-cloud` always hits `https://ollama.com` and requires `OLLAMA_API_KEY`; `ollama-local` always uses the local/self-hosted host (`OLLAMA_BASE_URL`, default `http://localhost:11434`) and needs no API key. Legacy `ollama` still auto-routes (a key with no URL means cloud; an explicit URL always wins). `nvidia` hits `https://integrate.api.nvidia.com/v1` and needs a free `NVIDIA_API_KEY` from build.nvidia.com.
236
237
  - `MODEL_PROVIDER=fake` is gateway/test-only; unit tests inject `ScriptedFakeProvider` directly.
237
238
 
238
239
  **Prompt-cache session hints (`ProviderCallHints`):**
@@ -267,7 +268,7 @@ Each section follows: **Purpose** · **Key files** · **How it works** · **Depe
267
268
  | `glob` / `grep` | Path discovery / content regex search (prefer over shell) |
268
269
  | `apply_patch` | Multi-file Codex-style Add/Update/Delete/Move; fail-closed before any write |
269
270
  | `search_memory` | Keyword search in memory tree |
270
- | `search` / `recall` | Local knowledge index (workspace + notes); **parallel-safe**. Gateway owns writes; subagents open the index **read-only** |
271
+ | `search` / `recall` | Local knowledge index (workspace + notes); **parallel-safe**. Gateway owns writes; subagents open the index **read-only**. Harness-as-library (Pattern B/C) callers can opt into read-only via `MONKEYBOT_KNOWLEDGE_READ_ONLY=1`; the gateway always ignores this flag and stays the writer |
271
272
  | `list_skills` | Skill discovery |
272
273
  | `run_command` | Allowlisted shell (host or OpenSandbox) |
273
274
  | `task` | Subagent subprocess (parent only) |
@@ -292,6 +293,7 @@ Each section follows: **Purpose** · **Key files** · **How it works** · **Depe
292
293
  - `task` omitted in subagent workers (`include_task_tool=False`).
293
294
  - Nested `task` disabled inside subagents.
294
295
  - Custom tools must not collide with core or MCP names.
296
+ - `MONKEYBOT_KNOWLEDGE_READ_ONLY` (default off) opens the knowledge index read-only for `create_harness_deps` (Pattern B/C) callers; subagent workers are always read-only regardless of the flag. The gateway SSE app is the sole writer per workspace and ignores this flag, logging a warning if it is set.
295
297
 
296
298
  ---
297
299
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "monkeybot"
7
- version = "3.0.3"
7
+ version = "3.0.4"
8
8
  description = "monkeybot agent harness — FastAPI SSE gateway, owned loop, SQLite, and MCP."
9
9
  requires-python = ">=3.11"
10
10
  readme = "README.md"
@@ -17,7 +17,10 @@ from monkeybot.core.config.settings import auto_schema_enabled_from_config, get_
17
17
  from monkeybot.core.context import build_context
18
18
  from monkeybot.core.hooks import HookManager
19
19
  from monkeybot.core.knowledge import KnowledgeSubsystem, resolve_knowledge_settings
20
- from monkeybot.core.knowledge.config import knowledge_enabled_from_config
20
+ from monkeybot.core.knowledge.config import (
21
+ knowledge_enabled_from_config,
22
+ knowledge_read_only_from_env,
23
+ )
21
24
  from monkeybot.core.llm.provider import Provider
22
25
  from monkeybot.core.llm.usage import usage_from_totals
23
26
  from monkeybot.core.mcp.mcp_client import MCPClient
@@ -181,6 +184,7 @@ async def create_harness_deps(
181
184
  settings=settings,
182
185
  knowledge_root=Path(settings.knowledge_root),
183
186
  index_path=Path(settings.index_path),
187
+ read_only=knowledge_read_only_from_env(),
184
188
  )
185
189
  await knowledge.ensure_ready()
186
190
  except Exception as exc:
@@ -5,7 +5,7 @@ from __future__ import annotations
5
5
  import logging
6
6
  import os
7
7
  from dataclasses import dataclass
8
- from typing import Any
8
+ from typing import Any, Literal
9
9
 
10
10
  from monkeybot.core.config.yaml_loader import load_monkeybot_yaml_dict
11
11
  from monkeybot.core.llm.provider import Provider
@@ -27,6 +27,16 @@ _MODEL_PROVIDER_ALIASES: dict[str, str] = {
27
27
  "google-vertexai": "google_vertexai",
28
28
  "vertex-claude": "vertex_anthropic",
29
29
  "vertex_claude": "vertex_anthropic",
30
+ # Hyphen form is the YAML / desktop-app id (unlike vertex-claude, which
31
+ # maps onto a different internal id).
32
+ "ollama_cloud": "ollama-cloud",
33
+ "ollama_local": "ollama-local",
34
+ }
35
+
36
+ _OLLAMA_MODES: dict[str, Literal["auto", "cloud", "local"]] = {
37
+ "ollama": "auto",
38
+ "ollama-cloud": "cloud",
39
+ "ollama-local": "local",
30
40
  }
31
41
 
32
42
 
@@ -203,9 +213,11 @@ def get_provider_config(
203
213
  ),
204
214
  resolved_model,
205
215
  )
206
- if provider_key == "ollama":
216
+ ollama_mode = _OLLAMA_MODES.get(provider_key)
217
+ if ollama_mode is not None:
207
218
  return ProviderConfig(
208
219
  OllamaProvider(
220
+ mode=ollama_mode,
209
221
  temperature=sampling.temperature,
210
222
  max_tokens=sampling.max_tokens,
211
223
  thinking_budget=thinking_budget,
@@ -243,7 +255,7 @@ def get_provider_config(
243
255
  raise ValueError(
244
256
  f"Unsupported model provider: {provider_key}. "
245
257
  "Supported providers: google_vertexai, openai, anthropic, vertex_anthropic, "
246
- "huggingface, ollama, nvidia, openrouter, aws_bedrock"
258
+ "huggingface, ollama, ollama-cloud, ollama-local, nvidia, openrouter, aws_bedrock"
247
259
  )
248
260
 
249
261
 
@@ -17,6 +17,8 @@ SUPPORTED_MODEL_PROVIDERS = frozenset(
17
17
  "vertex_anthropic",
18
18
  "huggingface",
19
19
  "ollama",
20
+ "ollama-cloud",
21
+ "ollama-local",
20
22
  "nvidia",
21
23
  "openrouter",
22
24
  "fake",
@@ -24,23 +26,17 @@ SUPPORTED_MODEL_PROVIDERS = frozenset(
24
26
  }
25
27
  )
26
28
 
27
- SUPPORTED_YAML_MODEL_PROVIDERS = frozenset(
29
+ # Canonical ids plus YAML aliases (gemini → google_vertexai, ollama_cloud →
30
+ # ollama-cloud, …). Env validation uses SUPPORTED_MODEL_PROVIDERS after
31
+ # normalize_model_provider; YAML validation checks the raw string.
32
+ SUPPORTED_YAML_MODEL_PROVIDERS = SUPPORTED_MODEL_PROVIDERS | frozenset(
28
33
  {
29
34
  "gemini",
30
35
  "vertex",
31
- "google_vertexai",
32
- "google_genai",
33
- "openai",
34
- "anthropic",
35
36
  "vertex-claude",
36
37
  "vertex_claude",
37
- "vertex_anthropic",
38
- "huggingface",
39
- "ollama",
40
- "nvidia",
41
- "openrouter",
42
- "fake",
43
- "aws_bedrock",
38
+ "ollama_cloud",
39
+ "ollama_local",
44
40
  }
45
41
  )
46
42
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  from monkeybot.core.knowledge.config import (
4
4
  knowledge_enabled_from_config,
5
+ knowledge_read_only_from_env,
5
6
  resolve_knowledge_settings,
6
7
  )
7
8
  from monkeybot.core.knowledge.subsystem import KnowledgeSubsystem
@@ -12,5 +13,6 @@ __all__ = [
12
13
  "KnowledgeSubsystem",
13
14
  "RecallHit",
14
15
  "knowledge_enabled_from_config",
16
+ "knowledge_read_only_from_env",
15
17
  "resolve_knowledge_settings",
16
18
  ]
@@ -3,6 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import logging
6
+ import os
6
7
  import shutil
7
8
  from pathlib import Path
8
9
  from typing import Any
@@ -39,6 +40,19 @@ def knowledge_enabled_from_config(config_path: str | None = None) -> bool:
39
40
  raise ConfigError(f"knowledge.enabled must be true or false, got {raw!r}")
40
41
 
41
42
 
43
+ def knowledge_read_only_from_env() -> bool:
44
+ """Opt-in only; default off (``MONKEYBOT_KNOWLEDGE_READ_ONLY``).
45
+
46
+ Intended for harness-as-library (Pattern B/C) and other reader-only
47
+ clients that want search without indexing writes. The gateway process
48
+ is the sole writer per workspace (see :class:`KnowledgeSubsystem`) and
49
+ ignores this flag rather than honoring it, so exporting it in a shared
50
+ env file cannot silently turn the writer into a reader.
51
+ """
52
+ raw = os.environ.get("MONKEYBOT_KNOWLEDGE_READ_ONLY", "").strip().lower()
53
+ return raw in ("1", "true", "yes")
54
+
55
+
42
56
  def resolve_knowledge_settings(
43
57
  *,
44
58
  agent_root: Path | None = None,
@@ -255,5 +269,6 @@ def _bool(yaml_raw: Any, default: bool) -> bool:
255
269
 
256
270
  __all__ = [
257
271
  "knowledge_enabled_from_config",
272
+ "knowledge_read_only_from_env",
258
273
  "resolve_knowledge_settings",
259
274
  ]
@@ -61,12 +61,17 @@ def _merge_usage_event(usage: Usage, ev: UsageEvent) -> None:
61
61
  usage.cache_creation_tokens += ev.cache_creation_tokens
62
62
 
63
63
 
64
+ _THINKING_BUDGET_PROVIDERS = frozenset(
65
+ {"gemini", "claude", "ollama", "ollama-cloud", "ollama-local"}
66
+ )
67
+
68
+
64
69
  def _stream_thinking_budget(
65
70
  provider: Provider,
66
71
  resolved_messages: Sequence[Message],
67
72
  ) -> int | None:
68
73
  """Per-call thinking budget override; None keeps the provider default."""
69
- if provider.name not in ("gemini", "claude", "ollama"):
74
+ if provider.name not in _THINKING_BUDGET_PROVIDERS:
70
75
  return None
71
76
  raw = os.environ.get("MONKEYBOT_RESUME_THINKING_BUDGET", "").strip()
72
77
  if not raw:
@@ -35,7 +35,10 @@ from monkeybot.core.config.settings import (
35
35
  from monkeybot.core.context import LoopsToolRegistry, build_context
36
36
  from monkeybot.core.hooks import HookManager
37
37
  from monkeybot.core.knowledge import KnowledgeSubsystem, resolve_knowledge_settings
38
- from monkeybot.core.knowledge.config import knowledge_enabled_from_config
38
+ from monkeybot.core.knowledge.config import (
39
+ knowledge_enabled_from_config,
40
+ knowledge_read_only_from_env,
41
+ )
39
42
  from monkeybot.core.layout import AgentLayout
40
43
  from monkeybot.core.llm.provider import (
41
44
  Done,
@@ -45,7 +48,8 @@ from monkeybot.core.llm.provider import (
45
48
  ToolCall,
46
49
  UsageEvent,
47
50
  )
48
- from monkeybot.core.llm.usage import Usage as UsageRecord, UsageGranularity
51
+ from monkeybot.core.llm.usage import Usage as UsageRecord
52
+ from monkeybot.core.llm.usage import UsageGranularity
49
53
  from monkeybot.core.logging_utils import kv
50
54
  from monkeybot.core.mcp.mcp_client import MCPClient
51
55
  from monkeybot.core.memory.config import memory_enabled_from_config
@@ -647,6 +651,13 @@ async def _startup(fastapi_app: FastAPI) -> None:
647
651
  # Unified knowledge layer — FTS + ANN + links + search
648
652
  if knowledge_enabled_from_config():
649
653
  try:
654
+ if knowledge_read_only_from_env():
655
+ logger.warning(
656
+ "MONKEYBOT_KNOWLEDGE_READ_ONLY is set but ignored here: the gateway "
657
+ "process is the sole writer per workspace and always opens the "
658
+ "knowledge index read-write. Set it on subagent/harness-as-library "
659
+ "clients instead."
660
+ )
650
661
  layout = AgentLayout.from_environment()
651
662
  settings = resolve_knowledge_settings(workspace_root=layout.workspace_root)
652
663
  knowledge = await KnowledgeSubsystem.create(
@@ -654,6 +665,7 @@ async def _startup(fastapi_app: FastAPI) -> None:
654
665
  settings=settings,
655
666
  knowledge_root=Path(settings.knowledge_root),
656
667
  index_path=Path(settings.index_path),
668
+ read_only=False,
657
669
  )
658
670
  hook_mgr = _deps.hook_manager
659
671
  if hook_mgr is None:
@@ -5,18 +5,24 @@ Ollama exposes an OpenAI-compatible endpoint at ``/v1`` on top of its native
5
5
  API, so this adapter reuses the same request/response plumbing as
6
6
  ``OpenAIProvider`` and ``HuggingFaceProvider``.
7
7
 
8
+ YAML ``model.provider``:
9
+
10
+ - ``ollama-cloud`` — always ``https://ollama.com``. Ignores a leftover local
11
+ ``OLLAMA_BASE_URL``. Requires ``OLLAMA_API_KEY``.
12
+ - ``ollama-local`` — always the local/self-hosted host. Ignores a cloud URL.
13
+ - ``ollama`` — legacy auto-route: a key with no URL means cloud; an explicit
14
+ URL always wins (including ``http://127.0.0.1:11434``).
15
+
8
16
  Configuration (environment variables or ``monkeybot.yaml``):
9
17
 
10
- - ``OLLAMA_BASE_URL`` — OpenAI-compat base host. Defaults to
11
- ``http://localhost:11434`` when no API key is set, or ``https://ollama.com``
12
- when ``OLLAMA_API_KEY`` is set and this is blank. ``/v1`` is appended when
13
- missing.
18
+ - ``OLLAMA_BASE_URL`` — OpenAI-compat base host. Used by ``ollama-local`` and
19
+ legacy ``ollama``. Ignored by ``ollama-cloud`` unless it already points at
20
+ ollama.com. ``/v1`` is appended when missing.
14
21
  - ``OLLAMA_API_KEY`` — required for Ollama Cloud (ollama.com/settings/keys).
15
22
  Local Ollama ignores it; the OpenAI SDK still needs a non-empty string, so a
16
- dummy is used when unset. Set ``OLLAMA_BASE_URL`` explicitly if a local
17
- reverse proxy enforces auth.
23
+ dummy is used when unset.
18
24
  - ``MODEL_NAME`` — model id passed to the API (e.g. ``llama3.1``, ``qwen2.5``,
19
- or a cloud id such as ``gpt-oss:120b``). Local models must already be pulled
25
+ or a cloud id such as ``glm-5.3-flash``). Local models must already be pulled
20
26
  (``ollama pull <model>``).
21
27
  - ``MODEL_TEMPERATURE`` — sampling temperature (default: ``0.7``; set via ``monkeybot.yaml`` / constructor)
22
28
  - ``MODEL_MAX_TOKENS`` — max output tokens (default: ``60000``; set via ``monkeybot.yaml`` / constructor)
@@ -35,6 +41,8 @@ from __future__ import annotations
35
41
  import logging
36
42
  import os
37
43
  from collections.abc import AsyncIterator, Sequence
44
+ from typing import Literal
45
+ from urllib.parse import urlparse
38
46
 
39
47
  from monkeybot.core.llm.provider import (
40
48
  Message,
@@ -48,26 +56,81 @@ from monkeybot.providers._openai_compat import (
48
56
  )
49
57
  from monkeybot.providers.sampling import resolve_model_sampling
50
58
 
59
+ OllamaMode = Literal["auto", "cloud", "local"]
60
+
51
61
  _DEFAULT_LOCAL_URL = "http://localhost:11434"
52
62
  _DEFAULT_CLOUD_URL = "https://ollama.com"
53
63
  _DUMMY_API_KEY = "ollama"
54
64
  _log = logging.getLogger(__name__)
55
65
 
56
66
 
57
- def _resolve_host_and_key() -> tuple[str, str]:
58
- """Pick local vs cloud host from env.
67
+ def _is_cloud_host(url: str) -> bool:
68
+ host = urlparse(url if "://" in url else f"https://{url}").hostname or ""
69
+ host = host.lower()
70
+ return host == "ollama.com" or host.endswith(".ollama.com")
71
+
72
+
73
+ def _normalize_cloud_base(url: str) -> str:
74
+ """Return a usable https URL for an Ollama Cloud host.
75
+
76
+ Scheme-less values get ``https://``. Plaintext ``http://`` is upgraded so
77
+ the API key never travels in the clear.
78
+ """
79
+ if "://" not in url:
80
+ return f"https://{url}"
81
+ parsed = urlparse(url)
82
+ if parsed.scheme == "http":
83
+ upgraded = parsed._replace(scheme="https").geturl()
84
+ _log.warning(
85
+ "ollama-cloud upgrading plaintext OLLAMA_BASE_URL %s",
86
+ kv(ignored=url, host=upgraded),
87
+ )
88
+ return upgraded
89
+ return url
59
90
 
60
- A key without a URL means Ollama Cloud. A URL always wins, so a reverse
61
- proxy in front of local Ollama can still authenticate by setting both.
91
+
92
+ def _resolve_host_and_key(mode: OllamaMode = "auto") -> tuple[str, str]:
93
+ """Pick local vs cloud host from env and provider mode.
94
+
95
+ ``cloud`` ignores a leftover localhost URL so a prior local-runtime persist
96
+ cannot steal cloud traffic. ``local`` ignores a cloud URL and never forwards
97
+ ``OLLAMA_API_KEY`` (an authenticating reverse proxy uses legacy ``ollama``
98
+ plus an explicit URL). ``auto`` keeps the legacy rule: an explicit URL
99
+ always wins.
62
100
  """
63
101
  api_key = (os.environ.get("OLLAMA_API_KEY") or "").strip()
64
102
  base = (os.environ.get("OLLAMA_BASE_URL") or "").strip().rstrip("/")
103
+ if mode == "cloud":
104
+ if not api_key:
105
+ raise ValueError(
106
+ "OLLAMA_API_KEY is not set. Create a key at "
107
+ "https://ollama.com/settings/keys and add it to your .env or "
108
+ "environment (required for model.provider ollama-cloud)."
109
+ )
110
+ if base and _is_cloud_host(base):
111
+ return _normalize_cloud_base(base), api_key
112
+ if base:
113
+ _log.warning(
114
+ "ollama-cloud ignoring non-cloud OLLAMA_BASE_URL %s",
115
+ kv(ignored=base, host=_DEFAULT_CLOUD_URL),
116
+ )
117
+ return _DEFAULT_CLOUD_URL, api_key
118
+ if mode == "local":
119
+ if base and not _is_cloud_host(base):
120
+ return base, _DUMMY_API_KEY
121
+ if base:
122
+ _log.warning(
123
+ "ollama-local ignoring cloud OLLAMA_BASE_URL %s",
124
+ kv(ignored=base, host=_DEFAULT_LOCAL_URL),
125
+ )
126
+ return _DEFAULT_LOCAL_URL, _DUMMY_API_KEY
65
127
  if base:
66
128
  return base, api_key or _DUMMY_API_KEY
67
129
  if api_key:
68
130
  _log.warning(
69
131
  "OLLAMA_API_KEY set with no OLLAMA_BASE_URL; using Ollama Cloud %s "
70
- "(set OLLAMA_BASE_URL explicitly for a local reverse proxy)",
132
+ "(set model.provider to ollama-local, or OLLAMA_BASE_URL, for a "
133
+ "local reverse proxy)",
71
134
  kv(host=_DEFAULT_CLOUD_URL),
72
135
  )
73
136
  return _DEFAULT_CLOUD_URL, api_key
@@ -106,6 +169,10 @@ class OllamaProvider:
106
169
 
107
170
  @property
108
171
  def name(self) -> str:
172
+ if self._mode == "cloud":
173
+ return "ollama-cloud"
174
+ if self._mode == "local":
175
+ return "ollama-local"
109
176
  return "ollama"
110
177
 
111
178
  @property
@@ -115,11 +182,14 @@ class OllamaProvider:
115
182
  def __init__(
116
183
  self,
117
184
  *,
185
+ mode: OllamaMode = "auto",
118
186
  temperature: float | None = None,
119
187
  max_tokens: int | None = None,
120
188
  thinking_budget: int | None = None,
121
189
  ) -> None:
122
- self._base_url, self._api_key = _resolve_host_and_key()
190
+ self._mode = mode
191
+ self._base_url, self._api_key = _resolve_host_and_key(mode)
192
+ _log.info("ollama host resolved %s", kv(mode=self._mode, host=self._base_url))
123
193
  sampling = resolve_model_sampling(temperature=temperature, max_tokens=max_tokens)
124
194
  self._temperature = sampling.temperature
125
195
  self._max_tokens = sampling.max_tokens
@@ -133,8 +203,8 @@ class OllamaProvider:
133
203
  """Return the OpenAI-compat base URL for ``model``.
134
204
 
135
205
  ``OLLAMA_BASE_URL`` is used as-is when it already ends in ``/v1``;
136
- otherwise ``/v1`` is appended. Defaults to local Ollama, or Ollama
137
- Cloud when ``OLLAMA_API_KEY`` is set and the URL is blank.
206
+ otherwise ``/v1`` is appended. Host selection is mode-driven
207
+ (``ollama-cloud`` / ``ollama-local`` / legacy ``ollama``).
138
208
  """
139
209
  del model # model id is passed per request; base URL is env-driven
140
210
  host = self._base_url
@@ -170,7 +240,7 @@ class OllamaProvider:
170
240
  async for event in stream_chat_completions_with_tool_fallback(
171
241
  base_url=self._resolve_base_url(model),
172
242
  api_key=self._api_key,
173
- provider="ollama",
243
+ provider=self.name,
174
244
  messages=messages,
175
245
  tools=tools,
176
246
  model=model,
@@ -129,6 +129,28 @@ class TestVertexAnthropicProvider:
129
129
  assert cfg.provider.name == "ollama"
130
130
  assert cfg.model == "llama3.1"
131
131
 
132
+ def test_get_provider_config_ollama_cloud(self, monkeypatch: pytest.MonkeyPatch) -> None:
133
+ monkeypatch.setenv("OLLAMA_API_KEY", "cloud-key")
134
+ monkeypatch.setenv("OLLAMA_BASE_URL", "http://127.0.0.1:11434")
135
+ cfg = get_provider_config(provider="ollama-cloud", model_name="glm-5.3-flash")
136
+ assert cfg.provider.name == "ollama-cloud"
137
+ assert cfg.model == "glm-5.3-flash"
138
+ assert cfg.provider._resolve_base_url("glm-5.3-flash") == "https://ollama.com/v1"
139
+
140
+ def test_get_provider_config_ollama_local(self, monkeypatch: pytest.MonkeyPatch) -> None:
141
+ monkeypatch.delenv("OLLAMA_BASE_URL", raising=False)
142
+ cfg = get_provider_config(provider="ollama-local", model_name="llama3.1")
143
+ assert cfg.provider.name == "ollama-local"
144
+ assert cfg.model == "llama3.1"
145
+ assert cfg.provider._api_key == "ollama"
146
+
147
+ def test_get_provider_config_ollama_cloud_requires_key(
148
+ self, monkeypatch: pytest.MonkeyPatch
149
+ ) -> None:
150
+ monkeypatch.delenv("OLLAMA_API_KEY", raising=False)
151
+ with pytest.raises(ValueError, match="OLLAMA_API_KEY is not set"):
152
+ get_provider_config(provider="ollama-cloud", model_name="glm-5.3-flash")
153
+
132
154
  def test_get_provider_config_vertex_anthropic_happy_path(self, monkeypatch: pytest.MonkeyPatch) -> None:
133
155
  monkeypatch.setenv("GCP_PROJECT_ID", "test-project")
134
156
  monkeypatch.setenv("ANTHROPIC_VERTEX_REGION", "us-central1")