monkeybot 3.5.0__tar.gz → 3.6.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.5.0 → monkeybot-3.6.0}/CHANGELOG.md +12 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/PKG-INFO +1 -1
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/chat_session.py +36 -1
- {monkeybot-3.5.0 → monkeybot-3.6.0}/pyproject.toml +1 -1
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/context/__init__.py +26 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/events.py +32 -0
- monkeybot-3.6.0/src/monkeybot/core/tools/ask_user.py +75 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/core_tool_executor.py +27 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/models.py +6 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/routes.py +39 -0
- monkeybot-3.6.0/tests/core/test_ask_user.py +61 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_context.py +1 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_events.py +11 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/.dockerignore +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/.github/workflows/ci.yml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/.github/workflows/live-eval-smoke.yml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/.github/workflows/prepare-release.yml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/.github/workflows/publish-release.yml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/.gitignore +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/.pre-commit-config.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/BACKLOG.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/CONTRIBUTING.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/LICENSE +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/README.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/pyproject.toml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/skills/monkeybot/SKILL.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/skills/monkeybot/references/config-sections.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/chat_file_index.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/chat_local_shell.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/chat_renderer.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/chat_status_bar.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/chat_theme.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/chat_tool_display.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/chat_tui.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/chat_tui_widgets.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/commands/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/commands/chat.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/commands/doctor.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/commands/loop.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/commands/new.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/commands/refresh.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/commands/run_cmd.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/commands/talk.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/commands/validate.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/compat.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/config_resolve.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/exit_commands.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/extras_catalog.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/gateway_health.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/main.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/opensandbox_lifecycle.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/output.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/process_tree.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/providers.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/realtime/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/realtime/audio_io.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/realtime/client.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/realtime/gateway_manager.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/realtime/push_to_talk.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/realtime/session.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/realtime/session_controller.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/realtime/talk_ui.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/realtime/wire_encode.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/runtime_python.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/AGENT.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/Dockerfile +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/browser/SKILL.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/command_allowlist.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/dockerignore +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/env.example +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/goal/SKILL.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/image-generator/SKILL.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/image-generator/generate_image.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/loop/SKILL.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/mcp.json +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/monkeybot.example.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/opensandbox.docker.toml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/otel-collector.example.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/permissions.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/session_controller.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/terminal_markdown.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_chat_continue.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_chat_e2e.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_chat_errors.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_chat_file_index.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_chat_grounding.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_chat_local_shell.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_chat_renderer_parity.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_chat_session.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_chat_status_bar.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_chat_theme.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_chat_tool_display.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_chat_tui.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_cli.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_config_resolve.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_doctor.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_extras_catalog.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_gateway_health.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_opensandbox_lifecycle.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_realtime_session_controller.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_run_cmd.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_runtime_python.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_scaffold.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/tests/test_terminal_markdown.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/cli/uv.lock +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docker/Dockerfile +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docker/demo-model.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docker/demo.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docker/docker-compose.sandbox.yml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docker/opensandbox.docker.toml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docker/sandbox.Dockerfile +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docker-compose.yml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/agent-layout.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/assets/logo.png +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/browser-mcp-perf-baseline.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/browser-mcp-performance-plan.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/browser-mcp.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/cloud-deployment-design.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/deploy-aws-agentcore.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/deploy-pattern-a-container.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/deploy-pattern-b-serverless.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/deploy-pattern-c-agent-platform.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/deploy-pattern-d-realtime.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/features.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/getting-started.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/knowledge-layer-fixes.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/live-evals.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/mcp.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/memory-graph-split-plan.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/migrations/agent-scope-namespacing.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/migrations/memory-outbox.sql +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/observability-runbook.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/ollama-local.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/otel-collector.example.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/progressive-loop-tools.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/progressive-mcp-tools.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/skills.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/spill-dynamic-design.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/sse-gateway-ui.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/verifier-agent-design.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/docs/workspace-index-design.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/TEST_COVERAGE.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/assertions.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/baselines/smoke.json +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/baselines/smoke.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/diff.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/eval_config.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/models.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/persistence.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/report.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/runner.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/scenario_loader.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/scenarios/context/summarization_trigger.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/scenarios/drift/declares_done.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/scenarios/drift/path_constraint.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/scenarios/drift/preempt.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/scenarios/drift/repeat_correction.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/scenarios/drift/supersession.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/scenarios/mcp/get_prompt.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/scenarios/mcp/list_resources.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/scenarios/mcp/tool_invoke.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/scenarios/memory/recall_cross_session.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/scenarios/memory/recall_single_session.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/scenarios/multi_turn/task_tracking.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/scenarios/skills/skill_invocation.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/scenarios/subagents/dispatch_complete.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/scenarios/tools/core_read.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/scenarios/tools/core_read_error.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/scenarios/tools/core_run_command.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/scenarios/tools/core_run_command_sandbox.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/scenarios/tools/core_write.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/scorer.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/smoke_agent/.env.example +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/smoke_agent/.gitignore +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/smoke_agent/fixture_mcp_server.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/smoke_agent/monkeybot_config/AGENT.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/smoke_agent/monkeybot_config/command_allowlist.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/smoke_agent/monkeybot_config/mcp.json +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/smoke_agent/monkeybot_config/monkeybot.verifier-on.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/smoke_agent/monkeybot_config/monkeybot.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/smoke_agent/monkeybot_config/permissions.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/smoke_agent/pyproject.toml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/smoke_agent/skills/browser/SKILL.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/smoke_agent/uv.lock +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/smoke_agent/workspace/.gitkeep +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/smoke_agent/workspace/skills/browser/playbooks/.gitkeep +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/suites/drift.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/suites/smoke.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/test_assertions.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/test_diff.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/test_judge.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/test_report.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/test_runner_sse.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/evals/test_scorer.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/examples/README.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/examples/agentcore/handler.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/examples/agentcore/runtime_app.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/examples/agentengine/handler.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/examples/cloud-functions/main.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/examples/lambda/handler.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/examples/ollama/PrefixStable.Modelfile +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/examples/skills/browser/SKILL.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/examples/skills/browser/playbooks/.gitkeep +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/examples/skills/diagnostics/README.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/examples/skills/diagnostics/SKILL.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/examples/skills/diagnostics/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/examples/skills/diagnostics/diagnostics.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/examples/skills/image-generator/SKILL.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/examples/skills/image-generator/generate_image.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/pyproject.toml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/scripts/agentcore_smoke.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/scripts/dump_tool_surface.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/scripts/perf_bench.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/actions.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/agentcore.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/app.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/assets/NOTICE.md +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/assets/dom_tree.js +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/assets/pa_driver.js +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/backend.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/chat_scope.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/dom_indexing.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/in_app_cdp.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/login.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/observe.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/perf.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/playbooks.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/playwright_helpers.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/results.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/screenshots.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/server.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/tab_ops.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/tabs.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/tools/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/tools/batch.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/tools/capture.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/tools/interact.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/tools/navigate.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/tools/playbook.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/tools/read.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/src/browser_mcp/tools/tab_control.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/fixtures/api.json +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/fixtures/article.html +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/fixtures/cards.html +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/fixtures/form.html +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/fixtures/long_list.html +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/fixtures/spa.html +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/fixtures/tool_surface.json +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/integration/conftest.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/integration/test_act_observe.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/integration/test_driver_persist.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/integration/test_intent_tools.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/integration/test_multi_tab.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/integration/test_observation.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/integration/test_run_playbook.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/integration/test_wait_for.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_act.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_agentcore.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_chat_scope.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_dom_indexing.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_fill_form.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_in_app_cdp.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_indexed_tools.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_observe.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_observe_after.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_perf.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_playbook_flows.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_playbooks.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_playwright_helpers.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_screenshots.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_server_shutdown.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_tabs.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_tool_surface.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/tests/test_wait_tools.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/integrations/browser-mcp/uv.lock +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/pytest.ini +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/scripts/create_schema.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/scripts/precommit-pytest.sh +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/scripts/release.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/scripts/smoke_global_cli.sh +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/cli/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/cli/__main__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/cli/audio_io.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/cli/gateway_manager.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/cli/main.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/cli/push_to_talk.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/cli/realtime_client.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/computer/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/computer/approvals.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/computer/permissions.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/computer/safety.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/computer/tools.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/attachments/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/attachments/catalog.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/attachments/config.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/attachments/freeze.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/attachments/image_preview.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/attachments/resolve.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/attachments/store.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/attachments/text.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/attachments/tools.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/bootstrap.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/config/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/config/realtime_config.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/config/runtime_env.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/config/settings.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/config/snapshot.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/config/validation.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/config/yaml_loader.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/context/campaign_context.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/context/common.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/context/epoch.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/context/secret_egress.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/context/slash_skills.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/context/tool_output_policy.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/context/tool_result_ingress.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/context/tool_shapers.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/goals/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/goals/service.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/hooks/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/captions.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/chunking.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/config.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/embeddings/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/embeddings/base.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/embeddings/factory.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/embeddings/gemini.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/embeddings/nvidia.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/embeddings/openai_compat.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/embeddings/sanitize.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/evidence_guard.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/extractors.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/fusion.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/hook.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/indexer.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/links.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/salience.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/sqlite_index.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/subsystem.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/tool.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/knowledge/types.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/layout.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/llm/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/llm/provider.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/llm/realtime_provider.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/llm/usage.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/lockfile_names.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/logging_utils.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/mcp/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/mcp/mcp_client.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/mcp/ports_mcp.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/config.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/hook.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/ids.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/ingest.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/migrate_layout.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/observability.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/outbox.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/palace.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/subsystem.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/uri.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/memory/writer.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/messages/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/messages/convert_provider.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/messages/tool_integrity.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/messages/transform_context.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/path_safety.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/backends.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/db.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/durable_runs.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/errors.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/firestore.indexes.json +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/firestore.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/firestore_scheduled_loops.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/goal_ledger.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/history.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/postgres.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/runs.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/scheduled_loops.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/session_turn_locks.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/sqlite.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/sqlite_backend.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/sqlite_vector.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/thread_summary.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/transcript.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/usage.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/persistence/usage_buckets.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/prompts/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/prompts/harness_prompt.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/prompts/headings.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/prompts/prompt.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/context_budget.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/doom_loop.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/history_compaction.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/input_admission.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/loop.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/loop_hooks.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/loop_messages.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/loop_ports.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/loop_usage.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/provider_stream_mapper.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/realtime_loop.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/tool_batch.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/tool_dispatch.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/turn_loop.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/runtime/utterance_buffer.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/subagents/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/subagents/progress_publish.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/subagents/subagent_proto.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/subagents/subagent_worker.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/subagents/worker_pool.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/subprocess_groups.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/testing/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/testing/mocks_provider.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/testing/mocks_realtime_provider.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/fs_isolation.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/grant_store.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/inspector.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/loop_inspector.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/patch.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/path_grant_inspector.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/permission.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/sandbox_executor.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/spill_inventory.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/terminal.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/text_normalize.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/tool_hint.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/tool_kind.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/types.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/tools/workspace_service.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/types/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/types/content_blocks.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/types/interfaces.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/types/types_tools.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/verifier/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/verifier/actuator.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/verifier/binding.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/verifier/classify.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/verifier/inspector.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/verifier/intervention.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/verifier/judge.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/verifier/ledger.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/verifier/mailbox.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/verifier/match.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/verifier/port.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/verifier/severity.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/verifier/tracker.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/workspace/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/workspace/factory.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/workspace/gcs.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/workspace/local.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/workspace/protocol.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/workspace/s3.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/core/workspace_layout.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/bootstrap.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/main.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/pending_response_bus.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime/app.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime/deps.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime/errors.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime/guardrails.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime/manager.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime/metrics.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime/routes.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime/session.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime/wire.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/realtime_main.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/app.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/goal_routes.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/loop_port.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/reload.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/reply_body.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/request_storage.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/scheduler_routes.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/scheduler_wiring.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/session_bus.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/sse.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/gateway/sse/workspace_layout.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/observability/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/observability/_state.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/observability/instrumentation.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/observability/propagation.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/observability/spans.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/observability/sqlite_exporter.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/providers/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/providers/_bedrock_converse.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/providers/_openai_compat.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/providers/_utils.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/providers/bedrock.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/providers/claude.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/providers/gemini.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/providers/gemini_live.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/providers/huggingface.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/providers/model_capabilities.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/providers/nvidia.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/providers/ollama.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/providers/openai.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/providers/openrouter.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/providers/pricing.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/providers/request_budget.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/providers/sampling.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/providers/vertex_claude.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/scaffold/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/scheduler/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/scheduler/__main__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/scheduler/engine.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/scheduler/http_invoker.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/scheduler/interval.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/scheduler/tick_result.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/scheduler/worker.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/subagents/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/subagents/worker/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/subagents/worker/__main__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/todo_list/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/todo_list/store.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/todo_list/tool.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/web_search/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/web_search/backends/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/web_search/backends/duckduckgo.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/web_search/backends/firecrawl.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/web_search/backends/tavily.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/web_search/protocol.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/src/monkeybot/web_search/tool.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/acceptance/test_observability_acceptance.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/cli/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/cli/test_gateway_manager.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/cli/test_main.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/cli/test_push_to_talk.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/cli/test_realtime_client.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/computer/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/computer/test_approvals.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/computer/test_computer_tools.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/computer/test_package_init.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/computer/test_path_policy.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/computer/test_permissions.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/computer/test_subagent_exclusion.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/computer/test_wiring.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/conftest.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/fixtures/bitbucket_dc_style_pr.diff +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/memory/helpers.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/memory/in_memory_palace.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/memory/test_mempalace.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/memory/test_review_fixes.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_agent_layout.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_attachment_freeze.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_attachment_store.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_bootstrap.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_config_extensions.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_content_blocks.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_context_budget.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_context_epoch.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_core_tool_executor.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_doom_loop.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_durable_events.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_durable_runs.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_empty_completion.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_env_map_grep_gates.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_evidence_guard.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_firestore_history.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_firestore_scheduled_loops.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_firestore_usage.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_fs_isolation.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_gemini_history_replay.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_goal_ledger.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_goal_persistence.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_goals.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_grant_store.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_harness_prompt.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_history.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_history_compaction_split.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_hooks.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_image_preview.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_input_admission.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_inspector.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_knowledge_chunking.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_knowledge_chunking_rank.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_knowledge_config.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_knowledge_embeddings.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_knowledge_fts.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_knowledge_fusion.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_knowledge_fusion_ann.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_knowledge_hook.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_knowledge_indexer.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_knowledge_links.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_knowledge_media.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_knowledge_salience.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_knowledge_single_writer.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_knowledge_subsystem.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_knowledge_vectors.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_layout.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_logging_utils.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_loop.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_loop_hooks.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_loop_observability.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_loop_transcript.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_mcp_client.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_memory_layout_migrate.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_message_pipeline.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_mocks_realtime_provider.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_patch.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_path_grant_inspector.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_path_safety.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_permission.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_pricing.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_progress_publish.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_progress_tracker.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_prompt.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_provider_contract.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_provider_stream_mapper.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_realtime_loop.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_replace_fuzzy.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_run_command_parse.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_runs.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_runtime_config_snapshot.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_runtime_env.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_sandbox_executor.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_scheduled_loops.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_secret_egress.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_session_turn_locks.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_settlement.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_slash_skills.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_spill_dynamic.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_spill_inventory.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_storage_backends.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_subagent_proto.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_subagent_trace_propagation.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_subagent_worker_paths.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_terminal.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_thread_summary_wire.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_tool_def_schema.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_tool_integrity.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_tool_result_ingress.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_tool_shapers.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_transcript.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_truncated_tool_batch.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_usage.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_usage_migration.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_utterance_buffer.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_verifier_binding.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_verifier_inspector.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_verifier_judge.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_verifier_mailbox_lifecycle.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_verifier_sticky_nudge.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_worker_pool.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_workspace_extra_read_roots.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_workspace_layout.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_workspace_symlinks.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/test_workspace_write_scope.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/workspace/test_factory.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/workspace/test_local_storage.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/core/workspace/test_protocol_contract.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/evals/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/evals/eval_hook.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/evals/scenario_runner.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/evals/scenarios/memory_wake_up_large.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/evals/scenarios/memory_write_inject.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/evals/scenarios/subagent_roundtrip.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_glob_grep.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_load_file.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_loops.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_read.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_replace_apply_patch.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_run_command.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_search_knowledge.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_search_memory.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_todo_list.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_web_search.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/evals/scenarios/tool_write.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/evals/scenarios/turn_completion.yaml +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/evals/test_agent_behavior.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/evals/test_memory_knowledge_routing.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/evals/test_verifier_port.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/realtime/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/realtime/test_app.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/realtime/test_deps.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/realtime/test_guardrails.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/realtime/test_manager.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/realtime/test_metrics.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/realtime/test_routes_client_text.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/realtime/test_session.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/realtime/test_wire.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/sse/test_attachments.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/sse/test_config_reload.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/sse/test_create_session_model.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/sse/test_gateway_runtime.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/sse/test_routes.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/sse/test_scheduler_routes.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/sse/test_session_bus.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/sse/test_transcript_wiring.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/test_otel_fastapi.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/test_otel_lifespan.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/test_pending_response_endpoints.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/test_realtime_main.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/test_resolve_provider.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/test_sse_events.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/gateway/test_subagent_event_publisher.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/integration/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/integration/test_mb_e2e_simple_reply.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/integration/test_observability_integration.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/integration/test_prompt_caching_integration.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/observability/conftest.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/observability/test_init.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/observability/test_instrumentation.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/observability/test_loop_hook_spans.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/observability/test_propagation.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/observability/test_span_contract.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/observability/test_spans.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/observability/test_sqlite_exporter.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/observability/test_truncate.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/observability/test_turn_complete_trace.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/conftest.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/test_anthropic_cache.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/test_anthropic_history.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/test_bedrock_converse.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/test_bedrock_estimate.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/test_gemini_history.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/test_gemini_live.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/test_gemini_usage.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/test_huggingface.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/test_model_capabilities.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/test_nvidia.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/test_ollama.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/test_openai_byte_budget.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/test_openai_compat_usage.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/test_openai_history.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/test_pricing.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/test_request_budget.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/test_safe_parse_tool_args.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/test_sampling.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/test_sonnet5_sampling.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/test_source_grep_gates.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/providers/test_vertex_claude_history.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/scheduler/test_engine.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/scheduler/test_interval.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/skills/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/skills/test_generate_image_script.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/test_cold_start.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/test_packaging_config.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/test_release_script.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/todo_list/test_todo_list.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/web_search/__init__.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/tests/web_search/test_web_search.py +0 -0
- {monkeybot-3.5.0 → monkeybot-3.6.0}/uv.lock +0 -0
|
@@ -6,6 +6,18 @@ the project adheres to [Semantic Versioning](https://semver.org/).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
### CLI
|
|
10
|
+
|
|
11
|
+
#### Added
|
|
12
|
+
|
|
13
|
+
- `monkeybot chat` prompts for an `ask_user` question and posts the reply to the gateway.
|
|
14
|
+
|
|
15
|
+
## [core v3.6.0] - 2026-09-21
|
|
16
|
+
|
|
17
|
+
#### Added
|
|
18
|
+
|
|
19
|
+
- `ask_user` asks the user a question, with an optional list of two to six choices, and waits for the posted answer before the tool returns.
|
|
20
|
+
|
|
9
21
|
## [core v3.5.0] - 2026-09-20
|
|
10
22
|
|
|
11
23
|
### Added
|
|
@@ -16,6 +16,7 @@ from typing import Any, Literal
|
|
|
16
16
|
import httpx
|
|
17
17
|
from monkeybot.core.runtime.events import (
|
|
18
18
|
ActionRequiredEvent,
|
|
19
|
+
AskUserRequestEvent,
|
|
19
20
|
AssistantDelta,
|
|
20
21
|
ContextSummarized,
|
|
21
22
|
ContextSummarizing,
|
|
@@ -41,7 +42,12 @@ HitlReaderFn = Callable[["HitlRequest"], Any] # async (HitlRequest) -> HitlAnsw
|
|
|
41
42
|
|
|
42
43
|
HitlKind = Literal["confirm", "elicit", "frontend_unsupported"]
|
|
43
44
|
|
|
44
|
-
_HITL_TYPES = (
|
|
45
|
+
_HITL_TYPES = (
|
|
46
|
+
ToolConfirmationRequestEvent,
|
|
47
|
+
AskUserRequestEvent,
|
|
48
|
+
ActionRequiredEvent,
|
|
49
|
+
FrontendToolRequestEvent,
|
|
50
|
+
)
|
|
45
51
|
|
|
46
52
|
_RECONNECT_INITIAL_DELAY = 0.5
|
|
47
53
|
_RECONNECT_MAX_DELAY = 15.0
|
|
@@ -717,6 +723,9 @@ class ChatSessionController:
|
|
|
717
723
|
if isinstance(evt, ToolConfirmationRequestEvent):
|
|
718
724
|
await self._handle_tool_confirm(evt)
|
|
719
725
|
return
|
|
726
|
+
if isinstance(evt, AskUserRequestEvent):
|
|
727
|
+
await self._handle_ask_user(evt)
|
|
728
|
+
return
|
|
720
729
|
if isinstance(evt, ActionRequiredEvent):
|
|
721
730
|
await self._handle_elicit(evt)
|
|
722
731
|
|
|
@@ -753,6 +762,32 @@ class ChatSessionController:
|
|
|
753
762
|
if answer.cancelled or not ok:
|
|
754
763
|
self._turn_abort.set()
|
|
755
764
|
|
|
765
|
+
async def _handle_ask_user(self, evt: AskUserRequestEvent) -> None:
|
|
766
|
+
assert self.session_id is not None
|
|
767
|
+
choices = "\n".join(f"- {choice}" for choice in evt.choices)
|
|
768
|
+
prompt = evt.question or "The agent asked a question."
|
|
769
|
+
if choices:
|
|
770
|
+
prompt = f"{prompt}\n{choices}"
|
|
771
|
+
answer = await self._await_hitl(
|
|
772
|
+
HitlRequest(
|
|
773
|
+
kind="elicit",
|
|
774
|
+
prompt=prompt,
|
|
775
|
+
tool_call_id=evt.tool_call_id,
|
|
776
|
+
tool_name="ask_user",
|
|
777
|
+
)
|
|
778
|
+
)
|
|
779
|
+
text = "" if answer.cancelled else answer.text.strip()
|
|
780
|
+
if not text:
|
|
781
|
+
self.abort_turn()
|
|
782
|
+
return
|
|
783
|
+
ok = await self._post_hitl(
|
|
784
|
+
f"{self.base}/sessions/{self.session_id}/ask-user/{evt.tool_call_id}",
|
|
785
|
+
{"answer": text},
|
|
786
|
+
label="Ask user",
|
|
787
|
+
)
|
|
788
|
+
if not ok:
|
|
789
|
+
self.abort_turn()
|
|
790
|
+
|
|
756
791
|
async def _handle_elicit(self, evt: ActionRequiredEvent) -> None:
|
|
757
792
|
assert self.session_id is not None
|
|
758
793
|
payload = dict(evt.payload) if evt.payload else {}
|
|
@@ -691,6 +691,32 @@ def _core_tool_defs(
|
|
|
691
691
|
"required": ["task"],
|
|
692
692
|
}
|
|
693
693
|
tools: list[ToolDef] = [
|
|
694
|
+
ToolDef(
|
|
695
|
+
"ask_user",
|
|
696
|
+
(
|
|
697
|
+
"Ask the user a question and wait for their answer. Call this when you "
|
|
698
|
+
"need a decision before you can continue. Pass choices when a short list "
|
|
699
|
+
"of answers would help. Call it once, then wait. Do not invent the answer."
|
|
700
|
+
),
|
|
701
|
+
{
|
|
702
|
+
"type": "object",
|
|
703
|
+
"properties": {
|
|
704
|
+
"question": {
|
|
705
|
+
"type": "string",
|
|
706
|
+
"minLength": 1,
|
|
707
|
+
"description": "The question to show the user.",
|
|
708
|
+
},
|
|
709
|
+
"choices": {
|
|
710
|
+
"type": "array",
|
|
711
|
+
"minItems": 2,
|
|
712
|
+
"maxItems": 6,
|
|
713
|
+
"items": {"type": "string", "minLength": 1},
|
|
714
|
+
"description": "Optional distinct answers the user can pick.",
|
|
715
|
+
},
|
|
716
|
+
},
|
|
717
|
+
"required": ["question"],
|
|
718
|
+
},
|
|
719
|
+
),
|
|
694
720
|
ToolDef(
|
|
695
721
|
"run_command",
|
|
696
722
|
(
|
|
@@ -190,6 +190,15 @@ class ToolConfirmationRequestEvent:
|
|
|
190
190
|
prompt: str | None = None
|
|
191
191
|
|
|
192
192
|
|
|
193
|
+
@dataclass(frozen=True)
|
|
194
|
+
class AskUserRequestEvent:
|
|
195
|
+
kind: Literal["AskUserRequest"] = "AskUserRequest"
|
|
196
|
+
request_id: str = ""
|
|
197
|
+
tool_call_id: str = ""
|
|
198
|
+
question: str = ""
|
|
199
|
+
choices: tuple[str, ...] = ()
|
|
200
|
+
|
|
201
|
+
|
|
193
202
|
@dataclass(frozen=True)
|
|
194
203
|
class ActionRequiredEvent:
|
|
195
204
|
kind: Literal["ActionRequiredEvent"] = "ActionRequiredEvent"
|
|
@@ -469,6 +478,7 @@ AgentEvent: TypeAlias = (
|
|
|
469
478
|
| ThinkingBlockComplete
|
|
470
479
|
| RedactedThinkingBlock
|
|
471
480
|
| ToolConfirmationRequestEvent
|
|
481
|
+
| AskUserRequestEvent
|
|
472
482
|
| ActionRequiredEvent
|
|
473
483
|
| FrontendToolRequestEvent
|
|
474
484
|
| SystemNotificationEvent
|
|
@@ -697,6 +707,13 @@ def _story5_event_dict(event: AgentEvent) -> dict[str, object]:
|
|
|
697
707
|
"arguments": dict(event.arguments),
|
|
698
708
|
"prompt": event.prompt,
|
|
699
709
|
}
|
|
710
|
+
if isinstance(event, AskUserRequestEvent):
|
|
711
|
+
return {
|
|
712
|
+
**base,
|
|
713
|
+
"tool_call_id": event.tool_call_id,
|
|
714
|
+
"question": event.question,
|
|
715
|
+
"choices": list(event.choices),
|
|
716
|
+
}
|
|
700
717
|
if isinstance(event, ActionRequiredEvent):
|
|
701
718
|
return {
|
|
702
719
|
**base,
|
|
@@ -877,6 +894,7 @@ def event_to_json(event: AgentEvent) -> str:
|
|
|
877
894
|
ThinkingBlockComplete,
|
|
878
895
|
RedactedThinkingBlock,
|
|
879
896
|
ToolConfirmationRequestEvent,
|
|
897
|
+
AskUserRequestEvent,
|
|
880
898
|
ActionRequiredEvent,
|
|
881
899
|
FrontendToolRequestEvent,
|
|
882
900
|
SystemNotificationEvent,
|
|
@@ -1097,6 +1115,20 @@ def _event_from_dict(payload: dict[str, Any]) -> AgentEvent:
|
|
|
1097
1115
|
arguments=arguments,
|
|
1098
1116
|
prompt=prompt,
|
|
1099
1117
|
)
|
|
1118
|
+
if t == "AskUserRequest":
|
|
1119
|
+
call_raw = payload.get("tool_call_id", "")
|
|
1120
|
+
question_raw = payload.get("question", "")
|
|
1121
|
+
choices_raw = payload.get("choices", [])
|
|
1122
|
+
if not isinstance(call_raw, str) or not isinstance(question_raw, str):
|
|
1123
|
+
raise EventDecodeError("AskUserRequest fields must be strings")
|
|
1124
|
+
if not isinstance(choices_raw, list) or any(not isinstance(item, str) for item in choices_raw):
|
|
1125
|
+
raise EventDecodeError("AskUserRequest choices must be a list of strings")
|
|
1126
|
+
return AskUserRequestEvent(
|
|
1127
|
+
request_id=rid,
|
|
1128
|
+
tool_call_id=call_raw,
|
|
1129
|
+
question=question_raw,
|
|
1130
|
+
choices=tuple(choices_raw),
|
|
1131
|
+
)
|
|
1100
1132
|
if t == "ActionRequiredEvent":
|
|
1101
1133
|
at_raw = payload.get("action_type", "elicitation")
|
|
1102
1134
|
if at_raw not in ("elicitation", "toolConfirmation", "elicitationResponse"):
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"""ask_user: a structured question the host answers before the tool returns."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from monkeybot.core.runtime.events import AskUserRequestEvent, event_to_json
|
|
8
|
+
|
|
9
|
+
_MAX_QUESTION = 2_000
|
|
10
|
+
_MAX_CHOICE = 160
|
|
11
|
+
_MIN_CHOICES = 2
|
|
12
|
+
_MAX_CHOICES = 6
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def parse_ask_user_args(args: dict[str, Any]) -> tuple[str, tuple[str, ...]] | str:
|
|
16
|
+
"""Return ``(question, choices)`` or an error string."""
|
|
17
|
+
raw_question = args.get("question")
|
|
18
|
+
question = raw_question.strip() if isinstance(raw_question, str) else ""
|
|
19
|
+
if not question:
|
|
20
|
+
return "ask_user requires a non-empty question"
|
|
21
|
+
if len(question) > _MAX_QUESTION:
|
|
22
|
+
question = question[:_MAX_QUESTION]
|
|
23
|
+
raw_choices = args.get("choices")
|
|
24
|
+
if raw_choices is None:
|
|
25
|
+
return question, ()
|
|
26
|
+
if not isinstance(raw_choices, list):
|
|
27
|
+
return "ask_user choices must be a list of strings"
|
|
28
|
+
choices: list[str] = []
|
|
29
|
+
for item in raw_choices:
|
|
30
|
+
if not isinstance(item, str) or not item.strip():
|
|
31
|
+
return "ask_user choices must be non-empty strings"
|
|
32
|
+
text = item.strip()
|
|
33
|
+
if len(text) > _MAX_CHOICE:
|
|
34
|
+
return "ask_user choices must be short"
|
|
35
|
+
if text in choices:
|
|
36
|
+
return "ask_user choices must be unique"
|
|
37
|
+
choices.append(text)
|
|
38
|
+
if len(choices) < _MIN_CHOICES or len(choices) > _MAX_CHOICES:
|
|
39
|
+
return f"ask_user choices must include {_MIN_CHOICES} to {_MAX_CHOICES} options"
|
|
40
|
+
return question, tuple(choices)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
async def await_ask_user_answer(
|
|
44
|
+
bus: Any,
|
|
45
|
+
*,
|
|
46
|
+
call_id: str,
|
|
47
|
+
request_id: str,
|
|
48
|
+
question: str,
|
|
49
|
+
choices: tuple[str, ...],
|
|
50
|
+
) -> str | None:
|
|
51
|
+
"""Publish the question and wait until the host posts an answer.
|
|
52
|
+
|
|
53
|
+
Returns the answer, or ``None`` when this session cannot ask.
|
|
54
|
+
``asyncio.CancelledError`` propagates when the turn is stopped.
|
|
55
|
+
"""
|
|
56
|
+
publish = getattr(bus, "publish_data", None)
|
|
57
|
+
register = getattr(bus, "register_pending", None)
|
|
58
|
+
if publish is None or register is None or not call_id:
|
|
59
|
+
return None
|
|
60
|
+
fut = register(call_id)
|
|
61
|
+
await publish(
|
|
62
|
+
event_to_json(
|
|
63
|
+
AskUserRequestEvent(
|
|
64
|
+
request_id=request_id,
|
|
65
|
+
tool_call_id=call_id,
|
|
66
|
+
question=question,
|
|
67
|
+
choices=choices,
|
|
68
|
+
)
|
|
69
|
+
)
|
|
70
|
+
)
|
|
71
|
+
payload = await fut
|
|
72
|
+
if not isinstance(payload, dict):
|
|
73
|
+
return ""
|
|
74
|
+
answer = payload.get("answer")
|
|
75
|
+
return answer.strip() if isinstance(answer, str) else ""
|
|
@@ -96,6 +96,7 @@ from monkeybot.core.subprocess_groups import (
|
|
|
96
96
|
process_group_id,
|
|
97
97
|
stop_subagent_process,
|
|
98
98
|
)
|
|
99
|
+
from monkeybot.core.tools.ask_user import await_ask_user_answer, parse_ask_user_args
|
|
99
100
|
from monkeybot.core.tools.fs_isolation import JailRoots, memory_hidden_paths
|
|
100
101
|
from monkeybot.core.tools.grant_store import PATH_GRANT_TOOLS, GrantStoreCache
|
|
101
102
|
from monkeybot.core.tools.inspector import parse_run_command
|
|
@@ -159,6 +160,7 @@ _CORE_TOOL_NAMES = frozenset(
|
|
|
159
160
|
"stop_loop",
|
|
160
161
|
"create_goal",
|
|
161
162
|
"update_goal",
|
|
163
|
+
"ask_user",
|
|
162
164
|
}
|
|
163
165
|
)
|
|
164
166
|
|
|
@@ -1173,6 +1175,8 @@ class CoreToolExecutor(ToolExecutorPort):
|
|
|
1173
1175
|
result_text, err_text = await self._tool_create_goal(args, ctx)
|
|
1174
1176
|
elif name == "update_goal":
|
|
1175
1177
|
result_text, err_text = await self._tool_update_goal(args, ctx)
|
|
1178
|
+
elif name == "ask_user":
|
|
1179
|
+
result_text, err_text = await self._tool_ask_user(args, call, ctx)
|
|
1176
1180
|
elif name in self._extra_tools:
|
|
1177
1181
|
try:
|
|
1178
1182
|
raw = await self._extra_tools[name].execute(args)
|
|
@@ -2508,3 +2512,26 @@ class CoreToolExecutor(ToolExecutorPort):
|
|
|
2508
2512
|
),
|
|
2509
2513
|
None,
|
|
2510
2514
|
)
|
|
2515
|
+
|
|
2516
|
+
async def _tool_ask_user(
|
|
2517
|
+
self, args: dict[str, Any], call: ToolCall, ctx: TurnContext
|
|
2518
|
+
) -> tuple[str | None, str | None]:
|
|
2519
|
+
parsed = parse_ask_user_args(args)
|
|
2520
|
+
if isinstance(parsed, str):
|
|
2521
|
+
return (None, parsed)
|
|
2522
|
+
question, choices = parsed
|
|
2523
|
+
bus = ctx.sse_bus
|
|
2524
|
+
if bus is None:
|
|
2525
|
+
return (None, "ask_user is only available in an interactive chat")
|
|
2526
|
+
answer = await await_ask_user_answer(
|
|
2527
|
+
bus,
|
|
2528
|
+
call_id=call.call_id,
|
|
2529
|
+
request_id=ctx.request_id,
|
|
2530
|
+
question=question,
|
|
2531
|
+
choices=choices,
|
|
2532
|
+
)
|
|
2533
|
+
if answer is None:
|
|
2534
|
+
return (None, "ask_user is only available in an interactive chat")
|
|
2535
|
+
if not answer:
|
|
2536
|
+
return (None, "ask_user received an empty answer")
|
|
2537
|
+
return (_j({"answer": answer}), None)
|
|
@@ -144,6 +144,12 @@ class ToolConfirmationPOST(BaseModel):
|
|
|
144
144
|
"""When true with approved, remember this tool+resource for the rest of the session."""
|
|
145
145
|
|
|
146
146
|
|
|
147
|
+
class AskUserPOST(BaseModel):
|
|
148
|
+
"""POST /sessions/{id}/ask-user/{tool_call_id} body."""
|
|
149
|
+
|
|
150
|
+
answer: str
|
|
151
|
+
|
|
152
|
+
|
|
147
153
|
class ElicitationPOST(BaseModel):
|
|
148
154
|
"""POST /sessions/{id}/elicitations/{id} body."""
|
|
149
155
|
|
|
@@ -48,6 +48,7 @@ from .models import (
|
|
|
48
48
|
AdmissionAcceptedResponse,
|
|
49
49
|
AgentUsageResponse,
|
|
50
50
|
APIError,
|
|
51
|
+
AskUserPOST,
|
|
51
52
|
AttachmentUploadResponse,
|
|
52
53
|
CancelRequest,
|
|
53
54
|
CreateSessionRequest,
|
|
@@ -1065,6 +1066,44 @@ def create_app(
|
|
|
1065
1066
|
)
|
|
1066
1067
|
return {"ok": True}
|
|
1067
1068
|
|
|
1069
|
+
@api.post("/sessions/{session_id}/ask-user/{tool_call_id}", status_code=202)
|
|
1070
|
+
async def post_ask_user(
|
|
1071
|
+
session_id: str,
|
|
1072
|
+
tool_call_id: str,
|
|
1073
|
+
body: AskUserPOST,
|
|
1074
|
+
reg_dep: SessionRegistry = Depends(get_registry),
|
|
1075
|
+
) -> dict[str, bool]:
|
|
1076
|
+
rid = uuid.uuid4().hex
|
|
1077
|
+
answer = body.answer.strip()
|
|
1078
|
+
if not answer:
|
|
1079
|
+
raise APIError(400, "EMPTY_ANSWER", "ask_user requires a non-empty answer", rid)
|
|
1080
|
+
bus = reg_dep.get(session_id)
|
|
1081
|
+
if bus is None:
|
|
1082
|
+
raise APIError(404, "SESSION_NOT_FOUND", "Unknown session", rid)
|
|
1083
|
+
state = bus.is_pending_or_terminal(tool_call_id)
|
|
1084
|
+
if state == "unknown":
|
|
1085
|
+
raise APIError(
|
|
1086
|
+
404,
|
|
1087
|
+
"PENDING_UNKNOWN",
|
|
1088
|
+
"Pending response id is not registered for this session",
|
|
1089
|
+
rid,
|
|
1090
|
+
)
|
|
1091
|
+
if state == "terminated":
|
|
1092
|
+
raise APIError(
|
|
1093
|
+
409,
|
|
1094
|
+
"STALE_PENDING_RESPONSE",
|
|
1095
|
+
"This pending response was already resolved, cancelled, or timed out",
|
|
1096
|
+
rid,
|
|
1097
|
+
)
|
|
1098
|
+
if not bus.resolve_pending(tool_call_id, {"answer": answer}):
|
|
1099
|
+
raise APIError(
|
|
1100
|
+
409,
|
|
1101
|
+
"STALE_PENDING_RESPONSE",
|
|
1102
|
+
"This pending response was already resolved, cancelled, or timed out",
|
|
1103
|
+
rid,
|
|
1104
|
+
)
|
|
1105
|
+
return {"ok": True}
|
|
1106
|
+
|
|
1068
1107
|
@api.post("/sessions/{session_id}/elicitations/{elicitation_id}", status_code=202)
|
|
1069
1108
|
async def post_elicitation(
|
|
1070
1109
|
session_id: str,
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"""ask_user argument checks and the pending-answer wait."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import json
|
|
7
|
+
|
|
8
|
+
from monkeybot.core.tools.ask_user import await_ask_user_answer, parse_ask_user_args
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def test_parse_ask_user_requires_a_question() -> None:
|
|
12
|
+
assert parse_ask_user_args({}) == "ask_user requires a non-empty question"
|
|
13
|
+
assert parse_ask_user_args({"question": " "}) == "ask_user requires a non-empty question"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def test_parse_ask_user_choices() -> None:
|
|
17
|
+
assert parse_ask_user_args({"question": " When? "}) == ("When?", ())
|
|
18
|
+
assert parse_ask_user_args({"question": "When?", "choices": ["Friday", "Monday"]}) == (
|
|
19
|
+
"When?",
|
|
20
|
+
("Friday", "Monday"),
|
|
21
|
+
)
|
|
22
|
+
assert parse_ask_user_args({"question": "When?", "choices": ["Friday"]}) == (
|
|
23
|
+
"ask_user choices must include 2 to 6 options"
|
|
24
|
+
)
|
|
25
|
+
assert parse_ask_user_args({"question": "When?", "choices": ["Friday", "Friday"]}) == (
|
|
26
|
+
"ask_user choices must be unique"
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def test_await_ask_user_answer_publishes_then_waits() -> None:
|
|
31
|
+
class Bus:
|
|
32
|
+
def __init__(self) -> None:
|
|
33
|
+
self.published: list[str] = []
|
|
34
|
+
self.fut: asyncio.Future[object] | None = None
|
|
35
|
+
|
|
36
|
+
def register_pending(self, key: str) -> asyncio.Future[object]:
|
|
37
|
+
assert key == "call-1"
|
|
38
|
+
self.fut = asyncio.get_running_loop().create_future()
|
|
39
|
+
return self.fut
|
|
40
|
+
|
|
41
|
+
async def publish_data(self, raw: str) -> None:
|
|
42
|
+
self.published.append(raw)
|
|
43
|
+
assert self.fut is not None
|
|
44
|
+
self.fut.set_result({"answer": " Friday "})
|
|
45
|
+
|
|
46
|
+
async def _run() -> None:
|
|
47
|
+
bus = Bus()
|
|
48
|
+
answer = await await_ask_user_answer(
|
|
49
|
+
bus,
|
|
50
|
+
call_id="call-1",
|
|
51
|
+
request_id="req",
|
|
52
|
+
question="Which date?",
|
|
53
|
+
choices=("Friday", "Monday"),
|
|
54
|
+
)
|
|
55
|
+
assert answer == "Friday"
|
|
56
|
+
event = json.loads(bus.published[0])
|
|
57
|
+
assert event["type"] == "AskUserRequest"
|
|
58
|
+
assert event["question"] == "Which date?"
|
|
59
|
+
assert event["choices"] == ["Friday", "Monday"]
|
|
60
|
+
|
|
61
|
+
asyncio.run(_run())
|
|
@@ -10,6 +10,7 @@ import pytest
|
|
|
10
10
|
from monkeybot.core.runtime.events import (
|
|
11
11
|
ActionRequiredEvent,
|
|
12
12
|
AgentEvent,
|
|
13
|
+
AskUserRequestEvent,
|
|
13
14
|
AssistantDelta,
|
|
14
15
|
AssistantTextEnded,
|
|
15
16
|
AssistantTextStarted,
|
|
@@ -358,6 +359,16 @@ def test_sse_tool_confirmation_request_event_roundtrip(prompt: str | None) -> No
|
|
|
358
359
|
assert event_from_json(event_to_json(ev)) == ev
|
|
359
360
|
|
|
360
361
|
|
|
362
|
+
def test_sse_ask_user_request_event_roundtrip() -> None:
|
|
363
|
+
ev = AskUserRequestEvent(
|
|
364
|
+
request_id="r",
|
|
365
|
+
tool_call_id="tc",
|
|
366
|
+
question="Which date?",
|
|
367
|
+
choices=("Friday", "Monday"),
|
|
368
|
+
)
|
|
369
|
+
assert event_from_json(event_to_json(ev)) == ev
|
|
370
|
+
|
|
371
|
+
|
|
361
372
|
@pytest.mark.parametrize(
|
|
362
373
|
"action_type",
|
|
363
374
|
("elicitation", "toolConfirmation", "elicitationResponse"),
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/browser/SKILL.md
RENAMED
|
File without changes
|
{monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/command_allowlist.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{monkeybot-3.5.0 → monkeybot-3.6.0}/cli/src/monkeybot_cli/scaffold_defaults/image-generator/SKILL.md
RENAMED
|
File without changes
|