monkeybot 3.0.4__tar.gz → 3.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {monkeybot-3.0.4 → monkeybot-3.1.0}/.github/workflows/live-eval-smoke.yml +5 -10
- {monkeybot-3.0.4 → monkeybot-3.1.0}/CHANGELOG.md +57 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/PKG-INFO +1 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/pyproject.toml +3 -3
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/skills/monkeybot/SKILL.md +3 -3
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/skills/monkeybot/references/config-sections.md +8 -20
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/chat_session.py +3 -3
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/chat_tui.py +5 -5
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/commands/chat.py +2 -3
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/commands/doctor.py +153 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/commands/validate.py +2 -13
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/realtime/talk_ui.py +0 -1
- monkeybot-3.1.0/cli/src/monkeybot_cli/scaffold_defaults/browser/SKILL.md +41 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/scaffold_defaults/monkeybot.example.yaml +14 -8
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_chat_e2e.py +5 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_chat_session.py +2 -2
- monkeybot-3.1.0/cli/tests/test_doctor.py +217 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_gateway_health.py +2 -2
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/uv.lock +11 -3
- monkeybot-3.1.0/docker/demo-model.yaml +5 -0
- monkeybot-3.1.0/docker/demo.yaml +4 -0
- monkeybot-3.1.0/docker-compose.yml +14 -0
- monkeybot-3.1.0/docs/browser-mcp-perf-baseline.md +363 -0
- monkeybot-3.1.0/docs/browser-mcp-performance-plan.md +17 -0
- monkeybot-3.1.0/docs/browser-mcp.md +288 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/deploy-aws-agentcore.md +8 -4
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/deploy-pattern-c-agent-platform.md +2 -2
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/deploy-pattern-d-realtime.md +6 -8
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/features.md +37 -56
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/getting-started.md +1 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/live-evals.md +1 -2
- monkeybot-3.1.0/docs/ollama-local.md +49 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/spill-dynamic-design.md +3 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/sse-gateway-ui.md +1 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/TEST_COVERAGE.md +1 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/scenarios/context/summarization_trigger.yaml +1 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/scorer.py +1 -7
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/smoke_agent/monkeybot_config/monkeybot.yaml +1 -9
- monkeybot-3.1.0/evals/smoke_agent/skills/browser/SKILL.md +15 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/examples/README.md +7 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/examples/lambda/handler.py +1 -1
- monkeybot-3.1.0/examples/ollama/PrefixStable.Modelfile +49 -0
- monkeybot-3.1.0/examples/skills/browser/SKILL.md +88 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/examples/skills/diagnostics/README.md +0 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/examples/skills/diagnostics/SKILL.md +1 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/examples/skills/diagnostics/diagnostics.py +0 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/integrations/browser-mcp/pyproject.toml +3 -1
- monkeybot-3.1.0/integrations/browser-mcp/scripts/dump_tool_surface.py +25 -0
- monkeybot-3.1.0/integrations/browser-mcp/scripts/perf_bench.py +304 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/actions.py +645 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/app.py +141 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/assets/pa_driver.js +935 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/backend.py +158 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/dom_indexing.py +616 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/in_app_cdp.py +197 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/login.py +141 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/observe.py +441 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/perf.py +143 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/playbooks.py +321 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/integrations/browser-mcp/src/browser_mcp/playwright_helpers.py +93 -19
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/results.py +36 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/screenshots.py +203 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/server.py +82 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/tab_ops.py +168 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/tabs.py +604 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/tools/__init__.py +75 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/tools/batch.py +62 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/tools/capture.py +81 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/tools/interact.py +309 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/tools/navigate.py +61 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/tools/playbook.py +126 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/tools/read.py +169 -0
- monkeybot-3.1.0/integrations/browser-mcp/src/browser_mcp/tools/tab_control.py +229 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/fixtures/api.json +1 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/fixtures/article.html +32 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/fixtures/cards.html +25 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/fixtures/form.html +87 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/fixtures/long_list.html +55 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/fixtures/spa.html +35 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/fixtures/tool_surface.json +1185 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/integration/conftest.py +143 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/integration/test_act_observe.py +53 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/integration/test_driver_persist.py +54 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/integration/test_intent_tools.py +134 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/integration/test_multi_tab.py +169 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/integration/test_observation.py +97 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/integration/test_run_playbook.py +59 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/integration/test_wait_for.py +57 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/test_act.py +200 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/integrations/browser-mcp/tests/test_agentcore.py +46 -41
- monkeybot-3.1.0/integrations/browser-mcp/tests/test_dom_indexing.py +421 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/test_fill_form.py +116 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/test_in_app_cdp.py +791 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/test_indexed_tools.py +326 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/test_observe.py +162 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/test_observe_after.py +332 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/test_perf.py +230 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/test_playbook_flows.py +245 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/integrations/browser-mcp/tests/test_playwright_helpers.py +93 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/integrations/browser-mcp/tests/test_screenshots.py +57 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/integrations/browser-mcp/tests/test_server_shutdown.py +15 -15
- monkeybot-3.1.0/integrations/browser-mcp/tests/test_tabs.py +352 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/test_tool_surface.py +17 -0
- monkeybot-3.1.0/integrations/browser-mcp/tests/test_wait_tools.py +118 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/integrations/browser-mcp/uv.lock +60 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/pyproject.toml +1 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/computer/__init__.py +8 -6
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/__init__.py +1 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/bootstrap.py +9 -12
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/config/__init__.py +28 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/config/realtime_config.py +83 -20
- monkeybot-3.1.0/src/monkeybot/core/config/runtime_env.py +519 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/config/settings.py +182 -38
- monkeybot-3.1.0/src/monkeybot/core/config/snapshot.py +979 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/config/validation.py +35 -16
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/context/__init__.py +64 -53
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/context/tool_output_policy.py +19 -5
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/layout.py +3 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/llm/provider.py +3 -3
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/mcp/mcp_client.py +254 -79
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/mcp/ports_mcp.py +35 -4
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/memory/config.py +2 -3
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/memory/palace.py +4 -2
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/memory/subsystem.py +4 -2
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/persistence/backends.py +1 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/persistence/firestore_scheduled_loops.py +158 -79
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/persistence/postgres.py +25 -15
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/persistence/scheduled_loops.py +49 -12
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/persistence/sqlite.py +4 -3
- monkeybot-3.1.0/src/monkeybot/core/persistence/transcript.py +736 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/prompts/harness_prompt.py +29 -9
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/prompts/prompt.py +5 -11
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/runtime/events.py +99 -3
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/runtime/history_compaction.py +15 -3
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/runtime/loop.py +2 -2
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/runtime/loop_messages.py +2 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/runtime/loop_usage.py +12 -9
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/runtime/realtime_loop.py +12 -29
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/runtime/tool_batch.py +6 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/runtime/tool_dispatch.py +137 -32
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/runtime/turn_loop.py +48 -4
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/subagents/subagent_proto.py +2 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/subagents/subagent_worker.py +28 -18
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/subagents/worker_pool.py +14 -73
- monkeybot-3.1.0/src/monkeybot/core/subprocess_groups.py +161 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/tools/core_tool_executor.py +40 -26
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/tools/sandbox_executor.py +20 -17
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/tools/terminal.py +9 -39
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/main.py +5 -6
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/realtime/app.py +18 -35
- monkeybot-3.1.0/src/monkeybot/gateway/realtime/deps.py +132 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/realtime/routes.py +213 -146
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/realtime_main.py +5 -6
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/sse/app.py +472 -125
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/sse/models.py +2 -2
- monkeybot-3.1.0/src/monkeybot/gateway/sse/reload.py +428 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/sse/routes.py +17 -26
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/sse/scheduler_wiring.py +2 -2
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/sse/session_bus.py +22 -35
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/providers/_openai_compat.py +70 -4
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/providers/gemini.py +25 -10
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/providers/huggingface.py +3 -3
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/providers/nvidia.py +3 -3
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/providers/ollama.py +68 -16
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/providers/openrouter.py +3 -3
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/providers/sampling.py +14 -5
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/providers/vertex_claude.py +4 -3
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/scheduler/engine.py +28 -13
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/scheduler/worker.py +4 -3
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/subagents/worker/__main__.py +2 -2
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/todo_list/__init__.py +3 -6
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/web_search/__init__.py +6 -9
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/web_search/tool.py +2 -2
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/acceptance/test_observability_acceptance.py +14 -2
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/cli/test_main.py +2 -2
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/computer/test_subagent_exclusion.py +1 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_bootstrap.py +4 -4
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_config_extensions.py +177 -21
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_context.py +71 -4
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_core_tool_executor.py +75 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_durable_events.py +2 -14
- monkeybot-3.1.0/tests/core/test_env_map_grep_gates.py +44 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_events.py +57 -3
- monkeybot-3.1.0/tests/core/test_firestore_scheduled_loops.py +350 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_harness_prompt.py +23 -2
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_loop.py +47 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_loop_hooks.py +73 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_loop_transcript.py +9 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_mcp_client.py +317 -4
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_prompt.py +52 -0
- monkeybot-3.1.0/tests/core/test_runtime_config_snapshot.py +742 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_runtime_env.py +151 -18
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_sandbox_executor.py +144 -53
- monkeybot-3.1.0/tests/core/test_scheduled_loops.py +293 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_subagent_trace_propagation.py +92 -2
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_subagent_worker_paths.py +21 -3
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_terminal.py +5 -5
- monkeybot-3.1.0/tests/core/test_transcript.py +745 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_truncated_tool_batch.py +17 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_worker_pool.py +114 -18
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/evals/scenario_runner.py +0 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/evals/test_agent_behavior.py +1 -1
- monkeybot-3.1.0/tests/gateway/realtime/test_deps.py +139 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/realtime/test_routes_client_text.py +18 -4
- monkeybot-3.1.0/tests/gateway/sse/test_config_reload.py +1131 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/sse/test_create_session_model.py +46 -15
- monkeybot-3.1.0/tests/gateway/sse/test_gateway_runtime.py +100 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/sse/test_routes.py +8 -10
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/sse/test_session_bus.py +12 -13
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/sse/test_transcript_wiring.py +12 -10
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/integration/test_mb_e2e_simple_reply.py +7 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/integration/test_observability_integration.py +22 -2
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/providers/conftest.py +28 -1
- monkeybot-3.1.0/tests/providers/test_gemini_history.py +96 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/providers/test_ollama.py +110 -1
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/providers/test_openai_history.py +93 -12
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/providers/test_sampling.py +20 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/test_cold_start.py +8 -2
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/test_packaging_config.py +2 -2
- {monkeybot-3.0.4 → monkeybot-3.1.0}/uv.lock +7 -3
- monkeybot-3.0.4/cli/src/monkeybot_cli/scaffold_defaults/browser/SKILL.md +0 -16
- monkeybot-3.0.4/cli/tests/test_doctor.py +0 -85
- monkeybot-3.0.4/docker-compose.yml +0 -13
- monkeybot-3.0.4/docs/browser-mcp.md +0 -221
- monkeybot-3.0.4/evals/smoke_agent/skills/browser/SKILL.md +0 -8
- monkeybot-3.0.4/examples/skills/browser/SKILL.md +0 -68
- monkeybot-3.0.4/integrations/browser-mcp/src/browser_mcp/assets/pa_driver.js +0 -209
- monkeybot-3.0.4/integrations/browser-mcp/src/browser_mcp/dom_indexing.py +0 -123
- monkeybot-3.0.4/integrations/browser-mcp/src/browser_mcp/playbooks.py +0 -91
- monkeybot-3.0.4/integrations/browser-mcp/src/browser_mcp/screenshots.py +0 -57
- monkeybot-3.0.4/integrations/browser-mcp/src/browser_mcp/server.py +0 -536
- monkeybot-3.0.4/integrations/browser-mcp/tests/test_dom_indexing.py +0 -147
- monkeybot-3.0.4/integrations/browser-mcp/tests/test_in_app_cdp.py +0 -208
- monkeybot-3.0.4/integrations/browser-mcp/tests/test_indexed_tools.py +0 -120
- monkeybot-3.0.4/src/monkeybot/core/config/runtime_env.py +0 -333
- monkeybot-3.0.4/src/monkeybot/core/persistence/transcript.py +0 -304
- monkeybot-3.0.4/src/monkeybot/core/persistence/transcript_analyzer.py +0 -849
- monkeybot-3.0.4/src/monkeybot/gateway/realtime/deps.py +0 -57
- monkeybot-3.0.4/tests/core/test_firestore_scheduled_loops.py +0 -34
- monkeybot-3.0.4/tests/core/test_scheduled_loops.py +0 -116
- monkeybot-3.0.4/tests/core/test_transcript.py +0 -254
- monkeybot-3.0.4/tests/core/test_transcript_analyzer.py +0 -371
- monkeybot-3.0.4/tests/gateway/realtime/test_deps.py +0 -15
- {monkeybot-3.0.4 → monkeybot-3.1.0}/.dockerignore +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/.github/workflows/ci.yml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/.github/workflows/prepare-release.yml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/.github/workflows/publish-release.yml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/.gitignore +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/.pre-commit-config.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/BACKLOG.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/CONTRIBUTING.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/LICENSE +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/README.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/chat_file_index.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/chat_local_shell.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/chat_renderer.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/chat_status_bar.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/chat_theme.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/chat_tool_display.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/chat_tui_widgets.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/commands/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/commands/loop.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/commands/new.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/commands/refresh.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/commands/run_cmd.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/commands/talk.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/compat.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/config_resolve.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/exit_commands.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/extras_catalog.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/gateway_health.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/main.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/opensandbox_lifecycle.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/output.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/process_tree.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/providers.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/realtime/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/realtime/audio_io.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/realtime/client.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/realtime/gateway_manager.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/realtime/push_to_talk.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/realtime/session.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/realtime/session_controller.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/realtime/wire_encode.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/runtime_python.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/scaffold.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/scaffold_defaults/AGENT.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/scaffold_defaults/Dockerfile +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/scaffold_defaults/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/scaffold_defaults/command_allowlist.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/scaffold_defaults/dockerignore +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/scaffold_defaults/env.example +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/scaffold_defaults/image-generator/SKILL.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/scaffold_defaults/image-generator/generate_image.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/scaffold_defaults/loop/SKILL.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/scaffold_defaults/mcp.json +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/scaffold_defaults/opensandbox.docker.toml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/scaffold_defaults/otel-collector.example.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/scaffold_defaults/permissions.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/session_controller.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/terminal_markdown.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_chat_continue.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_chat_errors.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_chat_file_index.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_chat_grounding.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_chat_local_shell.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_chat_renderer_parity.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_chat_status_bar.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_chat_theme.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_chat_tool_display.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_chat_tui.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_cli.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_config_resolve.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_extras_catalog.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_opensandbox_lifecycle.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_realtime_session_controller.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_run_cmd.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_runtime_python.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_scaffold.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/cli/tests/test_terminal_markdown.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docker/Dockerfile +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docker/docker-compose.sandbox.yml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docker/opensandbox.docker.toml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docker/sandbox.Dockerfile +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/agent-layout.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/assets/logo.png +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/cloud-deployment-design.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/deploy-pattern-a-container.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/deploy-pattern-b-serverless.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/knowledge-layer-fixes.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/mcp.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/memory-graph-split-plan.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/migrations/agent-scope-namespacing.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/migrations/memory-outbox.sql +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/observability-runbook.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/otel-collector.example.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/progressive-loop-tools.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/progressive-mcp-tools.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/skills.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/docs/workspace-index-design.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/assertions.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/diff.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/eval_config.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/models.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/persistence.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/report.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/runner.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/scenario_loader.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/scenarios/mcp/get_prompt.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/scenarios/mcp/list_resources.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/scenarios/mcp/tool_invoke.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/scenarios/memory/recall_cross_session.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/scenarios/memory/recall_single_session.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/scenarios/multi_turn/task_tracking.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/scenarios/skills/skill_invocation.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/scenarios/subagents/dispatch_complete.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/scenarios/tools/core_read.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/scenarios/tools/core_read_error.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/scenarios/tools/core_run_command.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/scenarios/tools/core_run_command_sandbox.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/scenarios/tools/core_write.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/smoke_agent/.env.example +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/smoke_agent/.gitignore +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/smoke_agent/fixture_mcp_server.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/smoke_agent/monkeybot_config/AGENT.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/smoke_agent/monkeybot_config/command_allowlist.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/smoke_agent/monkeybot_config/mcp.json +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/smoke_agent/monkeybot_config/permissions.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/smoke_agent/pyproject.toml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/smoke_agent/uv.lock +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/smoke_agent/workspace/.gitkeep +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/smoke_agent/workspace/skills/browser/playbooks/.gitkeep +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/suites/smoke.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/test_assertions.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/test_diff.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/test_judge.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/test_report.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/test_runner_sse.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/evals/test_scorer.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/examples/agentcore/handler.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/examples/agentcore/runtime_app.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/examples/agentengine/handler.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/examples/cloud-functions/main.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/examples/skills/browser/playbooks/.gitkeep +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/examples/skills/diagnostics/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/examples/skills/image-generator/SKILL.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/examples/skills/image-generator/generate_image.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/integrations/browser-mcp/scripts/agentcore_smoke.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/integrations/browser-mcp/src/browser_mcp/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/integrations/browser-mcp/src/browser_mcp/agentcore.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/integrations/browser-mcp/src/browser_mcp/assets/NOTICE.md +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/integrations/browser-mcp/src/browser_mcp/assets/dom_tree.js +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/integrations/browser-mcp/tests/test_playbooks.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/pytest.ini +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/scripts/create_schema.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/scripts/precommit-pytest.sh +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/scripts/release.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/scripts/smoke_global_cli.sh +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/cli/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/cli/__main__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/cli/audio_io.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/cli/gateway_manager.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/cli/main.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/cli/push_to_talk.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/cli/realtime_client.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/computer/approvals.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/computer/permissions.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/computer/safety.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/computer/tools.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/attachments/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/attachments/catalog.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/attachments/config.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/attachments/freeze.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/attachments/resolve.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/attachments/store.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/attachments/text.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/attachments/tools.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/config/yaml_loader.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/context/campaign_context.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/context/common.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/context/epoch.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/context/tool_result_ingress.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/context/tool_shapers.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/hooks/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/captions.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/chunking.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/config.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/embeddings/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/embeddings/base.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/embeddings/factory.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/embeddings/gemini.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/embeddings/nvidia.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/embeddings/openai_compat.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/embeddings/sanitize.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/evidence_guard.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/extractors.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/fusion.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/hook.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/indexer.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/links.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/salience.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/sqlite_index.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/subsystem.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/tool.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/knowledge/types.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/llm/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/llm/realtime_provider.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/llm/usage.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/lockfile_names.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/logging_utils.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/mcp/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/memory/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/memory/hook.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/memory/ids.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/memory/ingest.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/memory/migrate_layout.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/memory/observability.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/memory/outbox.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/memory/uri.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/memory/writer.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/messages/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/messages/convert_provider.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/messages/tool_integrity.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/messages/transform_context.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/path_safety.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/persistence/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/persistence/db.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/persistence/durable_runs.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/persistence/errors.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/persistence/firestore.indexes.json +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/persistence/firestore.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/persistence/history.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/persistence/runs.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/persistence/session_turn_locks.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/persistence/sqlite_backend.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/persistence/sqlite_vector.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/persistence/thread_summary.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/persistence/usage.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/persistence/usage_buckets.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/prompts/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/prompts/headings.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/runtime/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/runtime/context_budget.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/runtime/doom_loop.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/runtime/input_admission.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/runtime/loop_hooks.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/runtime/loop_ports.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/runtime/provider_stream_mapper.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/runtime/utterance_buffer.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/subagents/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/subagents/progress_publish.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/testing/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/testing/mocks_provider.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/testing/mocks_realtime_provider.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/tools/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/tools/fs_isolation.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/tools/inspector.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/tools/loop_inspector.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/tools/patch.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/tools/permission.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/tools/spill_inventory.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/tools/text_normalize.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/tools/tool_hint.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/tools/tool_kind.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/tools/types.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/tools/workspace_service.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/types/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/types/content_blocks.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/types/interfaces.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/types/types_tools.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/workspace/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/workspace/factory.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/workspace/gcs.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/workspace/local.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/workspace/protocol.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/workspace/s3.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/core/workspace_layout.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/bootstrap.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/pending_response_bus.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/realtime/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/realtime/errors.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/realtime/guardrails.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/realtime/manager.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/realtime/metrics.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/realtime/session.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/realtime/wire.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/sse/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/sse/loop_port.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/sse/reply_body.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/sse/scheduler_routes.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/sse/sse.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/gateway/sse/workspace_layout.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/observability/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/observability/_state.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/observability/instrumentation.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/observability/propagation.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/observability/spans.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/observability/sqlite_exporter.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/providers/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/providers/_bedrock_converse.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/providers/_utils.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/providers/bedrock.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/providers/claude.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/providers/gemini_live.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/providers/model_capabilities.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/providers/openai.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/providers/pricing.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/scaffold/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/scheduler/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/scheduler/__main__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/scheduler/http_invoker.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/scheduler/interval.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/scheduler/tick_result.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/subagents/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/subagents/worker/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/todo_list/store.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/todo_list/tool.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/web_search/backends/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/web_search/backends/duckduckgo.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/web_search/backends/firecrawl.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/web_search/backends/tavily.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/src/monkeybot/web_search/protocol.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/cli/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/cli/test_gateway_manager.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/cli/test_push_to_talk.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/cli/test_realtime_client.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/computer/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/computer/test_approvals.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/computer/test_computer_tools.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/computer/test_package_init.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/computer/test_path_policy.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/computer/test_permissions.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/computer/test_wiring.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/conftest.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/fixtures/bitbucket_dc_style_pr.diff +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/memory/helpers.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/memory/in_memory_palace.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/memory/test_mempalace.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/memory/test_review_fixes.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_agent_layout.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_attachment_freeze.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_attachment_store.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_content_blocks.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_context_budget.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_context_epoch.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_doom_loop.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_durable_runs.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_empty_completion.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_evidence_guard.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_firestore_history.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_firestore_usage.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_fs_isolation.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_gemini_history_replay.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_history.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_history_compaction_split.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_hooks.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_input_admission.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_inspector.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_knowledge_chunking.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_knowledge_chunking_rank.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_knowledge_config.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_knowledge_embeddings.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_knowledge_fts.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_knowledge_fusion.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_knowledge_fusion_ann.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_knowledge_hook.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_knowledge_indexer.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_knowledge_links.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_knowledge_media.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_knowledge_salience.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_knowledge_single_writer.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_knowledge_subsystem.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_knowledge_vectors.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_layout.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_logging_utils.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_loop_observability.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_memory_layout_migrate.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_message_pipeline.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_mocks_realtime_provider.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_patch.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_path_safety.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_permission.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_pricing.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_progress_publish.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_provider_contract.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_provider_stream_mapper.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_realtime_loop.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_replace_fuzzy.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_run_command_parse.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_runs.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_session_turn_locks.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_settlement.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_spill_dynamic.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_spill_inventory.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_storage_backends.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_subagent_proto.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_thread_summary_wire.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_tool_def_schema.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_tool_integrity.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_tool_result_ingress.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_tool_shapers.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_usage.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_usage_migration.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_utterance_buffer.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_workspace_layout.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_workspace_symlinks.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/test_workspace_write_scope.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/workspace/test_factory.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/workspace/test_local_storage.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/core/workspace/test_protocol_contract.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/evals/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/evals/eval_hook.py +0 -0
- /monkeybot-3.0.4/tests/evals/scenarios/context_curation.yaml → /monkeybot-3.1.0/tests/evals/scenarios/memory_wake_up_large.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/evals/scenarios/memory_write_inject.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/evals/scenarios/subagent_roundtrip.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/evals/scenarios/tool_glob_grep.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/evals/scenarios/tool_load_file.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/evals/scenarios/tool_loops.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/evals/scenarios/tool_read.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/evals/scenarios/tool_replace_apply_patch.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/evals/scenarios/tool_run_command.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/evals/scenarios/tool_search_knowledge.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/evals/scenarios/tool_search_memory.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/evals/scenarios/tool_todo_list.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/evals/scenarios/tool_web_search.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/evals/scenarios/tool_write.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/evals/scenarios/turn_completion.yaml +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/evals/test_memory_knowledge_routing.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/realtime/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/realtime/test_app.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/realtime/test_guardrails.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/realtime/test_manager.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/realtime/test_metrics.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/realtime/test_session.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/realtime/test_wire.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/sse/test_attachments.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/sse/test_scheduler_routes.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/test_otel_fastapi.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/test_otel_lifespan.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/test_pending_response_endpoints.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/test_realtime_main.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/test_resolve_provider.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/test_sse_events.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/gateway/test_subagent_event_publisher.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/integration/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/integration/test_prompt_caching_integration.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/observability/conftest.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/observability/test_init.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/observability/test_instrumentation.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/observability/test_loop_hook_spans.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/observability/test_propagation.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/observability/test_span_contract.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/observability/test_spans.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/observability/test_sqlite_exporter.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/observability/test_truncate.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/observability/test_turn_complete_trace.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/providers/test_anthropic_cache.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/providers/test_anthropic_history.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/providers/test_bedrock_converse.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/providers/test_bedrock_estimate.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/providers/test_gemini_live.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/providers/test_gemini_usage.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/providers/test_huggingface.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/providers/test_model_capabilities.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/providers/test_nvidia.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/providers/test_openai_compat_usage.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/providers/test_pricing.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/providers/test_safe_parse_tool_args.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/providers/test_sonnet5_sampling.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/providers/test_source_grep_gates.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/providers/test_vertex_claude_history.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/scheduler/test_engine.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/scheduler/test_interval.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/skills/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/skills/test_generate_image_script.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/test_release_script.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/todo_list/test_todo_list.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/web_search/__init__.py +0 -0
- {monkeybot-3.0.4 → monkeybot-3.1.0}/tests/web_search/test_web_search.py +0 -0
|
@@ -111,17 +111,13 @@ jobs:
|
|
|
111
111
|
working-directory: evals/smoke_agent
|
|
112
112
|
env:
|
|
113
113
|
NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
|
|
114
|
-
#
|
|
115
|
-
MODEL_PROVIDER: nvidia
|
|
116
|
-
MODEL_NAME: thinkingmachines/inkling
|
|
114
|
+
# Agent model is YAML-only (evals/smoke_agent/monkeybot_config/monkeybot.yaml).
|
|
117
115
|
# smoke_agent monkeybot.yaml sets runtime.port: 8080; the health check and
|
|
118
116
|
# AGENT_URL below expect 8787, so pin PORT explicitly (env beats yaml).
|
|
119
117
|
PORT: "8787"
|
|
120
118
|
SANDBOX_ENABLED: "false" # no Docker socket in this runner
|
|
121
|
-
#
|
|
122
|
-
#
|
|
123
|
-
# currently excluded from smoke pending a retune against thinkingmachines/inkling.
|
|
124
|
-
# Re-add MODEL_CONTEXT_WINDOW: "8000" here alongside it if it comes back.
|
|
119
|
+
# summarization_trigger is excluded from smoke; if it returns, set
|
|
120
|
+
# model.context_window in smoke_agent YAML (not MODEL_CONTEXT_WINDOW env).
|
|
125
121
|
run: |
|
|
126
122
|
uv run -m monkeybot.gateway.main > /tmp/gateway.log 2>&1 &
|
|
127
123
|
echo $! > /tmp/gateway.pid
|
|
@@ -143,9 +139,8 @@ jobs:
|
|
|
143
139
|
JUDGE_PROVIDER: nvidia
|
|
144
140
|
JUDGE_MODEL: nvidia/nemotron-3-ultra-550b-a55b
|
|
145
141
|
NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
|
|
146
|
-
# Scorecard metadata:
|
|
147
|
-
|
|
148
|
-
MODEL_NAME: thinkingmachines/inkling
|
|
142
|
+
# Scorecard metadata: read the model the gateway ran from smoke_agent YAML.
|
|
143
|
+
MONKEYBOT_AGENT_CONFIG: evals/smoke_agent/monkeybot_config/monkeybot.yaml
|
|
149
144
|
EVENT_NAME: ${{ github.event_name }}
|
|
150
145
|
# thinkingmachines/inkling gets rate-limited by NVIDIA even at low concurrency;
|
|
151
146
|
# each scenario itself makes several requests in quick succession, so space
|
|
@@ -6,7 +6,61 @@ the project adheres to [Semantic Versioning](https://semver.org/).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## [core v3.1.0] - 2026-09-05
|
|
10
|
+
|
|
11
|
+
### Breaking
|
|
12
|
+
|
|
13
|
+
- `context_curation` is retired. The section no longer maps to env or trims MemPalace wake-up lines. Leftover YAML still loads and logs one warning per process; `CONTEXT_CURATION_*` / `MEMORY_INDEX_CAP` process env is unused. Wake-up size is whatever MemPalace L0+L1 returns; `model.context_window` still only bounds history summarization. Subagents now include the same wake-up block as the parent (they previously received none of it).
|
|
14
|
+
- `model.provider`, `model.name`, `model.temperature`, `model.max_tokens`, `model.thinking_budget`, `model.context_window`, `model.summarization_model`, `model.max_turns`, and `model.cache_retention` are YAML-only. Process env `MODEL_PROVIDER`, `MODEL_NAME`, `MODEL_TEMPERATURE`, `MODEL_MAX_TOKENS`, `MODEL_THINKING_BUDGET`, `MODEL_CONTEXT_WINDOW`, `CONTEXT_SUMMARIZATION_MODEL`, `MAX_TURNS`, and `MODEL_CACHE_RETENTION` are ignored (a warning is logged once per process). If leftover `MODEL_PROVIDER` is set and `monkeybot.yaml` has no `model.provider`, startup fails instead of silently defaulting to `google_vertexai` / `gemini-2.5-flash`. Set them under `model:` in `monkeybot.yaml`. Credentials (`GEMINI_API_KEY`, `NVIDIA_API_KEY`, …) stay in `.env`.
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- Local Ollama prefix-cache knobs: `ollama-local` sends `keep_alive` (default 24h, `model.keep_alive`) and optional pinned `num_ctx` (`model.num_ctx`) via OpenAI-compat `extra_body`. YAML-only — not mapped from the runtime env. `model.context_window` is never mapped to `num_ctx`. See `docs/ollama-local.md` and `examples/ollama/PrefixStable.Modelfile`.
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
|
|
22
|
+
- An image inside a tool result (e.g. `load_file`) now reaches OpenAI-compatible models (OpenAI, Ollama, NVIDIA, HuggingFace, OpenRouter) as a real `image_url` promoted into a synthetic user turn after the tool row, instead of a text placeholder telling the model to guess at content it never saw. Anthropic-family, Bedrock, and Gemini already carried this media natively and are unaffected. Also fixes Gemini replaying a media-only tool result as an empty `functionResponse`, and fixes OpenAI-compat prompt-token counting tokenizing an image's base64 data URL as JSON text (a 1MB image previously counted as ~340K tokens and could trigger spurious compaction).
|
|
23
|
+
- Subagent timeout/cancel now walks and kills the full process tree (including nested `run_command` sessions that use their own `start_new_session` process groups), not only the subagent leader's session. `process_group_id` returns `None` when the PID is gone instead of treating a recycled PID as a process group. The tree walk's non-`/proc` fallback (macOS) now uses `pgrep -P` instead of an invalid BSD `ps -P` invocation that silently returned no children. `stop_subagent_process` `killpg`s the spawn-time `pgid` even after the leader has been reaped, and skips the tree walk in that case so a recycled leader PID cannot be used as a `killpg` target.
|
|
24
|
+
- Scheduled loops: a single malformed record — e.g. `interval_ms <= 0` from legacy/hand-edited data — is skipped and logged on Firestore, SQLite, and Postgres `get`/`list_all`/`list_due` instead of raising out of the mapper and stalling the scheduler (or 500ing the loops API).
|
|
25
|
+
- Progressive MCP: harness catalog + `enable_mcp` schema no longer mention `mcp.json`, which sent models to `read_file` a control-plane file outside the workspace. Catalog names are now an `enable_mcp` enum; the tool is omitted when the catalog is empty.
|
|
26
|
+
|
|
27
|
+
## [browser v0.5.0] - 2026-09-05
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
|
|
31
|
+
- Opt-in per-tool timing via `BROWSER_MCP_PERF=1` (JSONL to `BROWSER_MCP_PERF_LOG` or `<workspace>/browser/perf/tools.jsonl`). Never logs tool arguments. `scripts/perf_bench.py` records the Phase 0 baseline against static fixtures. See [browser-mcp-perf-baseline.md](docs/browser-mcp-perf-baseline.md).
|
|
32
|
+
- The DOM driver is registered once per tab (`Page.addScriptToEvaluateOnNewDocument` / Playwright `add_init_script`) so `browser_get_elements` after navigation is one harness call. `browser_input_by_index` gains `mode` (`auto`/`keys`/`fast`) and returns `mode_used`; default override `BROWSER_MCP_FILL_MODE`. `browser_goto(url, new_tab=False)` reuses the current tab via `goto_url` and an in-page load/settle wait. `browser_click_by_index` adds `warning` when the target is covered by another element.
|
|
33
|
+
- Tab registry with aliases (`t1`, `t2`, …), `tab=` on interaction tools (omitted = focused tab), `browser_open_tab` / `browser_close_tab` / `browser_read_tabs`, enriched `browser_tabs` (`{ok, focused, tabs}` instead of a raw list), alias-aware `browser_switch_tab`, five-tab cap (`BROWSER_MCP_MAX_TABS`, user chooses what to drop), and serialized tool execution. Reads never move focus; actions do. `browser_stop` closes agent-opened tabs.
|
|
34
|
+
- `browser_screenshot` defaults to JPEG (`max_dim=1200`, `quality=60`) and returns `bytes` + `format`. `annotate=True` draws current `get_elements` index labels so the next action can still use `browser_click_by_index`. PNG remains available via `format="png"`. Inline MCP images (7b) are not included.
|
|
35
|
+
- `browser_wait_for` waits with one in-page `MutationObserver` (chunked at 4s to stay under the harness IPC timeout) instead of polling `wait_for_element`. `browser_wait_idle` still uses network idle on the focused tab, then a DOM settle; `ok`/`idle` stay the network result and the response adds `quiet`/`navigated`.
|
|
36
|
+
- `browser_get_elements` defaults to the viewport (`BROWSER_MCP_VIEWPORT_DEFAULT`), filters with `kind` / `contains` / `max_elements=150`, and returns `truncated` + `below_viewport`. Indices stay valid until navigation. `observe="diff"` diffs against the per-tab cached tree. New `browser_get_text` for readable body copy.
|
|
37
|
+
- Action tools (`click`/`input`/`select`/`fill`/`press`/`scroll`/`switch_tab`) settle then return `{action, page, observation}` (diff by default, `BROWSER_MCP_OBSERVE_DEFAULT`; `observe="none"` keeps the legacy shape). `browser_goto` and focused `browser_open_tab` return a full observation. Timing: `BROWSER_MCP_SETTLE_MS` / `BROWSER_MCP_QUIET_MS`. Legacy top-level keys (`clicked`, `index`, `tagName`, `selected`) stay for this release.
|
|
38
|
+
- `browser_act` runs up to 25 sequential steps in one turn (`fill_form` is a step, not a separate tool); `browser_click_text` clicks by visible text; `browser_extract` scrapes structured rows. Shared `do_*` helpers back both the single tools and the batch executor.
|
|
39
|
+
- Optional `playbook` YAML fences in host markdown are executable via `browser_run_playbook`. `browser_list_playbooks` / `browser_goto` list `flows`. `browser_write_playbook` validates fences before save. Timeout: `BROWSER_MCP_PLAYBOOK_TIMEOUT_S` (default 120). Secrets are never flow params — use `{do: login, expected_origin}`.
|
|
40
|
+
|
|
41
|
+
## [cli v0.6.0] - 2026-09-05
|
|
42
|
+
|
|
43
|
+
### Added
|
|
44
|
+
|
|
45
|
+
- `doctor` warns on local Ollama `*-mlx` tags, default thinking on known reasoning tags, and huge `num_ctx`, and fails on unparseable/`<1` `num_ctx`. See `docs/ollama-local.md`.
|
|
46
|
+
|
|
47
|
+
### Changed
|
|
48
|
+
|
|
49
|
+
- New-agent browser skill documents `fill_form` as a `browser_act` / playbook step.
|
|
50
|
+
- Example YAML documents YAML-only `model.*` knobs and drops retired `context_curation`.
|
|
51
|
+
- Declares `monkeybot[cli]>=3.1.0,<4` and `monkeybot-browser-mcp>=0.5.0,<1` so a global CLI install pulls this train.
|
|
52
|
+
|
|
53
|
+
## [browser v0.4.0] - 2026-08-29
|
|
54
|
+
|
|
55
|
+
### Added
|
|
56
|
+
|
|
57
|
+
- `browser_login`: sign in with a Spaces-saved password without exposing the credential. Returns the `origin` it acted on and accepts `expected_origin`, so a login cannot silently land on a tab other than the one the agent is driving. In-app CDP uses a tokenized WebSocket URL so a 403 is not misreported as Chrome's Allow-remote-debugging popup.
|
|
58
|
+
|
|
59
|
+
### Fixed
|
|
60
|
+
|
|
61
|
+
- Scrubs `?token=` values from every browser tool error rather than only daemon startup, so the in-app CDP token cannot reach the agent transcript through a mid-session harness failure.
|
|
62
|
+
|
|
63
|
+
## [cli v0.5.1] - 2026-08-28
|
|
10
64
|
|
|
11
65
|
### Changed
|
|
12
66
|
|
|
@@ -61,6 +115,8 @@ the project adheres to [Semantic Versioning](https://semver.org/).
|
|
|
61
115
|
|
|
62
116
|
### Fixed
|
|
63
117
|
|
|
118
|
+
- Firestore scheduled-loop `defer_tick` and `release_stale_claims` now re-check claim ownership / lease freshness inside a transaction (matching SQL `WHERE` guards), so a stale worker cannot clear another worker's reclaimed tick and a renewed heartbeat cannot be wiped mid-release.
|
|
119
|
+
- Inline `task` subagent timeout/cancel kills the process group (not only the direct child), matching the worker-pool path so nested shell descendants do not keep running after Stop. The inline subagent is detached from the parent process group (`start_new_session`), so a parent SIGKILL/crash no longer tears it down automatically — cleanup relies on timeout/cancel paths. Inline `task` has no `subagent.pid` reap path (unlike the worker pool); orphans after a hard parent crash are accepted on that path.
|
|
64
120
|
- Stop during a tool confirmation now settles completed tool results into history (and synthesizes cancel envelopes for the rest) instead of escaping before abort settlement; the realtime confirm path does the same. Cancel after a finished provider stream also persists already-shown assistant text so follow-ups match what the user saw, and settles any finalized tool calls with cancel envelopes.
|
|
65
121
|
- SQLite `history.reset` (compaction / load-max truncate) runs delete+reinsert in one transaction, matching Postgres, so a crash mid-reset cannot wipe or partially rewrite a thread.
|
|
66
122
|
- Tool spill paths sanitize client `session_id` / `thread_id` components and refuse to write or delete outside `.monkeybot/spill`; `POST /sessions` rejects path-traversal session ids; session DELETE quiesces the active turn before removing spill dirs. The same path-component sanitizer also applies to transcript and attachment directories, so legacy ids containing glob metacharacters map to a sanitized on-disk folder (reads still find a pre-sanitization folder when it exists).
|
|
@@ -4,14 +4,14 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "monkeybot-cli"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.6.0"
|
|
8
8
|
description = "CLI to create, configure, validate, and chat with monkeybot agents."
|
|
9
9
|
requires-python = ">=3.11"
|
|
10
10
|
dependencies = [
|
|
11
11
|
# `cli` pulls realtime + typer so `monkeybot talk` works out of the box (text mode).
|
|
12
12
|
# Audio mic/PTT needs the agent (or this env) to also install monkeybot[cli-realtime].
|
|
13
|
-
"monkeybot[cli]>=3.
|
|
14
|
-
"monkeybot-browser-mcp>=0.
|
|
13
|
+
"monkeybot[cli]>=3.1.0,<4",
|
|
14
|
+
"monkeybot-browser-mcp>=0.5.0,<1",
|
|
15
15
|
"httpx>=0.27.0",
|
|
16
16
|
"pyyaml>=6.0.2",
|
|
17
17
|
"python-dotenv>=1.0.0",
|
|
@@ -56,7 +56,7 @@ npx skills add human-plus-machine/monkeybot --skill monkeybot
|
|
|
56
56
|
- `monkeybot_config/monkeybot.yaml` — non-secret settings (model, paths, gateway, behavior).
|
|
57
57
|
- `.env` — secrets and machine-local paths (API keys, GCP project, DB URL).
|
|
58
58
|
- sidecars: `monkeybot_config/AGENT.md` (system prompt), `mcp.json` (MCP servers), `command_allowlist.yaml`.
|
|
59
|
-
- **Precedence — important:** environment variables and `.env` win over `monkeybot.yaml
|
|
59
|
+
- **Precedence — important:** environment variables and `.env` win over `monkeybot.yaml` except `model.*` (provider, name, sampling, context window, summarization model, max turns, cache retention), which is YAML-only. If a user edits YAML but nothing changes, suspect a stale `.env` shadowing it (the YAML→env mapping lives in `runtime_env.py:ENV_MAP`).
|
|
60
60
|
- **Defaults are fine on day one.** Most first-time users only touch `model`, `.env` credentials, and `AGENT.md`.
|
|
61
61
|
|
|
62
62
|
## Running CLI commands
|
|
@@ -112,7 +112,7 @@ uv sync
|
|
|
112
112
|
| `aws_bedrock` | `AWS_ACCESS_KEY_ID` / `AWS_PROFILE` + `AWS_REGION` | `monkeybot[bedrock]` |
|
|
113
113
|
| `huggingface` | `HF_TOKEN` (or `HUGGINGFACE_API_KEY`) | `monkeybot[huggingface]` |
|
|
114
114
|
| `ollama-cloud` | `OLLAMA_API_KEY` | `monkeybot[ollama]` |
|
|
115
|
-
| `ollama-local` | None required — `OLLAMA_BASE_URL` (default `http://localhost:11434`) | `monkeybot[ollama]` |
|
|
115
|
+
| `ollama-local` | None required — `OLLAMA_BASE_URL` (default `http://localhost:11434`). Requests send `keep_alive` 24h so prefix KV cache survives idle. | `monkeybot[ollama]` |
|
|
116
116
|
| `ollama` | Legacy auto-route (key + blank URL = cloud; explicit URL wins) | `monkeybot[ollama]` |
|
|
117
117
|
|
|
118
118
|
**Agent-first dependencies.** The CLI is thin — it does **not** install provider/storage extras globally. `monkeybot new` scaffolds a `pyproject.toml` with the selected provider (and any `--with` extras). Run plain `uv sync` in the agent directory. `monkeybot run` / `chat` spawn the gateway from that project's interpreter (`.venv/bin/python`, else `uv run python`), and `doctor` checks extras in that same interpreter. For a config-only tree (just `monkeybot_config/`, no `pyproject.toml`) the gateway uses the CLI's interpreter when it already has MonkeyBot 3.x (and MemPalace if memory is on). If memory is enabled and that interpreter cannot import MemPalace, `run` / `chat` provision a cached CLI-managed venv under `~/.cache/monkeybot/runtimes/` holding `monkeybot[memory]` pinned to the running core (never rewrites a `pyproject.toml`). `doctor` reuses that cache when it is already present. Otherwise extras must be installed in the CLI env (`uv tool install --with 'monkeybot[<extra>]' monkeybot-cli`).
|
|
@@ -160,7 +160,7 @@ Decision → config map:
|
|
|
160
160
|
| "Run untrusted code" | `sandbox.enabled` + `SANDBOX_API_KEY` |
|
|
161
161
|
| "Use specialist agents" | `subagents.personas` + `monkeybot_config/agents/*.md` |
|
|
162
162
|
| "Connect external tools" | `mcp.json` (`mcpServers` object), then `validate --check-mcp` |
|
|
163
|
-
| "Control cost / context size" | `model
|
|
163
|
+
| "Control cost / context size" | `model.*` |
|
|
164
164
|
| "Restrict dangerous commands" | `tools.denied_patterns`, `command_allowlist.yaml` |
|
|
165
165
|
| "Multiple environments" | top-level `includes:` fragments |
|
|
166
166
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Deep reference for every `monkeybot.yaml` section. Load this only when a user needs to customize beyond Tier 1. The canonical, fully-commented template lives at `cli/src/monkeybot_cli/scaffold_defaults/monkeybot.example.yaml` in the monkeybot repo (copied to `monkeybot_config/monkeybot.example.yaml` when you scaffold); this file adds the **"when would I change this?"** context the comments don't.
|
|
4
4
|
|
|
5
|
-
**Precedence:** env vars and `.env` win over YAML. The YAML→env mapping is `ENV_MAP` in `src/monkeybot/core/config/runtime_env.py`. If a YAML edit has no effect, check for a shadowing env var.
|
|
5
|
+
**Precedence:** env vars and `.env` win over YAML for `ENV_MAP` keys. `model.*` (provider, name, temperature, max_tokens, thinking_budget, context_window, summarization_model, max_turns, cache_retention) is YAML-only — leftover `MODEL_*` env vars are ignored. The YAML→env mapping is `ENV_MAP` in `src/monkeybot/core/config/runtime_env.py`. If a YAML edit has no effect, check for a shadowing env var (except `model.*`).
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -34,6 +34,8 @@ Validate check ids: `paths.agent_md.exists`, `paths.skills_path.exists`, `paths.
|
|
|
34
34
|
|
|
35
35
|
## `model`
|
|
36
36
|
|
|
37
|
+
YAML-only for provider, name, sampling, context window, summarization model, max turns, and cache retention. Leftover `MODEL_*` / `MAX_TURNS` / `CONTEXT_SUMMARIZATION_MODEL` env vars are ignored.
|
|
38
|
+
|
|
37
39
|
| Field | Default | When to change |
|
|
38
40
|
|---|---|---|
|
|
39
41
|
| `provider` | `gemini` | Switch LLM vendor (see provider table in SKILL.md) |
|
|
@@ -41,9 +43,11 @@ Validate check ids: `paths.agent_md.exists`, `paths.skills_path.exists`, `paths.
|
|
|
41
43
|
| `temperature` | `0.7` | Lower for deterministic output, higher for creative |
|
|
42
44
|
| `max_tokens` | `60000` | Cap per-response length |
|
|
43
45
|
| `thinking_budget` | `-1` | Gemini: `-1` model default, `0` off, `N` token budget. Ollama reasoning models: `-1` server default, `0` off (`reasoning_effort: none`) |
|
|
44
|
-
| `context_window` | `1000000` | Summarization trigger (tokens); also drives soft-spill / `read_file` char budgets |
|
|
46
|
+
| `context_window` | `1000000` | Summarization trigger (tokens); also drives soft-spill / `read_file` char budgets. **Not** Ollama `num_ctx` |
|
|
47
|
+
| `keep_alive` | `24h` (ollama-local only) | How long local Ollama keeps the model (and KV prefix cache) loaded. YAML only. Set `"0"` to omit. See `docs/ollama-local.md` |
|
|
48
|
+
| `num_ctx` | (unset) | Optional pinned Ollama `num_ctx`. YAML only. Omit = server default. Do not copy `context_window` |
|
|
45
49
|
| `max_turns` | `1000` | Hard cap on turns per run |
|
|
46
|
-
| `summarization_model` | (main model) | Cheaper model for history summarization (
|
|
50
|
+
| `summarization_model` | (main model) | Cheaper model for history summarization (YAML-only)
|
|
47
51
|
|
|
48
52
|
Validate check ids: `model.provider.supported`, `model.name.present`. Supported YAML providers: `gemini`/`vertex`, `openai`, `anthropic`, `vertex-claude`, `huggingface`, `ollama-cloud`, `ollama-local`, `ollama`, `aws_bedrock`, `fake`.
|
|
49
53
|
|
|
@@ -71,22 +75,6 @@ Required when `memory_storage_uri` is `gcs://…` or `provider: vertex-claude` (
|
|
|
71
75
|
| `graceful_shutdown_timeout_sec` | `5` | Allow longer drain on shutdown |
|
|
72
76
|
| `cors_allow_origins` | `http://localhost:5173` | **Custom web UI** — set its origin, or `"*"` for any |
|
|
73
77
|
|
|
74
|
-
## `context_curation`
|
|
75
|
-
|
|
76
|
-
Trims memory injected into context. `enabled: true` by default.
|
|
77
|
-
|
|
78
|
-
Recent window by default; LLM curator only when the index is token-heavy. On curator failure, falls back to the window.
|
|
79
|
-
|
|
80
|
-
| Field | Default | Notes |
|
|
81
|
-
|---|---|---|
|
|
82
|
-
| `memory_window_lines` | `12` | Recent index lines injected; also caps curator-selected lines |
|
|
83
|
-
| `memory_index_cap` | `200` | Organizer keeps this many INDEX.md entries; older rows move to `INDEX.archive.md` |
|
|
84
|
-
| `memory_token_threshold` | `2000` | Call curator when estimated index tokens exceed this |
|
|
85
|
-
| `curator_model` | `gemini-3-flash` | Separate small model; empty = main model |
|
|
86
|
-
| `timeout_sec` | `10` | Curator call timeout |
|
|
87
|
-
|
|
88
|
-
When the prompt shows fewer entries than exist, a structural confidence score triggers a `search_memory` nudge. Skill names are always shown in full in the prompt; use `list_skills` to get the skills root path.
|
|
89
|
-
|
|
90
78
|
## `memory`
|
|
91
79
|
|
|
92
80
|
MemPalace capture, wake-up, and search teaching are on by default. Turn them off with `memory.enabled: false` or `MONKEYBOT_MEMORY_HOOK_ENABLED=0`. The vector stack is the optional `monkeybot[memory]` extra — omit it (and set `enabled: false`) when you do not want chromadb/onnxruntime.
|
|
@@ -176,4 +164,4 @@ Validate check: `config.includes.resolve`.
|
|
|
176
164
|
|
|
177
165
|
## `fake_provider`
|
|
178
166
|
|
|
179
|
-
Test-only. `events_json` feeds `
|
|
167
|
+
Test-only. `events_json` feeds `model.provider: fake` scripted runs (env `MONKEYBOT_FAKE_PROVIDER_EVENTS`). Not for production.
|
|
@@ -229,7 +229,7 @@ class ChatSessionController:
|
|
|
229
229
|
self.usage = UsageStore()
|
|
230
230
|
self.session_id: str | None = None
|
|
231
231
|
self.stream_error = False
|
|
232
|
-
self.
|
|
232
|
+
self.transcript_dir: str | None = None
|
|
233
233
|
self._client: httpx.AsyncClient | None = None
|
|
234
234
|
self._event_queue: asyncio.Queue[str | None] = asyncio.Queue()
|
|
235
235
|
self._stream_task: asyncio.Task[None] | None = None
|
|
@@ -924,9 +924,9 @@ class ChatSessionController:
|
|
|
924
924
|
resp = await self._client.delete(f"{self.base}/sessions/{self.session_id}")
|
|
925
925
|
if resp.status_code == 200:
|
|
926
926
|
data = resp.json()
|
|
927
|
-
report = data.get("
|
|
927
|
+
report = data.get("transcript_dir") if isinstance(data, dict) else None
|
|
928
928
|
if isinstance(report, str) and report.strip():
|
|
929
|
-
self.
|
|
929
|
+
self.transcript_dir = report.strip()
|
|
930
930
|
except Exception:
|
|
931
931
|
logger.warning(
|
|
932
932
|
"session DELETE on close failed session_id=%s",
|
|
@@ -1680,8 +1680,8 @@ class ChatApp(App[int]):
|
|
|
1680
1680
|
src = session_dir / "transcript.ndjson"
|
|
1681
1681
|
if not src.is_file():
|
|
1682
1682
|
self._mount_system(
|
|
1683
|
-
"No trace file found —
|
|
1684
|
-
"
|
|
1683
|
+
"No trace file found — set runtime.transcript_enabled: true in monkeybot.yaml "
|
|
1684
|
+
"and restart the gateway",
|
|
1685
1685
|
error=True,
|
|
1686
1686
|
)
|
|
1687
1687
|
return
|
|
@@ -1829,10 +1829,10 @@ class ChatApp(App[int]):
|
|
|
1829
1829
|
async def _close_session_and_exit(self) -> None:
|
|
1830
1830
|
# Must not be named `_shutdown` — that shadows Textual.App._shutdown.
|
|
1831
1831
|
await self._controller.close()
|
|
1832
|
-
report_dir = getattr(self._controller, "
|
|
1832
|
+
report_dir = getattr(self._controller, "transcript_dir", None)
|
|
1833
1833
|
if isinstance(report_dir, str) and report_dir:
|
|
1834
|
-
self._mount_system(f"Transcript
|
|
1835
|
-
print(f"Transcript
|
|
1834
|
+
self._mount_system(f"Transcript → {report_dir}")
|
|
1835
|
+
print(f"Transcript → {report_dir}", flush=True)
|
|
1836
1836
|
self._exit_code = 1 if self._controller.stream_error else self._exit_code
|
|
1837
1837
|
self.exit(self._exit_code)
|
|
1838
1838
|
|
|
@@ -626,9 +626,9 @@ async def _plain_chat_session(
|
|
|
626
626
|
await controller.submit(user_line)
|
|
627
627
|
finally:
|
|
628
628
|
await controller.close()
|
|
629
|
-
if controller.
|
|
629
|
+
if controller.transcript_dir:
|
|
630
630
|
print(
|
|
631
|
-
f"{_DIM}Transcript
|
|
631
|
+
f"{_DIM}Transcript → {controller.transcript_dir}{_RESET}",
|
|
632
632
|
flush=True,
|
|
633
633
|
)
|
|
634
634
|
await renderer.stop_io_worker()
|
|
@@ -678,7 +678,6 @@ def _spawn_gateway(config_path: Path | None, agent_root: Path, port: int) -> _Sp
|
|
|
678
678
|
env["MONKEYBOT_CONFIG"] = str(config_path)
|
|
679
679
|
env["PORT"] = str(port)
|
|
680
680
|
env.setdefault("LOG_LEVEL", "error")
|
|
681
|
-
env.setdefault("MONKEYBOT_TRANSCRIPT_ENABLED", "1")
|
|
682
681
|
log_file = tempfile.NamedTemporaryFile(
|
|
683
682
|
mode="w+",
|
|
684
683
|
prefix="monkeybot-gateway-",
|
|
@@ -192,6 +192,146 @@ def _add_layout_checks(report: CommandReport, layout: AgentLayout) -> None:
|
|
|
192
192
|
)
|
|
193
193
|
|
|
194
194
|
|
|
195
|
+
_OLLAMA_LOCAL_DOCS = "docs/ollama-local.md"
|
|
196
|
+
_OLLAMA_NUM_CTX_LARGE = 32_768
|
|
197
|
+
_OLLAMA_REASONING_TAGS = ("qwen3", "gemma4", "gemma-4", "deepseek-r1", "qwq", "magistral")
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def _is_local_ollama_provider(provider: str) -> bool:
|
|
201
|
+
"""True for ollama-local and legacy ``ollama`` (not ollama-cloud)."""
|
|
202
|
+
key = provider.strip().lower().replace("_", "-")
|
|
203
|
+
return key in {"ollama-local", "ollama"}
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def _looks_like_reasoning_model(model_name: str) -> bool:
|
|
207
|
+
name = model_name.lower()
|
|
208
|
+
return any(tag in name for tag in _OLLAMA_REASONING_TAGS)
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def _parse_int(raw: object) -> int | None:
|
|
212
|
+
if raw is None or raw == "":
|
|
213
|
+
return None
|
|
214
|
+
try:
|
|
215
|
+
return int(raw)
|
|
216
|
+
except (TypeError, ValueError):
|
|
217
|
+
return None
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def _strict_positive_int(raw: object) -> tuple[int | None, bool]:
|
|
221
|
+
"""Return ``(value, invalid)``. Unset is ``(None, False)``; garbage or ``<1`` is invalid."""
|
|
222
|
+
if raw is None or raw == "":
|
|
223
|
+
return None, False
|
|
224
|
+
if isinstance(raw, bool) or not isinstance(raw, int):
|
|
225
|
+
return None, True
|
|
226
|
+
if raw < 1:
|
|
227
|
+
return None, True
|
|
228
|
+
return raw, False
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def _add_ollama_local_checks(
|
|
232
|
+
report: CommandReport,
|
|
233
|
+
*,
|
|
234
|
+
provider: str,
|
|
235
|
+
model_name: str,
|
|
236
|
+
thinking_budget: object,
|
|
237
|
+
num_ctx: object,
|
|
238
|
+
) -> None:
|
|
239
|
+
"""Warn on local-Ollama prefix-cache traps. Always emit the four check ids."""
|
|
240
|
+
local = _is_local_ollama_provider(provider)
|
|
241
|
+
mlx = "-mlx" in model_name.lower()
|
|
242
|
+
check(
|
|
243
|
+
report,
|
|
244
|
+
id="ollama.local.mlx_runner",
|
|
245
|
+
category="provider",
|
|
246
|
+
severity="warning",
|
|
247
|
+
passed=not mlx,
|
|
248
|
+
skip=not local,
|
|
249
|
+
message=(
|
|
250
|
+
f"model.name {model_name!r} looks like an MLX pack; prefix KV cache "
|
|
251
|
+
"often does not reuse between agent steps"
|
|
252
|
+
if mlx
|
|
253
|
+
else "model.name is not an MLX pack"
|
|
254
|
+
),
|
|
255
|
+
field="model.name",
|
|
256
|
+
value=model_name or None,
|
|
257
|
+
remediation=(
|
|
258
|
+
f"Prefer a GGUF tag for tool-calling loops. See {_OLLAMA_LOCAL_DOCS}." if mlx else None
|
|
259
|
+
),
|
|
260
|
+
docs=_OLLAMA_LOCAL_DOCS,
|
|
261
|
+
)
|
|
262
|
+
budget = _parse_int(thinking_budget)
|
|
263
|
+
if budget is None:
|
|
264
|
+
budget = -1
|
|
265
|
+
reasoning = _looks_like_reasoning_model(model_name)
|
|
266
|
+
thinking_on_default = budget == -1
|
|
267
|
+
check(
|
|
268
|
+
report,
|
|
269
|
+
id="ollama.local.thinking_default",
|
|
270
|
+
category="provider",
|
|
271
|
+
severity="warning",
|
|
272
|
+
passed=not thinking_on_default,
|
|
273
|
+
skip=not local or not reasoning,
|
|
274
|
+
message=(
|
|
275
|
+
"thinking_budget is -1 (server default); reasoning models generate "
|
|
276
|
+
"thinking tokens before the first visible reply"
|
|
277
|
+
if thinking_on_default
|
|
278
|
+
else f"thinking_budget is {budget}"
|
|
279
|
+
),
|
|
280
|
+
field="model.thinking_budget",
|
|
281
|
+
value=budget,
|
|
282
|
+
remediation=(
|
|
283
|
+
f"Set thinking_budget: 0 to send reasoning_effort: none. See {_OLLAMA_LOCAL_DOCS}."
|
|
284
|
+
if thinking_on_default
|
|
285
|
+
else None
|
|
286
|
+
),
|
|
287
|
+
docs=_OLLAMA_LOCAL_DOCS,
|
|
288
|
+
)
|
|
289
|
+
ctx, ctx_invalid = _strict_positive_int(num_ctx)
|
|
290
|
+
check(
|
|
291
|
+
report,
|
|
292
|
+
id="ollama.local.num_ctx_invalid",
|
|
293
|
+
category="provider",
|
|
294
|
+
severity="error",
|
|
295
|
+
passed=not ctx_invalid,
|
|
296
|
+
skip=not local or (ctx is None and not ctx_invalid),
|
|
297
|
+
message=(
|
|
298
|
+
f"num_ctx must be a positive integer, got {num_ctx!r}"
|
|
299
|
+
if ctx_invalid
|
|
300
|
+
else (f"num_ctx is {ctx}" if ctx is not None else "num_ctx is unset")
|
|
301
|
+
),
|
|
302
|
+
field="model.num_ctx",
|
|
303
|
+
value=num_ctx,
|
|
304
|
+
remediation=(
|
|
305
|
+
f"Set a positive integer num_ctx (e.g. 8192), or omit it. See {_OLLAMA_LOCAL_DOCS}."
|
|
306
|
+
if ctx_invalid
|
|
307
|
+
else None
|
|
308
|
+
),
|
|
309
|
+
docs=_OLLAMA_LOCAL_DOCS,
|
|
310
|
+
)
|
|
311
|
+
large = ctx is not None and ctx > _OLLAMA_NUM_CTX_LARGE
|
|
312
|
+
check(
|
|
313
|
+
report,
|
|
314
|
+
id="ollama.local.num_ctx_large",
|
|
315
|
+
category="provider",
|
|
316
|
+
severity="warning",
|
|
317
|
+
passed=not large,
|
|
318
|
+
skip=not local or ctx is None or ctx_invalid,
|
|
319
|
+
message=(
|
|
320
|
+
f"num_ctx {ctx} is large for a local runner; prefill will be slow"
|
|
321
|
+
if large
|
|
322
|
+
else (f"num_ctx is {ctx}" if ctx is not None else "num_ctx is unset")
|
|
323
|
+
),
|
|
324
|
+
field="model.num_ctx",
|
|
325
|
+
value=ctx,
|
|
326
|
+
remediation=(
|
|
327
|
+
f"Pin a modest num_ctx (e.g. 8192). Do not copy context_window. See {_OLLAMA_LOCAL_DOCS}."
|
|
328
|
+
if large
|
|
329
|
+
else None
|
|
330
|
+
),
|
|
331
|
+
docs=_OLLAMA_LOCAL_DOCS,
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
|
|
195
335
|
def run_doctor(args: argparse.Namespace) -> int:
|
|
196
336
|
cwd = Path(args.cwd).expanduser().resolve() if args.cwd else None
|
|
197
337
|
config_path = resolve_config(args.config, cwd=cwd)
|
|
@@ -324,6 +464,19 @@ def run_doctor(args: argparse.Namespace) -> int:
|
|
|
324
464
|
skip=True,
|
|
325
465
|
)
|
|
326
466
|
|
|
467
|
+
thinking_raw = model.get("thinking_budget") if isinstance(model, dict) else None
|
|
468
|
+
if thinking_raw is None:
|
|
469
|
+
thinking_raw = "-1"
|
|
470
|
+
num_ctx_raw = model.get("num_ctx") if isinstance(model, dict) else None
|
|
471
|
+
model_name = str(model.get("name", "")).strip() if isinstance(model, dict) else ""
|
|
472
|
+
_add_ollama_local_checks(
|
|
473
|
+
report,
|
|
474
|
+
provider=provider,
|
|
475
|
+
model_name=model_name,
|
|
476
|
+
thinking_budget=thinking_raw,
|
|
477
|
+
num_ctx=num_ctx_raw,
|
|
478
|
+
)
|
|
479
|
+
|
|
327
480
|
runtime_cfg = doc.get("runtime") if isinstance(doc.get("runtime"), dict) else {}
|
|
328
481
|
port = int(runtime_cfg.get("port", 8080)) if isinstance(runtime_cfg, dict) else 8080
|
|
329
482
|
free = _port_free(port)
|
|
@@ -17,7 +17,7 @@ from monkeybot.core.config import (
|
|
|
17
17
|
validate_monkeybot_yaml_doc,
|
|
18
18
|
validate_provider_env,
|
|
19
19
|
)
|
|
20
|
-
from monkeybot.core.config.runtime_env import
|
|
20
|
+
from monkeybot.core.config.runtime_env import _flatten_config
|
|
21
21
|
from monkeybot.core.config.settings import ConfigError, normalize_model_provider
|
|
22
22
|
from monkeybot.core.config.yaml_loader import load_monkeybot_yaml_dict
|
|
23
23
|
from monkeybot.core.layout import resolve_agent_root
|
|
@@ -35,18 +35,7 @@ def _resolve_path(base: Path, rel: str) -> Path:
|
|
|
35
35
|
|
|
36
36
|
|
|
37
37
|
def _flatten_to_env(doc: dict[str, Any]) -> dict[str, str]:
|
|
38
|
-
out
|
|
39
|
-
for (section, key), env_name in ENV_MAP.items():
|
|
40
|
-
sec = doc.get(section)
|
|
41
|
-
if not isinstance(sec, dict) or key not in sec:
|
|
42
|
-
continue
|
|
43
|
-
raw = sec[key]
|
|
44
|
-
if raw is None:
|
|
45
|
-
continue
|
|
46
|
-
if isinstance(raw, bool):
|
|
47
|
-
out[env_name] = "true" if raw else "false"
|
|
48
|
-
else:
|
|
49
|
-
out[env_name] = str(raw)
|
|
38
|
+
out = _flatten_config(doc)
|
|
50
39
|
gcp = doc.get("gcp") if isinstance(doc.get("gcp"), dict) else {}
|
|
51
40
|
if isinstance(gcp, dict) and gcp.get("project_id"):
|
|
52
41
|
out["GCP_PROJECT_ID"] = str(gcp["project_id"])
|
|
@@ -78,7 +78,6 @@ def _spawn_combined_gateway(
|
|
|
78
78
|
env["MONKEYBOT_CONFIG"] = str(config_path)
|
|
79
79
|
env["PORT"] = str(port)
|
|
80
80
|
env.setdefault("LOG_LEVEL", "error")
|
|
81
|
-
env.setdefault("MONKEYBOT_TRANSCRIPT_ENABLED", "1")
|
|
82
81
|
log_file = tempfile.NamedTemporaryFile(
|
|
83
82
|
mode="w+",
|
|
84
83
|
prefix="monkeybot-gateway-",
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: browser
|
|
3
|
+
description: Control a real browser through the optional bundled browser MCP server.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Browser
|
|
7
|
+
|
|
8
|
+
When browser tools are needed, call `enable_mcp("browser")` first. Use the
|
|
9
|
+
name from the harness MCP catalog — do not read config files. Progressive
|
|
10
|
+
disclosure still requires `enable_mcp` before `browser__*` schemas are advertised.
|
|
11
|
+
|
|
12
|
+
Use indexed DOM tools before screenshots. Prefer `browser_act` with
|
|
13
|
+
`do: fill_form` for multi-field forms, `browser_click_text` when the visible
|
|
14
|
+
label is known, `browser_act` for a batch of steps, and `browser_extract` for
|
|
15
|
+
structured scraping. Browser screenshots (JPEG under
|
|
16
|
+
`browser/Screenshots/`) and agent-written playbooks are workspace data:
|
|
17
|
+
`browser/Screenshots/` and `browser/playbooks/`.
|
|
18
|
+
They are not trusted skills and may be discarded with an ephemeral workspace.
|
|
19
|
+
|
|
20
|
+
If `browser_list_playbooks` returns `flows`, call `browser_run_playbook` instead of
|
|
21
|
+
re-planning. On `failed_step`, continue by hand and append a corrected
|
|
22
|
+
`playbook` YAML fence. Secrets only via `{do: login, expected_origin}`.
|
|
23
|
+
|
|
24
|
+
`browser_input_by_index` fills in-page by default; pass `mode="keys"` for
|
|
25
|
+
comboboxes and fields that only listen to keydown. `browser_get_elements`
|
|
26
|
+
is viewport-first; indices remain valid until navigation. Actions return
|
|
27
|
+
an `observation` (diff by default) — read that instead of calling
|
|
28
|
+
`get_elements` again. `browser_goto` returns a full observation.
|
|
29
|
+
Use `browser_get_text` to read page copy.
|
|
30
|
+
|
|
31
|
+
When the user asked to sign in on the Spaces in-app browser, call
|
|
32
|
+
`browser_login` instead of typing a password. It returns `{ok, loggedIn, origin}`
|
|
33
|
+
only. Pass `expected_origin` so a login cannot land on the wrong site, and check
|
|
34
|
+
the returned `origin` before reporting success.
|
|
35
|
+
|
|
36
|
+
Tabs use aliases (`t1`, `t2`, …). Reads (`get_elements`, `page_info`, `js`,
|
|
37
|
+
`read_tabs`) never move focus; actions do. At most five agent-controlled tabs —
|
|
38
|
+
if you hit the cap, ask the user which to close, then `browser_close_tab`. Close
|
|
39
|
+
tabs you opened. `browser_login` still targets the tab the user has focused.
|
|
40
|
+
|
|
41
|
+
Finish browser sessions with `browser_stop`.
|
{monkeybot-3.0.4 → monkeybot-3.1.0}/cli/src/monkeybot_cli/scaffold_defaults/monkeybot.example.yaml
RENAMED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
#
|
|
3
3
|
# cp monkeybot_config/monkeybot.example.yaml monkeybot_config/monkeybot.yaml
|
|
4
4
|
#
|
|
5
|
-
# Precedence: environment variables (and optional root `.env`) win over values here
|
|
5
|
+
# Precedence: environment variables (and optional root `.env`) win over values here
|
|
6
|
+
# except ``model.*`` (provider, name, temperature, max_tokens, thinking_budget,
|
|
7
|
+
# context_window, summarization_model, max_turns, cache_retention) which are YAML-only.
|
|
6
8
|
#
|
|
7
9
|
# Secrets are not committed here. Create a `.env` in the repo root when you need keys or
|
|
8
10
|
# machine-local paths, for example:
|
|
@@ -29,7 +31,7 @@ runtime:
|
|
|
29
31
|
# Internal debugging only (not agent-visible): write every AgentEvent and raw
|
|
30
32
|
# provider request/response for each session to
|
|
31
33
|
# {workspace_root}/.monkeybot/transcripts/{UTC}_{session_id}/transcript.ndjson.
|
|
32
|
-
# (
|
|
34
|
+
# YAML-only (not overridable via environment).
|
|
33
35
|
transcript_enabled: true
|
|
34
36
|
|
|
35
37
|
# Required: choose the conversational harness for this deployment.
|
|
@@ -45,7 +47,7 @@ realtime:
|
|
|
45
47
|
# Optional model override for the realtime session. Live-only models (e.g.
|
|
46
48
|
# gemini-3.1-flash-live-preview) cannot be used for turn-based work, so the
|
|
47
49
|
# realtime session can point to a different model than model.name. When omitted,
|
|
48
|
-
# the realtime session falls back to model.name and
|
|
50
|
+
# the realtime session falls back to model.name and model.provider.
|
|
49
51
|
# model:
|
|
50
52
|
# name: gemini-3.1-flash-live-preview
|
|
51
53
|
# provider: google_genai
|
|
@@ -98,10 +100,16 @@ model:
|
|
|
98
100
|
# Summarisation trigger (tokens). Also drives soft-spill / read_file char budgets.
|
|
99
101
|
context_window: 1000000
|
|
100
102
|
max_turns: 1000
|
|
101
|
-
# Prompt-cache session hints: none | short | long (
|
|
103
|
+
# Prompt-cache session hints: none | short | long (YAML-only)
|
|
102
104
|
# cache_retention: short
|
|
103
|
-
# Optional cheaper model for sync history summarization
|
|
105
|
+
# Optional cheaper model for sync history summarization; omit = main model
|
|
104
106
|
# summarization_model: gemini-3-flash
|
|
107
|
+
# Ollama-local only (YAML). Default 24h so the KV prefix cache survives idle.
|
|
108
|
+
# Set "0" to omit. Distinct from the Ollama daemon env OLLAMA_KEEP_ALIVE.
|
|
109
|
+
# keep_alive: 24h
|
|
110
|
+
# Ollama-local only (YAML). Pin llama num_ctx; omit = server default.
|
|
111
|
+
# Do NOT copy context_window here — that budget is summarization/spill, often 1M.
|
|
112
|
+
# num_ctx: 8192
|
|
105
113
|
|
|
106
114
|
# Non-secret GCP identifiers (prefer .env for secrets / ADC path).
|
|
107
115
|
# gcp:
|
|
@@ -127,8 +135,6 @@ memory:
|
|
|
127
135
|
backend: chroma
|
|
128
136
|
embedding_model: embeddinggemma-300m
|
|
129
137
|
|
|
130
|
-
# context_curation is unused after MemPalace wake-up replaced INDEX.md + curator.
|
|
131
|
-
|
|
132
138
|
emission:
|
|
133
139
|
# Terse emission-style guidance injected into the cached harness prefix.
|
|
134
140
|
# Two named modes:
|
|
@@ -247,7 +253,7 @@ scheduler:
|
|
|
247
253
|
# Env override: MONKEYBOT_SCHEDULER_ENABLED (1 | true | yes | on).
|
|
248
254
|
enabled: false
|
|
249
255
|
|
|
250
|
-
# Optional JSON for
|
|
256
|
+
# Optional JSON for model.provider: fake tests (env: MONKEYBOT_FAKE_PROVIDER_EVENTS)
|
|
251
257
|
# fake_provider:
|
|
252
258
|
# events_json: '[[]]'
|
|
253
259
|
|
|
@@ -25,6 +25,11 @@ def _free_port() -> int:
|
|
|
25
25
|
def test_chat_repl_round_trip_with_fake_gateway(tmp_path: Path) -> None:
|
|
26
26
|
port = _free_port()
|
|
27
27
|
base = f"http://127.0.0.1:{port}"
|
|
28
|
+
(tmp_path / "monkeybot_config").mkdir()
|
|
29
|
+
(tmp_path / "monkeybot_config" / "monkeybot.yaml").write_text(
|
|
30
|
+
"model:\n provider: fake\n name: fake\n",
|
|
31
|
+
encoding="utf-8",
|
|
32
|
+
)
|
|
28
33
|
agent = tmp_path / "AGENT.md"
|
|
29
34
|
agent.write_text("# Test agent\nYou are a test assistant.\n", encoding="utf-8")
|
|
30
35
|
policy = tmp_path / "command_allowlist.yaml"
|
|
@@ -40,7 +45,6 @@ def test_chat_repl_round_trip_with_fake_gateway(tmp_path: Path) -> None:
|
|
|
40
45
|
"DB_URL": f"sqlite:///{tmp_path / 'mb.db'}",
|
|
41
46
|
"MCP_CONFIG": str(tmp_path / "no_mcp.json"),
|
|
42
47
|
"MEMORY_PATH": str(tmp_path / "memory"),
|
|
43
|
-
"MODEL_PROVIDER": "fake",
|
|
44
48
|
"PORT": str(port),
|
|
45
49
|
"SKILLS_PATH": str(tmp_path / "skills"),
|
|
46
50
|
"MONKEYBOT_CHAT_PLAIN": "1",
|