monkeybot 3.6.1__tar.gz → 3.7.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.
- {monkeybot-3.6.1 → monkeybot-3.7.0}/CHANGELOG.md +19 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/PKG-INFO +1 -1
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/scaffold_defaults/browser/SKILL.md +3 -2
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/scaffold_defaults/monkeybot.example.yaml +8 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/browser-mcp.md +9 -4
- {monkeybot-3.6.1 → monkeybot-3.7.0}/examples/skills/browser/SKILL.md +1 -1
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/pyproject.toml +1 -1
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/app.py +42 -12
- monkeybot-3.7.0/integrations/browser-mcp/src/browser_mcp/backend.py +257 -0
- monkeybot-3.7.0/integrations/browser-mcp/src/browser_mcp/chat_context.py +375 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/chat_scope.py +27 -41
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/in_app_cdp.py +59 -9
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/login.py +3 -3
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/server.py +21 -1
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/tab_ops.py +45 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/tabs.py +8 -7
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/tools/tab_control.py +3 -2
- monkeybot-3.7.0/integrations/browser-mcp/tests/conftest.py +16 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/fixtures/tool_surface.json +1 -1
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/integration/conftest.py +5 -5
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/integration/test_multi_tab.py +5 -5
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/test_act.py +7 -7
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/test_agentcore.py +37 -30
- monkeybot-3.7.0/integrations/browser-mcp/tests/test_chat_isolation.py +369 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/test_chat_scope.py +41 -24
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/test_fill_form.py +7 -7
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/test_in_app_cdp.py +18 -19
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/test_indexed_tools.py +7 -7
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/test_observe.py +7 -7
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/test_observe_after.py +7 -7
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/test_perf.py +8 -8
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/test_playbook_flows.py +7 -7
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/test_server_shutdown.py +15 -15
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/test_tabs.py +9 -9
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/test_wait_tools.py +5 -5
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/uv.lock +1 -1
- {monkeybot-3.6.1 → monkeybot-3.7.0}/pyproject.toml +1 -1
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/config/runtime_env.py +13 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/config/snapshot.py +10 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/context/__init__.py +70 -1
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/runtime/turn_loop.py +163 -6
- monkeybot-3.7.0/src/monkeybot/core/tools/background_jobs.py +285 -0
- monkeybot-3.7.0/src/monkeybot/core/tools/command_executor.py +73 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/tools/core_tool_executor.py +227 -6
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/tools/sandbox_executor.py +410 -31
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/tools/terminal.py +288 -36
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/tools/tool_kind.py +2 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/realtime/routes.py +7 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/sse/app.py +10 -1
- monkeybot-3.7.0/tests/core/test_background_jobs.py +531 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_context.py +2 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_doom_loop.py +12 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/realtime/test_routes_client_text.py +3 -1
- {monkeybot-3.6.1 → monkeybot-3.7.0}/uv.lock +3 -3
- monkeybot-3.6.1/integrations/browser-mcp/src/browser_mcp/backend.py +0 -189
- {monkeybot-3.6.1 → monkeybot-3.7.0}/.dockerignore +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/.github/workflows/ci.yml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/.github/workflows/live-eval-smoke.yml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/.github/workflows/prepare-release.yml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/.github/workflows/publish-release.yml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/.gitignore +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/.pre-commit-config.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/BACKLOG.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/CONTRIBUTING.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/LICENSE +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/README.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/pyproject.toml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/skills/monkeybot/SKILL.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/skills/monkeybot/references/config-sections.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/chat_file_index.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/chat_local_shell.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/chat_renderer.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/chat_session.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/chat_status_bar.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/chat_theme.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/chat_tool_display.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/chat_tui.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/chat_tui_widgets.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/commands/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/commands/chat.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/commands/doctor.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/commands/loop.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/commands/new.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/commands/refresh.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/commands/run_cmd.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/commands/talk.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/commands/validate.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/compat.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/config_resolve.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/exit_commands.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/extras_catalog.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/gateway_health.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/main.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/opensandbox_lifecycle.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/output.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/process_tree.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/providers.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/realtime/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/realtime/audio_io.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/realtime/client.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/realtime/gateway_manager.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/realtime/push_to_talk.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/realtime/session.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/realtime/session_controller.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/realtime/talk_ui.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/realtime/wire_encode.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/runtime_python.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/scaffold.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/scaffold_defaults/AGENT.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/scaffold_defaults/Dockerfile +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/scaffold_defaults/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/scaffold_defaults/command_allowlist.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/scaffold_defaults/dockerignore +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/scaffold_defaults/env.example +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/scaffold_defaults/goal/SKILL.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/scaffold_defaults/image-generator/SKILL.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/scaffold_defaults/image-generator/generate_image.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/scaffold_defaults/loop/SKILL.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/scaffold_defaults/mcp.json +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/scaffold_defaults/opensandbox.docker.toml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/scaffold_defaults/otel-collector.example.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/scaffold_defaults/permissions.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/session_controller.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/terminal_markdown.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_chat_continue.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_chat_e2e.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_chat_errors.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_chat_file_index.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_chat_grounding.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_chat_local_shell.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_chat_renderer_parity.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_chat_session.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_chat_status_bar.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_chat_theme.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_chat_tool_display.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_chat_tui.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_cli.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_config_resolve.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_doctor.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_extras_catalog.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_gateway_health.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_opensandbox_lifecycle.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_realtime_session_controller.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_run_cmd.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_runtime_python.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_scaffold.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/tests/test_terminal_markdown.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/cli/uv.lock +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docker/Dockerfile +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docker/demo-model.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docker/demo.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docker/docker-compose.sandbox.yml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docker/opensandbox.docker.toml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docker/sandbox.Dockerfile +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docker-compose.yml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/agent-layout.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/assets/logo.png +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/browser-mcp-perf-baseline.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/browser-mcp-performance-plan.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/cloud-deployment-design.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/deploy-aws-agentcore.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/deploy-pattern-a-container.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/deploy-pattern-b-serverless.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/deploy-pattern-c-agent-platform.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/deploy-pattern-d-realtime.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/features.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/getting-started.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/knowledge-layer-fixes.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/live-evals.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/mcp.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/memory-graph-split-plan.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/migrations/agent-scope-namespacing.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/migrations/memory-outbox.sql +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/observability-runbook.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/ollama-local.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/otel-collector.example.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/progressive-loop-tools.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/progressive-mcp-tools.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/skills.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/spill-dynamic-design.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/sse-gateway-ui.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/verifier-agent-design.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/docs/workspace-index-design.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/TEST_COVERAGE.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/assertions.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/baselines/smoke.json +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/baselines/smoke.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/diff.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/eval_config.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/models.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/persistence.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/report.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/runner.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/scenario_loader.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/scenarios/context/summarization_trigger.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/scenarios/drift/declares_done.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/scenarios/drift/path_constraint.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/scenarios/drift/preempt.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/scenarios/drift/repeat_correction.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/scenarios/drift/supersession.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/scenarios/mcp/get_prompt.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/scenarios/mcp/list_resources.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/scenarios/mcp/tool_invoke.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/scenarios/memory/recall_cross_session.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/scenarios/memory/recall_single_session.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/scenarios/multi_turn/task_tracking.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/scenarios/skills/skill_invocation.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/scenarios/subagents/dispatch_complete.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/scenarios/tools/core_read.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/scenarios/tools/core_read_error.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/scenarios/tools/core_run_command.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/scenarios/tools/core_run_command_sandbox.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/scenarios/tools/core_write.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/scorer.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/smoke_agent/.env.example +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/smoke_agent/.gitignore +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/smoke_agent/fixture_mcp_server.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/smoke_agent/monkeybot_config/AGENT.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/smoke_agent/monkeybot_config/command_allowlist.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/smoke_agent/monkeybot_config/mcp.json +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/smoke_agent/monkeybot_config/monkeybot.verifier-on.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/smoke_agent/monkeybot_config/monkeybot.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/smoke_agent/monkeybot_config/permissions.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/smoke_agent/pyproject.toml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/smoke_agent/skills/browser/SKILL.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/smoke_agent/uv.lock +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/smoke_agent/workspace/.gitkeep +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/smoke_agent/workspace/skills/browser/playbooks/.gitkeep +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/suites/drift.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/suites/smoke.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/test_assertions.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/test_diff.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/test_judge.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/test_report.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/test_runner_sse.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/evals/test_scorer.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/examples/README.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/examples/agentcore/handler.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/examples/agentcore/runtime_app.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/examples/agentengine/handler.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/examples/cloud-functions/main.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/examples/lambda/handler.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/examples/ollama/PrefixStable.Modelfile +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/examples/skills/browser/playbooks/.gitkeep +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/examples/skills/diagnostics/README.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/examples/skills/diagnostics/SKILL.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/examples/skills/diagnostics/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/examples/skills/diagnostics/diagnostics.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/examples/skills/image-generator/SKILL.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/examples/skills/image-generator/generate_image.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/scripts/agentcore_smoke.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/scripts/dump_tool_surface.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/scripts/perf_bench.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/actions.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/agentcore.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/assets/NOTICE.md +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/assets/dom_tree.js +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/assets/pa_driver.js +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/dom_indexing.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/observe.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/perf.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/playbooks.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/playwright_helpers.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/results.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/screenshots.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/tools/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/tools/batch.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/tools/capture.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/tools/interact.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/tools/navigate.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/tools/playbook.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/src/browser_mcp/tools/read.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/fixtures/api.json +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/fixtures/article.html +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/fixtures/cards.html +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/fixtures/form.html +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/fixtures/long_list.html +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/fixtures/spa.html +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/integration/test_act_observe.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/integration/test_driver_persist.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/integration/test_intent_tools.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/integration/test_observation.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/integration/test_run_playbook.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/integration/test_wait_for.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/test_dom_indexing.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/test_playbooks.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/test_playwright_helpers.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/test_screenshots.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/integrations/browser-mcp/tests/test_tool_surface.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/pytest.ini +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/scripts/create_schema.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/scripts/precommit-pytest.sh +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/scripts/release.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/scripts/smoke_global_cli.sh +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/cli/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/cli/__main__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/cli/audio_io.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/cli/gateway_manager.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/cli/main.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/cli/push_to_talk.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/cli/realtime_client.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/computer/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/computer/approvals.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/computer/permissions.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/computer/safety.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/computer/tools.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/attachments/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/attachments/catalog.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/attachments/config.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/attachments/freeze.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/attachments/image_preview.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/attachments/resolve.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/attachments/store.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/attachments/text.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/attachments/tools.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/bootstrap.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/config/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/config/realtime_config.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/config/settings.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/config/validation.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/config/yaml_loader.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/context/campaign_context.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/context/common.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/context/epoch.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/context/secret_egress.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/context/slash_skills.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/context/tool_output_policy.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/context/tool_result_ingress.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/context/tool_shapers.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/goals/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/goals/service.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/hooks/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/captions.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/chunking.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/config.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/embeddings/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/embeddings/base.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/embeddings/factory.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/embeddings/gemini.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/embeddings/nvidia.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/embeddings/openai_compat.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/embeddings/sanitize.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/evidence_guard.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/extractors.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/fusion.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/hook.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/indexer.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/links.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/salience.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/sqlite_index.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/subsystem.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/tool.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/knowledge/types.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/layout.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/llm/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/llm/provider.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/llm/realtime_provider.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/llm/usage.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/lockfile_names.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/logging_utils.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/mcp/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/mcp/mcp_client.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/mcp/ports_mcp.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/memory/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/memory/config.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/memory/hook.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/memory/ids.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/memory/ingest.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/memory/migrate_layout.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/memory/observability.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/memory/outbox.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/memory/palace.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/memory/subsystem.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/memory/uri.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/memory/writer.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/messages/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/messages/convert_provider.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/messages/tool_integrity.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/messages/transform_context.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/path_safety.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/persistence/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/persistence/backends.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/persistence/db.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/persistence/durable_runs.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/persistence/errors.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/persistence/firestore.indexes.json +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/persistence/firestore.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/persistence/firestore_scheduled_loops.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/persistence/goal_ledger.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/persistence/history.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/persistence/postgres.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/persistence/runs.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/persistence/scheduled_loops.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/persistence/session_turn_locks.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/persistence/sqlite.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/persistence/sqlite_backend.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/persistence/sqlite_vector.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/persistence/thread_summary.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/persistence/transcript.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/persistence/usage.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/persistence/usage_buckets.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/prompts/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/prompts/harness_prompt.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/prompts/headings.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/prompts/prompt.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/runtime/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/runtime/context_budget.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/runtime/doom_loop.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/runtime/events.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/runtime/history_compaction.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/runtime/input_admission.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/runtime/loop.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/runtime/loop_hooks.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/runtime/loop_messages.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/runtime/loop_ports.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/runtime/loop_usage.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/runtime/provider_stream_mapper.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/runtime/realtime_loop.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/runtime/tool_batch.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/runtime/tool_dispatch.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/runtime/utterance_buffer.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/subagents/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/subagents/progress_publish.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/subagents/subagent_proto.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/subagents/subagent_worker.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/subagents/worker_pool.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/subprocess_groups.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/testing/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/testing/mocks_provider.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/testing/mocks_realtime_provider.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/tools/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/tools/ask_user.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/tools/fs_isolation.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/tools/grant_store.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/tools/inspector.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/tools/loop_inspector.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/tools/patch.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/tools/path_grant_inspector.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/tools/permission.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/tools/spill_inventory.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/tools/text_normalize.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/tools/tool_hint.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/tools/types.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/tools/workspace_service.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/types/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/types/content_blocks.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/types/interfaces.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/types/types_tools.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/verifier/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/verifier/actuator.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/verifier/binding.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/verifier/classify.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/verifier/inspector.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/verifier/intervention.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/verifier/judge.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/verifier/ledger.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/verifier/mailbox.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/verifier/match.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/verifier/port.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/verifier/severity.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/verifier/tracker.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/workspace/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/workspace/factory.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/workspace/gcs.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/workspace/local.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/workspace/protocol.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/workspace/s3.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/core/workspace_layout.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/bootstrap.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/main.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/pending_response_bus.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/realtime/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/realtime/app.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/realtime/deps.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/realtime/errors.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/realtime/guardrails.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/realtime/manager.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/realtime/metrics.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/realtime/session.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/realtime/wire.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/realtime_main.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/sse/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/sse/goal_routes.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/sse/loop_port.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/sse/models.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/sse/reload.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/sse/reply_body.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/sse/request_storage.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/sse/routes.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/sse/scheduler_routes.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/sse/scheduler_wiring.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/sse/session_bus.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/sse/sse.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/gateway/sse/workspace_layout.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/observability/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/observability/_state.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/observability/instrumentation.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/observability/propagation.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/observability/spans.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/observability/sqlite_exporter.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/providers/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/providers/_bedrock_converse.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/providers/_openai_compat.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/providers/_utils.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/providers/bedrock.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/providers/claude.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/providers/gemini.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/providers/gemini_live.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/providers/huggingface.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/providers/model_capabilities.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/providers/nvidia.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/providers/ollama.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/providers/openai.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/providers/openrouter.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/providers/pricing.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/providers/request_budget.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/providers/sampling.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/providers/vertex_claude.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/scaffold/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/scheduler/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/scheduler/__main__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/scheduler/engine.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/scheduler/http_invoker.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/scheduler/interval.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/scheduler/tick_result.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/scheduler/worker.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/subagents/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/subagents/worker/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/subagents/worker/__main__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/todo_list/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/todo_list/store.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/todo_list/tool.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/web_search/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/web_search/backends/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/web_search/backends/duckduckgo.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/web_search/backends/firecrawl.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/web_search/backends/tavily.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/web_search/protocol.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/src/monkeybot/web_search/tool.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/acceptance/test_observability_acceptance.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/cli/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/cli/test_gateway_manager.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/cli/test_main.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/cli/test_push_to_talk.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/cli/test_realtime_client.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/computer/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/computer/test_approvals.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/computer/test_computer_tools.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/computer/test_package_init.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/computer/test_path_policy.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/computer/test_permissions.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/computer/test_subagent_exclusion.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/computer/test_wiring.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/conftest.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/fixtures/bitbucket_dc_style_pr.diff +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/memory/helpers.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/memory/in_memory_palace.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/memory/test_mempalace.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/memory/test_review_fixes.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_agent_layout.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_ask_user.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_attachment_freeze.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_attachment_store.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_bootstrap.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_config_extensions.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_content_blocks.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_context_budget.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_context_epoch.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_core_tool_executor.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_durable_events.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_durable_runs.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_empty_completion.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_env_map_grep_gates.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_events.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_evidence_guard.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_firestore_history.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_firestore_scheduled_loops.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_firestore_usage.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_fs_isolation.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_gemini_history_replay.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_goal_ledger.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_goal_persistence.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_goals.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_grant_store.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_harness_prompt.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_history.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_history_compaction_split.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_hooks.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_image_preview.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_input_admission.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_inspector.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_knowledge_chunking.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_knowledge_chunking_rank.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_knowledge_config.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_knowledge_embeddings.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_knowledge_fts.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_knowledge_fusion.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_knowledge_fusion_ann.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_knowledge_hook.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_knowledge_indexer.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_knowledge_links.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_knowledge_media.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_knowledge_salience.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_knowledge_single_writer.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_knowledge_subsystem.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_knowledge_vectors.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_layout.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_logging_utils.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_loop.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_loop_hooks.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_loop_observability.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_loop_transcript.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_mcp_client.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_memory_layout_migrate.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_message_pipeline.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_mocks_realtime_provider.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_patch.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_path_grant_inspector.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_path_safety.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_permission.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_pricing.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_progress_publish.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_progress_tracker.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_prompt.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_provider_contract.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_provider_stream_mapper.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_realtime_loop.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_replace_fuzzy.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_run_command_parse.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_runs.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_runtime_config_snapshot.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_runtime_env.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_sandbox_executor.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_scheduled_loops.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_secret_egress.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_session_turn_locks.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_settlement.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_slash_skills.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_spill_dynamic.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_spill_inventory.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_storage_backends.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_subagent_proto.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_subagent_trace_propagation.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_subagent_worker_paths.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_terminal.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_thread_summary_wire.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_tool_def_schema.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_tool_integrity.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_tool_result_ingress.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_tool_shapers.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_transcript.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_truncated_tool_batch.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_usage.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_usage_migration.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_utterance_buffer.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_verifier_binding.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_verifier_inspector.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_verifier_judge.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_verifier_mailbox_lifecycle.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_verifier_sticky_nudge.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_worker_pool.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_workspace_extra_read_roots.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_workspace_layout.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_workspace_symlinks.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/test_workspace_write_scope.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/workspace/test_factory.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/workspace/test_local_storage.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/core/workspace/test_protocol_contract.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/evals/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/evals/eval_hook.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/evals/scenario_runner.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/evals/scenarios/memory_wake_up_large.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/evals/scenarios/memory_write_inject.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/evals/scenarios/subagent_roundtrip.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/evals/scenarios/tool_glob_grep.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/evals/scenarios/tool_load_file.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/evals/scenarios/tool_loops.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/evals/scenarios/tool_read.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/evals/scenarios/tool_replace_apply_patch.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/evals/scenarios/tool_run_command.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/evals/scenarios/tool_search_knowledge.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/evals/scenarios/tool_search_memory.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/evals/scenarios/tool_todo_list.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/evals/scenarios/tool_web_search.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/evals/scenarios/tool_write.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/evals/scenarios/turn_completion.yaml +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/evals/test_agent_behavior.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/evals/test_memory_knowledge_routing.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/evals/test_verifier_port.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/realtime/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/realtime/test_app.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/realtime/test_deps.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/realtime/test_guardrails.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/realtime/test_manager.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/realtime/test_metrics.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/realtime/test_session.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/realtime/test_wire.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/sse/test_attachments.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/sse/test_config_reload.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/sse/test_create_session_model.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/sse/test_gateway_runtime.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/sse/test_routes.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/sse/test_scheduler_routes.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/sse/test_session_bus.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/sse/test_transcript_wiring.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/test_otel_fastapi.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/test_otel_lifespan.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/test_pending_response_endpoints.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/test_realtime_main.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/test_resolve_provider.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/test_sse_events.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/gateway/test_subagent_event_publisher.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/integration/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/integration/test_mb_e2e_simple_reply.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/integration/test_observability_integration.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/integration/test_prompt_caching_integration.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/observability/conftest.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/observability/test_init.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/observability/test_instrumentation.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/observability/test_loop_hook_spans.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/observability/test_propagation.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/observability/test_span_contract.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/observability/test_spans.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/observability/test_sqlite_exporter.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/observability/test_truncate.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/observability/test_turn_complete_trace.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/conftest.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/test_anthropic_cache.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/test_anthropic_history.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/test_bedrock_converse.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/test_bedrock_estimate.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/test_gemini_history.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/test_gemini_live.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/test_gemini_usage.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/test_huggingface.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/test_model_capabilities.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/test_nvidia.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/test_ollama.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/test_openai_byte_budget.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/test_openai_compat_usage.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/test_openai_history.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/test_pricing.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/test_request_budget.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/test_safe_parse_tool_args.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/test_sampling.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/test_sonnet5_sampling.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/test_source_grep_gates.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/providers/test_vertex_claude_history.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/scheduler/test_engine.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/scheduler/test_interval.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/skills/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/skills/test_generate_image_script.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/test_cold_start.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/test_packaging_config.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/test_release_script.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/todo_list/test_todo_list.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/web_search/__init__.py +0 -0
- {monkeybot-3.6.1 → monkeybot-3.7.0}/tests/web_search/test_web_search.py +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.7.0] - 2026-09-30
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- `run_command` can start a long command in the background and return `job_id` and `log_path` immediately. `await_command` pages its output until it exits, and `kill_command` stops it, on the local terminal and in the OpenSandbox executor. A turn cannot finish while a job is still running; leftover jobs are killed when the turn ends. The sandbox renews its lease while a job runs, up to the job time ceiling.
|
|
14
|
+
|
|
15
|
+
## [browser v0.8.1] - 2026-09-28
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
|
|
19
|
+
- The per-chat browser IPC router honors browser-harness 0.1.13's response timeout, so browser tools can drive the page again.
|
|
20
|
+
|
|
21
|
+
## [browser v0.8.0] - 2026-09-27
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
|
|
25
|
+
- Each Spaces chat gets its own browser daemon, tab registry, and lock, so simultaneous chats no longer restart each other or drop tab aliases. Local Chrome and AgentCore stay on one shared browser. An idle daemon stops after 15 minutes and keeps that chat's tab aliases for the next call.
|
|
26
|
+
- The per-chat tab cap is 10. When Spaces refuses a tab because the app-wide live-tab cap is full, the tool returns `tab_limit_reached` with `"scope": "app"` instead of this chat's limit.
|
|
27
|
+
|
|
9
28
|
## [core v3.6.1] - 2026-09-26
|
|
10
29
|
|
|
11
30
|
### Fixed
|
{monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/scaffold_defaults/browser/SKILL.md
RENAMED
|
@@ -34,8 +34,9 @@ only. Pass `expected_origin` so a login cannot land on the wrong site, and check
|
|
|
34
34
|
the returned `origin` before reporting success.
|
|
35
35
|
|
|
36
36
|
Tabs use aliases (`t1`, `t2`, …). Reads (`get_elements`, `page_info`, `js`,
|
|
37
|
-
`read_tabs`) never move focus; actions do. At most
|
|
38
|
-
if you hit the cap, ask the user which to close, then `browser_close_tab`.
|
|
37
|
+
`read_tabs`) never move focus; actions do. At most 10 agent-controlled tabs —
|
|
38
|
+
if you hit the cap, ask the user which to close, then `browser_close_tab`. If the
|
|
39
|
+
error scope is `app`, the Spaces window is full across chats, not this chat's cap. Close
|
|
39
40
|
tabs you opened. `browser_login` still targets the tab the user has focused.
|
|
40
41
|
|
|
41
42
|
Finish browser sessions with `browser_stop`.
|
{monkeybot-3.6.1 → monkeybot-3.7.0}/cli/src/monkeybot_cli/scaffold_defaults/monkeybot.example.yaml
RENAMED
|
@@ -241,6 +241,14 @@ sandbox:
|
|
|
241
241
|
server_url: http://localhost:18080
|
|
242
242
|
image: python:3.12
|
|
243
243
|
ttl_seconds: 1800
|
|
244
|
+
# Background command caps. Jobs longer than max_job_seconds fail and should
|
|
245
|
+
# move to a broker-owned build. renew_interval_seconds extends the worker
|
|
246
|
+
# while a job is running (0 renews once at start). await_* bounds await_command.
|
|
247
|
+
max_background_jobs: 4
|
|
248
|
+
max_job_seconds: 3300
|
|
249
|
+
renew_interval_seconds: 300
|
|
250
|
+
await_default_wait_seconds: 300
|
|
251
|
+
await_max_wait_seconds: 600
|
|
244
252
|
# Set false only for a remote sandbox server with no shared filesystem. It
|
|
245
253
|
# then runs compute-only commands and refuses workspace/skills file access.
|
|
246
254
|
shared_filesystem: true
|
|
@@ -191,9 +191,14 @@ synchronization layer.
|
|
|
191
191
|
|
|
192
192
|
## In-app bridge extensions
|
|
193
193
|
|
|
194
|
-
When the Spaces in-app browser is bound, each
|
|
195
|
-
|
|
196
|
-
|
|
194
|
+
When the Spaces in-app browser is bound, each chat gets its own harness daemon
|
|
195
|
+
and tab list (10 agent tabs). The daemon's CDP URL carries `run` and `chat`,
|
|
196
|
+
and the first bind also announces the chat for older apps. AgentCore and
|
|
197
|
+
Browser Use Cloud backends never send this and stay on one shared browser.
|
|
198
|
+
An idle chat's daemon stops after 15 minutes; its tab aliases stay so the next
|
|
199
|
+
call can reattach. If Spaces refuses a tab because the app-wide live-tab cap
|
|
200
|
+
is full, the tool returns `tab_limit_reached` with `"scope": "app"` (CDP error
|
|
201
|
+
code `-32010`) instead of this chat's limit of 10.
|
|
197
202
|
|
|
198
203
|
### MCP request meta
|
|
199
204
|
|
|
@@ -208,7 +213,7 @@ server then announces `chatKey` as `null`.
|
|
|
208
213
|
|
|
209
214
|
### `Monkeybot.setChatScope`
|
|
210
215
|
|
|
211
|
-
|
|
216
|
+
Once per daemon connection, after the harness binds and before other CDP
|
|
212
217
|
commands, the backend sends:
|
|
213
218
|
|
|
214
219
|
```json
|
|
@@ -67,7 +67,7 @@ Text-only models should never rely on screenshots for page understanding — use
|
|
|
67
67
|
|
|
68
68
|
Tabs have short aliases (`t1`, `t2`, …) or a name you pass to `browser_open_tab(alias=...)`. **Reads never move focus** (`browser_get_elements(tab=...)`, `browser_page_info`, `browser_js`, `browser_wait_for`, `browser_read_tabs`, `browser_extract`). **Actions do** (click, input, select, fill, fill_form, click_text, act, screenshot, …) because headed Chrome throttles timers and pauses painting in background tabs.
|
|
69
69
|
|
|
70
|
-
Open a second tab to compare pages, keep a form while reading docs, or fan out with `browser_read_tabs`. At most
|
|
70
|
+
Open a second tab to compare pages, keep a form while reading docs, or fan out with `browser_read_tabs`. At most 10 agent-controlled tabs (`BROWSER_MCP_MAX_TABS`). If you hit the cap, relay the returned list (aliases, titles, last-used) to the user, ask which to close, then `browser_close_tab` and retry — never close a tab without their confirmation. If the error scope is `app`, the Spaces window is full across chats; do not describe that as this chat's 10-tab cap. Close tabs you opened when done. Do not expect a background SPA to finish loading while unfocused. `browser_login` still targets the tab the **user** has focused, not `tab=`.
|
|
71
71
|
|
|
72
72
|
## After learning something non-obvious
|
|
73
73
|
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "monkeybot-browser-mcp"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.8.1"
|
|
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 = [
|
|
@@ -4,18 +4,17 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import functools
|
|
6
6
|
import inspect
|
|
7
|
-
import threading
|
|
8
7
|
from collections.abc import Callable
|
|
9
8
|
from dataclasses import dataclass
|
|
10
9
|
from typing import Any, ParamSpec
|
|
11
10
|
|
|
11
|
+
import anyio
|
|
12
12
|
from mcp.server.fastmcp import FastMCP
|
|
13
13
|
|
|
14
|
-
from browser_mcp import backend, in_app_cdp, perf, results, tab_ops, tabs
|
|
14
|
+
from browser_mcp import backend, chat_context, chat_scope, in_app_cdp, perf, results, tab_ops, tabs
|
|
15
15
|
from browser_mcp.observe import resolve_action_observe
|
|
16
16
|
|
|
17
17
|
_P = ParamSpec("_P")
|
|
18
|
-
_TOOL_LOCK = threading.RLock()
|
|
19
18
|
|
|
20
19
|
mcp = FastMCP(
|
|
21
20
|
"browser",
|
|
@@ -73,15 +72,34 @@ mcp = FastMCP(
|
|
|
73
72
|
"Actions (click, input, select, fill, click_text, act, screenshot, …) focus the tab first "
|
|
74
73
|
"because background tabs throttle timers and pause painting. Open a second "
|
|
75
74
|
"tab to compare pages, keep a form while reading docs, or fan out with "
|
|
76
|
-
"browser_read_tabs. At most
|
|
75
|
+
"browser_read_tabs. At most 10 agent-controlled tabs; if you hit the cap, "
|
|
77
76
|
"relay the returned tab list to the user, ask which to close, then "
|
|
78
77
|
"browser_close_tab and retry — never close a tab without their confirmation. "
|
|
78
|
+
"If the error's scope is \"app\", Spaces refused the tab because the window "
|
|
79
|
+
"is at its live-tab cap across chats; say that, and do not pretend the cap "
|
|
80
|
+
"is this chat's 10 tabs. "
|
|
79
81
|
"Close tabs you opened when done. Do not expect a background SPA to finish "
|
|
80
82
|
"loading while unfocused."
|
|
81
83
|
),
|
|
82
84
|
)
|
|
83
85
|
|
|
84
86
|
|
|
87
|
+
def _run_tool(ctx: chat_context.ChatContext, fn: Callable[_P, str], args: tuple[Any, ...], kwargs: dict[str, Any]) -> str:
|
|
88
|
+
"""Run one tool against ``ctx`` only. Other chats keep their own lock and daemon."""
|
|
89
|
+
tokens = chat_context.enter(ctx)
|
|
90
|
+
try:
|
|
91
|
+
with ctx.lock, perf.timed_tool(fn.__name__) as rec:
|
|
92
|
+
try:
|
|
93
|
+
result = fn(*args, **kwargs)
|
|
94
|
+
rec.observe(result)
|
|
95
|
+
return result
|
|
96
|
+
except Exception as exc:
|
|
97
|
+
rec.fail()
|
|
98
|
+
in_app_cdp._reraise_public_harness_error(exc)
|
|
99
|
+
finally:
|
|
100
|
+
chat_context.leave(tokens)
|
|
101
|
+
|
|
102
|
+
|
|
85
103
|
def _public_tool(fn: Callable[_P, str]) -> Callable[_P, str]:
|
|
86
104
|
"""Register-time wrapper that keeps CDP tokens out of tool failures.
|
|
87
105
|
|
|
@@ -89,23 +107,35 @@ def _public_tool(fn: Callable[_P, str]) -> Callable[_P, str]:
|
|
|
89
107
|
endpoint it connects to, and FastMCP turns any raised exception into
|
|
90
108
|
agent-visible ``ToolError`` text. Redacting inside individual helpers only
|
|
91
109
|
covers the call sites someone remembered, so every tool goes through here.
|
|
110
|
+
|
|
111
|
+
The object FastMCP calls is ``_async_entry`` (see ``server``): the thread
|
|
112
|
+
id is read on the event loop, then context lookup and the tool body run
|
|
113
|
+
in a worker under that chat's lock. Context lookup can wait out a daemon
|
|
114
|
+
shutdown, so it must not run on the loop. Direct calls stay synchronous
|
|
115
|
+
so tests can invoke tools without an event loop. Two chats therefore run
|
|
116
|
+
at the same time; one chat's calls stay ordered.
|
|
92
117
|
"""
|
|
93
118
|
|
|
94
119
|
@functools.wraps(fn)
|
|
95
120
|
def wrapper(*args: _P.args, **kwargs: _P.kwargs) -> str:
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
121
|
+
ctx = chat_context.context_for_call(chat_scope.current_thread_id())
|
|
122
|
+
return _run_tool(ctx, fn, args, kwargs)
|
|
123
|
+
|
|
124
|
+
@functools.wraps(fn)
|
|
125
|
+
async def async_entry(*args: _P.args, **kwargs: _P.kwargs) -> str:
|
|
126
|
+
thread_id = chat_scope.current_thread_id()
|
|
127
|
+
|
|
128
|
+
def run() -> str:
|
|
129
|
+
ctx = chat_context.context_for_call(thread_id)
|
|
130
|
+
return _run_tool(ctx, fn, args, kwargs)
|
|
131
|
+
|
|
132
|
+
return await anyio.to_thread.run_sync(run)
|
|
104
133
|
|
|
105
134
|
# FastMCP copies fn.__doc__ as-is (not inspect.getdoc), so without this the
|
|
106
135
|
# model sees the 4-space body indent from the source. @mcp.tool() wraps
|
|
107
136
|
# this function, so the cleaned docstring is what list_tools returns.
|
|
108
137
|
wrapper.__doc__ = inspect.getdoc(fn)
|
|
138
|
+
wrapper._async_entry = async_entry # type: ignore[attr-defined]
|
|
109
139
|
return wrapper
|
|
110
140
|
|
|
111
141
|
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"""Browser backend binding: in-app CDP, local harness daemon, or AgentCore.
|
|
2
|
+
|
|
3
|
+
In-app chats each own a :class:`browser_mcp.chat_context.ChatContext` (daemon,
|
|
4
|
+
tab registry, lock). Local Chrome and AgentCore use
|
|
5
|
+
:func:`browser_mcp.chat_context.shared`.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import contextlib
|
|
11
|
+
import logging
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
from browser_mcp import agentcore, chat_context, chat_scope, dom_indexing, in_app_cdp, perf
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
_agentcore_admin: agentcore.AgentCoreAdmin | None = None
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def mark_unbound() -> None:
|
|
22
|
+
chat_context.active().bound_cdp = None
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def in_app_backend_active() -> bool:
|
|
26
|
+
"""True when the live binding is Monkeyapp's in-app CDP bridge."""
|
|
27
|
+
ctx = chat_context.active()
|
|
28
|
+
return (
|
|
29
|
+
ctx.bh is not None
|
|
30
|
+
and ctx.bound_cdp not in (None, "agentcore")
|
|
31
|
+
and in_app_cdp._env_set_from_in_app_file
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def in_app_helpers() -> Any | None:
|
|
36
|
+
"""Return in-app CDP helpers when the in-app backend is bound, else None."""
|
|
37
|
+
if not in_app_backend_active():
|
|
38
|
+
return None
|
|
39
|
+
ctx = chat_context.active()
|
|
40
|
+
assert ctx.bh is not None
|
|
41
|
+
helpers, _ = ctx.bh
|
|
42
|
+
return helpers
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _ensure_active_context() -> chat_context.ChatContext:
|
|
46
|
+
"""Bind the context for this call when the tool wrapper has not already."""
|
|
47
|
+
ctx = chat_context.context_for_call(chat_scope.current_thread_id())
|
|
48
|
+
if chat_context.current_context.get() is not ctx:
|
|
49
|
+
chat_context.current_context.set(ctx)
|
|
50
|
+
chat_context.current_daemon.set(ctx.daemon_name)
|
|
51
|
+
return ctx
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def teardown_bound_backend() -> None:
|
|
55
|
+
"""Tear down whatever backend the active context is bound to, if any.
|
|
56
|
+
|
|
57
|
+
Clears ``bh`` before attempting the (possibly failing) teardown call, so a
|
|
58
|
+
raised exception here never leaves stale backend state behind for the next
|
|
59
|
+
``browser_harness()`` call to mistakenly reuse. Dispatches on ``bound_cdp``
|
|
60
|
+
rather than introspecting the admin object, since the non-agentcore path
|
|
61
|
+
always re-imports (and stops) the real ``browser_harness.admin`` module.
|
|
62
|
+
"""
|
|
63
|
+
ctx = chat_context.active()
|
|
64
|
+
if ctx.bh is None:
|
|
65
|
+
return
|
|
66
|
+
helpers, admin = ctx.bh
|
|
67
|
+
is_agentcore = ctx.bound_cdp == "agentcore"
|
|
68
|
+
with contextlib.suppress(Exception):
|
|
69
|
+
ctx.registry.detach_all(helpers)
|
|
70
|
+
ctx.bh = None
|
|
71
|
+
ctx.bound_cdp = None
|
|
72
|
+
dom_indexing.clear_registered_targets()
|
|
73
|
+
chat_scope.reset()
|
|
74
|
+
if is_agentcore:
|
|
75
|
+
admin.stop_session()
|
|
76
|
+
from browser_mcp import playwright_helpers
|
|
77
|
+
|
|
78
|
+
playwright_helpers.disconnect()
|
|
79
|
+
return
|
|
80
|
+
if ctx.isolated:
|
|
81
|
+
chat_context.drop(ctx)
|
|
82
|
+
return
|
|
83
|
+
from browser_harness import admin as bh_admin
|
|
84
|
+
|
|
85
|
+
bh_admin.restart_daemon()
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _with_perf_helpers(bh: tuple[Any, Any]) -> tuple[Any, Any]:
|
|
89
|
+
helpers, admin = bh
|
|
90
|
+
return perf.wrap_helpers(helpers), admin
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _announce_in_app(helpers: Any, ctx: chat_context.ChatContext) -> None:
|
|
94
|
+
"""Tell an older app which chat this connection serves. Once per bind.
|
|
95
|
+
|
|
96
|
+
Current apps read ``chat=`` from the WebSocket URL, so a repeat announce
|
|
97
|
+
is only needed after the daemon reconnects. Playbook/login skip this by
|
|
98
|
+
not binding.
|
|
99
|
+
"""
|
|
100
|
+
if not in_app_cdp._env_set_from_in_app_file or ctx.announced:
|
|
101
|
+
return
|
|
102
|
+
chat_scope.announce(helpers, ctx.thread_id)
|
|
103
|
+
ctx.announced = True
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def _reconnect_agentcore() -> tuple[str, dict[str, str]]:
|
|
107
|
+
"""Force a fresh AgentCore session (stop + restart) and return new ws creds.
|
|
108
|
+
|
|
109
|
+
Registered with playwright_helpers as its reconnect hook: a stale/expired
|
|
110
|
+
AgentCore session (~15-30 min TTL) leaves the old ws connection dead, and
|
|
111
|
+
plain ensure_session() would just re-sign headers for the same (already
|
|
112
|
+
dead) session, so the old session is explicitly stopped first.
|
|
113
|
+
"""
|
|
114
|
+
assert _agentcore_admin is not None
|
|
115
|
+
_agentcore_admin.stop_session()
|
|
116
|
+
return _agentcore_admin.ensure_session()
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def _agentcore_browser_harness(ctx: chat_context.ChatContext) -> tuple[Any, Any]:
|
|
120
|
+
"""Bind the shared context to AgentCore (StartBrowserSession + Playwright)."""
|
|
121
|
+
global _agentcore_admin
|
|
122
|
+
from browser_mcp import playwright_helpers
|
|
123
|
+
|
|
124
|
+
if _agentcore_admin is None:
|
|
125
|
+
_agentcore_admin = agentcore.AgentCoreAdmin(agentcore.resolve_region())
|
|
126
|
+
|
|
127
|
+
ws_url, headers = _agentcore_admin.ensure_session()
|
|
128
|
+
playwright_helpers.connect(ws_url, headers)
|
|
129
|
+
playwright_helpers.set_reconnect_hook(_reconnect_agentcore)
|
|
130
|
+
ctx.bh = (playwright_helpers, _agentcore_admin)
|
|
131
|
+
ctx.bound_cdp = "agentcore"
|
|
132
|
+
return ctx.bh
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def _ensure_harness_daemon(
|
|
136
|
+
ctx: chat_context.ChatContext, endpoint: str | None
|
|
137
|
+
) -> tuple[Any, Any]:
|
|
138
|
+
"""Start or reuse this context's daemon without touching any other chat's."""
|
|
139
|
+
from browser_harness import admin, helpers
|
|
140
|
+
|
|
141
|
+
if ctx.bh is not None and endpoint == ctx.bound_cdp:
|
|
142
|
+
return ctx.bh
|
|
143
|
+
|
|
144
|
+
name = ctx.daemon_name
|
|
145
|
+
alive = admin.daemon_alive(name) if name else admin.daemon_alive()
|
|
146
|
+
if alive and ctx.bound_cdp != endpoint:
|
|
147
|
+
logger.info(
|
|
148
|
+
"browser-mcp: replacing harness daemon %s for CDP %s (was %s)",
|
|
149
|
+
name or "default",
|
|
150
|
+
in_app_cdp._redact_cdp_token(str(endpoint)) if endpoint else endpoint,
|
|
151
|
+
in_app_cdp._redact_cdp_token(str(ctx.bound_cdp)) if ctx.bound_cdp else ctx.bound_cdp,
|
|
152
|
+
)
|
|
153
|
+
if name:
|
|
154
|
+
admin.restart_daemon(name)
|
|
155
|
+
else:
|
|
156
|
+
admin.restart_daemon()
|
|
157
|
+
ctx.bh = None
|
|
158
|
+
ctx.announced = False
|
|
159
|
+
|
|
160
|
+
env: dict[str, str] | None = None
|
|
161
|
+
if ctx.isolated and endpoint:
|
|
162
|
+
env = {"BU_CDP_WS": endpoint} if endpoint.startswith(("ws://", "wss://")) else {"BU_CDP_URL": endpoint}
|
|
163
|
+
if name:
|
|
164
|
+
admin.ensure_daemon(name=name, env=env)
|
|
165
|
+
else:
|
|
166
|
+
admin.ensure_daemon()
|
|
167
|
+
ctx.bh = (helpers, admin)
|
|
168
|
+
ctx.bound_cdp = endpoint
|
|
169
|
+
return ctx.bh
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def browser_harness() -> tuple[Any, Any]:
|
|
173
|
+
"""Lazy import + daemon bootstrap on first browser tool use.
|
|
174
|
+
|
|
175
|
+
When an explicit CDP URL is configured (env or Monkeyapp runtime file) and the
|
|
176
|
+
live daemon was bound to a different endpoint (or none — i.e. local Chrome),
|
|
177
|
+
bounce that daemon so tool calls drive the in-app panel instead.
|
|
178
|
+
BROWSER_BACKEND=agentcore (with no explicit CDP endpoint) dispatches to AWS
|
|
179
|
+
Bedrock AgentCore Browser instead.
|
|
180
|
+
|
|
181
|
+
In-app chats each get their own daemon. Bouncing one never restarts another.
|
|
182
|
+
"""
|
|
183
|
+
chat_context.install_send_router()
|
|
184
|
+
in_app_cdp._apply_in_app_cdp_url()
|
|
185
|
+
ctx = _ensure_active_context()
|
|
186
|
+
endpoint = (
|
|
187
|
+
in_app_cdp.daemon_cdp_endpoint(ctx.thread_id) if ctx.isolated else in_app_cdp._apply_in_app_cdp_url()
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
if agentcore.agentcore_backend_requested():
|
|
191
|
+
chat_context.stop_all_isolated()
|
|
192
|
+
shared = chat_context.shared()
|
|
193
|
+
if chat_context.current_context.get() is not shared:
|
|
194
|
+
chat_context.current_context.set(shared)
|
|
195
|
+
chat_context.current_daemon.set(None)
|
|
196
|
+
if shared.bh is not None and shared.bound_cdp == "agentcore":
|
|
197
|
+
return _with_perf_helpers(shared.bh)
|
|
198
|
+
teardown_bound_backend()
|
|
199
|
+
return _with_perf_helpers(_agentcore_browser_harness(shared))
|
|
200
|
+
|
|
201
|
+
if ctx.bound_cdp == "agentcore":
|
|
202
|
+
teardown_bound_backend()
|
|
203
|
+
ctx = _ensure_active_context()
|
|
204
|
+
|
|
205
|
+
if ctx.bh is not None and endpoint == ctx.bound_cdp:
|
|
206
|
+
wrapped = _with_perf_helpers(ctx.bh)
|
|
207
|
+
_announce_in_app(wrapped[0], ctx)
|
|
208
|
+
return wrapped
|
|
209
|
+
|
|
210
|
+
bh = _ensure_harness_daemon(ctx, endpoint)
|
|
211
|
+
_announce_in_app(bh[0], ctx)
|
|
212
|
+
return _with_perf_helpers(bh)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def stop_active_backend_best_effort() -> None:
|
|
216
|
+
"""Stop the backend for the active chat.
|
|
217
|
+
|
|
218
|
+
``browser_stop`` uses this so one chat does not tear down another chat's
|
|
219
|
+
daemon. Process exit uses :func:`stop_all_backends_best_effort`, which
|
|
220
|
+
also stops a leftover default daemon this process may never have bound.
|
|
221
|
+
"""
|
|
222
|
+
from browser_mcp import tab_ops
|
|
223
|
+
|
|
224
|
+
ctx = chat_context.active()
|
|
225
|
+
if ctx.bound_cdp == "agentcore":
|
|
226
|
+
if ctx.bh is not None:
|
|
227
|
+
helpers, _ = ctx.bh
|
|
228
|
+
with contextlib.suppress(Exception):
|
|
229
|
+
tab_ops._close_agent_opened_tabs(helpers)
|
|
230
|
+
teardown_bound_backend()
|
|
231
|
+
return
|
|
232
|
+
if ctx.bh is not None:
|
|
233
|
+
helpers, _ = ctx.bh
|
|
234
|
+
with contextlib.suppress(Exception):
|
|
235
|
+
tab_ops._close_agent_opened_tabs(helpers)
|
|
236
|
+
ctx.bh = None
|
|
237
|
+
ctx.bound_cdp = None
|
|
238
|
+
ctx.announced = False
|
|
239
|
+
if ctx.isolated:
|
|
240
|
+
chat_context.drop(ctx)
|
|
241
|
+
return
|
|
242
|
+
chat_scope.reset()
|
|
243
|
+
from browser_harness import admin
|
|
244
|
+
|
|
245
|
+
admin.restart_daemon()
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def stop_all_backends_best_effort() -> None:
|
|
249
|
+
"""Stop every per-chat daemon, then the shared/default one.
|
|
250
|
+
|
|
251
|
+
Shutdown must still restart the default daemon even when this process
|
|
252
|
+
never bound it: a leftover Browser Use Cloud daemon from an earlier
|
|
253
|
+
process keeps billing until something stops it.
|
|
254
|
+
"""
|
|
255
|
+
chat_context.stop_all_isolated()
|
|
256
|
+
chat_context.deactivate()
|
|
257
|
+
stop_active_backend_best_effort()
|