monkeybot 3.4.0__tar.gz → 3.6.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 (769) hide show
  1. {monkeybot-3.4.0 → monkeybot-3.6.0}/CHANGELOG.md +53 -1
  2. {monkeybot-3.4.0 → monkeybot-3.6.0}/PKG-INFO +2 -1
  3. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/pyproject.toml +1 -1
  4. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/chat_session.py +36 -1
  5. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold.py +12 -3
  6. monkeybot-3.6.0/cli/src/monkeybot_cli/scaffold_defaults/goal/SKILL.md +31 -0
  7. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/monkeybot.example.yaml +11 -0
  8. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_scaffold.py +8 -1
  9. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/features.md +4 -2
  10. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/sse-gateway-ui.md +2 -1
  11. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/verifier-agent-design.md +14 -11
  12. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/pyproject.toml +1 -1
  13. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/tab_ops.py +22 -0
  14. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_tabs.py +21 -0
  15. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/uv.lock +1 -1
  16. {monkeybot-3.4.0 → monkeybot-3.6.0}/pyproject.toml +4 -1
  17. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/computer/safety.py +138 -16
  18. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/computer/tools.py +15 -8
  19. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/attachments/config.py +10 -0
  20. monkeybot-3.6.0/src/monkeybot/core/attachments/image_preview.py +126 -0
  21. monkeybot-3.6.0/src/monkeybot/core/attachments/resolve.py +156 -0
  22. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/attachments/store.py +0 -7
  23. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/config/runtime_env.py +2 -0
  24. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/config/settings.py +82 -21
  25. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/config/snapshot.py +2 -0
  26. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/context/__init__.py +68 -0
  27. monkeybot-3.6.0/src/monkeybot/core/context/slash_skills.py +54 -0
  28. monkeybot-3.6.0/src/monkeybot/core/goals/__init__.py +15 -0
  29. monkeybot-3.6.0/src/monkeybot/core/goals/service.py +242 -0
  30. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/captions.py +8 -4
  31. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/backends.py +11 -0
  32. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/firestore.indexes.json +8 -0
  33. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/firestore_scheduled_loops.py +179 -80
  34. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/postgres.py +154 -52
  35. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/scheduled_loops.py +283 -56
  36. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/sqlite.py +59 -1
  37. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/prompts/harness_prompt.py +1 -0
  38. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/prompts/headings.py +2 -0
  39. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/events.py +125 -17
  40. monkeybot-3.6.0/src/monkeybot/core/runtime/input_admission.py +305 -0
  41. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/loop.py +32 -21
  42. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/loop_messages.py +10 -9
  43. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/realtime_loop.py +9 -2
  44. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/tool_dispatch.py +35 -16
  45. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/turn_loop.py +54 -37
  46. monkeybot-3.6.0/src/monkeybot/core/tools/ask_user.py +75 -0
  47. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/core_tool_executor.py +176 -12
  48. monkeybot-3.6.0/src/monkeybot/core/verifier/actuator.py +89 -0
  49. monkeybot-3.6.0/src/monkeybot/core/verifier/binding.py +81 -0
  50. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/verifier/classify.py +89 -27
  51. monkeybot-3.6.0/src/monkeybot/core/verifier/intervention.py +54 -0
  52. monkeybot-3.6.0/src/monkeybot/core/verifier/judge.py +572 -0
  53. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/verifier/ledger.py +92 -23
  54. monkeybot-3.6.0/src/monkeybot/core/verifier/mailbox.py +551 -0
  55. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/verifier/port.py +6 -2
  56. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/verifier/tracker.py +60 -8
  57. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime/app.py +1 -0
  58. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime/deps.py +3 -0
  59. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime/routes.py +7 -0
  60. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/app.py +183 -68
  61. monkeybot-3.6.0/src/monkeybot/gateway/sse/goal_routes.py +75 -0
  62. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/models.py +11 -1
  63. monkeybot-3.6.0/src/monkeybot/gateway/sse/request_storage.py +23 -0
  64. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/routes.py +174 -2
  65. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/scheduler_routes.py +35 -18
  66. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/providers/_openai_compat.py +274 -1
  67. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/providers/bedrock.py +10 -1
  68. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/providers/claude.py +8 -0
  69. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/providers/gemini.py +8 -0
  70. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/providers/huggingface.py +8 -1
  71. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/providers/nvidia.py +8 -1
  72. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/providers/ollama.py +20 -1
  73. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/providers/openai.py +26 -2
  74. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/providers/openrouter.py +8 -1
  75. monkeybot-3.6.0/src/monkeybot/providers/request_budget.py +238 -0
  76. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/providers/vertex_claude.py +9 -3
  77. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/scheduler/engine.py +20 -5
  78. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/computer/test_computer_tools.py +39 -0
  79. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/computer/test_path_policy.py +140 -1
  80. monkeybot-3.6.0/tests/core/test_ask_user.py +61 -0
  81. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_attachment_store.py +14 -0
  82. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_config_extensions.py +74 -0
  83. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_context.py +3 -0
  84. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_core_tool_executor.py +74 -0
  85. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_events.py +59 -0
  86. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_firestore_scheduled_loops.py +177 -6
  87. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_goal_ledger.py +152 -2
  88. monkeybot-3.6.0/tests/core/test_goal_persistence.py +494 -0
  89. monkeybot-3.6.0/tests/core/test_goals.py +464 -0
  90. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_harness_prompt.py +2 -0
  91. monkeybot-3.6.0/tests/core/test_image_preview.py +169 -0
  92. monkeybot-3.6.0/tests/core/test_input_admission.py +922 -0
  93. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_knowledge_media.py +43 -4
  94. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_loop.py +135 -3
  95. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_loop_hooks.py +5 -0
  96. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_progress_tracker.py +90 -32
  97. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_runtime_config_snapshot.py +40 -0
  98. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_scheduled_loops.py +87 -0
  99. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_slash_skills.py +11 -2
  100. monkeybot-3.6.0/tests/core/test_verifier_binding.py +62 -0
  101. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_verifier_inspector.py +10 -4
  102. monkeybot-3.6.0/tests/core/test_verifier_judge.py +673 -0
  103. monkeybot-3.6.0/tests/core/test_verifier_mailbox_lifecycle.py +348 -0
  104. monkeybot-3.6.0/tests/core/test_verifier_sticky_nudge.py +466 -0
  105. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/realtime/test_deps.py +2 -0
  106. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/sse/test_attachments.py +28 -0
  107. monkeybot-3.6.0/tests/gateway/sse/test_gateway_runtime.py +817 -0
  108. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/sse/test_scheduler_routes.py +1 -0
  109. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/test_sse_events.py +17 -0
  110. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/providers/test_anthropic_cache.py +2 -0
  111. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/providers/test_ollama.py +26 -0
  112. monkeybot-3.6.0/tests/providers/test_openai_byte_budget.py +415 -0
  113. monkeybot-3.6.0/tests/providers/test_request_budget.py +204 -0
  114. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/scheduler/test_engine.py +56 -2
  115. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/test_packaging_config.py +1 -0
  116. {monkeybot-3.4.0 → monkeybot-3.6.0}/uv.lock +7 -4
  117. monkeybot-3.4.0/src/monkeybot/core/attachments/resolve.py +0 -70
  118. monkeybot-3.4.0/src/monkeybot/core/context/slash_skills.py +0 -29
  119. monkeybot-3.4.0/src/monkeybot/core/runtime/input_admission.py +0 -170
  120. monkeybot-3.4.0/src/monkeybot/core/verifier/actuator.py +0 -39
  121. monkeybot-3.4.0/src/monkeybot/core/verifier/judge.py +0 -187
  122. monkeybot-3.4.0/src/monkeybot/core/verifier/mailbox.py +0 -107
  123. monkeybot-3.4.0/tests/core/test_input_admission.py +0 -404
  124. monkeybot-3.4.0/tests/core/test_verifier_judge.py +0 -260
  125. monkeybot-3.4.0/tests/gateway/sse/test_gateway_runtime.py +0 -101
  126. {monkeybot-3.4.0 → monkeybot-3.6.0}/.dockerignore +0 -0
  127. {monkeybot-3.4.0 → monkeybot-3.6.0}/.github/workflows/ci.yml +0 -0
  128. {monkeybot-3.4.0 → monkeybot-3.6.0}/.github/workflows/live-eval-smoke.yml +0 -0
  129. {monkeybot-3.4.0 → monkeybot-3.6.0}/.github/workflows/prepare-release.yml +0 -0
  130. {monkeybot-3.4.0 → monkeybot-3.6.0}/.github/workflows/publish-release.yml +0 -0
  131. {monkeybot-3.4.0 → monkeybot-3.6.0}/.gitignore +0 -0
  132. {monkeybot-3.4.0 → monkeybot-3.6.0}/.pre-commit-config.yaml +0 -0
  133. {monkeybot-3.4.0 → monkeybot-3.6.0}/BACKLOG.md +0 -0
  134. {monkeybot-3.4.0 → monkeybot-3.6.0}/CONTRIBUTING.md +0 -0
  135. {monkeybot-3.4.0 → monkeybot-3.6.0}/LICENSE +0 -0
  136. {monkeybot-3.4.0 → monkeybot-3.6.0}/README.md +0 -0
  137. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/skills/monkeybot/SKILL.md +0 -0
  138. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/skills/monkeybot/references/config-sections.md +0 -0
  139. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/__init__.py +0 -0
  140. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/chat_file_index.py +0 -0
  141. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/chat_local_shell.py +0 -0
  142. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/chat_renderer.py +0 -0
  143. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/chat_status_bar.py +0 -0
  144. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/chat_theme.py +0 -0
  145. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/chat_tool_display.py +0 -0
  146. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/chat_tui.py +0 -0
  147. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/chat_tui_widgets.py +0 -0
  148. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/commands/__init__.py +0 -0
  149. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/commands/chat.py +0 -0
  150. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/commands/doctor.py +0 -0
  151. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/commands/loop.py +0 -0
  152. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/commands/new.py +0 -0
  153. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/commands/refresh.py +0 -0
  154. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/commands/run_cmd.py +0 -0
  155. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/commands/talk.py +0 -0
  156. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/commands/validate.py +0 -0
  157. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/compat.py +0 -0
  158. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/config_resolve.py +0 -0
  159. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/exit_commands.py +0 -0
  160. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/extras_catalog.py +0 -0
  161. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/gateway_health.py +0 -0
  162. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/main.py +0 -0
  163. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/opensandbox_lifecycle.py +0 -0
  164. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/output.py +0 -0
  165. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/process_tree.py +0 -0
  166. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/providers.py +0 -0
  167. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/realtime/__init__.py +0 -0
  168. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/realtime/audio_io.py +0 -0
  169. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/realtime/client.py +0 -0
  170. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/realtime/gateway_manager.py +0 -0
  171. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/realtime/push_to_talk.py +0 -0
  172. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/realtime/session.py +0 -0
  173. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/realtime/session_controller.py +0 -0
  174. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/realtime/talk_ui.py +0 -0
  175. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/realtime/wire_encode.py +0 -0
  176. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/runtime_python.py +0 -0
  177. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/AGENT.md +0 -0
  178. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/Dockerfile +0 -0
  179. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/__init__.py +0 -0
  180. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/browser/SKILL.md +0 -0
  181. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/command_allowlist.yaml +0 -0
  182. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/dockerignore +0 -0
  183. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/env.example +0 -0
  184. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/image-generator/SKILL.md +0 -0
  185. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/image-generator/generate_image.py +0 -0
  186. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/loop/SKILL.md +0 -0
  187. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/mcp.json +0 -0
  188. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/opensandbox.docker.toml +0 -0
  189. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/otel-collector.example.yaml +0 -0
  190. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/permissions.yaml +0 -0
  191. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/session_controller.py +0 -0
  192. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/terminal_markdown.py +0 -0
  193. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_chat_continue.py +0 -0
  194. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_chat_e2e.py +0 -0
  195. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_chat_errors.py +0 -0
  196. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_chat_file_index.py +0 -0
  197. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_chat_grounding.py +0 -0
  198. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_chat_local_shell.py +0 -0
  199. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_chat_renderer_parity.py +0 -0
  200. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_chat_session.py +0 -0
  201. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_chat_status_bar.py +0 -0
  202. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_chat_theme.py +0 -0
  203. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_chat_tool_display.py +0 -0
  204. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_chat_tui.py +0 -0
  205. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_cli.py +0 -0
  206. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_config_resolve.py +0 -0
  207. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_doctor.py +0 -0
  208. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_extras_catalog.py +0 -0
  209. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_gateway_health.py +0 -0
  210. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_opensandbox_lifecycle.py +0 -0
  211. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_realtime_session_controller.py +0 -0
  212. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_run_cmd.py +0 -0
  213. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_runtime_python.py +0 -0
  214. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/tests/test_terminal_markdown.py +0 -0
  215. {monkeybot-3.4.0 → monkeybot-3.6.0}/cli/uv.lock +0 -0
  216. {monkeybot-3.4.0 → monkeybot-3.6.0}/docker/Dockerfile +0 -0
  217. {monkeybot-3.4.0 → monkeybot-3.6.0}/docker/demo-model.yaml +0 -0
  218. {monkeybot-3.4.0 → monkeybot-3.6.0}/docker/demo.yaml +0 -0
  219. {monkeybot-3.4.0 → monkeybot-3.6.0}/docker/docker-compose.sandbox.yml +0 -0
  220. {monkeybot-3.4.0 → monkeybot-3.6.0}/docker/opensandbox.docker.toml +0 -0
  221. {monkeybot-3.4.0 → monkeybot-3.6.0}/docker/sandbox.Dockerfile +0 -0
  222. {monkeybot-3.4.0 → monkeybot-3.6.0}/docker-compose.yml +0 -0
  223. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/agent-layout.md +0 -0
  224. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/assets/logo.png +0 -0
  225. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/browser-mcp-perf-baseline.md +0 -0
  226. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/browser-mcp-performance-plan.md +0 -0
  227. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/browser-mcp.md +0 -0
  228. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/cloud-deployment-design.md +0 -0
  229. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/deploy-aws-agentcore.md +0 -0
  230. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/deploy-pattern-a-container.md +0 -0
  231. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/deploy-pattern-b-serverless.md +0 -0
  232. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/deploy-pattern-c-agent-platform.md +0 -0
  233. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/deploy-pattern-d-realtime.md +0 -0
  234. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/getting-started.md +0 -0
  235. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/knowledge-layer-fixes.md +0 -0
  236. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/live-evals.md +0 -0
  237. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/mcp.md +0 -0
  238. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/memory-graph-split-plan.md +0 -0
  239. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/migrations/agent-scope-namespacing.md +0 -0
  240. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/migrations/memory-outbox.sql +0 -0
  241. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/observability-runbook.md +0 -0
  242. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/ollama-local.md +0 -0
  243. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/otel-collector.example.yaml +0 -0
  244. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/progressive-loop-tools.md +0 -0
  245. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/progressive-mcp-tools.md +0 -0
  246. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/skills.md +0 -0
  247. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/spill-dynamic-design.md +0 -0
  248. {monkeybot-3.4.0 → monkeybot-3.6.0}/docs/workspace-index-design.md +0 -0
  249. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/TEST_COVERAGE.md +0 -0
  250. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/assertions.py +0 -0
  251. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/baselines/smoke.json +0 -0
  252. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/baselines/smoke.md +0 -0
  253. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/diff.py +0 -0
  254. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/eval_config.yaml +0 -0
  255. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/models.py +0 -0
  256. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/persistence.py +0 -0
  257. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/report.py +0 -0
  258. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/runner.py +0 -0
  259. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/scenario_loader.py +0 -0
  260. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/scenarios/context/summarization_trigger.yaml +0 -0
  261. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/scenarios/drift/declares_done.yaml +0 -0
  262. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/scenarios/drift/path_constraint.yaml +0 -0
  263. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/scenarios/drift/preempt.yaml +0 -0
  264. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/scenarios/drift/repeat_correction.yaml +0 -0
  265. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/scenarios/drift/supersession.yaml +0 -0
  266. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/scenarios/mcp/get_prompt.yaml +0 -0
  267. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/scenarios/mcp/list_resources.yaml +0 -0
  268. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/scenarios/mcp/tool_invoke.yaml +0 -0
  269. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/scenarios/memory/recall_cross_session.yaml +0 -0
  270. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/scenarios/memory/recall_single_session.yaml +0 -0
  271. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/scenarios/multi_turn/task_tracking.yaml +0 -0
  272. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/scenarios/skills/skill_invocation.yaml +0 -0
  273. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/scenarios/subagents/dispatch_complete.yaml +0 -0
  274. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/scenarios/tools/core_read.yaml +0 -0
  275. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/scenarios/tools/core_read_error.yaml +0 -0
  276. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/scenarios/tools/core_run_command.yaml +0 -0
  277. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/scenarios/tools/core_run_command_sandbox.yaml +0 -0
  278. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/scenarios/tools/core_write.yaml +0 -0
  279. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/scorer.py +0 -0
  280. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/smoke_agent/.env.example +0 -0
  281. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/smoke_agent/.gitignore +0 -0
  282. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/smoke_agent/fixture_mcp_server.py +0 -0
  283. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/smoke_agent/monkeybot_config/AGENT.md +0 -0
  284. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/smoke_agent/monkeybot_config/command_allowlist.yaml +0 -0
  285. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/smoke_agent/monkeybot_config/mcp.json +0 -0
  286. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/smoke_agent/monkeybot_config/monkeybot.verifier-on.yaml +0 -0
  287. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/smoke_agent/monkeybot_config/monkeybot.yaml +0 -0
  288. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/smoke_agent/monkeybot_config/permissions.yaml +0 -0
  289. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/smoke_agent/pyproject.toml +0 -0
  290. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/smoke_agent/skills/browser/SKILL.md +0 -0
  291. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/smoke_agent/uv.lock +0 -0
  292. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/smoke_agent/workspace/.gitkeep +0 -0
  293. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/smoke_agent/workspace/skills/browser/playbooks/.gitkeep +0 -0
  294. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/suites/drift.yaml +0 -0
  295. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/suites/smoke.yaml +0 -0
  296. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/test_assertions.py +0 -0
  297. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/test_diff.py +0 -0
  298. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/test_judge.py +0 -0
  299. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/test_report.py +0 -0
  300. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/test_runner_sse.py +0 -0
  301. {monkeybot-3.4.0 → monkeybot-3.6.0}/evals/test_scorer.py +0 -0
  302. {monkeybot-3.4.0 → monkeybot-3.6.0}/examples/README.md +0 -0
  303. {monkeybot-3.4.0 → monkeybot-3.6.0}/examples/agentcore/handler.py +0 -0
  304. {monkeybot-3.4.0 → monkeybot-3.6.0}/examples/agentcore/runtime_app.py +0 -0
  305. {monkeybot-3.4.0 → monkeybot-3.6.0}/examples/agentengine/handler.py +0 -0
  306. {monkeybot-3.4.0 → monkeybot-3.6.0}/examples/cloud-functions/main.py +0 -0
  307. {monkeybot-3.4.0 → monkeybot-3.6.0}/examples/lambda/handler.py +0 -0
  308. {monkeybot-3.4.0 → monkeybot-3.6.0}/examples/ollama/PrefixStable.Modelfile +0 -0
  309. {monkeybot-3.4.0 → monkeybot-3.6.0}/examples/skills/browser/SKILL.md +0 -0
  310. {monkeybot-3.4.0 → monkeybot-3.6.0}/examples/skills/browser/playbooks/.gitkeep +0 -0
  311. {monkeybot-3.4.0 → monkeybot-3.6.0}/examples/skills/diagnostics/README.md +0 -0
  312. {monkeybot-3.4.0 → monkeybot-3.6.0}/examples/skills/diagnostics/SKILL.md +0 -0
  313. {monkeybot-3.4.0 → monkeybot-3.6.0}/examples/skills/diagnostics/__init__.py +0 -0
  314. {monkeybot-3.4.0 → monkeybot-3.6.0}/examples/skills/diagnostics/diagnostics.py +0 -0
  315. {monkeybot-3.4.0 → monkeybot-3.6.0}/examples/skills/image-generator/SKILL.md +0 -0
  316. {monkeybot-3.4.0 → monkeybot-3.6.0}/examples/skills/image-generator/generate_image.py +0 -0
  317. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/scripts/agentcore_smoke.py +0 -0
  318. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/scripts/dump_tool_surface.py +0 -0
  319. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/scripts/perf_bench.py +0 -0
  320. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/__init__.py +0 -0
  321. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/actions.py +0 -0
  322. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/agentcore.py +0 -0
  323. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/app.py +0 -0
  324. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/assets/NOTICE.md +0 -0
  325. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/assets/dom_tree.js +0 -0
  326. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/assets/pa_driver.js +0 -0
  327. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/backend.py +0 -0
  328. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/chat_scope.py +0 -0
  329. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/dom_indexing.py +0 -0
  330. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/in_app_cdp.py +0 -0
  331. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/login.py +0 -0
  332. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/observe.py +0 -0
  333. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/perf.py +0 -0
  334. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/playbooks.py +0 -0
  335. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/playwright_helpers.py +0 -0
  336. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/results.py +0 -0
  337. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/screenshots.py +0 -0
  338. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/server.py +0 -0
  339. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/tabs.py +0 -0
  340. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/tools/__init__.py +0 -0
  341. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/tools/batch.py +0 -0
  342. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/tools/capture.py +0 -0
  343. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/tools/interact.py +0 -0
  344. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/tools/navigate.py +0 -0
  345. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/tools/playbook.py +0 -0
  346. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/tools/read.py +0 -0
  347. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/tools/tab_control.py +0 -0
  348. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/fixtures/api.json +0 -0
  349. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/fixtures/article.html +0 -0
  350. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/fixtures/cards.html +0 -0
  351. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/fixtures/form.html +0 -0
  352. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/fixtures/long_list.html +0 -0
  353. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/fixtures/spa.html +0 -0
  354. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/fixtures/tool_surface.json +0 -0
  355. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/integration/conftest.py +0 -0
  356. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/integration/test_act_observe.py +0 -0
  357. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/integration/test_driver_persist.py +0 -0
  358. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/integration/test_intent_tools.py +0 -0
  359. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/integration/test_multi_tab.py +0 -0
  360. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/integration/test_observation.py +0 -0
  361. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/integration/test_run_playbook.py +0 -0
  362. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/integration/test_wait_for.py +0 -0
  363. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_act.py +0 -0
  364. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_agentcore.py +0 -0
  365. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_chat_scope.py +0 -0
  366. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_dom_indexing.py +0 -0
  367. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_fill_form.py +0 -0
  368. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_in_app_cdp.py +0 -0
  369. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_indexed_tools.py +0 -0
  370. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_observe.py +0 -0
  371. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_observe_after.py +0 -0
  372. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_perf.py +0 -0
  373. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_playbook_flows.py +0 -0
  374. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_playbooks.py +0 -0
  375. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_playwright_helpers.py +0 -0
  376. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_screenshots.py +0 -0
  377. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_server_shutdown.py +0 -0
  378. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_tool_surface.py +0 -0
  379. {monkeybot-3.4.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_wait_tools.py +0 -0
  380. {monkeybot-3.4.0 → monkeybot-3.6.0}/pytest.ini +0 -0
  381. {monkeybot-3.4.0 → monkeybot-3.6.0}/scripts/create_schema.py +0 -0
  382. {monkeybot-3.4.0 → monkeybot-3.6.0}/scripts/precommit-pytest.sh +0 -0
  383. {monkeybot-3.4.0 → monkeybot-3.6.0}/scripts/release.py +0 -0
  384. {monkeybot-3.4.0 → monkeybot-3.6.0}/scripts/smoke_global_cli.sh +0 -0
  385. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/__init__.py +0 -0
  386. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/cli/__init__.py +0 -0
  387. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/cli/__main__.py +0 -0
  388. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/cli/audio_io.py +0 -0
  389. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/cli/gateway_manager.py +0 -0
  390. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/cli/main.py +0 -0
  391. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/cli/push_to_talk.py +0 -0
  392. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/cli/realtime_client.py +0 -0
  393. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/computer/__init__.py +0 -0
  394. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/computer/approvals.py +0 -0
  395. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/computer/permissions.py +0 -0
  396. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/__init__.py +0 -0
  397. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/attachments/__init__.py +0 -0
  398. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/attachments/catalog.py +0 -0
  399. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/attachments/freeze.py +0 -0
  400. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/attachments/text.py +0 -0
  401. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/attachments/tools.py +0 -0
  402. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/bootstrap.py +0 -0
  403. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/config/__init__.py +0 -0
  404. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/config/realtime_config.py +0 -0
  405. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/config/validation.py +0 -0
  406. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/config/yaml_loader.py +0 -0
  407. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/context/campaign_context.py +0 -0
  408. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/context/common.py +0 -0
  409. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/context/epoch.py +0 -0
  410. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/context/secret_egress.py +0 -0
  411. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/context/tool_output_policy.py +0 -0
  412. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/context/tool_result_ingress.py +0 -0
  413. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/context/tool_shapers.py +0 -0
  414. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/hooks/__init__.py +0 -0
  415. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/__init__.py +0 -0
  416. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/chunking.py +0 -0
  417. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/config.py +0 -0
  418. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/embeddings/__init__.py +0 -0
  419. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/embeddings/base.py +0 -0
  420. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/embeddings/factory.py +0 -0
  421. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/embeddings/gemini.py +0 -0
  422. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/embeddings/nvidia.py +0 -0
  423. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/embeddings/openai_compat.py +0 -0
  424. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/embeddings/sanitize.py +0 -0
  425. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/evidence_guard.py +0 -0
  426. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/extractors.py +0 -0
  427. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/fusion.py +0 -0
  428. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/hook.py +0 -0
  429. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/indexer.py +0 -0
  430. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/links.py +0 -0
  431. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/salience.py +0 -0
  432. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/sqlite_index.py +0 -0
  433. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/subsystem.py +0 -0
  434. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/tool.py +0 -0
  435. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/types.py +0 -0
  436. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/layout.py +0 -0
  437. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/llm/__init__.py +0 -0
  438. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/llm/provider.py +0 -0
  439. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/llm/realtime_provider.py +0 -0
  440. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/llm/usage.py +0 -0
  441. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/lockfile_names.py +0 -0
  442. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/logging_utils.py +0 -0
  443. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/mcp/__init__.py +0 -0
  444. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/mcp/mcp_client.py +0 -0
  445. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/mcp/ports_mcp.py +0 -0
  446. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/__init__.py +0 -0
  447. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/config.py +0 -0
  448. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/hook.py +0 -0
  449. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/ids.py +0 -0
  450. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/ingest.py +0 -0
  451. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/migrate_layout.py +0 -0
  452. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/observability.py +0 -0
  453. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/outbox.py +0 -0
  454. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/palace.py +0 -0
  455. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/subsystem.py +0 -0
  456. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/uri.py +0 -0
  457. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/writer.py +0 -0
  458. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/messages/__init__.py +0 -0
  459. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/messages/convert_provider.py +0 -0
  460. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/messages/tool_integrity.py +0 -0
  461. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/messages/transform_context.py +0 -0
  462. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/path_safety.py +0 -0
  463. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/__init__.py +0 -0
  464. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/db.py +0 -0
  465. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/durable_runs.py +0 -0
  466. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/errors.py +0 -0
  467. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/firestore.py +0 -0
  468. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/goal_ledger.py +0 -0
  469. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/history.py +0 -0
  470. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/runs.py +0 -0
  471. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/session_turn_locks.py +0 -0
  472. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/sqlite_backend.py +0 -0
  473. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/sqlite_vector.py +0 -0
  474. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/thread_summary.py +0 -0
  475. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/transcript.py +0 -0
  476. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/usage.py +0 -0
  477. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/usage_buckets.py +0 -0
  478. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/prompts/__init__.py +0 -0
  479. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/prompts/prompt.py +0 -0
  480. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/__init__.py +0 -0
  481. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/context_budget.py +0 -0
  482. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/doom_loop.py +0 -0
  483. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/history_compaction.py +0 -0
  484. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/loop_hooks.py +0 -0
  485. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/loop_ports.py +0 -0
  486. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/loop_usage.py +0 -0
  487. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/provider_stream_mapper.py +0 -0
  488. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/tool_batch.py +0 -0
  489. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/utterance_buffer.py +0 -0
  490. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/subagents/__init__.py +0 -0
  491. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/subagents/progress_publish.py +0 -0
  492. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/subagents/subagent_proto.py +0 -0
  493. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/subagents/subagent_worker.py +0 -0
  494. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/subagents/worker_pool.py +0 -0
  495. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/subprocess_groups.py +0 -0
  496. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/testing/__init__.py +0 -0
  497. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/testing/mocks_provider.py +0 -0
  498. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/testing/mocks_realtime_provider.py +0 -0
  499. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/__init__.py +0 -0
  500. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/fs_isolation.py +0 -0
  501. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/grant_store.py +0 -0
  502. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/inspector.py +0 -0
  503. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/loop_inspector.py +0 -0
  504. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/patch.py +0 -0
  505. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/path_grant_inspector.py +0 -0
  506. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/permission.py +0 -0
  507. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/sandbox_executor.py +0 -0
  508. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/spill_inventory.py +0 -0
  509. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/terminal.py +0 -0
  510. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/text_normalize.py +0 -0
  511. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/tool_hint.py +0 -0
  512. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/tool_kind.py +0 -0
  513. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/types.py +0 -0
  514. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/workspace_service.py +0 -0
  515. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/types/__init__.py +0 -0
  516. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/types/content_blocks.py +0 -0
  517. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/types/interfaces.py +0 -0
  518. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/types/types_tools.py +0 -0
  519. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/verifier/__init__.py +0 -0
  520. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/verifier/inspector.py +0 -0
  521. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/verifier/match.py +0 -0
  522. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/verifier/severity.py +0 -0
  523. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/workspace/__init__.py +0 -0
  524. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/workspace/factory.py +0 -0
  525. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/workspace/gcs.py +0 -0
  526. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/workspace/local.py +0 -0
  527. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/workspace/protocol.py +0 -0
  528. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/workspace/s3.py +0 -0
  529. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/core/workspace_layout.py +0 -0
  530. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/__init__.py +0 -0
  531. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/bootstrap.py +0 -0
  532. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/main.py +0 -0
  533. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/pending_response_bus.py +0 -0
  534. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime/__init__.py +0 -0
  535. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime/errors.py +0 -0
  536. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime/guardrails.py +0 -0
  537. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime/manager.py +0 -0
  538. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime/metrics.py +0 -0
  539. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime/session.py +0 -0
  540. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime/wire.py +0 -0
  541. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime_main.py +0 -0
  542. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/__init__.py +0 -0
  543. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/loop_port.py +0 -0
  544. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/reload.py +0 -0
  545. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/reply_body.py +0 -0
  546. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/scheduler_wiring.py +0 -0
  547. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/session_bus.py +0 -0
  548. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/sse.py +0 -0
  549. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/workspace_layout.py +0 -0
  550. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/observability/__init__.py +0 -0
  551. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/observability/_state.py +0 -0
  552. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/observability/instrumentation.py +0 -0
  553. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/observability/propagation.py +0 -0
  554. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/observability/spans.py +0 -0
  555. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/observability/sqlite_exporter.py +0 -0
  556. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/providers/__init__.py +0 -0
  557. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/providers/_bedrock_converse.py +0 -0
  558. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/providers/_utils.py +0 -0
  559. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/providers/gemini_live.py +0 -0
  560. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/providers/model_capabilities.py +0 -0
  561. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/providers/pricing.py +0 -0
  562. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/providers/sampling.py +0 -0
  563. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/scaffold/__init__.py +0 -0
  564. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/scheduler/__init__.py +0 -0
  565. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/scheduler/__main__.py +0 -0
  566. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/scheduler/http_invoker.py +0 -0
  567. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/scheduler/interval.py +0 -0
  568. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/scheduler/tick_result.py +0 -0
  569. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/scheduler/worker.py +0 -0
  570. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/subagents/__init__.py +0 -0
  571. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/subagents/worker/__init__.py +0 -0
  572. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/subagents/worker/__main__.py +0 -0
  573. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/todo_list/__init__.py +0 -0
  574. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/todo_list/store.py +0 -0
  575. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/todo_list/tool.py +0 -0
  576. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/web_search/__init__.py +0 -0
  577. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/web_search/backends/__init__.py +0 -0
  578. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/web_search/backends/duckduckgo.py +0 -0
  579. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/web_search/backends/firecrawl.py +0 -0
  580. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/web_search/backends/tavily.py +0 -0
  581. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/web_search/protocol.py +0 -0
  582. {monkeybot-3.4.0 → monkeybot-3.6.0}/src/monkeybot/web_search/tool.py +0 -0
  583. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/__init__.py +0 -0
  584. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/acceptance/test_observability_acceptance.py +0 -0
  585. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/cli/__init__.py +0 -0
  586. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/cli/test_gateway_manager.py +0 -0
  587. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/cli/test_main.py +0 -0
  588. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/cli/test_push_to_talk.py +0 -0
  589. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/cli/test_realtime_client.py +0 -0
  590. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/computer/__init__.py +0 -0
  591. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/computer/test_approvals.py +0 -0
  592. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/computer/test_package_init.py +0 -0
  593. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/computer/test_permissions.py +0 -0
  594. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/computer/test_subagent_exclusion.py +0 -0
  595. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/computer/test_wiring.py +0 -0
  596. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/conftest.py +0 -0
  597. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/__init__.py +0 -0
  598. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/fixtures/bitbucket_dc_style_pr.diff +0 -0
  599. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/memory/helpers.py +0 -0
  600. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/memory/in_memory_palace.py +0 -0
  601. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/memory/test_mempalace.py +0 -0
  602. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/memory/test_review_fixes.py +0 -0
  603. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_agent_layout.py +0 -0
  604. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_attachment_freeze.py +0 -0
  605. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_bootstrap.py +0 -0
  606. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_content_blocks.py +0 -0
  607. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_context_budget.py +0 -0
  608. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_context_epoch.py +0 -0
  609. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_doom_loop.py +0 -0
  610. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_durable_events.py +0 -0
  611. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_durable_runs.py +0 -0
  612. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_empty_completion.py +0 -0
  613. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_env_map_grep_gates.py +0 -0
  614. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_evidence_guard.py +0 -0
  615. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_firestore_history.py +0 -0
  616. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_firestore_usage.py +0 -0
  617. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_fs_isolation.py +0 -0
  618. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_gemini_history_replay.py +0 -0
  619. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_grant_store.py +0 -0
  620. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_history.py +0 -0
  621. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_history_compaction_split.py +0 -0
  622. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_hooks.py +0 -0
  623. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_inspector.py +0 -0
  624. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_knowledge_chunking.py +0 -0
  625. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_knowledge_chunking_rank.py +0 -0
  626. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_knowledge_config.py +0 -0
  627. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_knowledge_embeddings.py +0 -0
  628. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_knowledge_fts.py +0 -0
  629. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_knowledge_fusion.py +0 -0
  630. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_knowledge_fusion_ann.py +0 -0
  631. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_knowledge_hook.py +0 -0
  632. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_knowledge_indexer.py +0 -0
  633. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_knowledge_links.py +0 -0
  634. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_knowledge_salience.py +0 -0
  635. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_knowledge_single_writer.py +0 -0
  636. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_knowledge_subsystem.py +0 -0
  637. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_knowledge_vectors.py +0 -0
  638. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_layout.py +0 -0
  639. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_logging_utils.py +0 -0
  640. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_loop_observability.py +0 -0
  641. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_loop_transcript.py +0 -0
  642. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_mcp_client.py +0 -0
  643. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_memory_layout_migrate.py +0 -0
  644. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_message_pipeline.py +0 -0
  645. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_mocks_realtime_provider.py +0 -0
  646. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_patch.py +0 -0
  647. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_path_grant_inspector.py +0 -0
  648. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_path_safety.py +0 -0
  649. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_permission.py +0 -0
  650. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_pricing.py +0 -0
  651. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_progress_publish.py +0 -0
  652. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_prompt.py +0 -0
  653. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_provider_contract.py +0 -0
  654. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_provider_stream_mapper.py +0 -0
  655. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_realtime_loop.py +0 -0
  656. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_replace_fuzzy.py +0 -0
  657. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_run_command_parse.py +0 -0
  658. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_runs.py +0 -0
  659. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_runtime_env.py +0 -0
  660. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_sandbox_executor.py +0 -0
  661. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_secret_egress.py +0 -0
  662. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_session_turn_locks.py +0 -0
  663. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_settlement.py +0 -0
  664. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_spill_dynamic.py +0 -0
  665. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_spill_inventory.py +0 -0
  666. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_storage_backends.py +0 -0
  667. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_subagent_proto.py +0 -0
  668. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_subagent_trace_propagation.py +0 -0
  669. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_subagent_worker_paths.py +0 -0
  670. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_terminal.py +0 -0
  671. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_thread_summary_wire.py +0 -0
  672. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_tool_def_schema.py +0 -0
  673. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_tool_integrity.py +0 -0
  674. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_tool_result_ingress.py +0 -0
  675. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_tool_shapers.py +0 -0
  676. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_transcript.py +0 -0
  677. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_truncated_tool_batch.py +0 -0
  678. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_usage.py +0 -0
  679. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_usage_migration.py +0 -0
  680. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_utterance_buffer.py +0 -0
  681. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_worker_pool.py +0 -0
  682. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_workspace_extra_read_roots.py +0 -0
  683. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_workspace_layout.py +0 -0
  684. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_workspace_symlinks.py +0 -0
  685. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/test_workspace_write_scope.py +0 -0
  686. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/workspace/test_factory.py +0 -0
  687. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/workspace/test_local_storage.py +0 -0
  688. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/core/workspace/test_protocol_contract.py +0 -0
  689. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/evals/__init__.py +0 -0
  690. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/evals/eval_hook.py +0 -0
  691. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/evals/scenario_runner.py +0 -0
  692. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/evals/scenarios/memory_wake_up_large.yaml +0 -0
  693. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/evals/scenarios/memory_write_inject.yaml +0 -0
  694. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/evals/scenarios/subagent_roundtrip.yaml +0 -0
  695. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_glob_grep.yaml +0 -0
  696. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_load_file.yaml +0 -0
  697. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_loops.yaml +0 -0
  698. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_read.yaml +0 -0
  699. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_replace_apply_patch.yaml +0 -0
  700. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_run_command.yaml +0 -0
  701. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_search_knowledge.yaml +0 -0
  702. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_search_memory.yaml +0 -0
  703. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_todo_list.yaml +0 -0
  704. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_web_search.yaml +0 -0
  705. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_write.yaml +0 -0
  706. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/evals/scenarios/turn_completion.yaml +0 -0
  707. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/evals/test_agent_behavior.py +0 -0
  708. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/evals/test_memory_knowledge_routing.py +0 -0
  709. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/evals/test_verifier_port.py +0 -0
  710. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/__init__.py +0 -0
  711. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/realtime/__init__.py +0 -0
  712. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/realtime/test_app.py +0 -0
  713. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/realtime/test_guardrails.py +0 -0
  714. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/realtime/test_manager.py +0 -0
  715. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/realtime/test_metrics.py +0 -0
  716. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/realtime/test_routes_client_text.py +0 -0
  717. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/realtime/test_session.py +0 -0
  718. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/realtime/test_wire.py +0 -0
  719. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/sse/test_config_reload.py +0 -0
  720. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/sse/test_create_session_model.py +0 -0
  721. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/sse/test_routes.py +0 -0
  722. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/sse/test_session_bus.py +0 -0
  723. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/sse/test_transcript_wiring.py +0 -0
  724. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/test_otel_fastapi.py +0 -0
  725. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/test_otel_lifespan.py +0 -0
  726. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/test_pending_response_endpoints.py +0 -0
  727. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/test_realtime_main.py +0 -0
  728. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/test_resolve_provider.py +0 -0
  729. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/gateway/test_subagent_event_publisher.py +0 -0
  730. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/integration/__init__.py +0 -0
  731. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/integration/test_mb_e2e_simple_reply.py +0 -0
  732. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/integration/test_observability_integration.py +0 -0
  733. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/integration/test_prompt_caching_integration.py +0 -0
  734. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/observability/conftest.py +0 -0
  735. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/observability/test_init.py +0 -0
  736. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/observability/test_instrumentation.py +0 -0
  737. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/observability/test_loop_hook_spans.py +0 -0
  738. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/observability/test_propagation.py +0 -0
  739. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/observability/test_span_contract.py +0 -0
  740. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/observability/test_spans.py +0 -0
  741. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/observability/test_sqlite_exporter.py +0 -0
  742. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/observability/test_truncate.py +0 -0
  743. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/observability/test_turn_complete_trace.py +0 -0
  744. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/providers/conftest.py +0 -0
  745. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/providers/test_anthropic_history.py +0 -0
  746. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/providers/test_bedrock_converse.py +0 -0
  747. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/providers/test_bedrock_estimate.py +0 -0
  748. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/providers/test_gemini_history.py +0 -0
  749. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/providers/test_gemini_live.py +0 -0
  750. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/providers/test_gemini_usage.py +0 -0
  751. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/providers/test_huggingface.py +0 -0
  752. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/providers/test_model_capabilities.py +0 -0
  753. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/providers/test_nvidia.py +0 -0
  754. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/providers/test_openai_compat_usage.py +0 -0
  755. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/providers/test_openai_history.py +0 -0
  756. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/providers/test_pricing.py +0 -0
  757. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/providers/test_safe_parse_tool_args.py +0 -0
  758. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/providers/test_sampling.py +0 -0
  759. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/providers/test_sonnet5_sampling.py +0 -0
  760. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/providers/test_source_grep_gates.py +0 -0
  761. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/providers/test_vertex_claude_history.py +0 -0
  762. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/scheduler/test_interval.py +0 -0
  763. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/skills/__init__.py +0 -0
  764. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/skills/test_generate_image_script.py +0 -0
  765. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/test_cold_start.py +0 -0
  766. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/test_release_script.py +0 -0
  767. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/todo_list/test_todo_list.py +0 -0
  768. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/web_search/__init__.py +0 -0
  769. {monkeybot-3.4.0 → monkeybot-3.6.0}/tests/web_search/test_web_search.py +0 -0
@@ -6,7 +6,59 @@ the project adheres to [Semantic Versioning](https://semver.org/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
- ### Browser MCP
9
+ ### CLI
10
+
11
+ #### Added
12
+
13
+ - `monkeybot chat` prompts for an `ask_user` question and posts the reply to the gateway.
14
+
15
+ ## [core v3.6.0] - 2026-09-21
16
+
17
+ #### Added
18
+
19
+ - `ask_user` asks the user a question, with an optional list of two to six choices, and waits for the posted answer before the tool returns.
20
+
21
+ ## [core v3.5.0] - 2026-09-20
22
+
23
+ ### Added
24
+
25
+ - Native durable goals beside scheduled loops (`create_goal` / `update_goal`, plus `/goals` pause/resume/stop). Continuations are scheduled automatically until the goal completes or is stopped.
26
+ - `FileBlock` SSE for generated documents (path/filename/mime — clients load from disk). Workspace open/export stays inside the workspace and still denies nested credential directories.
27
+ - HTML (`text/html`) uploads for Files preview, and `text/plain` attachments inlined at resolve.
28
+ - Promote a queued follow-up into the live turn (`POST /sessions/{id}/queue/{request_id}/steer`) or drop it (`DELETE`) so it never drains.
29
+ - Verifier: request-scoped mailbox, sticky nudge until the tracker recovers, nudge armed on judge deposit, concurrent session-bound `ProviderJudge` jobs with scoped budgets and fencing, and staged reload so live workers stay intact.
30
+
31
+ ### Changed
32
+
33
+ - `verifier.enabled: true` turns on omitted nested `ledger` / `tracker` flags. Omitted `judge.enabled` turns on only when the tracker is on. Explicit `enabled: false` still opts a nested section out.
34
+ - Omitted `verifier.ledger.model` / `verifier.judge.model` inherit the agent model (`model.name` / `MODEL_NAME`, then `gemini-2.5-flash`). The live judge worker is session-bound `ProviderJudge`.
35
+
36
+ ### Fixed
37
+
38
+ - Provider requests that exceed the multimodal byte budget drop media rather than sending an oversized body; remaining oversize fails closed. In-flight media is frozen on abort.
39
+ - Promoted follow-ups no longer vanish if the turn ends before they inject — they restore to the front of the follow-up queue.
40
+
41
+ ### Notes
42
+
43
+ - Existing configs that set only `verifier.enabled: true` (or `enabled: true` plus `ledger.enabled: true`) now also get the tracker, and the judge if the tracker stays on. Opt out with `tracker.enabled: false` / `judge.enabled: false`.
44
+
45
+ ## [cli v0.7.0] - 2026-09-20
46
+
47
+ ### Added
48
+
49
+ - New agents install a packaged `skills/goal/SKILL.md` for explicit `/goal` invocations. `monkeybot refresh` adds it when missing.
50
+
51
+ ### Changed
52
+
53
+ - Example YAML documents verifier nested enable-flag inheritance and optional model inherit.
54
+
55
+ ## [browser v0.7.2] - 2026-09-13
56
+
57
+ #### Fixed
58
+
59
+ - Reuse the focused `about:blank` tab when opening a URL so agent `Target.createTarget` does not stack a leftover New tab next to the first real page.
60
+
61
+ ## [browser v0.7.1] - 2026-09-12
10
62
 
11
63
  #### Fixed
12
64
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: monkeybot
3
- Version: 3.4.0
3
+ Version: 3.6.0
4
4
  Summary: monkeybot agent harness — FastAPI SSE gateway, owned loop, SQLite, and MCP.
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -11,6 +11,7 @@ Requires-Dist: google-genai>=1.0.0
11
11
  Requires-Dist: httpx>=0.27.0
12
12
  Requires-Dist: mcp<2,>=1.27.1
13
13
  Requires-Dist: numpy<2.5,>=1.26.0
14
+ Requires-Dist: pillow>=10.0.0
14
15
  Requires-Dist: pydantic>=2.10.0
15
16
  Requires-Dist: python-dotenv>=1.0.0
16
17
  Requires-Dist: python-ulid>=2.0.0
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "monkeybot-cli"
7
- version = "0.6.0"
7
+ version = "0.7.0"
8
8
  description = "CLI to create, configure, validate, and chat with monkeybot agents."
9
9
  requires-python = ">=3.11"
10
10
  dependencies = [
@@ -16,6 +16,7 @@ from typing import Any, Literal
16
16
  import httpx
17
17
  from monkeybot.core.runtime.events import (
18
18
  ActionRequiredEvent,
19
+ AskUserRequestEvent,
19
20
  AssistantDelta,
20
21
  ContextSummarized,
21
22
  ContextSummarizing,
@@ -41,7 +42,12 @@ HitlReaderFn = Callable[["HitlRequest"], Any] # async (HitlRequest) -> HitlAnsw
41
42
 
42
43
  HitlKind = Literal["confirm", "elicit", "frontend_unsupported"]
43
44
 
44
- _HITL_TYPES = (ToolConfirmationRequestEvent, ActionRequiredEvent, FrontendToolRequestEvent)
45
+ _HITL_TYPES = (
46
+ ToolConfirmationRequestEvent,
47
+ AskUserRequestEvent,
48
+ ActionRequiredEvent,
49
+ FrontendToolRequestEvent,
50
+ )
45
51
 
46
52
  _RECONNECT_INITIAL_DELAY = 0.5
47
53
  _RECONNECT_MAX_DELAY = 15.0
@@ -717,6 +723,9 @@ class ChatSessionController:
717
723
  if isinstance(evt, ToolConfirmationRequestEvent):
718
724
  await self._handle_tool_confirm(evt)
719
725
  return
726
+ if isinstance(evt, AskUserRequestEvent):
727
+ await self._handle_ask_user(evt)
728
+ return
720
729
  if isinstance(evt, ActionRequiredEvent):
721
730
  await self._handle_elicit(evt)
722
731
 
@@ -753,6 +762,32 @@ class ChatSessionController:
753
762
  if answer.cancelled or not ok:
754
763
  self._turn_abort.set()
755
764
 
765
+ async def _handle_ask_user(self, evt: AskUserRequestEvent) -> None:
766
+ assert self.session_id is not None
767
+ choices = "\n".join(f"- {choice}" for choice in evt.choices)
768
+ prompt = evt.question or "The agent asked a question."
769
+ if choices:
770
+ prompt = f"{prompt}\n{choices}"
771
+ answer = await self._await_hitl(
772
+ HitlRequest(
773
+ kind="elicit",
774
+ prompt=prompt,
775
+ tool_call_id=evt.tool_call_id,
776
+ tool_name="ask_user",
777
+ )
778
+ )
779
+ text = "" if answer.cancelled else answer.text.strip()
780
+ if not text:
781
+ self.abort_turn()
782
+ return
783
+ ok = await self._post_hitl(
784
+ f"{self.base}/sessions/{self.session_id}/ask-user/{evt.tool_call_id}",
785
+ {"answer": text},
786
+ label="Ask user",
787
+ )
788
+ if not ok:
789
+ self.abort_turn()
790
+
756
791
  async def _handle_elicit(self, evt: ActionRequiredEvent) -> None:
757
792
  assert self.session_id is not None
758
793
  payload = dict(evt.payload) if evt.payload else {}
@@ -176,6 +176,13 @@ def install_loop_skill(dest: Path, *, force: bool) -> str:
176
176
  return _install_file(target, resources.files(_DEFAULTS_PKG) / "loop" / "SKILL.md", force=force)
177
177
 
178
178
 
179
+ def install_goal_skill(dest: Path, *, force: bool) -> str:
180
+ """Install the bundled native-goal procedure into ``skills/goal``."""
181
+ target = dest / "skills" / "goal" / "SKILL.md"
182
+ target.parent.mkdir(parents=True, exist_ok=True)
183
+ return _install_file(target, resources.files(_DEFAULTS_PKG) / "goal" / "SKILL.md", force=force)
184
+
185
+
179
186
  def install_env_example(dest: Path, *, force: bool) -> str:
180
187
  env_example = dest / ".env.example"
181
188
  if env_example.exists() and not force:
@@ -399,6 +406,7 @@ def run_refresh(*, dest: Path) -> list[str]:
399
406
  report.append(refresh_permissions_if_default(cfg_dir))
400
407
  report.append(refresh_monkeybot_yaml(cfg_dir))
401
408
  report.extend(ensure_memory(dest, force=False))
409
+ report.append(f" skills/goal/SKILL.md: {install_goal_skill(dest, force=False)}")
402
410
  return report
403
411
 
404
412
 
@@ -412,11 +420,12 @@ def run_new(
412
420
  ) -> list[str]:
413
421
  """Full scaffold: config bundle, empty skills root, writable state, and image files.
414
422
 
415
- Capability skills (``browser``, ``image-generator``, ``loop``) are packaged
423
+ Optional capability skills (``browser``, ``image-generator``, ``loop``) are packaged
416
424
  under ``scaffold_defaults`` but not installed into new agents for now —
417
425
  the Mac Main Agent loads them from ``~/.monkeybot/.internal/skills``
418
426
  instead. Re-enable via ``install_*_skill`` when custom agents should get
419
- them again.
427
+ them again. The ``goal`` skill is installed because native goal tools are
428
+ intentionally exposed only for explicit ``/goal`` invocations.
420
429
  """
421
430
  cfg_dir = dest / "monkeybot_config"
422
431
  report = install_config_bundle(cfg_dir, force=force)
@@ -426,7 +435,7 @@ def run_new(
426
435
  )
427
436
  report.extend(ensure_memory(dest, force=force))
428
437
  report.extend(ensure_workspace(dest, force=force))
429
- report.append(" skills/: ensured (empty — capability skills deferred)")
438
+ report.append(f" skills/goal/SKILL.md: {install_goal_skill(dest, force=force)}")
430
439
  report.append(f" .env.example: {install_env_example(dest, force=force)}")
431
440
  report.extend(install_container_files(dest, force=force))
432
441
  report.append(
@@ -0,0 +1,31 @@
1
+ ---
2
+ name: goal
3
+ description: Create one durable objective that continues across scheduled turns until completed.
4
+ ---
5
+
6
+ # Goal
7
+
8
+ Use this skill only when the user explicitly invokes `/goal` with an objective
9
+ that may require multiple turns.
10
+
11
+ ## Start
12
+
13
+ 1. Preserve the user's complete objective without narrowing its scope.
14
+ 2. Call `create_goal` exactly once with that objective.
15
+ 3. Do the first concrete increment of work in the same turn.
16
+ 4. Keep the returned goal id; every `update_goal` call must include it.
17
+
18
+ ## Continue
19
+
20
+ - Goal continuations are scheduled automatically.
21
+ - Treat the stored objective as authoritative.
22
+ - Make measurable progress and verify results before declaring completion.
23
+ - Temporary session-busy deferrals are normal and are not goal failures.
24
+ - Persistent execution failures stop the goal after the retry limit so it
25
+ cannot consume resources indefinitely.
26
+
27
+ ## Complete
28
+
29
+ Call `update_goal` with the returned `goal_id` and `status="complete"` only
30
+ after evidence proves every requirement is satisfied. Otherwise leave the goal
31
+ active. Use the `/goals` control plane to pause, resume, or stop it manually.
@@ -253,6 +253,17 @@ scheduler:
253
253
  # Env override: MONKEYBOT_SCHEDULER_ENABLED (1 | true | yes | on).
254
254
  enabled: false
255
255
 
256
+ # Background verifier (YAML-only). Off by default: ledger costs one model call
257
+ # per human message. `enabled: true` turns on omitted ledger/tracker flags;
258
+ # omitted judge.enabled turns on only when the tracker is on. Explicit
259
+ # `enabled: false` still opts a nested section out. Omitted ledger.model /
260
+ # judge.model inherit model.name (same fallback as the agent). The live
261
+ # worker is session-bound ProviderJudge. Realtime loops ignore this block.
262
+ # verifier:
263
+ # enabled: true
264
+ # escalation:
265
+ # max_severity: nudge
266
+
256
267
  # Optional JSON for model.provider: fake tests (env: MONKEYBOT_FAKE_PROVIDER_EVENTS)
257
268
  # fake_provider:
258
269
  # events_json: '[[]]'
@@ -34,6 +34,7 @@ def test_run_new_creates_bundle(tmp_path: Path) -> None:
34
34
  assert not (tmp_path / "skills" / "browser").exists()
35
35
  assert not (tmp_path / "skills" / "image-generator").exists()
36
36
  assert not (tmp_path / "skills" / "loop").exists()
37
+ assert (tmp_path / "skills" / "goal" / "SKILL.md").is_file()
37
38
  assert (tmp_path / "workspace" / ".gitkeep").is_file()
38
39
  assert (tmp_path / "workspace" / "browser" / "playbooks").is_dir()
39
40
  assert (tmp_path / "workspace" / "generated-media" / "images").is_dir()
@@ -153,6 +154,8 @@ def test_run_refresh_adds_template_commands_and_keeps_extras(tmp_path: Path) ->
153
154
  doc = yaml.safe_load(yaml_path.read_text(encoding="utf-8")) or {}
154
155
  doc.pop("memory", None)
155
156
  yaml_path.write_text(yaml.safe_dump(doc, sort_keys=False), encoding="utf-8")
157
+ goal_skill = tmp_path / "skills" / "goal" / "SKILL.md"
158
+ goal_skill.unlink()
156
159
 
157
160
  report = run_refresh(dest=tmp_path)
158
161
  text = allow.read_text(encoding="utf-8")
@@ -166,6 +169,7 @@ def test_run_refresh_adds_template_commands_and_keeps_extras(tmp_path: Path) ->
166
169
  refreshed_yaml = yaml_path.read_text(encoding="utf-8")
167
170
  assert "enabled: true" in refreshed_yaml
168
171
  assert "custom persona" not in refreshed_yaml
172
+ assert goal_skill.is_file()
169
173
  joined = "\n".join(report)
170
174
  assert "command_allowlist.yaml: updated" in joined
171
175
  assert "monkeybot.yaml: updated" in joined
@@ -174,7 +178,10 @@ def test_run_refresh_adds_template_commands_and_keeps_extras(tmp_path: Path) ->
174
178
  def test_run_refresh_skips_custom_permissions_and_model(tmp_path: Path) -> None:
175
179
  run_new(dest=tmp_path, force=False, provider="nvidia", model="keep-me")
176
180
  perms = tmp_path / "monkeybot_config" / "permissions.yaml"
177
- perms.write_text("default: deny\nrules:\n - tool: '*'\n pattern: '*'\n effect: deny\n", encoding="utf-8")
181
+ perms.write_text(
182
+ "default: deny\nrules:\n - tool: '*'\n pattern: '*'\n effect: deny\n",
183
+ encoding="utf-8",
184
+ )
178
185
  yaml_path = tmp_path / "monkeybot_config" / "monkeybot.yaml"
179
186
  before = yaml_path.read_text(encoding="utf-8")
180
187
 
@@ -97,8 +97,10 @@ One **user message** may span multiple **inner turns** (model → tools → mode
97
97
  | Reply | `POST /sessions/{id}/reply` | Session idle | Starts a turn immediately (`SESSION_BUSY` if busy) |
98
98
  | Steer | `POST /sessions/{id}/steer` | Session busy | Injected after current tool batch / before next provider call |
99
99
  | Follow-up | `POST /sessions/{id}/queue` | Busy → enqueue; idle → start | FIFO drain after `TurnComplete` / lock release |
100
+ | Promote | `POST /sessions/{id}/queue/{request_id}/steer` | A turn is live and the item is still queued. 409 `SESSION_IDLE` otherwise — promote is not meaningful between turns (including while a follow-up is waiting on the lock-retry path); those items drain automatically. | Atomic move from follow-up → steer; injected at the next inner-turn boundary. If the turn ends first, the item is restored to the front of the follow-up FIFO and starts its own turn. `QueuedInputAccepted.request_id` is the in-flight turn (same as `POST /steer`); the follow-up id is `UserSteered.queued_request_id`. |
101
+ | Drop | `DELETE /sessions/{id}/queue/{request_id}` | Item still in the follow-up queue (or popped by drain but not yet started) | Removes it so it will not drain or promote |
100
102
 
101
- Do **not** conflate with HITL `ToolConfirmationRequest`. Cancel clears pending steer; follow-ups survive. Caps: `MONKEYBOT_STEER_QUEUE_MAX` (default 8), `MONKEYBOT_FOLLOW_UP_QUEUE_MAX` (default 16).
103
+ Do **not** conflate with HITL `ToolConfirmationRequest`. Cancel clears pending steer; follow-ups survive (including follow-ups that had been promoted and not yet injected). Caps: `MONKEYBOT_STEER_QUEUE_MAX` (default 8), `MONKEYBOT_FOLLOW_UP_QUEUE_MAX` (default 16). `UserSteered.request_id` is always the in-flight turn; `queued_request_id` is set when the injected steer came from a promoted follow-up.
102
104
 
103
105
  **Process-local only:** steer/follow-up queues live on the in-process `SessionBus` (same constraint as the SSE registry). Multi-replica gateways do not share admission queues across instances — pin sticky sessions to one replica, or treat `/queue` as best-effort for single-process deployments. If drain cannot acquire the durable turn lock (another replica / stale claim), the item is requeued and retried on an interval (`MONKEYBOT_FOLLOW_UP_LOCK_RETRY_S`, default 1s) until the lock frees or the wait budget expires (`MONKEYBOT_FOLLOW_UP_LOCK_WAIT_MS`, default = session-turn stale window), after which that follow-up is dropped so the queue cannot wedge forever.
104
106
 
@@ -657,7 +659,7 @@ Before spawning the gateway, the CLI probes that interpreter for MonkeyBot `>=3.
657
659
 
658
660
  **How it works:**
659
661
  - Off by default, macOS-only: `computer.enabled: true` in `monkeybot.yaml` → `MONKEYBOT_COMPUTER_TOOLS` env, combined with a hard `sys.platform == "darwin"` check (`should_enable_computer_tools()`). The desktop app sets the env var when it spawns a gateway with the feature turned on in Settings; no other deployment should ever set it.
660
- - **Hard security boundary lives in the tool bodies, not in `permissions.yaml`** (`safety.py`): every path is resolved and validated against the user's home directory after following symlinks; a fixed denylist blocks credential directories (`.ssh`, `.aws`, keychains, browser profiles, the app's own config) both at their canonical location *and* by directory-name anywhere in the tree; filenames matching credential patterns (`.env`, `*.pem`, `id_rsa*`, …) are always refused; `computer_open` refuses any path/app that would make `open` execute code (`.command`, `.app`, `.sh`, Terminal, script editors, …); trash never hard-deletes. `permissions.yaml` is fail-open (a broken file silently disables it), so none of this can depend on it. `_denied_dirs()` also always includes `MONKEYBOT_WORKSPACE_ROOT` (not only under `MONKEYBOT_APP_HOME`, which only the desktop app sets) — a CLI-scaffolded agent's workspace can sit anywhere under `$HOME` the user chose, and `computer_move`/`computer_trash` must not be able to relocate a file straight into or out of it, one click away from smuggling exactly what the workspace boundary (§4) exists to prevent. `computer_move`'s own description now says so, so the model doesn't reach for it as a `read_file`/`run_command` workaround.
662
+ - **Hard security boundary lives in the tool bodies, not in `permissions.yaml`** (`safety.py`): every path is resolved and validated against the user's home directory after following symlinks; a fixed denylist blocks credential directories (`.ssh`, `.aws`, keychains, browser profiles, the app's own config) both at their canonical location *and* by directory-name anywhere in the tree; filenames matching credential patterns (`.env`, `*.pem`, `id_rsa*`, …) are always refused; `computer_open` refuses any path/app that would make `open` execute code (`.command`, `.app`, `.sh`, Terminal, script editors, …); trash never hard-deletes. `permissions.yaml` is fail-open (a broken file silently disables it), so none of this can depend on it. `_denied_dirs()` also always includes `MONKEYBOT_WORKSPACE_ROOT` (not only under `MONKEYBOT_APP_HOME`, which only the desktop app sets) — a CLI-scaffolded agent's workspace can sit anywhere under `$HOME` the user chose. Destinations and `computer_trash` still cannot write into it. A workspace *source* may be copied (not moved) out only when it is a generated document (PDF, images, office files); `computer_open` of workspace exec surfaces (`.terminal`, `.webloc`, `.fileloc`, …) is denied. `computer_move`'s own description now says so, so the model doesn't reach for it as a `read_file`/`run_command` workaround.
661
663
  - **Every `computer_*` call asks by default**, via a built-in baseline rule (`COMPUTER_BASELINE_RULES` in `permissions.py`) — not a line in `permissions.yaml`, so it can't be silently defeated by a missing/broken config file. `ComputerAwarePermissionInspector` layers, last-match-wins: baseline `ask` < durable approvals overlay `allow` < the user's `permissions.yaml` (highest authority — a hand-written `deny` always wins).
662
664
  - **"Always allow" is durable and narrow**: `monkeybot_config/approvals.json` (machine-written, JSON — deliberately *not* appended into `permissions.yaml`, which is a comment-heavy file the app's Advanced settings save wholesale) stores one exact `(tool, resource)` pair per rule. Mutating tools (`computer_move`, `computer_trash`) are excluded from `ALWAYS_SCOPE` — their resource is the *source* path only, so an "always" rule would cover any destination — every call to them asks. The inspector re-`stat`s the overlay file on every check and reloads on change; on a genuine change it also clears the session-level approval cache, so a revoke in the app's Settings takes effect immediately rather than waiting for a gateway restart.
663
665
  - Registered via the standard `extra_tools` extension point in both the SSE (`gateway/sse/app.py`) and realtime (`gateway/realtime/routes.py`) gateways — same mechanism as `web_search`/`todo_list`. Never registered for subagents (`subagent_worker.py` builds its own `extra_tools` independently and never imports this package).
@@ -104,7 +104,8 @@ Common types you will handle in a chat UI:
104
104
  | `ToolCallStarted` / `ToolCallResult` | Tool name, args, result text / error. |
105
105
  | `TurnComplete` | Turn finished; includes `usage` (`input_tokens`, `output_tokens`, `cached_tokens`, `cost_usd`, `duration_ms`, `estimated_prompt_tokens` — see [Session usage endpoint](#session-usage-endpoint)). |
106
106
  | `Error` | Recoverable stream error string in `error`. |
107
- | `ImageBlock` | Inline image (`mime_type`, base64 `data`). |
107
+ | `ImageBlock` | Inline image (`mime_type`, workspace `path`, or base64 `data` when no path). |
108
+ | `FileBlock` | Generated document (`mime_type`, workspace `path`, `filename`, `file_id`). Path-only — clients load from disk; raw PDF bytes are never sent on the wire. |
108
109
  | `ThinkingBlockDelta` / `ThinkingBlockComplete` / `RedactedThinkingBlock` | Extended thinking blocks where the model exposes them. |
109
110
  | `ToolConfirmationRequest` | User must approve/deny; POST to `tool-confirmations` with `tool_call_id`. Carries `tool_name`, `arguments` (the tool's raw call args — e.g. `path`/`url`/`app` for `computer_*` tools, useful for showing *what* is being approved), and an optional human-readable `prompt`. The reference Textual client can auto-answer these client-side in `auto-approve`/`deny-confirms` mode (`Shift+Tab` in `monkeybot chat`) — this is purely a UI convenience, no gateway change; `ActionRequiredEvent` elicitations are never auto-answered. |
110
111
  | `ActionRequiredEvent` | e.g. `action_type: "elicitation"` with `id` and `payload`; POST to `elicitations/{id}`. |
@@ -70,8 +70,9 @@ A new session should read this section, then Part 8. Phases 0–6 are in the tre
70
70
  - `NudgeActuator` on `PRE_TOOL`; drain caps severity and stashes one nudge.
71
71
  - `tail_grace_s` on the turn-tail drain only, and only while the judge has a call in flight
72
72
  (`mailbox.pending`) — an idle turn never pays the grace.
73
- - Nudge/replan notes are request-scoped (`put_nudge`/`take_nudge` take a `request_id`): a note
74
- whose request has already finished is dropped, not applied to the next user message.
73
+ - Sticky nudges (`activate_nudge`/`peek_nudge`) and replan notes (`put_replan`/`take_replan`)
74
+ are request-scoped: a note whose request has already finished is dropped, not applied to
75
+ the next user message.
75
76
  - Judge rate limits are charged at `enqueue` and refunded when no verdict lands, so a slow port
76
77
  cannot slip past `max_verdicts_per_message` while a call is in flight.
77
78
  - Tests: `tests/core/test_progress_tracker.py` (`test_nudge_reaches_next_system_message_once`), `tests/evals/test_verifier_port.py`.
@@ -725,16 +726,16 @@ New `verifier:` block in `monkeybot.yaml`, defaulted off. The section is **YAML-
725
726
  verifier:
726
727
  enabled: false # master switch; when false, NOTHING below runs
727
728
  ledger:
728
- enabled: false # one classifier call per human input when on
729
- model: gemini-2.5-flash # classifier; see Open decision 2
729
+ enabled: false # omitted → follows verifier.enabled
730
+ # model: # omitted / null → inherit model.name (then gemini-2.5-flash)
730
731
  max_entries_per_thread: 64
731
732
  tracker:
732
- enabled: false # requires ledger.enabled for constraint signals
733
+ enabled: false # omitted → follows verifier.enabled
733
734
  suspicion_threshold: 3
734
735
  min_turn_before_verdict: 3
735
736
  judge:
736
- enabled: false # requires tracker.enabled
737
- model: gemini-2.5-flash # small + fast; not the main agent's model
737
+ enabled: false # omitted → on only when parent and tracker are on
738
+ # model: # reserved; SignalJudge ignores it today
738
739
  max_verdicts_per_message: 3
739
740
  min_turns_between_verdicts: 2
740
741
  max_spend_ratio: 0.25 # of main-agent tokens for this message
@@ -743,16 +744,18 @@ verifier:
743
744
  max_severity: nudge # nudge | replan | steer | block
744
745
  ```
745
746
 
746
- **Gating is explicit and hierarchical.** Precedence, highest first:
747
+ **Gating is hierarchical.** Precedence, highest first:
747
748
 
748
749
  1. **`verifier.enabled` is the master switch.** When `false`, nothing below runs — not the ledger, not the tracker, not the judge, and not actuation — regardless of child `enabled` flags or `escalation.max_severity`. That is the one switch an operator needs to turn the whole feature off.
749
- 2. **Child `enabled` flags** (`ledger`, `tracker`, `judge`) only apply when the master switch is on. A child set `true` while the master is `false` is a no-op, not an override.
750
- 3. **`judge` requires `tracker`.** `tracker` without `ledger` runs only the ledger-independent signals (`error_streak`, `no_progress`, `write_without_read`, `budget_burn`, `rewrite_churn`). `ledger` can run alone (Phase 1 ships this way).
750
+ 2. **When the master is on, omitted child `enabled` flags inherit on** for `ledger` and `tracker`. Omitted `judge.enabled` inherits on only if the tracker is on. Explicit `enabled: false` still opts a nested section out. A child set `true` while the master is `false` is a no-op, not an override.
751
+ 3. **`judge` requires `tracker` at runtime.** `build_verifier` skips an explicit `judge.enabled: true` when the tracker is off and logs that skip. `tracker` without `ledger` runs only the ledger-independent signals (`error_streak`, `no_progress`, `write_without_read`, `budget_burn`, `rewrite_churn`). `ledger` can run alone (Phase 1 ships this way).
751
752
  4. **`escalation.max_severity` caps actuation, it does not enable anything.** `enabled: true` plus `max_severity: none` is "on but muted": observe/record verdicts at `none`, never nudge/replan/steer/block. Raising the cap cannot turn on a disabled child. The smoke fixture `evals/smoke_agent/monkeybot_config/monkeybot.verifier-on.yaml` uses this shape on purpose.
752
753
 
753
754
  The parser does not rewrite child flags when the master is off; readers must check `verifier.enabled` first. `max_severity` values are `none | nudge | replan | steer | block` in that rank order (`VERIFIER_SEVERITY_ORDER` in `core/config/settings.py`). `steer` is reserved for a later optional phase; Phases 4–6 ship nudge/replan/block.
754
755
 
755
- The ledger's default is `false` because it is the only sub-feature with a per-message model cost even when nothing is being verified.
756
+ The dataclass default for every nested `enabled` is still `false` so an absent `verifier:` section stays off. The inheritance rule above is the upgrade hazard: an existing file that set only `verifier.enabled: true` plus `ledger.enabled: true` now also gets the tracker (and the judge if the tracker stays on). Opt out with `tracker.enabled: false` / `judge.enabled: false`.
757
+
758
+ Omitted `ledger.model` / `judge.model` resolve through `effective_verifier_model` — the same `model.name` / `MODEL_NAME` / `gemini-2.5-flash` chain as `get_provider_config`. `judge.model` is reserved; today's worker is the deterministic `SignalJudge`.
756
759
 
757
760
  **Plumbing is a typed snapshot field, not an env map.** Mirror `subagents:`:
758
761
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "monkeybot-browser-mcp"
7
- version = "0.7.0"
7
+ version = "0.7.2"
8
8
  description = "monkeybot MCP server wrapping browser-harness for real-browser control and site playbooks."
9
9
  requires-python = ">=3.11"
10
10
  dependencies = [
@@ -76,8 +76,30 @@ def _close_target(helpers: Any, target_id: str) -> None:
76
76
  raise tabs.SingleTabBackendError()
77
77
 
78
78
 
79
+ def _blank_target_id(helpers: Any) -> str | None:
80
+ """Reuse the focused about:blank tab instead of stacking a New tab."""
81
+ if not callable(getattr(helpers, "current_tab", None)):
82
+ return None
83
+ try:
84
+ row = helpers.current_tab()
85
+ except Exception:
86
+ logger.debug("current_tab failed while looking for a blank tab", exc_info=True)
87
+ return None
88
+ if not isinstance(row, dict):
89
+ return None
90
+ if not actions._is_blank_url(str(row.get("url") or "")):
91
+ return None
92
+ tid = row.get("targetId") or row.get("target_id")
93
+ return str(tid) if tid else None
94
+
95
+
79
96
  def _create_blank_target(helpers: Any, *, focus: bool, url: str = "about:blank") -> bool:
80
97
  """Create a tab. Returns True if ``url`` was already loaded by the helper."""
98
+ existing = _blank_target_id(helpers)
99
+ if existing:
100
+ if focus:
101
+ helpers.switch_tab(existing)
102
+ return actions._is_blank_url(url)
81
103
  if callable(getattr(helpers, "cdp", None)):
82
104
  try:
83
105
  result = helpers.cdp(
@@ -149,6 +149,27 @@ def test_user_opened_untouched_tabs_do_not_count_toward_cap(
149
149
  )
150
150
 
151
151
 
152
+ def test_open_tab_reuses_focused_blank_instead_of_creating() -> None:
153
+ helpers = _helpers(tabs_list=[_tab("blank", "about:blank")], focused="blank")
154
+ helpers.cdp = MagicMock()
155
+
156
+ def goto_url(url: str, **_k: object) -> str:
157
+ helpers.current_tab.return_value = _tab("blank", url)
158
+ helpers.page_info.return_value = {"url": url, "title": "t", "w": 800, "h": 600}
159
+ return url
160
+
161
+ helpers.goto_url.side_effect = goto_url
162
+ with _patch_harness(helpers):
163
+ json.loads(server.browser_tabs())
164
+ result = json.loads(server.browser_open_tab("https://ex.test/new"))
165
+ assert result["ok"] is True
166
+ assert result["url"] == "https://ex.test/new"
167
+ assert all(
168
+ not (c.args and c.args[0] == "Target.createTarget")
169
+ for c in helpers.cdp.call_args_list
170
+ )
171
+
172
+
152
173
  def test_close_tab_then_retry_succeeds(monkeypatch: pytest.MonkeyPatch) -> None:
153
174
  monkeypatch.setenv("BROWSER_MCP_MAX_TABS", "1")
154
175
  user = _tab("user", "https://user.test/")
@@ -484,7 +484,7 @@ wheels = [
484
484
 
485
485
  [[package]]
486
486
  name = "monkeybot-browser-mcp"
487
- version = "0.7.0"
487
+ version = "0.7.1"
488
488
  source = { editable = "." }
489
489
  dependencies = [
490
490
  { name = "browser-harness" },
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "monkeybot"
7
- version = "3.4.0"
7
+ version = "3.6.0"
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"
@@ -23,6 +23,7 @@ dependencies = [
23
23
  # <2.5: newer numpy stub files use PEP 695 `type` statements that mypy
24
24
  # cannot parse while this project's [tool.mypy] targets python_version 3.11.
25
25
  "numpy>=1.26.0,<2.5",
26
+ "pillow>=10.0.0",
26
27
  ]
27
28
 
28
29
  [project.optional-dependencies]
@@ -98,6 +99,8 @@ dev = [
98
99
  "monkeybot[knowledge-media]",
99
100
  # MemPalace is an optional extra; tests still exercise the adapter.
100
101
  "monkeybot[memory]",
102
+ # Native goal persistence tests hit a real Postgres via asyncpg.
103
+ "monkeybot[postgres]",
101
104
  ]
102
105
 
103
106
  [tool.uv]