monkeybot 2.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- monkeybot-2.1.1/.dockerignore +17 -0
- monkeybot-2.1.1/.github/workflows/ci.yml +47 -0
- monkeybot-2.1.1/.github/workflows/live-eval-smoke.yml +158 -0
- monkeybot-2.1.1/.github/workflows/prepare-release.yml +36 -0
- monkeybot-2.1.1/.github/workflows/publish-release.yml +98 -0
- monkeybot-2.1.1/.gitignore +64 -0
- monkeybot-2.1.1/.pre-commit-config.yaml +20 -0
- monkeybot-2.1.1/AGENTS.md +34 -0
- monkeybot-2.1.1/BACKLOG.md +77 -0
- monkeybot-2.1.1/CHANGELOG.md +135 -0
- monkeybot-2.1.1/LICENSE +21 -0
- monkeybot-2.1.1/PKG-INFO +318 -0
- monkeybot-2.1.1/README.md +237 -0
- monkeybot-2.1.1/cli/pyproject.toml +42 -0
- monkeybot-2.1.1/cli/skills/monkeybot/SKILL.md +197 -0
- monkeybot-2.1.1/cli/skills/monkeybot/references/config-sections.md +160 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/__init__.py +3 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/chat_renderer.py +87 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/chat_session.py +911 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/chat_status_bar.py +205 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/chat_theme.py +91 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/chat_tool_display.py +334 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/chat_tui.py +1491 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/chat_tui_widgets.py +996 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/commands/__init__.py +1 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/commands/chat.py +817 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/commands/doctor.py +293 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/commands/loop.py +207 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/commands/new.py +207 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/commands/run_cmd.py +41 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/commands/talk.py +102 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/commands/validate.py +385 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/compat.py +7 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/config_resolve.py +55 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/exit_commands.py +13 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/extras_catalog.py +95 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/gateway_health.py +34 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/main.py +38 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/opensandbox_lifecycle.py +314 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/output.py +110 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/providers.py +112 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/realtime/__init__.py +13 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/realtime/audio_io.py +147 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/realtime/client.py +17 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/realtime/gateway_manager.py +142 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/realtime/push_to_talk.py +128 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/realtime/session.py +256 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/realtime/session_controller.py +501 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/realtime/talk_ui.py +243 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/realtime/wire_encode.py +39 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/runtime_python.py +91 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold.py +287 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/AGENT.md +56 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/__init__.py +1 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/command_allowlist.yaml +57 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/env.example +35 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/mcp.json +49 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/monkeybot.example.yaml +191 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/otel-collector.example.yaml +57 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/permissions.yaml +32 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/setup-workspace.sh +24 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/session_controller.py +7 -0
- monkeybot-2.1.1/cli/src/monkeybot_cli/terminal_markdown.py +48 -0
- monkeybot-2.1.1/cli/tests/test_chat_e2e.py +86 -0
- monkeybot-2.1.1/cli/tests/test_chat_errors.py +218 -0
- monkeybot-2.1.1/cli/tests/test_chat_grounding.py +54 -0
- monkeybot-2.1.1/cli/tests/test_chat_renderer_parity.py +26 -0
- monkeybot-2.1.1/cli/tests/test_chat_session.py +363 -0
- monkeybot-2.1.1/cli/tests/test_chat_status_bar.py +149 -0
- monkeybot-2.1.1/cli/tests/test_chat_theme.py +71 -0
- monkeybot-2.1.1/cli/tests/test_chat_tool_display.py +154 -0
- monkeybot-2.1.1/cli/tests/test_chat_tui.py +1243 -0
- monkeybot-2.1.1/cli/tests/test_cli.py +132 -0
- monkeybot-2.1.1/cli/tests/test_config_resolve.py +21 -0
- monkeybot-2.1.1/cli/tests/test_doctor.py +49 -0
- monkeybot-2.1.1/cli/tests/test_extras_catalog.py +87 -0
- monkeybot-2.1.1/cli/tests/test_opensandbox_lifecycle.py +41 -0
- monkeybot-2.1.1/cli/tests/test_realtime_session_controller.py +301 -0
- monkeybot-2.1.1/cli/tests/test_run_cmd.py +79 -0
- monkeybot-2.1.1/cli/tests/test_runtime_python.py +109 -0
- monkeybot-2.1.1/cli/tests/test_scaffold.py +115 -0
- monkeybot-2.1.1/cli/tests/test_terminal_markdown.py +47 -0
- monkeybot-2.1.1/cli/uv.lock +1612 -0
- monkeybot-2.1.1/demo_agent/.env.example +21 -0
- monkeybot-2.1.1/demo_agent/.gitignore +9 -0
- monkeybot-2.1.1/demo_agent/docker-compose.langfuse.yml +159 -0
- monkeybot-2.1.1/demo_agent/docker-compose.observability.yml +31 -0
- monkeybot-2.1.1/demo_agent/firebase.json +11 -0
- monkeybot-2.1.1/demo_agent/firestore.indexes.json +14 -0
- monkeybot-2.1.1/demo_agent/pyproject.toml +17 -0
- monkeybot-2.1.1/demo_agent/run.sh +532 -0
- monkeybot-2.1.1/demo_agent/uv.lock +2782 -0
- monkeybot-2.1.1/demo_agent/workspace/.gitkeep +0 -0
- monkeybot-2.1.1/demo_agent/workspace/browser/Screenshots/.gitkeep +0 -0
- monkeybot-2.1.1/demo_agent/workspace/skills/browser/SKILL.md +68 -0
- monkeybot-2.1.1/demo_agent/workspace/skills/browser/playbooks/.gitkeep +0 -0
- monkeybot-2.1.1/demo_agent/workspace/skills/image-generator/SKILL.md +56 -0
- monkeybot-2.1.1/demo_agent/workspace/skills/image-generator/generate_image.py +199 -0
- monkeybot-2.1.1/docker/Dockerfile +30 -0
- monkeybot-2.1.1/docker/Dockerfile.demo-sandbox +8 -0
- monkeybot-2.1.1/docker/docker-compose.sandbox.yml +49 -0
- monkeybot-2.1.1/docker/opensandbox.docker.toml +46 -0
- monkeybot-2.1.1/docker-compose.evals.yml +24 -0
- monkeybot-2.1.1/docker-compose.yml +29 -0
- monkeybot-2.1.1/docs/browser-mcp.md +160 -0
- monkeybot-2.1.1/docs/chat-tui-improvements.md +220 -0
- monkeybot-2.1.1/docs/cli-pypi-distribution.md +264 -0
- monkeybot-2.1.1/docs/cloud-deployment-design.md +555 -0
- monkeybot-2.1.1/docs/deploy-aws-agentcore.md +103 -0
- monkeybot-2.1.1/docs/deploy-pattern-a-container.md +361 -0
- monkeybot-2.1.1/docs/deploy-pattern-b-serverless.md +332 -0
- monkeybot-2.1.1/docs/deploy-pattern-c-agent-platform.md +209 -0
- monkeybot-2.1.1/docs/deploy-pattern-d-realtime.md +300 -0
- monkeybot-2.1.1/docs/eval-pr-scorecard.md +417 -0
- monkeybot-2.1.1/docs/features.md +780 -0
- monkeybot-2.1.1/docs/getting-started.md +147 -0
- monkeybot-2.1.1/docs/mcp.md +195 -0
- monkeybot-2.1.1/docs/monkeycleaner-cli-prettier.md +38 -0
- monkeybot-2.1.1/docs/observability-runbook.md +57 -0
- monkeybot-2.1.1/docs/otel-collector.example.yaml +57 -0
- monkeybot-2.1.1/docs/progressive-mcp-tools.md +263 -0
- monkeybot-2.1.1/docs/realtime-streaming-design.md +542 -0
- monkeybot-2.1.1/docs/skills.md +50 -0
- monkeybot-2.1.1/docs/sse-gateway-ui.md +272 -0
- monkeybot-2.1.1/evals/Dockerfile +20 -0
- monkeybot-2.1.1/evals/assertions.py +71 -0
- monkeybot-2.1.1/evals/eval_config.yaml +5 -0
- monkeybot-2.1.1/evals/main.py +259 -0
- monkeybot-2.1.1/evals/models.py +125 -0
- monkeybot-2.1.1/evals/persistence.py +186 -0
- monkeybot-2.1.1/evals/pyproject.toml +32 -0
- monkeybot-2.1.1/evals/report.py +328 -0
- monkeybot-2.1.1/evals/requirements.txt +9 -0
- monkeybot-2.1.1/evals/runner.py +216 -0
- monkeybot-2.1.1/evals/scenario_loader.py +98 -0
- monkeybot-2.1.1/evals/scenarios/context/summarization_trigger.yaml +32 -0
- monkeybot-2.1.1/evals/scenarios/mcp/tool_invoke.yaml +11 -0
- monkeybot-2.1.1/evals/scenarios/memory/recall_cross_session.yaml +12 -0
- monkeybot-2.1.1/evals/scenarios/memory/recall_single_session.yaml +11 -0
- monkeybot-2.1.1/evals/scenarios/multi_turn/task_tracking.yaml +11 -0
- monkeybot-2.1.1/evals/scenarios/operator/.gitkeep +0 -0
- monkeybot-2.1.1/evals/scenarios/skills/skill_invocation.yaml +10 -0
- monkeybot-2.1.1/evals/scenarios/subagents/dispatch_complete.yaml +8 -0
- monkeybot-2.1.1/evals/scenarios/tools/core_read.yaml +11 -0
- monkeybot-2.1.1/evals/scenarios/tools/core_read_error.yaml +10 -0
- monkeybot-2.1.1/evals/scorer.py +342 -0
- monkeybot-2.1.1/evals/store.py +60 -0
- monkeybot-2.1.1/evals/suites/smoke.yaml +12 -0
- monkeybot-2.1.1/evals/test_assertions.py +98 -0
- monkeybot-2.1.1/evals/test_judge.py +79 -0
- monkeybot-2.1.1/evals/test_report.py +122 -0
- monkeybot-2.1.1/evals/test_runner_sse.py +142 -0
- monkeybot-2.1.1/evals/uv.lock +2153 -0
- monkeybot-2.1.1/evals/ws_manager.py +46 -0
- monkeybot-2.1.1/examples/README.md +63 -0
- monkeybot-2.1.1/examples/agentcore/handler.py +112 -0
- monkeybot-2.1.1/examples/agentcore/runtime_app.py +103 -0
- monkeybot-2.1.1/examples/agentengine/handler.py +77 -0
- monkeybot-2.1.1/examples/cloud-functions/main.py +76 -0
- monkeybot-2.1.1/examples/lambda/handler.py +79 -0
- monkeybot-2.1.1/examples/skills/browser/SKILL.md +14 -0
- monkeybot-2.1.1/examples/skills/diagnostics/README.md +264 -0
- monkeybot-2.1.1/examples/skills/diagnostics/SKILL.md +36 -0
- monkeybot-2.1.1/examples/skills/diagnostics/__init__.py +1 -0
- monkeybot-2.1.1/examples/skills/diagnostics/diagnostics.py +130 -0
- monkeybot-2.1.1/examples/skills/image-generator/SKILL.md +10 -0
- monkeybot-2.1.1/examples/skills/image-generator/generate_image.py +199 -0
- monkeybot-2.1.1/integrations/browser-mcp/pyproject.toml +22 -0
- monkeybot-2.1.1/integrations/browser-mcp/src/browser_mcp/__init__.py +3 -0
- monkeybot-2.1.1/integrations/browser-mcp/src/browser_mcp/assets/NOTICE.md +32 -0
- monkeybot-2.1.1/integrations/browser-mcp/src/browser_mcp/assets/dom_tree.js +1749 -0
- monkeybot-2.1.1/integrations/browser-mcp/src/browser_mcp/assets/pa_driver.js +209 -0
- monkeybot-2.1.1/integrations/browser-mcp/src/browser_mcp/dom_indexing.py +123 -0
- monkeybot-2.1.1/integrations/browser-mcp/src/browser_mcp/playbooks.py +89 -0
- monkeybot-2.1.1/integrations/browser-mcp/src/browser_mcp/screenshots.py +63 -0
- monkeybot-2.1.1/integrations/browser-mcp/src/browser_mcp/server.py +351 -0
- monkeybot-2.1.1/integrations/browser-mcp/tests/test_dom_indexing.py +147 -0
- monkeybot-2.1.1/integrations/browser-mcp/tests/test_indexed_tools.py +117 -0
- monkeybot-2.1.1/integrations/browser-mcp/tests/test_playbooks.py +103 -0
- monkeybot-2.1.1/integrations/browser-mcp/tests/test_screenshots.py +51 -0
- monkeybot-2.1.1/integrations/browser-mcp/tests/test_server_shutdown.py +104 -0
- monkeybot-2.1.1/integrations/browser-mcp/uv.lock +936 -0
- monkeybot-2.1.1/logo.png +0 -0
- monkeybot-2.1.1/monkeybot_config_example/AGENT.example.md +56 -0
- monkeybot-2.1.1/monkeybot_config_example/command_allowlist.example.yaml +61 -0
- monkeybot-2.1.1/monkeybot_config_example/mcp.example.json +49 -0
- monkeybot-2.1.1/monkeybot_config_example/monkeybot.example.yaml +209 -0
- monkeybot-2.1.1/monkeybot_config_example/opensandbox.docker.example.toml +51 -0
- monkeybot-2.1.1/monkeybot_config_example/otel-collector.demo-dual.example.yaml +46 -0
- monkeybot-2.1.1/monkeybot_config_example/otel-collector.demo.example.yaml +35 -0
- monkeybot-2.1.1/monkeybot_config_example/permissions.example.yaml +32 -0
- monkeybot-2.1.1/pyproject.toml +124 -0
- monkeybot-2.1.1/pytest.ini +16 -0
- monkeybot-2.1.1/scripts/create_schema.py +82 -0
- monkeybot-2.1.1/scripts/precommit-pytest.sh +22 -0
- monkeybot-2.1.1/scripts/release.py +165 -0
- monkeybot-2.1.1/scripts/smoke_global_cli.sh +91 -0
- monkeybot-2.1.1/scripts/verify_memory.py +27 -0
- monkeybot-2.1.1/src/monkeybot/__init__.py +3 -0
- monkeybot-2.1.1/src/monkeybot/cli/__init__.py +3 -0
- monkeybot-2.1.1/src/monkeybot/cli/__main__.py +8 -0
- monkeybot-2.1.1/src/monkeybot/cli/audio_io.py +8 -0
- monkeybot-2.1.1/src/monkeybot/cli/gateway_manager.py +17 -0
- monkeybot-2.1.1/src/monkeybot/cli/main.py +22 -0
- monkeybot-2.1.1/src/monkeybot/cli/push_to_talk.py +12 -0
- monkeybot-2.1.1/src/monkeybot/cli/realtime_client.py +13 -0
- monkeybot-2.1.1/src/monkeybot/core/__init__.py +19 -0
- monkeybot-2.1.1/src/monkeybot/core/attachments/__init__.py +22 -0
- monkeybot-2.1.1/src/monkeybot/core/attachments/catalog.py +62 -0
- monkeybot-2.1.1/src/monkeybot/core/attachments/config.py +52 -0
- monkeybot-2.1.1/src/monkeybot/core/attachments/freeze.py +158 -0
- monkeybot-2.1.1/src/monkeybot/core/attachments/resolve.py +70 -0
- monkeybot-2.1.1/src/monkeybot/core/attachments/store.py +180 -0
- monkeybot-2.1.1/src/monkeybot/core/attachments/text.py +72 -0
- monkeybot-2.1.1/src/monkeybot/core/attachments/tools.py +54 -0
- monkeybot-2.1.1/src/monkeybot/core/bootstrap.py +242 -0
- monkeybot-2.1.1/src/monkeybot/core/config/__init__.py +71 -0
- monkeybot-2.1.1/src/monkeybot/core/config/realtime_config.py +150 -0
- monkeybot-2.1.1/src/monkeybot/core/config/runtime_env.py +262 -0
- monkeybot-2.1.1/src/monkeybot/core/config/settings.py +341 -0
- monkeybot-2.1.1/src/monkeybot/core/config/validation.py +249 -0
- monkeybot-2.1.1/src/monkeybot/core/config/yaml_loader.py +45 -0
- monkeybot-2.1.1/src/monkeybot/core/context/__init__.py +781 -0
- monkeybot-2.1.1/src/monkeybot/core/context/campaign_context.py +8 -0
- monkeybot-2.1.1/src/monkeybot/core/context/common.py +14 -0
- monkeybot-2.1.1/src/monkeybot/core/context/curator.py +255 -0
- monkeybot-2.1.1/src/monkeybot/core/context/epoch.py +226 -0
- monkeybot-2.1.1/src/monkeybot/core/context/memory_prompt.py +222 -0
- monkeybot-2.1.1/src/monkeybot/core/context/tool_output_policy.py +270 -0
- monkeybot-2.1.1/src/monkeybot/core/context/tool_result_ingress.py +290 -0
- monkeybot-2.1.1/src/monkeybot/core/context/tool_shapers.py +361 -0
- monkeybot-2.1.1/src/monkeybot/core/hooks/__init__.py +261 -0
- monkeybot-2.1.1/src/monkeybot/core/llm/__init__.py +4 -0
- monkeybot-2.1.1/src/monkeybot/core/llm/provider.py +296 -0
- monkeybot-2.1.1/src/monkeybot/core/llm/realtime_provider.py +203 -0
- monkeybot-2.1.1/src/monkeybot/core/llm/usage.py +57 -0
- monkeybot-2.1.1/src/monkeybot/core/logging_utils.py +24 -0
- monkeybot-2.1.1/src/monkeybot/core/mcp/__init__.py +1 -0
- monkeybot-2.1.1/src/monkeybot/core/mcp/mcp_client.py +1215 -0
- monkeybot-2.1.1/src/monkeybot/core/mcp/ports_mcp.py +109 -0
- monkeybot-2.1.1/src/monkeybot/core/memory/__init__.py +24 -0
- monkeybot-2.1.1/src/monkeybot/core/memory/hook.py +413 -0
- monkeybot-2.1.1/src/monkeybot/core/memory/index_format.py +104 -0
- monkeybot-2.1.1/src/monkeybot/core/memory/integrity.py +180 -0
- monkeybot-2.1.1/src/monkeybot/core/memory/organizer.py +270 -0
- monkeybot-2.1.1/src/monkeybot/core/memory/storage_ops.py +139 -0
- monkeybot-2.1.1/src/monkeybot/core/memory/subsystem.py +91 -0
- monkeybot-2.1.1/src/monkeybot/core/messages/__init__.py +16 -0
- monkeybot-2.1.1/src/monkeybot/core/messages/convert_provider.py +41 -0
- monkeybot-2.1.1/src/monkeybot/core/messages/tool_integrity.py +262 -0
- monkeybot-2.1.1/src/monkeybot/core/messages/transform_context.py +84 -0
- monkeybot-2.1.1/src/monkeybot/core/path_safety.py +11 -0
- monkeybot-2.1.1/src/monkeybot/core/persistence/__init__.py +17 -0
- monkeybot-2.1.1/src/monkeybot/core/persistence/backends.py +236 -0
- monkeybot-2.1.1/src/monkeybot/core/persistence/db.py +28 -0
- monkeybot-2.1.1/src/monkeybot/core/persistence/durable_runs.py +286 -0
- monkeybot-2.1.1/src/monkeybot/core/persistence/firestore.py +658 -0
- monkeybot-2.1.1/src/monkeybot/core/persistence/firestore_scheduled_loops.py +336 -0
- monkeybot-2.1.1/src/monkeybot/core/persistence/history.py +156 -0
- monkeybot-2.1.1/src/monkeybot/core/persistence/postgres.py +895 -0
- monkeybot-2.1.1/src/monkeybot/core/persistence/runs.py +76 -0
- monkeybot-2.1.1/src/monkeybot/core/persistence/scheduled_loops.py +435 -0
- monkeybot-2.1.1/src/monkeybot/core/persistence/session_turn_locks.py +94 -0
- monkeybot-2.1.1/src/monkeybot/core/persistence/sqlite.py +218 -0
- monkeybot-2.1.1/src/monkeybot/core/persistence/sqlite_backend.py +74 -0
- monkeybot-2.1.1/src/monkeybot/core/persistence/thread_summary.py +61 -0
- monkeybot-2.1.1/src/monkeybot/core/persistence/transcript.py +194 -0
- monkeybot-2.1.1/src/monkeybot/core/persistence/usage.py +149 -0
- monkeybot-2.1.1/src/monkeybot/core/prompts/__init__.py +1 -0
- monkeybot-2.1.1/src/monkeybot/core/prompts/harness_prompt.py +197 -0
- monkeybot-2.1.1/src/monkeybot/core/prompts/prompt.py +215 -0
- monkeybot-2.1.1/src/monkeybot/core/runtime/__init__.py +1 -0
- monkeybot-2.1.1/src/monkeybot/core/runtime/context_budget.py +267 -0
- monkeybot-2.1.1/src/monkeybot/core/runtime/events.py +819 -0
- monkeybot-2.1.1/src/monkeybot/core/runtime/input_admission.py +154 -0
- monkeybot-2.1.1/src/monkeybot/core/runtime/loop.py +2374 -0
- monkeybot-2.1.1/src/monkeybot/core/runtime/provider_stream_mapper.py +159 -0
- monkeybot-2.1.1/src/monkeybot/core/runtime/realtime_loop.py +654 -0
- monkeybot-2.1.1/src/monkeybot/core/runtime/utterance_buffer.py +179 -0
- monkeybot-2.1.1/src/monkeybot/core/subagents/__init__.py +1 -0
- monkeybot-2.1.1/src/monkeybot/core/subagents/subagent_proto.py +331 -0
- monkeybot-2.1.1/src/monkeybot/core/subagents/subagent_worker.py +441 -0
- monkeybot-2.1.1/src/monkeybot/core/subagents/worker_pool.py +403 -0
- monkeybot-2.1.1/src/monkeybot/core/testing/__init__.py +1 -0
- monkeybot-2.1.1/src/monkeybot/core/testing/mocks_provider.py +86 -0
- monkeybot-2.1.1/src/monkeybot/core/testing/mocks_realtime_provider.py +137 -0
- monkeybot-2.1.1/src/monkeybot/core/tools/__init__.py +1 -0
- monkeybot-2.1.1/src/monkeybot/core/tools/core_tool_executor.py +1548 -0
- monkeybot-2.1.1/src/monkeybot/core/tools/inspector.py +226 -0
- monkeybot-2.1.1/src/monkeybot/core/tools/loop_inspector.py +45 -0
- monkeybot-2.1.1/src/monkeybot/core/tools/patch.py +480 -0
- monkeybot-2.1.1/src/monkeybot/core/tools/permission.py +284 -0
- monkeybot-2.1.1/src/monkeybot/core/tools/sandbox_executor.py +255 -0
- monkeybot-2.1.1/src/monkeybot/core/tools/spill_inventory.py +35 -0
- monkeybot-2.1.1/src/monkeybot/core/tools/terminal.py +381 -0
- monkeybot-2.1.1/src/monkeybot/core/tools/text_normalize.py +25 -0
- monkeybot-2.1.1/src/monkeybot/core/tools/types.py +33 -0
- monkeybot-2.1.1/src/monkeybot/core/tools/workspace_service.py +710 -0
- monkeybot-2.1.1/src/monkeybot/core/tools/workspace_tools.py +116 -0
- monkeybot-2.1.1/src/monkeybot/core/types/__init__.py +1 -0
- monkeybot-2.1.1/src/monkeybot/core/types/content_blocks.py +644 -0
- monkeybot-2.1.1/src/monkeybot/core/types/interfaces.py +156 -0
- monkeybot-2.1.1/src/monkeybot/core/types/types_tools.py +29 -0
- monkeybot-2.1.1/src/monkeybot/core/workspace/__init__.py +8 -0
- monkeybot-2.1.1/src/monkeybot/core/workspace/factory.py +45 -0
- monkeybot-2.1.1/src/monkeybot/core/workspace/gcs.py +130 -0
- monkeybot-2.1.1/src/monkeybot/core/workspace/local.py +162 -0
- monkeybot-2.1.1/src/monkeybot/core/workspace/protocol.py +45 -0
- monkeybot-2.1.1/src/monkeybot/core/workspace/s3.py +151 -0
- monkeybot-2.1.1/src/monkeybot/core/workspace_layout.py +27 -0
- monkeybot-2.1.1/src/monkeybot/gateway/__init__.py +1 -0
- monkeybot-2.1.1/src/monkeybot/gateway/bootstrap.py +18 -0
- monkeybot-2.1.1/src/monkeybot/gateway/main.py +47 -0
- monkeybot-2.1.1/src/monkeybot/gateway/realtime/__init__.py +31 -0
- monkeybot-2.1.1/src/monkeybot/gateway/realtime/app.py +321 -0
- monkeybot-2.1.1/src/monkeybot/gateway/realtime/deps.py +52 -0
- monkeybot-2.1.1/src/monkeybot/gateway/realtime/errors.py +81 -0
- monkeybot-2.1.1/src/monkeybot/gateway/realtime/guardrails.py +88 -0
- monkeybot-2.1.1/src/monkeybot/gateway/realtime/manager.py +77 -0
- monkeybot-2.1.1/src/monkeybot/gateway/realtime/metrics.py +144 -0
- monkeybot-2.1.1/src/monkeybot/gateway/realtime/routes.py +864 -0
- monkeybot-2.1.1/src/monkeybot/gateway/realtime/session.py +232 -0
- monkeybot-2.1.1/src/monkeybot/gateway/realtime/wire.py +412 -0
- monkeybot-2.1.1/src/monkeybot/gateway/realtime_main.py +49 -0
- monkeybot-2.1.1/src/monkeybot/gateway/sse/__init__.py +1 -0
- monkeybot-2.1.1/src/monkeybot/gateway/sse/app.py +733 -0
- monkeybot-2.1.1/src/monkeybot/gateway/sse/loop_port.py +31 -0
- monkeybot-2.1.1/src/monkeybot/gateway/sse/models.py +177 -0
- monkeybot-2.1.1/src/monkeybot/gateway/sse/reply_body.py +91 -0
- monkeybot-2.1.1/src/monkeybot/gateway/sse/routes.py +1101 -0
- monkeybot-2.1.1/src/monkeybot/gateway/sse/scheduler_routes.py +200 -0
- monkeybot-2.1.1/src/monkeybot/gateway/sse/scheduler_wiring.py +96 -0
- monkeybot-2.1.1/src/monkeybot/gateway/sse/session_bus.py +226 -0
- monkeybot-2.1.1/src/monkeybot/gateway/sse/sse.py +46 -0
- monkeybot-2.1.1/src/monkeybot/gateway/sse/workspace_layout.py +7 -0
- monkeybot-2.1.1/src/monkeybot/observability/__init__.py +220 -0
- monkeybot-2.1.1/src/monkeybot/observability/_state.py +10 -0
- monkeybot-2.1.1/src/monkeybot/observability/instrumentation.py +153 -0
- monkeybot-2.1.1/src/monkeybot/observability/propagation.py +65 -0
- monkeybot-2.1.1/src/monkeybot/observability/spans.py +455 -0
- monkeybot-2.1.1/src/monkeybot/providers/__init__.py +19 -0
- monkeybot-2.1.1/src/monkeybot/providers/_openai_compat.py +450 -0
- monkeybot-2.1.1/src/monkeybot/providers/_utils.py +473 -0
- monkeybot-2.1.1/src/monkeybot/providers/bedrock.py +145 -0
- monkeybot-2.1.1/src/monkeybot/providers/claude.py +125 -0
- monkeybot-2.1.1/src/monkeybot/providers/gemini.py +677 -0
- monkeybot-2.1.1/src/monkeybot/providers/gemini_live.py +398 -0
- monkeybot-2.1.1/src/monkeybot/providers/huggingface.py +129 -0
- monkeybot-2.1.1/src/monkeybot/providers/nvidia.py +104 -0
- monkeybot-2.1.1/src/monkeybot/providers/ollama.py +152 -0
- monkeybot-2.1.1/src/monkeybot/providers/openai.py +127 -0
- monkeybot-2.1.1/src/monkeybot/providers/pricing.py +60 -0
- monkeybot-2.1.1/src/monkeybot/providers/sampling.py +44 -0
- monkeybot-2.1.1/src/monkeybot/providers/vertex_claude.py +148 -0
- monkeybot-2.1.1/src/monkeybot/scaffold/__init__.py +33 -0
- monkeybot-2.1.1/src/monkeybot/scheduler/__init__.py +13 -0
- monkeybot-2.1.1/src/monkeybot/scheduler/__main__.py +4 -0
- monkeybot-2.1.1/src/monkeybot/scheduler/engine.py +333 -0
- monkeybot-2.1.1/src/monkeybot/scheduler/http_invoker.py +61 -0
- monkeybot-2.1.1/src/monkeybot/scheduler/interval.py +77 -0
- monkeybot-2.1.1/src/monkeybot/scheduler/tick_result.py +34 -0
- monkeybot-2.1.1/src/monkeybot/scheduler/worker.py +87 -0
- monkeybot-2.1.1/src/monkeybot/subagents/__init__.py +1 -0
- monkeybot-2.1.1/src/monkeybot/subagents/worker/__init__.py +1 -0
- monkeybot-2.1.1/src/monkeybot/subagents/worker/__main__.py +22 -0
- monkeybot-2.1.1/src/monkeybot/web_search/__init__.py +82 -0
- monkeybot-2.1.1/src/monkeybot/web_search/backends/__init__.py +5 -0
- monkeybot-2.1.1/src/monkeybot/web_search/backends/duckduckgo.py +32 -0
- monkeybot-2.1.1/src/monkeybot/web_search/backends/firecrawl.py +43 -0
- monkeybot-2.1.1/src/monkeybot/web_search/backends/tavily.py +45 -0
- monkeybot-2.1.1/src/monkeybot/web_search/protocol.py +25 -0
- monkeybot-2.1.1/src/monkeybot/web_search/tool.py +56 -0
- monkeybot-2.1.1/testing/BENCH_NOTES.md +226 -0
- monkeybot-2.1.1/testing/bench.py +560 -0
- monkeybot-2.1.1/testing/bots/devbot/AGENT.md +27 -0
- monkeybot-2.1.1/testing/bots/devbot/MEMORY.md +12 -0
- monkeybot-2.1.1/testing/bots/devbot/config.yaml +17 -0
- monkeybot-2.1.1/testing/bots/devbot/skills/file-ops/SKILL.md +24 -0
- monkeybot-2.1.1/testing/bots/devbot/webhook.py +20 -0
- monkeybot-2.1.1/tests/__init__.py +1 -0
- monkeybot-2.1.1/tests/acceptance/test_observability_acceptance.py +240 -0
- monkeybot-2.1.1/tests/cli/__init__.py +0 -0
- monkeybot-2.1.1/tests/cli/test_gateway_manager.py +48 -0
- monkeybot-2.1.1/tests/cli/test_main.py +45 -0
- monkeybot-2.1.1/tests/cli/test_push_to_talk.py +61 -0
- monkeybot-2.1.1/tests/cli/test_realtime_client.py +47 -0
- monkeybot-2.1.1/tests/conftest.py +11 -0
- monkeybot-2.1.1/tests/core/__init__.py +1 -0
- monkeybot-2.1.1/tests/core/memory/fake_workspace_storage.py +57 -0
- monkeybot-2.1.1/tests/core/memory/test_hook_with_storage.py +76 -0
- monkeybot-2.1.1/tests/core/memory/test_index_format.py +38 -0
- monkeybot-2.1.1/tests/core/memory/test_organizer_with_storage.py +88 -0
- monkeybot-2.1.1/tests/core/memory/test_subsystem.py +153 -0
- monkeybot-2.1.1/tests/core/test_attachment_freeze.py +124 -0
- monkeybot-2.1.1/tests/core/test_bootstrap.py +289 -0
- monkeybot-2.1.1/tests/core/test_config_extensions.py +417 -0
- monkeybot-2.1.1/tests/core/test_content_blocks.py +182 -0
- monkeybot-2.1.1/tests/core/test_context.py +541 -0
- monkeybot-2.1.1/tests/core/test_context_budget.py +177 -0
- monkeybot-2.1.1/tests/core/test_context_curator.py +105 -0
- monkeybot-2.1.1/tests/core/test_context_epoch.py +220 -0
- monkeybot-2.1.1/tests/core/test_core_tool_executor.py +1861 -0
- monkeybot-2.1.1/tests/core/test_doom_loop.py +506 -0
- monkeybot-2.1.1/tests/core/test_durable_events.py +69 -0
- monkeybot-2.1.1/tests/core/test_durable_runs.py +190 -0
- monkeybot-2.1.1/tests/core/test_events.py +314 -0
- monkeybot-2.1.1/tests/core/test_firestore_history.py +98 -0
- monkeybot-2.1.1/tests/core/test_firestore_scheduled_loops.py +34 -0
- monkeybot-2.1.1/tests/core/test_gemini_history_replay.py +217 -0
- monkeybot-2.1.1/tests/core/test_harness_prompt.py +152 -0
- monkeybot-2.1.1/tests/core/test_history.py +346 -0
- monkeybot-2.1.1/tests/core/test_hooks.py +220 -0
- monkeybot-2.1.1/tests/core/test_input_admission.py +387 -0
- monkeybot-2.1.1/tests/core/test_inspector.py +225 -0
- monkeybot-2.1.1/tests/core/test_logging_utils.py +32 -0
- monkeybot-2.1.1/tests/core/test_loop.py +2450 -0
- monkeybot-2.1.1/tests/core/test_loop_hooks.py +582 -0
- monkeybot-2.1.1/tests/core/test_loop_observability.py +195 -0
- monkeybot-2.1.1/tests/core/test_loop_transcript.py +240 -0
- monkeybot-2.1.1/tests/core/test_mcp_client.py +896 -0
- monkeybot-2.1.1/tests/core/test_memory.py +202 -0
- monkeybot-2.1.1/tests/core/test_memory_hook.py +473 -0
- monkeybot-2.1.1/tests/core/test_memory_organizer.py +226 -0
- monkeybot-2.1.1/tests/core/test_memory_prompt.py +234 -0
- monkeybot-2.1.1/tests/core/test_message_pipeline.py +100 -0
- monkeybot-2.1.1/tests/core/test_mocks_realtime_provider.py +85 -0
- monkeybot-2.1.1/tests/core/test_patch.py +228 -0
- monkeybot-2.1.1/tests/core/test_permission.py +168 -0
- monkeybot-2.1.1/tests/core/test_prompt.py +314 -0
- monkeybot-2.1.1/tests/core/test_provider_contract.py +253 -0
- monkeybot-2.1.1/tests/core/test_provider_stream_mapper.py +90 -0
- monkeybot-2.1.1/tests/core/test_realtime_loop.py +444 -0
- monkeybot-2.1.1/tests/core/test_replace_fuzzy.py +83 -0
- monkeybot-2.1.1/tests/core/test_run_command_parse.py +59 -0
- monkeybot-2.1.1/tests/core/test_runs.py +113 -0
- monkeybot-2.1.1/tests/core/test_runtime_env.py +280 -0
- monkeybot-2.1.1/tests/core/test_sandbox_executor.py +644 -0
- monkeybot-2.1.1/tests/core/test_scheduled_loops.py +116 -0
- monkeybot-2.1.1/tests/core/test_session_turn_locks.py +36 -0
- monkeybot-2.1.1/tests/core/test_settlement.py +104 -0
- monkeybot-2.1.1/tests/core/test_spill_inventory.py +28 -0
- monkeybot-2.1.1/tests/core/test_storage_backends.py +632 -0
- monkeybot-2.1.1/tests/core/test_subagent_proto.py +368 -0
- monkeybot-2.1.1/tests/core/test_subagent_trace_propagation.py +577 -0
- monkeybot-2.1.1/tests/core/test_subagent_worker_paths.py +245 -0
- monkeybot-2.1.1/tests/core/test_terminal.py +491 -0
- monkeybot-2.1.1/tests/core/test_tool_integrity.py +195 -0
- monkeybot-2.1.1/tests/core/test_tool_result_ingress.py +155 -0
- monkeybot-2.1.1/tests/core/test_tool_shapers.py +154 -0
- monkeybot-2.1.1/tests/core/test_transcript.py +209 -0
- monkeybot-2.1.1/tests/core/test_truncated_tool_batch.py +175 -0
- monkeybot-2.1.1/tests/core/test_usage.py +223 -0
- monkeybot-2.1.1/tests/core/test_usage_migration.py +115 -0
- monkeybot-2.1.1/tests/core/test_utterance_buffer.py +131 -0
- monkeybot-2.1.1/tests/core/test_worker_pool.py +395 -0
- monkeybot-2.1.1/tests/core/test_workspace_layout.py +62 -0
- monkeybot-2.1.1/tests/core/test_workspace_symlinks.py +50 -0
- monkeybot-2.1.1/tests/core/test_workspace_write_scope.py +97 -0
- monkeybot-2.1.1/tests/core/workspace/test_factory.py +51 -0
- monkeybot-2.1.1/tests/core/workspace/test_local_storage.py +97 -0
- monkeybot-2.1.1/tests/core/workspace/test_protocol_contract.py +45 -0
- monkeybot-2.1.1/tests/evals/__init__.py +1 -0
- monkeybot-2.1.1/tests/evals/conftest.py +97 -0
- monkeybot-2.1.1/tests/evals/eval_hook.py +43 -0
- monkeybot-2.1.1/tests/evals/scenario_runner.py +169 -0
- monkeybot-2.1.1/tests/evals/scenarios/context_curation.yaml +14 -0
- monkeybot-2.1.1/tests/evals/scenarios/memory_write_inject.yaml +12 -0
- monkeybot-2.1.1/tests/evals/scenarios/subagent_roundtrip.yaml +17 -0
- monkeybot-2.1.1/tests/evals/scenarios/tool_read.yaml +17 -0
- monkeybot-2.1.1/tests/evals/scenarios/tool_search_memory.yaml +17 -0
- monkeybot-2.1.1/tests/evals/scenarios/turn_completion.yaml +10 -0
- monkeybot-2.1.1/tests/evals/test_agent_behavior.py +39 -0
- monkeybot-2.1.1/tests/evals/test_memory_integrity.py +60 -0
- monkeybot-2.1.1/tests/gateway/__init__.py +1 -0
- monkeybot-2.1.1/tests/gateway/realtime/__init__.py +0 -0
- monkeybot-2.1.1/tests/gateway/realtime/test_app.py +29 -0
- monkeybot-2.1.1/tests/gateway/realtime/test_deps.py +15 -0
- monkeybot-2.1.1/tests/gateway/realtime/test_guardrails.py +83 -0
- monkeybot-2.1.1/tests/gateway/realtime/test_manager.py +90 -0
- monkeybot-2.1.1/tests/gateway/realtime/test_metrics.py +92 -0
- monkeybot-2.1.1/tests/gateway/realtime/test_routes_client_text.py +199 -0
- monkeybot-2.1.1/tests/gateway/realtime/test_session.py +211 -0
- monkeybot-2.1.1/tests/gateway/realtime/test_wire.py +272 -0
- monkeybot-2.1.1/tests/gateway/sse/test_attachments.py +177 -0
- monkeybot-2.1.1/tests/gateway/sse/test_create_session_model.py +284 -0
- monkeybot-2.1.1/tests/gateway/sse/test_routes.py +460 -0
- monkeybot-2.1.1/tests/gateway/sse/test_scheduler_routes.py +120 -0
- monkeybot-2.1.1/tests/gateway/sse/test_session_bus.py +111 -0
- monkeybot-2.1.1/tests/gateway/sse/test_transcript_wiring.py +150 -0
- monkeybot-2.1.1/tests/gateway/test_otel_fastapi.py +87 -0
- monkeybot-2.1.1/tests/gateway/test_otel_lifespan.py +49 -0
- monkeybot-2.1.1/tests/gateway/test_pending_response_endpoints.py +249 -0
- monkeybot-2.1.1/tests/gateway/test_realtime_main.py +15 -0
- monkeybot-2.1.1/tests/gateway/test_resolve_provider.py +69 -0
- monkeybot-2.1.1/tests/gateway/test_sse_events.py +101 -0
- monkeybot-2.1.1/tests/integration/__init__.py +1 -0
- monkeybot-2.1.1/tests/integration/test_mb_e2e_simple_reply.py +112 -0
- monkeybot-2.1.1/tests/integration/test_observability_integration.py +382 -0
- monkeybot-2.1.1/tests/integration/test_prompt_caching_integration.py +139 -0
- monkeybot-2.1.1/tests/observability/conftest.py +43 -0
- monkeybot-2.1.1/tests/observability/test_init.py +115 -0
- monkeybot-2.1.1/tests/observability/test_instrumentation.py +131 -0
- monkeybot-2.1.1/tests/observability/test_loop_hook_spans.py +74 -0
- monkeybot-2.1.1/tests/observability/test_propagation.py +89 -0
- monkeybot-2.1.1/tests/observability/test_span_contract.py +240 -0
- monkeybot-2.1.1/tests/observability/test_spans.py +186 -0
- monkeybot-2.1.1/tests/observability/test_truncate.py +27 -0
- monkeybot-2.1.1/tests/observability/test_turn_complete_trace.py +57 -0
- monkeybot-2.1.1/tests/providers/conftest.py +78 -0
- monkeybot-2.1.1/tests/providers/test_anthropic_cache.py +489 -0
- monkeybot-2.1.1/tests/providers/test_anthropic_history.py +118 -0
- monkeybot-2.1.1/tests/providers/test_bedrock_estimate.py +14 -0
- monkeybot-2.1.1/tests/providers/test_gemini_live.py +272 -0
- monkeybot-2.1.1/tests/providers/test_gemini_usage.py +253 -0
- monkeybot-2.1.1/tests/providers/test_huggingface.py +61 -0
- monkeybot-2.1.1/tests/providers/test_nvidia.py +27 -0
- monkeybot-2.1.1/tests/providers/test_ollama.py +101 -0
- monkeybot-2.1.1/tests/providers/test_openai_compat_usage.py +290 -0
- monkeybot-2.1.1/tests/providers/test_openai_history.py +135 -0
- monkeybot-2.1.1/tests/providers/test_pricing.py +56 -0
- monkeybot-2.1.1/tests/providers/test_safe_parse_tool_args.py +61 -0
- monkeybot-2.1.1/tests/providers/test_sampling.py +136 -0
- monkeybot-2.1.1/tests/providers/test_source_grep_gates.py +66 -0
- monkeybot-2.1.1/tests/providers/test_vertex_claude_history.py +37 -0
- monkeybot-2.1.1/tests/scheduler/test_engine.py +162 -0
- monkeybot-2.1.1/tests/scheduler/test_interval.py +29 -0
- monkeybot-2.1.1/tests/skills/__init__.py +1 -0
- monkeybot-2.1.1/tests/skills/test_generate_image_script.py +208 -0
- monkeybot-2.1.1/tests/test_cold_start.py +74 -0
- monkeybot-2.1.1/tests/test_packaging_config.py +68 -0
- monkeybot-2.1.1/tests/test_release_script.py +41 -0
- monkeybot-2.1.1/tests/web_search/__init__.py +0 -0
- monkeybot-2.1.1/tests/web_search/test_web_search.py +305 -0
- monkeybot-2.1.1/uv.lock +4381 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
.git
|
|
2
|
+
.github
|
|
3
|
+
**/.venv
|
|
4
|
+
**/node_modules
|
|
5
|
+
**/__pycache__
|
|
6
|
+
**/*.py[cod]
|
|
7
|
+
**/.pytest_cache
|
|
8
|
+
**/.mypy_cache
|
|
9
|
+
**/.ruff_cache
|
|
10
|
+
demo_agent/.emonk
|
|
11
|
+
demo_agent/workspace/data/*.db
|
|
12
|
+
demo_agent/workspace/data/*.db-*
|
|
13
|
+
**/.env
|
|
14
|
+
**/*.db-shm
|
|
15
|
+
**/*.db-wal
|
|
16
|
+
legacy
|
|
17
|
+
tests
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, master, develop]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
python:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
|
|
14
|
+
- name: Install ripgrep and GitHub CLI
|
|
15
|
+
run: sudo apt-get update && sudo apt-get install -y ripgrep gh
|
|
16
|
+
|
|
17
|
+
- uses: astral-sh/setup-uv@v5
|
|
18
|
+
with:
|
|
19
|
+
version: "latest"
|
|
20
|
+
|
|
21
|
+
- name: Sync dependencies
|
|
22
|
+
run: uv sync --extra claude --extra vertex-claude --extra bedrock
|
|
23
|
+
|
|
24
|
+
- name: Mypy
|
|
25
|
+
run: uv run mypy src/monkeybot
|
|
26
|
+
|
|
27
|
+
- name: Pytest
|
|
28
|
+
run: uv run pytest tests/ -q
|
|
29
|
+
|
|
30
|
+
- name: CLI pytest
|
|
31
|
+
working-directory: cli
|
|
32
|
+
run: |
|
|
33
|
+
uv sync
|
|
34
|
+
uv run pytest -q
|
|
35
|
+
|
|
36
|
+
- name: Browser MCP pytest
|
|
37
|
+
working-directory: integrations/browser-mcp
|
|
38
|
+
run: |
|
|
39
|
+
uv sync --dev
|
|
40
|
+
uv run pytest -q
|
|
41
|
+
|
|
42
|
+
- name: Evals self-checks (no live agent, no model calls)
|
|
43
|
+
run: |
|
|
44
|
+
uv sync --extra evals
|
|
45
|
+
uv run python evals/test_assertions.py
|
|
46
|
+
uv run python evals/test_report.py
|
|
47
|
+
uv run python evals/test_runner_sse.py
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
name: Live eval smoke
|
|
2
|
+
|
|
3
|
+
# Runs the live eval smoke suite (see docs/eval-pr-scorecard.md) and posts a Markdown
|
|
4
|
+
# scorecard as a PR comment. Only two trigger points, gated in the `gate` job below —
|
|
5
|
+
# LLM-judge calls cost money and take minutes, so this does not run on ordinary
|
|
6
|
+
# feature-branch -> develop PRs:
|
|
7
|
+
# (a) any PR from develop into main (release-promotion gate)
|
|
8
|
+
# (b) any PR that touches a dependency lockfile (catches silent SDK breakage,
|
|
9
|
+
# e.g. provider request/response shape changes, that code review won't see)
|
|
10
|
+
#
|
|
11
|
+
# Cost/time budget: smoke suite is ~7 scenarios x 2-5 turns x (agent call + judge call).
|
|
12
|
+
# Expect roughly $0.50-2.00 and 5-10 minutes per run depending on model pricing.
|
|
13
|
+
#
|
|
14
|
+
# Secrets required: NVIDIA_API_KEY (agent model, matches demo_agent's default free-tier
|
|
15
|
+
# provider) and OPENAI_API_KEY (deepeval judge model — JUDGE_PROVIDER/JUDGE_MODEL below
|
|
16
|
+
# pin it explicitly so scoring doesn't silently drift with deepeval's own default).
|
|
17
|
+
|
|
18
|
+
on:
|
|
19
|
+
pull_request:
|
|
20
|
+
|
|
21
|
+
permissions:
|
|
22
|
+
contents: read
|
|
23
|
+
pull-requests: write
|
|
24
|
+
|
|
25
|
+
jobs:
|
|
26
|
+
gate:
|
|
27
|
+
runs-on: ubuntu-latest
|
|
28
|
+
outputs:
|
|
29
|
+
run: ${{ steps.decide.outputs.run }}
|
|
30
|
+
steps:
|
|
31
|
+
- uses: actions/checkout@v4
|
|
32
|
+
with:
|
|
33
|
+
fetch-depth: 0
|
|
34
|
+
|
|
35
|
+
- id: decide
|
|
36
|
+
env:
|
|
37
|
+
BASE_REF: ${{ github.base_ref }}
|
|
38
|
+
HEAD_REF: ${{ github.head_ref }}
|
|
39
|
+
BASE_SHA: ${{ github.event.pull_request.base.sha }}
|
|
40
|
+
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
|
41
|
+
run: |
|
|
42
|
+
run=false
|
|
43
|
+
if [[ "$BASE_REF" == "main" && "$HEAD_REF" == "develop" ]]; then
|
|
44
|
+
run=true
|
|
45
|
+
fi
|
|
46
|
+
changed="$(git diff --name-only "$BASE_SHA" "$HEAD_SHA")"
|
|
47
|
+
for f in uv.lock cli/uv.lock demo_agent/uv.lock; do
|
|
48
|
+
if grep -qxF "$f" <<<"$changed"; then
|
|
49
|
+
run=true
|
|
50
|
+
fi
|
|
51
|
+
done
|
|
52
|
+
echo "run=$run" >> "$GITHUB_OUTPUT"
|
|
53
|
+
|
|
54
|
+
secrets:
|
|
55
|
+
needs: gate
|
|
56
|
+
if: needs.gate.outputs.run == 'true'
|
|
57
|
+
runs-on: ubuntu-latest
|
|
58
|
+
steps:
|
|
59
|
+
- name: Require live-eval secrets
|
|
60
|
+
env:
|
|
61
|
+
NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
|
|
62
|
+
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
|
63
|
+
run: |
|
|
64
|
+
missing=()
|
|
65
|
+
[[ -z "$NVIDIA_API_KEY" ]] && missing+=("NVIDIA_API_KEY (agent model, https://build.nvidia.com)")
|
|
66
|
+
[[ -z "$OPENAI_API_KEY" ]] && missing+=("OPENAI_API_KEY (deepeval judge model)")
|
|
67
|
+
if [[ ${#missing[@]} -gt 0 ]]; then
|
|
68
|
+
echo "::error::Live eval smoke requires repository secrets that are not configured:"
|
|
69
|
+
for m in "${missing[@]}"; do echo "::error:: - $m"; done
|
|
70
|
+
exit 1
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
live-eval:
|
|
74
|
+
needs: [gate, secrets]
|
|
75
|
+
if: needs.gate.outputs.run == 'true'
|
|
76
|
+
runs-on: ubuntu-latest
|
|
77
|
+
timeout-minutes: 30
|
|
78
|
+
steps:
|
|
79
|
+
- uses: actions/checkout@v4
|
|
80
|
+
|
|
81
|
+
- uses: astral-sh/setup-uv@v5
|
|
82
|
+
with:
|
|
83
|
+
version: "latest"
|
|
84
|
+
|
|
85
|
+
- name: Sync root deps (evals/report.py needs deepeval, langfuse)
|
|
86
|
+
run: uv sync --extra evals
|
|
87
|
+
|
|
88
|
+
- name: Sync demo_agent deps
|
|
89
|
+
working-directory: demo_agent
|
|
90
|
+
run: uv sync
|
|
91
|
+
|
|
92
|
+
- name: Boot monkeybot gateway (demo_agent workspace)
|
|
93
|
+
working-directory: demo_agent
|
|
94
|
+
env:
|
|
95
|
+
NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
|
|
96
|
+
SANDBOX_ENABLED: "false" # no Docker socket in this runner
|
|
97
|
+
# Small context window so context/summarization_trigger.yaml actually crosses the
|
|
98
|
+
# real summarization threshold; the other smoke scenarios are short enough to fit.
|
|
99
|
+
MODEL_CONTEXT_WINDOW: "8000"
|
|
100
|
+
run: |
|
|
101
|
+
uv run -m monkeybot.gateway.main > /tmp/gateway.log 2>&1 &
|
|
102
|
+
echo $! > /tmp/gateway.pid
|
|
103
|
+
for i in $(seq 1 30); do
|
|
104
|
+
if curl -sf http://127.0.0.1:8787/health > /dev/null; then
|
|
105
|
+
echo "gateway healthy"
|
|
106
|
+
exit 0
|
|
107
|
+
fi
|
|
108
|
+
sleep 2
|
|
109
|
+
done
|
|
110
|
+
echo "gateway did not become healthy" >&2
|
|
111
|
+
cat /tmp/gateway.log >&2
|
|
112
|
+
exit 1
|
|
113
|
+
|
|
114
|
+
- name: Run smoke suite report
|
|
115
|
+
env:
|
|
116
|
+
AGENT_URL: http://127.0.0.1:8787
|
|
117
|
+
JUDGE_PROVIDER: openai
|
|
118
|
+
JUDGE_MODEL: gpt-4o-mini
|
|
119
|
+
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
|
120
|
+
run: |
|
|
121
|
+
uv run python -m evals.report \
|
|
122
|
+
--suite smoke \
|
|
123
|
+
--baseline evals/baselines/smoke.json \
|
|
124
|
+
--fail-on-regression \
|
|
125
|
+
| tee eval-report.md
|
|
126
|
+
|
|
127
|
+
- name: Post report as PR comment
|
|
128
|
+
if: always()
|
|
129
|
+
uses: actions/github-script@v7
|
|
130
|
+
with:
|
|
131
|
+
script: |
|
|
132
|
+
const fs = require("fs");
|
|
133
|
+
const body = fs.existsSync("eval-report.md")
|
|
134
|
+
? fs.readFileSync("eval-report.md", "utf8")
|
|
135
|
+
: "## monkeybot Eval Scorecard\n\n`FAIL` — the report step did not complete " +
|
|
136
|
+
"(gateway boot or the report command itself errored before writing a report). " +
|
|
137
|
+
"See the workflow run logs for details.";
|
|
138
|
+
await github.rest.issues.createComment({
|
|
139
|
+
issue_number: context.issue.number,
|
|
140
|
+
owner: context.repo.owner,
|
|
141
|
+
repo: context.repo.repo,
|
|
142
|
+
body,
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
- name: Upload run + report artifacts
|
|
146
|
+
if: always()
|
|
147
|
+
uses: actions/upload-artifact@v4
|
|
148
|
+
with:
|
|
149
|
+
name: live-eval-smoke-${{ github.run_id }}
|
|
150
|
+
path: |
|
|
151
|
+
evals/runs/
|
|
152
|
+
eval-report.md
|
|
153
|
+
if-no-files-found: ignore
|
|
154
|
+
|
|
155
|
+
- name: Stop gateway
|
|
156
|
+
if: always()
|
|
157
|
+
working-directory: demo_agent
|
|
158
|
+
run: kill "$(cat /tmp/gateway.pid)" 2>/dev/null || true
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
name: Prepare release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
package:
|
|
7
|
+
description: "Which package to release"
|
|
8
|
+
required: true
|
|
9
|
+
type: choice
|
|
10
|
+
options: [core, cli]
|
|
11
|
+
bump:
|
|
12
|
+
description: "Version bump"
|
|
13
|
+
required: true
|
|
14
|
+
type: choice
|
|
15
|
+
options: [patch, minor, major]
|
|
16
|
+
|
|
17
|
+
permissions:
|
|
18
|
+
contents: write
|
|
19
|
+
pull-requests: write
|
|
20
|
+
|
|
21
|
+
jobs:
|
|
22
|
+
prepare:
|
|
23
|
+
runs-on: ubuntu-latest
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@v4
|
|
26
|
+
with:
|
|
27
|
+
ref: develop
|
|
28
|
+
|
|
29
|
+
- name: Configure git identity
|
|
30
|
+
run: |
|
|
31
|
+
git config user.name "github-actions[bot]"
|
|
32
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
33
|
+
|
|
34
|
+
- run: python3 scripts/release.py prepare ${{ inputs.package }} ${{ inputs.bump }}
|
|
35
|
+
env:
|
|
36
|
+
GH_TOKEN: ${{ github.token }}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
name: Publish release
|
|
2
|
+
|
|
3
|
+
# Fires whenever main moves - i.e. right after an admin merges a release PR.
|
|
4
|
+
# Branch protection on main (require PR + restrict merges to admins) is the
|
|
5
|
+
# actual access control; this tags + GitHub-Releases + Trusted-Publishes to PyPI.
|
|
6
|
+
#
|
|
7
|
+
# PyPI Pending Trusted Publishers (one per project — environments must differ):
|
|
8
|
+
# monkeybot: Owner human-plus-machine / Repo monkeybot /
|
|
9
|
+
# Workflow publish-release.yml / Environment pypi
|
|
10
|
+
# monkeybot-cli: Owner human-plus-machine / Repo monkeybot /
|
|
11
|
+
# Workflow publish-release.yml / Environment pypi-cli
|
|
12
|
+
#
|
|
13
|
+
# GitHub: create Environments named exactly `pypi` and `pypi-cli`.
|
|
14
|
+
on:
|
|
15
|
+
push:
|
|
16
|
+
branches: [main]
|
|
17
|
+
paths:
|
|
18
|
+
- "pyproject.toml"
|
|
19
|
+
- "cli/pyproject.toml"
|
|
20
|
+
- "CHANGELOG.md"
|
|
21
|
+
|
|
22
|
+
permissions:
|
|
23
|
+
contents: write
|
|
24
|
+
|
|
25
|
+
jobs:
|
|
26
|
+
publish:
|
|
27
|
+
runs-on: ubuntu-latest
|
|
28
|
+
outputs:
|
|
29
|
+
packages: ${{ steps.release.outputs.packages }}
|
|
30
|
+
steps:
|
|
31
|
+
- uses: actions/checkout@v4
|
|
32
|
+
with:
|
|
33
|
+
fetch-depth: 0
|
|
34
|
+
|
|
35
|
+
- name: Configure git identity
|
|
36
|
+
run: |
|
|
37
|
+
git config user.name "github-actions[bot]"
|
|
38
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
39
|
+
|
|
40
|
+
- id: release
|
|
41
|
+
run: python3 scripts/release.py publish
|
|
42
|
+
env:
|
|
43
|
+
GH_TOKEN: ${{ github.token }}
|
|
44
|
+
|
|
45
|
+
# Core before CLI (separate jobs / environments — required for two pending publishers).
|
|
46
|
+
pypi-core:
|
|
47
|
+
needs: publish
|
|
48
|
+
if: contains(format(',{0},', needs.publish.outputs.packages), ',core,')
|
|
49
|
+
runs-on: ubuntu-latest
|
|
50
|
+
environment:
|
|
51
|
+
name: pypi
|
|
52
|
+
url: https://pypi.org/p/monkeybot
|
|
53
|
+
permissions:
|
|
54
|
+
id-token: write
|
|
55
|
+
contents: read
|
|
56
|
+
steps:
|
|
57
|
+
- uses: actions/checkout@v4
|
|
58
|
+
- uses: astral-sh/setup-uv@v5
|
|
59
|
+
- uses: actions/setup-python@v5
|
|
60
|
+
with:
|
|
61
|
+
python-version: "3.12"
|
|
62
|
+
- name: Build core
|
|
63
|
+
run: uv build --out-dir dist/core .
|
|
64
|
+
- name: Publish core to PyPI
|
|
65
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
66
|
+
with:
|
|
67
|
+
packages-dir: dist/core
|
|
68
|
+
skip-existing: true
|
|
69
|
+
|
|
70
|
+
pypi-cli:
|
|
71
|
+
needs: [publish, pypi-core]
|
|
72
|
+
# Run when cli is in the release set. If core wasn't released this run,
|
|
73
|
+
# pypi-core is skipped — treat that as success so cli can still publish.
|
|
74
|
+
if: |
|
|
75
|
+
always() &&
|
|
76
|
+
needs.publish.result == 'success' &&
|
|
77
|
+
contains(format(',{0},', needs.publish.outputs.packages), ',cli,') &&
|
|
78
|
+
(needs.pypi-core.result == 'success' || needs.pypi-core.result == 'skipped')
|
|
79
|
+
runs-on: ubuntu-latest
|
|
80
|
+
environment:
|
|
81
|
+
name: pypi-cli
|
|
82
|
+
url: https://pypi.org/p/monkeybot-cli
|
|
83
|
+
permissions:
|
|
84
|
+
id-token: write
|
|
85
|
+
contents: read
|
|
86
|
+
steps:
|
|
87
|
+
- uses: actions/checkout@v4
|
|
88
|
+
- uses: astral-sh/setup-uv@v5
|
|
89
|
+
- uses: actions/setup-python@v5
|
|
90
|
+
with:
|
|
91
|
+
python-version: "3.12"
|
|
92
|
+
- name: Build cli
|
|
93
|
+
run: uv build --out-dir dist/cli cli
|
|
94
|
+
- name: Publish cli to PyPI
|
|
95
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
96
|
+
with:
|
|
97
|
+
packages-dir: dist/cli
|
|
98
|
+
skip-existing: true
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Internal (not shipped in OSS)
|
|
2
|
+
internal/
|
|
3
|
+
|
|
4
|
+
# Environment
|
|
5
|
+
.env
|
|
6
|
+
.env.*
|
|
7
|
+
!.env.example
|
|
8
|
+
|
|
9
|
+
# Local scaffolded harness config (defaults ship in monkeybot-cli scaffold_defaults/)
|
|
10
|
+
/monkeybot_config/
|
|
11
|
+
|
|
12
|
+
# Demo agent live config (materialized from monkeybot_config_example/ by demo_agent/run.sh)
|
|
13
|
+
demo_agent/monkeybot_config/
|
|
14
|
+
|
|
15
|
+
# Live eval run artifacts (only evals/baselines/ is versioned)
|
|
16
|
+
/evals/runs/
|
|
17
|
+
|
|
18
|
+
# Python
|
|
19
|
+
__pycache__/
|
|
20
|
+
*.py[cod]
|
|
21
|
+
*.pyo
|
|
22
|
+
*.pyd
|
|
23
|
+
.Python
|
|
24
|
+
*.egg-info/
|
|
25
|
+
dist/
|
|
26
|
+
build/
|
|
27
|
+
.eggs/
|
|
28
|
+
*.egg
|
|
29
|
+
|
|
30
|
+
# uv
|
|
31
|
+
.venv/
|
|
32
|
+
.uv/
|
|
33
|
+
|
|
34
|
+
# Data (SQLite DB + memory files — never commit)
|
|
35
|
+
data/
|
|
36
|
+
|
|
37
|
+
# Testing & coverage
|
|
38
|
+
.pytest_cache/
|
|
39
|
+
.coverage
|
|
40
|
+
htmlcov/
|
|
41
|
+
.mypy_cache/
|
|
42
|
+
.ruff_cache/
|
|
43
|
+
|
|
44
|
+
# macOS
|
|
45
|
+
.DS_Store
|
|
46
|
+
|
|
47
|
+
# IDEs
|
|
48
|
+
.idea/
|
|
49
|
+
.vscode/
|
|
50
|
+
*.swp
|
|
51
|
+
*.swo
|
|
52
|
+
|
|
53
|
+
# Docker
|
|
54
|
+
docker/data/
|
|
55
|
+
|
|
56
|
+
# Planning Documents
|
|
57
|
+
.prt/
|
|
58
|
+
.monkeymode/
|
|
59
|
+
|
|
60
|
+
# Reference clones (read-only)
|
|
61
|
+
code/
|
|
62
|
+
|
|
63
|
+
# Local venv for evals dependency experiments
|
|
64
|
+
.evals-venv/
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Pre-commit hooks for monkeybot
|
|
2
|
+
# Install: uv run pre-commit install
|
|
3
|
+
# Run manually: uv run pre-commit run --all-files
|
|
4
|
+
|
|
5
|
+
repos:
|
|
6
|
+
- repo: local
|
|
7
|
+
hooks:
|
|
8
|
+
- id: mypy
|
|
9
|
+
name: mypy (src/monkeybot)
|
|
10
|
+
entry: uv run mypy src/monkeybot
|
|
11
|
+
language: system
|
|
12
|
+
pass_filenames: false
|
|
13
|
+
always_run: true
|
|
14
|
+
|
|
15
|
+
- id: pytest
|
|
16
|
+
name: pytest (changed tests or collection check)
|
|
17
|
+
entry: bash scripts/precommit-pytest.sh
|
|
18
|
+
language: system
|
|
19
|
+
files: ^(src/monkeybot|tests)/.*\.py$
|
|
20
|
+
pass_filenames: true
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
## Cursor Cloud specific instructions
|
|
4
|
+
|
|
5
|
+
monkeybot is a Python 3.11+ framework (managed with `uv`) whose product is the **FastAPI SSE gateway** (`python -m monkeybot.gateway.main`). Satellite sub-projects each have their own `pyproject.toml`/`uv.lock`/`.venv` and depend on the core via an editable path: `cli/` (the `monkeybot` CLI, recommended entrypoint), `integrations/browser-mcp/` (MCP server), and `evals/` (standalone eval service). Standard install/lint/test/build commands are documented in `README.md`, `docs/getting-started.md`, and `.github/workflows/ci.yml` (the authoritative CI recipe) — refer to those rather than duplicating them.
|
|
6
|
+
|
|
7
|
+
The startup update script already runs `uv sync` for the root (with the CI extras plus `evals` and `web-search`) and for `cli/` and `integrations/browser-mcp/`, so dependencies are ready. `uv` installs to `~/.local/bin`; if `uv` is not found, add that to `PATH`.
|
|
8
|
+
|
|
9
|
+
Non-obvious gotchas discovered during setup:
|
|
10
|
+
|
|
11
|
+
- **Run the gateway with no cloud credentials via `MODEL_PROVIDER=fake`.** It injects a deterministic scripted provider (default reply `hello`), exercising the full session → SSE → agent-loop → SQLite path without any API keys. Real providers (`gemini`, `openai`, `anthropic`, …) need keys/ADC in a repo-root `.env`.
|
|
12
|
+
- **Running the gateway requires scaffolded config** at the process cwd: `cd cli && uv run monkeybot new --dest .. --yes` creates `monkeybot_config/`, `workspace/`, and `data/` at the repo root (all gitignored except the stray `.env.example`/`scripts/setup-workspace.sh` — do not commit those). Do NOT put scaffolding in the update script.
|
|
13
|
+
- **The root pytest suite must NOT be run with the scaffold present.** A scaffolded `monkeybot_config/` + `workspace/` at the repo root makes 2 workspace-resolution tests fail (`tests/gateway/sse/test_routes.py::test_workspace_tree_and_file` and `tests/skills/test_generate_image_script.py::test_generate_image_script_success_mocked_vertex`); both pass in isolation. CI passes because it runs from a fresh checkout with no scaffold. Before `uv run pytest tests/ -q`, run tests in a clean tree (move `monkeybot_config/`, `workspace/`, `data/` aside, or use a checkout that was never scaffolded).
|
|
14
|
+
- **`ruff` is not enforced by CI** and currently reports pre-existing failures across `src/` and `tests/`. CI gates only `mypy src/monkeybot` + pytest (root, `cli/`, `integrations/browser-mcp/`) + the three `evals/test_*.py` standalone self-check scripts. Do not treat existing `ruff check .` failures as regressions.
|
|
15
|
+
- **`monkeybot doctor` reporting port 8080 "in use" or "no provider credentials" is expected** when the gateway is already running and/or you are using the `fake` provider — it is not a setup failure.
|
|
16
|
+
|
|
17
|
+
## Git workflow
|
|
18
|
+
|
|
19
|
+
Always sync with the remote **before** writing code — do not assume the local checkout is current.
|
|
20
|
+
|
|
21
|
+
**Starting a new feature:**
|
|
22
|
+
|
|
23
|
+
1. `git fetch origin develop && git checkout develop && git pull origin develop`
|
|
24
|
+
2. Create the feature branch from that fresh tip: `git checkout -b cursor/<descriptive-name>-<suffix>`
|
|
25
|
+
|
|
26
|
+
**Continuing an existing feature branch:**
|
|
27
|
+
|
|
28
|
+
1. `git fetch origin <branch-name> && git checkout <branch-name> && git pull origin <branch-name>`
|
|
29
|
+
|
|
30
|
+
**When the base branch (`develop`) has moved** and you need those changes on your feature branch:
|
|
31
|
+
|
|
32
|
+
- `git fetch origin develop` then `git merge origin/develop` (or `git rebase origin/develop` if that is the project convention)
|
|
33
|
+
|
|
34
|
+
Check `git status` and `git branch -a` first when the environment starts on a detached `HEAD` or an unfamiliar checkout.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# monkeybot Backlog
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Up Next — Major Priorities
|
|
6
|
+
|
|
7
|
+
### 1. Chat Integration
|
|
8
|
+
- **Google Chat gateway** — incoming webhook + event handler for Google Chat spaces.
|
|
9
|
+
- **Slack gateway** — Slack Events API / socket mode integration.
|
|
10
|
+
|
|
11
|
+
### 2. Evals *(in progress)*
|
|
12
|
+
- Integrate eval framework (langfuse, deepeval, or similar) into the harness — not just playground-level; needs to be first-class traceability in the agent loop.
|
|
13
|
+
- **Memory accuracy verification** — script exists (`scripts/verify_memory.py`) but needs a real eval strategy, not a one-off script.
|
|
14
|
+
|
|
15
|
+
### 3. Scheduler
|
|
16
|
+
- Wire a `Scheduler` into the FastAPI lifespan as an optional background task when `config.yaml` has `scheduler.jobs` (reference: `legacy/src/monkeybot/core/scheduler.py`).
|
|
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
|
+
|
|
19
|
+
### 4. Sandbox Workspace Protection
|
|
20
|
+
- Add a hard-coded deny layer inside `SandboxExecutor` that blocks `run_command` from targeting harness-owned paths: `.monkeybot/`, `monkeybot.yaml`, `*.env`, `.agents/`, `config/`.
|
|
21
|
+
- Path-level policy at the executor — distinct from `command_allowlist.yaml` which is command-level. Agent should retain free rw access to `./code/`, `./data/`, etc.
|
|
22
|
+
|
|
23
|
+
### 5. HITL Completion
|
|
24
|
+
- The loop and `/tool-confirmations` API endpoint exist; inspectors have `confirm` as a valid `Decision.kind` but no inspector currently returns it ("Story 5" placeholder).
|
|
25
|
+
- Wire an inspector that returns `confirm` for configurable tool patterns, flowing through the existing `_await_user_response` path.
|
|
26
|
+
|
|
27
|
+
### 6. DurableRunStore Wiring (crash recovery) — DONE
|
|
28
|
+
- Subagent runs are persisted via `CoreToolExecutor` (`record_started` / `record_completed` / `record_failed`).
|
|
29
|
+
- Queue mode: set `MONKEYBOT_TASK_QUEUE=1` to enqueue with `record_pending` instead of inline spawn.
|
|
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
|
+
|
|
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). `demo_agent/run.sh` currently does this orchestration via bash (build/start/health-check/cleanup), which means the CLI alone 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 (matching `run.sh` behavior, retiring the bash script), or just validate/warn with remediation hints while the user manages Docker manually?
|
|
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
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Do Later
|
|
40
|
+
|
|
41
|
+
### Connectors
|
|
42
|
+
- **CLI gateway** — interactive stdin/stdout (reference: `legacy/src/monkeybot/gateway/cli.py`).
|
|
43
|
+
- **Webhook gateway** — generic HTTP + HMAC (reference: `legacy/src/monkeybot/gateway/webhook.py`).
|
|
44
|
+
- **`python -m monkeybot` CLI** — `run` / `serve` / `usage` / `schedule` subcommands (reference: `legacy/src/monkeybot/cli.py`).
|
|
45
|
+
|
|
46
|
+
### Cloud Deployments
|
|
47
|
+
- **GCP server** — GCE / GKE deployment option (docs + examples exist; no IaC).
|
|
48
|
+
- **AWS serverless** — Lambda + API Gateway (example handler exists; not a full deploy path).
|
|
49
|
+
- **AWS server** — EC2 / ECS deployment option.
|
|
50
|
+
- **Docker CI image matrix** — multi-extras build matrix in CI.
|
|
51
|
+
|
|
52
|
+
### Infra
|
|
53
|
+
- **Postgres as production default** — backend exists; gateway still defaults to SQLite; decide when/if this becomes the default.
|
|
54
|
+
|
|
55
|
+
### Memory
|
|
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
|
+
|
|
58
|
+
### MCP
|
|
59
|
+
- **MCP distro linkage** — confirm `monkeybot_config_example/monkeybot.example.yaml` paths (`paths.mcp_config`, `paths.skills_path`) match deployment; smoke-test against real MCP servers beyond the bundled LangChain docs URL.
|
|
60
|
+
|
|
61
|
+
### Future platforms *(not scheduled)*
|
|
62
|
+
|
|
63
|
+
Moved from README — longer-term / speculative integrations without active implementation:
|
|
64
|
+
|
|
65
|
+
- **Azure OpenAI** — Azure-hosted OpenAI models
|
|
66
|
+
- **Azure Blob Storage** — memory backend (`[azure]` extra; docs note as planned)
|
|
67
|
+
- **Azure Key Vault** — secrets for Azure deployments
|
|
68
|
+
- **AWS Secrets Manager** — secret resolver at runtime
|
|
69
|
+
- **GCP Secret Manager** — finish `secrets.provider: gcp_secret_manager` wiring (schema exists; resolver not shipped)
|
|
70
|
+
- **Microsoft Teams** — Teams bot interface
|
|
71
|
+
- **Telegram** — Telegram bot interface
|
|
72
|
+
- **DynamoDB** — checkpointer / job storage backend
|
|
73
|
+
- **Cosmos DB** — Azure-native persistence options
|
|
74
|
+
|
|
75
|
+
### Tooling
|
|
76
|
+
- **File-op tool audit** — evaluate removing `write_file` in favor of `create_file` + `find_and_replace` in `core_tool_executor.py` and `workspace_tools.py` (reference: Claude Code patterns).
|
|
77
|
+
- **Custom subagents** — allow operators to pre-configure named subagent profiles (own AGENT.md, restricted skill set, specific MCP servers) in `core_tool_executor.py`, `subagent_proto.py`, and `subagent_worker.py`.
|