monkeybot 3.3.0__tar.gz → 3.4.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.3.0 → monkeybot-3.4.0}/CHANGELOG.md +12 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/PKG-INFO +1 -1
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/app.py +4 -1
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/tabs.py +32 -14
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/test_act.py +30 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/test_playbook_flows.py +40 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/test_tabs.py +43 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/pyproject.toml +1 -1
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/context/__init__.py +2 -0
- monkeybot-3.4.0/src/monkeybot/core/context/slash_skills.py +29 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/prompts/headings.py +2 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/prompts/prompt.py +18 -2
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/sse/app.py +4 -0
- monkeybot-3.4.0/tests/core/test_slash_skills.py +86 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/providers/test_anthropic_cache.py +2 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/.dockerignore +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/.github/workflows/ci.yml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/.github/workflows/live-eval-smoke.yml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/.github/workflows/prepare-release.yml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/.github/workflows/publish-release.yml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/.gitignore +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/.pre-commit-config.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/BACKLOG.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/CONTRIBUTING.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/LICENSE +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/README.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/pyproject.toml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/skills/monkeybot/SKILL.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/skills/monkeybot/references/config-sections.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/chat_file_index.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/chat_local_shell.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/chat_renderer.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/chat_session.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/chat_status_bar.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/chat_theme.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/chat_tool_display.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/chat_tui.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/chat_tui_widgets.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/commands/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/commands/chat.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/commands/doctor.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/commands/loop.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/commands/new.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/commands/refresh.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/commands/run_cmd.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/commands/talk.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/commands/validate.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/compat.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/config_resolve.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/exit_commands.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/extras_catalog.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/gateway_health.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/main.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/opensandbox_lifecycle.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/output.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/process_tree.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/providers.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/realtime/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/realtime/audio_io.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/realtime/client.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/realtime/gateway_manager.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/realtime/push_to_talk.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/realtime/session.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/realtime/session_controller.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/realtime/talk_ui.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/realtime/wire_encode.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/runtime_python.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/scaffold.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/scaffold_defaults/AGENT.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/scaffold_defaults/Dockerfile +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/scaffold_defaults/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/scaffold_defaults/browser/SKILL.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/scaffold_defaults/command_allowlist.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/scaffold_defaults/dockerignore +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/scaffold_defaults/env.example +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/scaffold_defaults/image-generator/SKILL.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/scaffold_defaults/image-generator/generate_image.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/scaffold_defaults/loop/SKILL.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/scaffold_defaults/mcp.json +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/scaffold_defaults/monkeybot.example.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/scaffold_defaults/opensandbox.docker.toml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/scaffold_defaults/otel-collector.example.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/scaffold_defaults/permissions.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/session_controller.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/terminal_markdown.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_chat_continue.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_chat_e2e.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_chat_errors.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_chat_file_index.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_chat_grounding.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_chat_local_shell.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_chat_renderer_parity.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_chat_session.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_chat_status_bar.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_chat_theme.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_chat_tool_display.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_chat_tui.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_cli.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_config_resolve.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_doctor.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_extras_catalog.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_gateway_health.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_opensandbox_lifecycle.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_realtime_session_controller.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_run_cmd.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_runtime_python.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_scaffold.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/tests/test_terminal_markdown.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/cli/uv.lock +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docker/Dockerfile +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docker/demo-model.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docker/demo.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docker/docker-compose.sandbox.yml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docker/opensandbox.docker.toml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docker/sandbox.Dockerfile +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docker-compose.yml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/agent-layout.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/assets/logo.png +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/browser-mcp-perf-baseline.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/browser-mcp-performance-plan.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/browser-mcp.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/cloud-deployment-design.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/deploy-aws-agentcore.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/deploy-pattern-a-container.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/deploy-pattern-b-serverless.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/deploy-pattern-c-agent-platform.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/deploy-pattern-d-realtime.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/features.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/getting-started.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/knowledge-layer-fixes.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/live-evals.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/mcp.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/memory-graph-split-plan.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/migrations/agent-scope-namespacing.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/migrations/memory-outbox.sql +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/observability-runbook.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/ollama-local.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/otel-collector.example.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/progressive-loop-tools.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/progressive-mcp-tools.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/skills.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/spill-dynamic-design.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/sse-gateway-ui.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/verifier-agent-design.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/docs/workspace-index-design.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/TEST_COVERAGE.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/assertions.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/baselines/smoke.json +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/baselines/smoke.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/diff.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/eval_config.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/models.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/persistence.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/report.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/runner.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/scenario_loader.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/scenarios/context/summarization_trigger.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/scenarios/drift/declares_done.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/scenarios/drift/path_constraint.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/scenarios/drift/preempt.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/scenarios/drift/repeat_correction.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/scenarios/drift/supersession.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/scenarios/mcp/get_prompt.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/scenarios/mcp/list_resources.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/scenarios/mcp/tool_invoke.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/scenarios/memory/recall_cross_session.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/scenarios/memory/recall_single_session.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/scenarios/multi_turn/task_tracking.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/scenarios/skills/skill_invocation.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/scenarios/subagents/dispatch_complete.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/scenarios/tools/core_read.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/scenarios/tools/core_read_error.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/scenarios/tools/core_run_command.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/scenarios/tools/core_run_command_sandbox.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/scenarios/tools/core_write.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/scorer.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/smoke_agent/.env.example +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/smoke_agent/.gitignore +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/smoke_agent/fixture_mcp_server.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/smoke_agent/monkeybot_config/AGENT.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/smoke_agent/monkeybot_config/command_allowlist.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/smoke_agent/monkeybot_config/mcp.json +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/smoke_agent/monkeybot_config/monkeybot.verifier-on.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/smoke_agent/monkeybot_config/monkeybot.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/smoke_agent/monkeybot_config/permissions.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/smoke_agent/pyproject.toml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/smoke_agent/skills/browser/SKILL.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/smoke_agent/uv.lock +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/smoke_agent/workspace/.gitkeep +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/smoke_agent/workspace/skills/browser/playbooks/.gitkeep +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/suites/drift.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/suites/smoke.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/test_assertions.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/test_diff.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/test_judge.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/test_report.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/test_runner_sse.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/evals/test_scorer.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/examples/README.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/examples/agentcore/handler.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/examples/agentcore/runtime_app.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/examples/agentengine/handler.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/examples/cloud-functions/main.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/examples/lambda/handler.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/examples/ollama/PrefixStable.Modelfile +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/examples/skills/browser/SKILL.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/examples/skills/browser/playbooks/.gitkeep +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/examples/skills/diagnostics/README.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/examples/skills/diagnostics/SKILL.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/examples/skills/diagnostics/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/examples/skills/diagnostics/diagnostics.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/examples/skills/image-generator/SKILL.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/examples/skills/image-generator/generate_image.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/pyproject.toml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/scripts/agentcore_smoke.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/scripts/dump_tool_surface.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/scripts/perf_bench.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/actions.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/agentcore.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/assets/NOTICE.md +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/assets/dom_tree.js +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/assets/pa_driver.js +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/backend.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/chat_scope.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/dom_indexing.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/in_app_cdp.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/login.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/observe.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/perf.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/playbooks.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/playwright_helpers.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/results.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/screenshots.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/server.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/tab_ops.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/tools/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/tools/batch.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/tools/capture.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/tools/interact.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/tools/navigate.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/tools/playbook.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/tools/read.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/src/browser_mcp/tools/tab_control.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/fixtures/api.json +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/fixtures/article.html +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/fixtures/cards.html +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/fixtures/form.html +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/fixtures/long_list.html +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/fixtures/spa.html +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/fixtures/tool_surface.json +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/integration/conftest.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/integration/test_act_observe.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/integration/test_driver_persist.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/integration/test_intent_tools.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/integration/test_multi_tab.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/integration/test_observation.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/integration/test_run_playbook.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/integration/test_wait_for.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/test_agentcore.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/test_chat_scope.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/test_dom_indexing.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/test_fill_form.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/test_in_app_cdp.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/test_indexed_tools.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/test_observe.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/test_observe_after.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/test_perf.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/test_playbooks.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/test_playwright_helpers.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/test_screenshots.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/test_server_shutdown.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/test_tool_surface.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/tests/test_wait_tools.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/integrations/browser-mcp/uv.lock +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/pytest.ini +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/scripts/create_schema.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/scripts/precommit-pytest.sh +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/scripts/release.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/scripts/smoke_global_cli.sh +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/cli/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/cli/__main__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/cli/audio_io.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/cli/gateway_manager.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/cli/main.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/cli/push_to_talk.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/cli/realtime_client.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/computer/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/computer/approvals.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/computer/permissions.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/computer/safety.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/computer/tools.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/attachments/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/attachments/catalog.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/attachments/config.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/attachments/freeze.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/attachments/resolve.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/attachments/store.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/attachments/text.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/attachments/tools.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/bootstrap.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/config/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/config/realtime_config.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/config/runtime_env.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/config/settings.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/config/snapshot.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/config/validation.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/config/yaml_loader.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/context/campaign_context.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/context/common.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/context/epoch.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/context/secret_egress.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/context/tool_output_policy.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/context/tool_result_ingress.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/context/tool_shapers.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/hooks/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/captions.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/chunking.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/config.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/embeddings/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/embeddings/base.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/embeddings/factory.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/embeddings/gemini.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/embeddings/nvidia.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/embeddings/openai_compat.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/embeddings/sanitize.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/evidence_guard.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/extractors.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/fusion.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/hook.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/indexer.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/links.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/salience.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/sqlite_index.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/subsystem.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/tool.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/knowledge/types.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/layout.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/llm/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/llm/provider.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/llm/realtime_provider.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/llm/usage.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/lockfile_names.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/logging_utils.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/mcp/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/mcp/mcp_client.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/mcp/ports_mcp.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/memory/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/memory/config.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/memory/hook.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/memory/ids.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/memory/ingest.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/memory/migrate_layout.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/memory/observability.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/memory/outbox.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/memory/palace.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/memory/subsystem.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/memory/uri.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/memory/writer.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/messages/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/messages/convert_provider.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/messages/tool_integrity.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/messages/transform_context.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/path_safety.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/persistence/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/persistence/backends.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/persistence/db.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/persistence/durable_runs.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/persistence/errors.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/persistence/firestore.indexes.json +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/persistence/firestore.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/persistence/firestore_scheduled_loops.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/persistence/goal_ledger.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/persistence/history.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/persistence/postgres.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/persistence/runs.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/persistence/scheduled_loops.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/persistence/session_turn_locks.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/persistence/sqlite.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/persistence/sqlite_backend.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/persistence/sqlite_vector.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/persistence/thread_summary.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/persistence/transcript.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/persistence/usage.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/persistence/usage_buckets.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/prompts/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/prompts/harness_prompt.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/runtime/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/runtime/context_budget.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/runtime/doom_loop.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/runtime/events.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/runtime/history_compaction.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/runtime/input_admission.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/runtime/loop.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/runtime/loop_hooks.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/runtime/loop_messages.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/runtime/loop_ports.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/runtime/loop_usage.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/runtime/provider_stream_mapper.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/runtime/realtime_loop.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/runtime/tool_batch.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/runtime/tool_dispatch.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/runtime/turn_loop.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/runtime/utterance_buffer.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/subagents/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/subagents/progress_publish.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/subagents/subagent_proto.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/subagents/subagent_worker.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/subagents/worker_pool.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/subprocess_groups.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/testing/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/testing/mocks_provider.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/testing/mocks_realtime_provider.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/tools/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/tools/core_tool_executor.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/tools/fs_isolation.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/tools/grant_store.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/tools/inspector.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/tools/loop_inspector.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/tools/patch.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/tools/path_grant_inspector.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/tools/permission.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/tools/sandbox_executor.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/tools/spill_inventory.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/tools/terminal.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/tools/text_normalize.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/tools/tool_hint.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/tools/tool_kind.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/tools/types.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/tools/workspace_service.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/types/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/types/content_blocks.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/types/interfaces.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/types/types_tools.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/verifier/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/verifier/actuator.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/verifier/classify.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/verifier/inspector.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/verifier/judge.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/verifier/ledger.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/verifier/mailbox.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/verifier/match.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/verifier/port.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/verifier/severity.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/verifier/tracker.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/workspace/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/workspace/factory.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/workspace/gcs.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/workspace/local.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/workspace/protocol.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/workspace/s3.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/core/workspace_layout.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/bootstrap.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/main.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/pending_response_bus.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/realtime/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/realtime/app.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/realtime/deps.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/realtime/errors.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/realtime/guardrails.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/realtime/manager.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/realtime/metrics.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/realtime/routes.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/realtime/session.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/realtime/wire.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/realtime_main.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/sse/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/sse/loop_port.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/sse/models.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/sse/reload.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/sse/reply_body.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/sse/routes.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/sse/scheduler_routes.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/sse/scheduler_wiring.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/sse/session_bus.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/sse/sse.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/gateway/sse/workspace_layout.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/observability/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/observability/_state.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/observability/instrumentation.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/observability/propagation.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/observability/spans.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/observability/sqlite_exporter.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/providers/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/providers/_bedrock_converse.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/providers/_openai_compat.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/providers/_utils.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/providers/bedrock.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/providers/claude.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/providers/gemini.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/providers/gemini_live.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/providers/huggingface.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/providers/model_capabilities.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/providers/nvidia.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/providers/ollama.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/providers/openai.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/providers/openrouter.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/providers/pricing.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/providers/sampling.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/providers/vertex_claude.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/scaffold/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/scheduler/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/scheduler/__main__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/scheduler/engine.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/scheduler/http_invoker.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/scheduler/interval.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/scheduler/tick_result.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/scheduler/worker.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/subagents/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/subagents/worker/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/subagents/worker/__main__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/todo_list/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/todo_list/store.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/todo_list/tool.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/web_search/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/web_search/backends/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/web_search/backends/duckduckgo.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/web_search/backends/firecrawl.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/web_search/backends/tavily.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/web_search/protocol.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/src/monkeybot/web_search/tool.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/acceptance/test_observability_acceptance.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/cli/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/cli/test_gateway_manager.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/cli/test_main.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/cli/test_push_to_talk.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/cli/test_realtime_client.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/computer/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/computer/test_approvals.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/computer/test_computer_tools.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/computer/test_package_init.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/computer/test_path_policy.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/computer/test_permissions.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/computer/test_subagent_exclusion.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/computer/test_wiring.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/conftest.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/fixtures/bitbucket_dc_style_pr.diff +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/memory/helpers.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/memory/in_memory_palace.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/memory/test_mempalace.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/memory/test_review_fixes.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_agent_layout.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_attachment_freeze.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_attachment_store.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_bootstrap.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_config_extensions.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_content_blocks.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_context.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_context_budget.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_context_epoch.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_core_tool_executor.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_doom_loop.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_durable_events.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_durable_runs.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_empty_completion.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_env_map_grep_gates.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_events.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_evidence_guard.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_firestore_history.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_firestore_scheduled_loops.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_firestore_usage.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_fs_isolation.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_gemini_history_replay.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_goal_ledger.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_grant_store.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_harness_prompt.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_history.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_history_compaction_split.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_hooks.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_input_admission.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_inspector.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_knowledge_chunking.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_knowledge_chunking_rank.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_knowledge_config.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_knowledge_embeddings.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_knowledge_fts.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_knowledge_fusion.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_knowledge_fusion_ann.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_knowledge_hook.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_knowledge_indexer.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_knowledge_links.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_knowledge_media.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_knowledge_salience.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_knowledge_single_writer.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_knowledge_subsystem.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_knowledge_vectors.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_layout.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_logging_utils.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_loop.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_loop_hooks.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_loop_observability.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_loop_transcript.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_mcp_client.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_memory_layout_migrate.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_message_pipeline.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_mocks_realtime_provider.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_patch.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_path_grant_inspector.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_path_safety.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_permission.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_pricing.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_progress_publish.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_progress_tracker.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_prompt.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_provider_contract.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_provider_stream_mapper.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_realtime_loop.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_replace_fuzzy.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_run_command_parse.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_runs.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_runtime_config_snapshot.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_runtime_env.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_sandbox_executor.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_scheduled_loops.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_secret_egress.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_session_turn_locks.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_settlement.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_spill_dynamic.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_spill_inventory.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_storage_backends.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_subagent_proto.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_subagent_trace_propagation.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_subagent_worker_paths.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_terminal.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_thread_summary_wire.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_tool_def_schema.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_tool_integrity.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_tool_result_ingress.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_tool_shapers.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_transcript.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_truncated_tool_batch.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_usage.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_usage_migration.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_utterance_buffer.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_verifier_inspector.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_verifier_judge.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_worker_pool.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_workspace_extra_read_roots.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_workspace_layout.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_workspace_symlinks.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/test_workspace_write_scope.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/workspace/test_factory.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/workspace/test_local_storage.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/core/workspace/test_protocol_contract.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/evals/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/evals/eval_hook.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/evals/scenario_runner.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/evals/scenarios/memory_wake_up_large.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/evals/scenarios/memory_write_inject.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/evals/scenarios/subagent_roundtrip.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/evals/scenarios/tool_glob_grep.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/evals/scenarios/tool_load_file.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/evals/scenarios/tool_loops.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/evals/scenarios/tool_read.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/evals/scenarios/tool_replace_apply_patch.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/evals/scenarios/tool_run_command.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/evals/scenarios/tool_search_knowledge.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/evals/scenarios/tool_search_memory.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/evals/scenarios/tool_todo_list.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/evals/scenarios/tool_web_search.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/evals/scenarios/tool_write.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/evals/scenarios/turn_completion.yaml +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/evals/test_agent_behavior.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/evals/test_memory_knowledge_routing.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/evals/test_verifier_port.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/realtime/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/realtime/test_app.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/realtime/test_deps.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/realtime/test_guardrails.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/realtime/test_manager.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/realtime/test_metrics.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/realtime/test_routes_client_text.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/realtime/test_session.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/realtime/test_wire.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/sse/test_attachments.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/sse/test_config_reload.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/sse/test_create_session_model.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/sse/test_gateway_runtime.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/sse/test_routes.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/sse/test_scheduler_routes.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/sse/test_session_bus.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/sse/test_transcript_wiring.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/test_otel_fastapi.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/test_otel_lifespan.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/test_pending_response_endpoints.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/test_realtime_main.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/test_resolve_provider.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/test_sse_events.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/gateway/test_subagent_event_publisher.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/integration/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/integration/test_mb_e2e_simple_reply.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/integration/test_observability_integration.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/integration/test_prompt_caching_integration.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/observability/conftest.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/observability/test_init.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/observability/test_instrumentation.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/observability/test_loop_hook_spans.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/observability/test_propagation.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/observability/test_span_contract.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/observability/test_spans.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/observability/test_sqlite_exporter.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/observability/test_truncate.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/observability/test_turn_complete_trace.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/providers/conftest.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/providers/test_anthropic_history.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/providers/test_bedrock_converse.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/providers/test_bedrock_estimate.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/providers/test_gemini_history.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/providers/test_gemini_live.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/providers/test_gemini_usage.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/providers/test_huggingface.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/providers/test_model_capabilities.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/providers/test_nvidia.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/providers/test_ollama.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/providers/test_openai_compat_usage.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/providers/test_openai_history.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/providers/test_pricing.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/providers/test_safe_parse_tool_args.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/providers/test_sampling.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/providers/test_sonnet5_sampling.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/providers/test_source_grep_gates.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/providers/test_vertex_claude_history.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/scheduler/test_engine.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/scheduler/test_interval.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/skills/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/skills/test_generate_image_script.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/test_cold_start.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/test_packaging_config.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/test_release_script.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/todo_list/test_todo_list.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/web_search/__init__.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/tests/web_search/test_web_search.py +0 -0
- {monkeybot-3.3.0 → monkeybot-3.4.0}/uv.lock +0 -0
|
@@ -6,6 +6,18 @@ the project adheres to [Semantic Versioning](https://semver.org/).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
### Browser MCP
|
|
10
|
+
|
|
11
|
+
#### Fixed
|
|
12
|
+
|
|
13
|
+
- Empty in-app browsers report `no page target` so `browser_act` / `run_playbook` can `goto` instead of aborting. Stale sessions still fail closed when other tabs exist.
|
|
14
|
+
|
|
15
|
+
## [core v3.4.0] - 2026-09-12
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
|
|
19
|
+
- A leading `/slug` in the user turn pins that installed skill for the turn (`## Invoked skill`) without rewriting persisted chat text.
|
|
20
|
+
|
|
9
21
|
## [browser v0.7.0] - 2026-09-10
|
|
10
22
|
|
|
11
23
|
#### Added
|
|
@@ -151,7 +151,10 @@ def prepare_action(
|
|
|
151
151
|
)
|
|
152
152
|
except tabs.UnknownTabError as exc:
|
|
153
153
|
return PreparedAction(error=results.unknown_tab_result(exc), mode=mode)
|
|
154
|
-
before_url =
|
|
154
|
+
before_url = ""
|
|
155
|
+
if capture_url:
|
|
156
|
+
info = handle.page_info()
|
|
157
|
+
before_url = str(info.get("url") or "") if isinstance(info, dict) else ""
|
|
155
158
|
return PreparedAction(
|
|
156
159
|
error=None, helpers=helpers, handle=handle, mode=mode, before_url=before_url
|
|
157
160
|
)
|
|
@@ -19,7 +19,9 @@ from typing import Any
|
|
|
19
19
|
|
|
20
20
|
_ALIAS_RE = re.compile(r"^[a-z][a-z0-9_-]{0,23}$")
|
|
21
21
|
_CHROME_INTERNAL = ("chrome://", "chrome-untrusted://", "devtools://", "chrome-extension://")
|
|
22
|
-
|
|
22
|
+
# Chrome: "Session with given id not found". Monkeyapp's flatten CDP bridge:
|
|
23
|
+
# "unknown session" when the harness still holds a detached sessionId.
|
|
24
|
+
_SESSION_GONE_MARKERS = ("session with given id", "unknown session")
|
|
23
25
|
logger = logging.getLogger(__name__)
|
|
24
26
|
_SINGLE_TAB_MARKERS = (
|
|
25
27
|
"not allowed",
|
|
@@ -96,8 +98,18 @@ def _has_helper(helpers: Any, name: str) -> bool:
|
|
|
96
98
|
return callable(getattr(helpers, name, None))
|
|
97
99
|
|
|
98
100
|
|
|
101
|
+
def _message_has_marker(exc: BaseException, markers: tuple[str, ...]) -> bool:
|
|
102
|
+
text = str(exc).lower()
|
|
103
|
+
return any(marker in text for marker in markers)
|
|
104
|
+
|
|
105
|
+
|
|
99
106
|
def _session_gone(exc: BaseException) -> bool:
|
|
100
|
-
return
|
|
107
|
+
return _message_has_marker(exc, _SESSION_GONE_MARKERS)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def is_missing_page_error(exc: BaseException) -> bool:
|
|
111
|
+
"""True when CDP has no live page (empty tabs). Fail-closed on unknown session."""
|
|
112
|
+
return "no page target" in str(exc).lower()
|
|
101
113
|
|
|
102
114
|
|
|
103
115
|
def _log_detach_failure(session_id: str, exc: BaseException) -> None:
|
|
@@ -271,19 +283,25 @@ class TabHandle:
|
|
|
271
283
|
return self.helpers.goto_url(url, target_id=self.state.target_id)
|
|
272
284
|
|
|
273
285
|
def page_info(self) -> dict[str, Any]:
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
286
|
+
try:
|
|
287
|
+
if self.focused or self.state is None:
|
|
288
|
+
info = self.helpers.page_info()
|
|
289
|
+
return info if isinstance(info, dict) else {}
|
|
290
|
+
raw = self.evaluate(_PAGE_INFO_JS)
|
|
291
|
+
if isinstance(raw, dict):
|
|
292
|
+
return raw
|
|
293
|
+
if isinstance(raw, str):
|
|
294
|
+
try:
|
|
295
|
+
parsed = json.loads(raw)
|
|
296
|
+
except json.JSONDecodeError:
|
|
297
|
+
return {}
|
|
298
|
+
return parsed if isinstance(parsed, dict) else {}
|
|
299
|
+
return {}
|
|
300
|
+
except Exception as exc:
|
|
301
|
+
if is_missing_page_error(exc):
|
|
302
|
+
logger.debug("page_info: no live page yet", exc_info=True)
|
|
284
303
|
return {}
|
|
285
|
-
|
|
286
|
-
return {}
|
|
304
|
+
raise
|
|
287
305
|
|
|
288
306
|
def capture_screenshot(
|
|
289
307
|
self, path: str | None = None, full: bool = False, max_dim: int | None = None
|
|
@@ -119,6 +119,36 @@ def test_act_stop_on_error_returns_completed_and_observation() -> None:
|
|
|
119
119
|
assert result["observation"]["mode"] in {"diff", "full"}
|
|
120
120
|
|
|
121
121
|
|
|
122
|
+
def test_act_goto_opens_tab_when_page_info_has_no_page() -> None:
|
|
123
|
+
"""Empty in-app browser must not abort act/goto."""
|
|
124
|
+
helpers = MagicMock()
|
|
125
|
+
helpers.list_tabs.return_value = []
|
|
126
|
+
helpers.current_tab.return_value = None
|
|
127
|
+
helpers.js.return_value = True
|
|
128
|
+
|
|
129
|
+
def page_info() -> dict[str, str]:
|
|
130
|
+
if helpers.new_tab.called:
|
|
131
|
+
return {"url": "https://a.test/", "title": "A", "w": "800", "h": "600"}
|
|
132
|
+
raise RuntimeError("no page target")
|
|
133
|
+
|
|
134
|
+
helpers.page_info.side_effect = page_info
|
|
135
|
+
with (
|
|
136
|
+
_patch_harness(helpers),
|
|
137
|
+
patch.object(dom_indexing, "settle", return_value={"quiet": True, "navigated": False}),
|
|
138
|
+
patch.object(dom_indexing, "_register_driver_for_new_documents"),
|
|
139
|
+
patch.object(dom_indexing, "get_elements") as get_elements,
|
|
140
|
+
):
|
|
141
|
+
result = json.loads(
|
|
142
|
+
server.browser_act(
|
|
143
|
+
[{"do": "goto", "url": "https://a.test/"}],
|
|
144
|
+
observe="none",
|
|
145
|
+
)
|
|
146
|
+
)
|
|
147
|
+
assert result["ok"] is True
|
|
148
|
+
helpers.new_tab.assert_called_once_with("https://a.test/")
|
|
149
|
+
get_elements.assert_not_called()
|
|
150
|
+
|
|
151
|
+
|
|
122
152
|
def test_act_observe_none_skips_snapshot() -> None:
|
|
123
153
|
helpers = _helpers()
|
|
124
154
|
with (
|
|
@@ -144,6 +144,46 @@ def test_list_playbooks_includes_flows() -> None:
|
|
|
144
144
|
assert listed["flows"] == [{"host": "a.test", "name": "signup", "params": ["nickname"]}]
|
|
145
145
|
|
|
146
146
|
|
|
147
|
+
def test_run_playbook_opens_tab_when_page_info_has_no_page() -> None:
|
|
148
|
+
playbooks.write_playbook("a.test", _SIGNUP)
|
|
149
|
+
helpers = MagicMock()
|
|
150
|
+
helpers.list_tabs.return_value = []
|
|
151
|
+
helpers.current_tab.return_value = None
|
|
152
|
+
helpers.js.return_value = True
|
|
153
|
+
|
|
154
|
+
def page_info() -> dict[str, str]:
|
|
155
|
+
if helpers.new_tab.called:
|
|
156
|
+
return {"url": "https://a.test/form.html", "title": "A"}
|
|
157
|
+
raise RuntimeError("no page target")
|
|
158
|
+
|
|
159
|
+
helpers.page_info.side_effect = page_info
|
|
160
|
+
with (
|
|
161
|
+
_patch_harness(helpers),
|
|
162
|
+
patch.object(dom_indexing, "settle", return_value={"quiet": True, "navigated": False}),
|
|
163
|
+
patch.object(dom_indexing, "_register_driver_for_new_documents"),
|
|
164
|
+
patch.object(
|
|
165
|
+
actions,
|
|
166
|
+
"do_fill_form",
|
|
167
|
+
return_value={
|
|
168
|
+
"ok": True,
|
|
169
|
+
"filled": [{"label": "Nickname", "index": 1, "how": "label_for"}],
|
|
170
|
+
"unresolved": [],
|
|
171
|
+
"submitted": True,
|
|
172
|
+
},
|
|
173
|
+
),
|
|
174
|
+
patch.object(playbooks, "check_expect", return_value=None),
|
|
175
|
+
):
|
|
176
|
+
result = json.loads(
|
|
177
|
+
server.browser_run_playbook(
|
|
178
|
+
"a.test", "signup", {"nickname": "ada"}, observe="none"
|
|
179
|
+
)
|
|
180
|
+
)
|
|
181
|
+
assert result["ok"] is True
|
|
182
|
+
helpers.new_tab.assert_called_once_with("https://a.test/form.html")
|
|
183
|
+
assert result["name"] == "signup"
|
|
184
|
+
assert len(result["completed"]) == 2
|
|
185
|
+
|
|
186
|
+
|
|
147
187
|
def test_run_playbook_success_and_expect() -> None:
|
|
148
188
|
playbooks.write_playbook("a.test", _SIGNUP)
|
|
149
189
|
helpers = _helpers()
|
|
@@ -208,6 +208,49 @@ def test_browser_stop_closes_agent_opened_tabs_at_cap(
|
|
|
208
208
|
assert helpers.close_tab.call_count == 5
|
|
209
209
|
|
|
210
210
|
|
|
211
|
+
def test_session_for_reattaches_on_unknown_session() -> None:
|
|
212
|
+
helpers = MagicMock()
|
|
213
|
+
helpers.cdp.side_effect = [
|
|
214
|
+
{"sessionId": "sid-1"},
|
|
215
|
+
{},
|
|
216
|
+
{},
|
|
217
|
+
RuntimeError("{'code': -32000, 'message': 'unknown session'}"),
|
|
218
|
+
{"sessionId": "sid-2"},
|
|
219
|
+
{},
|
|
220
|
+
{},
|
|
221
|
+
{"result": {"type": "string", "value": "ok"}},
|
|
222
|
+
]
|
|
223
|
+
state = TabState(target_id="aaa", tab="t1", alias="t1")
|
|
224
|
+
tabs.reset_registry()
|
|
225
|
+
tabs.registry()._tabs["aaa"] = state
|
|
226
|
+
tabs.registry()._aliases["t1"] = "aaa"
|
|
227
|
+
handle = tabs.TabHandle(helpers, state, focused=False)
|
|
228
|
+
assert handle.evaluate("1+1") == "ok"
|
|
229
|
+
methods = [c.args[0] for c in helpers.cdp.call_args_list]
|
|
230
|
+
assert methods.count("Target.attachToTarget") == 2
|
|
231
|
+
assert state.session_id == "sid-2"
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def test_focused_page_info_returns_empty_on_no_page() -> None:
|
|
235
|
+
helpers = MagicMock()
|
|
236
|
+
helpers.page_info.side_effect = RuntimeError("no page target")
|
|
237
|
+
handle = tabs.TabHandle(helpers, None, focused=True)
|
|
238
|
+
assert handle.page_info() == {}
|
|
239
|
+
assert tabs.is_missing_page_error(RuntimeError("no page target"))
|
|
240
|
+
assert not tabs.is_missing_page_error(RuntimeError("unknown session"))
|
|
241
|
+
assert not tabs.is_missing_page_error(RuntimeError("tab sealed"))
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
def test_focused_page_info_raises_on_unknown_session() -> None:
|
|
245
|
+
helpers = MagicMock()
|
|
246
|
+
helpers.page_info.side_effect = RuntimeError(
|
|
247
|
+
"{'code': -32000, 'message': 'unknown session'}"
|
|
248
|
+
)
|
|
249
|
+
handle = tabs.TabHandle(helpers, None, focused=True)
|
|
250
|
+
with pytest.raises(RuntimeError, match="unknown session"):
|
|
251
|
+
handle.page_info()
|
|
252
|
+
|
|
253
|
+
|
|
211
254
|
def test_session_for_attaches_once_and_reattaches_on_lost_session() -> None:
|
|
212
255
|
helpers = MagicMock()
|
|
213
256
|
helpers.cdp.side_effect = [
|
|
@@ -163,6 +163,8 @@ class TurnContext:
|
|
|
163
163
|
"""Optional goal ledger (Phase 1). None when verifier.ledger is off."""
|
|
164
164
|
verdict_mailbox: VerdictMailbox | None = None
|
|
165
165
|
"""Optional verdict mailbox (Phase 2). None when verifier.tracker is off."""
|
|
166
|
+
invoked_skill: SkillRef | None = None
|
|
167
|
+
"""Installed skill the user explicitly invoked with a leading `/slug` this turn."""
|
|
166
168
|
|
|
167
169
|
|
|
168
170
|
_log = logging.getLogger(__name__)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"""Resolve a leading `/skill-slug` against the skills installed for this turn."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
from collections.abc import Sequence
|
|
7
|
+
from dataclasses import replace
|
|
8
|
+
|
|
9
|
+
from monkeybot.core.context import SkillRef, TurnContext
|
|
10
|
+
|
|
11
|
+
_SLASH_TOKEN = re.compile(r"(?:^|\s)/([^\s]+)")
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def resolve_invoked_skill(text: str, skills: Sequence[SkillRef]) -> SkillRef | None:
|
|
15
|
+
"""Match a `/slug` token against installed skill directory names."""
|
|
16
|
+
by_name = {skill.name.lower(): skill for skill in skills}
|
|
17
|
+
for match in _SLASH_TOKEN.finditer(text):
|
|
18
|
+
skill = by_name.get(match.group(1).lower())
|
|
19
|
+
if skill is not None:
|
|
20
|
+
return skill
|
|
21
|
+
return None
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def apply_invoked_skill(ctx: TurnContext, user_text: str) -> TurnContext:
|
|
25
|
+
"""Attach a turn-scoped invoked skill without rewriting persisted user text."""
|
|
26
|
+
skill = resolve_invoked_skill(user_text, ctx.skills)
|
|
27
|
+
if skill is None:
|
|
28
|
+
return ctx
|
|
29
|
+
return replace(ctx, invoked_skill=skill)
|
|
@@ -28,6 +28,7 @@ MEMORY_INDEX_HEADING = (
|
|
|
28
28
|
MEMORY_NUDGE_HEADING = "\n\n## Memory\n"
|
|
29
29
|
SKILLS_HEADING = "\n\n## Skills\n"
|
|
30
30
|
TODO_LIST_HEADING = "\n\n## Todo list\n"
|
|
31
|
+
INVOKED_SKILL_HEADING = "\n\n## Invoked skill\n"
|
|
31
32
|
CURRENT_REQUEST_HEADING = "\n\n## Current request\n"
|
|
32
33
|
RUNTIME_NOTES_HEADING = "\n\n## Runtime notes\n"
|
|
33
34
|
SYSTEM_CONTEXT_UPDATE_HEADING = "\n\n## System context update\n"
|
|
@@ -39,6 +40,7 @@ VOLATILE_SECTION_HEADINGS = (
|
|
|
39
40
|
MEMORY_NUDGE_HEADING,
|
|
40
41
|
SKILLS_HEADING,
|
|
41
42
|
TODO_LIST_HEADING,
|
|
43
|
+
INVOKED_SKILL_HEADING,
|
|
42
44
|
CURRENT_REQUEST_HEADING,
|
|
43
45
|
RUNTIME_NOTES_HEADING,
|
|
44
46
|
SYSTEM_CONTEXT_UPDATE_HEADING,
|
|
@@ -15,6 +15,7 @@ from monkeybot.core.prompts.harness_prompt import (
|
|
|
15
15
|
from monkeybot.core.prompts.headings import (
|
|
16
16
|
CURRENT_DATE_HEADING,
|
|
17
17
|
CURRENT_REQUEST_HEADING,
|
|
18
|
+
INVOKED_SKILL_HEADING,
|
|
18
19
|
MEMORY_INDEX_HEADING,
|
|
19
20
|
SKILLS_HEADING,
|
|
20
21
|
TODO_LIST_HEADING,
|
|
@@ -114,6 +115,19 @@ def _skills_section(ctx: TurnContext) -> str:
|
|
|
114
115
|
return f"{SKILLS_HEADING}{skills_block}" if skills_block else ""
|
|
115
116
|
|
|
116
117
|
|
|
118
|
+
def _invoked_skill_section(ctx: TurnContext) -> str:
|
|
119
|
+
skill = ctx.invoked_skill
|
|
120
|
+
if skill is None:
|
|
121
|
+
return ""
|
|
122
|
+
return (
|
|
123
|
+
f"{INVOKED_SKILL_HEADING}"
|
|
124
|
+
f"The user explicitly invoked `{skill.name}`. "
|
|
125
|
+
"Use `list_skills` to get the skills root, then `read_file` that skill's "
|
|
126
|
+
f"`SKILL.md` (`skills/{skill.name}/SKILL.md`) and follow it before acting. "
|
|
127
|
+
"Text after the `/` command is the instruction for this invocation."
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
|
|
117
131
|
def _todo_list_section(ctx: TurnContext) -> str:
|
|
118
132
|
store = ctx.todo_store
|
|
119
133
|
if store is None:
|
|
@@ -152,7 +166,7 @@ def compose_volatile_tail(
|
|
|
152
166
|
*,
|
|
153
167
|
chat_messages: Sequence[Message] | None = None,
|
|
154
168
|
) -> str:
|
|
155
|
-
"""Volatile tail: current date + memory index + skills + current-request anchor."""
|
|
169
|
+
"""Volatile tail: current date + memory index + skills + invoked skill + current-request anchor."""
|
|
156
170
|
return "".join(compose_volatile_tail_parts(ctx, chat_messages=chat_messages).values())
|
|
157
171
|
|
|
158
172
|
|
|
@@ -165,12 +179,13 @@ def compose_volatile_tail_parts(
|
|
|
165
179
|
|
|
166
180
|
Lets callers (e.g. ``ContextEpochTracker``) attribute a mid-epoch volatile
|
|
167
181
|
change to the specific source that moved — current date, memory, skills,
|
|
168
|
-
todo list, or the current-request anchor — instead of a catch-all "volatile" label.
|
|
182
|
+
invoked skill, todo list, or the current-request anchor — instead of a catch-all "volatile" label.
|
|
169
183
|
"""
|
|
170
184
|
return {
|
|
171
185
|
"current_date": _current_date_block(),
|
|
172
186
|
"memory": _memory_block(ctx),
|
|
173
187
|
"skills": _skills_section(ctx),
|
|
188
|
+
"invoked_skill": _invoked_skill_section(ctx),
|
|
174
189
|
"todos": _todo_list_section(ctx),
|
|
175
190
|
"current_request": _current_request_block(chat_messages),
|
|
176
191
|
}
|
|
@@ -191,6 +206,7 @@ def compose_system_prompt(
|
|
|
191
206
|
|
|
192
207
|
Skill names are always taken from ``ctx.skills`` (zero-cost discovery); use
|
|
193
208
|
``list_skills``/``read_file`` for the skills root path and full ``SKILL.md`` procedure.
|
|
209
|
+
An explicit ``/slug`` invocation is listed under ``## Invoked skill`` for this turn.
|
|
194
210
|
"""
|
|
195
211
|
stable = compose_stable_baseline(ctx, attachment_catalog=attachment_catalog)
|
|
196
212
|
volatile = compose_volatile_tail(ctx, chat_messages=chat_messages)
|
|
@@ -46,6 +46,8 @@ from monkeybot.core.config.snapshot import (
|
|
|
46
46
|
get_config_store,
|
|
47
47
|
)
|
|
48
48
|
from monkeybot.core.context import LoopsToolRegistry, build_context
|
|
49
|
+
from monkeybot.core.context.common import text_from_blocks
|
|
50
|
+
from monkeybot.core.context.slash_skills import apply_invoked_skill
|
|
49
51
|
from monkeybot.core.hooks import HookManager
|
|
50
52
|
from monkeybot.core.knowledge import KnowledgeSubsystem, resolve_knowledge_settings
|
|
51
53
|
from monkeybot.core.knowledge.config import (
|
|
@@ -937,6 +939,8 @@ class GatewayLoopPort:
|
|
|
937
939
|
)
|
|
938
940
|
return
|
|
939
941
|
|
|
942
|
+
ctx = apply_invoked_skill(ctx, text_from_blocks(user_content))
|
|
943
|
+
|
|
940
944
|
executor = CoreToolExecutor(
|
|
941
945
|
workspace_root=workspace_root,
|
|
942
946
|
memory=getattr(serving.state, "memory", None),
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""Leading `/skill` invocation resolution and prompt injection."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import replace
|
|
4
|
+
|
|
5
|
+
from monkeybot.core.context import SkillRef, TurnContext
|
|
6
|
+
from monkeybot.core.context.slash_skills import apply_invoked_skill, resolve_invoked_skill
|
|
7
|
+
from monkeybot.core.llm.provider import Message
|
|
8
|
+
from monkeybot.core.prompts.prompt import compose_system_prompt, compose_volatile_tail_parts
|
|
9
|
+
from monkeybot.core.types.content_blocks import Text
|
|
10
|
+
from monkeybot.core.types.types_tools import ToolDef
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _ctx(*, skills: list[SkillRef] | None = None, invoked: SkillRef | None = None) -> TurnContext:
|
|
14
|
+
return TurnContext(
|
|
15
|
+
thread_id="t1",
|
|
16
|
+
request_id="r1",
|
|
17
|
+
agent_md="You are TestBot.",
|
|
18
|
+
memory_index=[],
|
|
19
|
+
skills=skills or [],
|
|
20
|
+
tools=[ToolDef("list_skills", "List skills.", {})],
|
|
21
|
+
user_id=None,
|
|
22
|
+
parent_run_id=None,
|
|
23
|
+
model="gemini-2.5-flash",
|
|
24
|
+
invoked_skill=invoked,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
BROWSER = SkillRef(name="browser", description="Control a browser")
|
|
29
|
+
IMAGE = SkillRef(name="image-generator", description="Generate images")
|
|
30
|
+
SKILLS = [BROWSER, IMAGE]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def test_resolve_matches_installed_skill_only() -> None:
|
|
34
|
+
assert resolve_invoked_skill("/browser now", SKILLS) is BROWSER
|
|
35
|
+
assert resolve_invoked_skill("/Browser now", SKILLS) is BROWSER
|
|
36
|
+
assert resolve_invoked_skill("please /browser now", SKILLS) is BROWSER
|
|
37
|
+
assert resolve_invoked_skill("/loop now", SKILLS) is None
|
|
38
|
+
assert resolve_invoked_skill("/not-a-skill", SKILLS) is None
|
|
39
|
+
assert resolve_invoked_skill("browser please", SKILLS) is None
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def test_apply_invoked_skill_is_turn_scoped() -> None:
|
|
43
|
+
ctx = _ctx(skills=SKILLS)
|
|
44
|
+
next_ctx = apply_invoked_skill(ctx, "/browser open the account page")
|
|
45
|
+
assert next_ctx.invoked_skill is BROWSER
|
|
46
|
+
assert ctx.invoked_skill is None
|
|
47
|
+
unchanged = apply_invoked_skill(ctx, "/missing do it")
|
|
48
|
+
assert unchanged is ctx
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def test_prompt_includes_invoked_skill_and_keeps_user_text() -> None:
|
|
52
|
+
user = "/browser open the account page"
|
|
53
|
+
ctx = _ctx(skills=SKILLS)
|
|
54
|
+
next_ctx = apply_invoked_skill(ctx, user)
|
|
55
|
+
out = compose_system_prompt(
|
|
56
|
+
next_ctx,
|
|
57
|
+
chat_messages=[Message(role="user", content=[Text(text=user)])],
|
|
58
|
+
)
|
|
59
|
+
assert "## Invoked skill\nThe user explicitly invoked `browser`." in out
|
|
60
|
+
assert "skills/browser/SKILL.md" in out
|
|
61
|
+
parts = compose_volatile_tail_parts(
|
|
62
|
+
next_ctx,
|
|
63
|
+
chat_messages=[Message(role="user", content=[Text(text=user)])],
|
|
64
|
+
)
|
|
65
|
+
assert "browser" in parts["invoked_skill"]
|
|
66
|
+
# History stays the original command text; only turn context is annotated.
|
|
67
|
+
assert user == "/browser open the account page"
|
|
68
|
+
assert next_ctx.agent_md == ctx.agent_md
|
|
69
|
+
assert next_ctx.skills == ctx.skills
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def test_prompt_omits_invoked_skill_without_match() -> None:
|
|
73
|
+
ctx = apply_invoked_skill(_ctx(skills=SKILLS), "/loop now")
|
|
74
|
+
out = compose_system_prompt(ctx)
|
|
75
|
+
assert "## Invoked skill" not in out
|
|
76
|
+
assert ctx.invoked_skill is None
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def test_invoked_skill_survives_tool_round_history() -> None:
|
|
80
|
+
ctx = replace(_ctx(skills=SKILLS), invoked_skill=BROWSER)
|
|
81
|
+
msgs = [
|
|
82
|
+
Message(role="user", content=[Text(text="/browser open the account page")]),
|
|
83
|
+
Message(role="assistant", content=[Text(text="calling tool")]),
|
|
84
|
+
]
|
|
85
|
+
parts = compose_volatile_tail_parts(ctx, chat_messages=msgs)
|
|
86
|
+
assert "explicitly invoked `browser`" in parts["invoked_skill"]
|
|
@@ -14,6 +14,7 @@ from monkeybot.core.llm.provider import Message, ProviderCallHints, UsageEvent
|
|
|
14
14
|
from monkeybot.core.prompts.headings import (
|
|
15
15
|
CURRENT_DATE_HEADING,
|
|
16
16
|
CURRENT_REQUEST_HEADING,
|
|
17
|
+
INVOKED_SKILL_HEADING,
|
|
17
18
|
MEMORY_INDEX_HEADING,
|
|
18
19
|
MEMORY_NUDGE_HEADING,
|
|
19
20
|
RUNTIME_NOTES_HEADING,
|
|
@@ -135,6 +136,7 @@ def test_volatile_markers_cover_every_heading_constant() -> None:
|
|
|
135
136
|
MEMORY_NUDGE_HEADING,
|
|
136
137
|
SKILLS_HEADING,
|
|
137
138
|
TODO_LIST_HEADING,
|
|
139
|
+
INVOKED_SKILL_HEADING,
|
|
138
140
|
CURRENT_REQUEST_HEADING,
|
|
139
141
|
RUNTIME_NOTES_HEADING,
|
|
140
142
|
SYSTEM_CONTEXT_UPDATE_HEADING,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{monkeybot-3.3.0 → monkeybot-3.4.0}/cli/src/monkeybot_cli/scaffold_defaults/browser/SKILL.md
RENAMED
|
File without changes
|