monkeybot 2.1.1__tar.gz → 2.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {monkeybot-2.1.1 → monkeybot-2.2.0}/.dockerignore +0 -3
- monkeybot-2.2.0/.github/workflows/live-eval-smoke.yml +199 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/.github/workflows/prepare-release.yml +1 -1
- {monkeybot-2.1.1 → monkeybot-2.2.0}/.github/workflows/publish-release.yml +53 -2
- {monkeybot-2.1.1 → monkeybot-2.2.0}/.gitignore +1 -3
- {monkeybot-2.1.1 → monkeybot-2.2.0}/BACKLOG.md +7 -7
- {monkeybot-2.1.1 → monkeybot-2.2.0}/CHANGELOG.md +44 -0
- monkeybot-2.2.0/CONTRIBUTING.md +42 -0
- monkeybot-2.2.0/PKG-INFO +180 -0
- monkeybot-2.2.0/README.md +98 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/pyproject.toml +4 -2
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/skills/monkeybot/SKILL.md +3 -1
- monkeybot-2.2.0/cli/src/monkeybot_cli/__init__.py +8 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/commands/chat.py +8 -1
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/commands/doctor.py +111 -11
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/commands/run_cmd.py +2 -3
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/commands/validate.py +2 -1
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/compat.py +1 -1
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/config_resolve.py +6 -12
- monkeybot-2.2.0/cli/src/monkeybot_cli/gateway_health.py +71 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/scaffold.py +27 -51
- monkeybot-2.2.0/cli/src/monkeybot_cli/scaffold_defaults/Dockerfile +27 -0
- monkeybot-2.2.0/cli/src/monkeybot_cli/scaffold_defaults/browser/SKILL.md +15 -0
- monkeybot-2.2.0/cli/src/monkeybot_cli/scaffold_defaults/dockerignore +5 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/scaffold_defaults/env.example +1 -0
- monkeybot-2.1.1/monkeybot_config_example/mcp.example.json → monkeybot-2.2.0/cli/src/monkeybot_cli/scaffold_defaults/mcp.json +3 -6
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/scaffold_defaults/monkeybot.example.yaml +5 -2
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_chat_errors.py +1 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_cli.py +64 -7
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_config_resolve.py +12 -1
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_extras_catalog.py +1 -1
- monkeybot-2.2.0/cli/tests/test_gateway_health.py +135 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_opensandbox_lifecycle.py +2 -2
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_run_cmd.py +3 -2
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_scaffold.py +15 -10
- {monkeybot-2.1.1 → monkeybot-2.2.0}/docker/Dockerfile +3 -2
- {monkeybot-2.1.1 → monkeybot-2.2.0}/docker/docker-compose.sandbox.yml +9 -9
- {monkeybot-2.1.1 → monkeybot-2.2.0}/docker/opensandbox.docker.toml +1 -1
- monkeybot-2.2.0/docker/sandbox.Dockerfile +9 -0
- monkeybot-2.2.0/docker-compose.yml +13 -0
- monkeybot-2.2.0/docs/agent-layout.md +109 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/browser-mcp.md +33 -23
- monkeybot-2.2.0/docs/cloud-deployment-design.md +96 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/deploy-aws-agentcore.md +8 -2
- {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/deploy-pattern-a-container.md +82 -41
- {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/deploy-pattern-b-serverless.md +25 -3
- {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/deploy-pattern-c-agent-platform.md +23 -7
- {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/deploy-pattern-d-realtime.md +22 -15
- {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/features.md +31 -10
- {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/getting-started.md +25 -7
- monkeybot-2.2.0/docs/live-evals.md +64 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/mcp.md +11 -12
- {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/observability-runbook.md +15 -8
- {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/progressive-mcp-tools.md +8 -4
- {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/skills.md +20 -3
- {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/sse-gateway-ui.md +1 -1
- {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/assertions.py +39 -5
- monkeybot-2.2.0/evals/diff.py +123 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/models.py +4 -32
- {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/persistence.py +12 -5
- {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/report.py +25 -5
- {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/runner.py +15 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/scenario_loader.py +5 -16
- {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/scenarios/mcp/tool_invoke.yaml +3 -2
- {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/scenarios/memory/recall_cross_session.yaml +1 -1
- {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/scenarios/memory/recall_single_session.yaml +1 -1
- monkeybot-2.2.0/evals/scenarios/tools/core_read.yaml +10 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/scorer.py +49 -30
- monkeybot-2.2.0/evals/smoke_agent/.env.example +5 -0
- {monkeybot-2.1.1/demo_agent → monkeybot-2.2.0/evals/smoke_agent}/.gitignore +1 -0
- monkeybot-2.2.0/evals/smoke_agent/monkeybot_config/command_allowlist.yaml +33 -0
- monkeybot-2.2.0/evals/smoke_agent/monkeybot_config/monkeybot.yaml +52 -0
- monkeybot-2.2.0/evals/smoke_agent/pyproject.toml +13 -0
- monkeybot-2.2.0/evals/smoke_agent/skills/browser/SKILL.md +8 -0
- {monkeybot-2.1.1/demo_agent → monkeybot-2.2.0/evals/smoke_agent}/uv.lock +395 -1033
- {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/suites/smoke.yaml +1 -1
- {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/test_assertions.py +22 -0
- monkeybot-2.2.0/evals/test_diff.py +86 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/test_report.py +35 -1
- monkeybot-2.2.0/evals/test_scorer.py +53 -0
- monkeybot-2.2.0/examples/README.md +34 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/examples/skills/diagnostics/README.md +1 -1
- {monkeybot-2.1.1 → monkeybot-2.2.0}/examples/skills/diagnostics/SKILL.md +5 -10
- {monkeybot-2.1.1/demo_agent/workspace → monkeybot-2.2.0/examples}/skills/image-generator/SKILL.md +6 -8
- {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/pyproject.toml +2 -2
- {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/src/browser_mcp/playbooks.py +4 -2
- {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/src/browser_mcp/screenshots.py +2 -8
- {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/tests/test_playbooks.py +7 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/tests/test_screenshots.py +12 -2
- {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/uv.lock +542 -542
- {monkeybot-2.1.1 → monkeybot-2.2.0}/pyproject.toml +4 -4
- {monkeybot-2.1.1 → monkeybot-2.2.0}/pytest.ini +2 -3
- {monkeybot-2.1.1 → monkeybot-2.2.0}/scripts/release.py +88 -26
- {monkeybot-2.1.1 → monkeybot-2.2.0}/scripts/verify_memory.py +2 -1
- monkeybot-2.2.0/src/monkeybot/__init__.py +8 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/config/runtime_env.py +44 -9
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/config/yaml_loader.py +6 -12
- monkeybot-2.2.0/src/monkeybot/core/layout.py +198 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/sqlite.py +5 -4
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/subagents/subagent_proto.py +5 -21
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/subagents/subagent_worker.py +3 -10
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/core_tool_executor.py +5 -4
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/patch.py +4 -4
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/sandbox_executor.py +124 -30
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/workspace_service.py +73 -19
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/workspace_tools.py +2 -1
- monkeybot-2.2.0/src/monkeybot/core/workspace_layout.py +26 -0
- monkeybot-2.2.0/src/monkeybot/gateway/bootstrap.py +67 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/main.py +14 -11
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/realtime/__init__.py +14 -1
- monkeybot-2.2.0/src/monkeybot/gateway/realtime/app.py +127 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/realtime/routes.py +4 -10
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/realtime_main.py +12 -10
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/app.py +16 -30
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/cli/test_main.py +3 -1
- monkeybot-2.2.0/tests/conftest.py +43 -0
- monkeybot-2.2.0/tests/core/test_agent_layout.py +165 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_context.py +1 -1
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_core_tool_executor.py +2 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_history.py +1 -1
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_runtime_env.py +22 -2
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_sandbox_executor.py +95 -1
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_workspace_layout.py +12 -2
- monkeybot-2.2.0/tests/core/test_workspace_symlinks.py +67 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/sse/test_routes.py +8 -2
- monkeybot-2.2.0/tests/gateway/test_otel_lifespan.py +97 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/skills/test_generate_image_script.py +2 -2
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/test_packaging_config.py +10 -1
- monkeybot-2.2.0/tests/test_release_script.py +151 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/uv.lock +2561 -2431
- monkeybot-2.1.1/.github/workflows/live-eval-smoke.yml +0 -158
- monkeybot-2.1.1/AGENTS.md +0 -34
- monkeybot-2.1.1/PKG-INFO +0 -318
- monkeybot-2.1.1/README.md +0 -237
- monkeybot-2.1.1/cli/src/monkeybot_cli/__init__.py +0 -3
- monkeybot-2.1.1/cli/src/monkeybot_cli/gateway_health.py +0 -34
- monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/mcp.json +0 -49
- monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/setup-workspace.sh +0 -24
- monkeybot-2.1.1/demo_agent/.env.example +0 -21
- monkeybot-2.1.1/demo_agent/docker-compose.langfuse.yml +0 -159
- monkeybot-2.1.1/demo_agent/docker-compose.observability.yml +0 -31
- monkeybot-2.1.1/demo_agent/firebase.json +0 -11
- monkeybot-2.1.1/demo_agent/firestore.indexes.json +0 -14
- monkeybot-2.1.1/demo_agent/pyproject.toml +0 -17
- monkeybot-2.1.1/demo_agent/run.sh +0 -532
- monkeybot-2.1.1/docker/Dockerfile.demo-sandbox +0 -8
- monkeybot-2.1.1/docker-compose.evals.yml +0 -24
- monkeybot-2.1.1/docker-compose.yml +0 -29
- monkeybot-2.1.1/docs/chat-tui-improvements.md +0 -220
- monkeybot-2.1.1/docs/cli-pypi-distribution.md +0 -264
- monkeybot-2.1.1/docs/cloud-deployment-design.md +0 -555
- monkeybot-2.1.1/docs/eval-pr-scorecard.md +0 -417
- monkeybot-2.1.1/docs/monkeycleaner-cli-prettier.md +0 -38
- monkeybot-2.1.1/docs/realtime-streaming-design.md +0 -542
- monkeybot-2.1.1/evals/Dockerfile +0 -20
- monkeybot-2.1.1/evals/main.py +0 -259
- monkeybot-2.1.1/evals/pyproject.toml +0 -32
- monkeybot-2.1.1/evals/requirements.txt +0 -9
- monkeybot-2.1.1/evals/scenarios/operator/.gitkeep +0 -0
- monkeybot-2.1.1/evals/scenarios/tools/core_read.yaml +0 -11
- monkeybot-2.1.1/evals/store.py +0 -60
- monkeybot-2.1.1/evals/uv.lock +0 -2153
- monkeybot-2.1.1/evals/ws_manager.py +0 -46
- monkeybot-2.1.1/examples/README.md +0 -63
- monkeybot-2.1.1/examples/skills/browser/SKILL.md +0 -14
- monkeybot-2.1.1/examples/skills/image-generator/SKILL.md +0 -10
- monkeybot-2.1.1/examples/skills/image-generator/generate_image.py +0 -199
- monkeybot-2.1.1/monkeybot_config_example/command_allowlist.example.yaml +0 -61
- monkeybot-2.1.1/monkeybot_config_example/monkeybot.example.yaml +0 -209
- monkeybot-2.1.1/monkeybot_config_example/opensandbox.docker.example.toml +0 -51
- monkeybot-2.1.1/monkeybot_config_example/otel-collector.demo-dual.example.yaml +0 -46
- monkeybot-2.1.1/monkeybot_config_example/otel-collector.demo.example.yaml +0 -35
- monkeybot-2.1.1/src/monkeybot/__init__.py +0 -3
- monkeybot-2.1.1/src/monkeybot/core/workspace_layout.py +0 -27
- monkeybot-2.1.1/src/monkeybot/gateway/bootstrap.py +0 -18
- monkeybot-2.1.1/src/monkeybot/gateway/realtime/app.py +0 -321
- monkeybot-2.1.1/testing/BENCH_NOTES.md +0 -226
- monkeybot-2.1.1/testing/bench.py +0 -560
- monkeybot-2.1.1/testing/bots/devbot/AGENT.md +0 -27
- monkeybot-2.1.1/testing/bots/devbot/MEMORY.md +0 -12
- monkeybot-2.1.1/testing/bots/devbot/config.yaml +0 -17
- monkeybot-2.1.1/testing/bots/devbot/skills/file-ops/SKILL.md +0 -24
- monkeybot-2.1.1/testing/bots/devbot/webhook.py +0 -20
- monkeybot-2.1.1/tests/conftest.py +0 -11
- monkeybot-2.1.1/tests/core/test_workspace_symlinks.py +0 -50
- monkeybot-2.1.1/tests/gateway/test_otel_lifespan.py +0 -49
- monkeybot-2.1.1/tests/test_release_script.py +0 -41
- {monkeybot-2.1.1 → monkeybot-2.2.0}/.github/workflows/ci.yml +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/.pre-commit-config.yaml +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/LICENSE +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/skills/monkeybot/references/config-sections.md +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/chat_renderer.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/chat_session.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/chat_status_bar.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/chat_theme.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/chat_tool_display.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/chat_tui.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/chat_tui_widgets.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/commands/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/commands/loop.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/commands/new.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/commands/talk.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/exit_commands.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/extras_catalog.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/main.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/opensandbox_lifecycle.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/output.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/providers.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/realtime/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/realtime/audio_io.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/realtime/client.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/realtime/gateway_manager.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/realtime/push_to_talk.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/realtime/session.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/realtime/session_controller.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/realtime/talk_ui.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/realtime/wire_encode.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/runtime_python.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/scaffold_defaults/AGENT.md +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/scaffold_defaults/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/scaffold_defaults/command_allowlist.yaml +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/scaffold_defaults/otel-collector.example.yaml +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/scaffold_defaults/permissions.yaml +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/session_controller.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/src/monkeybot_cli/terminal_markdown.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_chat_e2e.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_chat_grounding.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_chat_renderer_parity.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_chat_session.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_chat_status_bar.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_chat_theme.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_chat_tool_display.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_chat_tui.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_doctor.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_realtime_session_controller.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_runtime_python.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/tests/test_terminal_markdown.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/cli/uv.lock +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0/docs/assets}/logo.png +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/docs/otel-collector.example.yaml +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/eval_config.yaml +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/scenarios/context/summarization_trigger.yaml +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/scenarios/multi_turn/task_tracking.yaml +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/scenarios/skills/skill_invocation.yaml +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/scenarios/subagents/dispatch_complete.yaml +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/scenarios/tools/core_read_error.yaml +0 -0
- /monkeybot-2.1.1/monkeybot_config_example/AGENT.example.md → /monkeybot-2.2.0/evals/smoke_agent/monkeybot_config/AGENT.md +0 -0
- /monkeybot-2.1.1/monkeybot_config_example/permissions.example.yaml → /monkeybot-2.2.0/evals/smoke_agent/monkeybot_config/permissions.yaml +0 -0
- {monkeybot-2.1.1/demo_agent → monkeybot-2.2.0/evals/smoke_agent}/workspace/.gitkeep +0 -0
- {monkeybot-2.1.1/demo_agent/workspace/browser/Screenshots → monkeybot-2.2.0/evals/smoke_agent/workspace/skills/browser/playbooks}/.gitkeep +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/test_judge.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/evals/test_runner_sse.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/examples/agentcore/handler.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/examples/agentcore/runtime_app.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/examples/agentengine/handler.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/examples/cloud-functions/main.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/examples/lambda/handler.py +0 -0
- {monkeybot-2.1.1/demo_agent/workspace → monkeybot-2.2.0/examples}/skills/browser/SKILL.md +0 -0
- {monkeybot-2.1.1/demo_agent/workspace → monkeybot-2.2.0/examples}/skills/browser/playbooks/.gitkeep +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/examples/skills/diagnostics/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/examples/skills/diagnostics/diagnostics.py +0 -0
- {monkeybot-2.1.1/demo_agent/workspace → monkeybot-2.2.0/examples}/skills/image-generator/generate_image.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/src/browser_mcp/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/src/browser_mcp/assets/NOTICE.md +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/src/browser_mcp/assets/dom_tree.js +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/src/browser_mcp/assets/pa_driver.js +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/src/browser_mcp/dom_indexing.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/src/browser_mcp/server.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/tests/test_dom_indexing.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/tests/test_indexed_tools.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/integrations/browser-mcp/tests/test_server_shutdown.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/scripts/create_schema.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/scripts/precommit-pytest.sh +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/scripts/smoke_global_cli.sh +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/cli/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/cli/__main__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/cli/audio_io.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/cli/gateway_manager.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/cli/main.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/cli/push_to_talk.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/cli/realtime_client.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/attachments/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/attachments/catalog.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/attachments/config.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/attachments/freeze.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/attachments/resolve.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/attachments/store.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/attachments/text.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/attachments/tools.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/bootstrap.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/config/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/config/realtime_config.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/config/settings.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/config/validation.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/context/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/context/campaign_context.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/context/common.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/context/curator.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/context/epoch.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/context/memory_prompt.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/context/tool_output_policy.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/context/tool_result_ingress.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/context/tool_shapers.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/hooks/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/llm/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/llm/provider.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/llm/realtime_provider.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/llm/usage.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/logging_utils.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/mcp/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/mcp/mcp_client.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/mcp/ports_mcp.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/memory/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/memory/hook.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/memory/index_format.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/memory/integrity.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/memory/organizer.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/memory/storage_ops.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/memory/subsystem.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/messages/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/messages/convert_provider.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/messages/tool_integrity.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/messages/transform_context.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/path_safety.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/backends.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/db.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/durable_runs.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/firestore.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/firestore_scheduled_loops.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/history.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/postgres.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/runs.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/scheduled_loops.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/session_turn_locks.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/sqlite_backend.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/thread_summary.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/transcript.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/persistence/usage.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/prompts/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/prompts/harness_prompt.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/prompts/prompt.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/runtime/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/runtime/context_budget.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/runtime/events.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/runtime/input_admission.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/runtime/loop.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/runtime/provider_stream_mapper.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/runtime/realtime_loop.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/runtime/utterance_buffer.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/subagents/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/subagents/worker_pool.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/testing/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/testing/mocks_provider.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/testing/mocks_realtime_provider.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/inspector.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/loop_inspector.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/permission.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/spill_inventory.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/terminal.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/text_normalize.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/tools/types.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/types/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/types/content_blocks.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/types/interfaces.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/types/types_tools.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/workspace/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/workspace/factory.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/workspace/gcs.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/workspace/local.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/workspace/protocol.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/core/workspace/s3.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/realtime/deps.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/realtime/errors.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/realtime/guardrails.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/realtime/manager.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/realtime/metrics.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/realtime/session.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/realtime/wire.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/loop_port.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/models.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/reply_body.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/routes.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/scheduler_routes.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/scheduler_wiring.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/session_bus.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/sse.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/gateway/sse/workspace_layout.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/observability/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/observability/_state.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/observability/instrumentation.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/observability/propagation.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/observability/spans.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/_openai_compat.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/_utils.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/bedrock.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/claude.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/gemini.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/gemini_live.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/huggingface.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/nvidia.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/ollama.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/openai.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/pricing.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/sampling.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/providers/vertex_claude.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/scaffold/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/scheduler/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/scheduler/__main__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/scheduler/engine.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/scheduler/http_invoker.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/scheduler/interval.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/scheduler/tick_result.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/scheduler/worker.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/subagents/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/subagents/worker/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/subagents/worker/__main__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/web_search/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/web_search/backends/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/web_search/backends/duckduckgo.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/web_search/backends/firecrawl.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/web_search/backends/tavily.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/web_search/protocol.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/src/monkeybot/web_search/tool.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/acceptance/test_observability_acceptance.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/cli/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/cli/test_gateway_manager.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/cli/test_push_to_talk.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/cli/test_realtime_client.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/memory/fake_workspace_storage.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/memory/test_hook_with_storage.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/memory/test_index_format.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/memory/test_organizer_with_storage.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/memory/test_subsystem.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_attachment_freeze.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_bootstrap.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_config_extensions.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_content_blocks.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_context_budget.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_context_curator.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_context_epoch.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_doom_loop.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_durable_events.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_durable_runs.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_events.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_firestore_history.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_firestore_scheduled_loops.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_gemini_history_replay.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_harness_prompt.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_hooks.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_input_admission.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_inspector.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_logging_utils.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_loop.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_loop_hooks.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_loop_observability.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_loop_transcript.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_mcp_client.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_memory.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_memory_hook.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_memory_organizer.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_memory_prompt.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_message_pipeline.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_mocks_realtime_provider.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_patch.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_permission.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_prompt.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_provider_contract.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_provider_stream_mapper.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_realtime_loop.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_replace_fuzzy.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_run_command_parse.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_runs.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_scheduled_loops.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_session_turn_locks.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_settlement.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_spill_inventory.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_storage_backends.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_subagent_proto.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_subagent_trace_propagation.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_subagent_worker_paths.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_terminal.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_tool_integrity.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_tool_result_ingress.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_tool_shapers.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_transcript.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_truncated_tool_batch.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_usage.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_usage_migration.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_utterance_buffer.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_worker_pool.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/test_workspace_write_scope.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/workspace/test_factory.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/workspace/test_local_storage.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/core/workspace/test_protocol_contract.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/conftest.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/eval_hook.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/scenario_runner.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/scenarios/context_curation.yaml +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/scenarios/memory_write_inject.yaml +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/scenarios/subagent_roundtrip.yaml +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/scenarios/tool_read.yaml +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/scenarios/tool_search_memory.yaml +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/scenarios/turn_completion.yaml +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/test_agent_behavior.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/evals/test_memory_integrity.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/realtime/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/realtime/test_app.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/realtime/test_deps.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/realtime/test_guardrails.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/realtime/test_manager.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/realtime/test_metrics.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/realtime/test_routes_client_text.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/realtime/test_session.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/realtime/test_wire.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/sse/test_attachments.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/sse/test_create_session_model.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/sse/test_scheduler_routes.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/sse/test_session_bus.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/sse/test_transcript_wiring.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/test_otel_fastapi.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/test_pending_response_endpoints.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/test_realtime_main.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/test_resolve_provider.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/gateway/test_sse_events.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/integration/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/integration/test_mb_e2e_simple_reply.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/integration/test_observability_integration.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/integration/test_prompt_caching_integration.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/observability/conftest.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/observability/test_init.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/observability/test_instrumentation.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/observability/test_loop_hook_spans.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/observability/test_propagation.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/observability/test_span_contract.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/observability/test_spans.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/observability/test_truncate.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/observability/test_turn_complete_trace.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/conftest.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_anthropic_cache.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_anthropic_history.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_bedrock_estimate.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_gemini_live.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_gemini_usage.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_huggingface.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_nvidia.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_ollama.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_openai_compat_usage.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_openai_history.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_pricing.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_safe_parse_tool_args.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_sampling.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_source_grep_gates.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/providers/test_vertex_claude_history.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/scheduler/test_engine.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/scheduler/test_interval.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/skills/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/test_cold_start.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/web_search/__init__.py +0 -0
- {monkeybot-2.1.1 → monkeybot-2.2.0}/tests/web_search/test_web_search.py +0 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
name: Live eval smoke
|
|
2
|
+
|
|
3
|
+
# Runs the live eval smoke suite (see docs/live-evals.md) and posts a Markdown
|
|
4
|
+
# scorecard. LLM-judge calls cost money and take minutes, so this does not run on
|
|
5
|
+
# ordinary feature-branch -> develop PRs. Trigger points:
|
|
6
|
+
# (a) any PR from develop into main (release-promotion gate; --fail-on-regression)
|
|
7
|
+
# (b) any PR that touches a dependency lockfile (catches silent SDK breakage,
|
|
8
|
+
# e.g. provider request/response shape changes, that code review won't see)
|
|
9
|
+
# (c) every push to main (scores the new release; report-only, never fails the build)
|
|
10
|
+
# (d) manual: Actions tab -> Live eval smoke -> Run workflow
|
|
11
|
+
# The scorecard always lands on the workflow run's Summary page; PR events also get it
|
|
12
|
+
# as a PR comment. The run JSON is uploaded as an artifact — download two of them and
|
|
13
|
+
# compare with `uv run python -m evals.diff <old.json> <new.json>`.
|
|
14
|
+
#
|
|
15
|
+
# Cost/time budget: smoke suite is ~7 scenarios x 2-5 turns x (agent call + judge call).
|
|
16
|
+
# Expect roughly $0.50-2.00 and 5-10 minutes per run depending on model pricing.
|
|
17
|
+
#
|
|
18
|
+
# Secrets required: NVIDIA_API_KEY only (https://build.nvidia.com — free tier). The agent
|
|
19
|
+
# and the judge both run on NVIDIA-hosted models through the same key, pinned to two
|
|
20
|
+
# *different* models below so the judge isn't grading its own output and scoring doesn't
|
|
21
|
+
# silently drift.
|
|
22
|
+
|
|
23
|
+
on:
|
|
24
|
+
pull_request:
|
|
25
|
+
push:
|
|
26
|
+
branches: [main]
|
|
27
|
+
workflow_dispatch:
|
|
28
|
+
|
|
29
|
+
permissions:
|
|
30
|
+
contents: read
|
|
31
|
+
pull-requests: write
|
|
32
|
+
|
|
33
|
+
jobs:
|
|
34
|
+
gate:
|
|
35
|
+
runs-on: ubuntu-latest
|
|
36
|
+
outputs:
|
|
37
|
+
run: ${{ steps.decide.outputs.run }}
|
|
38
|
+
steps:
|
|
39
|
+
- uses: actions/checkout@v4
|
|
40
|
+
with:
|
|
41
|
+
fetch-depth: 0
|
|
42
|
+
|
|
43
|
+
- id: decide
|
|
44
|
+
env:
|
|
45
|
+
EVENT_NAME: ${{ github.event_name }}
|
|
46
|
+
BASE_REF: ${{ github.base_ref }}
|
|
47
|
+
HEAD_REF: ${{ github.head_ref }}
|
|
48
|
+
BASE_SHA: ${{ github.event.pull_request.base.sha }}
|
|
49
|
+
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
|
50
|
+
run: |
|
|
51
|
+
run=false
|
|
52
|
+
# Push to main and manual dispatch always run; PRs are gated below.
|
|
53
|
+
if [[ "$EVENT_NAME" != "pull_request" ]]; then
|
|
54
|
+
run=true
|
|
55
|
+
else
|
|
56
|
+
if [[ "$BASE_REF" == "main" && "$HEAD_REF" == "develop" ]]; then
|
|
57
|
+
run=true
|
|
58
|
+
fi
|
|
59
|
+
changed="$(git diff --name-only "$BASE_SHA" "$HEAD_SHA")"
|
|
60
|
+
for f in uv.lock cli/uv.lock evals/smoke_agent/uv.lock; do
|
|
61
|
+
if grep -qxF "$f" <<<"$changed"; then
|
|
62
|
+
run=true
|
|
63
|
+
fi
|
|
64
|
+
done
|
|
65
|
+
fi
|
|
66
|
+
echo "run=$run" >> "$GITHUB_OUTPUT"
|
|
67
|
+
|
|
68
|
+
secrets:
|
|
69
|
+
needs: gate
|
|
70
|
+
if: needs.gate.outputs.run == 'true'
|
|
71
|
+
runs-on: ubuntu-latest
|
|
72
|
+
steps:
|
|
73
|
+
- name: Require live-eval secrets
|
|
74
|
+
env:
|
|
75
|
+
NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
|
|
76
|
+
run: |
|
|
77
|
+
if [[ -z "$NVIDIA_API_KEY" ]]; then
|
|
78
|
+
echo "::error::Live eval smoke requires the NVIDIA_API_KEY repository secret (agent + judge models, https://build.nvidia.com)"
|
|
79
|
+
exit 1
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
live-eval:
|
|
83
|
+
needs: [gate, secrets]
|
|
84
|
+
if: needs.gate.outputs.run == 'true'
|
|
85
|
+
runs-on: ubuntu-latest
|
|
86
|
+
timeout-minutes: 30
|
|
87
|
+
steps:
|
|
88
|
+
- uses: actions/checkout@v4
|
|
89
|
+
|
|
90
|
+
- uses: astral-sh/setup-uv@v5
|
|
91
|
+
with:
|
|
92
|
+
version: "latest"
|
|
93
|
+
|
|
94
|
+
- name: Sync root deps (evals/report.py needs deepeval, langfuse)
|
|
95
|
+
run: uv sync --extra evals
|
|
96
|
+
|
|
97
|
+
- name: Sync smoke_agent deps
|
|
98
|
+
working-directory: evals/smoke_agent
|
|
99
|
+
run: uv sync
|
|
100
|
+
|
|
101
|
+
- name: Boot monkeybot gateway (evals/smoke_agent workspace)
|
|
102
|
+
working-directory: evals/smoke_agent
|
|
103
|
+
env:
|
|
104
|
+
NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
|
|
105
|
+
# Pin agent model for CI; env beats monkeybot.yaml.
|
|
106
|
+
MODEL_PROVIDER: nvidia
|
|
107
|
+
MODEL_NAME: meta/llama-3.3-70b-instruct
|
|
108
|
+
# smoke_agent monkeybot.yaml sets runtime.port: 8080; the health check and
|
|
109
|
+
# AGENT_URL below expect 8787, so pin PORT explicitly (env beats yaml).
|
|
110
|
+
PORT: "8787"
|
|
111
|
+
SANDBOX_ENABLED: "false" # no Docker socket in this runner
|
|
112
|
+
# Small context window so context/summarization_trigger.yaml actually crosses the
|
|
113
|
+
# real summarization threshold; the other smoke scenarios are short enough to fit.
|
|
114
|
+
MODEL_CONTEXT_WINDOW: "8000"
|
|
115
|
+
run: |
|
|
116
|
+
uv run -m monkeybot.gateway.main > /tmp/gateway.log 2>&1 &
|
|
117
|
+
echo $! > /tmp/gateway.pid
|
|
118
|
+
for i in $(seq 1 30); do
|
|
119
|
+
if curl -sf http://127.0.0.1:8787/health > /dev/null; then
|
|
120
|
+
echo "gateway healthy"
|
|
121
|
+
exit 0
|
|
122
|
+
fi
|
|
123
|
+
sleep 2
|
|
124
|
+
done
|
|
125
|
+
echo "gateway did not become healthy" >&2
|
|
126
|
+
cat /tmp/gateway.log >&2
|
|
127
|
+
exit 1
|
|
128
|
+
|
|
129
|
+
- name: Run smoke suite report
|
|
130
|
+
env:
|
|
131
|
+
AGENT_URL: http://127.0.0.1:8787
|
|
132
|
+
# Judge on a different free NVIDIA-hosted model than the agent (same key).
|
|
133
|
+
JUDGE_PROVIDER: nvidia
|
|
134
|
+
JUDGE_MODEL: nvidia/llama-3.3-nemotron-super-49b-v1
|
|
135
|
+
NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
|
|
136
|
+
# Scorecard metadata: report the model the gateway actually ran.
|
|
137
|
+
MODEL_PROVIDER: nvidia
|
|
138
|
+
MODEL_NAME: meta/llama-3.3-70b-instruct
|
|
139
|
+
EVENT_NAME: ${{ github.event_name }}
|
|
140
|
+
run: |
|
|
141
|
+
# PRs are a gate and must block on regressions; main pushes and manual runs
|
|
142
|
+
# just score the build and always report. --fail-on-regression always blocks on
|
|
143
|
+
# this run's own scenario errors/failures. It does NOT require evals/baselines/
|
|
144
|
+
# smoke.json to exist (that's the separate --require-baseline flag, intentionally
|
|
145
|
+
# omitted below) — no trusted baseline has been committed yet. Once one has
|
|
146
|
+
# (`uv run python -m evals.report --suite smoke --update-baseline`, committed),
|
|
147
|
+
# add --require-baseline here too so a missing/deleted file can't silently skip
|
|
148
|
+
# the token/cost/latency drift checks.
|
|
149
|
+
flags=""
|
|
150
|
+
if [[ "$EVENT_NAME" == "pull_request" ]]; then
|
|
151
|
+
flags="--fail-on-regression"
|
|
152
|
+
fi
|
|
153
|
+
uv run python -m evals.report \
|
|
154
|
+
--suite smoke \
|
|
155
|
+
--baseline evals/baselines/smoke.json \
|
|
156
|
+
$flags \
|
|
157
|
+
| tee eval-report.md
|
|
158
|
+
|
|
159
|
+
- name: Publish report to run summary
|
|
160
|
+
if: always()
|
|
161
|
+
run: |
|
|
162
|
+
if [[ -f eval-report.md ]]; then
|
|
163
|
+
cat eval-report.md >> "$GITHUB_STEP_SUMMARY"
|
|
164
|
+
else
|
|
165
|
+
echo '`FAIL` — no report produced; see the job logs.' >> "$GITHUB_STEP_SUMMARY"
|
|
166
|
+
fi
|
|
167
|
+
|
|
168
|
+
- name: Post report as PR comment
|
|
169
|
+
if: always() && github.event_name == 'pull_request'
|
|
170
|
+
uses: actions/github-script@v7
|
|
171
|
+
with:
|
|
172
|
+
script: |
|
|
173
|
+
const fs = require("fs");
|
|
174
|
+
const body = fs.existsSync("eval-report.md")
|
|
175
|
+
? fs.readFileSync("eval-report.md", "utf8")
|
|
176
|
+
: "## monkeybot Eval Scorecard\n\n`FAIL` — the report step did not complete " +
|
|
177
|
+
"(gateway boot or the report command itself errored before writing a report). " +
|
|
178
|
+
"See the workflow run logs for details.";
|
|
179
|
+
await github.rest.issues.createComment({
|
|
180
|
+
issue_number: context.issue.number,
|
|
181
|
+
owner: context.repo.owner,
|
|
182
|
+
repo: context.repo.repo,
|
|
183
|
+
body,
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
- name: Upload run + report artifacts
|
|
187
|
+
if: always()
|
|
188
|
+
uses: actions/upload-artifact@v4
|
|
189
|
+
with:
|
|
190
|
+
name: live-eval-smoke-${{ github.run_id }}
|
|
191
|
+
path: |
|
|
192
|
+
evals/runs/
|
|
193
|
+
eval-report.md
|
|
194
|
+
if-no-files-found: ignore
|
|
195
|
+
|
|
196
|
+
- name: Stop gateway
|
|
197
|
+
if: always()
|
|
198
|
+
working-directory: evals/smoke_agent
|
|
199
|
+
run: kill "$(cat /tmp/gateway.pid)" 2>/dev/null || true
|
|
@@ -9,6 +9,7 @@ name: Publish release
|
|
|
9
9
|
# Workflow publish-release.yml / Environment pypi
|
|
10
10
|
# monkeybot-cli: Owner human-plus-machine / Repo monkeybot /
|
|
11
11
|
# Workflow publish-release.yml / Environment pypi-cli
|
|
12
|
+
# monkeybot-browser-mcp: same workflow / Environment pypi-browser
|
|
12
13
|
#
|
|
13
14
|
# GitHub: create Environments named exactly `pypi` and `pypi-cli`.
|
|
14
15
|
on:
|
|
@@ -17,6 +18,8 @@ on:
|
|
|
17
18
|
paths:
|
|
18
19
|
- "pyproject.toml"
|
|
19
20
|
- "cli/pyproject.toml"
|
|
21
|
+
- "integrations/browser-mcp/pyproject.toml"
|
|
22
|
+
- "docker/sandbox.Dockerfile"
|
|
20
23
|
- "CHANGELOG.md"
|
|
21
24
|
|
|
22
25
|
permissions:
|
|
@@ -68,14 +71,15 @@ jobs:
|
|
|
68
71
|
skip-existing: true
|
|
69
72
|
|
|
70
73
|
pypi-cli:
|
|
71
|
-
needs: [publish, pypi-core]
|
|
74
|
+
needs: [publish, pypi-core, pypi-browser]
|
|
72
75
|
# Run when cli is in the release set. If core wasn't released this run,
|
|
73
76
|
# pypi-core is skipped — treat that as success so cli can still publish.
|
|
74
77
|
if: |
|
|
75
78
|
always() &&
|
|
76
79
|
needs.publish.result == 'success' &&
|
|
77
80
|
contains(format(',{0},', needs.publish.outputs.packages), ',cli,') &&
|
|
78
|
-
(needs.pypi-core.result == 'success' || needs.pypi-core.result == 'skipped')
|
|
81
|
+
(needs.pypi-core.result == 'success' || needs.pypi-core.result == 'skipped') &&
|
|
82
|
+
(needs.pypi-browser.result == 'success' || needs.pypi-browser.result == 'skipped')
|
|
79
83
|
runs-on: ubuntu-latest
|
|
80
84
|
environment:
|
|
81
85
|
name: pypi-cli
|
|
@@ -96,3 +100,50 @@ jobs:
|
|
|
96
100
|
with:
|
|
97
101
|
packages-dir: dist/cli
|
|
98
102
|
skip-existing: true
|
|
103
|
+
|
|
104
|
+
pypi-browser:
|
|
105
|
+
needs: publish
|
|
106
|
+
if: contains(format(',{0},', needs.publish.outputs.packages), ',browser,')
|
|
107
|
+
runs-on: ubuntu-latest
|
|
108
|
+
environment:
|
|
109
|
+
name: pypi-browser
|
|
110
|
+
url: https://pypi.org/p/monkeybot-browser-mcp
|
|
111
|
+
permissions:
|
|
112
|
+
id-token: write
|
|
113
|
+
contents: read
|
|
114
|
+
steps:
|
|
115
|
+
- uses: actions/checkout@v4
|
|
116
|
+
- uses: astral-sh/setup-uv@v5
|
|
117
|
+
- uses: actions/setup-python@v5
|
|
118
|
+
with:
|
|
119
|
+
python-version: "3.12"
|
|
120
|
+
- name: Build browser MCP
|
|
121
|
+
run: uv build --out-dir dist/browser integrations/browser-mcp
|
|
122
|
+
- name: Publish browser MCP to PyPI
|
|
123
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
124
|
+
with:
|
|
125
|
+
packages-dir: dist/browser
|
|
126
|
+
skip-existing: true
|
|
127
|
+
|
|
128
|
+
sandbox-image:
|
|
129
|
+
needs: publish
|
|
130
|
+
if: contains(format(',{0},', needs.publish.outputs.packages), ',core,')
|
|
131
|
+
runs-on: ubuntu-latest
|
|
132
|
+
permissions:
|
|
133
|
+
contents: read
|
|
134
|
+
packages: write
|
|
135
|
+
steps:
|
|
136
|
+
- uses: actions/checkout@v4
|
|
137
|
+
- uses: docker/login-action@v3
|
|
138
|
+
with:
|
|
139
|
+
registry: ghcr.io
|
|
140
|
+
username: ${{ github.actor }}
|
|
141
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
142
|
+
- id: version
|
|
143
|
+
run: echo "value=$(python -c \"import re; print(re.search(r'^version = \\\"([^\\\"]+)', open('pyproject.toml').read(), re.M).group(1))\")" >> "$GITHUB_OUTPUT"
|
|
144
|
+
- uses: docker/build-push-action@v6
|
|
145
|
+
with:
|
|
146
|
+
context: .
|
|
147
|
+
file: docker/sandbox.Dockerfile
|
|
148
|
+
push: true
|
|
149
|
+
tags: ghcr.io/human-plus-machine/monkeybot-sandbox:${{ steps.version.outputs.value }}
|
|
@@ -9,9 +9,6 @@ internal/
|
|
|
9
9
|
# Local scaffolded harness config (defaults ship in monkeybot-cli scaffold_defaults/)
|
|
10
10
|
/monkeybot_config/
|
|
11
11
|
|
|
12
|
-
# Demo agent live config (materialized from monkeybot_config_example/ by demo_agent/run.sh)
|
|
13
|
-
demo_agent/monkeybot_config/
|
|
14
|
-
|
|
15
12
|
# Live eval run artifacts (only evals/baselines/ is versioned)
|
|
16
13
|
/evals/runs/
|
|
17
14
|
|
|
@@ -40,6 +37,7 @@ data/
|
|
|
40
37
|
htmlcov/
|
|
41
38
|
.mypy_cache/
|
|
42
39
|
.ruff_cache/
|
|
40
|
+
.deepeval/
|
|
43
41
|
|
|
44
42
|
# macOS
|
|
45
43
|
.DS_Store
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
- **Memory accuracy verification** — script exists (`scripts/verify_memory.py`) but needs a real eval strategy, not a one-off script.
|
|
14
14
|
|
|
15
15
|
### 3. Scheduler
|
|
16
|
-
- Wire a `Scheduler` into the FastAPI lifespan as an optional background task when `config.yaml` has `scheduler.jobs
|
|
16
|
+
- Wire a `Scheduler` into the FastAPI lifespan as an optional background task when `config.yaml` has `scheduler.jobs`.
|
|
17
17
|
- Needs significant design work for cloud runtimes: Lambda/Cloud Functions have no persistent process, GKE/ECS can use sidecar or CronJob, etc. Think through heartbeat / self-scheduling before implementing.
|
|
18
18
|
|
|
19
19
|
### 4. Sandbox Workspace Protection
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
- Worker pool: standalone `python -m monkeybot.subagents.worker` consumes queued runs with atomic `claim()` (recommended for production — its own event loop, scales independently of the gateway). `MONKEYBOT_WORKER_POOL=1` runs the same loop in-process on the gateway and is development-only (competes with the SSE event loop).
|
|
31
31
|
|
|
32
32
|
### 7. CLI-managed optional service dependencies
|
|
33
|
-
- `monkeybot chat` / `run` only spawn the gateway process; they don't start the Docker-backed optional services some `monkeybot.yaml` configs require: OpenSandbox (`sandbox.enabled`), Firestore emulator (`paths.db_url: firestore://...`), or the observability stack (Phoenix/Langfuse/OTel collector).
|
|
34
|
-
- Decide and implement: should the CLI (`doctor`, `run`, `chat`) detect these from config and actually start/stop the containers
|
|
33
|
+
- `monkeybot chat` / `run` only spawn the gateway process; they don't start the Docker-backed optional services some `monkeybot.yaml` configs require: OpenSandbox (`sandbox.enabled`), Firestore emulator (`paths.db_url: firestore://...`), or the observability stack (Phoenix/Langfuse/OTel collector). Those used to be orchestrated by a demo `run.sh`; the CLI alone still can't fully run an agent that uses those features.
|
|
34
|
+
- Decide and implement: should the CLI (`doctor`, `run`, `chat`) detect these from config and actually start/stop the containers, or just validate/warn with remediation hints while the user manages Docker manually?
|
|
35
35
|
- Open sub-questions if going the "CLI starts services" route: where do per-project Docker assets live (`opensandbox.docker.toml`, OTel collector yaml, compose files) — agent-project-owned files referenced from `monkeybot.yaml`, or CLI-shipped generic templates; and is the sandbox worker image (project-specific extra deps) something the CLI should build, or stay manual/documented.
|
|
36
36
|
|
|
37
37
|
---
|
|
@@ -39,9 +39,9 @@
|
|
|
39
39
|
## Do Later
|
|
40
40
|
|
|
41
41
|
### Connectors
|
|
42
|
-
- **CLI gateway** — interactive stdin/stdout
|
|
43
|
-
- **Webhook gateway** — generic HTTP + HMAC
|
|
44
|
-
-
|
|
42
|
+
- **CLI gateway** — interactive stdin/stdout beyond the existing `monkeybot chat` / `talk` clients.
|
|
43
|
+
- **Webhook gateway** — generic HTTP + HMAC ingress for third-party chat products.
|
|
44
|
+
- **Expanded `python -m monkeybot` surface** — additional operator subcommands (`usage` / `schedule`, etc.) as needed.
|
|
45
45
|
|
|
46
46
|
### Cloud Deployments
|
|
47
47
|
- **GCP server** — GCE / GKE deployment option (docs + examples exist; no IaC).
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
- **INDEX.md size cap** *(deferred 2026-05-15)* — `MemoryOrganizer` appends without bound; acceptable for now via `ContextCurator` selection. When indices grow wastefully large, cap with a sliding window (N=200, archive to `INDEX.archive.md`) in `core/memory_organizer.py`.
|
|
57
57
|
|
|
58
58
|
### MCP
|
|
59
|
-
- **MCP distro linkage** — confirm `
|
|
59
|
+
- **MCP distro linkage** — confirm scaffolded `monkeybot.yaml` paths (`paths.mcp_config`, `paths.skills_path`) match deployment; smoke-test against real MCP servers beyond the bundled examples.
|
|
60
60
|
|
|
61
61
|
### Future platforms *(not scheduled)*
|
|
62
62
|
|
|
@@ -6,10 +6,50 @@ the project adheres to [Semantic Versioning](https://semver.org/).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [core v2.2.0] - 2026-07-13
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Canonical agent-root layout and a read-only virtual `skills/` root.
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- Remote sandboxes require an explicit compute-only capability setting.
|
|
18
|
+
|
|
19
|
+
### Breaking
|
|
20
|
+
|
|
21
|
+
- Workspace or skills symlinks that resolve outside their respective roots are now rejected. Move their targets inside the agent's `workspace/`, `data/`, or `skills/` layout.
|
|
22
|
+
|
|
23
|
+
## [browser v0.2.0] - 2026-07-13
|
|
24
|
+
|
|
25
|
+
### Added
|
|
26
|
+
|
|
27
|
+
- Browser MCP package release supporting the canonical agent layout.
|
|
28
|
+
|
|
29
|
+
## [cli v0.3.0] - 2026-07-13
|
|
30
|
+
|
|
31
|
+
### Added
|
|
32
|
+
|
|
33
|
+
- Agent scaffolds now include the canonical layout, Dockerfile, and disabled browser MCP configuration.
|
|
34
|
+
|
|
35
|
+
### Fixed
|
|
36
|
+
|
|
37
|
+
- `monkeybot chat` no longer adopts a stale gateway on a busy port: it refuses to spawn when the port is already in use (suggesting `/bye`, stopping `monkeybot run`, or `--attach`), and `wait_for_health` rejects a `/health` 200 if the child process has already exited.
|
|
38
|
+
|
|
39
|
+
## [0.2.1] - 2026-07-13
|
|
40
|
+
|
|
41
|
+
### Added
|
|
42
|
+
|
|
43
|
+
- First PyPI release of **monkeybot-cli** (Trusted Publishing) — install with `uv tool install monkeybot-cli`.
|
|
44
|
+
|
|
45
|
+
|
|
9
46
|
## [2.1.1] - 2026-07-13
|
|
10
47
|
|
|
11
48
|
### Added
|
|
12
49
|
|
|
50
|
+
- Evals: `response_regex` and `response_not_contains` deterministic assertions; run files now persist per-turn prompt/response text, and `python -m evals.diff` pinpoints the exact turn behind a regression between two runs.
|
|
51
|
+
- Live eval smoke workflow now also runs on every push to `main` (report-only, scorecard on the run Summary page) and on manual dispatch, in addition to the existing PR gates.
|
|
52
|
+
- Live evals need only `NVIDIA_API_KEY`: the deepeval judge can now run on build.nvidia.com models (`JUDGE_PROVIDER=nvidia`) via NVIDIA's OpenAI-compatible endpoint, and CI pins agent (`meta/llama-3.3-70b-instruct`) and judge (`nvidia/llama-3.3-nemotron-super-49b-v1`) to two different free NVIDIA-hosted models. The workflow also now sets `MODEL_PROVIDER`/`MODEL_NAME` explicitly — previously it booted whatever `demo_agent`'s committed config said (ollama, which doesn't exist in CI).
|
|
13
53
|
- Repo-root `monkeybot_config_example/` — full-option human-readable config templates (`.example` filenames).
|
|
14
54
|
- `monkeybot new` also scaffolds `permissions.yaml`.
|
|
15
55
|
- `monkeybot new` writes an agent-project `pyproject.toml` with a PyPI `monkeybot[<provider>]>=2.1.0,<3` dependency (plain `uv sync` after scaffold).
|
|
@@ -18,6 +58,10 @@ the project adheres to [Semantic Versioning](https://semver.org/).
|
|
|
18
58
|
- README / getting-started / onboarding skill lead with `uv tool install monkeybot-cli` (clone is contributor-only).
|
|
19
59
|
- **monkeybot-cli** declares published core bound `monkeybot[cli]>=2.1.0,<3` (local clones still use `[tool.uv.sources]`).
|
|
20
60
|
|
|
61
|
+
### Removed
|
|
62
|
+
|
|
63
|
+
- Evals FastAPI service (`evals/main.py`, in-memory store, WebSocket fan-out, Dockerfile, `docker-compose.evals.yml`) — nothing consumed its HTTP/WS API; `python -m evals.report` is the single execution path. `google-genai` (Gemini judge dep) moved into the root `evals` extra.
|
|
64
|
+
|
|
21
65
|
### Changed
|
|
22
66
|
|
|
23
67
|
- `monkeybot doctor` remediation for missing extras: add `monkeybot[<extra>]` to agent deps + `uv sync` (keeps `uv sync --extra` only when the agent defines project-level optionals).
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Thanks for helping improve monkeybot. Report bugs and doc gaps via [issues](https://github.com/human-plus-machine/monkeybot/issues); PRs for fixes and improvements are welcome.
|
|
4
|
+
|
|
5
|
+
## Developing the harness
|
|
6
|
+
|
|
7
|
+
Clone only if you are changing monkeybot itself (end users should use `uv tool install monkeybot-cli` — see the [README](README.md)):
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
git clone https://github.com/human-plus-machine/monkeybot.git
|
|
11
|
+
cd monkeybot && uv sync
|
|
12
|
+
cd cli && uv sync
|
|
13
|
+
uv tool install --editable .
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
For live eval smoke runs against a local gateway, use [`evals/smoke_agent/`](evals/smoke_agent/) (see [docs/live-evals.md](docs/live-evals.md)).
|
|
17
|
+
|
|
18
|
+
### Checks
|
|
19
|
+
|
|
20
|
+
CI runs `mypy` on `src/monkeybot` and pytest (root, `cli/`, `integrations/browser-mcp/`), plus standalone eval self-checks. Before submitting:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
uv run pytest
|
|
24
|
+
uv run mypy src/monkeybot
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
`ruff` is useful locally but is not a CI gate today.
|
|
28
|
+
|
|
29
|
+
> [!NOTE]
|
|
30
|
+
> Do not run the root pytest suite with a scaffolded `monkeybot_config/` + `workspace/` at the repo root — that layout can make a couple of workspace-resolution tests fail. CI uses a clean tree.
|
|
31
|
+
|
|
32
|
+
## Releasing
|
|
33
|
+
|
|
34
|
+
`develop` is the working branch; `main` always reflects the latest release.
|
|
35
|
+
|
|
36
|
+
1. Anyone runs the **Prepare release** workflow (Actions tab → Prepare release → Run workflow), choosing `core`, `browser`, or `cli` and a version bump. It bumps the package's `pyproject.toml`, moves the `CHANGELOG.md` `Unreleased` section into a dated entry on a `release/<package>-v<version>` branch, and opens a PR from that branch into `main` (`develop` itself is untouched until the PR merges, so an abandoned release PR leaves no trace).
|
|
37
|
+
2. An admin reviews and **merges the PR** (branch protection on `main` restricts who can merge). Use a regular merge commit, not squash, so `main`'s history and the release tag line up with what was reviewed.
|
|
38
|
+
3. The **Publish release** workflow runs automatically on that merge: it tags the new version, creates a GitHub Release from the changelog entry, Trusted-Publishes the released package(s) to PyPI (core and browser before CLI when both ship), publishes the sandbox image with a core release, and merges `main` back into `develop` so the two branches don't drift apart.
|
|
39
|
+
|
|
40
|
+
One-time setup (repo Settings → Branches → add rule for `main`): require a pull request before merging, and restrict who can push to matching branches to Admins. That's the only access control needed — anyone can prepare a release, only admins can promote it to `main`.
|
|
41
|
+
|
|
42
|
+
**Before relying on this:** `develop` and `main` currently have diverged history (independent commits on each side). Reconcile them once with a manual merge before running the first automated release, or the first release PR may show unrelated changes or conflicts. `CHANGELOG.md` is shared across both packages — `core` and `cli` versions are bumped independently but their release notes live in the same file. The current versions already on `main` (`core` 2.0.0, `cli` 0.1.7) predate this tooling and have no changelog entry, so the first `publish` run intentionally skips tagging them rather than creating a release with empty notes; tagging starts from the next real version bump.
|
monkeybot-2.2.0/PKG-INFO
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: monkeybot
|
|
3
|
+
Version: 2.2.0
|
|
4
|
+
Summary: monkeybot agent harness — FastAPI SSE gateway, owned loop, SQLite, and MCP.
|
|
5
|
+
License: MIT
|
|
6
|
+
License-File: LICENSE
|
|
7
|
+
Requires-Python: >=3.11
|
|
8
|
+
Requires-Dist: aiosqlite>=0.20.0
|
|
9
|
+
Requires-Dist: fastapi>=0.115.0
|
|
10
|
+
Requires-Dist: google-genai>=1.0.0
|
|
11
|
+
Requires-Dist: httpx>=0.27.0
|
|
12
|
+
Requires-Dist: mcp>=1.0.0
|
|
13
|
+
Requires-Dist: pydantic>=2.10.0
|
|
14
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
15
|
+
Requires-Dist: python-ulid>=2.0.0
|
|
16
|
+
Requires-Dist: pyyaml>=6.0.2
|
|
17
|
+
Requires-Dist: uvicorn[standard]>=0.32.0
|
|
18
|
+
Provides-Extra: aws
|
|
19
|
+
Requires-Dist: boto3>=1.34.0; extra == 'aws'
|
|
20
|
+
Provides-Extra: bedrock
|
|
21
|
+
Requires-Dist: anthropic[bedrock]>=0.40.0; extra == 'bedrock'
|
|
22
|
+
Requires-Dist: boto3>=1.34.0; extra == 'bedrock'
|
|
23
|
+
Provides-Extra: claude
|
|
24
|
+
Requires-Dist: anthropic>=0.40.0; extra == 'claude'
|
|
25
|
+
Provides-Extra: cli
|
|
26
|
+
Requires-Dist: typer>=0.12.0; extra == 'cli'
|
|
27
|
+
Requires-Dist: websockets>=14.0; extra == 'cli'
|
|
28
|
+
Provides-Extra: cli-realtime
|
|
29
|
+
Requires-Dist: pyaudio>=0.2.11; extra == 'cli-realtime'
|
|
30
|
+
Requires-Dist: pynput>=1.7.6; extra == 'cli-realtime'
|
|
31
|
+
Requires-Dist: typer>=0.12.0; extra == 'cli-realtime'
|
|
32
|
+
Requires-Dist: websockets>=14.0; extra == 'cli-realtime'
|
|
33
|
+
Provides-Extra: council
|
|
34
|
+
Requires-Dist: google-cloud-storage>=2.18.0; extra == 'council'
|
|
35
|
+
Provides-Extra: evals
|
|
36
|
+
Requires-Dist: deepeval>=3.0.0; extra == 'evals'
|
|
37
|
+
Requires-Dist: google-genai>=1.0.0; extra == 'evals'
|
|
38
|
+
Requires-Dist: langfuse>=3.0.0; extra == 'evals'
|
|
39
|
+
Provides-Extra: firestore
|
|
40
|
+
Requires-Dist: google-cloud-firestore>=2.16.0; extra == 'firestore'
|
|
41
|
+
Provides-Extra: gcs
|
|
42
|
+
Requires-Dist: google-cloud-storage>=2.18.0; extra == 'gcs'
|
|
43
|
+
Provides-Extra: gemini
|
|
44
|
+
Requires-Dist: google-genai>=1.0.0; extra == 'gemini'
|
|
45
|
+
Provides-Extra: huggingface
|
|
46
|
+
Requires-Dist: openai>=1.0; extra == 'huggingface'
|
|
47
|
+
Requires-Dist: tiktoken>=0.7.0; extra == 'huggingface'
|
|
48
|
+
Provides-Extra: nvidia
|
|
49
|
+
Requires-Dist: openai>=1.0; extra == 'nvidia'
|
|
50
|
+
Requires-Dist: tiktoken>=0.7.0; extra == 'nvidia'
|
|
51
|
+
Provides-Extra: observability
|
|
52
|
+
Requires-Dist: opentelemetry-api>=1.28; extra == 'observability'
|
|
53
|
+
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.28; extra == 'observability'
|
|
54
|
+
Requires-Dist: opentelemetry-instrumentation-fastapi>=0.62b1; extra == 'observability'
|
|
55
|
+
Requires-Dist: opentelemetry-sdk>=1.28; extra == 'observability'
|
|
56
|
+
Provides-Extra: ollama
|
|
57
|
+
Requires-Dist: openai>=1.0; extra == 'ollama'
|
|
58
|
+
Requires-Dist: tiktoken>=0.7.0; extra == 'ollama'
|
|
59
|
+
Provides-Extra: openai
|
|
60
|
+
Requires-Dist: openai>=1.0; extra == 'openai'
|
|
61
|
+
Requires-Dist: tiktoken>=0.7.0; extra == 'openai'
|
|
62
|
+
Provides-Extra: postgres
|
|
63
|
+
Requires-Dist: asyncpg>=0.29.0; extra == 'postgres'
|
|
64
|
+
Provides-Extra: realtime
|
|
65
|
+
Requires-Dist: websockets>=14.0; extra == 'realtime'
|
|
66
|
+
Provides-Extra: realtime-gemini
|
|
67
|
+
Requires-Dist: google-genai>=1.0.0; extra == 'realtime-gemini'
|
|
68
|
+
Requires-Dist: websockets>=14.0; extra == 'realtime-gemini'
|
|
69
|
+
Provides-Extra: sandbox
|
|
70
|
+
Requires-Dist: opensandbox>=0.1.7; extra == 'sandbox'
|
|
71
|
+
Provides-Extra: scheduler
|
|
72
|
+
Requires-Dist: croniter>=2.0; extra == 'scheduler'
|
|
73
|
+
Provides-Extra: vertex
|
|
74
|
+
Requires-Dist: google-api-python-client>=2.150.0; extra == 'vertex'
|
|
75
|
+
Requires-Dist: google-auth>=2.35.0; extra == 'vertex'
|
|
76
|
+
Requires-Dist: google-genai>=1.0.0; extra == 'vertex'
|
|
77
|
+
Provides-Extra: vertex-claude
|
|
78
|
+
Requires-Dist: anthropic[vertex]>=0.40.0; extra == 'vertex-claude'
|
|
79
|
+
Provides-Extra: web-search
|
|
80
|
+
Requires-Dist: ddgs>=7.0; extra == 'web-search'
|
|
81
|
+
Description-Content-Type: text/markdown
|
|
82
|
+
|
|
83
|
+
# monkeybot
|
|
84
|
+
|
|
85
|
+
<div align="center">
|
|
86
|
+
<img src="docs/assets/logo.png" alt="monkeybot Logo" width="600" />
|
|
87
|
+
|
|
88
|
+
<br />
|
|
89
|
+
|
|
90
|
+
*Multi-cloud agent harness — GCP-first docs, portable runtime*
|
|
91
|
+
|
|
92
|
+
[](LICENSE)
|
|
93
|
+
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
monkeybot is an owned agent runtime for tool-using LLMs: a FastAPI SSE gateway, pluggable storage, MCP tools, skills, and memory. Run locally with zero cloud dependencies, or ship the same container image anywhere Docker runs.
|
|
97
|
+
|
|
98
|
+
Docs and examples are **GCP-first** (Vertex, GCS, Cloud Run); AWS paths ship in the Pattern guides. See [Cloud deployment — Positioning](docs/cloud-deployment-design.md#positioning).
|
|
99
|
+
|
|
100
|
+
> [!NOTE]
|
|
101
|
+
> Skills under `SKILLS_PATH` execute Python code — only add skills from trusted sources.
|
|
102
|
+
|
|
103
|
+
## Quick start
|
|
104
|
+
|
|
105
|
+
Install [uv](https://docs.astral.sh/uv/), then:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
uv tool install monkeybot-cli
|
|
109
|
+
|
|
110
|
+
monkeybot new --dest ./my-agent --provider openai --yes
|
|
111
|
+
cd my-agent
|
|
112
|
+
uv sync
|
|
113
|
+
cp .env.example .env # add provider keys
|
|
114
|
+
monkeybot doctor
|
|
115
|
+
monkeybot chat
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Upgrade the CLI with `uv tool upgrade monkeybot-cli`. Full walkthrough: **[Getting Started](docs/getting-started.md)**.
|
|
119
|
+
|
|
120
|
+
## What you get
|
|
121
|
+
|
|
122
|
+
- **SSE gateway** — sessions, streaming, health; wire your own UI or use the CLI
|
|
123
|
+
- **Realtime talk** — WebSocket voice/text via `monkeybot talk`
|
|
124
|
+
- **MCP + skills** — stdio/HTTP tools and trusted Python skill bundles
|
|
125
|
+
- **Pluggable storage** — SQLite by default; Postgres, Firestore, GCS, S3
|
|
126
|
+
- **Multi-provider** — Gemini/Vertex, OpenAI, Anthropic, Bedrock, Ollama, and more
|
|
127
|
+
|
|
128
|
+
## CLI
|
|
129
|
+
|
|
130
|
+
| Command | Purpose |
|
|
131
|
+
|---|---|
|
|
132
|
+
| `monkeybot new` | Scaffold config, workspace, agent `pyproject.toml`, `.env.example` |
|
|
133
|
+
| `monkeybot validate` | Check `monkeybot.yaml`, paths, and MCP config |
|
|
134
|
+
| `monkeybot doctor` | Verify Python, extras, credentials, and port |
|
|
135
|
+
| `monkeybot run` | Start the SSE gateway in the foreground |
|
|
136
|
+
| `monkeybot chat` | Talk over SSE (spawns the gateway; `--attach` to join one) |
|
|
137
|
+
| `monkeybot talk` | Realtime voice/text over WebSocket (`--text` for typed input) |
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
monkeybot chat # spawn gateway + REPL
|
|
141
|
+
monkeybot run # terminal 1: gateway with logs
|
|
142
|
+
monkeybot chat --attach # terminal 2: attach to it
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Provider extras live on the **agent** `pyproject.toml` (`monkeybot[<provider>]`), not the global CLI. See [Getting Started](docs/getting-started.md) and [Features — CLI](docs/features.md#16-cli).
|
|
146
|
+
|
|
147
|
+
## Agent skill
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
npx skills add human-plus-machine/monkeybot --skill monkeybot
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Walks through install, scaffold, config, and first chat. Source: [`cli/skills/monkeybot/`](cli/skills/monkeybot/).
|
|
154
|
+
|
|
155
|
+
## Documentation
|
|
156
|
+
|
|
157
|
+
| Guide | Description |
|
|
158
|
+
|---|---|
|
|
159
|
+
| [Getting Started](docs/getting-started.md) | Install, configure, sessions + SSE from the CLI |
|
|
160
|
+
| [Features](docs/features.md) | Architecture, capabilities, CLI, task queue |
|
|
161
|
+
| [SSE gateway and custom UI](docs/sse-gateway-ui.md) | HTTP + SSE endpoints, event types, CORS |
|
|
162
|
+
| [Skills](docs/skills.md) | Skill directory layout and `SKILL.md` discovery |
|
|
163
|
+
| [Model Context Protocol](docs/mcp.md) | MCP config, env interpolation, OAuth2 |
|
|
164
|
+
| [Cloud deployment](docs/cloud-deployment-design.md) | Positioning + Patterns A–D index |
|
|
165
|
+
| [Live evals](docs/live-evals.md) | Smoke suite, local + CI scorecard |
|
|
166
|
+
| [Observability](docs/observability-runbook.md) | OpenTelemetry tracing runbook |
|
|
167
|
+
|
|
168
|
+
Integrations matrix and roadmap: [CHANGELOG](CHANGELOG.md) · [BACKLOG](BACKLOG.md).
|
|
169
|
+
|
|
170
|
+
## Contributing
|
|
171
|
+
|
|
172
|
+
Clone only if you are changing the harness. Setup, checks, and the release workflow are in **[CONTRIBUTING.md](CONTRIBUTING.md)**. Live eval smoke fixture: [`evals/smoke_agent/`](evals/smoke_agent/).
|
|
173
|
+
|
|
174
|
+
## Support
|
|
175
|
+
|
|
176
|
+
Search or open an issue in the [GitHub issue tracker](https://github.com/human-plus-machine/monkeybot/issues).
|
|
177
|
+
|
|
178
|
+
## License
|
|
179
|
+
|
|
180
|
+
MIT — see [`LICENSE`](LICENSE).
|