drydock-cli 2.10.2__tar.gz → 2.10.4__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.
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/PKG-INFO +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/admiral/detectors_proposed.py +3 -4
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/admiral/history.py +2 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/admiral/metrics.py +2 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/admiral/opus_escalator.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/admiral/persistence.py +3 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/admiral/stager.py +2 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/cli.py +2 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/entrypoint.py +44 -13
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/app.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +3 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/messages.py +4 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/agent_loop.py +113 -51
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/auto_solve.py +4 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/build_orchestrator.py +13 -15
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/checkpoint.py +3 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/classifier/classifier.py +2 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/classifier/dispatcher.py +1 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/classifier/rules.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/config/_dotenv.py +3 -4
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/config/local_detect.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/constraint_extract.py +5 -4
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/constraint_hint.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/context_recovery.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/drydock_states.py +1 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/goal.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/hooks.py +1 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/llm/format.py +3 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/llm/grammar/_llamacpp_converter.py +37 -32
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/llm/grammar/policy.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/llm/grammar/policy_union.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/programmatic.py +1 -1
- drydock_cli-2.10.4/drydock/core/prompts/gemma4.md +213 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/session/checkpoints.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/session/state_file.py +2 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/session_checker.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/_task_manager.py +0 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/algebra_tool.py +3 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/bash.py +19 -23
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/chemistry_tool.py +120 -120
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/count_tool.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/linear_algebra_tool.py +3 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/logic_tool.py +14 -15
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/lsp.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/math_tool.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/memory_tool.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/notebook_edit.py +2 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/number_theory_tool.py +3 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/powershell.py +1 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prolog_tool.py +4 -4
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/read_file.py +2 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/search_replace.py +11 -12
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/set_tool.py +3 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/solve_tool.py +3 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/stats_tool.py +5 -5
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/task.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/todo.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/tool_search.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/units_tool.py +3 -5
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/verify_tool.py +1 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/worktree.py +1 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/write_file.py +11 -45
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/injection_guard.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/curiosity/__main__.py +3 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/curiosity/gap_detector.py +2 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/curiosity/ingest.py +8 -8
- drydock_cli-2.10.4/drydock/data/cookbook/tbench_domains/dense_eigenvalue.md +135 -0
- drydock_cli-2.10.4/drydock/data/cookbook/tbench_domains/llm_batching_scheduler.md +137 -0
- drydock_cli-2.10.4/drydock/data/cookbook/tbench_domains/xss_filter.md +153 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/graphrag/__main__.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/graphrag/code_indexer.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/graphrag/storage.py +5 -6
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/graphrag/text_indexer.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/steering/applier.py +3 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/steering/config.py +3 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/steering/sandbox.py +2 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/steering/sidecar/hooks.py +8 -7
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/steering/train/capture.py +3 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/steering/train/extract_pairs.py +6 -5
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/steering/train/scan_sessions.py +7 -6
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/steering/vectors.py +3 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/pyproject.toml +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/stress/test_io_thrash.py +10 -7
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_admiral_intervention_outcome.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_admiral_session_id.py +1 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_agent_tasks.py +0 -8
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_algebra_tool.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_api_error_recovery.py +0 -1
- drydock_cli-2.10.4/tests/test_auto_retrieve_cookbook_bypass.py +52 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_auto_retrieve_soft_nudge.py +2 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_auto_solve.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_bank_build.py +5 -12
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_bank_debug.py +0 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_bank_multiagent.py +4 -10
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_bank_prd.py +7 -13
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_bank_tools.py +2 -6
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_bank_update.py +5 -13
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_build_projects.py +7 -7
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_checkpoint.py +0 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_chemistry_tool.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_classifier.py +0 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_config_migration.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_curiosity.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_current_bugs.py +4 -4
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_dispatch_report.py +2 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_dispatcher.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_drydock_regression.py +1 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_drydock_tasks.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_full_regression.py +12 -4
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_grammar.py +0 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_graphrag_worked_examples.py +0 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_hallucinated_tool_suppression.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_integration.py +0 -4
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_issue_fixes.py +0 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_linear_algebra_tool.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_local_detect.py +1 -1
- drydock_cli-2.10.4/tests/test_local_detect_fallback.py +86 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_logic_tool.py +0 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_loop_detection.py +16 -17
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_loop_regressions_2026_06_06.py +2 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_math_docs_lazy_injection.py +1 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_mcp_settings.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_multi_agent.py +4 -4
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_number_theory_tool.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_prolog_tool.py +0 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_read_file_not_found_listing.py +1 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_read_file_notebook_slim.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_real_failures.py +1 -5
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_real_issues.py +3 -6
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_real_workflow.py +3 -4
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_rejudge_hle.py +6 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_retrieval_consumer.py +3 -7
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_search_replace_args_not_truncated.py +2 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_search_replace_syntax_rollback.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_session_log_event.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_set_tool.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_smoke.py +2 -12
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_solve_tool.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_stats_tool.py +1 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_task_complete_nudge.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_tool_args.py +0 -3
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_tool_call_loops_regression_suite.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_truncate_args_valid_json.py +1 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_units_tool.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_user_issues.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_validation_error_scrub.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_workloads.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_write_file_missing_path.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/testbank_helpers.py +1 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_bash.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_bash_echo_escape_loop_breaker.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_bash_empty_search_loop_breaker.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_bash_heredoc_confirmation.py +2 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_pre_rename_hook.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_read_file_dedup_reembed.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_read_file_directory.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_read_file_limit_truncation.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_search_replace_dir_path.py +0 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_search_replace_empty_content.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_search_replace_file_not_found.py +1 -2
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_search_replace_first_failure_hint.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_search_replace_placeholder.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_search_replace_refused_loop_breaker.py +1 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_write_file_dedup_missing_imports.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_write_file_missing_main_module.py +0 -1
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_write_file_multifile_rename.py +0 -1
- drydock_cli-2.10.2/drydock/core/prompts/gemma4.md +0 -315
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/.gitignore +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/LICENSE +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/NOTICE +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/README.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/docs/README.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/__main__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/admiral/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/admiral/detectors.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/admiral/interventions.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/admiral/llm_analyzer.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/admiral/policy.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/admiral/proposer.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/admiral/task_classifier.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/admiral/tuning.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/admiral/validator.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/admiral/worker.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/fix_windows_path.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/classifier/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/classifier/__main__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/classifier/signal.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/config/doctor.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/config/migrate.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/llm/grammar/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/logger.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/paths/_drydock_home.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/prompts/gemma4_math.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/prompts/gemma4_slim.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/slug.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/spec_check.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/steering_hook.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/mechanical_rename.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/retrieve.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/types.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/core/utils.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/curiosity/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/curiosity/item.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/curiosity/queue.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/curiosity/surprise.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/data/cookbook/tbench_domains/biopython_dna.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/data/cookbook/tbench_domains/feal_cryptanalysis.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/data/cookbook/tbench_domains/mips_isa.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/data/cookbook/tbench_domains/path_tracing.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/data/cookbook/tbench_domains/vim_macros.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/graphrag/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/graphrag/retriever.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/setup/onboarding/screens/choice.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/setup/onboarding/screens/local_model.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/audit-tests/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/checklist/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/constraint-reasoning/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/logic/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/logic/assets/cheat_sheet_full.txt +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/prove/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/strong-tests/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/steering/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/steering/__main__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/steering/registry.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/steering/sidecar/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/steering/sidecar/header_parser.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/steering/sidecar/loader.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/steering/sidecar/server.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/steering/train/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/steering/train/compute_vector.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/whats_new.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/install_tests/README.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/install_tests/publish/README.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/install_tests/windows/README.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/scripts/README.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/scripts/_archived_eval_harness/README.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/scripts/llm/README.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/autocompletion/conftest.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/backend/test_generic_adapter_sanitize.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/conftest.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/e2e/common.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/mock/utils.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/stress/__init__.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_admiral.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_admiral_phase3.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_admiral_proposed.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_admiral_struggle_dedup.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_agents.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_approval_modal_stray_keys.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_constraint_extract.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_constraint_hint.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_context_recovery.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_count_tool.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_fake_tool_call_paren_syntax.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_gemma4_anti_loop_migration.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_gemma4_tool_filter.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_goal.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_graphrag.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_hle_aggregate.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_math_tool.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_mcp_stdio_command_normalization.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_memory_tool.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_message_id.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_middleware.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_retrieve_project_detection.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_retrieve_tool.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_safe_parse_tool_args.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_session_publish_on_resume.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_specialist_math_tools_hidden.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_steering.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_steering_capture.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_steering_compute_vector.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_steering_extract_pairs.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_steering_hook.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_steering_sidecar_chat_inputs.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_steering_sidecar_hooks.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_tool_stop_injected_scope.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_truncated_arg_path_hint.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_truncated_search_replace_escalation.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_truncated_write_escalation.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_verify_tool.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/test_wall_of_text_rescue.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_bash_binary_grep_hint.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_bash_consec_empty_search.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_bash_error_loop_breaker.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_manager_gemma_derived_models.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_search_replace_append_fallback.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_search_replace_hard_stop.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_search_replace_malformed_block.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/tools/test_write_file_missing_path_hint.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/uv.lock +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/web/README.md +0 -0
- {drydock_cli-2.10.2 → drydock_cli-2.10.4}/worked_examples/README.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drydock-cli
|
|
3
|
-
Version: 2.10.
|
|
3
|
+
Version: 2.10.4
|
|
4
4
|
Summary: Local-first CLI coding agent — tested with Gemma 4 26B via llama.cpp
|
|
5
5
|
Project-URL: Homepage, https://github.com/fbobe321/drydock
|
|
6
6
|
Project-URL: Repository, https://github.com/fbobe321/drydock
|
|
@@ -27,7 +27,6 @@ a clean "I have ..." / "The ... has been ..." summary.
|
|
|
27
27
|
from __future__ import annotations
|
|
28
28
|
|
|
29
29
|
from collections.abc import Sequence
|
|
30
|
-
from typing import Optional
|
|
31
30
|
|
|
32
31
|
from drydock.core.types import LLMMessage, Role
|
|
33
32
|
from drydock.admiral.detectors import Finding, _tool_sig
|
|
@@ -78,7 +77,7 @@ def _is_hallucinated_tool_result(m: LLMMessage) -> bool:
|
|
|
78
77
|
|
|
79
78
|
def detect_empty_after_tool(
|
|
80
79
|
messages: Sequence[LLMMessage],
|
|
81
|
-
) ->
|
|
80
|
+
) -> Finding | None:
|
|
82
81
|
"""Fires when the last assistant turn had no content AND no tool_calls,
|
|
83
82
|
immediately following a tool result.
|
|
84
83
|
|
|
@@ -102,7 +101,7 @@ def detect_empty_after_tool(
|
|
|
102
101
|
"""
|
|
103
102
|
# Walk backwards to find the last assistant message; look at the one
|
|
104
103
|
# before it.
|
|
105
|
-
last_assistant_idx:
|
|
104
|
+
last_assistant_idx: int | None = None
|
|
106
105
|
for i in range(len(messages) - 1, -1, -1):
|
|
107
106
|
if messages[i].role is Role.assistant:
|
|
108
107
|
last_assistant_idx = i
|
|
@@ -148,7 +147,7 @@ def detect_empty_after_tool(
|
|
|
148
147
|
|
|
149
148
|
def detect_retry_after_error(
|
|
150
149
|
messages: Sequence[LLMMessage],
|
|
151
|
-
) ->
|
|
150
|
+
) -> Finding | None:
|
|
152
151
|
"""Fires when an identical tool call follows an errored tool result.
|
|
153
152
|
|
|
154
153
|
In 400 sessions this fired 45 times (0.11/session). High-signal because
|
|
@@ -6,7 +6,7 @@ no JSON, no rotation logic, just append-only timestamped lines.
|
|
|
6
6
|
"""
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
|
-
from datetime import datetime,
|
|
9
|
+
from datetime import datetime, UTC
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
|
|
12
12
|
|
|
@@ -17,7 +17,7 @@ def _log_path() -> Path:
|
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
def append(event: str, detail: str) -> None:
|
|
20
|
-
ts = datetime.now(
|
|
20
|
+
ts = datetime.now(UTC).isoformat(timespec="seconds")
|
|
21
21
|
line = f"{ts} | {event} | {detail}\n"
|
|
22
22
|
with _log_path().open("a") as f:
|
|
23
23
|
f.write(line)
|
|
@@ -13,7 +13,7 @@ from __future__ import annotations
|
|
|
13
13
|
import logging
|
|
14
14
|
from collections.abc import Sequence
|
|
15
15
|
from dataclasses import asdict, dataclass, field
|
|
16
|
-
from datetime import datetime,
|
|
16
|
+
from datetime import datetime, UTC
|
|
17
17
|
from typing import TYPE_CHECKING
|
|
18
18
|
|
|
19
19
|
from drydock.admiral import persistence, task_classifier
|
|
@@ -75,7 +75,7 @@ def collect(agent_loop: AgentLoop, session_id: str, outcome: str = "unknown") ->
|
|
|
75
75
|
total, writes = _count_tool_calls(msgs)
|
|
76
76
|
tcpw = (total / writes) if writes else float(total)
|
|
77
77
|
return SessionMetrics(
|
|
78
|
-
ts=datetime.now(
|
|
78
|
+
ts=datetime.now(UTC).isoformat(timespec="seconds"),
|
|
79
79
|
model=model_name,
|
|
80
80
|
task_type=task_classifier.classify(msgs),
|
|
81
81
|
session_id=session_id,
|
|
@@ -98,7 +98,7 @@ async def _try_claude_cli(prompt: str) -> str | None:
|
|
|
98
98
|
stdout, _ = await asyncio.wait_for(
|
|
99
99
|
proc.communicate(), timeout=OPUS_TIMEOUT_SEC
|
|
100
100
|
)
|
|
101
|
-
except
|
|
101
|
+
except TimeoutError:
|
|
102
102
|
proc.kill()
|
|
103
103
|
await proc.wait()
|
|
104
104
|
return None
|
|
@@ -17,7 +17,7 @@ from __future__ import annotations
|
|
|
17
17
|
import json
|
|
18
18
|
import logging
|
|
19
19
|
import os
|
|
20
|
-
from datetime import datetime,
|
|
20
|
+
from datetime import datetime, UTC
|
|
21
21
|
from pathlib import Path
|
|
22
22
|
from typing import Any
|
|
23
23
|
|
|
@@ -76,7 +76,7 @@ def record_finding(code: str, session_id: str) -> dict[str, Any]:
|
|
|
76
76
|
if session_id and session_id not in entry["sessions"]:
|
|
77
77
|
entry["sessions"].append(session_id)
|
|
78
78
|
entry["total_fires"] = int(entry["total_fires"]) + 1
|
|
79
|
-
entry["last_seen"] = datetime.now(
|
|
79
|
+
entry["last_seen"] = datetime.now(UTC).isoformat(timespec="seconds")
|
|
80
80
|
save_state(state)
|
|
81
81
|
return entry
|
|
82
82
|
|
|
@@ -118,7 +118,7 @@ def record_proposal_fingerprint(code: str, fingerprint: str, status: str) -> Non
|
|
|
118
118
|
props.setdefault(code, []).append({
|
|
119
119
|
"fingerprint": fingerprint,
|
|
120
120
|
"status": status,
|
|
121
|
-
"ts": datetime.now(
|
|
121
|
+
"ts": datetime.now(UTC).isoformat(timespec="seconds"),
|
|
122
122
|
})
|
|
123
123
|
save_state(state)
|
|
124
124
|
|
|
@@ -10,7 +10,7 @@ from __future__ import annotations
|
|
|
10
10
|
import logging
|
|
11
11
|
import subprocess
|
|
12
12
|
from dataclasses import dataclass
|
|
13
|
-
from datetime import datetime,
|
|
13
|
+
from datetime import datetime, UTC
|
|
14
14
|
from pathlib import Path
|
|
15
15
|
|
|
16
16
|
from drydock.admiral import history, persistence
|
|
@@ -50,7 +50,7 @@ def stage(proposal: Proposal, validation: ValidationResult) -> StagedProposal |
|
|
|
50
50
|
if not validation.ok:
|
|
51
51
|
raise ValueError("refusing to stage a proposal that didn't pass validation")
|
|
52
52
|
|
|
53
|
-
ts = datetime.now(
|
|
53
|
+
ts = datetime.now(UTC).strftime("%Y%m%d-%H%M%S")
|
|
54
54
|
branch = f"admiral/{ts}-{_safe_code(proposal.code)}"
|
|
55
55
|
|
|
56
56
|
# Invariant: we ALWAYS branch from main.
|
|
@@ -23,8 +23,7 @@ from drydock.core.logger import logger
|
|
|
23
23
|
from drydock.core.paths import HISTORY_FILE
|
|
24
24
|
from drydock.core.programmatic import run_programmatic
|
|
25
25
|
from drydock.core.session.session_loader import SessionLoader
|
|
26
|
-
from drydock.core.types import EntrypointMetadata, LLMMessage,
|
|
27
|
-
from drydock.core.utils import ConversationLimitException
|
|
26
|
+
from drydock.core.types import EntrypointMetadata, LLMMessage, Role
|
|
28
27
|
from drydock.setup.onboarding import run_onboarding
|
|
29
28
|
|
|
30
29
|
|
|
@@ -254,6 +253,7 @@ def run_cli(args: argparse.Namespace) -> None:
|
|
|
254
253
|
# adding more prints.
|
|
255
254
|
import time as _t
|
|
256
255
|
_t0 = _t.perf_counter()
|
|
256
|
+
|
|
257
257
|
def _phase(name: str, start: float) -> float:
|
|
258
258
|
now = _t.perf_counter()
|
|
259
259
|
logger.warning("[TIMING:startup] %s=%.2fs", name, now - start)
|
|
@@ -230,19 +230,50 @@ def main() -> None:
|
|
|
230
230
|
# --local → set up local LLM provider without editing config
|
|
231
231
|
if getattr(args, "local", None):
|
|
232
232
|
os.environ["DRYDOCK_LOCAL_URL"] = args.local
|
|
233
|
-
#
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
233
|
+
# Respect an explicit env-var override (used by harness/CI).
|
|
234
|
+
# Otherwise probe /v1/models — retry once with a longer timeout
|
|
235
|
+
# because containerized tbench trials saw the 5s window expire on
|
|
236
|
+
# cold-start, falling back to model="local" which loses ALL
|
|
237
|
+
# Gemma 4 optimizations (slim prompt, tool disables, non-streaming).
|
|
238
|
+
if os.environ.get("DRYDOCK_LOCAL_MODEL", "").strip():
|
|
239
|
+
rprint(
|
|
240
|
+
f"[green]Using local model: "
|
|
241
|
+
f"{os.environ['DRYDOCK_LOCAL_MODEL']} at {args.local} "
|
|
242
|
+
f"(via DRYDOCK_LOCAL_MODEL env)[/]"
|
|
243
|
+
)
|
|
244
|
+
else:
|
|
245
|
+
model_name = None
|
|
246
|
+
try:
|
|
247
|
+
import httpx
|
|
248
|
+
for attempt in (1, 2):
|
|
249
|
+
try:
|
|
250
|
+
resp = httpx.get(f"{args.local}/models", timeout=15)
|
|
251
|
+
if resp.status_code == 200:
|
|
252
|
+
models = resp.json().get("data", [])
|
|
253
|
+
if models and models[0].get("id"):
|
|
254
|
+
model_name = models[0]["id"]
|
|
255
|
+
break
|
|
256
|
+
except Exception:
|
|
257
|
+
if attempt == 2:
|
|
258
|
+
raise
|
|
259
|
+
except Exception:
|
|
260
|
+
pass
|
|
261
|
+
if model_name:
|
|
262
|
+
os.environ["DRYDOCK_LOCAL_MODEL"] = model_name
|
|
263
|
+
rprint(f"[green]Using local model: {model_name} at {args.local}[/]")
|
|
264
|
+
else:
|
|
265
|
+
# Detection failed. Default to "gemma4" — drydock is
|
|
266
|
+
# optimized for Gemma 4 + llama.cpp per README, so this
|
|
267
|
+
# is the right fallback in the overwhelming common case.
|
|
268
|
+
# Loud warning lets the user override if they're running
|
|
269
|
+
# something else.
|
|
270
|
+
os.environ["DRYDOCK_LOCAL_MODEL"] = "gemma4"
|
|
271
|
+
rprint(
|
|
272
|
+
f"[yellow]Couldn't detect model name at {args.local}; "
|
|
273
|
+
f"defaulting to model=gemma4. Override with "
|
|
274
|
+
f"DRYDOCK_LOCAL_MODEL=<name> if the server runs a "
|
|
275
|
+
f"different model.[/]"
|
|
276
|
+
)
|
|
246
277
|
|
|
247
278
|
is_interactive = args.prompt is None
|
|
248
279
|
if is_interactive:
|
|
@@ -743,7 +743,6 @@ class DrydockApp(App): # noqa: PLR0904
|
|
|
743
743
|
else:
|
|
744
744
|
# Clean up unreplaced placeholders
|
|
745
745
|
skill_content = skill_content.replace("$ARGUMENTS", "")
|
|
746
|
-
import re
|
|
747
746
|
for i in range(10):
|
|
748
747
|
skill_content = skill_content.replace(f"$ARGUMENTS[{i}]", "")
|
|
749
748
|
skill_content = skill_content.replace(f"${i}", "")
|
{drydock_cli-2.10.2 → drydock_cli-2.10.4}/drydock/cli/textual_ui/widgets/checkpoint_picker.py
RENAMED
|
@@ -23,7 +23,7 @@ from textual.widgets.option_list import Option
|
|
|
23
23
|
from drydock.cli.textual_ui.widgets.no_markup_static import NoMarkupStatic
|
|
24
24
|
|
|
25
25
|
if TYPE_CHECKING:
|
|
26
|
-
from drydock.core.checkpoint import Checkpoint
|
|
26
|
+
from drydock.core.checkpoint import Checkpoint
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
_SECONDS_PER_MINUTE = 60
|
|
@@ -62,7 +62,7 @@ def _format_diff_stats(insertions: int, deletions: int,
|
|
|
62
62
|
return " ".join(parts)
|
|
63
63
|
|
|
64
64
|
|
|
65
|
-
def _build_checkpoint_option(cp:
|
|
65
|
+
def _build_checkpoint_option(cp: Checkpoint,
|
|
66
66
|
diff_summary: str) -> Text:
|
|
67
67
|
text = Text(no_wrap=True)
|
|
68
68
|
text.append(f"#{cp.index:>3} ", style="bold")
|
|
@@ -92,7 +92,7 @@ class CheckpointPickerApp(Container):
|
|
|
92
92
|
class Cancelled(Message):
|
|
93
93
|
"""User hit Esc."""
|
|
94
94
|
|
|
95
|
-
def __init__(self, checkpoints: list[
|
|
95
|
+
def __init__(self, checkpoints: list[Checkpoint],
|
|
96
96
|
diff_summaries: dict[int, str], **kwargs: Any) -> None:
|
|
97
97
|
super().__init__(id="checkpoint-picker", **kwargs)
|
|
98
98
|
self._checkpoints = checkpoints
|
|
@@ -380,7 +380,8 @@ class AssistantMessage(StreamingMessageBase):
|
|
|
380
380
|
self._content = rescued
|
|
381
381
|
await self._markdown.update("")
|
|
382
382
|
stream = self._ensure_stream()
|
|
383
|
-
|
|
383
|
+
if stream is not None:
|
|
384
|
+
await stream.write(rescued)
|
|
384
385
|
await super().stop_stream()
|
|
385
386
|
|
|
386
387
|
def compose(self) -> ComposeResult:
|
|
@@ -494,7 +495,8 @@ class ReasoningMessage(SpinnerMixin, StreamingMessageBase):
|
|
|
494
495
|
self._stream = None
|
|
495
496
|
await self._markdown.update("")
|
|
496
497
|
stream = self._ensure_stream()
|
|
497
|
-
|
|
498
|
+
if stream is not None:
|
|
499
|
+
await stream.write(self._content)
|
|
498
500
|
|
|
499
501
|
|
|
500
502
|
class UserCommandMessage(Static):
|
|
@@ -481,7 +481,7 @@ class AgentLoop:
|
|
|
481
481
|
# Newest first, since later prompts usually supersede earlier
|
|
482
482
|
# context. Number them so the model can refer back.
|
|
483
483
|
numbered = "\n".join(
|
|
484
|
-
f" ({i+1}) {text}"
|
|
484
|
+
f" ({i + 1}) {text}"
|
|
485
485
|
for i, text in enumerate(reversed(injections))
|
|
486
486
|
)
|
|
487
487
|
note = (
|
|
@@ -1012,11 +1012,12 @@ class AgentLoop:
|
|
|
1012
1012
|
self._last_post_edit_spec_fp = None
|
|
1013
1013
|
# Clear any stale auto-goal state from a previous turn — the
|
|
1014
1014
|
# user's new prompt may have nothing to do with the prior goal.
|
|
1015
|
-
|
|
1016
|
-
|
|
1015
|
+
_goal = getattr(self, "goal", None)
|
|
1016
|
+
if _goal is not None and getattr(_goal, "active", False):
|
|
1017
|
+
_cond = getattr(_goal, "condition", "") or ""
|
|
1017
1018
|
logger.warning(
|
|
1018
1019
|
"[recovery] clearing stale goal on new user turn: %r",
|
|
1019
|
-
|
|
1020
|
+
_cond[:80],
|
|
1020
1021
|
)
|
|
1021
1022
|
try:
|
|
1022
1023
|
self.clear_goal()
|
|
@@ -1347,7 +1348,7 @@ class AgentLoop:
|
|
|
1347
1348
|
if _elapsed > PER_PROMPT_BUDGET_SEC:
|
|
1348
1349
|
yield AssistantEvent(
|
|
1349
1350
|
content=(
|
|
1350
|
-
f"\n\n[Drydock: {int(_elapsed/60)} minutes "
|
|
1351
|
+
f"\n\n[Drydock: {int(_elapsed / 60)} minutes "
|
|
1351
1352
|
f"elapsed on this single prompt — over the "
|
|
1352
1353
|
f"{PER_PROMPT_BUDGET_SEC // 60}-min budget. "
|
|
1353
1354
|
"Stopping. Work done so far is on disk; "
|
|
@@ -1823,7 +1824,6 @@ class AgentLoop:
|
|
|
1823
1824
|
# message that didn't break loop because it had tool_calls)
|
|
1824
1825
|
self._consecutive_empty_turns = 0
|
|
1825
1826
|
else:
|
|
1826
|
-
streak = getattr(self, "_consecutive_empty_turns", 0)
|
|
1827
1827
|
# Count consecutive text-only assistant turns by walking
|
|
1828
1828
|
# backward through history.
|
|
1829
1829
|
text_only_streak = 0
|
|
@@ -2072,7 +2072,7 @@ class AgentLoop:
|
|
|
2072
2072
|
f"⚠ PREMATURE EXIT BLOCK #{nudges + 1}/10. "
|
|
2073
2073
|
f"The task explicitly names this verify "
|
|
2074
2074
|
f"command: `{missing_verify_cmds[0]}`"
|
|
2075
|
-
f"{' (+%d more)' % (len(missing_verify_cmds)-1) if len(missing_verify_cmds) > 1 else ''}"
|
|
2075
|
+
f"{' (+%d more)' % (len(missing_verify_cmds) - 1) if len(missing_verify_cmds) > 1 else ''}"
|
|
2076
2076
|
f". You have NOT run it. The external "
|
|
2077
2077
|
f"verifier will use that exact command (or "
|
|
2078
2078
|
f"equivalent) after you exit — run it NOW "
|
|
@@ -2165,9 +2165,8 @@ class AgentLoop:
|
|
|
2165
2165
|
"go test", "python ", "python3 ",
|
|
2166
2166
|
)
|
|
2167
2167
|
if any(cmd.strip().startswith(p) for p in safe_prefixes):
|
|
2168
|
+
import subprocess as _sub
|
|
2168
2169
|
try:
|
|
2169
|
-
import subprocess as _sub
|
|
2170
|
-
import shlex as _sx
|
|
2171
2170
|
_proc = _sub.run(
|
|
2172
2171
|
cmd, shell=True, capture_output=True,
|
|
2173
2172
|
timeout=45, text=True,
|
|
@@ -2220,13 +2219,13 @@ class AgentLoop:
|
|
|
2220
2219
|
# system note and DON'T break — let the agent loop
|
|
2221
2220
|
# do another iteration. Cap at goal.max_iterations.
|
|
2222
2221
|
# Targets P1-S1 / P1-S2 partial-completion failures.
|
|
2222
|
+
g = getattr(self, "goal", None)
|
|
2223
2223
|
if (should_break_loop
|
|
2224
|
-
and
|
|
2225
|
-
and getattr(
|
|
2224
|
+
and g is not None
|
|
2225
|
+
and getattr(g, "active", False)
|
|
2226
2226
|
and os.environ.get(
|
|
2227
2227
|
"DRYDOCK_AUTO_GOAL", "1"
|
|
2228
2228
|
).strip().lower() in ("1", "true", "yes")):
|
|
2229
|
-
g = self.goal
|
|
2230
2229
|
if g.iterations < g.max_iterations:
|
|
2231
2230
|
try:
|
|
2232
2231
|
ok, msg = self._verify_rename_goal(Path.cwd())
|
|
@@ -3135,7 +3134,7 @@ class AgentLoop:
|
|
|
3135
3134
|
if len(last_result) > 800:
|
|
3136
3135
|
result_preview = (
|
|
3137
3136
|
last_result[:400]
|
|
3138
|
-
+ f"\n …[{len(last_result)-400} chars omitted on dedup re-display]"
|
|
3137
|
+
+ f"\n …[{len(last_result) - 400} chars omitted on dedup re-display]"
|
|
3139
3138
|
)
|
|
3140
3139
|
else:
|
|
3141
3140
|
result_preview = last_result
|
|
@@ -3733,11 +3732,11 @@ class AgentLoop:
|
|
|
3733
3732
|
sr_args = tool_call.args_dict
|
|
3734
3733
|
sr_path = sr_args.get("file_path", sr_args.get("path", ""))
|
|
3735
3734
|
if sr_path and Path(sr_path).exists():
|
|
3736
|
-
with open(sr_path,
|
|
3735
|
+
with open(sr_path, encoding="utf-8", errors="replace") as f:
|
|
3737
3736
|
lines = f.readlines()
|
|
3738
3737
|
# Show first 50 lines or the whole file if small
|
|
3739
3738
|
preview_lines = lines[:50]
|
|
3740
|
-
numbered = [f"{i+1}\t{line.rstrip()}" for i, line in enumerate(preview_lines)]
|
|
3739
|
+
numbered = [f"{i + 1}\t{line.rstrip()}" for i, line in enumerate(preview_lines)]
|
|
3741
3740
|
auto_read_content = (
|
|
3742
3741
|
f"\n\nAUTO-READ of {sr_path} (first {len(preview_lines)} lines):\n"
|
|
3743
3742
|
+ "\n".join(numbered)
|
|
@@ -3886,7 +3885,7 @@ class AgentLoop:
|
|
|
3886
3885
|
"Empty content provided", # search_replace empty content
|
|
3887
3886
|
"REFUSED: write blocked", # write_file pre-write syntax gate (2026-05-31)
|
|
3888
3887
|
"REFUSED: bash inplace file edit", # bash sed -i redirect (2026-05-31)
|
|
3889
|
-
"REFUSED: bash redirect-to-source-file",
|
|
3888
|
+
"REFUSED: bash redirect-to-source-file", # bash > file redirect (2026-05-31)
|
|
3890
3889
|
# Pydantic schema rejections — model emitted `{}` for required-field tool.
|
|
3891
3890
|
# Found in operator session 2026-05-31 14:24: model called bash({}) repeatedly
|
|
3892
3891
|
# after a REFUSED sed -i, dispatcher rejected with this exact text, and the
|
|
@@ -3913,7 +3912,7 @@ class AgentLoop:
|
|
|
3913
3912
|
)
|
|
3914
3913
|
|
|
3915
3914
|
def _scrub_validation_error_call(
|
|
3916
|
-
self, failed_tool_call:
|
|
3915
|
+
self, failed_tool_call: ResolvedToolCall
|
|
3917
3916
|
) -> None:
|
|
3918
3917
|
"""Strip the args of a validation-error tool_call from history.
|
|
3919
3918
|
|
|
@@ -4652,10 +4651,10 @@ class AgentLoop:
|
|
|
4652
4651
|
)
|
|
4653
4652
|
if not passed:
|
|
4654
4653
|
note += (
|
|
4655
|
-
|
|
4656
|
-
|
|
4657
|
-
|
|
4658
|
-
|
|
4654
|
+
"\nThe test suite went RED after your edit. Read the failure "
|
|
4655
|
+
"above, fix the cause BEFORE declaring done or moving to a "
|
|
4656
|
+
"different file. Re-running pytest manually if you need a "
|
|
4657
|
+
"fresh view.\n"
|
|
4659
4658
|
)
|
|
4660
4659
|
self._inject_system_note(note)
|
|
4661
4660
|
logger.warning(
|
|
@@ -5133,23 +5132,6 @@ class AgentLoop:
|
|
|
5133
5132
|
)
|
|
5134
5133
|
if not is_stub:
|
|
5135
5134
|
continue
|
|
5136
|
-
# Extract path hint from any of the known fields.
|
|
5137
|
-
path_hint = ""
|
|
5138
|
-
for k in ("path", "file_path", "command", "cmd",
|
|
5139
|
-
"url", "file"):
|
|
5140
|
-
v = parsed.get(k)
|
|
5141
|
-
if isinstance(v, str) and v:
|
|
5142
|
-
path_hint = (
|
|
5143
|
-
v if len(v) <= 200 else v[:200] + "…"
|
|
5144
|
-
)
|
|
5145
|
-
break
|
|
5146
|
-
# Try to recover an approximate original size.
|
|
5147
|
-
orig_bytes = parsed.get("_original_bytes")
|
|
5148
|
-
size_str = (
|
|
5149
|
-
f"original {int(orig_bytes)} bytes"
|
|
5150
|
-
if isinstance(orig_bytes, (int, float))
|
|
5151
|
-
else "compacted"
|
|
5152
|
-
)
|
|
5153
5135
|
# 2026-05-29: upgrade legacy AND post-2026-05-24 stubs
|
|
5154
5136
|
# (which used the marker key `__drydock_compacted_args__`)
|
|
5155
5137
|
# to the new empty-args format `{}`. The marker-bearing
|
|
@@ -5158,10 +5140,9 @@ class AgentLoop:
|
|
|
5158
5140
|
# fake arg, triggering format.py's placeholder-loop
|
|
5159
5141
|
# recovery dance. Empty args produce a clean pydantic
|
|
5160
5142
|
# field-required error instead. Path hint and size
|
|
5161
|
-
# info
|
|
5162
|
-
#
|
|
5143
|
+
# info dropped — debugging value was offset by the
|
|
5144
|
+
# copy-bait cost.
|
|
5163
5145
|
tc.function.arguments = "{}"
|
|
5164
|
-
_ = size_str # retain for future logging if useful
|
|
5165
5146
|
try:
|
|
5166
5147
|
self.stats.legacy_stubs_upgraded += 1
|
|
5167
5148
|
except Exception:
|
|
@@ -6158,7 +6139,7 @@ class AgentLoop:
|
|
|
6158
6139
|
# Truncate args for readability
|
|
6159
6140
|
if len(args_str) > 120:
|
|
6160
6141
|
args_str = args_str[:120] + "..."
|
|
6161
|
-
recent.append(f" {count+1}. {name}({args_str})")
|
|
6142
|
+
recent.append(f" {count + 1}. {name}({args_str})")
|
|
6162
6143
|
count += 1
|
|
6163
6144
|
if count >= 8:
|
|
6164
6145
|
break
|
|
@@ -6166,11 +6147,11 @@ class AgentLoop:
|
|
|
6166
6147
|
# Add result summary to last entry
|
|
6167
6148
|
result = str(msg.content or "")[:150]
|
|
6168
6149
|
if "error" in result.lower() or "Error" in result:
|
|
6169
|
-
recent[-1] +=
|
|
6150
|
+
recent[-1] += " → ERROR"
|
|
6170
6151
|
elif "not found" in result.lower():
|
|
6171
|
-
recent[-1] +=
|
|
6152
|
+
recent[-1] += " → NOT FOUND"
|
|
6172
6153
|
else:
|
|
6173
|
-
recent[-1] +=
|
|
6154
|
+
recent[-1] += " → ok"
|
|
6174
6155
|
|
|
6175
6156
|
if len(recent) < 3:
|
|
6176
6157
|
return None
|
|
@@ -6592,7 +6573,6 @@ class AgentLoop:
|
|
|
6592
6573
|
):
|
|
6593
6574
|
return
|
|
6594
6575
|
|
|
6595
|
-
from drydock.core.prompts import SystemPrompt
|
|
6596
6576
|
try:
|
|
6597
6577
|
# SystemPrompt enum value names lowercased = file stems.
|
|
6598
6578
|
# gemma4_math isn't in the enum — load by path.
|
|
@@ -7196,6 +7176,43 @@ class AgentLoop:
|
|
|
7196
7176
|
logger.warning("[AUTO-RETRIEVE] setup failed: %s", e, exc_info=True)
|
|
7197
7177
|
return
|
|
7198
7178
|
|
|
7179
|
+
# 2026-06-08: first-call lazy bootstrap. Inside fresh containers
|
|
7180
|
+
# (tbench trials, fresh pip-install drydock-cli) the home DB
|
|
7181
|
+
# doesn't exist, so AUTO-RETRIEVE silently no-ops and the
|
|
7182
|
+
# bundled cookbook never gets a chance. Detect that case and
|
|
7183
|
+
# ingest the bundled cookbook into ~/.drydock/graphrag.sqlite
|
|
7184
|
+
# one time. Opt-out via DRYDOCK_AUTO_BOOTSTRAP_GRAPHRAG=0.
|
|
7185
|
+
if not getattr(self, "_graphrag_bootstrap_attempted", False):
|
|
7186
|
+
self._graphrag_bootstrap_attempted = True
|
|
7187
|
+
if os.environ.get(
|
|
7188
|
+
"DRYDOCK_AUTO_BOOTSTRAP_GRAPHRAG", "1"
|
|
7189
|
+
).strip().lower() not in ("0", "false", "no"):
|
|
7190
|
+
try:
|
|
7191
|
+
_home_db_check = Path.home() / ".drydock" / "graphrag.sqlite"
|
|
7192
|
+
if not _home_db_check.is_file():
|
|
7193
|
+
import drydock as _dd
|
|
7194
|
+
_bundle = (
|
|
7195
|
+
Path(_dd.__file__).parent
|
|
7196
|
+
/ "data" / "cookbook"
|
|
7197
|
+
)
|
|
7198
|
+
if _bundle.is_dir():
|
|
7199
|
+
_home_db_check.parent.mkdir(parents=True, exist_ok=True)
|
|
7200
|
+
logger.warning(
|
|
7201
|
+
"[AUTO-RETRIEVE] bootstrap: ingesting bundled "
|
|
7202
|
+
"cookbook %s into %s",
|
|
7203
|
+
_bundle, _home_db_check,
|
|
7204
|
+
)
|
|
7205
|
+
_bootstrap_idx = Index(str(_home_db_check))
|
|
7206
|
+
_counts = _bootstrap_idx.ingest_path(_bundle)
|
|
7207
|
+
logger.warning(
|
|
7208
|
+
"[AUTO-RETRIEVE] bootstrap done: %d files / "
|
|
7209
|
+
"%d chunks",
|
|
7210
|
+
_counts.get("files", 0),
|
|
7211
|
+
_counts.get("chunks", 0),
|
|
7212
|
+
)
|
|
7213
|
+
except Exception as e:
|
|
7214
|
+
logger.warning("[AUTO-RETRIEVE] bootstrap failed: %s", e)
|
|
7215
|
+
|
|
7199
7216
|
# Skip auto-retrieve for file-producing tasks (terminal-bench /
|
|
7200
7217
|
# harbor wraps everything with "This task has multiple steps...").
|
|
7201
7218
|
# Retrieve adds 2K tokens of (usually irrelevant) cookbook content
|
|
@@ -7219,13 +7236,60 @@ class AgentLoop:
|
|
|
7219
7236
|
# tool calls (write_file/bash) not a text-only retrieval response.
|
|
7220
7237
|
or ("__init__.py" in msg_text and "Requirements:" in msg_text)
|
|
7221
7238
|
)
|
|
7222
|
-
|
|
7239
|
+
# 2026-06-08: file-task skip used to be unconditional unless
|
|
7240
|
+
# DRYDOCK_AUTO_RETRIEVE_FORCE_ON. That blocked cookbook chunks
|
|
7241
|
+
# (path-tracing, MIPS, FEAL, etc.) from helping tbench multi-step
|
|
7242
|
+
# prompts — exactly the cases where domain cookbook IS the
|
|
7243
|
+
# missing piece. New behavior: do a probe retrieve first; if the
|
|
7244
|
+
# top hit scores >= AUTO_RETRIEVE_BYPASS_SCORE (25.0 by default,
|
|
7245
|
+
# well above the 8.0 quality floor and the typical "incidental
|
|
7246
|
+
# match" range), inject it regardless of file-task heuristic.
|
|
7247
|
+
# Generic noise (binary_search code injected into chess-best-move)
|
|
7248
|
+
# rarely scores that high — the chess prompt's top hit was ~12.
|
|
7249
|
+
_bypass = False
|
|
7250
|
+
if is_file_task:
|
|
7251
|
+
try:
|
|
7252
|
+
_bypass_thresh = float(os.environ.get(
|
|
7253
|
+
"DRYDOCK_AUTO_RETRIEVE_BYPASS_SCORE", "25.0"
|
|
7254
|
+
))
|
|
7255
|
+
except ValueError:
|
|
7256
|
+
_bypass_thresh = 25.0
|
|
7257
|
+
# Cheap probe — short query, just enough to read the top score.
|
|
7258
|
+
try:
|
|
7259
|
+
from drydock.graphrag import Index as _Probe
|
|
7260
|
+
_probe_query = (user_msg or "").strip()[:300]
|
|
7261
|
+
if _probe_query:
|
|
7262
|
+
_env_db = os.environ.get("DRYDOCK_GRAPHRAG_DB")
|
|
7263
|
+
_home_db = str(Path.home() / ".drydock" / "graphrag.sqlite")
|
|
7264
|
+
_project_db = Path.cwd() / ".drydock" / "graphrag.sqlite"
|
|
7265
|
+
_probe_db = _env_db or (
|
|
7266
|
+
str(_project_db) if _project_db.is_file() else _home_db
|
|
7267
|
+
)
|
|
7268
|
+
if Path(_probe_db).is_file():
|
|
7269
|
+
_r = _Probe(_probe_db).retrieve(
|
|
7270
|
+
_probe_query, symbol_limit=0, text_limit=1
|
|
7271
|
+
)
|
|
7272
|
+
_top = _r.text[0] if _r.text else None
|
|
7273
|
+
_top_score = getattr(_top, 'score', 0.0) if _top else 0.0
|
|
7274
|
+
if _top_score >= _bypass_thresh:
|
|
7275
|
+
_bypass = True
|
|
7276
|
+
logger.warning(
|
|
7277
|
+
"[AUTO-RETRIEVE] file-task SKIP bypassed by "
|
|
7278
|
+
"strong cookbook hit (score=%.1f >= %.1f)",
|
|
7279
|
+
_top_score, _bypass_thresh,
|
|
7280
|
+
)
|
|
7281
|
+
except Exception as e:
|
|
7282
|
+
logger.warning("[AUTO-RETRIEVE] probe failed: %s", e)
|
|
7283
|
+
|
|
7284
|
+
if is_file_task and not _bypass and os.environ.get(
|
|
7223
7285
|
"DRYDOCK_AUTO_RETRIEVE_FORCE_ON", ""
|
|
7224
7286
|
).strip().lower() not in ("1", "true", "yes"):
|
|
7225
7287
|
logger.warning(
|
|
7226
7288
|
"[AUTO-RETRIEVE] skipped — file-production task detected "
|
|
7227
|
-
"(harbor wrap / multiple /app/ or /tmp/ paths)
|
|
7228
|
-
"with
|
|
7289
|
+
"(harbor wrap / multiple /app/ or /tmp/ paths) and probe "
|
|
7290
|
+
"found no strong cookbook hit. Override with "
|
|
7291
|
+
"DRYDOCK_AUTO_RETRIEVE_FORCE_ON=1 or lower "
|
|
7292
|
+
"DRYDOCK_AUTO_RETRIEVE_BYPASS_SCORE."
|
|
7229
7293
|
)
|
|
7230
7294
|
return
|
|
7231
7295
|
|
|
@@ -7301,7 +7365,6 @@ class AgentLoop:
|
|
|
7301
7365
|
db_chain.append(fallback_db)
|
|
7302
7366
|
|
|
7303
7367
|
good_hits: list = []
|
|
7304
|
-
text_hits: list = []
|
|
7305
7368
|
used_db: str | None = None
|
|
7306
7369
|
for db in db_chain:
|
|
7307
7370
|
if not Path(db).is_file():
|
|
@@ -7336,7 +7399,6 @@ class AgentLoop:
|
|
|
7336
7399
|
db, len(hits), len(gh), QUALITY_THRESHOLD,
|
|
7337
7400
|
)
|
|
7338
7401
|
if gh:
|
|
7339
|
-
text_hits = hits
|
|
7340
7402
|
good_hits = gh
|
|
7341
7403
|
used_db = db
|
|
7342
7404
|
break
|
|
@@ -77,6 +77,7 @@ def _emit_telemetry(record: dict) -> None:
|
|
|
77
77
|
except OSError:
|
|
78
78
|
pass
|
|
79
79
|
|
|
80
|
+
|
|
80
81
|
if TYPE_CHECKING:
|
|
81
82
|
from drydock.core.constraint_extract import ExtractResult
|
|
82
83
|
|
|
@@ -95,7 +96,7 @@ _DEFAULT_BOUNDS = {
|
|
|
95
96
|
}
|
|
96
97
|
|
|
97
98
|
|
|
98
|
-
def _build_args(extr:
|
|
99
|
+
def _build_args(extr: ExtractResult) -> dict | None:
|
|
99
100
|
"""Build the SolveArgs dict for this ExtractResult, or None if the
|
|
100
101
|
predicate isn't one Z3 can decide. The dict is what the model
|
|
101
102
|
*would* have written when calling the tool — used both for the
|
|
@@ -249,7 +250,7 @@ def _run_solve_sync(args_dict: dict) -> dict | None:
|
|
|
249
250
|
# bounds the whole orchestration including streaming setup.
|
|
250
251
|
wall_ms = int(args_dict.get("timeout_ms", 15000)) + 5000
|
|
251
252
|
result = asyncio.run(asyncio.wait_for(_run(), timeout=wall_ms / 1000))
|
|
252
|
-
except
|
|
253
|
+
except TimeoutError:
|
|
253
254
|
logger.warning("[AUTO-SOLVE] hard timeout exceeded")
|
|
254
255
|
return None
|
|
255
256
|
except RuntimeError as e:
|
|
@@ -267,7 +268,7 @@ def _run_solve_sync(args_dict: dict) -> dict | None:
|
|
|
267
268
|
|
|
268
269
|
|
|
269
270
|
def _format_result(args_dict: dict, result_dict: dict,
|
|
270
|
-
extr:
|
|
271
|
+
extr: ExtractResult) -> str:
|
|
271
272
|
"""Render the Solve result the way the real Solve tool prints it,
|
|
272
273
|
matching what the model sees from a normal tool call. Adds a
|
|
273
274
|
one-line summary at the bottom so the model can extract the
|