monkeybot 3.5.0__tar.gz → 3.6.1__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 (760) hide show
  1. {monkeybot-3.5.0 → monkeybot-3.6.1}/CHANGELOG.md +19 -0
  2. {monkeybot-3.5.0 → monkeybot-3.6.1}/PKG-INFO +1 -1
  3. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/pyproject.toml +1 -1
  4. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/chat_session.py +36 -1
  5. {monkeybot-3.5.0 → monkeybot-3.6.1}/pyproject.toml +1 -1
  6. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/context/__init__.py +26 -0
  7. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/events.py +32 -0
  8. monkeybot-3.6.1/src/monkeybot/core/tools/ask_user.py +75 -0
  9. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/core_tool_executor.py +40 -3
  10. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/fs_isolation.py +153 -3
  11. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/models.py +6 -0
  12. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/routes.py +39 -0
  13. monkeybot-3.6.1/tests/core/test_ask_user.py +61 -0
  14. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_context.py +1 -0
  15. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_events.py +11 -0
  16. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_fs_isolation.py +129 -0
  17. {monkeybot-3.5.0 → monkeybot-3.6.1}/.dockerignore +0 -0
  18. {monkeybot-3.5.0 → monkeybot-3.6.1}/.github/workflows/ci.yml +0 -0
  19. {monkeybot-3.5.0 → monkeybot-3.6.1}/.github/workflows/live-eval-smoke.yml +0 -0
  20. {monkeybot-3.5.0 → monkeybot-3.6.1}/.github/workflows/prepare-release.yml +0 -0
  21. {monkeybot-3.5.0 → monkeybot-3.6.1}/.github/workflows/publish-release.yml +0 -0
  22. {monkeybot-3.5.0 → monkeybot-3.6.1}/.gitignore +0 -0
  23. {monkeybot-3.5.0 → monkeybot-3.6.1}/.pre-commit-config.yaml +0 -0
  24. {monkeybot-3.5.0 → monkeybot-3.6.1}/BACKLOG.md +0 -0
  25. {monkeybot-3.5.0 → monkeybot-3.6.1}/CONTRIBUTING.md +0 -0
  26. {monkeybot-3.5.0 → monkeybot-3.6.1}/LICENSE +0 -0
  27. {monkeybot-3.5.0 → monkeybot-3.6.1}/README.md +0 -0
  28. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/skills/monkeybot/SKILL.md +0 -0
  29. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/skills/monkeybot/references/config-sections.md +0 -0
  30. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/__init__.py +0 -0
  31. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/chat_file_index.py +0 -0
  32. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/chat_local_shell.py +0 -0
  33. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/chat_renderer.py +0 -0
  34. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/chat_status_bar.py +0 -0
  35. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/chat_theme.py +0 -0
  36. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/chat_tool_display.py +0 -0
  37. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/chat_tui.py +0 -0
  38. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/chat_tui_widgets.py +0 -0
  39. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/commands/__init__.py +0 -0
  40. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/commands/chat.py +0 -0
  41. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/commands/doctor.py +0 -0
  42. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/commands/loop.py +0 -0
  43. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/commands/new.py +0 -0
  44. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/commands/refresh.py +0 -0
  45. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/commands/run_cmd.py +0 -0
  46. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/commands/talk.py +0 -0
  47. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/commands/validate.py +0 -0
  48. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/compat.py +0 -0
  49. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/config_resolve.py +0 -0
  50. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/exit_commands.py +0 -0
  51. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/extras_catalog.py +0 -0
  52. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/gateway_health.py +0 -0
  53. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/main.py +0 -0
  54. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/opensandbox_lifecycle.py +0 -0
  55. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/output.py +0 -0
  56. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/process_tree.py +0 -0
  57. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/providers.py +0 -0
  58. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/realtime/__init__.py +0 -0
  59. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/realtime/audio_io.py +0 -0
  60. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/realtime/client.py +0 -0
  61. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/realtime/gateway_manager.py +0 -0
  62. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/realtime/push_to_talk.py +0 -0
  63. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/realtime/session.py +0 -0
  64. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/realtime/session_controller.py +0 -0
  65. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/realtime/talk_ui.py +0 -0
  66. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/realtime/wire_encode.py +0 -0
  67. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/runtime_python.py +0 -0
  68. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold.py +0 -0
  69. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/AGENT.md +0 -0
  70. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/Dockerfile +0 -0
  71. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/__init__.py +0 -0
  72. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/browser/SKILL.md +0 -0
  73. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/command_allowlist.yaml +0 -0
  74. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/dockerignore +0 -0
  75. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/env.example +0 -0
  76. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/goal/SKILL.md +0 -0
  77. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/image-generator/SKILL.md +0 -0
  78. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/image-generator/generate_image.py +0 -0
  79. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/loop/SKILL.md +0 -0
  80. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/mcp.json +0 -0
  81. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/monkeybot.example.yaml +0 -0
  82. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/opensandbox.docker.toml +0 -0
  83. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/otel-collector.example.yaml +0 -0
  84. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/permissions.yaml +0 -0
  85. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/session_controller.py +0 -0
  86. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/terminal_markdown.py +0 -0
  87. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_chat_continue.py +0 -0
  88. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_chat_e2e.py +0 -0
  89. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_chat_errors.py +0 -0
  90. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_chat_file_index.py +0 -0
  91. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_chat_grounding.py +0 -0
  92. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_chat_local_shell.py +0 -0
  93. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_chat_renderer_parity.py +0 -0
  94. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_chat_session.py +0 -0
  95. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_chat_status_bar.py +0 -0
  96. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_chat_theme.py +0 -0
  97. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_chat_tool_display.py +0 -0
  98. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_chat_tui.py +0 -0
  99. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_cli.py +0 -0
  100. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_config_resolve.py +0 -0
  101. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_doctor.py +0 -0
  102. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_extras_catalog.py +0 -0
  103. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_gateway_health.py +0 -0
  104. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_opensandbox_lifecycle.py +0 -0
  105. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_realtime_session_controller.py +0 -0
  106. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_run_cmd.py +0 -0
  107. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_runtime_python.py +0 -0
  108. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_scaffold.py +0 -0
  109. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/tests/test_terminal_markdown.py +0 -0
  110. {monkeybot-3.5.0 → monkeybot-3.6.1}/cli/uv.lock +0 -0
  111. {monkeybot-3.5.0 → monkeybot-3.6.1}/docker/Dockerfile +0 -0
  112. {monkeybot-3.5.0 → monkeybot-3.6.1}/docker/demo-model.yaml +0 -0
  113. {monkeybot-3.5.0 → monkeybot-3.6.1}/docker/demo.yaml +0 -0
  114. {monkeybot-3.5.0 → monkeybot-3.6.1}/docker/docker-compose.sandbox.yml +0 -0
  115. {monkeybot-3.5.0 → monkeybot-3.6.1}/docker/opensandbox.docker.toml +0 -0
  116. {monkeybot-3.5.0 → monkeybot-3.6.1}/docker/sandbox.Dockerfile +0 -0
  117. {monkeybot-3.5.0 → monkeybot-3.6.1}/docker-compose.yml +0 -0
  118. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/agent-layout.md +0 -0
  119. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/assets/logo.png +0 -0
  120. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/browser-mcp-perf-baseline.md +0 -0
  121. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/browser-mcp-performance-plan.md +0 -0
  122. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/browser-mcp.md +0 -0
  123. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/cloud-deployment-design.md +0 -0
  124. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/deploy-aws-agentcore.md +0 -0
  125. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/deploy-pattern-a-container.md +0 -0
  126. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/deploy-pattern-b-serverless.md +0 -0
  127. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/deploy-pattern-c-agent-platform.md +0 -0
  128. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/deploy-pattern-d-realtime.md +0 -0
  129. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/features.md +0 -0
  130. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/getting-started.md +0 -0
  131. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/knowledge-layer-fixes.md +0 -0
  132. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/live-evals.md +0 -0
  133. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/mcp.md +0 -0
  134. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/memory-graph-split-plan.md +0 -0
  135. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/migrations/agent-scope-namespacing.md +0 -0
  136. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/migrations/memory-outbox.sql +0 -0
  137. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/observability-runbook.md +0 -0
  138. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/ollama-local.md +0 -0
  139. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/otel-collector.example.yaml +0 -0
  140. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/progressive-loop-tools.md +0 -0
  141. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/progressive-mcp-tools.md +0 -0
  142. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/skills.md +0 -0
  143. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/spill-dynamic-design.md +0 -0
  144. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/sse-gateway-ui.md +0 -0
  145. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/verifier-agent-design.md +0 -0
  146. {monkeybot-3.5.0 → monkeybot-3.6.1}/docs/workspace-index-design.md +0 -0
  147. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/TEST_COVERAGE.md +0 -0
  148. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/assertions.py +0 -0
  149. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/baselines/smoke.json +0 -0
  150. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/baselines/smoke.md +0 -0
  151. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/diff.py +0 -0
  152. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/eval_config.yaml +0 -0
  153. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/models.py +0 -0
  154. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/persistence.py +0 -0
  155. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/report.py +0 -0
  156. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/runner.py +0 -0
  157. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/scenario_loader.py +0 -0
  158. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/scenarios/context/summarization_trigger.yaml +0 -0
  159. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/scenarios/drift/declares_done.yaml +0 -0
  160. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/scenarios/drift/path_constraint.yaml +0 -0
  161. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/scenarios/drift/preempt.yaml +0 -0
  162. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/scenarios/drift/repeat_correction.yaml +0 -0
  163. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/scenarios/drift/supersession.yaml +0 -0
  164. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/scenarios/mcp/get_prompt.yaml +0 -0
  165. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/scenarios/mcp/list_resources.yaml +0 -0
  166. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/scenarios/mcp/tool_invoke.yaml +0 -0
  167. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/scenarios/memory/recall_cross_session.yaml +0 -0
  168. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/scenarios/memory/recall_single_session.yaml +0 -0
  169. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/scenarios/multi_turn/task_tracking.yaml +0 -0
  170. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/scenarios/skills/skill_invocation.yaml +0 -0
  171. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/scenarios/subagents/dispatch_complete.yaml +0 -0
  172. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/scenarios/tools/core_read.yaml +0 -0
  173. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/scenarios/tools/core_read_error.yaml +0 -0
  174. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/scenarios/tools/core_run_command.yaml +0 -0
  175. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/scenarios/tools/core_run_command_sandbox.yaml +0 -0
  176. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/scenarios/tools/core_write.yaml +0 -0
  177. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/scorer.py +0 -0
  178. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/smoke_agent/.env.example +0 -0
  179. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/smoke_agent/.gitignore +0 -0
  180. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/smoke_agent/fixture_mcp_server.py +0 -0
  181. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/smoke_agent/monkeybot_config/AGENT.md +0 -0
  182. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/smoke_agent/monkeybot_config/command_allowlist.yaml +0 -0
  183. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/smoke_agent/monkeybot_config/mcp.json +0 -0
  184. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/smoke_agent/monkeybot_config/monkeybot.verifier-on.yaml +0 -0
  185. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/smoke_agent/monkeybot_config/monkeybot.yaml +0 -0
  186. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/smoke_agent/monkeybot_config/permissions.yaml +0 -0
  187. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/smoke_agent/pyproject.toml +0 -0
  188. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/smoke_agent/skills/browser/SKILL.md +0 -0
  189. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/smoke_agent/uv.lock +0 -0
  190. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/smoke_agent/workspace/.gitkeep +0 -0
  191. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/smoke_agent/workspace/skills/browser/playbooks/.gitkeep +0 -0
  192. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/suites/drift.yaml +0 -0
  193. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/suites/smoke.yaml +0 -0
  194. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/test_assertions.py +0 -0
  195. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/test_diff.py +0 -0
  196. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/test_judge.py +0 -0
  197. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/test_report.py +0 -0
  198. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/test_runner_sse.py +0 -0
  199. {monkeybot-3.5.0 → monkeybot-3.6.1}/evals/test_scorer.py +0 -0
  200. {monkeybot-3.5.0 → monkeybot-3.6.1}/examples/README.md +0 -0
  201. {monkeybot-3.5.0 → monkeybot-3.6.1}/examples/agentcore/handler.py +0 -0
  202. {monkeybot-3.5.0 → monkeybot-3.6.1}/examples/agentcore/runtime_app.py +0 -0
  203. {monkeybot-3.5.0 → monkeybot-3.6.1}/examples/agentengine/handler.py +0 -0
  204. {monkeybot-3.5.0 → monkeybot-3.6.1}/examples/cloud-functions/main.py +0 -0
  205. {monkeybot-3.5.0 → monkeybot-3.6.1}/examples/lambda/handler.py +0 -0
  206. {monkeybot-3.5.0 → monkeybot-3.6.1}/examples/ollama/PrefixStable.Modelfile +0 -0
  207. {monkeybot-3.5.0 → monkeybot-3.6.1}/examples/skills/browser/SKILL.md +0 -0
  208. {monkeybot-3.5.0 → monkeybot-3.6.1}/examples/skills/browser/playbooks/.gitkeep +0 -0
  209. {monkeybot-3.5.0 → monkeybot-3.6.1}/examples/skills/diagnostics/README.md +0 -0
  210. {monkeybot-3.5.0 → monkeybot-3.6.1}/examples/skills/diagnostics/SKILL.md +0 -0
  211. {monkeybot-3.5.0 → monkeybot-3.6.1}/examples/skills/diagnostics/__init__.py +0 -0
  212. {monkeybot-3.5.0 → monkeybot-3.6.1}/examples/skills/diagnostics/diagnostics.py +0 -0
  213. {monkeybot-3.5.0 → monkeybot-3.6.1}/examples/skills/image-generator/SKILL.md +0 -0
  214. {monkeybot-3.5.0 → monkeybot-3.6.1}/examples/skills/image-generator/generate_image.py +0 -0
  215. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/pyproject.toml +0 -0
  216. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/scripts/agentcore_smoke.py +0 -0
  217. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/scripts/dump_tool_surface.py +0 -0
  218. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/scripts/perf_bench.py +0 -0
  219. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/__init__.py +0 -0
  220. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/actions.py +0 -0
  221. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/agentcore.py +0 -0
  222. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/app.py +0 -0
  223. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/assets/NOTICE.md +0 -0
  224. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/assets/dom_tree.js +0 -0
  225. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/assets/pa_driver.js +0 -0
  226. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/backend.py +0 -0
  227. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/chat_scope.py +0 -0
  228. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/dom_indexing.py +0 -0
  229. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/in_app_cdp.py +0 -0
  230. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/login.py +0 -0
  231. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/observe.py +0 -0
  232. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/perf.py +0 -0
  233. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/playbooks.py +0 -0
  234. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/playwright_helpers.py +0 -0
  235. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/results.py +0 -0
  236. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/screenshots.py +0 -0
  237. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/server.py +0 -0
  238. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/tab_ops.py +0 -0
  239. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/tabs.py +0 -0
  240. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/tools/__init__.py +0 -0
  241. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/tools/batch.py +0 -0
  242. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/tools/capture.py +0 -0
  243. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/tools/interact.py +0 -0
  244. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/tools/navigate.py +0 -0
  245. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/tools/playbook.py +0 -0
  246. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/tools/read.py +0 -0
  247. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/tools/tab_control.py +0 -0
  248. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/fixtures/api.json +0 -0
  249. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/fixtures/article.html +0 -0
  250. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/fixtures/cards.html +0 -0
  251. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/fixtures/form.html +0 -0
  252. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/fixtures/long_list.html +0 -0
  253. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/fixtures/spa.html +0 -0
  254. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/fixtures/tool_surface.json +0 -0
  255. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/integration/conftest.py +0 -0
  256. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/integration/test_act_observe.py +0 -0
  257. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/integration/test_driver_persist.py +0 -0
  258. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/integration/test_intent_tools.py +0 -0
  259. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/integration/test_multi_tab.py +0 -0
  260. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/integration/test_observation.py +0 -0
  261. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/integration/test_run_playbook.py +0 -0
  262. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/integration/test_wait_for.py +0 -0
  263. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_act.py +0 -0
  264. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_agentcore.py +0 -0
  265. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_chat_scope.py +0 -0
  266. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_dom_indexing.py +0 -0
  267. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_fill_form.py +0 -0
  268. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_in_app_cdp.py +0 -0
  269. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_indexed_tools.py +0 -0
  270. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_observe.py +0 -0
  271. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_observe_after.py +0 -0
  272. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_perf.py +0 -0
  273. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_playbook_flows.py +0 -0
  274. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_playbooks.py +0 -0
  275. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_playwright_helpers.py +0 -0
  276. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_screenshots.py +0 -0
  277. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_server_shutdown.py +0 -0
  278. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_tabs.py +0 -0
  279. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_tool_surface.py +0 -0
  280. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_wait_tools.py +0 -0
  281. {monkeybot-3.5.0 → monkeybot-3.6.1}/integrations/browser-mcp/uv.lock +0 -0
  282. {monkeybot-3.5.0 → monkeybot-3.6.1}/pytest.ini +0 -0
  283. {monkeybot-3.5.0 → monkeybot-3.6.1}/scripts/create_schema.py +0 -0
  284. {monkeybot-3.5.0 → monkeybot-3.6.1}/scripts/precommit-pytest.sh +0 -0
  285. {monkeybot-3.5.0 → monkeybot-3.6.1}/scripts/release.py +0 -0
  286. {monkeybot-3.5.0 → monkeybot-3.6.1}/scripts/smoke_global_cli.sh +0 -0
  287. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/__init__.py +0 -0
  288. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/cli/__init__.py +0 -0
  289. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/cli/__main__.py +0 -0
  290. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/cli/audio_io.py +0 -0
  291. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/cli/gateway_manager.py +0 -0
  292. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/cli/main.py +0 -0
  293. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/cli/push_to_talk.py +0 -0
  294. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/cli/realtime_client.py +0 -0
  295. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/computer/__init__.py +0 -0
  296. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/computer/approvals.py +0 -0
  297. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/computer/permissions.py +0 -0
  298. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/computer/safety.py +0 -0
  299. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/computer/tools.py +0 -0
  300. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/__init__.py +0 -0
  301. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/attachments/__init__.py +0 -0
  302. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/attachments/catalog.py +0 -0
  303. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/attachments/config.py +0 -0
  304. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/attachments/freeze.py +0 -0
  305. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/attachments/image_preview.py +0 -0
  306. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/attachments/resolve.py +0 -0
  307. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/attachments/store.py +0 -0
  308. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/attachments/text.py +0 -0
  309. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/attachments/tools.py +0 -0
  310. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/bootstrap.py +0 -0
  311. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/config/__init__.py +0 -0
  312. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/config/realtime_config.py +0 -0
  313. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/config/runtime_env.py +0 -0
  314. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/config/settings.py +0 -0
  315. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/config/snapshot.py +0 -0
  316. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/config/validation.py +0 -0
  317. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/config/yaml_loader.py +0 -0
  318. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/context/campaign_context.py +0 -0
  319. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/context/common.py +0 -0
  320. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/context/epoch.py +0 -0
  321. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/context/secret_egress.py +0 -0
  322. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/context/slash_skills.py +0 -0
  323. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/context/tool_output_policy.py +0 -0
  324. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/context/tool_result_ingress.py +0 -0
  325. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/context/tool_shapers.py +0 -0
  326. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/goals/__init__.py +0 -0
  327. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/goals/service.py +0 -0
  328. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/hooks/__init__.py +0 -0
  329. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/__init__.py +0 -0
  330. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/captions.py +0 -0
  331. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/chunking.py +0 -0
  332. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/config.py +0 -0
  333. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/embeddings/__init__.py +0 -0
  334. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/embeddings/base.py +0 -0
  335. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/embeddings/factory.py +0 -0
  336. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/embeddings/gemini.py +0 -0
  337. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/embeddings/nvidia.py +0 -0
  338. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/embeddings/openai_compat.py +0 -0
  339. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/embeddings/sanitize.py +0 -0
  340. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/evidence_guard.py +0 -0
  341. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/extractors.py +0 -0
  342. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/fusion.py +0 -0
  343. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/hook.py +0 -0
  344. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/indexer.py +0 -0
  345. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/links.py +0 -0
  346. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/salience.py +0 -0
  347. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/sqlite_index.py +0 -0
  348. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/subsystem.py +0 -0
  349. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/tool.py +0 -0
  350. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/types.py +0 -0
  351. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/layout.py +0 -0
  352. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/llm/__init__.py +0 -0
  353. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/llm/provider.py +0 -0
  354. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/llm/realtime_provider.py +0 -0
  355. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/llm/usage.py +0 -0
  356. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/lockfile_names.py +0 -0
  357. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/logging_utils.py +0 -0
  358. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/mcp/__init__.py +0 -0
  359. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/mcp/mcp_client.py +0 -0
  360. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/mcp/ports_mcp.py +0 -0
  361. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/__init__.py +0 -0
  362. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/config.py +0 -0
  363. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/hook.py +0 -0
  364. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/ids.py +0 -0
  365. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/ingest.py +0 -0
  366. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/migrate_layout.py +0 -0
  367. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/observability.py +0 -0
  368. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/outbox.py +0 -0
  369. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/palace.py +0 -0
  370. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/subsystem.py +0 -0
  371. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/uri.py +0 -0
  372. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/writer.py +0 -0
  373. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/messages/__init__.py +0 -0
  374. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/messages/convert_provider.py +0 -0
  375. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/messages/tool_integrity.py +0 -0
  376. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/messages/transform_context.py +0 -0
  377. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/path_safety.py +0 -0
  378. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/__init__.py +0 -0
  379. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/backends.py +0 -0
  380. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/db.py +0 -0
  381. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/durable_runs.py +0 -0
  382. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/errors.py +0 -0
  383. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/firestore.indexes.json +0 -0
  384. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/firestore.py +0 -0
  385. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/firestore_scheduled_loops.py +0 -0
  386. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/goal_ledger.py +0 -0
  387. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/history.py +0 -0
  388. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/postgres.py +0 -0
  389. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/runs.py +0 -0
  390. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/scheduled_loops.py +0 -0
  391. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/session_turn_locks.py +0 -0
  392. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/sqlite.py +0 -0
  393. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/sqlite_backend.py +0 -0
  394. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/sqlite_vector.py +0 -0
  395. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/thread_summary.py +0 -0
  396. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/transcript.py +0 -0
  397. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/usage.py +0 -0
  398. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/usage_buckets.py +0 -0
  399. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/prompts/__init__.py +0 -0
  400. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/prompts/harness_prompt.py +0 -0
  401. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/prompts/headings.py +0 -0
  402. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/prompts/prompt.py +0 -0
  403. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/__init__.py +0 -0
  404. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/context_budget.py +0 -0
  405. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/doom_loop.py +0 -0
  406. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/history_compaction.py +0 -0
  407. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/input_admission.py +0 -0
  408. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/loop.py +0 -0
  409. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/loop_hooks.py +0 -0
  410. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/loop_messages.py +0 -0
  411. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/loop_ports.py +0 -0
  412. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/loop_usage.py +0 -0
  413. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/provider_stream_mapper.py +0 -0
  414. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/realtime_loop.py +0 -0
  415. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/tool_batch.py +0 -0
  416. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/tool_dispatch.py +0 -0
  417. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/turn_loop.py +0 -0
  418. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/utterance_buffer.py +0 -0
  419. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/subagents/__init__.py +0 -0
  420. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/subagents/progress_publish.py +0 -0
  421. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/subagents/subagent_proto.py +0 -0
  422. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/subagents/subagent_worker.py +0 -0
  423. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/subagents/worker_pool.py +0 -0
  424. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/subprocess_groups.py +0 -0
  425. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/testing/__init__.py +0 -0
  426. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/testing/mocks_provider.py +0 -0
  427. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/testing/mocks_realtime_provider.py +0 -0
  428. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/__init__.py +0 -0
  429. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/grant_store.py +0 -0
  430. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/inspector.py +0 -0
  431. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/loop_inspector.py +0 -0
  432. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/patch.py +0 -0
  433. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/path_grant_inspector.py +0 -0
  434. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/permission.py +0 -0
  435. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/sandbox_executor.py +0 -0
  436. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/spill_inventory.py +0 -0
  437. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/terminal.py +0 -0
  438. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/text_normalize.py +0 -0
  439. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/tool_hint.py +0 -0
  440. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/tool_kind.py +0 -0
  441. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/types.py +0 -0
  442. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/workspace_service.py +0 -0
  443. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/types/__init__.py +0 -0
  444. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/types/content_blocks.py +0 -0
  445. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/types/interfaces.py +0 -0
  446. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/types/types_tools.py +0 -0
  447. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/__init__.py +0 -0
  448. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/actuator.py +0 -0
  449. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/binding.py +0 -0
  450. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/classify.py +0 -0
  451. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/inspector.py +0 -0
  452. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/intervention.py +0 -0
  453. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/judge.py +0 -0
  454. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/ledger.py +0 -0
  455. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/mailbox.py +0 -0
  456. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/match.py +0 -0
  457. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/port.py +0 -0
  458. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/severity.py +0 -0
  459. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/tracker.py +0 -0
  460. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/workspace/__init__.py +0 -0
  461. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/workspace/factory.py +0 -0
  462. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/workspace/gcs.py +0 -0
  463. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/workspace/local.py +0 -0
  464. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/workspace/protocol.py +0 -0
  465. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/workspace/s3.py +0 -0
  466. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/core/workspace_layout.py +0 -0
  467. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/__init__.py +0 -0
  468. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/bootstrap.py +0 -0
  469. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/main.py +0 -0
  470. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/pending_response_bus.py +0 -0
  471. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime/__init__.py +0 -0
  472. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime/app.py +0 -0
  473. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime/deps.py +0 -0
  474. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime/errors.py +0 -0
  475. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime/guardrails.py +0 -0
  476. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime/manager.py +0 -0
  477. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime/metrics.py +0 -0
  478. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime/routes.py +0 -0
  479. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime/session.py +0 -0
  480. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime/wire.py +0 -0
  481. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime_main.py +0 -0
  482. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/__init__.py +0 -0
  483. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/app.py +0 -0
  484. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/goal_routes.py +0 -0
  485. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/loop_port.py +0 -0
  486. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/reload.py +0 -0
  487. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/reply_body.py +0 -0
  488. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/request_storage.py +0 -0
  489. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/scheduler_routes.py +0 -0
  490. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/scheduler_wiring.py +0 -0
  491. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/session_bus.py +0 -0
  492. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/sse.py +0 -0
  493. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/workspace_layout.py +0 -0
  494. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/observability/__init__.py +0 -0
  495. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/observability/_state.py +0 -0
  496. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/observability/instrumentation.py +0 -0
  497. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/observability/propagation.py +0 -0
  498. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/observability/spans.py +0 -0
  499. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/observability/sqlite_exporter.py +0 -0
  500. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/providers/__init__.py +0 -0
  501. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/providers/_bedrock_converse.py +0 -0
  502. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/providers/_openai_compat.py +0 -0
  503. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/providers/_utils.py +0 -0
  504. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/providers/bedrock.py +0 -0
  505. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/providers/claude.py +0 -0
  506. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/providers/gemini.py +0 -0
  507. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/providers/gemini_live.py +0 -0
  508. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/providers/huggingface.py +0 -0
  509. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/providers/model_capabilities.py +0 -0
  510. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/providers/nvidia.py +0 -0
  511. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/providers/ollama.py +0 -0
  512. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/providers/openai.py +0 -0
  513. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/providers/openrouter.py +0 -0
  514. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/providers/pricing.py +0 -0
  515. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/providers/request_budget.py +0 -0
  516. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/providers/sampling.py +0 -0
  517. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/providers/vertex_claude.py +0 -0
  518. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/scaffold/__init__.py +0 -0
  519. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/scheduler/__init__.py +0 -0
  520. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/scheduler/__main__.py +0 -0
  521. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/scheduler/engine.py +0 -0
  522. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/scheduler/http_invoker.py +0 -0
  523. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/scheduler/interval.py +0 -0
  524. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/scheduler/tick_result.py +0 -0
  525. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/scheduler/worker.py +0 -0
  526. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/subagents/__init__.py +0 -0
  527. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/subagents/worker/__init__.py +0 -0
  528. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/subagents/worker/__main__.py +0 -0
  529. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/todo_list/__init__.py +0 -0
  530. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/todo_list/store.py +0 -0
  531. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/todo_list/tool.py +0 -0
  532. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/web_search/__init__.py +0 -0
  533. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/web_search/backends/__init__.py +0 -0
  534. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/web_search/backends/duckduckgo.py +0 -0
  535. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/web_search/backends/firecrawl.py +0 -0
  536. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/web_search/backends/tavily.py +0 -0
  537. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/web_search/protocol.py +0 -0
  538. {monkeybot-3.5.0 → monkeybot-3.6.1}/src/monkeybot/web_search/tool.py +0 -0
  539. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/__init__.py +0 -0
  540. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/acceptance/test_observability_acceptance.py +0 -0
  541. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/cli/__init__.py +0 -0
  542. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/cli/test_gateway_manager.py +0 -0
  543. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/cli/test_main.py +0 -0
  544. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/cli/test_push_to_talk.py +0 -0
  545. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/cli/test_realtime_client.py +0 -0
  546. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/computer/__init__.py +0 -0
  547. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/computer/test_approvals.py +0 -0
  548. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/computer/test_computer_tools.py +0 -0
  549. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/computer/test_package_init.py +0 -0
  550. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/computer/test_path_policy.py +0 -0
  551. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/computer/test_permissions.py +0 -0
  552. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/computer/test_subagent_exclusion.py +0 -0
  553. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/computer/test_wiring.py +0 -0
  554. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/conftest.py +0 -0
  555. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/__init__.py +0 -0
  556. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/fixtures/bitbucket_dc_style_pr.diff +0 -0
  557. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/memory/helpers.py +0 -0
  558. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/memory/in_memory_palace.py +0 -0
  559. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/memory/test_mempalace.py +0 -0
  560. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/memory/test_review_fixes.py +0 -0
  561. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_agent_layout.py +0 -0
  562. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_attachment_freeze.py +0 -0
  563. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_attachment_store.py +0 -0
  564. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_bootstrap.py +0 -0
  565. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_config_extensions.py +0 -0
  566. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_content_blocks.py +0 -0
  567. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_context_budget.py +0 -0
  568. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_context_epoch.py +0 -0
  569. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_core_tool_executor.py +0 -0
  570. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_doom_loop.py +0 -0
  571. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_durable_events.py +0 -0
  572. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_durable_runs.py +0 -0
  573. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_empty_completion.py +0 -0
  574. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_env_map_grep_gates.py +0 -0
  575. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_evidence_guard.py +0 -0
  576. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_firestore_history.py +0 -0
  577. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_firestore_scheduled_loops.py +0 -0
  578. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_firestore_usage.py +0 -0
  579. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_gemini_history_replay.py +0 -0
  580. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_goal_ledger.py +0 -0
  581. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_goal_persistence.py +0 -0
  582. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_goals.py +0 -0
  583. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_grant_store.py +0 -0
  584. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_harness_prompt.py +0 -0
  585. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_history.py +0 -0
  586. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_history_compaction_split.py +0 -0
  587. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_hooks.py +0 -0
  588. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_image_preview.py +0 -0
  589. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_input_admission.py +0 -0
  590. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_inspector.py +0 -0
  591. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_knowledge_chunking.py +0 -0
  592. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_knowledge_chunking_rank.py +0 -0
  593. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_knowledge_config.py +0 -0
  594. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_knowledge_embeddings.py +0 -0
  595. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_knowledge_fts.py +0 -0
  596. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_knowledge_fusion.py +0 -0
  597. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_knowledge_fusion_ann.py +0 -0
  598. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_knowledge_hook.py +0 -0
  599. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_knowledge_indexer.py +0 -0
  600. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_knowledge_links.py +0 -0
  601. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_knowledge_media.py +0 -0
  602. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_knowledge_salience.py +0 -0
  603. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_knowledge_single_writer.py +0 -0
  604. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_knowledge_subsystem.py +0 -0
  605. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_knowledge_vectors.py +0 -0
  606. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_layout.py +0 -0
  607. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_logging_utils.py +0 -0
  608. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_loop.py +0 -0
  609. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_loop_hooks.py +0 -0
  610. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_loop_observability.py +0 -0
  611. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_loop_transcript.py +0 -0
  612. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_mcp_client.py +0 -0
  613. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_memory_layout_migrate.py +0 -0
  614. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_message_pipeline.py +0 -0
  615. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_mocks_realtime_provider.py +0 -0
  616. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_patch.py +0 -0
  617. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_path_grant_inspector.py +0 -0
  618. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_path_safety.py +0 -0
  619. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_permission.py +0 -0
  620. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_pricing.py +0 -0
  621. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_progress_publish.py +0 -0
  622. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_progress_tracker.py +0 -0
  623. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_prompt.py +0 -0
  624. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_provider_contract.py +0 -0
  625. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_provider_stream_mapper.py +0 -0
  626. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_realtime_loop.py +0 -0
  627. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_replace_fuzzy.py +0 -0
  628. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_run_command_parse.py +0 -0
  629. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_runs.py +0 -0
  630. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_runtime_config_snapshot.py +0 -0
  631. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_runtime_env.py +0 -0
  632. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_sandbox_executor.py +0 -0
  633. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_scheduled_loops.py +0 -0
  634. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_secret_egress.py +0 -0
  635. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_session_turn_locks.py +0 -0
  636. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_settlement.py +0 -0
  637. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_slash_skills.py +0 -0
  638. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_spill_dynamic.py +0 -0
  639. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_spill_inventory.py +0 -0
  640. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_storage_backends.py +0 -0
  641. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_subagent_proto.py +0 -0
  642. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_subagent_trace_propagation.py +0 -0
  643. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_subagent_worker_paths.py +0 -0
  644. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_terminal.py +0 -0
  645. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_thread_summary_wire.py +0 -0
  646. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_tool_def_schema.py +0 -0
  647. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_tool_integrity.py +0 -0
  648. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_tool_result_ingress.py +0 -0
  649. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_tool_shapers.py +0 -0
  650. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_transcript.py +0 -0
  651. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_truncated_tool_batch.py +0 -0
  652. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_usage.py +0 -0
  653. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_usage_migration.py +0 -0
  654. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_utterance_buffer.py +0 -0
  655. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_verifier_binding.py +0 -0
  656. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_verifier_inspector.py +0 -0
  657. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_verifier_judge.py +0 -0
  658. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_verifier_mailbox_lifecycle.py +0 -0
  659. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_verifier_sticky_nudge.py +0 -0
  660. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_worker_pool.py +0 -0
  661. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_workspace_extra_read_roots.py +0 -0
  662. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_workspace_layout.py +0 -0
  663. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_workspace_symlinks.py +0 -0
  664. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/test_workspace_write_scope.py +0 -0
  665. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/workspace/test_factory.py +0 -0
  666. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/workspace/test_local_storage.py +0 -0
  667. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/core/workspace/test_protocol_contract.py +0 -0
  668. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/evals/__init__.py +0 -0
  669. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/evals/eval_hook.py +0 -0
  670. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/evals/scenario_runner.py +0 -0
  671. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/evals/scenarios/memory_wake_up_large.yaml +0 -0
  672. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/evals/scenarios/memory_write_inject.yaml +0 -0
  673. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/evals/scenarios/subagent_roundtrip.yaml +0 -0
  674. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_glob_grep.yaml +0 -0
  675. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_load_file.yaml +0 -0
  676. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_loops.yaml +0 -0
  677. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_read.yaml +0 -0
  678. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_replace_apply_patch.yaml +0 -0
  679. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_run_command.yaml +0 -0
  680. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_search_knowledge.yaml +0 -0
  681. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_search_memory.yaml +0 -0
  682. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_todo_list.yaml +0 -0
  683. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_web_search.yaml +0 -0
  684. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_write.yaml +0 -0
  685. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/evals/scenarios/turn_completion.yaml +0 -0
  686. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/evals/test_agent_behavior.py +0 -0
  687. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/evals/test_memory_knowledge_routing.py +0 -0
  688. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/evals/test_verifier_port.py +0 -0
  689. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/__init__.py +0 -0
  690. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/realtime/__init__.py +0 -0
  691. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/realtime/test_app.py +0 -0
  692. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/realtime/test_deps.py +0 -0
  693. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/realtime/test_guardrails.py +0 -0
  694. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/realtime/test_manager.py +0 -0
  695. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/realtime/test_metrics.py +0 -0
  696. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/realtime/test_routes_client_text.py +0 -0
  697. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/realtime/test_session.py +0 -0
  698. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/realtime/test_wire.py +0 -0
  699. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/sse/test_attachments.py +0 -0
  700. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/sse/test_config_reload.py +0 -0
  701. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/sse/test_create_session_model.py +0 -0
  702. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/sse/test_gateway_runtime.py +0 -0
  703. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/sse/test_routes.py +0 -0
  704. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/sse/test_scheduler_routes.py +0 -0
  705. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/sse/test_session_bus.py +0 -0
  706. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/sse/test_transcript_wiring.py +0 -0
  707. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/test_otel_fastapi.py +0 -0
  708. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/test_otel_lifespan.py +0 -0
  709. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/test_pending_response_endpoints.py +0 -0
  710. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/test_realtime_main.py +0 -0
  711. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/test_resolve_provider.py +0 -0
  712. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/test_sse_events.py +0 -0
  713. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/gateway/test_subagent_event_publisher.py +0 -0
  714. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/integration/__init__.py +0 -0
  715. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/integration/test_mb_e2e_simple_reply.py +0 -0
  716. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/integration/test_observability_integration.py +0 -0
  717. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/integration/test_prompt_caching_integration.py +0 -0
  718. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/observability/conftest.py +0 -0
  719. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/observability/test_init.py +0 -0
  720. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/observability/test_instrumentation.py +0 -0
  721. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/observability/test_loop_hook_spans.py +0 -0
  722. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/observability/test_propagation.py +0 -0
  723. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/observability/test_span_contract.py +0 -0
  724. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/observability/test_spans.py +0 -0
  725. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/observability/test_sqlite_exporter.py +0 -0
  726. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/observability/test_truncate.py +0 -0
  727. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/observability/test_turn_complete_trace.py +0 -0
  728. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/conftest.py +0 -0
  729. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/test_anthropic_cache.py +0 -0
  730. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/test_anthropic_history.py +0 -0
  731. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/test_bedrock_converse.py +0 -0
  732. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/test_bedrock_estimate.py +0 -0
  733. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/test_gemini_history.py +0 -0
  734. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/test_gemini_live.py +0 -0
  735. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/test_gemini_usage.py +0 -0
  736. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/test_huggingface.py +0 -0
  737. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/test_model_capabilities.py +0 -0
  738. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/test_nvidia.py +0 -0
  739. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/test_ollama.py +0 -0
  740. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/test_openai_byte_budget.py +0 -0
  741. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/test_openai_compat_usage.py +0 -0
  742. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/test_openai_history.py +0 -0
  743. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/test_pricing.py +0 -0
  744. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/test_request_budget.py +0 -0
  745. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/test_safe_parse_tool_args.py +0 -0
  746. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/test_sampling.py +0 -0
  747. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/test_sonnet5_sampling.py +0 -0
  748. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/test_source_grep_gates.py +0 -0
  749. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/providers/test_vertex_claude_history.py +0 -0
  750. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/scheduler/test_engine.py +0 -0
  751. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/scheduler/test_interval.py +0 -0
  752. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/skills/__init__.py +0 -0
  753. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/skills/test_generate_image_script.py +0 -0
  754. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/test_cold_start.py +0 -0
  755. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/test_packaging_config.py +0 -0
  756. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/test_release_script.py +0 -0
  757. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/todo_list/test_todo_list.py +0 -0
  758. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/web_search/__init__.py +0 -0
  759. {monkeybot-3.5.0 → monkeybot-3.6.1}/tests/web_search/test_web_search.py +0 -0
  760. {monkeybot-3.5.0 → monkeybot-3.6.1}/uv.lock +0 -0
@@ -6,6 +6,25 @@ the project adheres to [Semantic Versioning](https://semver.org/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [core v3.6.1] - 2026-09-26
10
+
11
+ ### Fixed
12
+
13
+ - `run_command`'s macOS jail can launch onefile binaries that live under the home directory. Bundled `yt-dlp` needs to read its own executable and create a SysV semaphore; both were denied, so `/watch-video` died before any download.
14
+ - `run_command` can read an installed on-device Whisper model under the home directory, so `/watch-video` can transcribe with it.
15
+
16
+ ## [cli v0.8.0] - 2026-09-21
17
+
18
+ #### Added
19
+
20
+ - `monkeybot chat` prompts for an `ask_user` question and posts the reply to the gateway.
21
+
22
+ ## [core v3.6.0] - 2026-09-21
23
+
24
+ #### Added
25
+
26
+ - `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.
27
+
9
28
  ## [core v3.5.0] - 2026-09-20
10
29
 
11
30
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: monkeybot
3
- Version: 3.5.0
3
+ Version: 3.6.1
4
4
  Summary: monkeybot agent harness — FastAPI SSE gateway, owned loop, SQLite, and MCP.
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "monkeybot-cli"
7
- version = "0.7.0"
7
+ version = "0.8.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 {}
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "monkeybot"
7
- version = "3.5.0"
7
+ version = "3.6.1"
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"
@@ -691,6 +691,32 @@ def _core_tool_defs(
691
691
  "required": ["task"],
692
692
  }
693
693
  tools: list[ToolDef] = [
694
+ ToolDef(
695
+ "ask_user",
696
+ (
697
+ "Ask the user a question and wait for their answer. Call this when you "
698
+ "need a decision before you can continue. Pass choices when a short list "
699
+ "of answers would help. Call it once, then wait. Do not invent the answer."
700
+ ),
701
+ {
702
+ "type": "object",
703
+ "properties": {
704
+ "question": {
705
+ "type": "string",
706
+ "minLength": 1,
707
+ "description": "The question to show the user.",
708
+ },
709
+ "choices": {
710
+ "type": "array",
711
+ "minItems": 2,
712
+ "maxItems": 6,
713
+ "items": {"type": "string", "minLength": 1},
714
+ "description": "Optional distinct answers the user can pick.",
715
+ },
716
+ },
717
+ "required": ["question"],
718
+ },
719
+ ),
694
720
  ToolDef(
695
721
  "run_command",
696
722
  (
@@ -190,6 +190,15 @@ class ToolConfirmationRequestEvent:
190
190
  prompt: str | None = None
191
191
 
192
192
 
193
+ @dataclass(frozen=True)
194
+ class AskUserRequestEvent:
195
+ kind: Literal["AskUserRequest"] = "AskUserRequest"
196
+ request_id: str = ""
197
+ tool_call_id: str = ""
198
+ question: str = ""
199
+ choices: tuple[str, ...] = ()
200
+
201
+
193
202
  @dataclass(frozen=True)
194
203
  class ActionRequiredEvent:
195
204
  kind: Literal["ActionRequiredEvent"] = "ActionRequiredEvent"
@@ -469,6 +478,7 @@ AgentEvent: TypeAlias = (
469
478
  | ThinkingBlockComplete
470
479
  | RedactedThinkingBlock
471
480
  | ToolConfirmationRequestEvent
481
+ | AskUserRequestEvent
472
482
  | ActionRequiredEvent
473
483
  | FrontendToolRequestEvent
474
484
  | SystemNotificationEvent
@@ -697,6 +707,13 @@ def _story5_event_dict(event: AgentEvent) -> dict[str, object]:
697
707
  "arguments": dict(event.arguments),
698
708
  "prompt": event.prompt,
699
709
  }
710
+ if isinstance(event, AskUserRequestEvent):
711
+ return {
712
+ **base,
713
+ "tool_call_id": event.tool_call_id,
714
+ "question": event.question,
715
+ "choices": list(event.choices),
716
+ }
700
717
  if isinstance(event, ActionRequiredEvent):
701
718
  return {
702
719
  **base,
@@ -877,6 +894,7 @@ def event_to_json(event: AgentEvent) -> str:
877
894
  ThinkingBlockComplete,
878
895
  RedactedThinkingBlock,
879
896
  ToolConfirmationRequestEvent,
897
+ AskUserRequestEvent,
880
898
  ActionRequiredEvent,
881
899
  FrontendToolRequestEvent,
882
900
  SystemNotificationEvent,
@@ -1097,6 +1115,20 @@ def _event_from_dict(payload: dict[str, Any]) -> AgentEvent:
1097
1115
  arguments=arguments,
1098
1116
  prompt=prompt,
1099
1117
  )
1118
+ if t == "AskUserRequest":
1119
+ call_raw = payload.get("tool_call_id", "")
1120
+ question_raw = payload.get("question", "")
1121
+ choices_raw = payload.get("choices", [])
1122
+ if not isinstance(call_raw, str) or not isinstance(question_raw, str):
1123
+ raise EventDecodeError("AskUserRequest fields must be strings")
1124
+ if not isinstance(choices_raw, list) or any(not isinstance(item, str) for item in choices_raw):
1125
+ raise EventDecodeError("AskUserRequest choices must be a list of strings")
1126
+ return AskUserRequestEvent(
1127
+ request_id=rid,
1128
+ tool_call_id=call_raw,
1129
+ question=question_raw,
1130
+ choices=tuple(choices_raw),
1131
+ )
1100
1132
  if t == "ActionRequiredEvent":
1101
1133
  at_raw = payload.get("action_type", "elicitation")
1102
1134
  if at_raw not in ("elicitation", "toolConfirmation", "elicitationResponse"):
@@ -0,0 +1,75 @@
1
+ """ask_user: a structured question the host answers before the tool returns."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ from monkeybot.core.runtime.events import AskUserRequestEvent, event_to_json
8
+
9
+ _MAX_QUESTION = 2_000
10
+ _MAX_CHOICE = 160
11
+ _MIN_CHOICES = 2
12
+ _MAX_CHOICES = 6
13
+
14
+
15
+ def parse_ask_user_args(args: dict[str, Any]) -> tuple[str, tuple[str, ...]] | str:
16
+ """Return ``(question, choices)`` or an error string."""
17
+ raw_question = args.get("question")
18
+ question = raw_question.strip() if isinstance(raw_question, str) else ""
19
+ if not question:
20
+ return "ask_user requires a non-empty question"
21
+ if len(question) > _MAX_QUESTION:
22
+ question = question[:_MAX_QUESTION]
23
+ raw_choices = args.get("choices")
24
+ if raw_choices is None:
25
+ return question, ()
26
+ if not isinstance(raw_choices, list):
27
+ return "ask_user choices must be a list of strings"
28
+ choices: list[str] = []
29
+ for item in raw_choices:
30
+ if not isinstance(item, str) or not item.strip():
31
+ return "ask_user choices must be non-empty strings"
32
+ text = item.strip()
33
+ if len(text) > _MAX_CHOICE:
34
+ return "ask_user choices must be short"
35
+ if text in choices:
36
+ return "ask_user choices must be unique"
37
+ choices.append(text)
38
+ if len(choices) < _MIN_CHOICES or len(choices) > _MAX_CHOICES:
39
+ return f"ask_user choices must include {_MIN_CHOICES} to {_MAX_CHOICES} options"
40
+ return question, tuple(choices)
41
+
42
+
43
+ async def await_ask_user_answer(
44
+ bus: Any,
45
+ *,
46
+ call_id: str,
47
+ request_id: str,
48
+ question: str,
49
+ choices: tuple[str, ...],
50
+ ) -> str | None:
51
+ """Publish the question and wait until the host posts an answer.
52
+
53
+ Returns the answer, or ``None`` when this session cannot ask.
54
+ ``asyncio.CancelledError`` propagates when the turn is stopped.
55
+ """
56
+ publish = getattr(bus, "publish_data", None)
57
+ register = getattr(bus, "register_pending", None)
58
+ if publish is None or register is None or not call_id:
59
+ return None
60
+ fut = register(call_id)
61
+ await publish(
62
+ event_to_json(
63
+ AskUserRequestEvent(
64
+ request_id=request_id,
65
+ tool_call_id=call_id,
66
+ question=question,
67
+ choices=choices,
68
+ )
69
+ )
70
+ )
71
+ payload = await fut
72
+ if not isinstance(payload, dict):
73
+ return ""
74
+ answer = payload.get("answer")
75
+ return answer.strip() if isinstance(answer, str) else ""
@@ -96,7 +96,13 @@ from monkeybot.core.subprocess_groups import (
96
96
  process_group_id,
97
97
  stop_subagent_process,
98
98
  )
99
- from monkeybot.core.tools.fs_isolation import JailRoots, memory_hidden_paths
99
+ from monkeybot.core.tools.ask_user import await_ask_user_answer, parse_ask_user_args
100
+ from monkeybot.core.tools.fs_isolation import (
101
+ JailRoots,
102
+ local_whisper_model_dirs,
103
+ memory_hidden_paths,
104
+ readable_bin_dirs_under_deny,
105
+ )
100
106
  from monkeybot.core.tools.grant_store import PATH_GRANT_TOOLS, GrantStoreCache
101
107
  from monkeybot.core.tools.inspector import parse_run_command
102
108
  from monkeybot.core.tools.sandbox_executor import SandboxConfig, SandboxExecutor
@@ -159,6 +165,7 @@ _CORE_TOOL_NAMES = frozenset(
159
165
  "stop_loop",
160
166
  "create_goal",
161
167
  "update_goal",
168
+ "ask_user",
162
169
  }
163
170
  )
164
171
 
@@ -1173,6 +1180,8 @@ class CoreToolExecutor(ToolExecutorPort):
1173
1180
  result_text, err_text = await self._tool_create_goal(args, ctx)
1174
1181
  elif name == "update_goal":
1175
1182
  result_text, err_text = await self._tool_update_goal(args, ctx)
1183
+ elif name == "ask_user":
1184
+ result_text, err_text = await self._tool_ask_user(args, call, ctx)
1176
1185
  elif name in self._extra_tools:
1177
1186
  try:
1178
1187
  raw = await self._extra_tools[name].execute(args)
@@ -1920,8 +1929,11 @@ class CoreToolExecutor(ToolExecutorPort):
1920
1929
  a sibling of the workspace, not under it), OS temp dirs (read+write,
1921
1930
  many toolchains stage there), skills and the interpreter's own
1922
1931
  install prefix (read-only — the interpreter can live under $HOME for
1923
- a bundled desktop app), and any folder the user has granted read
1924
- access to, durably or for this turn (read-only).
1932
+ a bundled desktop app), PATH ``bin`` directories that sit inside the
1933
+ denied home (read-only — onefile tools such as bundled ``yt-dlp``
1934
+ have to read their own executable), an installed on-device Whisper
1935
+ model directory (read-only), and any folder the user has
1936
+ granted read access to, durably or for this turn (read-only).
1925
1937
  """
1926
1938
  read_write: list[Path] = [self._workspace.repo_root]
1927
1939
  if self._artifacts_path is not None:
@@ -1954,6 +1966,8 @@ class CoreToolExecutor(ToolExecutorPort):
1954
1966
  deny: list[Path] = []
1955
1967
  with contextlib.suppress(RuntimeError):
1956
1968
  deny.append(Path.home())
1969
+ read_only.extend(readable_bin_dirs_under_deny(deny))
1970
+ read_only.extend(local_whisper_model_dirs(deny=deny))
1957
1971
 
1958
1972
  return JailRoots(
1959
1973
  read_write=tuple(dict.fromkeys(p.resolve() for p in read_write)),
@@ -2508,3 +2522,26 @@ class CoreToolExecutor(ToolExecutorPort):
2508
2522
  ),
2509
2523
  None,
2510
2524
  )
2525
+
2526
+ async def _tool_ask_user(
2527
+ self, args: dict[str, Any], call: ToolCall, ctx: TurnContext
2528
+ ) -> tuple[str | None, str | None]:
2529
+ parsed = parse_ask_user_args(args)
2530
+ if isinstance(parsed, str):
2531
+ return (None, parsed)
2532
+ question, choices = parsed
2533
+ bus = ctx.sse_bus
2534
+ if bus is None:
2535
+ return (None, "ask_user is only available in an interactive chat")
2536
+ answer = await await_ask_user_answer(
2537
+ bus,
2538
+ call_id=call.call_id,
2539
+ request_id=ctx.request_id,
2540
+ question=question,
2541
+ choices=choices,
2542
+ )
2543
+ if answer is None:
2544
+ return (None, "ask_user is only available in an interactive chat")
2545
+ if not answer:
2546
+ return (None, "ask_user received an empty answer")
2547
+ return (_j({"answer": answer}), None)
@@ -27,8 +27,10 @@ profile instead: read is allowed everywhere except a set of ``deny`` roots
27
27
  (the user's home directory, primarily), read+write is granted on top for a
28
28
  small set of ``read_write`` roots (the workspace, artifacts, memory palace,
29
29
  OS temp dirs), and read-only for ``read_only`` roots (skills, the interpreter
30
- prefix, granted folders) even when those happen to sit inside a denied root —
31
- which is the common case for a desktop app whose workspace and bundled
30
+ prefix, granted folders, ``bin`` directories already on ``PATH``, and an
31
+ installed on-device Whisper model directory) even
32
+ when those happen to sit inside a denied root — which is the common case
33
+ for a desktop app whose workspace and bundled
32
34
  Python both live under the user's home directory. Validated empirically
33
35
  against real `python3`, `git`, `uv`, and `bash` invocations under
34
36
  `sandbox-exec` on macOS; the Linux mount-namespace path follows the same
@@ -46,7 +48,7 @@ import os
46
48
  import subprocess
47
49
  import sys
48
50
  import tempfile
49
- from collections.abc import Sequence
51
+ from collections.abc import Mapping, Sequence
50
52
  from dataclasses import dataclass
51
53
  from pathlib import Path
52
54
 
@@ -421,6 +423,150 @@ def _resolved_strs(paths: Sequence[Path]) -> list[str]:
421
423
  return [str(Path(p).expanduser().resolve()) for p in paths]
422
424
 
423
425
 
426
+ def _is_strict_child(path: Path, root: Path) -> bool:
427
+ try:
428
+ path.relative_to(root)
429
+ except ValueError:
430
+ return False
431
+ return path != root
432
+
433
+
434
+ def _resolved_deny_roots(deny: Sequence[Path]) -> list[Path]:
435
+ roots: list[Path] = []
436
+ for root in deny:
437
+ try:
438
+ roots.append(Path(root).expanduser().resolve())
439
+ except (OSError, RuntimeError):
440
+ continue
441
+ return roots
442
+
443
+
444
+ def readable_bin_dirs_under_deny(
445
+ deny: Sequence[Path],
446
+ *,
447
+ path_env: str | None = None,
448
+ ) -> tuple[Path, ...]:
449
+ """PATH ``bin`` directories that sit strictly inside a denied root.
450
+
451
+ Onefile bootloaders exec, then ``open()`` their own file to read the
452
+ embedded archive. ``process-exec`` is allowed, but file-read under the
453
+ denied home directory is not, so that open fails ("Could not load
454
+ PyInstaller's embedded PKG archive") unless the binary's directory is an
455
+ explicit read-only root. Only directories whose final component is
456
+ ``bin`` qualify, and a PATH entry of the deny root itself is ignored so
457
+ ``$HOME`` on PATH cannot reopen the whole tree.
458
+ """
459
+ if path_env is None:
460
+ path_env = os.environ.get("PATH", "")
461
+ deny_roots = _resolved_deny_roots(deny)
462
+ if not deny_roots:
463
+ return ()
464
+ found: list[Path] = []
465
+ seen: set[Path] = set()
466
+ for part in path_env.split(os.pathsep):
467
+ part = part.strip()
468
+ if not part:
469
+ continue
470
+ try:
471
+ path = Path(part).expanduser().resolve()
472
+ except (OSError, RuntimeError):
473
+ continue
474
+ if path.name != "bin" or not path.is_dir():
475
+ continue
476
+ if _SEATBELT_PATH_METACHARS.intersection(str(path)):
477
+ logger.debug("skipping PATH bin dir with seatbelt metacharacters: %s", path)
478
+ continue
479
+ if not any(_is_strict_child(path, root) for root in deny_roots):
480
+ continue
481
+ if path in seen:
482
+ continue
483
+ seen.add(path)
484
+ found.append(path)
485
+ return tuple(found)
486
+
487
+
488
+ def _nonempty_file(path: Path) -> bool:
489
+ try:
490
+ return path.is_file() and path.stat().st_size > 0
491
+ except OSError as exc:
492
+ logger.debug("skipping whisper model file %s: %s", path, exc)
493
+ return False
494
+
495
+
496
+ def _whisper_weights_present(model_dir: Path) -> bool:
497
+ try:
498
+ return any(_nonempty_file(path) for path in model_dir.glob("ggml-*.bin"))
499
+ except OSError as exc:
500
+ logger.debug("skipping whisper model dir %s: %s", model_dir, exc)
501
+ return False
502
+
503
+
504
+ def local_whisper_model_dirs(
505
+ *,
506
+ home: Path | None = None,
507
+ env: Mapping[str, str] | None = None,
508
+ deny: Sequence[Path] = (),
509
+ ) -> tuple[Path, ...]:
510
+ """Directories holding an installed on-device Whisper ggml model.
511
+
512
+ ``run_command`` denies file-read under the home directory, and
513
+ ``whisper-cli`` has to open the weights. Only the model file's parent
514
+ is granted, and only when a ``ggml-*.bin`` weights file is actually
515
+ there — an uninstalled model adds nothing. A directory that is, or
516
+ contains, a ``deny`` root is never granted, so ``WHISPER_MODEL=~/ggml-x.bin``
517
+ cannot reopen the whole home directory.
518
+ """
519
+ values = os.environ if env is None else env
520
+ deny_roots = _resolved_deny_roots(deny)
521
+ found: list[Path] = []
522
+ seen: set[Path] = set()
523
+
524
+ def _add(path: Path) -> None:
525
+ try:
526
+ resolved = path.expanduser().resolve()
527
+ except (OSError, RuntimeError) as exc:
528
+ logger.debug("skipping whisper model path %s: %s", path, exc)
529
+ return
530
+ if not resolved.is_dir():
531
+ return
532
+ if _SEATBELT_PATH_METACHARS.intersection(str(resolved)):
533
+ logger.debug(
534
+ "skipping whisper model dir with seatbelt metacharacters: %s",
535
+ resolved,
536
+ )
537
+ return
538
+ if any(root.is_relative_to(resolved) for root in deny_roots):
539
+ logger.debug("skipping whisper model dir that would expose a deny root: %s", resolved)
540
+ return
541
+ if resolved in seen:
542
+ return
543
+ seen.add(resolved)
544
+ found.append(resolved)
545
+
546
+ explicit = (values.get("WHISPER_MODEL") or "").strip()
547
+ if explicit:
548
+ model = Path(explicit).expanduser()
549
+ if model.match("ggml-*.bin") and _nonempty_file(model):
550
+ _add(model.parent)
551
+
552
+ raw_home = (values.get("MONKEYBOT_HOME") or "").strip()
553
+ if raw_home:
554
+ base = Path(raw_home).expanduser()
555
+ elif home is not None:
556
+ base = home
557
+ else:
558
+ try:
559
+ base = Path.home() / ".monkeybot"
560
+ except RuntimeError as exc:
561
+ logger.debug("whisper model dir lookup skipped: %s", exc)
562
+ base = None
563
+ if base is not None:
564
+ model_dir = base / "models" / "whisper"
565
+ if _whisper_weights_present(model_dir):
566
+ _add(model_dir)
567
+ return tuple(found)
568
+
569
+
424
570
  def _seatbelt_jail_profile(roots: JailRoots) -> str:
425
571
  deny = _resolved_strs(roots.deny)
426
572
  read_write = _resolved_strs(roots.read_write)
@@ -439,6 +585,10 @@ def _seatbelt_jail_profile(roots: JailRoots) -> str:
439
585
  "(allow sysctl-read)",
440
586
  "(allow file-read-metadata)",
441
587
  "(allow ipc-posix-shm)",
588
+ # PyInstaller onefile bootloaders (bundled yt-dlp) call semctl while
589
+ # unpacking. process-exec alone is not enough; without this the
590
+ # binary dies with "Failed to initialize sync semaphore".
591
+ "(allow ipc-sysv-sem)",
442
592
  ]
443
593
  if deny:
444
594
  lines.append(f'(allow file-read* (require-all (subpath "/") {deny_excludes}))')
@@ -144,6 +144,12 @@ class ToolConfirmationPOST(BaseModel):
144
144
  """When true with approved, remember this tool+resource for the rest of the session."""
145
145
 
146
146
 
147
+ class AskUserPOST(BaseModel):
148
+ """POST /sessions/{id}/ask-user/{tool_call_id} body."""
149
+
150
+ answer: str
151
+
152
+
147
153
  class ElicitationPOST(BaseModel):
148
154
  """POST /sessions/{id}/elicitations/{id} body."""
149
155
 
@@ -48,6 +48,7 @@ from .models import (
48
48
  AdmissionAcceptedResponse,
49
49
  AgentUsageResponse,
50
50
  APIError,
51
+ AskUserPOST,
51
52
  AttachmentUploadResponse,
52
53
  CancelRequest,
53
54
  CreateSessionRequest,
@@ -1065,6 +1066,44 @@ def create_app(
1065
1066
  )
1066
1067
  return {"ok": True}
1067
1068
 
1069
+ @api.post("/sessions/{session_id}/ask-user/{tool_call_id}", status_code=202)
1070
+ async def post_ask_user(
1071
+ session_id: str,
1072
+ tool_call_id: str,
1073
+ body: AskUserPOST,
1074
+ reg_dep: SessionRegistry = Depends(get_registry),
1075
+ ) -> dict[str, bool]:
1076
+ rid = uuid.uuid4().hex
1077
+ answer = body.answer.strip()
1078
+ if not answer:
1079
+ raise APIError(400, "EMPTY_ANSWER", "ask_user requires a non-empty answer", rid)
1080
+ bus = reg_dep.get(session_id)
1081
+ if bus is None:
1082
+ raise APIError(404, "SESSION_NOT_FOUND", "Unknown session", rid)
1083
+ state = bus.is_pending_or_terminal(tool_call_id)
1084
+ if state == "unknown":
1085
+ raise APIError(
1086
+ 404,
1087
+ "PENDING_UNKNOWN",
1088
+ "Pending response id is not registered for this session",
1089
+ rid,
1090
+ )
1091
+ if state == "terminated":
1092
+ raise APIError(
1093
+ 409,
1094
+ "STALE_PENDING_RESPONSE",
1095
+ "This pending response was already resolved, cancelled, or timed out",
1096
+ rid,
1097
+ )
1098
+ if not bus.resolve_pending(tool_call_id, {"answer": answer}):
1099
+ raise APIError(
1100
+ 409,
1101
+ "STALE_PENDING_RESPONSE",
1102
+ "This pending response was already resolved, cancelled, or timed out",
1103
+ rid,
1104
+ )
1105
+ return {"ok": True}
1106
+
1068
1107
  @api.post("/sessions/{session_id}/elicitations/{elicitation_id}", status_code=202)
1069
1108
  async def post_elicitation(
1070
1109
  session_id: str,