monkeybot 3.6.0__tar.gz → 3.6.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {monkeybot-3.6.0 → monkeybot-3.6.1}/CHANGELOG.md +8 -1
- {monkeybot-3.6.0 → monkeybot-3.6.1}/PKG-INFO +1 -1
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/pyproject.toml +1 -1
- {monkeybot-3.6.0 → monkeybot-3.6.1}/pyproject.toml +1 -1
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/core_tool_executor.py +13 -3
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/fs_isolation.py +153 -3
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_fs_isolation.py +129 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/.dockerignore +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/.github/workflows/ci.yml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/.github/workflows/live-eval-smoke.yml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/.github/workflows/prepare-release.yml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/.github/workflows/publish-release.yml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/.gitignore +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/.pre-commit-config.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/BACKLOG.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/CONTRIBUTING.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/LICENSE +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/README.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/skills/monkeybot/SKILL.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/skills/monkeybot/references/config-sections.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/chat_file_index.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/chat_local_shell.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/chat_renderer.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/chat_session.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/chat_status_bar.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/chat_theme.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/chat_tool_display.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/chat_tui.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/chat_tui_widgets.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/commands/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/commands/chat.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/commands/doctor.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/commands/loop.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/commands/new.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/commands/refresh.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/commands/run_cmd.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/commands/talk.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/commands/validate.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/compat.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/config_resolve.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/exit_commands.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/extras_catalog.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/gateway_health.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/main.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/opensandbox_lifecycle.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/output.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/process_tree.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/providers.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/realtime/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/realtime/audio_io.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/realtime/client.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/realtime/gateway_manager.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/realtime/push_to_talk.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/realtime/session.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/realtime/session_controller.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/realtime/talk_ui.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/realtime/wire_encode.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/runtime_python.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/AGENT.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/Dockerfile +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/browser/SKILL.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/command_allowlist.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/dockerignore +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/env.example +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/goal/SKILL.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/image-generator/SKILL.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/image-generator/generate_image.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/loop/SKILL.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/mcp.json +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/monkeybot.example.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/opensandbox.docker.toml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/otel-collector.example.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/permissions.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/session_controller.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/terminal_markdown.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_chat_continue.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_chat_e2e.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_chat_errors.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_chat_file_index.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_chat_grounding.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_chat_local_shell.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_chat_renderer_parity.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_chat_session.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_chat_status_bar.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_chat_theme.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_chat_tool_display.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_chat_tui.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_cli.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_config_resolve.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_doctor.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_extras_catalog.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_gateway_health.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_opensandbox_lifecycle.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_realtime_session_controller.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_run_cmd.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_runtime_python.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_scaffold.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/tests/test_terminal_markdown.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/cli/uv.lock +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docker/Dockerfile +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docker/demo-model.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docker/demo.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docker/docker-compose.sandbox.yml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docker/opensandbox.docker.toml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docker/sandbox.Dockerfile +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docker-compose.yml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/agent-layout.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/assets/logo.png +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/browser-mcp-perf-baseline.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/browser-mcp-performance-plan.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/browser-mcp.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/cloud-deployment-design.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/deploy-aws-agentcore.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/deploy-pattern-a-container.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/deploy-pattern-b-serverless.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/deploy-pattern-c-agent-platform.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/deploy-pattern-d-realtime.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/features.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/getting-started.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/knowledge-layer-fixes.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/live-evals.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/mcp.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/memory-graph-split-plan.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/migrations/agent-scope-namespacing.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/migrations/memory-outbox.sql +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/observability-runbook.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/ollama-local.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/otel-collector.example.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/progressive-loop-tools.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/progressive-mcp-tools.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/skills.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/spill-dynamic-design.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/sse-gateway-ui.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/verifier-agent-design.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/docs/workspace-index-design.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/TEST_COVERAGE.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/assertions.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/baselines/smoke.json +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/baselines/smoke.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/diff.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/eval_config.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/models.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/persistence.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/report.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/runner.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/scenario_loader.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/scenarios/context/summarization_trigger.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/scenarios/drift/declares_done.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/scenarios/drift/path_constraint.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/scenarios/drift/preempt.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/scenarios/drift/repeat_correction.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/scenarios/drift/supersession.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/scenarios/mcp/get_prompt.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/scenarios/mcp/list_resources.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/scenarios/mcp/tool_invoke.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/scenarios/memory/recall_cross_session.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/scenarios/memory/recall_single_session.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/scenarios/multi_turn/task_tracking.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/scenarios/skills/skill_invocation.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/scenarios/subagents/dispatch_complete.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/scenarios/tools/core_read.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/scenarios/tools/core_read_error.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/scenarios/tools/core_run_command.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/scenarios/tools/core_run_command_sandbox.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/scenarios/tools/core_write.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/scorer.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/smoke_agent/.env.example +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/smoke_agent/.gitignore +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/smoke_agent/fixture_mcp_server.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/smoke_agent/monkeybot_config/AGENT.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/smoke_agent/monkeybot_config/command_allowlist.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/smoke_agent/monkeybot_config/mcp.json +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/smoke_agent/monkeybot_config/monkeybot.verifier-on.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/smoke_agent/monkeybot_config/monkeybot.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/smoke_agent/monkeybot_config/permissions.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/smoke_agent/pyproject.toml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/smoke_agent/skills/browser/SKILL.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/smoke_agent/uv.lock +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/smoke_agent/workspace/.gitkeep +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/smoke_agent/workspace/skills/browser/playbooks/.gitkeep +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/suites/drift.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/suites/smoke.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/test_assertions.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/test_diff.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/test_judge.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/test_report.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/test_runner_sse.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/evals/test_scorer.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/examples/README.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/examples/agentcore/handler.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/examples/agentcore/runtime_app.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/examples/agentengine/handler.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/examples/cloud-functions/main.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/examples/lambda/handler.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/examples/ollama/PrefixStable.Modelfile +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/examples/skills/browser/SKILL.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/examples/skills/browser/playbooks/.gitkeep +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/examples/skills/diagnostics/README.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/examples/skills/diagnostics/SKILL.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/examples/skills/diagnostics/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/examples/skills/diagnostics/diagnostics.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/examples/skills/image-generator/SKILL.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/examples/skills/image-generator/generate_image.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/pyproject.toml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/scripts/agentcore_smoke.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/scripts/dump_tool_surface.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/scripts/perf_bench.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/actions.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/agentcore.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/app.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/assets/NOTICE.md +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/assets/dom_tree.js +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/assets/pa_driver.js +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/backend.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/chat_scope.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/dom_indexing.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/in_app_cdp.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/login.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/observe.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/perf.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/playbooks.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/playwright_helpers.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/results.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/screenshots.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/server.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/tab_ops.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/tabs.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/tools/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/tools/batch.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/tools/capture.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/tools/interact.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/tools/navigate.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/tools/playbook.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/tools/read.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/src/browser_mcp/tools/tab_control.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/fixtures/api.json +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/fixtures/article.html +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/fixtures/cards.html +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/fixtures/form.html +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/fixtures/long_list.html +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/fixtures/spa.html +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/fixtures/tool_surface.json +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/integration/conftest.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/integration/test_act_observe.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/integration/test_driver_persist.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/integration/test_intent_tools.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/integration/test_multi_tab.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/integration/test_observation.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/integration/test_run_playbook.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/integration/test_wait_for.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_act.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_agentcore.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_chat_scope.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_dom_indexing.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_fill_form.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_in_app_cdp.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_indexed_tools.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_observe.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_observe_after.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_perf.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_playbook_flows.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_playbooks.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_playwright_helpers.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_screenshots.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_server_shutdown.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_tabs.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_tool_surface.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/tests/test_wait_tools.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/integrations/browser-mcp/uv.lock +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/pytest.ini +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/scripts/create_schema.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/scripts/precommit-pytest.sh +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/scripts/release.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/scripts/smoke_global_cli.sh +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/cli/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/cli/__main__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/cli/audio_io.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/cli/gateway_manager.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/cli/main.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/cli/push_to_talk.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/cli/realtime_client.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/computer/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/computer/approvals.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/computer/permissions.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/computer/safety.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/computer/tools.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/attachments/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/attachments/catalog.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/attachments/config.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/attachments/freeze.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/attachments/image_preview.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/attachments/resolve.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/attachments/store.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/attachments/text.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/attachments/tools.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/bootstrap.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/config/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/config/realtime_config.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/config/runtime_env.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/config/settings.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/config/snapshot.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/config/validation.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/config/yaml_loader.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/context/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/context/campaign_context.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/context/common.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/context/epoch.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/context/secret_egress.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/context/slash_skills.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/context/tool_output_policy.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/context/tool_result_ingress.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/context/tool_shapers.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/goals/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/goals/service.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/hooks/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/captions.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/chunking.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/config.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/embeddings/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/embeddings/base.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/embeddings/factory.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/embeddings/gemini.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/embeddings/nvidia.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/embeddings/openai_compat.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/embeddings/sanitize.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/evidence_guard.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/extractors.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/fusion.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/hook.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/indexer.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/links.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/salience.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/sqlite_index.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/subsystem.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/tool.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/knowledge/types.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/layout.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/llm/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/llm/provider.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/llm/realtime_provider.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/llm/usage.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/lockfile_names.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/logging_utils.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/mcp/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/mcp/mcp_client.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/mcp/ports_mcp.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/config.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/hook.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/ids.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/ingest.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/migrate_layout.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/observability.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/outbox.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/palace.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/subsystem.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/uri.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/memory/writer.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/messages/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/messages/convert_provider.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/messages/tool_integrity.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/messages/transform_context.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/path_safety.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/backends.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/db.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/durable_runs.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/errors.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/firestore.indexes.json +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/firestore.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/firestore_scheduled_loops.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/goal_ledger.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/history.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/postgres.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/runs.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/scheduled_loops.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/session_turn_locks.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/sqlite.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/sqlite_backend.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/sqlite_vector.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/thread_summary.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/transcript.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/usage.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/persistence/usage_buckets.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/prompts/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/prompts/harness_prompt.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/prompts/headings.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/prompts/prompt.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/context_budget.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/doom_loop.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/events.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/history_compaction.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/input_admission.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/loop.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/loop_hooks.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/loop_messages.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/loop_ports.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/loop_usage.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/provider_stream_mapper.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/realtime_loop.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/tool_batch.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/tool_dispatch.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/turn_loop.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/runtime/utterance_buffer.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/subagents/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/subagents/progress_publish.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/subagents/subagent_proto.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/subagents/subagent_worker.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/subagents/worker_pool.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/subprocess_groups.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/testing/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/testing/mocks_provider.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/testing/mocks_realtime_provider.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/ask_user.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/grant_store.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/inspector.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/loop_inspector.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/patch.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/path_grant_inspector.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/permission.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/sandbox_executor.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/spill_inventory.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/terminal.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/text_normalize.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/tool_hint.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/tool_kind.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/types.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/tools/workspace_service.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/types/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/types/content_blocks.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/types/interfaces.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/types/types_tools.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/actuator.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/binding.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/classify.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/inspector.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/intervention.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/judge.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/ledger.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/mailbox.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/match.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/port.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/severity.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/verifier/tracker.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/workspace/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/workspace/factory.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/workspace/gcs.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/workspace/local.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/workspace/protocol.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/workspace/s3.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/core/workspace_layout.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/bootstrap.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/main.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/pending_response_bus.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime/app.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime/deps.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime/errors.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime/guardrails.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime/manager.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime/metrics.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime/routes.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime/session.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime/wire.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/realtime_main.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/app.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/goal_routes.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/loop_port.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/models.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/reload.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/reply_body.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/request_storage.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/routes.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/scheduler_routes.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/scheduler_wiring.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/session_bus.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/sse.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/gateway/sse/workspace_layout.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/observability/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/observability/_state.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/observability/instrumentation.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/observability/propagation.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/observability/spans.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/observability/sqlite_exporter.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/providers/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/providers/_bedrock_converse.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/providers/_openai_compat.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/providers/_utils.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/providers/bedrock.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/providers/claude.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/providers/gemini.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/providers/gemini_live.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/providers/huggingface.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/providers/model_capabilities.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/providers/nvidia.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/providers/ollama.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/providers/openai.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/providers/openrouter.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/providers/pricing.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/providers/request_budget.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/providers/sampling.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/providers/vertex_claude.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/scaffold/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/scheduler/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/scheduler/__main__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/scheduler/engine.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/scheduler/http_invoker.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/scheduler/interval.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/scheduler/tick_result.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/scheduler/worker.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/subagents/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/subagents/worker/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/subagents/worker/__main__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/todo_list/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/todo_list/store.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/todo_list/tool.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/web_search/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/web_search/backends/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/web_search/backends/duckduckgo.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/web_search/backends/firecrawl.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/web_search/backends/tavily.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/web_search/protocol.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/src/monkeybot/web_search/tool.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/acceptance/test_observability_acceptance.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/cli/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/cli/test_gateway_manager.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/cli/test_main.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/cli/test_push_to_talk.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/cli/test_realtime_client.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/computer/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/computer/test_approvals.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/computer/test_computer_tools.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/computer/test_package_init.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/computer/test_path_policy.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/computer/test_permissions.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/computer/test_subagent_exclusion.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/computer/test_wiring.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/conftest.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/fixtures/bitbucket_dc_style_pr.diff +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/memory/helpers.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/memory/in_memory_palace.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/memory/test_mempalace.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/memory/test_review_fixes.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_agent_layout.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_ask_user.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_attachment_freeze.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_attachment_store.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_bootstrap.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_config_extensions.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_content_blocks.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_context.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_context_budget.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_context_epoch.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_core_tool_executor.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_doom_loop.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_durable_events.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_durable_runs.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_empty_completion.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_env_map_grep_gates.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_events.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_evidence_guard.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_firestore_history.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_firestore_scheduled_loops.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_firestore_usage.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_gemini_history_replay.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_goal_ledger.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_goal_persistence.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_goals.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_grant_store.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_harness_prompt.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_history.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_history_compaction_split.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_hooks.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_image_preview.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_input_admission.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_inspector.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_knowledge_chunking.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_knowledge_chunking_rank.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_knowledge_config.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_knowledge_embeddings.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_knowledge_fts.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_knowledge_fusion.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_knowledge_fusion_ann.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_knowledge_hook.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_knowledge_indexer.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_knowledge_links.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_knowledge_media.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_knowledge_salience.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_knowledge_single_writer.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_knowledge_subsystem.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_knowledge_vectors.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_layout.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_logging_utils.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_loop.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_loop_hooks.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_loop_observability.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_loop_transcript.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_mcp_client.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_memory_layout_migrate.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_message_pipeline.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_mocks_realtime_provider.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_patch.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_path_grant_inspector.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_path_safety.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_permission.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_pricing.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_progress_publish.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_progress_tracker.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_prompt.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_provider_contract.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_provider_stream_mapper.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_realtime_loop.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_replace_fuzzy.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_run_command_parse.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_runs.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_runtime_config_snapshot.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_runtime_env.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_sandbox_executor.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_scheduled_loops.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_secret_egress.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_session_turn_locks.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_settlement.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_slash_skills.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_spill_dynamic.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_spill_inventory.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_storage_backends.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_subagent_proto.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_subagent_trace_propagation.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_subagent_worker_paths.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_terminal.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_thread_summary_wire.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_tool_def_schema.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_tool_integrity.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_tool_result_ingress.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_tool_shapers.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_transcript.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_truncated_tool_batch.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_usage.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_usage_migration.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_utterance_buffer.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_verifier_binding.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_verifier_inspector.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_verifier_judge.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_verifier_mailbox_lifecycle.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_verifier_sticky_nudge.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_worker_pool.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_workspace_extra_read_roots.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_workspace_layout.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_workspace_symlinks.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/test_workspace_write_scope.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/workspace/test_factory.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/workspace/test_local_storage.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/core/workspace/test_protocol_contract.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/evals/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/evals/eval_hook.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/evals/scenario_runner.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/evals/scenarios/memory_wake_up_large.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/evals/scenarios/memory_write_inject.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/evals/scenarios/subagent_roundtrip.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_glob_grep.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_load_file.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_loops.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_read.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_replace_apply_patch.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_run_command.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_search_knowledge.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_search_memory.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_todo_list.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_web_search.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/evals/scenarios/tool_write.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/evals/scenarios/turn_completion.yaml +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/evals/test_agent_behavior.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/evals/test_memory_knowledge_routing.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/evals/test_verifier_port.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/realtime/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/realtime/test_app.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/realtime/test_deps.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/realtime/test_guardrails.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/realtime/test_manager.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/realtime/test_metrics.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/realtime/test_routes_client_text.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/realtime/test_session.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/realtime/test_wire.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/sse/test_attachments.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/sse/test_config_reload.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/sse/test_create_session_model.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/sse/test_gateway_runtime.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/sse/test_routes.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/sse/test_scheduler_routes.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/sse/test_session_bus.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/sse/test_transcript_wiring.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/test_otel_fastapi.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/test_otel_lifespan.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/test_pending_response_endpoints.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/test_realtime_main.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/test_resolve_provider.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/test_sse_events.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/gateway/test_subagent_event_publisher.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/integration/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/integration/test_mb_e2e_simple_reply.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/integration/test_observability_integration.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/integration/test_prompt_caching_integration.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/observability/conftest.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/observability/test_init.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/observability/test_instrumentation.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/observability/test_loop_hook_spans.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/observability/test_propagation.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/observability/test_span_contract.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/observability/test_spans.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/observability/test_sqlite_exporter.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/observability/test_truncate.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/observability/test_turn_complete_trace.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/conftest.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/test_anthropic_cache.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/test_anthropic_history.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/test_bedrock_converse.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/test_bedrock_estimate.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/test_gemini_history.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/test_gemini_live.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/test_gemini_usage.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/test_huggingface.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/test_model_capabilities.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/test_nvidia.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/test_ollama.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/test_openai_byte_budget.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/test_openai_compat_usage.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/test_openai_history.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/test_pricing.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/test_request_budget.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/test_safe_parse_tool_args.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/test_sampling.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/test_sonnet5_sampling.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/test_source_grep_gates.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/providers/test_vertex_claude_history.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/scheduler/test_engine.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/scheduler/test_interval.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/skills/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/skills/test_generate_image_script.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/test_cold_start.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/test_packaging_config.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/test_release_script.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/todo_list/test_todo_list.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/web_search/__init__.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/tests/web_search/test_web_search.py +0 -0
- {monkeybot-3.6.0 → monkeybot-3.6.1}/uv.lock +0 -0
|
@@ -6,7 +6,14 @@ the project adheres to [Semantic Versioning](https://semver.org/).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## [core v3.6.1] - 2026-09-26
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- `run_command`'s macOS jail can launch onefile binaries that live under the home directory. Bundled `yt-dlp` needs to read its own executable and create a SysV semaphore; both were denied, so `/watch-video` died before any download.
|
|
14
|
+
- `run_command` can read an installed on-device Whisper model under the home directory, so `/watch-video` can transcribe with it.
|
|
15
|
+
|
|
16
|
+
## [cli v0.8.0] - 2026-09-21
|
|
10
17
|
|
|
11
18
|
#### Added
|
|
12
19
|
|
|
@@ -97,7 +97,12 @@ from monkeybot.core.subprocess_groups import (
|
|
|
97
97
|
stop_subagent_process,
|
|
98
98
|
)
|
|
99
99
|
from monkeybot.core.tools.ask_user import await_ask_user_answer, parse_ask_user_args
|
|
100
|
-
from monkeybot.core.tools.fs_isolation import
|
|
100
|
+
from monkeybot.core.tools.fs_isolation import (
|
|
101
|
+
JailRoots,
|
|
102
|
+
local_whisper_model_dirs,
|
|
103
|
+
memory_hidden_paths,
|
|
104
|
+
readable_bin_dirs_under_deny,
|
|
105
|
+
)
|
|
101
106
|
from monkeybot.core.tools.grant_store import PATH_GRANT_TOOLS, GrantStoreCache
|
|
102
107
|
from monkeybot.core.tools.inspector import parse_run_command
|
|
103
108
|
from monkeybot.core.tools.sandbox_executor import SandboxConfig, SandboxExecutor
|
|
@@ -1924,8 +1929,11 @@ class CoreToolExecutor(ToolExecutorPort):
|
|
|
1924
1929
|
a sibling of the workspace, not under it), OS temp dirs (read+write,
|
|
1925
1930
|
many toolchains stage there), skills and the interpreter's own
|
|
1926
1931
|
install prefix (read-only — the interpreter can live under $HOME for
|
|
1927
|
-
a bundled desktop app),
|
|
1928
|
-
|
|
1932
|
+
a bundled desktop app), PATH ``bin`` directories that sit inside the
|
|
1933
|
+
denied home (read-only — onefile tools such as bundled ``yt-dlp``
|
|
1934
|
+
have to read their own executable), an installed on-device Whisper
|
|
1935
|
+
model directory (read-only), and any folder the user has
|
|
1936
|
+
granted read access to, durably or for this turn (read-only).
|
|
1929
1937
|
"""
|
|
1930
1938
|
read_write: list[Path] = [self._workspace.repo_root]
|
|
1931
1939
|
if self._artifacts_path is not None:
|
|
@@ -1958,6 +1966,8 @@ class CoreToolExecutor(ToolExecutorPort):
|
|
|
1958
1966
|
deny: list[Path] = []
|
|
1959
1967
|
with contextlib.suppress(RuntimeError):
|
|
1960
1968
|
deny.append(Path.home())
|
|
1969
|
+
read_only.extend(readable_bin_dirs_under_deny(deny))
|
|
1970
|
+
read_only.extend(local_whisper_model_dirs(deny=deny))
|
|
1961
1971
|
|
|
1962
1972
|
return JailRoots(
|
|
1963
1973
|
read_write=tuple(dict.fromkeys(p.resolve() for p in read_write)),
|
|
@@ -27,8 +27,10 @@ profile instead: read is allowed everywhere except a set of ``deny`` roots
|
|
|
27
27
|
(the user's home directory, primarily), read+write is granted on top for a
|
|
28
28
|
small set of ``read_write`` roots (the workspace, artifacts, memory palace,
|
|
29
29
|
OS temp dirs), and read-only for ``read_only`` roots (skills, the interpreter
|
|
30
|
-
prefix, granted folders
|
|
31
|
-
|
|
30
|
+
prefix, granted folders, ``bin`` directories already on ``PATH``, and an
|
|
31
|
+
installed on-device Whisper model directory) even
|
|
32
|
+
when those happen to sit inside a denied root — which is the common case
|
|
33
|
+
for a desktop app whose workspace and bundled
|
|
32
34
|
Python both live under the user's home directory. Validated empirically
|
|
33
35
|
against real `python3`, `git`, `uv`, and `bash` invocations under
|
|
34
36
|
`sandbox-exec` on macOS; the Linux mount-namespace path follows the same
|
|
@@ -46,7 +48,7 @@ import os
|
|
|
46
48
|
import subprocess
|
|
47
49
|
import sys
|
|
48
50
|
import tempfile
|
|
49
|
-
from collections.abc import Sequence
|
|
51
|
+
from collections.abc import Mapping, Sequence
|
|
50
52
|
from dataclasses import dataclass
|
|
51
53
|
from pathlib import Path
|
|
52
54
|
|
|
@@ -421,6 +423,150 @@ def _resolved_strs(paths: Sequence[Path]) -> list[str]:
|
|
|
421
423
|
return [str(Path(p).expanduser().resolve()) for p in paths]
|
|
422
424
|
|
|
423
425
|
|
|
426
|
+
def _is_strict_child(path: Path, root: Path) -> bool:
|
|
427
|
+
try:
|
|
428
|
+
path.relative_to(root)
|
|
429
|
+
except ValueError:
|
|
430
|
+
return False
|
|
431
|
+
return path != root
|
|
432
|
+
|
|
433
|
+
|
|
434
|
+
def _resolved_deny_roots(deny: Sequence[Path]) -> list[Path]:
|
|
435
|
+
roots: list[Path] = []
|
|
436
|
+
for root in deny:
|
|
437
|
+
try:
|
|
438
|
+
roots.append(Path(root).expanduser().resolve())
|
|
439
|
+
except (OSError, RuntimeError):
|
|
440
|
+
continue
|
|
441
|
+
return roots
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
def readable_bin_dirs_under_deny(
|
|
445
|
+
deny: Sequence[Path],
|
|
446
|
+
*,
|
|
447
|
+
path_env: str | None = None,
|
|
448
|
+
) -> tuple[Path, ...]:
|
|
449
|
+
"""PATH ``bin`` directories that sit strictly inside a denied root.
|
|
450
|
+
|
|
451
|
+
Onefile bootloaders exec, then ``open()`` their own file to read the
|
|
452
|
+
embedded archive. ``process-exec`` is allowed, but file-read under the
|
|
453
|
+
denied home directory is not, so that open fails ("Could not load
|
|
454
|
+
PyInstaller's embedded PKG archive") unless the binary's directory is an
|
|
455
|
+
explicit read-only root. Only directories whose final component is
|
|
456
|
+
``bin`` qualify, and a PATH entry of the deny root itself is ignored so
|
|
457
|
+
``$HOME`` on PATH cannot reopen the whole tree.
|
|
458
|
+
"""
|
|
459
|
+
if path_env is None:
|
|
460
|
+
path_env = os.environ.get("PATH", "")
|
|
461
|
+
deny_roots = _resolved_deny_roots(deny)
|
|
462
|
+
if not deny_roots:
|
|
463
|
+
return ()
|
|
464
|
+
found: list[Path] = []
|
|
465
|
+
seen: set[Path] = set()
|
|
466
|
+
for part in path_env.split(os.pathsep):
|
|
467
|
+
part = part.strip()
|
|
468
|
+
if not part:
|
|
469
|
+
continue
|
|
470
|
+
try:
|
|
471
|
+
path = Path(part).expanduser().resolve()
|
|
472
|
+
except (OSError, RuntimeError):
|
|
473
|
+
continue
|
|
474
|
+
if path.name != "bin" or not path.is_dir():
|
|
475
|
+
continue
|
|
476
|
+
if _SEATBELT_PATH_METACHARS.intersection(str(path)):
|
|
477
|
+
logger.debug("skipping PATH bin dir with seatbelt metacharacters: %s", path)
|
|
478
|
+
continue
|
|
479
|
+
if not any(_is_strict_child(path, root) for root in deny_roots):
|
|
480
|
+
continue
|
|
481
|
+
if path in seen:
|
|
482
|
+
continue
|
|
483
|
+
seen.add(path)
|
|
484
|
+
found.append(path)
|
|
485
|
+
return tuple(found)
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
def _nonempty_file(path: Path) -> bool:
|
|
489
|
+
try:
|
|
490
|
+
return path.is_file() and path.stat().st_size > 0
|
|
491
|
+
except OSError as exc:
|
|
492
|
+
logger.debug("skipping whisper model file %s: %s", path, exc)
|
|
493
|
+
return False
|
|
494
|
+
|
|
495
|
+
|
|
496
|
+
def _whisper_weights_present(model_dir: Path) -> bool:
|
|
497
|
+
try:
|
|
498
|
+
return any(_nonempty_file(path) for path in model_dir.glob("ggml-*.bin"))
|
|
499
|
+
except OSError as exc:
|
|
500
|
+
logger.debug("skipping whisper model dir %s: %s", model_dir, exc)
|
|
501
|
+
return False
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
def local_whisper_model_dirs(
|
|
505
|
+
*,
|
|
506
|
+
home: Path | None = None,
|
|
507
|
+
env: Mapping[str, str] | None = None,
|
|
508
|
+
deny: Sequence[Path] = (),
|
|
509
|
+
) -> tuple[Path, ...]:
|
|
510
|
+
"""Directories holding an installed on-device Whisper ggml model.
|
|
511
|
+
|
|
512
|
+
``run_command`` denies file-read under the home directory, and
|
|
513
|
+
``whisper-cli`` has to open the weights. Only the model file's parent
|
|
514
|
+
is granted, and only when a ``ggml-*.bin`` weights file is actually
|
|
515
|
+
there — an uninstalled model adds nothing. A directory that is, or
|
|
516
|
+
contains, a ``deny`` root is never granted, so ``WHISPER_MODEL=~/ggml-x.bin``
|
|
517
|
+
cannot reopen the whole home directory.
|
|
518
|
+
"""
|
|
519
|
+
values = os.environ if env is None else env
|
|
520
|
+
deny_roots = _resolved_deny_roots(deny)
|
|
521
|
+
found: list[Path] = []
|
|
522
|
+
seen: set[Path] = set()
|
|
523
|
+
|
|
524
|
+
def _add(path: Path) -> None:
|
|
525
|
+
try:
|
|
526
|
+
resolved = path.expanduser().resolve()
|
|
527
|
+
except (OSError, RuntimeError) as exc:
|
|
528
|
+
logger.debug("skipping whisper model path %s: %s", path, exc)
|
|
529
|
+
return
|
|
530
|
+
if not resolved.is_dir():
|
|
531
|
+
return
|
|
532
|
+
if _SEATBELT_PATH_METACHARS.intersection(str(resolved)):
|
|
533
|
+
logger.debug(
|
|
534
|
+
"skipping whisper model dir with seatbelt metacharacters: %s",
|
|
535
|
+
resolved,
|
|
536
|
+
)
|
|
537
|
+
return
|
|
538
|
+
if any(root.is_relative_to(resolved) for root in deny_roots):
|
|
539
|
+
logger.debug("skipping whisper model dir that would expose a deny root: %s", resolved)
|
|
540
|
+
return
|
|
541
|
+
if resolved in seen:
|
|
542
|
+
return
|
|
543
|
+
seen.add(resolved)
|
|
544
|
+
found.append(resolved)
|
|
545
|
+
|
|
546
|
+
explicit = (values.get("WHISPER_MODEL") or "").strip()
|
|
547
|
+
if explicit:
|
|
548
|
+
model = Path(explicit).expanduser()
|
|
549
|
+
if model.match("ggml-*.bin") and _nonempty_file(model):
|
|
550
|
+
_add(model.parent)
|
|
551
|
+
|
|
552
|
+
raw_home = (values.get("MONKEYBOT_HOME") or "").strip()
|
|
553
|
+
if raw_home:
|
|
554
|
+
base = Path(raw_home).expanduser()
|
|
555
|
+
elif home is not None:
|
|
556
|
+
base = home
|
|
557
|
+
else:
|
|
558
|
+
try:
|
|
559
|
+
base = Path.home() / ".monkeybot"
|
|
560
|
+
except RuntimeError as exc:
|
|
561
|
+
logger.debug("whisper model dir lookup skipped: %s", exc)
|
|
562
|
+
base = None
|
|
563
|
+
if base is not None:
|
|
564
|
+
model_dir = base / "models" / "whisper"
|
|
565
|
+
if _whisper_weights_present(model_dir):
|
|
566
|
+
_add(model_dir)
|
|
567
|
+
return tuple(found)
|
|
568
|
+
|
|
569
|
+
|
|
424
570
|
def _seatbelt_jail_profile(roots: JailRoots) -> str:
|
|
425
571
|
deny = _resolved_strs(roots.deny)
|
|
426
572
|
read_write = _resolved_strs(roots.read_write)
|
|
@@ -439,6 +585,10 @@ def _seatbelt_jail_profile(roots: JailRoots) -> str:
|
|
|
439
585
|
"(allow sysctl-read)",
|
|
440
586
|
"(allow file-read-metadata)",
|
|
441
587
|
"(allow ipc-posix-shm)",
|
|
588
|
+
# PyInstaller onefile bootloaders (bundled yt-dlp) call semctl while
|
|
589
|
+
# unpacking. process-exec alone is not enough; without this the
|
|
590
|
+
# binary dies with "Failed to initialize sync semaphore".
|
|
591
|
+
"(allow ipc-sysv-sem)",
|
|
442
592
|
]
|
|
443
593
|
if deny:
|
|
444
594
|
lines.append(f'(allow file-read* (require-all (subpath "/") {deny_excludes}))')
|
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import os
|
|
6
|
+
import shutil
|
|
5
7
|
import subprocess
|
|
6
8
|
import sys
|
|
9
|
+
import tempfile
|
|
7
10
|
from pathlib import Path
|
|
8
11
|
|
|
9
12
|
import pytest
|
|
@@ -18,7 +21,9 @@ from monkeybot.core.tools.fs_isolation import (
|
|
|
18
21
|
isolation_failed,
|
|
19
22
|
isolation_support,
|
|
20
23
|
jailed_argv,
|
|
24
|
+
local_whisper_model_dirs,
|
|
21
25
|
memory_hidden_paths,
|
|
26
|
+
readable_bin_dirs_under_deny,
|
|
22
27
|
reset_isolation_support_cache,
|
|
23
28
|
)
|
|
24
29
|
|
|
@@ -254,6 +259,100 @@ class TestJailRoots:
|
|
|
254
259
|
assert not JailRoots(always_deny=(Path("/ws/palace"),)).is_empty()
|
|
255
260
|
|
|
256
261
|
|
|
262
|
+
class TestReadableBinDirs:
|
|
263
|
+
def test_only_bin_dirs_strictly_inside_a_deny_root(self, tmp_path: Path):
|
|
264
|
+
home = tmp_path / "home"
|
|
265
|
+
tools = home / "app" / "vendor" / "tools" / "bin"
|
|
266
|
+
local_bin = home / ".local" / "bin"
|
|
267
|
+
documents = home / "Documents"
|
|
268
|
+
outside = tmp_path / "opt" / "homebrew" / "bin"
|
|
269
|
+
for path in (tools, local_bin, documents, outside):
|
|
270
|
+
path.mkdir(parents=True)
|
|
271
|
+
|
|
272
|
+
found = readable_bin_dirs_under_deny(
|
|
273
|
+
(home,),
|
|
274
|
+
path_env=os.pathsep.join(
|
|
275
|
+
[str(tools), str(documents), str(home), str(outside), str(local_bin), ""]
|
|
276
|
+
),
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
assert tools.resolve() in found
|
|
280
|
+
assert local_bin.resolve() in found
|
|
281
|
+
assert documents.resolve() not in found
|
|
282
|
+
assert home.resolve() not in found
|
|
283
|
+
assert outside.resolve() not in found
|
|
284
|
+
|
|
285
|
+
def test_skips_paths_that_would_break_the_seatbelt_profile(self, tmp_path: Path):
|
|
286
|
+
home = tmp_path / "home"
|
|
287
|
+
bad = home / 'bin"(allow default)' / "bin"
|
|
288
|
+
bad.mkdir(parents=True)
|
|
289
|
+
|
|
290
|
+
found = readable_bin_dirs_under_deny((home,), path_env=str(bad))
|
|
291
|
+
assert found == ()
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
class TestLocalWhisperModelDirs:
|
|
295
|
+
def test_grants_the_model_directory_only_when_weights_exist(self, tmp_path: Path):
|
|
296
|
+
home = tmp_path / "monkeybot"
|
|
297
|
+
model_dir = home / "models" / "whisper"
|
|
298
|
+
model_dir.mkdir(parents=True)
|
|
299
|
+
assert local_whisper_model_dirs(home=home, env={}) == ()
|
|
300
|
+
|
|
301
|
+
empty = model_dir / "ggml-empty.bin"
|
|
302
|
+
empty.write_bytes(b"")
|
|
303
|
+
assert local_whisper_model_dirs(home=home, env={}) == ()
|
|
304
|
+
|
|
305
|
+
weights = model_dir / "ggml-custom.bin"
|
|
306
|
+
weights.write_bytes(b"weights")
|
|
307
|
+
assert local_whisper_model_dirs(home=home, env={}) == (model_dir.resolve(),)
|
|
308
|
+
|
|
309
|
+
def test_explicit_model_path_grants_its_parent(self, tmp_path: Path):
|
|
310
|
+
model = tmp_path / "custom" / "ggml-custom.bin"
|
|
311
|
+
model.parent.mkdir()
|
|
312
|
+
model.write_bytes(b"weights")
|
|
313
|
+
empty_home = tmp_path / "empty-home"
|
|
314
|
+
empty_home.mkdir()
|
|
315
|
+
|
|
316
|
+
found = local_whisper_model_dirs(
|
|
317
|
+
home=empty_home,
|
|
318
|
+
env={"WHISPER_MODEL": str(model), "MONKEYBOT_HOME": str(empty_home)},
|
|
319
|
+
)
|
|
320
|
+
assert found == (model.parent.resolve(),)
|
|
321
|
+
|
|
322
|
+
def test_explicit_model_must_be_named_like_ggml_weights(self, tmp_path: Path):
|
|
323
|
+
model = tmp_path / "custom" / "notes.bin"
|
|
324
|
+
model.parent.mkdir()
|
|
325
|
+
model.write_bytes(b"weights")
|
|
326
|
+
empty_home = tmp_path / "empty-home"
|
|
327
|
+
empty_home.mkdir()
|
|
328
|
+
|
|
329
|
+
found = local_whisper_model_dirs(
|
|
330
|
+
home=empty_home,
|
|
331
|
+
env={"WHISPER_MODEL": str(model), "MONKEYBOT_HOME": str(empty_home)},
|
|
332
|
+
)
|
|
333
|
+
assert found == ()
|
|
334
|
+
|
|
335
|
+
def test_explicit_model_cannot_expose_a_deny_root(self, tmp_path: Path):
|
|
336
|
+
home = tmp_path / "home"
|
|
337
|
+
home.mkdir()
|
|
338
|
+
model = home / "ggml-base.bin"
|
|
339
|
+
model.write_bytes(b"weights")
|
|
340
|
+
empty_home = tmp_path / "empty-home"
|
|
341
|
+
empty_home.mkdir()
|
|
342
|
+
env = {"WHISPER_MODEL": str(model), "MONKEYBOT_HOME": str(empty_home)}
|
|
343
|
+
|
|
344
|
+
assert local_whisper_model_dirs(home=empty_home, env=env, deny=(home,)) == ()
|
|
345
|
+
assert local_whisper_model_dirs(home=empty_home, env=env, deny=(home / "sub",)) == ()
|
|
346
|
+
|
|
347
|
+
nested = home / "models" / "ggml-base.bin"
|
|
348
|
+
nested.parent.mkdir()
|
|
349
|
+
nested.write_bytes(b"weights")
|
|
350
|
+
env["WHISPER_MODEL"] = str(nested)
|
|
351
|
+
assert local_whisper_model_dirs(home=empty_home, env=env, deny=(home,)) == (
|
|
352
|
+
nested.parent.resolve(),
|
|
353
|
+
)
|
|
354
|
+
|
|
355
|
+
|
|
257
356
|
class TestJailedArgv:
|
|
258
357
|
def test_empty_roots_is_a_passthrough(self):
|
|
259
358
|
support = IsolationSupport("namespace", "test")
|
|
@@ -283,6 +382,7 @@ class TestJailedArgv:
|
|
|
283
382
|
assert '(require-not (subpath "/Users/x"))' in profile
|
|
284
383
|
assert '(allow file-read* file-write* (subpath "/Users/x/agent/workspace"))' in profile
|
|
285
384
|
assert '(allow file-read* (subpath "/Users/x/agent/skills"))' in profile
|
|
385
|
+
assert "(allow ipc-sysv-sem)" in profile
|
|
286
386
|
assert args[-2:] == ["/bin/bash", "-c"] or args[-3:] == ["/bin/bash", "-c", "true"]
|
|
287
387
|
|
|
288
388
|
def test_sandbox_exec_profile_allows_gitconfig_by_name(self, monkeypatch):
|
|
@@ -584,6 +684,35 @@ class TestMacJailBootstrap:
|
|
|
584
684
|
assert other.returncode == 0
|
|
585
685
|
assert "workspace-content" in other.stdout
|
|
586
686
|
|
|
687
|
+
def test_pyinstaller_binary_under_home_can_start(self, tmp_path: Path):
|
|
688
|
+
"""Onefile binaries under $HOME must be readable and may call semctl.
|
|
689
|
+
|
|
690
|
+
Bundled yt-dlp fails closed without both: file-read of its own
|
|
691
|
+
executable, and ipc-sysv-sem. Skip unless the yt-dlp on PATH lives
|
|
692
|
+
under $HOME; a system install elsewhere would not exercise either.
|
|
693
|
+
"""
|
|
694
|
+
home = Path.home()
|
|
695
|
+
yt_dlp = shutil.which("yt-dlp")
|
|
696
|
+
if yt_dlp is None or not Path(yt_dlp).resolve().is_relative_to(home.resolve()):
|
|
697
|
+
pytest.skip("needs a yt-dlp binary under $HOME on PATH")
|
|
698
|
+
workspace = tmp_path / "workspace"
|
|
699
|
+
workspace.mkdir()
|
|
700
|
+
shared = [Path(tempfile.gettempdir())]
|
|
701
|
+
for extra in ("/tmp", "/private/tmp"):
|
|
702
|
+
if os.path.isdir(extra):
|
|
703
|
+
shared.append(Path(extra))
|
|
704
|
+
roots = JailRoots(
|
|
705
|
+
deny=(home,),
|
|
706
|
+
read_write=(workspace,),
|
|
707
|
+
read_only=readable_bin_dirs_under_deny((home,)),
|
|
708
|
+
shared_write=tuple(shared),
|
|
709
|
+
)
|
|
710
|
+
|
|
711
|
+
proc = self._run(roots, [yt_dlp, "--version"], cwd=workspace)
|
|
712
|
+
|
|
713
|
+
assert proc.returncode == 0, proc.stderr
|
|
714
|
+
assert proc.stdout.strip()
|
|
715
|
+
|
|
587
716
|
|
|
588
717
|
@pytest.mark.skipif(
|
|
589
718
|
not sys.platform.startswith("linux"),
|
|
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.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/browser/SKILL.md
RENAMED
|
File without changes
|
{monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/command_allowlist.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/image-generator/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/monkeybot.example.yaml
RENAMED
|
File without changes
|
{monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/opensandbox.docker.toml
RENAMED
|
File without changes
|
|
File without changes
|
{monkeybot-3.6.0 → monkeybot-3.6.1}/cli/src/monkeybot_cli/scaffold_defaults/permissions.yaml
RENAMED
|
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
|