gitextract_0wirow34/ ├── .agents/ │ └── skills/ │ ├── cross-repo-testing/ │ │ └── SKILL.md │ ├── custom-codereview-guide.md │ ├── debug-test-examples-workflow/ │ │ └── SKILL.md │ ├── design-principles.md │ ├── feature-release-rollout/ │ │ └── SKILL.md │ ├── manage-evals/ │ │ ├── SKILL.md │ │ ├── references/ │ │ │ └── eval-infrastructure.md │ │ └── scripts/ │ │ └── manage_evals.py │ ├── run-eval.md │ ├── sdk-release/ │ │ ├── SKILL.md │ │ └── references/ │ │ └── post-release-checklist.md │ └── write-behavior-test.md ├── .dockerignore ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_template.yml │ │ └── feature_request.yml │ ├── PULL_REQUEST_TEMPLATE.md │ ├── dependabot.yml │ ├── prompts/ │ │ └── update-documentation.md │ ├── run-eval/ │ │ ├── ADDINGMODEL.md │ │ ├── AGENTS.md │ │ ├── resolve_model_config.py │ │ └── validate_sdk_ref.py │ ├── scripts/ │ │ ├── check_agent_server_rest_api_breakage.py │ │ ├── check_deprecations.py │ │ ├── check_docstrings.py │ │ ├── check_documented_examples.py │ │ ├── check_duplicate_example_numbers.py │ │ ├── check_sdk_api_breakage.py │ │ ├── check_version_bumps.py │ │ └── update_sdk_ref_default.py │ └── workflows/ │ ├── README-RELEASE.md │ ├── agent-server-rest-api-breakage.yml │ ├── api-breakage.yml │ ├── api-compliance-runner.yml │ ├── assign-reviews.yml │ ├── auto-label-issues.yml │ ├── cancel-eval.yml │ ├── check-docstrings.yml │ ├── check-documented-examples.yml │ ├── check-duplicate-examples.yml │ ├── condenser-runner.yml │ ├── create-release.yml │ ├── deploy-docs.yml │ ├── deprecation-check.yml │ ├── integration-runner.yml │ ├── issue-duplicate-checker.yml │ ├── oh-update-documentation.yml.back │ ├── pr-artifacts.yml │ ├── pr-review-by-openhands.yml │ ├── pr-review-evaluation.yml │ ├── precommit.yml │ ├── prepare-release.yml │ ├── pypi-release.yml │ ├── qa-changes-by-openhands.yml │ ├── qa-changes-evaluation.yml │ ├── release-binaries.yml │ ├── remove-duplicate-candidate-label.yml │ ├── review-thread-gate.yml │ ├── run-eval.yml │ ├── run-examples.yml │ ├── server.yml │ ├── stale.yml │ ├── tests.yml │ ├── todo-management.yml │ ├── version-bump-guard.yml │ └── version-bump-prs.yml ├── .gitignore ├── .openhands/ │ ├── hooks/ │ │ └── on_stop.sh │ ├── hooks.json │ └── setup.sh ├── .pre-commit-config.yaml ├── .python-version ├── AGENTS.md ├── CONTRIBUTING.md ├── DEVELOPMENT.md ├── LICENSE ├── MAINTAINERS ├── MANIFEST.in ├── Makefile ├── README.md ├── examples/ │ ├── 01_standalone_sdk/ │ │ ├── 01_hello_world.py │ │ ├── 02_custom_tools.py │ │ ├── 03_activate_skill.py │ │ ├── 04_confirmation_mode_example.py │ │ ├── 05_use_llm_registry.py │ │ ├── 06_interactive_terminal_w_reasoning.py │ │ ├── 07_mcp_integration.py │ │ ├── 08_mcp_with_oauth.py │ │ ├── 09_pause_example.py │ │ ├── 10_persistence.py │ │ ├── 11_async.py │ │ ├── 12_custom_secrets.py │ │ ├── 13_get_llm_metrics.py │ │ ├── 14_context_condenser.py │ │ ├── 15_browser_use.py │ │ ├── 16_llm_security_analyzer.py │ │ ├── 17_image_input.py │ │ ├── 18_send_message_while_processing.py │ │ ├── 19_llm_routing.py │ │ ├── 20_stuck_detector.py │ │ ├── 21_generate_extraneous_conversation_costs.py │ │ ├── 22_anthropic_thinking.py │ │ ├── 23_responses_reasoning.py │ │ ├── 24_planning_agent_workflow.py │ │ ├── 25_agent_delegation.py │ │ ├── 26_custom_visualizer.py │ │ ├── 27_observability_laminar.py │ │ ├── 28_ask_agent_example.py │ │ ├── 29_llm_streaming.py │ │ ├── 30_tom_agent.py │ │ ├── 31_iterative_refinement.py │ │ ├── 32_configurable_security_policy.py │ │ ├── 33_hooks/ │ │ │ ├── README.md │ │ │ ├── hook_scripts/ │ │ │ │ ├── block_dangerous.sh │ │ │ │ ├── inject_git_context.sh │ │ │ │ ├── log_tools.sh │ │ │ │ └── require_summary.sh │ │ │ └── main.py │ │ ├── 34_critic_example.py │ │ ├── 35_subscription_login.py │ │ ├── 36_event_json_to_openai_messages.py │ │ ├── 37_llm_profile_store/ │ │ │ ├── main.py │ │ │ └── profiles/ │ │ │ └── fast.json │ │ ├── 38_browser_session_recording.py │ │ ├── 39_llm_fallback.py │ │ ├── 40_acp_agent_example.py │ │ ├── 41_task_tool_set.py │ │ ├── 42_file_based_subagents.py │ │ ├── 43_mixed_marketplace_skills/ │ │ │ ├── .plugin/ │ │ │ │ └── marketplace.json │ │ │ ├── README.md │ │ │ ├── main.py │ │ │ └── skills/ │ │ │ └── greeting-helper/ │ │ │ └── SKILL.md │ │ ├── 44_model_switching_in_convo.py │ │ ├── 45_parallel_tool_execution.py │ │ ├── 46_agent_settings.py │ │ ├── 47_defense_in_depth_security.py │ │ ├── 48_conversation_fork.py │ │ └── 49_switch_llm_tool.py │ ├── 02_remote_agent_server/ │ │ ├── 01_convo_with_local_agent_server.py │ │ ├── 02_convo_with_docker_sandboxed_server.py │ │ ├── 03_browser_use_with_docker_sandboxed_server.py │ │ ├── 04_convo_with_api_sandboxed_server.py │ │ ├── 05_vscode_with_docker_sandboxed_server.py │ │ ├── 06_custom_tool/ │ │ │ ├── Dockerfile │ │ │ ├── README.md │ │ │ ├── build_custom_image.sh │ │ │ ├── custom_tools/ │ │ │ │ ├── __init__.py │ │ │ │ └── log_data.py │ │ │ └── main.py │ │ ├── 07_convo_with_cloud_workspace.py │ │ ├── 08_convo_with_apptainer_sandboxed_server.py │ │ ├── 09_acp_agent_with_remote_runtime.py │ │ ├── 10_cloud_workspace_share_credentials.py │ │ ├── 11_conversation_fork.py │ │ ├── 12_settings_and_secrets_api.py │ │ ├── 13_workspace_get_llm.py │ │ └── hook_scripts/ │ │ └── pycompile_check.sh │ ├── 03_github_workflows/ │ │ ├── 01_basic_action/ │ │ │ ├── README.md │ │ │ ├── agent_script.py │ │ │ ├── assign-reviews.yml │ │ │ └── workflow.yml │ │ ├── 02_pr_review/ │ │ │ ├── README.md │ │ │ └── workflow.yml │ │ ├── 03_todo_management/ │ │ │ ├── README.md │ │ │ ├── agent_script.py │ │ │ ├── prompt.py │ │ │ ├── scanner.py │ │ │ └── workflow.yml │ │ ├── 04_datadog_debugging/ │ │ │ ├── README.md │ │ │ ├── datadog_debugging.py │ │ │ ├── debug_prompt.jinja │ │ │ └── workflow.yml │ │ └── 05_posthog_debugging/ │ │ ├── README.md │ │ ├── debug_prompt.jinja │ │ ├── posthog_debugging.py │ │ └── workflow.yml │ ├── 04_llm_specific_tools/ │ │ ├── 01_gpt5_apply_patch_preset.py │ │ └── 02_gemini_file_tools.py │ └── 05_skills_and_plugins/ │ ├── 01_loading_agentskills/ │ │ ├── example_skills/ │ │ │ ├── code-style-guide/ │ │ │ │ └── SKILL.md │ │ │ └── rot13-encryption/ │ │ │ ├── SKILL.md │ │ │ ├── references/ │ │ │ │ └── examples.md │ │ │ └── scripts/ │ │ │ └── encrypt.sh │ │ └── main.py │ ├── 02_loading_plugins/ │ │ ├── example_plugins/ │ │ │ └── code-quality/ │ │ │ ├── .mcp.json │ │ │ ├── .plugin/ │ │ │ │ └── plugin.json │ │ │ ├── hooks/ │ │ │ │ └── hooks.json │ │ │ └── skills/ │ │ │ └── linting/ │ │ │ └── SKILL.md │ │ └── main.py │ └── 03_managing_installed_skills/ │ └── main.py ├── openhands-agent-server/ │ ├── AGENTS.md │ ├── openhands/ │ │ └── agent_server/ │ │ ├── README.md │ │ ├── __init__.py │ │ ├── __main__.py │ │ ├── _secrets_exposure.py │ │ ├── agent-server.spec │ │ ├── api.py │ │ ├── auth_router.py │ │ ├── bash_router.py │ │ ├── bash_service.py │ │ ├── cloud_proxy_router.py │ │ ├── config.py │ │ ├── conversation_lease.py │ │ ├── conversation_router.py │ │ ├── conversation_router_acp.py │ │ ├── conversation_service.py │ │ ├── dependencies.py │ │ ├── desktop_router.py │ │ ├── desktop_service.py │ │ ├── docker/ │ │ │ ├── Dockerfile │ │ │ └── build.py │ │ ├── env_parser.py │ │ ├── event_router.py │ │ ├── event_service.py │ │ ├── file_router.py │ │ ├── git_router.py │ │ ├── hooks_router.py │ │ ├── hooks_service.py │ │ ├── llm_router.py │ │ ├── logging_config.py │ │ ├── middleware.py │ │ ├── models.py │ │ ├── openapi.py │ │ ├── persistence/ │ │ │ ├── __init__.py │ │ │ ├── models.py │ │ │ └── store.py │ │ ├── profiles_router.py │ │ ├── pub_sub.py │ │ ├── py.typed │ │ ├── server_details_router.py │ │ ├── settings_router.py │ │ ├── skills_router.py │ │ ├── skills_service.py │ │ ├── sockets.py │ │ ├── tool_preload_service.py │ │ ├── tool_router.py │ │ ├── utils.py │ │ ├── vscode_extensions/ │ │ │ └── openhands-settings/ │ │ │ ├── extension.js │ │ │ └── package.json │ │ ├── vscode_router.py │ │ ├── vscode_service.py │ │ └── workspace_router.py │ └── pyproject.toml ├── openhands-sdk/ │ ├── openhands/ │ │ └── sdk/ │ │ ├── AGENTS.md │ │ ├── __init__.py │ │ ├── agent/ │ │ │ ├── __init__.py │ │ │ ├── acp_agent.py │ │ │ ├── agent.py │ │ │ ├── base.py │ │ │ ├── critic_mixin.py │ │ │ ├── parallel_executor.py │ │ │ ├── prompts/ │ │ │ │ ├── in_context_learning_example.j2 │ │ │ │ ├── in_context_learning_example_suffix.j2 │ │ │ │ ├── model_specific/ │ │ │ │ │ ├── anthropic_claude.j2 │ │ │ │ │ ├── google_gemini.j2 │ │ │ │ │ └── openai_gpt/ │ │ │ │ │ ├── gpt-5-codex.j2 │ │ │ │ │ └── gpt-5.j2 │ │ │ │ ├── security_policy.j2 │ │ │ │ ├── security_risk_assessment.j2 │ │ │ │ ├── self_documentation.j2 │ │ │ │ ├── system_prompt.j2 │ │ │ │ ├── system_prompt_interactive.j2 │ │ │ │ ├── system_prompt_long_horizon.j2 │ │ │ │ ├── system_prompt_planning.j2 │ │ │ │ └── system_prompt_tech_philosophy.j2 │ │ │ ├── response_dispatch.py │ │ │ └── utils.py │ │ ├── banner.py │ │ ├── context/ │ │ │ ├── README.md │ │ │ ├── __init__.py │ │ │ ├── agent_context.py │ │ │ ├── condenser/ │ │ │ │ ├── README.md │ │ │ │ ├── __init__.py │ │ │ │ ├── base.py │ │ │ │ ├── llm_summarizing_condenser.py │ │ │ │ ├── no_op_condenser.py │ │ │ │ ├── pipeline_condenser.py │ │ │ │ ├── prompts/ │ │ │ │ │ └── summarizing_prompt.j2 │ │ │ │ └── utils.py │ │ │ ├── prompts/ │ │ │ │ ├── __init__.py │ │ │ │ ├── prompt.py │ │ │ │ └── templates/ │ │ │ │ ├── ask_agent_template.j2 │ │ │ │ ├── skill_knowledge_info.j2 │ │ │ │ └── system_message_suffix.j2 │ │ │ ├── skills/ │ │ │ │ └── __init__.py │ │ │ └── view/ │ │ │ ├── __init__.py │ │ │ ├── manipulation_indices.py │ │ │ ├── properties/ │ │ │ │ ├── __init__.py │ │ │ │ ├── base.py │ │ │ │ ├── batch_atomicity.py │ │ │ │ ├── observation_uniqueness.py │ │ │ │ ├── tool_call_matching.py │ │ │ │ └── tool_loop_atomicity.py │ │ │ └── view.py │ │ ├── conversation/ │ │ │ ├── __init__.py │ │ │ ├── base.py │ │ │ ├── conversation.py │ │ │ ├── conversation_stats.py │ │ │ ├── event_store.py │ │ │ ├── events_list_base.py │ │ │ ├── exceptions.py │ │ │ ├── fifo_lock.py │ │ │ ├── impl/ │ │ │ │ ├── __init__.py │ │ │ │ ├── local_conversation.py │ │ │ │ └── remote_conversation.py │ │ │ ├── persistence_const.py │ │ │ ├── request.py │ │ │ ├── resource_lock_manager.py │ │ │ ├── response_utils.py │ │ │ ├── secret_registry.py │ │ │ ├── serialization_diff.py │ │ │ ├── state.py │ │ │ ├── stuck_detector.py │ │ │ ├── title_utils.py │ │ │ ├── types.py │ │ │ └── visualizer/ │ │ │ ├── __init__.py │ │ │ ├── base.py │ │ │ └── default.py │ │ ├── critic/ │ │ │ ├── __init__.py │ │ │ ├── base.py │ │ │ ├── impl/ │ │ │ │ ├── __init__.py │ │ │ │ ├── agent_finished.py │ │ │ │ ├── api/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── chat_template.py │ │ │ │ │ ├── client.py │ │ │ │ │ ├── critic.py │ │ │ │ │ └── taxonomy.py │ │ │ │ ├── empty_patch.py │ │ │ │ └── pass_critic.py │ │ │ └── result.py │ │ ├── event/ │ │ │ ├── __init__.py │ │ │ ├── acp_tool_call.py │ │ │ ├── base.py │ │ │ ├── condenser.py │ │ │ ├── conversation_error.py │ │ │ ├── conversation_state.py │ │ │ ├── hook_execution.py │ │ │ ├── llm_completion_log.py │ │ │ ├── llm_convertible/ │ │ │ │ ├── __init__.py │ │ │ │ ├── action.py │ │ │ │ ├── message.py │ │ │ │ ├── observation.py │ │ │ │ └── system.py │ │ │ ├── streaming_delta.py │ │ │ ├── token.py │ │ │ ├── types.py │ │ │ └── user_action.py │ │ ├── extensions/ │ │ │ ├── __init__.py │ │ │ ├── fetch.py │ │ │ └── installation/ │ │ │ ├── README.md │ │ │ ├── __init__.py │ │ │ ├── info.py │ │ │ ├── interface.py │ │ │ ├── manager.py │ │ │ ├── metadata.py │ │ │ └── utils.py │ │ ├── git/ │ │ │ ├── cached_repo.py │ │ │ ├── exceptions.py │ │ │ ├── git_changes.py │ │ │ ├── git_diff.py │ │ │ ├── models.py │ │ │ └── utils.py │ │ ├── hooks/ │ │ │ ├── __init__.py │ │ │ ├── config.py │ │ │ ├── conversation_hooks.py │ │ │ ├── executor.py │ │ │ ├── manager.py │ │ │ └── types.py │ │ ├── io/ │ │ │ ├── __init__.py │ │ │ ├── base.py │ │ │ ├── cache.py │ │ │ ├── local.py │ │ │ └── memory.py │ │ ├── llm/ │ │ │ ├── __init__.py │ │ │ ├── auth/ │ │ │ │ ├── __init__.py │ │ │ │ ├── credentials.py │ │ │ │ └── openai.py │ │ │ ├── exceptions/ │ │ │ │ ├── __init__.py │ │ │ │ ├── classifier.py │ │ │ │ ├── mapping.py │ │ │ │ └── types.py │ │ │ ├── fallback_strategy.py │ │ │ ├── llm.py │ │ │ ├── llm_profile_store.py │ │ │ ├── llm_registry.py │ │ │ ├── llm_response.py │ │ │ ├── message.py │ │ │ ├── mixins/ │ │ │ │ ├── fn_call_converter.py │ │ │ │ ├── fn_call_examples.py │ │ │ │ └── non_native_fc.py │ │ │ ├── options/ │ │ │ │ ├── __init__.py │ │ │ │ ├── chat_options.py │ │ │ │ ├── common.py │ │ │ │ └── responses_options.py │ │ │ ├── router/ │ │ │ │ ├── __init__.py │ │ │ │ ├── base.py │ │ │ │ └── impl/ │ │ │ │ ├── multimodal.py │ │ │ │ └── random.py │ │ │ ├── streaming.py │ │ │ └── utils/ │ │ │ ├── image_resize.py │ │ │ ├── litellm_provider.py │ │ │ ├── metrics.py │ │ │ ├── model_features.py │ │ │ ├── model_info.py │ │ │ ├── model_prompt_spec.py │ │ │ ├── responses_serialization.py │ │ │ ├── retry_mixin.py │ │ │ ├── telemetry.py │ │ │ ├── unverified_models.py │ │ │ └── verified_models.py │ │ ├── logger/ │ │ │ ├── __init__.py │ │ │ ├── logger.py │ │ │ └── rolling.py │ │ ├── marketplace/ │ │ │ ├── __init__.py │ │ │ └── types.py │ │ ├── mcp/ │ │ │ ├── __init__.py │ │ │ ├── client.py │ │ │ ├── definition.py │ │ │ ├── exceptions.py │ │ │ ├── tool.py │ │ │ └── utils.py │ │ ├── observability/ │ │ │ ├── __init__.py │ │ │ ├── laminar.py │ │ │ └── utils.py │ │ ├── plugin/ │ │ │ ├── __init__.py │ │ │ ├── fetch.py │ │ │ ├── installed.py │ │ │ ├── loader.py │ │ │ ├── plugin.py │ │ │ ├── source.py │ │ │ └── types.py │ │ ├── py.typed │ │ ├── secret/ │ │ │ ├── __init__.py │ │ │ └── secrets.py │ │ ├── security/ │ │ │ ├── __init__.py │ │ │ ├── analyzer.py │ │ │ ├── confirmation_policy.py │ │ │ ├── defense_in_depth/ │ │ │ │ ├── __init__.py │ │ │ │ ├── pattern.py │ │ │ │ ├── policy_rails.py │ │ │ │ └── utils.py │ │ │ ├── ensemble.py │ │ │ ├── grayswan/ │ │ │ │ ├── __init__.py │ │ │ │ ├── analyzer.py │ │ │ │ └── utils.py │ │ │ ├── llm_analyzer.py │ │ │ └── risk.py │ │ ├── settings/ │ │ │ ├── __init__.py │ │ │ ├── acp_providers.py │ │ │ ├── api_models.py │ │ │ ├── metadata.py │ │ │ └── model.py │ │ ├── skills/ │ │ │ ├── __init__.py │ │ │ ├── exceptions.py │ │ │ ├── execute.py │ │ │ ├── fetch.py │ │ │ ├── installed.py │ │ │ ├── skill.py │ │ │ ├── trigger.py │ │ │ ├── types.py │ │ │ └── utils.py │ │ ├── subagent/ │ │ │ ├── AGENTS.md │ │ │ ├── __init__.py │ │ │ ├── load.py │ │ │ ├── registry.py │ │ │ └── schema.py │ │ ├── testing/ │ │ │ ├── __init__.py │ │ │ └── test_llm.py │ │ ├── tool/ │ │ │ ├── __init__.py │ │ │ ├── builtins/ │ │ │ │ ├── __init__.py │ │ │ │ ├── finish.py │ │ │ │ ├── invoke_skill.py │ │ │ │ ├── switch_llm.py │ │ │ │ └── think.py │ │ │ ├── registry.py │ │ │ ├── schema.py │ │ │ ├── spec.py │ │ │ └── tool.py │ │ ├── utils/ │ │ │ ├── __init__.py │ │ │ ├── async_executor.py │ │ │ ├── async_utils.py │ │ │ ├── cipher.py │ │ │ ├── command.py │ │ │ ├── datetime.py │ │ │ ├── deprecation.py │ │ │ ├── github.py │ │ │ ├── json.py │ │ │ ├── models.py │ │ │ ├── paging.py │ │ │ ├── path.py │ │ │ ├── pydantic_diff.py │ │ │ ├── pydantic_secrets.py │ │ │ ├── redact.py │ │ │ ├── truncate.py │ │ │ └── visualize.py │ │ └── workspace/ │ │ ├── __init__.py │ │ ├── base.py │ │ ├── local.py │ │ ├── models.py │ │ ├── remote/ │ │ │ ├── __init__.py │ │ │ ├── async_remote_workspace.py │ │ │ ├── base.py │ │ │ └── remote_workspace_mixin.py │ │ ├── repo.py │ │ └── workspace.py │ └── pyproject.toml ├── openhands-tools/ │ ├── openhands/ │ │ └── tools/ │ │ ├── AGENTS.md │ │ ├── __init__.py │ │ ├── apply_patch/ │ │ │ ├── __init__.py │ │ │ ├── core.py │ │ │ └── definition.py │ │ ├── browser_use/ │ │ │ ├── __init__.py │ │ │ ├── definition.py │ │ │ ├── event_storage.py │ │ │ ├── impl.py │ │ │ ├── js/ │ │ │ │ ├── flush-events.js │ │ │ │ ├── rrweb-loader.js │ │ │ │ ├── start-recording-simple.js │ │ │ │ ├── start-recording.js │ │ │ │ ├── stop-recording.js │ │ │ │ └── wait-for-rrweb.js │ │ │ ├── logging_fix.py │ │ │ ├── recording.py │ │ │ └── server.py │ │ ├── delegate/ │ │ │ ├── __init__.py │ │ │ ├── definition.py │ │ │ ├── impl.py │ │ │ ├── templates/ │ │ │ │ └── delegate_tool_description.j2 │ │ │ └── visualizer.py │ │ ├── file_editor/ │ │ │ ├── __init__.py │ │ │ ├── definition.py │ │ │ ├── editor.py │ │ │ ├── exceptions.py │ │ │ ├── impl.py │ │ │ └── utils/ │ │ │ ├── __init__.py │ │ │ ├── config.py │ │ │ ├── constants.py │ │ │ ├── diff.py │ │ │ ├── encoding.py │ │ │ ├── file_cache.py │ │ │ ├── history.py │ │ │ └── shell.py │ │ ├── gemini/ │ │ │ ├── __init__.py │ │ │ ├── edit/ │ │ │ │ ├── __init__.py │ │ │ │ ├── definition.py │ │ │ │ └── impl.py │ │ │ ├── list_directory/ │ │ │ │ ├── __init__.py │ │ │ │ ├── definition.py │ │ │ │ └── impl.py │ │ │ ├── read_file/ │ │ │ │ ├── __init__.py │ │ │ │ ├── definition.py │ │ │ │ └── impl.py │ │ │ └── write_file/ │ │ │ ├── __init__.py │ │ │ ├── definition.py │ │ │ └── impl.py │ │ ├── glob/ │ │ │ ├── __init__.py │ │ │ ├── definition.py │ │ │ └── impl.py │ │ ├── grep/ │ │ │ ├── __init__.py │ │ │ ├── definition.py │ │ │ └── impl.py │ │ ├── planning_file_editor/ │ │ │ ├── __init__.py │ │ │ ├── definition.py │ │ │ └── impl.py │ │ ├── preset/ │ │ │ ├── __init__.py │ │ │ ├── default.py │ │ │ ├── gemini.py │ │ │ ├── gpt5.py │ │ │ ├── planning.py │ │ │ └── subagents/ │ │ │ ├── bash_runner.md │ │ │ ├── code_explorer.md │ │ │ ├── default.md │ │ │ └── web_researcher.md │ │ ├── py.typed │ │ ├── task/ │ │ │ ├── __init__.py │ │ │ ├── definition.py │ │ │ ├── impl.py │ │ │ └── manager.py │ │ ├── task_tracker/ │ │ │ ├── __init__.py │ │ │ └── definition.py │ │ ├── terminal/ │ │ │ ├── README.md │ │ │ ├── __init__.py │ │ │ ├── constants.py │ │ │ ├── definition.py │ │ │ ├── descriptions.py │ │ │ ├── impl.py │ │ │ ├── metadata.py │ │ │ ├── terminal/ │ │ │ │ ├── __init__.py │ │ │ │ ├── factory.py │ │ │ │ ├── interface.py │ │ │ │ ├── subprocess_terminal.py │ │ │ │ ├── terminal_session.py │ │ │ │ ├── tmux_pane_pool.py │ │ │ │ ├── tmux_terminal.py │ │ │ │ └── windows_terminal.py │ │ │ └── utils/ │ │ │ ├── __init__.py │ │ │ ├── command.py │ │ │ └── escape_filter.py │ │ ├── tom_consult/ │ │ │ ├── __init__.py │ │ │ ├── definition.py │ │ │ └── executor.py │ │ └── utils/ │ │ ├── __init__.py │ │ └── timeout.py │ └── pyproject.toml ├── openhands-workspace/ │ ├── openhands/ │ │ └── workspace/ │ │ ├── AGENTS.md │ │ ├── __init__.py │ │ ├── apptainer/ │ │ │ ├── README.md │ │ │ ├── __init__.py │ │ │ └── workspace.py │ │ ├── cloud/ │ │ │ ├── __init__.py │ │ │ └── workspace.py │ │ ├── docker/ │ │ │ ├── __init__.py │ │ │ ├── dev_workspace.py │ │ │ └── workspace.py │ │ ├── py.typed │ │ └── remote_api/ │ │ ├── __init__.py │ │ └── workspace.py │ └── pyproject.toml ├── pyproject.toml ├── scripts/ │ ├── agent_server_ui/ │ │ ├── run.sh │ │ └── static/ │ │ ├── app-dev.js │ │ ├── app.js │ │ ├── index-dev.html │ │ ├── index.html │ │ └── styles.css │ ├── auto_close_duplicate_issues.py │ ├── build_config_template.py │ ├── check_import_rules.py │ ├── check_tool_registration.py │ ├── completion_logs_viewer.py │ ├── conversation_viewer.py │ ├── convert_legacy_skills.py │ ├── event_sourcing_benchmarks/ │ │ ├── README.md │ │ ├── bench_persist_latency.py │ │ ├── bench_replay_and_recovery.py │ │ ├── bench_storage_growth.py │ │ └── benchmark_utils.py │ ├── issue_duplicate_check_openhands.py │ ├── render_examples_report.py │ └── websocket_client.html └── tests/ ├── README.md ├── __init__.py ├── agent_server/ │ ├── __init__.py │ ├── stress/ │ │ ├── __init__.py │ │ ├── budgets.py │ │ ├── conftest.py │ │ ├── probe.py │ │ ├── scripts.py │ │ ├── test_concurrent_conversations.py │ │ ├── test_conversation_listing.py │ │ ├── test_event_loop_responsiveness.py │ │ ├── test_high_volume_bash_output.py │ │ ├── test_lease_contention.py │ │ ├── test_long_running_command.py │ │ ├── test_parallel_subagents.py │ │ ├── test_slow_webhook.py │ │ ├── test_slow_websocket_consumer.py │ │ └── test_websocket_reconnect_storm.py │ ├── test_agent_server_wsproto.py │ ├── test_api.py │ ├── test_api_authentication.py │ ├── test_bash_service.py │ ├── test_check_browser.py │ ├── test_cloud_proxy_router.py │ ├── test_conversation_lease.py │ ├── test_conversation_response.py │ ├── test_conversation_router.py │ ├── test_conversation_router_acp.py │ ├── test_conversation_service.py │ ├── test_conversation_service_plugin.py │ ├── test_conversation_tags.py │ ├── test_dependencies.py │ ├── test_desktop_router.py │ ├── test_desktop_service.py │ ├── test_docker_build.py │ ├── test_env_parser.py │ ├── test_event_router.py │ ├── test_event_router_websocket.py │ ├── test_event_service.py │ ├── test_event_streaming.py │ ├── test_file_router.py │ ├── test_git_router.py │ ├── test_hooks_router.py │ ├── test_hooks_service.py │ ├── test_llm_router.py │ ├── test_models.py │ ├── test_openapi_discriminator.py │ ├── test_preload_modules.py │ ├── test_profiles_router.py │ ├── test_pub_sub.py │ ├── test_server_details_router.py │ ├── test_settings_router.py │ ├── test_skills_router.py │ ├── test_skills_service.py │ ├── test_terminal_router.py │ ├── test_terminal_service.py │ ├── test_tool_router.py │ ├── test_validation_error_sanitization.py │ ├── test_vscode_router.py │ ├── test_vscode_service.py │ ├── test_webhook_subscriber.py │ ├── test_websocket_first_message_auth.py │ ├── test_workspace_cookie_auth.py │ └── test_workspace_router.py ├── command_utils.py ├── conftest.py ├── cross/ │ ├── __init__.py │ ├── conftest.py │ ├── test_agent_loading.py │ ├── test_agent_secrets_integration.py │ ├── test_agent_server_build_metadata.py │ ├── test_automatic_naming.py │ ├── test_automatic_registration.py │ ├── test_check_agent_server_rest_api_breakage.py │ ├── test_check_deprecations.py │ ├── test_check_sdk_api_breakage.py │ ├── test_check_version_bumps.py │ ├── test_conversation_restore_behavior.py │ ├── test_event_loss_repro.py │ ├── test_hello_world.py │ ├── test_issue_duplicate_scripts.py │ ├── test_pr_review_trace.py │ ├── test_registry_directories.py │ ├── test_registry_qualnames.py │ ├── test_remote_conversation_live_server.py │ ├── test_resolve_model_config.py │ ├── test_stuck_detector.py │ ├── test_stuck_detector_config.py │ ├── test_todo_scanner.py │ └── test_validate_sdk_ref.py ├── examples/ │ └── test_examples.py ├── fixtures/ │ ├── conversations/ │ │ ├── v1_11_5_cli_default/ │ │ │ └── base_state.json │ │ └── v1_17_0_with_mcp_config/ │ │ └── base_state.json │ ├── llm_data/ │ │ ├── README.md │ │ ├── data_generator.py │ │ ├── fncall-llm-message.json │ │ ├── llm-logs/ │ │ │ ├── litellm_proxy__anthropic__claude-sonnet-4-20250514-1757015025.972.json │ │ │ ├── litellm_proxy__anthropic__claude-sonnet-4-20250514-1757015029.090.json │ │ │ ├── litellm_proxy__anthropic__claude-sonnet-4-20250514-1757015033.222.json │ │ │ ├── litellm_proxy__anthropic__claude-sonnet-4-20250514-1757015036.544.json │ │ │ ├── litellm_proxy__anthropic__claude-sonnet-4-20250514-1757015040.416.json │ │ │ └── litellm_proxy__anthropic__claude-sonnet-4-20250514-1757015046.707.json │ │ ├── nonfncall-llm-logs/ │ │ │ ├── litellm_proxy__deepseek__deepseek-chat-1757015054.055.json │ │ │ ├── litellm_proxy__deepseek__deepseek-chat-1757015062.589.json │ │ │ ├── litellm_proxy__deepseek__deepseek-chat-1757015068.723.json │ │ │ └── litellm_proxy__deepseek__deepseek-chat-1757015076.651.json │ │ └── nonfncall-llm-message.json │ └── tokenizers/ │ └── qwen3-4b-instruct-2507-tokenizer_config.json ├── integration/ │ ├── BEHAVIOR_TESTS.md │ ├── README.md │ ├── __init__.py │ ├── api_compliance/ │ │ ├── __init__.py │ │ ├── base.py │ │ ├── result.py │ │ └── run_compliance.py │ ├── base.py │ ├── behavior_utils.py │ ├── early_stopper.py │ ├── run_infer.py │ ├── schemas.py │ ├── test_behavior_utils.py │ ├── test_early_stopper.py │ ├── test_tool_presets.py │ ├── tests/ │ │ ├── a01_unmatched_tool_use.py │ │ ├── a02_unmatched_tool_result.py │ │ ├── a03_interleaved_user_msg.py │ │ ├── a04_interleaved_asst_msg.py │ │ ├── a05_duplicate_tool_call_id.py │ │ ├── a06_wrong_tool_call_id.py │ │ ├── a07_parallel_missing_result.py │ │ ├── a08_parallel_wrong_order.py │ │ ├── b01_no_premature_implementation.py │ │ ├── b02_no_oververification.py │ │ ├── b03_no_useless_backward_compatibility.py │ │ ├── b04_each_tool_call_has_a_concise_explanation.py │ │ ├── b05_do_not_create_redundant_files.py │ │ ├── c01_thinking_block_condenser.py │ │ ├── c02_hard_context_reset.py │ │ ├── c03_delayed_condensation.py │ │ ├── c04_token_condenser.py │ │ ├── c05_size_condenser.py │ │ ├── t01_fix_simple_typo.py │ │ ├── t02_add_bash_hello.py │ │ ├── t03_jupyter_write_file.py │ │ ├── t04_git_staging.py │ │ ├── t05_simple_browsing.py │ │ ├── t06_github_pr_browsing.py │ │ ├── t07_interactive_commands.py │ │ ├── t08_image_file_viewing.py │ │ └── t09_invoke_skill.py │ └── utils/ │ ├── __init__.py │ ├── behavior_helpers.py │ ├── consolidate_json_results.py │ ├── consolidate_results.py │ ├── format_costs.py │ ├── generate_markdown_report.py │ └── llm_judge.py ├── platform_utils.py ├── sdk/ │ ├── __init__.py │ ├── agent/ │ │ ├── __init__.py │ │ ├── test_acp_agent.py │ │ ├── test_acp_dedup_and_truncation.py │ │ ├── test_action_batch.py │ │ ├── test_agent_browser_auto_detect.py │ │ ├── test_agent_context_window_condensation.py │ │ ├── test_agent_immutability.py │ │ ├── test_agent_init_state_invariants.py │ │ ├── test_agent_llms_are_discoverable.py │ │ ├── test_agent_serialization.py │ │ ├── test_agent_step_responses_gating.py │ │ ├── test_agent_tool_init.py │ │ ├── test_agent_utils.py │ │ ├── test_extract_security_risk.py │ │ ├── test_extract_summary.py │ │ ├── test_fix_malformed_tool_arguments.py │ │ ├── test_iterative_refinement.py │ │ ├── test_message_while_finishing.py │ │ ├── test_non_executable_action_emission.py │ │ ├── test_nonexistent_tool_handling.py │ │ ├── test_parallel_execution_integration.py │ │ ├── test_parallel_executor.py │ │ ├── test_parallel_executor_locking.py │ │ ├── test_reasoning_only_responses.py │ │ ├── test_response_dispatch.py │ │ ├── test_sanitize_json_control_chars.py │ │ ├── test_security_policy_integration.py │ │ ├── test_system_prompt.py │ │ ├── test_tool_call_compatibility.py │ │ ├── test_tool_call_recovery.py │ │ ├── test_tool_execution_error_handling.py │ │ └── test_tool_validation_error_message.py │ ├── config/ │ │ ├── __init__.py │ │ └── test_llm_config.py │ ├── context/ │ │ ├── __init__.py │ │ ├── condenser/ │ │ │ ├── __init__.py │ │ │ ├── test_llm_summarizing_condenser.py │ │ │ ├── test_no_op_condenser.py │ │ │ ├── test_rolling_condenser.py │ │ │ └── test_utils.py │ │ ├── test_agent_context.py │ │ ├── test_agent_context_model_specific.py │ │ ├── test_agent_context_serialization.py │ │ ├── test_prompt_absolute_path.py │ │ ├── test_prompt_model_spec.py │ │ └── view/ │ │ ├── __init__.py │ │ ├── conftest.py │ │ ├── properties/ │ │ │ ├── conftest.py │ │ │ ├── test_batch_atomicity.py │ │ │ ├── test_observation_uniqueness.py │ │ │ ├── test_tool_call_matching.py │ │ │ └── test_tool_loop_atomicity.py │ │ ├── test_manipulation_indices.py │ │ ├── test_view.py │ │ ├── test_view_append_event.py │ │ ├── test_view_batch_atomicity.py │ │ ├── test_view_condensation_batch_atomicity.py │ │ ├── test_view_manipulation_indices.py │ │ ├── test_view_multi_summary.py │ │ └── test_view_tool_loop_boundaries.py │ ├── conversation/ │ │ ├── __init__.py │ │ ├── conftest.py │ │ ├── local/ │ │ │ ├── test_agent_status_transition.py │ │ │ ├── test_confirmation_mode.py │ │ │ ├── test_conversation_core.py │ │ │ ├── test_conversation_default_callback.py │ │ │ ├── test_conversation_id.py │ │ │ ├── test_conversation_path_types.py │ │ │ ├── test_conversation_pause_functionality.py │ │ │ ├── test_conversation_send_message.py │ │ │ ├── test_conversation_visualize_param.py │ │ │ ├── test_execute_tool.py │ │ │ ├── test_fork.py │ │ │ ├── test_rerun_actions.py │ │ │ ├── test_run_exception_includes_conversation_id.py │ │ │ ├── test_span_double_ending.py │ │ │ └── test_state_serialization.py │ │ ├── remote/ │ │ │ ├── __init__.py │ │ │ ├── test_api_key_functionality.py │ │ │ ├── test_remote_conversation.py │ │ │ ├── test_remote_events_list.py │ │ │ ├── test_remote_fork.py │ │ │ ├── test_remote_request_logging.py │ │ │ ├── test_remote_state.py │ │ │ ├── test_run_exception_includes_conversation_id_remote.py │ │ │ ├── test_websocket_client.py │ │ │ └── test_websocket_subscription_ready.py │ │ ├── test_agent_final_response.py │ │ ├── test_agent_state_reassignment.py │ │ ├── test_ask_agent.py │ │ ├── test_atexit_cleanup.py │ │ ├── test_base_span_management.py │ │ ├── test_condense.py │ │ ├── test_conversation_execution_status_enum.py │ │ ├── test_conversation_factory.py │ │ ├── test_conversation_secrets_constructor.py │ │ ├── test_conversation_stats.py │ │ ├── test_directories.py │ │ ├── test_event_store.py │ │ ├── test_fifo_lock.py │ │ ├── test_generate_title.py │ │ ├── test_get_unmatched_actions.py │ │ ├── test_local_conversation_plugins.py │ │ ├── test_mcp_secrets_serialization_leak.py │ │ ├── test_remote_conversation_state_updates.py │ │ ├── test_repo_root_project_skills.py │ │ ├── test_resource_lock_manager.py │ │ ├── test_secret_source.py │ │ ├── test_secrets_manager.py │ │ ├── test_state_change_callback.py │ │ ├── test_stats_update_event_snapshot.py │ │ ├── test_switch_model.py │ │ ├── test_tags.py │ │ └── test_visualizer.py │ ├── critic/ │ │ ├── __init__.py │ │ ├── api/ │ │ │ └── test_template_render.py │ │ ├── test_critic.py │ │ ├── test_critic_client.py │ │ └── test_critic_display.py │ ├── event/ │ │ ├── __init__.py │ │ ├── test_action_event_summary.py │ │ ├── test_dynamic_context_message_sequence.py │ │ ├── test_event_immutability.py │ │ ├── test_event_serialization.py │ │ ├── test_events_to_messages.py │ │ ├── test_llm_completion_log_event.py │ │ ├── test_non_executable_action_event.py │ │ ├── test_streaming.py │ │ └── test_system_prompt_event_visualize.py │ ├── extensions/ │ │ ├── __init__.py │ │ ├── installation/ │ │ │ ├── __init__.py │ │ │ ├── test_installation_info.py │ │ │ ├── test_installation_manager.py │ │ │ ├── test_installation_metadata.py │ │ │ └── test_installation_utils.py │ │ └── test_fetch.py │ ├── git/ │ │ ├── __init__.py │ │ ├── test_cached_repo.py │ │ ├── test_git_changes.py │ │ └── test_git_diff.py │ ├── hooks/ │ │ ├── __init__.py │ │ ├── test_config.py │ │ ├── test_executor.py │ │ ├── test_integration.py │ │ └── test_manager.py │ ├── io/ │ │ ├── __init__.py │ │ ├── test_filestore_cache.py │ │ └── test_local_filestore_security.py │ ├── llm/ │ │ ├── __init__.py │ │ ├── auth/ │ │ │ ├── __init__.py │ │ │ ├── test_credentials.py │ │ │ └── test_openai.py │ │ ├── test_api_connection_error_retry.py │ │ ├── test_api_key_validation.py │ │ ├── test_chat_options.py │ │ ├── test_exception.py │ │ ├── test_exception_classifier.py │ │ ├── test_exception_mapping.py │ │ ├── test_llm.py │ │ ├── test_llm_completion.py │ │ ├── test_llm_fallback.py │ │ ├── test_llm_fncall_converter.py │ │ ├── test_llm_image_resizing.py │ │ ├── test_llm_json_storage.py │ │ ├── test_llm_litellm_extra_body.py │ │ ├── test_llm_log_completions_integration.py │ │ ├── test_llm_metrics.py │ │ ├── test_llm_no_response_retry.py │ │ ├── test_llm_pricing_passthrough.py │ │ ├── test_llm_profile_store.py │ │ ├── test_llm_registry.py │ │ ├── test_llm_retry_telemetry.py │ │ ├── test_llm_serialization.py │ │ ├── test_llm_telemetry.py │ │ ├── test_llm_timeout.py │ │ ├── test_message.py │ │ ├── test_message_backward_compatibility.py │ │ ├── test_message_from_chat_and_helpers.py │ │ ├── test_message_serialization.py │ │ ├── test_message_tool_call.py │ │ ├── test_model_canonical_name_resolution.py │ │ ├── test_model_features.py │ │ ├── test_model_list.py │ │ ├── test_prompt_caching_cross_conversation.py │ │ ├── test_pydantic_warning_suppression.py │ │ ├── test_reasoning_content.py │ │ ├── test_responses_parsing_and_kwargs.py │ │ ├── test_responses_serialization.py │ │ ├── test_subscription_mode.py │ │ ├── test_telemetry_policy.py │ │ ├── test_thinking_blocks.py │ │ └── test_vision_support.py │ ├── logger/ │ │ ├── __init__.py │ │ └── test_litellm_log_suppression.py │ ├── marketplace/ │ │ ├── __init__.py │ │ ├── test_deprecation.py │ │ └── test_marketplace.py │ ├── mcp/ │ │ ├── __init__.py │ │ ├── test_create_mcp_tool.py │ │ ├── test_mcp_action_serialization.py │ │ ├── test_mcp_observation.py │ │ ├── test_mcp_security_risk.py │ │ ├── test_mcp_session_persistence.py │ │ ├── test_mcp_tool.py │ │ ├── test_mcp_tool_immutability.py │ │ ├── test_mcp_tool_kind_field.py │ │ ├── test_mcp_tool_serialization.py │ │ ├── test_mcp_tool_validation.py │ │ └── test_stateful_mcp.py │ ├── observability/ │ │ ├── __init__.py │ │ └── test_laminar.py │ ├── plugin/ │ │ ├── __init__.py │ │ ├── test_installed_plugins.py │ │ ├── test_plugin_fetch.py │ │ ├── test_plugin_fetch_integration.py │ │ ├── test_plugin_loader.py │ │ ├── test_plugin_loading.py │ │ ├── test_plugin_merging.py │ │ └── test_source.py │ ├── security/ │ │ ├── __init__.py │ │ ├── defense_in_depth/ │ │ │ ├── __init__.py │ │ │ ├── test_adversarial.py │ │ │ ├── test_ensemble.py │ │ │ ├── test_field_cap.py │ │ │ ├── test_pattern.py │ │ │ ├── test_policy_rails.py │ │ │ └── test_serialization.py │ │ ├── grayswan/ │ │ │ ├── __init__.py │ │ │ ├── test_grayswan_analyzer.py │ │ │ └── test_grayswan_utils.py │ │ ├── test_confirmation_policy.py │ │ ├── test_llm_security_analyzer.py │ │ ├── test_security_analyzer.py │ │ └── test_security_risk.py │ ├── settings/ │ │ ├── __init__.py │ │ └── test_acp_providers.py │ ├── skills/ │ │ ├── __init__.py │ │ ├── test_agentskills_fields.py │ │ ├── test_extensions_ref.py │ │ ├── test_installed_skills.py │ │ ├── test_load_project_skills.py │ │ ├── test_load_public_skills.py │ │ ├── test_load_user_skills.py │ │ ├── test_mcp_config_expansion.py │ │ ├── test_mcp_json.py │ │ ├── test_resource_directories.py │ │ ├── test_skill_commands.py │ │ ├── test_skill_info.py │ │ ├── test_skill_md_convention.py │ │ ├── test_skill_no_header.py │ │ ├── test_skill_serialization.py │ │ ├── test_skill_utils.py │ │ ├── test_task_skill.py │ │ ├── test_validation_improvements.py │ │ └── test_validation_prompt.py │ ├── subagent/ │ │ ├── __init__.py │ │ ├── test_subagent_loader.py │ │ ├── test_subagent_registry.py │ │ └── test_subagent_schema.py │ ├── test_agent_step_bounded_scan.py │ ├── test_banner.py │ ├── test_import_performance.py │ ├── test_settings.py │ ├── test_socks_proxy_support.py │ ├── tool/ │ │ ├── __init__.py │ │ ├── test_builtins.py │ │ ├── test_invoke_skill.py │ │ ├── test_mcp_schema.py │ │ ├── test_py_type.py │ │ ├── test_registry.py │ │ ├── test_schema_immutability.py │ │ ├── test_switch_llm.py │ │ ├── test_to_responses_tool.py │ │ ├── test_to_responses_tool_security.py │ │ ├── test_to_responses_tool_summary.py │ │ ├── test_tool.py │ │ ├── test_tool_call_output_coercion.py │ │ ├── test_tool_definition.py │ │ ├── test_tool_immutability.py │ │ └── test_tool_serialization.py │ ├── utils/ │ │ ├── __init__.py │ │ ├── test_async_utils.py │ │ ├── test_cipher.py │ │ ├── test_command.py │ │ ├── test_deprecation.py │ │ ├── test_discriminated_union.py │ │ ├── test_github.py │ │ ├── test_model_prompt_spec.py │ │ ├── test_paging.py │ │ ├── test_path.py │ │ ├── test_pydantic_secrets.py │ │ ├── test_redact.py │ │ ├── test_subclass_cache.py │ │ ├── test_truncate.py │ │ └── test_visualize.py │ └── workspace/ │ ├── __init__.py │ ├── conftest.py │ └── remote/ │ ├── __init__.py │ ├── test_async_remote_workspace.py │ ├── test_client_base_url.py │ ├── test_multiple_commands_isolation.py │ ├── test_polling_duplicates_output.py │ ├── test_remote_workspace.py │ └── test_remote_workspace_mixin.py ├── tools/ │ ├── __init__.py │ ├── apply_patch/ │ │ └── test_apply_patch_executor.py │ ├── browser_use/ │ │ ├── __init__.py │ │ ├── conftest.py │ │ ├── test_browser_cleanup.py │ │ ├── test_browser_executor.py │ │ ├── test_browser_executor_e2e.py │ │ ├── test_browser_initialization.py │ │ ├── test_browser_observation.py │ │ ├── test_browser_toolset.py │ │ ├── test_chromium_detection.py │ │ ├── test_recording_flush.py │ │ └── test_vnc_integration.py │ ├── delegate/ │ │ ├── test_delegation.py │ │ └── test_visualizer.py │ ├── file_editor/ │ │ ├── __init__.py │ │ ├── conftest.py │ │ ├── test_basic_operations.py │ │ ├── test_error_handling.py │ │ ├── test_exceptions.py │ │ ├── test_file_editor_tool.py │ │ ├── test_file_validation.py │ │ ├── test_memory_usage.py │ │ ├── test_schema.py │ │ ├── test_view_supported_binary_files.py │ │ ├── test_visualize_diff.py │ │ ├── test_workspace_root.py │ │ └── utils/ │ │ ├── __init__.py │ │ ├── test_encoding.py │ │ ├── test_file_cache.py │ │ ├── test_history.py │ │ └── test_shell_utils.py │ ├── gemini/ │ │ ├── conftest.py │ │ ├── edit/ │ │ │ ├── __init__.py │ │ │ └── test_edit.py │ │ ├── list_directory/ │ │ │ ├── __init__.py │ │ │ └── test_list_directory.py │ │ ├── read_file/ │ │ │ ├── __init__.py │ │ │ └── test_read_file.py │ │ ├── test_cross_tool_locking.py │ │ └── write_file/ │ │ ├── __init__.py │ │ └── test_write_file.py │ ├── glob/ │ │ ├── __init__.py │ │ ├── test_consistency.py │ │ ├── test_glob_executor.py │ │ └── test_glob_tool.py │ ├── grep/ │ │ ├── __init__.py │ │ ├── test_consistency.py │ │ ├── test_grep_executor.py │ │ └── test_grep_tool.py │ ├── planning_file_editor/ │ │ └── test_planning_file_editor_tool.py │ ├── task/ │ │ ├── test_task_manager.py │ │ ├── test_task_manager_thread_safety.py │ │ └── test_task_tool_set.py │ ├── terminal/ │ │ ├── __init__.py │ │ ├── conftest.py │ │ ├── test_conversation_cleanup.py │ │ ├── test_escape_filter.py │ │ ├── test_heredoc_chunked_send.py │ │ ├── test_large_environment.py │ │ ├── test_observation_truncation.py │ │ ├── test_pool_integration.py │ │ ├── test_ps1_corruption.py │ │ ├── test_schema.py │ │ ├── test_secrets_masking.py │ │ ├── test_send_keys.py │ │ ├── test_session_factory.py │ │ ├── test_shell_path_configuration.py │ │ ├── test_shutdown_handling.py │ │ ├── test_terminal_exit_code_top_level.py │ │ ├── test_terminal_parsing.py │ │ ├── test_terminal_ps1_metadata.py │ │ ├── test_terminal_reset.py │ │ ├── test_terminal_session.py │ │ ├── test_terminal_tool.py │ │ ├── test_terminal_tool_auto_detection.py │ │ ├── test_tmux_pane_pool.py │ │ ├── test_windows_ctrl_c.py │ │ └── test_windows_terminal.py │ ├── test_builtin_agents.py │ ├── test_init.py │ ├── test_planning_preset.py │ ├── test_tool_name_consistency.py │ ├── test_tool_registration_check.py │ ├── test_working_dir_standardization.py │ └── tom_consult/ │ ├── __init__.py │ └── test_tom_consult_tool.py └── workspace/ ├── test_api_remote_workspace.py ├── test_apptainer_workspace.py ├── test_cloud_workspace.py ├── test_cloud_workspace_automation_tags.py ├── test_cloud_workspace_repos.py ├── test_cloud_workspace_sdk_settings.py ├── test_docker_workspace.py └── test_workspace_pause_resume.py