monkeybot 3.0.3__tar.gz → 3.0.4__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.0.3 → monkeybot-3.0.4}/CHANGELOG.md +12 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/PKG-INFO +1 -1
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/skills/monkeybot/SKILL.md +3 -1
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/skills/monkeybot/references/config-sections.md +1 -1
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/extras_catalog.py +2 -1
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/providers.py +11 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold.py +1 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/env.example +4 -1
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/monkeybot.example.yaml +1 -1
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_extras_catalog.py +5 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_scaffold.py +1 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/features.md +4 -2
- {monkeybot-3.0.3 → monkeybot-3.0.4}/pyproject.toml +1 -1
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/bootstrap.py +5 -1
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/config/settings.py +15 -3
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/config/validation.py +8 -12
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/__init__.py +2 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/config.py +15 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/loop_usage.py +6 -1
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/app.py +14 -2
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/ollama.py +86 -16
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_config_extensions.py +22 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_config.py +23 -19
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/test_resolve_provider.py +30 -2
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_ollama.py +102 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/uv.lock +1 -1
- {monkeybot-3.0.3 → monkeybot-3.0.4}/.dockerignore +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/.github/workflows/ci.yml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/.github/workflows/live-eval-smoke.yml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/.github/workflows/prepare-release.yml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/.github/workflows/publish-release.yml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/.gitignore +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/.pre-commit-config.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/BACKLOG.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/CONTRIBUTING.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/LICENSE +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/README.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/pyproject.toml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/chat_file_index.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/chat_local_shell.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/chat_renderer.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/chat_session.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/chat_status_bar.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/chat_theme.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/chat_tool_display.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/chat_tui.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/chat_tui_widgets.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/commands/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/commands/chat.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/commands/doctor.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/commands/loop.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/commands/new.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/commands/refresh.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/commands/run_cmd.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/commands/talk.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/commands/validate.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/compat.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/config_resolve.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/exit_commands.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/gateway_health.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/main.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/opensandbox_lifecycle.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/output.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/process_tree.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/realtime/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/realtime/audio_io.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/realtime/client.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/realtime/gateway_manager.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/realtime/push_to_talk.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/realtime/session.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/realtime/session_controller.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/realtime/talk_ui.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/realtime/wire_encode.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/runtime_python.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/AGENT.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/Dockerfile +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/browser/SKILL.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/command_allowlist.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/dockerignore +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/image-generator/SKILL.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/image-generator/generate_image.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/loop/SKILL.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/mcp.json +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/opensandbox.docker.toml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/otel-collector.example.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/permissions.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/session_controller.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/terminal_markdown.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_continue.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_e2e.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_errors.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_file_index.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_grounding.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_local_shell.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_renderer_parity.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_session.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_status_bar.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_theme.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_tool_display.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_chat_tui.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_cli.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_config_resolve.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_doctor.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_gateway_health.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_opensandbox_lifecycle.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_realtime_session_controller.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_run_cmd.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_runtime_python.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/tests/test_terminal_markdown.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/cli/uv.lock +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docker/Dockerfile +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docker/docker-compose.sandbox.yml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docker/opensandbox.docker.toml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docker/sandbox.Dockerfile +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docker-compose.yml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/agent-layout.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/assets/logo.png +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/browser-mcp.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/cloud-deployment-design.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/deploy-aws-agentcore.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/deploy-pattern-a-container.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/deploy-pattern-b-serverless.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/deploy-pattern-c-agent-platform.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/deploy-pattern-d-realtime.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/getting-started.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/knowledge-layer-fixes.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/live-evals.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/mcp.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/memory-graph-split-plan.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/migrations/agent-scope-namespacing.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/migrations/memory-outbox.sql +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/observability-runbook.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/otel-collector.example.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/progressive-loop-tools.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/progressive-mcp-tools.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/skills.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/spill-dynamic-design.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/sse-gateway-ui.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/docs/workspace-index-design.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/TEST_COVERAGE.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/assertions.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/diff.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/eval_config.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/models.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/persistence.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/report.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/runner.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenario_loader.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/context/summarization_trigger.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/mcp/get_prompt.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/mcp/list_resources.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/mcp/tool_invoke.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/memory/recall_cross_session.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/memory/recall_single_session.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/multi_turn/task_tracking.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/skills/skill_invocation.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/subagents/dispatch_complete.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/tools/core_read.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/tools/core_read_error.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/tools/core_run_command.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/tools/core_run_command_sandbox.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scenarios/tools/core_write.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/scorer.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/.env.example +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/.gitignore +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/fixture_mcp_server.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/monkeybot_config/AGENT.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/monkeybot_config/command_allowlist.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/monkeybot_config/mcp.json +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/monkeybot_config/monkeybot.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/monkeybot_config/permissions.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/pyproject.toml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/skills/browser/SKILL.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/uv.lock +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/workspace/.gitkeep +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/smoke_agent/workspace/skills/browser/playbooks/.gitkeep +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/suites/smoke.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/test_assertions.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/test_diff.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/test_judge.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/test_report.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/test_runner_sse.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/evals/test_scorer.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/README.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/agentcore/handler.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/agentcore/runtime_app.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/agentengine/handler.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/cloud-functions/main.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/lambda/handler.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/skills/browser/SKILL.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/skills/browser/playbooks/.gitkeep +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/skills/diagnostics/README.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/skills/diagnostics/SKILL.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/skills/diagnostics/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/skills/diagnostics/diagnostics.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/skills/image-generator/SKILL.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/examples/skills/image-generator/generate_image.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/pyproject.toml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/scripts/agentcore_smoke.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/src/browser_mcp/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/src/browser_mcp/agentcore.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/src/browser_mcp/assets/NOTICE.md +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/src/browser_mcp/assets/dom_tree.js +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/src/browser_mcp/assets/pa_driver.js +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/src/browser_mcp/dom_indexing.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/src/browser_mcp/playbooks.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/src/browser_mcp/playwright_helpers.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/src/browser_mcp/screenshots.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/src/browser_mcp/server.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/tests/test_agentcore.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/tests/test_dom_indexing.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/tests/test_in_app_cdp.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/tests/test_indexed_tools.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/tests/test_playbooks.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/tests/test_playwright_helpers.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/tests/test_screenshots.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/tests/test_server_shutdown.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/integrations/browser-mcp/uv.lock +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/pytest.ini +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/scripts/create_schema.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/scripts/precommit-pytest.sh +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/scripts/release.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/scripts/smoke_global_cli.sh +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/cli/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/cli/__main__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/cli/audio_io.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/cli/gateway_manager.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/cli/main.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/cli/push_to_talk.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/cli/realtime_client.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/computer/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/computer/approvals.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/computer/permissions.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/computer/safety.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/computer/tools.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/attachments/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/attachments/catalog.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/attachments/config.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/attachments/freeze.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/attachments/resolve.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/attachments/store.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/attachments/text.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/attachments/tools.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/config/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/config/realtime_config.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/config/runtime_env.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/config/yaml_loader.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/context/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/context/campaign_context.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/context/common.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/context/epoch.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/context/tool_output_policy.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/context/tool_result_ingress.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/context/tool_shapers.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/hooks/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/captions.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/chunking.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/embeddings/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/embeddings/base.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/embeddings/factory.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/embeddings/gemini.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/embeddings/nvidia.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/embeddings/openai_compat.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/embeddings/sanitize.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/evidence_guard.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/extractors.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/fusion.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/hook.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/indexer.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/links.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/salience.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/sqlite_index.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/subsystem.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/tool.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/knowledge/types.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/layout.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/llm/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/llm/provider.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/llm/realtime_provider.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/llm/usage.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/lockfile_names.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/logging_utils.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/mcp/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/mcp/mcp_client.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/mcp/ports_mcp.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/config.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/hook.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/ids.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/ingest.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/migrate_layout.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/observability.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/outbox.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/palace.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/subsystem.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/uri.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/memory/writer.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/messages/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/messages/convert_provider.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/messages/tool_integrity.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/messages/transform_context.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/path_safety.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/backends.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/db.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/durable_runs.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/errors.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/firestore.indexes.json +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/firestore.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/firestore_scheduled_loops.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/history.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/postgres.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/runs.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/scheduled_loops.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/session_turn_locks.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/sqlite.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/sqlite_backend.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/sqlite_vector.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/thread_summary.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/transcript.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/transcript_analyzer.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/usage.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/persistence/usage_buckets.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/prompts/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/prompts/harness_prompt.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/prompts/headings.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/prompts/prompt.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/context_budget.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/doom_loop.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/events.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/history_compaction.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/input_admission.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/loop.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/loop_hooks.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/loop_messages.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/loop_ports.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/provider_stream_mapper.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/realtime_loop.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/tool_batch.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/tool_dispatch.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/turn_loop.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/runtime/utterance_buffer.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/subagents/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/subagents/progress_publish.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/subagents/subagent_proto.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/subagents/subagent_worker.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/subagents/worker_pool.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/testing/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/testing/mocks_provider.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/testing/mocks_realtime_provider.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/core_tool_executor.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/fs_isolation.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/inspector.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/loop_inspector.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/patch.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/permission.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/sandbox_executor.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/spill_inventory.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/terminal.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/text_normalize.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/tool_hint.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/tool_kind.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/types.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/tools/workspace_service.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/types/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/types/content_blocks.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/types/interfaces.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/types/types_tools.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/workspace/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/workspace/factory.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/workspace/gcs.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/workspace/local.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/workspace/protocol.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/workspace/s3.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/core/workspace_layout.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/bootstrap.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/main.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/pending_response_bus.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime/app.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime/deps.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime/errors.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime/guardrails.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime/manager.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime/metrics.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime/routes.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime/session.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime/wire.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/realtime_main.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/loop_port.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/models.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/reply_body.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/routes.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/scheduler_routes.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/scheduler_wiring.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/session_bus.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/sse.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/gateway/sse/workspace_layout.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/observability/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/observability/_state.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/observability/instrumentation.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/observability/propagation.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/observability/spans.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/observability/sqlite_exporter.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/_bedrock_converse.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/_openai_compat.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/_utils.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/bedrock.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/claude.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/gemini.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/gemini_live.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/huggingface.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/model_capabilities.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/nvidia.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/openai.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/openrouter.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/pricing.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/sampling.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/providers/vertex_claude.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/scaffold/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/scheduler/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/scheduler/__main__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/scheduler/engine.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/scheduler/http_invoker.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/scheduler/interval.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/scheduler/tick_result.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/scheduler/worker.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/subagents/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/subagents/worker/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/subagents/worker/__main__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/todo_list/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/todo_list/store.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/todo_list/tool.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/web_search/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/web_search/backends/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/web_search/backends/duckduckgo.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/web_search/backends/firecrawl.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/web_search/backends/tavily.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/web_search/protocol.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/src/monkeybot/web_search/tool.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/acceptance/test_observability_acceptance.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/cli/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/cli/test_gateway_manager.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/cli/test_main.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/cli/test_push_to_talk.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/cli/test_realtime_client.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/computer/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/computer/test_approvals.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/computer/test_computer_tools.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/computer/test_package_init.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/computer/test_path_policy.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/computer/test_permissions.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/computer/test_subagent_exclusion.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/computer/test_wiring.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/conftest.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/fixtures/bitbucket_dc_style_pr.diff +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/memory/helpers.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/memory/in_memory_palace.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/memory/test_mempalace.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/memory/test_review_fixes.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_agent_layout.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_attachment_freeze.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_attachment_store.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_bootstrap.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_content_blocks.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_context.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_context_budget.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_context_epoch.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_core_tool_executor.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_doom_loop.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_durable_events.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_durable_runs.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_empty_completion.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_events.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_evidence_guard.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_firestore_history.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_firestore_scheduled_loops.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_firestore_usage.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_fs_isolation.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_gemini_history_replay.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_harness_prompt.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_history.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_history_compaction_split.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_hooks.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_input_admission.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_inspector.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_chunking.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_chunking_rank.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_embeddings.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_fts.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_fusion.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_fusion_ann.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_hook.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_indexer.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_links.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_media.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_salience.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_single_writer.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_subsystem.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_knowledge_vectors.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_layout.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_logging_utils.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_loop.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_loop_hooks.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_loop_observability.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_loop_transcript.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_mcp_client.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_memory_layout_migrate.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_message_pipeline.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_mocks_realtime_provider.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_patch.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_path_safety.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_permission.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_pricing.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_progress_publish.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_prompt.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_provider_contract.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_provider_stream_mapper.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_realtime_loop.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_replace_fuzzy.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_run_command_parse.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_runs.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_runtime_env.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_sandbox_executor.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_scheduled_loops.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_session_turn_locks.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_settlement.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_spill_dynamic.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_spill_inventory.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_storage_backends.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_subagent_proto.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_subagent_trace_propagation.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_subagent_worker_paths.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_terminal.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_thread_summary_wire.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_tool_def_schema.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_tool_integrity.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_tool_result_ingress.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_tool_shapers.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_transcript.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_transcript_analyzer.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_truncated_tool_batch.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_usage.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_usage_migration.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_utterance_buffer.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_worker_pool.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_workspace_layout.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_workspace_symlinks.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/test_workspace_write_scope.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/workspace/test_factory.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/workspace/test_local_storage.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/core/workspace/test_protocol_contract.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/eval_hook.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenario_runner.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/context_curation.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/memory_write_inject.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/subagent_roundtrip.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_glob_grep.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_load_file.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_loops.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_read.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_replace_apply_patch.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_run_command.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_search_knowledge.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_search_memory.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_todo_list.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_web_search.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/tool_write.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/scenarios/turn_completion.yaml +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/test_agent_behavior.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/evals/test_memory_knowledge_routing.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/realtime/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/realtime/test_app.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/realtime/test_deps.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/realtime/test_guardrails.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/realtime/test_manager.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/realtime/test_metrics.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/realtime/test_routes_client_text.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/realtime/test_session.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/realtime/test_wire.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/sse/test_attachments.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/sse/test_create_session_model.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/sse/test_routes.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/sse/test_scheduler_routes.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/sse/test_session_bus.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/sse/test_transcript_wiring.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/test_otel_fastapi.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/test_otel_lifespan.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/test_pending_response_endpoints.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/test_realtime_main.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/test_sse_events.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/gateway/test_subagent_event_publisher.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/integration/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/integration/test_mb_e2e_simple_reply.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/integration/test_observability_integration.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/integration/test_prompt_caching_integration.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/observability/conftest.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/observability/test_init.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/observability/test_instrumentation.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/observability/test_loop_hook_spans.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/observability/test_propagation.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/observability/test_span_contract.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/observability/test_spans.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/observability/test_sqlite_exporter.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/observability/test_truncate.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/observability/test_turn_complete_trace.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/conftest.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_anthropic_cache.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_anthropic_history.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_bedrock_converse.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_bedrock_estimate.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_gemini_live.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_gemini_usage.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_huggingface.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_model_capabilities.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_nvidia.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_openai_compat_usage.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_openai_history.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_pricing.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_safe_parse_tool_args.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_sampling.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_sonnet5_sampling.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_source_grep_gates.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/providers/test_vertex_claude_history.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/scheduler/test_engine.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/scheduler/test_interval.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/skills/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/skills/test_generate_image_script.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/test_cold_start.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/test_packaging_config.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/test_release_script.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/todo_list/test_todo_list.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/web_search/__init__.py +0 -0
- {monkeybot-3.0.3 → monkeybot-3.0.4}/tests/web_search/test_web_search.py +0 -0
|
@@ -6,6 +6,18 @@ the project adheres to [Semantic Versioning](https://semver.org/).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
### CLI
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- CLI extras catalog / `monkeybot new` provider menu lists `ollama-cloud` and `ollama-local` instead of a single `ollama` row. `--with ollama` and `--provider ollama` still work.
|
|
14
|
+
|
|
15
|
+
## [core v3.0.4] - 2026-08-28
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
|
|
19
|
+
- Explicit `ollama-cloud` and `ollama-local` provider ids so Cloud always hits `https://ollama.com` even when a leftover local `OLLAMA_BASE_URL` is set. Legacy `ollama` still auto-routes from env.
|
|
20
|
+
|
|
9
21
|
## [core v3.0.3] - 2026-08-23
|
|
10
22
|
|
|
11
23
|
### Added
|
|
@@ -111,7 +111,9 @@ uv sync
|
|
|
111
111
|
| `vertex-claude` | `GCP_PROJECT_ID` / `GOOGLE_CLOUD_PROJECT` / `ANTHROPIC_VERTEX_PROJECT_ID` (ADC) | `monkeybot[vertex-claude]` |
|
|
112
112
|
| `aws_bedrock` | `AWS_ACCESS_KEY_ID` / `AWS_PROFILE` + `AWS_REGION` | `monkeybot[bedrock]` |
|
|
113
113
|
| `huggingface` | `HF_TOKEN` (or `HUGGINGFACE_API_KEY`) | `monkeybot[huggingface]` |
|
|
114
|
-
| `ollama` |
|
|
114
|
+
| `ollama-cloud` | `OLLAMA_API_KEY` | `monkeybot[ollama]` |
|
|
115
|
+
| `ollama-local` | None required — `OLLAMA_BASE_URL` (default `http://localhost:11434`) | `monkeybot[ollama]` |
|
|
116
|
+
| `ollama` | Legacy auto-route (key + blank URL = cloud; explicit URL wins) | `monkeybot[ollama]` |
|
|
115
117
|
|
|
116
118
|
**Agent-first dependencies.** The CLI is thin — it does **not** install provider/storage extras globally. `monkeybot new` scaffolds a `pyproject.toml` with the selected provider (and any `--with` extras). Run plain `uv sync` in the agent directory. `monkeybot run` / `chat` spawn the gateway from that project's interpreter (`.venv/bin/python`, else `uv run python`), and `doctor` checks extras in that same interpreter. For a config-only tree (just `monkeybot_config/`, no `pyproject.toml`) the gateway uses the CLI's interpreter when it already has MonkeyBot 3.x (and MemPalace if memory is on). If memory is enabled and that interpreter cannot import MemPalace, `run` / `chat` provision a cached CLI-managed venv under `~/.cache/monkeybot/runtimes/` holding `monkeybot[memory]` pinned to the running core (never rewrites a `pyproject.toml`). `doctor` reuses that cache when it is already present. Otherwise extras must be installed in the CLI env (`uv tool install --with 'monkeybot[<extra>]' monkeybot-cli`).
|
|
117
119
|
|
|
@@ -45,7 +45,7 @@ Validate check ids: `paths.agent_md.exists`, `paths.skills_path.exists`, `paths.
|
|
|
45
45
|
| `max_turns` | `1000` | Hard cap on turns per run |
|
|
46
46
|
| `summarization_model` | (main model) | Cheaper model for history summarization (env `CONTEXT_SUMMARIZATION_MODEL`) |
|
|
47
47
|
|
|
48
|
-
Validate check ids: `model.provider.supported`, `model.name.present`. Supported YAML providers: `gemini`/`vertex`, `openai`, `anthropic`, `vertex-claude`, `huggingface`, `ollama`, `aws_bedrock`, `fake`.
|
|
48
|
+
Validate check ids: `model.provider.supported`, `model.name.present`. Supported YAML providers: `gemini`/`vertex`, `openai`, `anthropic`, `vertex-claude`, `huggingface`, `ollama-cloud`, `ollama-local`, `ollama`, `aws_bedrock`, `fake`.
|
|
49
49
|
|
|
50
50
|
## `gcp` / `anthropic_vertex` (non-secret identifiers)
|
|
51
51
|
|
|
@@ -24,7 +24,8 @@ PROVIDER_CHOICES: tuple[ExtraChoice, ...] = (
|
|
|
24
24
|
ExtraChoice("vertex-claude", "Claude on Vertex AI"),
|
|
25
25
|
ExtraChoice("aws_bedrock", "AWS Bedrock"),
|
|
26
26
|
ExtraChoice("huggingface", "Hugging Face"),
|
|
27
|
-
ExtraChoice("ollama", "Ollama
|
|
27
|
+
ExtraChoice("ollama-cloud", "Ollama Cloud"),
|
|
28
|
+
ExtraChoice("ollama-local", "Ollama (local)"),
|
|
28
29
|
ExtraChoice("nvidia", "NVIDIA NIM"),
|
|
29
30
|
ExtraChoice("openrouter", "OpenRouter"),
|
|
30
31
|
)
|
|
@@ -59,6 +59,17 @@ PROVIDER_SPECS: dict[str, ProviderSpec] = {
|
|
|
59
59
|
(),
|
|
60
60
|
credentials_optional=True,
|
|
61
61
|
),
|
|
62
|
+
"ollama-cloud": ProviderSpec(
|
|
63
|
+
("ollama-cloud", "ollama_cloud"),
|
|
64
|
+
"ollama",
|
|
65
|
+
("OLLAMA_API_KEY",),
|
|
66
|
+
),
|
|
67
|
+
"ollama-local": ProviderSpec(
|
|
68
|
+
("ollama-local", "ollama_local"),
|
|
69
|
+
"ollama",
|
|
70
|
+
(),
|
|
71
|
+
credentials_optional=True,
|
|
72
|
+
),
|
|
62
73
|
"fake": ProviderSpec(("fake",), None, (), credentials_optional=True),
|
|
63
74
|
}
|
|
64
75
|
|
|
@@ -28,7 +28,10 @@ DB_URL=sqlite:///data/monkeybot.db
|
|
|
28
28
|
# Hugging Face
|
|
29
29
|
# HF_TOKEN=
|
|
30
30
|
|
|
31
|
-
# Ollama (
|
|
31
|
+
# Ollama Cloud (model.provider: ollama-cloud) — key from ollama.com/settings/keys
|
|
32
|
+
# OLLAMA_API_KEY=
|
|
33
|
+
|
|
34
|
+
# Ollama local (model.provider: ollama-local) — no API key needed
|
|
32
35
|
# OLLAMA_BASE_URL=http://localhost:11434
|
|
33
36
|
|
|
34
37
|
# Optional web search
|
{monkeybot-3.0.3 → monkeybot-3.0.4}/cli/src/monkeybot_cli/scaffold_defaults/monkeybot.example.yaml
RENAMED
|
@@ -87,7 +87,7 @@ paths:
|
|
|
87
87
|
workspace_root: ./workspace
|
|
88
88
|
|
|
89
89
|
model:
|
|
90
|
-
# gemini | openai | anthropic | vertex-claude | huggingface | ollama | nvidia | openrouter | aws_bedrock | fake
|
|
90
|
+
# gemini | openai | anthropic | vertex-claude | huggingface | ollama-cloud | ollama-local | ollama | nvidia | openrouter | aws_bedrock | fake
|
|
91
91
|
provider: gemini
|
|
92
92
|
name: gemini-3.1-flash-live-preview
|
|
93
93
|
temperature: 0.7
|
|
@@ -21,6 +21,8 @@ def test_normalize_extra_token_features_and_providers() -> None:
|
|
|
21
21
|
assert normalize_extra_token("anthropic") == "claude"
|
|
22
22
|
assert normalize_extra_token("aws_bedrock") == "bedrock"
|
|
23
23
|
assert normalize_extra_token("claude") == "claude"
|
|
24
|
+
assert normalize_extra_token("ollama-cloud") == "ollama"
|
|
25
|
+
assert normalize_extra_token("ollama-local") == "ollama"
|
|
24
26
|
assert normalize_extra_token("fake") is None
|
|
25
27
|
assert normalize_extra_token("not-a-real-extra") is None
|
|
26
28
|
|
|
@@ -42,6 +44,9 @@ def test_extra_module_covers_catalog_extras() -> None:
|
|
|
42
44
|
def test_provider_extra_name() -> None:
|
|
43
45
|
assert provider_extra_name("openai") == "openai"
|
|
44
46
|
assert provider_extra_name("anthropic") == "claude"
|
|
47
|
+
assert provider_extra_name("ollama-cloud") == "ollama"
|
|
48
|
+
assert provider_extra_name("ollama-local") == "ollama"
|
|
49
|
+
assert provider_extra_name("ollama") == "ollama"
|
|
45
50
|
assert provider_extra_name("fake") is None
|
|
46
51
|
|
|
47
52
|
|
|
@@ -37,6 +37,7 @@ def test_run_new_creates_bundle(tmp_path: Path) -> None:
|
|
|
37
37
|
assert (tmp_path / "workspace" / ".gitkeep").is_file()
|
|
38
38
|
assert (tmp_path / "workspace" / "browser" / "playbooks").is_dir()
|
|
39
39
|
assert (tmp_path / "workspace" / "generated-media" / "images").is_dir()
|
|
40
|
+
assert (tmp_path / "workspace" / "generated-media" / "video").is_dir()
|
|
40
41
|
assert not (tmp_path / "workspace" / "skills").exists()
|
|
41
42
|
assert (tmp_path / "Dockerfile").is_file()
|
|
42
43
|
assert (tmp_path / ".dockerignore").is_file()
|
|
@@ -221,6 +221,7 @@ Each section follows: **Purpose** · **Key files** · **How it works** · **Depe
|
|
|
221
221
|
| `vertex_anthropic` | vertex-claude | anthropic-messages | `cache_control` |
|
|
222
222
|
| `aws_bedrock` | — | anthropic-messages | `cache_control` |
|
|
223
223
|
| `huggingface` / `nvidia` / `ollama` | — | openai-compat | none |
|
|
224
|
+
| `ollama-cloud` / `ollama-local` | ollama_cloud, ollama_local | openai-compat | none |
|
|
224
225
|
| `fake` | — | fake | gateway/test only |
|
|
225
226
|
|
|
226
227
|
**Auth:** see CLI `monkeybot doctor` and `cli/.../providers.py` (`PROVIDER_SPECS`).
|
|
@@ -232,7 +233,7 @@ Each section follows: **Purpose** · **Key files** · **How it works** · **Depe
|
|
|
232
233
|
- `count_input_tokens()` must match the same payload shape as `stream()` (summarization triggers, tool budgets).
|
|
233
234
|
- Provider resolution via `MODEL_PROVIDER` aliases (`gemini` → `google_vertexai`, `vertex-claude` → `vertex_anthropic`).
|
|
234
235
|
- Optional extras in `pyproject.toml`: `gemini`, `openai`, `claude`, `vertex-claude`, `bedrock`, `huggingface`, `ollama`, `nvidia`.
|
|
235
|
-
- `ollama`, `huggingface`, and `nvidia` share the OpenAI-compatible streaming core (`providers/_openai_compat.py`) and only differ in base URL / auth
|
|
236
|
+
- `ollama`, `huggingface`, and `nvidia` share the OpenAI-compatible streaming core (`providers/_openai_compat.py`) and only differ in base URL / auth. Prefer explicit ids: `ollama-cloud` always hits `https://ollama.com` and requires `OLLAMA_API_KEY`; `ollama-local` always uses the local/self-hosted host (`OLLAMA_BASE_URL`, default `http://localhost:11434`) and needs no API key. Legacy `ollama` still auto-routes (a key with no URL means cloud; an explicit URL always wins). `nvidia` hits `https://integrate.api.nvidia.com/v1` and needs a free `NVIDIA_API_KEY` from build.nvidia.com.
|
|
236
237
|
- `MODEL_PROVIDER=fake` is gateway/test-only; unit tests inject `ScriptedFakeProvider` directly.
|
|
237
238
|
|
|
238
239
|
**Prompt-cache session hints (`ProviderCallHints`):**
|
|
@@ -267,7 +268,7 @@ Each section follows: **Purpose** · **Key files** · **How it works** · **Depe
|
|
|
267
268
|
| `glob` / `grep` | Path discovery / content regex search (prefer over shell) |
|
|
268
269
|
| `apply_patch` | Multi-file Codex-style Add/Update/Delete/Move; fail-closed before any write |
|
|
269
270
|
| `search_memory` | Keyword search in memory tree |
|
|
270
|
-
| `search` / `recall` | Local knowledge index (workspace + notes); **parallel-safe**. Gateway owns writes; subagents open the index **read-only
|
|
271
|
+
| `search` / `recall` | Local knowledge index (workspace + notes); **parallel-safe**. Gateway owns writes; subagents open the index **read-only**. Harness-as-library (Pattern B/C) callers can opt into read-only via `MONKEYBOT_KNOWLEDGE_READ_ONLY=1`; the gateway always ignores this flag and stays the writer |
|
|
271
272
|
| `list_skills` | Skill discovery |
|
|
272
273
|
| `run_command` | Allowlisted shell (host or OpenSandbox) |
|
|
273
274
|
| `task` | Subagent subprocess (parent only) |
|
|
@@ -292,6 +293,7 @@ Each section follows: **Purpose** · **Key files** · **How it works** · **Depe
|
|
|
292
293
|
- `task` omitted in subagent workers (`include_task_tool=False`).
|
|
293
294
|
- Nested `task` disabled inside subagents.
|
|
294
295
|
- Custom tools must not collide with core or MCP names.
|
|
296
|
+
- `MONKEYBOT_KNOWLEDGE_READ_ONLY` (default off) opens the knowledge index read-only for `create_harness_deps` (Pattern B/C) callers; subagent workers are always read-only regardless of the flag. The gateway SSE app is the sole writer per workspace and ignores this flag, logging a warning if it is set.
|
|
295
297
|
|
|
296
298
|
---
|
|
297
299
|
|
|
@@ -17,7 +17,10 @@ from monkeybot.core.config.settings import auto_schema_enabled_from_config, get_
|
|
|
17
17
|
from monkeybot.core.context import build_context
|
|
18
18
|
from monkeybot.core.hooks import HookManager
|
|
19
19
|
from monkeybot.core.knowledge import KnowledgeSubsystem, resolve_knowledge_settings
|
|
20
|
-
from monkeybot.core.knowledge.config import
|
|
20
|
+
from monkeybot.core.knowledge.config import (
|
|
21
|
+
knowledge_enabled_from_config,
|
|
22
|
+
knowledge_read_only_from_env,
|
|
23
|
+
)
|
|
21
24
|
from monkeybot.core.llm.provider import Provider
|
|
22
25
|
from monkeybot.core.llm.usage import usage_from_totals
|
|
23
26
|
from monkeybot.core.mcp.mcp_client import MCPClient
|
|
@@ -181,6 +184,7 @@ async def create_harness_deps(
|
|
|
181
184
|
settings=settings,
|
|
182
185
|
knowledge_root=Path(settings.knowledge_root),
|
|
183
186
|
index_path=Path(settings.index_path),
|
|
187
|
+
read_only=knowledge_read_only_from_env(),
|
|
184
188
|
)
|
|
185
189
|
await knowledge.ensure_ready()
|
|
186
190
|
except Exception as exc:
|
|
@@ -5,7 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
import logging
|
|
6
6
|
import os
|
|
7
7
|
from dataclasses import dataclass
|
|
8
|
-
from typing import Any
|
|
8
|
+
from typing import Any, Literal
|
|
9
9
|
|
|
10
10
|
from monkeybot.core.config.yaml_loader import load_monkeybot_yaml_dict
|
|
11
11
|
from monkeybot.core.llm.provider import Provider
|
|
@@ -27,6 +27,16 @@ _MODEL_PROVIDER_ALIASES: dict[str, str] = {
|
|
|
27
27
|
"google-vertexai": "google_vertexai",
|
|
28
28
|
"vertex-claude": "vertex_anthropic",
|
|
29
29
|
"vertex_claude": "vertex_anthropic",
|
|
30
|
+
# Hyphen form is the YAML / desktop-app id (unlike vertex-claude, which
|
|
31
|
+
# maps onto a different internal id).
|
|
32
|
+
"ollama_cloud": "ollama-cloud",
|
|
33
|
+
"ollama_local": "ollama-local",
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
_OLLAMA_MODES: dict[str, Literal["auto", "cloud", "local"]] = {
|
|
37
|
+
"ollama": "auto",
|
|
38
|
+
"ollama-cloud": "cloud",
|
|
39
|
+
"ollama-local": "local",
|
|
30
40
|
}
|
|
31
41
|
|
|
32
42
|
|
|
@@ -203,9 +213,11 @@ def get_provider_config(
|
|
|
203
213
|
),
|
|
204
214
|
resolved_model,
|
|
205
215
|
)
|
|
206
|
-
|
|
216
|
+
ollama_mode = _OLLAMA_MODES.get(provider_key)
|
|
217
|
+
if ollama_mode is not None:
|
|
207
218
|
return ProviderConfig(
|
|
208
219
|
OllamaProvider(
|
|
220
|
+
mode=ollama_mode,
|
|
209
221
|
temperature=sampling.temperature,
|
|
210
222
|
max_tokens=sampling.max_tokens,
|
|
211
223
|
thinking_budget=thinking_budget,
|
|
@@ -243,7 +255,7 @@ def get_provider_config(
|
|
|
243
255
|
raise ValueError(
|
|
244
256
|
f"Unsupported model provider: {provider_key}. "
|
|
245
257
|
"Supported providers: google_vertexai, openai, anthropic, vertex_anthropic, "
|
|
246
|
-
"huggingface, ollama, nvidia, openrouter, aws_bedrock"
|
|
258
|
+
"huggingface, ollama, ollama-cloud, ollama-local, nvidia, openrouter, aws_bedrock"
|
|
247
259
|
)
|
|
248
260
|
|
|
249
261
|
|
|
@@ -17,6 +17,8 @@ SUPPORTED_MODEL_PROVIDERS = frozenset(
|
|
|
17
17
|
"vertex_anthropic",
|
|
18
18
|
"huggingface",
|
|
19
19
|
"ollama",
|
|
20
|
+
"ollama-cloud",
|
|
21
|
+
"ollama-local",
|
|
20
22
|
"nvidia",
|
|
21
23
|
"openrouter",
|
|
22
24
|
"fake",
|
|
@@ -24,23 +26,17 @@ SUPPORTED_MODEL_PROVIDERS = frozenset(
|
|
|
24
26
|
}
|
|
25
27
|
)
|
|
26
28
|
|
|
27
|
-
|
|
29
|
+
# Canonical ids plus YAML aliases (gemini → google_vertexai, ollama_cloud →
|
|
30
|
+
# ollama-cloud, …). Env validation uses SUPPORTED_MODEL_PROVIDERS after
|
|
31
|
+
# normalize_model_provider; YAML validation checks the raw string.
|
|
32
|
+
SUPPORTED_YAML_MODEL_PROVIDERS = SUPPORTED_MODEL_PROVIDERS | frozenset(
|
|
28
33
|
{
|
|
29
34
|
"gemini",
|
|
30
35
|
"vertex",
|
|
31
|
-
"google_vertexai",
|
|
32
|
-
"google_genai",
|
|
33
|
-
"openai",
|
|
34
|
-
"anthropic",
|
|
35
36
|
"vertex-claude",
|
|
36
37
|
"vertex_claude",
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"ollama",
|
|
40
|
-
"nvidia",
|
|
41
|
-
"openrouter",
|
|
42
|
-
"fake",
|
|
43
|
-
"aws_bedrock",
|
|
38
|
+
"ollama_cloud",
|
|
39
|
+
"ollama_local",
|
|
44
40
|
}
|
|
45
41
|
)
|
|
46
42
|
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from monkeybot.core.knowledge.config import (
|
|
4
4
|
knowledge_enabled_from_config,
|
|
5
|
+
knowledge_read_only_from_env,
|
|
5
6
|
resolve_knowledge_settings,
|
|
6
7
|
)
|
|
7
8
|
from monkeybot.core.knowledge.subsystem import KnowledgeSubsystem
|
|
@@ -12,5 +13,6 @@ __all__ = [
|
|
|
12
13
|
"KnowledgeSubsystem",
|
|
13
14
|
"RecallHit",
|
|
14
15
|
"knowledge_enabled_from_config",
|
|
16
|
+
"knowledge_read_only_from_env",
|
|
15
17
|
"resolve_knowledge_settings",
|
|
16
18
|
]
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import logging
|
|
6
|
+
import os
|
|
6
7
|
import shutil
|
|
7
8
|
from pathlib import Path
|
|
8
9
|
from typing import Any
|
|
@@ -39,6 +40,19 @@ def knowledge_enabled_from_config(config_path: str | None = None) -> bool:
|
|
|
39
40
|
raise ConfigError(f"knowledge.enabled must be true or false, got {raw!r}")
|
|
40
41
|
|
|
41
42
|
|
|
43
|
+
def knowledge_read_only_from_env() -> bool:
|
|
44
|
+
"""Opt-in only; default off (``MONKEYBOT_KNOWLEDGE_READ_ONLY``).
|
|
45
|
+
|
|
46
|
+
Intended for harness-as-library (Pattern B/C) and other reader-only
|
|
47
|
+
clients that want search without indexing writes. The gateway process
|
|
48
|
+
is the sole writer per workspace (see :class:`KnowledgeSubsystem`) and
|
|
49
|
+
ignores this flag rather than honoring it, so exporting it in a shared
|
|
50
|
+
env file cannot silently turn the writer into a reader.
|
|
51
|
+
"""
|
|
52
|
+
raw = os.environ.get("MONKEYBOT_KNOWLEDGE_READ_ONLY", "").strip().lower()
|
|
53
|
+
return raw in ("1", "true", "yes")
|
|
54
|
+
|
|
55
|
+
|
|
42
56
|
def resolve_knowledge_settings(
|
|
43
57
|
*,
|
|
44
58
|
agent_root: Path | None = None,
|
|
@@ -255,5 +269,6 @@ def _bool(yaml_raw: Any, default: bool) -> bool:
|
|
|
255
269
|
|
|
256
270
|
__all__ = [
|
|
257
271
|
"knowledge_enabled_from_config",
|
|
272
|
+
"knowledge_read_only_from_env",
|
|
258
273
|
"resolve_knowledge_settings",
|
|
259
274
|
]
|
|
@@ -61,12 +61,17 @@ def _merge_usage_event(usage: Usage, ev: UsageEvent) -> None:
|
|
|
61
61
|
usage.cache_creation_tokens += ev.cache_creation_tokens
|
|
62
62
|
|
|
63
63
|
|
|
64
|
+
_THINKING_BUDGET_PROVIDERS = frozenset(
|
|
65
|
+
{"gemini", "claude", "ollama", "ollama-cloud", "ollama-local"}
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
|
|
64
69
|
def _stream_thinking_budget(
|
|
65
70
|
provider: Provider,
|
|
66
71
|
resolved_messages: Sequence[Message],
|
|
67
72
|
) -> int | None:
|
|
68
73
|
"""Per-call thinking budget override; None keeps the provider default."""
|
|
69
|
-
if provider.name not in
|
|
74
|
+
if provider.name not in _THINKING_BUDGET_PROVIDERS:
|
|
70
75
|
return None
|
|
71
76
|
raw = os.environ.get("MONKEYBOT_RESUME_THINKING_BUDGET", "").strip()
|
|
72
77
|
if not raw:
|
|
@@ -35,7 +35,10 @@ from monkeybot.core.config.settings import (
|
|
|
35
35
|
from monkeybot.core.context import LoopsToolRegistry, build_context
|
|
36
36
|
from monkeybot.core.hooks import HookManager
|
|
37
37
|
from monkeybot.core.knowledge import KnowledgeSubsystem, resolve_knowledge_settings
|
|
38
|
-
from monkeybot.core.knowledge.config import
|
|
38
|
+
from monkeybot.core.knowledge.config import (
|
|
39
|
+
knowledge_enabled_from_config,
|
|
40
|
+
knowledge_read_only_from_env,
|
|
41
|
+
)
|
|
39
42
|
from monkeybot.core.layout import AgentLayout
|
|
40
43
|
from monkeybot.core.llm.provider import (
|
|
41
44
|
Done,
|
|
@@ -45,7 +48,8 @@ from monkeybot.core.llm.provider import (
|
|
|
45
48
|
ToolCall,
|
|
46
49
|
UsageEvent,
|
|
47
50
|
)
|
|
48
|
-
from monkeybot.core.llm.usage import Usage as UsageRecord
|
|
51
|
+
from monkeybot.core.llm.usage import Usage as UsageRecord
|
|
52
|
+
from monkeybot.core.llm.usage import UsageGranularity
|
|
49
53
|
from monkeybot.core.logging_utils import kv
|
|
50
54
|
from monkeybot.core.mcp.mcp_client import MCPClient
|
|
51
55
|
from monkeybot.core.memory.config import memory_enabled_from_config
|
|
@@ -647,6 +651,13 @@ async def _startup(fastapi_app: FastAPI) -> None:
|
|
|
647
651
|
# Unified knowledge layer — FTS + ANN + links + search
|
|
648
652
|
if knowledge_enabled_from_config():
|
|
649
653
|
try:
|
|
654
|
+
if knowledge_read_only_from_env():
|
|
655
|
+
logger.warning(
|
|
656
|
+
"MONKEYBOT_KNOWLEDGE_READ_ONLY is set but ignored here: the gateway "
|
|
657
|
+
"process is the sole writer per workspace and always opens the "
|
|
658
|
+
"knowledge index read-write. Set it on subagent/harness-as-library "
|
|
659
|
+
"clients instead."
|
|
660
|
+
)
|
|
650
661
|
layout = AgentLayout.from_environment()
|
|
651
662
|
settings = resolve_knowledge_settings(workspace_root=layout.workspace_root)
|
|
652
663
|
knowledge = await KnowledgeSubsystem.create(
|
|
@@ -654,6 +665,7 @@ async def _startup(fastapi_app: FastAPI) -> None:
|
|
|
654
665
|
settings=settings,
|
|
655
666
|
knowledge_root=Path(settings.knowledge_root),
|
|
656
667
|
index_path=Path(settings.index_path),
|
|
668
|
+
read_only=False,
|
|
657
669
|
)
|
|
658
670
|
hook_mgr = _deps.hook_manager
|
|
659
671
|
if hook_mgr is None:
|
|
@@ -5,18 +5,24 @@ Ollama exposes an OpenAI-compatible endpoint at ``/v1`` on top of its native
|
|
|
5
5
|
API, so this adapter reuses the same request/response plumbing as
|
|
6
6
|
``OpenAIProvider`` and ``HuggingFaceProvider``.
|
|
7
7
|
|
|
8
|
+
YAML ``model.provider``:
|
|
9
|
+
|
|
10
|
+
- ``ollama-cloud`` — always ``https://ollama.com``. Ignores a leftover local
|
|
11
|
+
``OLLAMA_BASE_URL``. Requires ``OLLAMA_API_KEY``.
|
|
12
|
+
- ``ollama-local`` — always the local/self-hosted host. Ignores a cloud URL.
|
|
13
|
+
- ``ollama`` — legacy auto-route: a key with no URL means cloud; an explicit
|
|
14
|
+
URL always wins (including ``http://127.0.0.1:11434``).
|
|
15
|
+
|
|
8
16
|
Configuration (environment variables or ``monkeybot.yaml``):
|
|
9
17
|
|
|
10
|
-
- ``OLLAMA_BASE_URL`` — OpenAI-compat base host.
|
|
11
|
-
``
|
|
12
|
-
|
|
13
|
-
missing.
|
|
18
|
+
- ``OLLAMA_BASE_URL`` — OpenAI-compat base host. Used by ``ollama-local`` and
|
|
19
|
+
legacy ``ollama``. Ignored by ``ollama-cloud`` unless it already points at
|
|
20
|
+
ollama.com. ``/v1`` is appended when missing.
|
|
14
21
|
- ``OLLAMA_API_KEY`` — required for Ollama Cloud (ollama.com/settings/keys).
|
|
15
22
|
Local Ollama ignores it; the OpenAI SDK still needs a non-empty string, so a
|
|
16
|
-
dummy is used when unset.
|
|
17
|
-
reverse proxy enforces auth.
|
|
23
|
+
dummy is used when unset.
|
|
18
24
|
- ``MODEL_NAME`` — model id passed to the API (e.g. ``llama3.1``, ``qwen2.5``,
|
|
19
|
-
or a cloud id such as ``
|
|
25
|
+
or a cloud id such as ``glm-5.3-flash``). Local models must already be pulled
|
|
20
26
|
(``ollama pull <model>``).
|
|
21
27
|
- ``MODEL_TEMPERATURE`` — sampling temperature (default: ``0.7``; set via ``monkeybot.yaml`` / constructor)
|
|
22
28
|
- ``MODEL_MAX_TOKENS`` — max output tokens (default: ``60000``; set via ``monkeybot.yaml`` / constructor)
|
|
@@ -35,6 +41,8 @@ from __future__ import annotations
|
|
|
35
41
|
import logging
|
|
36
42
|
import os
|
|
37
43
|
from collections.abc import AsyncIterator, Sequence
|
|
44
|
+
from typing import Literal
|
|
45
|
+
from urllib.parse import urlparse
|
|
38
46
|
|
|
39
47
|
from monkeybot.core.llm.provider import (
|
|
40
48
|
Message,
|
|
@@ -48,26 +56,81 @@ from monkeybot.providers._openai_compat import (
|
|
|
48
56
|
)
|
|
49
57
|
from monkeybot.providers.sampling import resolve_model_sampling
|
|
50
58
|
|
|
59
|
+
OllamaMode = Literal["auto", "cloud", "local"]
|
|
60
|
+
|
|
51
61
|
_DEFAULT_LOCAL_URL = "http://localhost:11434"
|
|
52
62
|
_DEFAULT_CLOUD_URL = "https://ollama.com"
|
|
53
63
|
_DUMMY_API_KEY = "ollama"
|
|
54
64
|
_log = logging.getLogger(__name__)
|
|
55
65
|
|
|
56
66
|
|
|
57
|
-
def
|
|
58
|
-
""
|
|
67
|
+
def _is_cloud_host(url: str) -> bool:
|
|
68
|
+
host = urlparse(url if "://" in url else f"https://{url}").hostname or ""
|
|
69
|
+
host = host.lower()
|
|
70
|
+
return host == "ollama.com" or host.endswith(".ollama.com")
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _normalize_cloud_base(url: str) -> str:
|
|
74
|
+
"""Return a usable https URL for an Ollama Cloud host.
|
|
75
|
+
|
|
76
|
+
Scheme-less values get ``https://``. Plaintext ``http://`` is upgraded so
|
|
77
|
+
the API key never travels in the clear.
|
|
78
|
+
"""
|
|
79
|
+
if "://" not in url:
|
|
80
|
+
return f"https://{url}"
|
|
81
|
+
parsed = urlparse(url)
|
|
82
|
+
if parsed.scheme == "http":
|
|
83
|
+
upgraded = parsed._replace(scheme="https").geturl()
|
|
84
|
+
_log.warning(
|
|
85
|
+
"ollama-cloud upgrading plaintext OLLAMA_BASE_URL %s",
|
|
86
|
+
kv(ignored=url, host=upgraded),
|
|
87
|
+
)
|
|
88
|
+
return upgraded
|
|
89
|
+
return url
|
|
59
90
|
|
|
60
|
-
|
|
61
|
-
|
|
91
|
+
|
|
92
|
+
def _resolve_host_and_key(mode: OllamaMode = "auto") -> tuple[str, str]:
|
|
93
|
+
"""Pick local vs cloud host from env and provider mode.
|
|
94
|
+
|
|
95
|
+
``cloud`` ignores a leftover localhost URL so a prior local-runtime persist
|
|
96
|
+
cannot steal cloud traffic. ``local`` ignores a cloud URL and never forwards
|
|
97
|
+
``OLLAMA_API_KEY`` (an authenticating reverse proxy uses legacy ``ollama``
|
|
98
|
+
plus an explicit URL). ``auto`` keeps the legacy rule: an explicit URL
|
|
99
|
+
always wins.
|
|
62
100
|
"""
|
|
63
101
|
api_key = (os.environ.get("OLLAMA_API_KEY") or "").strip()
|
|
64
102
|
base = (os.environ.get("OLLAMA_BASE_URL") or "").strip().rstrip("/")
|
|
103
|
+
if mode == "cloud":
|
|
104
|
+
if not api_key:
|
|
105
|
+
raise ValueError(
|
|
106
|
+
"OLLAMA_API_KEY is not set. Create a key at "
|
|
107
|
+
"https://ollama.com/settings/keys and add it to your .env or "
|
|
108
|
+
"environment (required for model.provider ollama-cloud)."
|
|
109
|
+
)
|
|
110
|
+
if base and _is_cloud_host(base):
|
|
111
|
+
return _normalize_cloud_base(base), api_key
|
|
112
|
+
if base:
|
|
113
|
+
_log.warning(
|
|
114
|
+
"ollama-cloud ignoring non-cloud OLLAMA_BASE_URL %s",
|
|
115
|
+
kv(ignored=base, host=_DEFAULT_CLOUD_URL),
|
|
116
|
+
)
|
|
117
|
+
return _DEFAULT_CLOUD_URL, api_key
|
|
118
|
+
if mode == "local":
|
|
119
|
+
if base and not _is_cloud_host(base):
|
|
120
|
+
return base, _DUMMY_API_KEY
|
|
121
|
+
if base:
|
|
122
|
+
_log.warning(
|
|
123
|
+
"ollama-local ignoring cloud OLLAMA_BASE_URL %s",
|
|
124
|
+
kv(ignored=base, host=_DEFAULT_LOCAL_URL),
|
|
125
|
+
)
|
|
126
|
+
return _DEFAULT_LOCAL_URL, _DUMMY_API_KEY
|
|
65
127
|
if base:
|
|
66
128
|
return base, api_key or _DUMMY_API_KEY
|
|
67
129
|
if api_key:
|
|
68
130
|
_log.warning(
|
|
69
131
|
"OLLAMA_API_KEY set with no OLLAMA_BASE_URL; using Ollama Cloud %s "
|
|
70
|
-
"(set OLLAMA_BASE_URL
|
|
132
|
+
"(set model.provider to ollama-local, or OLLAMA_BASE_URL, for a "
|
|
133
|
+
"local reverse proxy)",
|
|
71
134
|
kv(host=_DEFAULT_CLOUD_URL),
|
|
72
135
|
)
|
|
73
136
|
return _DEFAULT_CLOUD_URL, api_key
|
|
@@ -106,6 +169,10 @@ class OllamaProvider:
|
|
|
106
169
|
|
|
107
170
|
@property
|
|
108
171
|
def name(self) -> str:
|
|
172
|
+
if self._mode == "cloud":
|
|
173
|
+
return "ollama-cloud"
|
|
174
|
+
if self._mode == "local":
|
|
175
|
+
return "ollama-local"
|
|
109
176
|
return "ollama"
|
|
110
177
|
|
|
111
178
|
@property
|
|
@@ -115,11 +182,14 @@ class OllamaProvider:
|
|
|
115
182
|
def __init__(
|
|
116
183
|
self,
|
|
117
184
|
*,
|
|
185
|
+
mode: OllamaMode = "auto",
|
|
118
186
|
temperature: float | None = None,
|
|
119
187
|
max_tokens: int | None = None,
|
|
120
188
|
thinking_budget: int | None = None,
|
|
121
189
|
) -> None:
|
|
122
|
-
self.
|
|
190
|
+
self._mode = mode
|
|
191
|
+
self._base_url, self._api_key = _resolve_host_and_key(mode)
|
|
192
|
+
_log.info("ollama host resolved %s", kv(mode=self._mode, host=self._base_url))
|
|
123
193
|
sampling = resolve_model_sampling(temperature=temperature, max_tokens=max_tokens)
|
|
124
194
|
self._temperature = sampling.temperature
|
|
125
195
|
self._max_tokens = sampling.max_tokens
|
|
@@ -133,8 +203,8 @@ class OllamaProvider:
|
|
|
133
203
|
"""Return the OpenAI-compat base URL for ``model``.
|
|
134
204
|
|
|
135
205
|
``OLLAMA_BASE_URL`` is used as-is when it already ends in ``/v1``;
|
|
136
|
-
otherwise ``/v1`` is appended.
|
|
137
|
-
|
|
206
|
+
otherwise ``/v1`` is appended. Host selection is mode-driven
|
|
207
|
+
(``ollama-cloud`` / ``ollama-local`` / legacy ``ollama``).
|
|
138
208
|
"""
|
|
139
209
|
del model # model id is passed per request; base URL is env-driven
|
|
140
210
|
host = self._base_url
|
|
@@ -170,7 +240,7 @@ class OllamaProvider:
|
|
|
170
240
|
async for event in stream_chat_completions_with_tool_fallback(
|
|
171
241
|
base_url=self._resolve_base_url(model),
|
|
172
242
|
api_key=self._api_key,
|
|
173
|
-
provider=
|
|
243
|
+
provider=self.name,
|
|
174
244
|
messages=messages,
|
|
175
245
|
tools=tools,
|
|
176
246
|
model=model,
|
|
@@ -129,6 +129,28 @@ class TestVertexAnthropicProvider:
|
|
|
129
129
|
assert cfg.provider.name == "ollama"
|
|
130
130
|
assert cfg.model == "llama3.1"
|
|
131
131
|
|
|
132
|
+
def test_get_provider_config_ollama_cloud(self, monkeypatch: pytest.MonkeyPatch) -> None:
|
|
133
|
+
monkeypatch.setenv("OLLAMA_API_KEY", "cloud-key")
|
|
134
|
+
monkeypatch.setenv("OLLAMA_BASE_URL", "http://127.0.0.1:11434")
|
|
135
|
+
cfg = get_provider_config(provider="ollama-cloud", model_name="glm-5.3-flash")
|
|
136
|
+
assert cfg.provider.name == "ollama-cloud"
|
|
137
|
+
assert cfg.model == "glm-5.3-flash"
|
|
138
|
+
assert cfg.provider._resolve_base_url("glm-5.3-flash") == "https://ollama.com/v1"
|
|
139
|
+
|
|
140
|
+
def test_get_provider_config_ollama_local(self, monkeypatch: pytest.MonkeyPatch) -> None:
|
|
141
|
+
monkeypatch.delenv("OLLAMA_BASE_URL", raising=False)
|
|
142
|
+
cfg = get_provider_config(provider="ollama-local", model_name="llama3.1")
|
|
143
|
+
assert cfg.provider.name == "ollama-local"
|
|
144
|
+
assert cfg.model == "llama3.1"
|
|
145
|
+
assert cfg.provider._api_key == "ollama"
|
|
146
|
+
|
|
147
|
+
def test_get_provider_config_ollama_cloud_requires_key(
|
|
148
|
+
self, monkeypatch: pytest.MonkeyPatch
|
|
149
|
+
) -> None:
|
|
150
|
+
monkeypatch.delenv("OLLAMA_API_KEY", raising=False)
|
|
151
|
+
with pytest.raises(ValueError, match="OLLAMA_API_KEY is not set"):
|
|
152
|
+
get_provider_config(provider="ollama-cloud", model_name="glm-5.3-flash")
|
|
153
|
+
|
|
132
154
|
def test_get_provider_config_vertex_anthropic_happy_path(self, monkeypatch: pytest.MonkeyPatch) -> None:
|
|
133
155
|
monkeypatch.setenv("GCP_PROJECT_ID", "test-project")
|
|
134
156
|
monkeypatch.setenv("ANTHROPIC_VERTEX_REGION", "us-central1")
|