coderio 0.5.0__tar.gz → 0.6.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- coderio-0.6.1/.github/PULL_REQUEST_TEMPLATE.md +8 -0
- {coderio-0.5.0 → coderio-0.6.1}/.github/workflows/ci.yml +13 -5
- {coderio-0.5.0 → coderio-0.6.1}/.github/workflows/release.yml +45 -8
- {coderio-0.5.0 → coderio-0.6.1}/CHANGELOG.md +206 -1
- {coderio-0.5.0 → coderio-0.6.1}/CONTRIBUTING.md +29 -0
- {coderio-0.5.0 → coderio-0.6.1}/PKG-INFO +7 -2
- {coderio-0.5.0 → coderio-0.6.1}/README.md +2 -2
- {coderio-0.5.0 → coderio-0.6.1}/README_en.md +1 -1
- {coderio-0.5.0 → coderio-0.6.1}/ROADMAP.md +0 -2
- {coderio-0.5.0 → coderio-0.6.1}/docs/CONFIG.md +2 -1
- coderio-0.6.1/docs/benchmarks/step5-preview-3arm-2026-09-29.json +1310 -0
- coderio-0.6.1/docs/benchmarks/step5-preview-3arm-2026-09-29.md +195 -0
- coderio-0.6.1/docs/benchmarks/step5-preview-4arm-2026-09-29.json +1532 -0
- coderio-0.6.1/docs/benchmarks/step5-preview-4arm-2026-09-29.md +213 -0
- coderio-0.6.1/docs/benchmarks/step5-preview-coderio-vs-stepcli-2026-09-29.json +185 -0
- coderio-0.6.1/docs/benchmarks/step5-preview-coderio-vs-stepcli-2026-09-29.md +70 -0
- coderio-0.6.1/docs/benchmarks/terminal-bench-core-0.1.1-coderio-2026-10-10.md +42 -0
- coderio-0.6.1/docs/benchmarks/terminal-bench-scoreboard-2026-10-10.json +50 -0
- {coderio-0.5.0 → coderio-0.6.1}/docs/coderio-architecture.md +3 -4
- coderio-0.6.1/docs/live-eval/results-2026-09-21-water18-0910.json +236 -0
- coderio-0.6.1/docs/live-eval/results-2026-09-21-water18-0910.md +69 -0
- coderio-0.6.1/docs/live-eval/results-2026-09-23-step-3.7-flash.json +231 -0
- coderio-0.6.1/docs/live-eval/results-2026-09-23-step-3.7-flash.md +31 -0
- coderio-0.6.1/docs/live-eval/results-2026-09-24-step-3.7-flash.json +19 -0
- coderio-0.6.1/docs/live-eval/results-2026-09-24-step-3.7-flash.md +30 -0
- {coderio-0.5.0 → coderio-0.6.1}/pyproject.toml +13 -2
- coderio-0.6.1/scripts/architecture/check.py +307 -0
- coderio-0.6.1/scripts/live_eval/__init__.py +29 -0
- coderio-0.6.1/scripts/live_eval/bench_tasks.py +395 -0
- coderio-0.6.1/scripts/live_eval/compare_step_cli.py +328 -0
- coderio-0.6.1/scripts/live_eval/run.py +317 -0
- coderio-0.6.1/scripts/live_eval/tasks.py +418 -0
- {coderio-0.5.0 → coderio-0.6.1}/scripts/verify_deepagent_live.py +3 -3
- {coderio-0.5.0 → coderio-0.6.1}/scripts/verify_harness_live.py +4 -5
- coderio-0.6.1/src/coderio/agent/_content.py +61 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/agent/_deepagents_compat.py +45 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/agent/deep_loop.py +236 -32
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/agent/harness.py +177 -5
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/agent/harness_middleware.py +132 -40
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/agent/hooks.py +4 -9
- coderio-0.6.1/src/coderio/agent/microcompact.py +119 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/cli/app.py +5 -1
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/cli/commands.py +1 -1
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/cli/credentials.py +6 -1
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/cli/multimodal.py +39 -10
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/cli/repl.py +54 -39
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/cli/run_cmd.py +75 -11
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/cli/stream_controller.py +21 -11
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/cli/tui.py +13 -4
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/cli/tui_onboarding.py +11 -5
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/cli/tui_runtime.py +15 -4
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/config/loader.py +12 -1
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/config/models.py +5 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/config/trust.py +99 -84
- coderio-0.6.1/src/coderio/llm/factory.py +343 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/mcp_loader.py +8 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/session/message.py +4 -3
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/session/store.py +48 -45
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/command_policy.py +64 -60
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/grep_tool.py +30 -3
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/permission.py +47 -9
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/read_file.py +18 -2
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/sandbox_runner.py +21 -6
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/web_fetch.py +48 -35
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/win_sandbox.py +173 -131
- {coderio-0.5.0 → coderio-0.6.1}/tests/agent/test_deep_integration.py +127 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/agent/test_deep_loop_unit.py +125 -4
- {coderio-0.5.0 → coderio-0.6.1}/tests/agent/test_deepagents_compat.py +35 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/agent/test_harness.py +228 -1
- {coderio-0.5.0 → coderio-0.6.1}/tests/agent/test_harness_middleware.py +149 -0
- coderio-0.6.1/tests/agent/test_live_script_contract.py +94 -0
- coderio-0.6.1/tests/agent/test_microcompact.py +113 -0
- coderio-0.6.1/tests/agent/test_usage_normalization.py +178 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_commands.py +2 -2
- coderio-0.6.1/tests/cli/test_credentials_backup_permissions.py +29 -0
- coderio-0.6.1/tests/cli/test_gate_builder.py +101 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_multimodal.py +48 -0
- coderio-0.6.1/tests/cli/test_onboarding_wizard.py +96 -0
- coderio-0.6.1/tests/cli/test_providers.py +238 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_repl_loop.py +13 -5
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_run_cmd.py +97 -21
- coderio-0.6.1/tests/cli/test_tui_gate_fail_closed.py +43 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_tui_startup.py +48 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/e2e/test_cli_e2e.py +6 -1
- coderio-0.6.1/tests/llm/test_resolved_model_name.py +45 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/session/test_store.py +82 -45
- coderio-0.6.1/tests/test_architecture_policy.py +82 -0
- coderio-0.6.1/tests/test_bench_tasks.py +89 -0
- coderio-0.6.1/tests/test_live_eval.py +374 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/test_mcp_loader.py +23 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/test_p0_stability.py +11 -3
- coderio-0.6.1/tests/tools/test_command_policy_golden.py +126 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/tools/test_file_tools.py +28 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/tools/test_grep_tool.py +42 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/tools/test_permission.py +104 -6
- coderio-0.6.1/tests/tools/test_posix_process_tree.py +51 -0
- coderio-0.6.1/tests/tools/test_web.py +267 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/tools/test_web_fetch.py +46 -5
- {coderio-0.5.0 → coderio-0.6.1}/uv.lock +13 -13
- coderio-0.5.0/src/coderio/llm/factory.py +0 -165
- coderio-0.5.0/tests/cli/test_gate_builder.py +0 -75
- coderio-0.5.0/tests/cli/test_providers.py +0 -65
- coderio-0.5.0/tests/tools/test_web.py +0 -72
- {coderio-0.5.0 → coderio-0.6.1}/.github/dependabot.yml +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/.gitignore +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/LICENSE +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/ROADMAP_en.md +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/THIRD_PARTY_LICENSES.md +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/demo.gif +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/docs/images/confirm-menu.svg +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/docs/images/harness-warn.svg +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/docs/images/todo-panel.svg +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/__init__.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/agent/__init__.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/agent/command_review.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/agent/custom_agents.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/agent/permission_middleware.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/agent/plan_artifact.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/agent/project_instructions.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/agent/prompts.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/agent/skill_tool.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/agent/state.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/agent/stream.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/agent/sync_only.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/cli/__init__.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/cli/custom_commands.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/cli/mcp_cmd.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/cli/onboarding.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/cli/providers.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/cli/render.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/cli/skills_cmd.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/cli/stream.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/cli/tui_screens.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/cli/tui_widgets.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/config/__init__.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/config/bootstrap.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/llm/__init__.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/llm/probe.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/session/__init__.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/__init__.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/bundled/executing-plans/SKILL.md +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/LICENSE +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/README.md +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/clarifying-questions/SKILL.md +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/clarifying-questions/evals/evals.json +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/code-review/SKILL.md +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/code-review/evals/evals.json +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/commit-message/SKILL.md +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/commit-message/evals/evals.json +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/debugging/SKILL.md +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/debugging/evals/evals.json +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/error-handling/SKILL.md +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/error-handling/evals/evals.json +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/lion-writing-skills/SKILL.md +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/lion-writing-skills/evals/evals.json +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/naming/SKILL.md +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/naming/evals/evals.json +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/onboarding-unknown-codebase/SKILL.md +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/onboarding-unknown-codebase/evals/evals.json +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/spec-writing/SKILL.md +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/spec-writing/evals/evals.json +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/task-breakdown/SKILL.md +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/task-breakdown/evals/evals.json +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/testing/SKILL.md +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/testing/evals/evals.json +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/verify-and-fix/SKILL.md +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/lion-skills/skills/verify-and-fix/evals/evals.json +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/models.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/parser.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/skills/store.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/__init__.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/base.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/bash.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/checkpoint.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/confirm_diff.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/edit_file.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/glob_tool.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/linux_sandbox.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/list_dir.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/multi_edit.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/note.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/taxonomy.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/todo.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/web_search.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/win_job.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/src/coderio/tools/write_file.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/__init__.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/agent/__init__.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/agent/conftest.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/agent/test_command_review.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/agent/test_custom_agents.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/agent/test_deep_loop.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/agent/test_hooks.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/agent/test_perf_baseline.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/agent/test_plan_artifact.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/agent/test_production_seam.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/agent/test_project_instructions.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/agent/test_prompts.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/agent/test_skill_tool.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/agent/test_state.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/agent/test_stream.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/agent/test_sync_only_middleware.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/__init__.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_app.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_app_commands.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_command_menu.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_credentials.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_custom_commands.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_input_isolation.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_live_thinking.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_mcp_cmd.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_onboarding.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_onboarding_logic.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_render.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_repl_reset.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_skills_cmd.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_status_bar.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_stream.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_stream_controller.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_truncation.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_tui_onboarding.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_tui_picker.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_tui_runtime.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_tui_runtime_screens.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_tui_screens.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_tui_widgets.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/cli/test_ux_features.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/config/__init__.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/config/test_bootstrap.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/config/test_loader.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/config/test_models.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/config/test_trust.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/conftest.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/e2e/__init__.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/llm/__init__.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/llm/test_factory.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/llm/test_probe.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/session/__init__.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/session/test_message.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/skills/__init__.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/skills/test_bundled.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/skills/test_parser.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/skills/test_skill_tools.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/skills/test_store.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/test_repl.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/test_seams.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/test_version.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/tools/__init__.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/tools/test_bash.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/tools/test_checkpoint.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/tools/test_command_policy.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/tools/test_concrete_gates.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/tools/test_confirm_diff.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/tools/test_edit_prefix.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/tools/test_glob_tool.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/tools/test_list_dir.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/tools/test_multi_edit.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/tools/test_note.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/tools/test_registry.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/tools/test_sandbox.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/tools/test_search_tools.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/tools/test_todo.py +0 -0
- {coderio-0.5.0 → coderio-0.6.1}/tests/tools/test_win_job.py +0 -0
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
name: CI
|
|
2
2
|
|
|
3
|
+
# Action SHAs are pinned to full commits (external review 2026-09-05, P1-3):
|
|
4
|
+
# mutable tags held write/OIDC permissions, so an upstream re-point would
|
|
5
|
+
# widen the supply-chain attack surface. Bump via a PR that updates the SHA
|
|
6
|
+
# (and its version comment) together.
|
|
7
|
+
|
|
3
8
|
on:
|
|
4
9
|
push:
|
|
5
10
|
branches: [main]
|
|
@@ -10,8 +15,8 @@ jobs:
|
|
|
10
15
|
lint:
|
|
11
16
|
runs-on: ubuntu-latest
|
|
12
17
|
steps:
|
|
13
|
-
- uses: actions/checkout@v7
|
|
14
|
-
- uses: actions/setup-python@v7
|
|
18
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
19
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
|
|
15
20
|
with:
|
|
16
21
|
python-version: "3.12"
|
|
17
22
|
- name: Install ruff
|
|
@@ -40,7 +45,7 @@ jobs:
|
|
|
40
45
|
PYTHONUTF8: "1"
|
|
41
46
|
|
|
42
47
|
steps:
|
|
43
|
-
- uses: actions/checkout@v7
|
|
48
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
44
49
|
|
|
45
50
|
# uv replaces pip for dependency installation (2026-08-14 migration).
|
|
46
51
|
# uv.lock is a first-class lockfile for both uv and Dependabot: CI gets
|
|
@@ -48,7 +53,7 @@ jobs:
|
|
|
48
53
|
# constraints AND regenerates uv.lock in its PRs — the two mechanisms
|
|
49
54
|
# cooperate instead of fighting (the bare requirements-dev.txt approach
|
|
50
55
|
# had Dependabot produce internally-inconsistent updates; see PR #6).
|
|
51
|
-
- uses: astral-sh/setup-uv@v7
|
|
56
|
+
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
|
|
52
57
|
with:
|
|
53
58
|
python-version: ${{ matrix.python-version }}
|
|
54
59
|
enable-cache: true
|
|
@@ -71,10 +76,13 @@ jobs:
|
|
|
71
76
|
# scan decorative — known CVEs could never turn CI red). If a flagged
|
|
72
77
|
# vuln is a false positive / unfixable, add an explicit --ignore-vuln
|
|
73
78
|
# with a comment rather than re-adding continue-on-error.
|
|
79
|
+
# --skip-editable: coderio itself is installed editable and a version
|
|
80
|
+
# not yet on PyPI (chicken-and-egg on every release bump) — the audit
|
|
81
|
+
# targets the DEPENDENCY set, not the project under test.
|
|
74
82
|
shell: bash
|
|
75
83
|
run: |
|
|
76
84
|
uv pip install pip-audit
|
|
77
|
-
uv run pip-audit
|
|
85
|
+
uv run pip-audit --skip-editable
|
|
78
86
|
|
|
79
87
|
- name: Run tests with coverage
|
|
80
88
|
# Enforces a coverage floor so coverage can't silently regress.
|
|
@@ -15,6 +15,11 @@ name: Release
|
|
|
15
15
|
# Workflow name: release.yml / Environment: pypi
|
|
16
16
|
# Then create the "pypi" environment in the repo (Settings → Environments).
|
|
17
17
|
|
|
18
|
+
# Action SHAs are pinned to full commits (external review 2026-09-05, P1-3):
|
|
19
|
+
# mutable tags held write/OIDC permissions, so an upstream re-point would
|
|
20
|
+
# widen the supply-chain attack surface. Bump via a PR that updates the SHA
|
|
21
|
+
# (and its version comment) together.
|
|
22
|
+
|
|
18
23
|
on:
|
|
19
24
|
push:
|
|
20
25
|
tags:
|
|
@@ -41,8 +46,8 @@ jobs:
|
|
|
41
46
|
PYTHONIOENCODING: utf-8
|
|
42
47
|
PYTHONUTF8: "1"
|
|
43
48
|
steps:
|
|
44
|
-
- uses: actions/checkout@v7
|
|
45
|
-
- uses: astral-sh/setup-uv@v7
|
|
49
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
50
|
+
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
|
|
46
51
|
with:
|
|
47
52
|
python-version: "3.12"
|
|
48
53
|
enable-cache: true
|
|
@@ -55,17 +60,49 @@ jobs:
|
|
|
55
60
|
needs: test
|
|
56
61
|
runs-on: ubuntu-latest
|
|
57
62
|
steps:
|
|
58
|
-
- uses: actions/checkout@v7
|
|
63
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
59
64
|
|
|
60
|
-
- uses: actions/setup-python@v7
|
|
65
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
|
|
61
66
|
with:
|
|
62
67
|
python-version: "3.12"
|
|
63
68
|
|
|
69
|
+
- name: Verify tag matches package version
|
|
70
|
+
# External review (2026-09-05, P2-2): nothing stopped a mistyped tag
|
|
71
|
+
# (v0.5.1) from publishing artifacts still named 0.5.0. Gate 1 of 2:
|
|
72
|
+
# tag ↔ pyproject.toml.
|
|
73
|
+
run: |
|
|
74
|
+
TAG_VERSION="${GITHUB_REF_NAME#v}"
|
|
75
|
+
PYPROJECT_VERSION=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['version'])")
|
|
76
|
+
echo "tag=${TAG_VERSION} pyproject=${PYPROJECT_VERSION}"
|
|
77
|
+
if [ "$TAG_VERSION" != "$PYPROJECT_VERSION" ]; then
|
|
78
|
+
echo "::error::tag v${TAG_VERSION} does not match pyproject.toml version ${PYPROJECT_VERSION}"
|
|
79
|
+
exit 1
|
|
80
|
+
fi
|
|
81
|
+
|
|
64
82
|
- name: Build wheel + sdist
|
|
65
83
|
run: |
|
|
66
84
|
pip install build
|
|
67
85
|
python -m build
|
|
68
86
|
|
|
87
|
+
- name: Verify wheel METADATA matches tag
|
|
88
|
+
# Gate 2 of 2: the built artifact itself carries the right version
|
|
89
|
+
# (tag ↔ pyproject ↔ wheel METADATA, external review 2026-09-05).
|
|
90
|
+
run: |
|
|
91
|
+
TAG_VERSION="${GITHUB_REF_NAME#v}"
|
|
92
|
+
WHEEL_VERSION=$(python -c "
|
|
93
|
+
import glob, re, zipfile
|
|
94
|
+
whl = glob.glob('dist/*.whl')[0]
|
|
95
|
+
with zipfile.ZipFile(whl) as z:
|
|
96
|
+
meta = next(n for n in z.namelist() if n.endswith('METADATA'))
|
|
97
|
+
text = z.read(meta).decode('utf-8')
|
|
98
|
+
print(re.search(r'^Version: (.+)$', text, re.MULTILINE).group(1))
|
|
99
|
+
")
|
|
100
|
+
echo "wheel METADATA=${WHEEL_VERSION}"
|
|
101
|
+
if [ "$TAG_VERSION" != "$WHEEL_VERSION" ]; then
|
|
102
|
+
echo "::error::wheel METADATA version ${WHEEL_VERSION} does not match tag v${TAG_VERSION}"
|
|
103
|
+
exit 1
|
|
104
|
+
fi
|
|
105
|
+
|
|
69
106
|
- name: Verify wheel in clean venv (full deps)
|
|
70
107
|
# Install the wheel WITH all dependencies (not --no-deps) to verify
|
|
71
108
|
# the full user install path. Then run --help + import the deepagents
|
|
@@ -109,7 +146,7 @@ jobs:
|
|
|
109
146
|
# accidentally dropped Release creation while the header still
|
|
110
147
|
# promised it. dist/ is still in this job's workspace; the publish
|
|
111
148
|
# job downloads the same artifacts separately.
|
|
112
|
-
uses: softprops/action-gh-release@v3
|
|
149
|
+
uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3
|
|
113
150
|
with:
|
|
114
151
|
generate_release_notes: true
|
|
115
152
|
files: |
|
|
@@ -121,7 +158,7 @@ jobs:
|
|
|
121
158
|
# the publish job — the old flow REBUILT in publish-pypi, so PyPI
|
|
122
159
|
# could receive a different byte stream than the one verified above
|
|
123
160
|
# (2026-08-28 audit: non-deterministic build gap).
|
|
124
|
-
uses: actions/upload-artifact@v4
|
|
161
|
+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
|
|
125
162
|
with:
|
|
126
163
|
name: dist
|
|
127
164
|
path: |
|
|
@@ -142,11 +179,11 @@ jobs:
|
|
|
142
179
|
- name: Download verified artifacts
|
|
143
180
|
# No rebuild: publish EXACTLY the wheel/sdist verified in the release
|
|
144
181
|
# job (2026-08-28 audit fix). No checkout needed either.
|
|
145
|
-
uses: actions/download-artifact@v4
|
|
182
|
+
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
|
|
146
183
|
with:
|
|
147
184
|
name: dist
|
|
148
185
|
path: dist
|
|
149
186
|
- name: Publish to PyPI
|
|
150
|
-
uses: pypa/gh-action-pypi-publish@release/v1
|
|
187
|
+
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
|
|
151
188
|
with:
|
|
152
189
|
attestations: true
|
|
@@ -6,6 +6,209 @@ All notable changes to coderio are documented here. The format follows
|
|
|
6
6
|
`pyproject.toml`'s `[project].version` — `coderio.__version__` reads it via
|
|
7
7
|
`importlib.metadata`.
|
|
8
8
|
|
|
9
|
+
## [0.6.1] — 2026-10-13
|
|
10
|
+
|
|
11
|
+
### Fixed — Terminal-Bench 2026-10-10 bench-driven optimization batch
|
|
12
|
+
|
|
13
|
+
Root-caused from the first Terminal-Bench run (terminal-bench-core 0.1.1,
|
|
14
|
+
40-task deterministic subset, coderio × step-5-preview). Full autopsy,
|
|
15
|
+
protocol, and before/after data: `docs/benchmarks/`.
|
|
16
|
+
|
|
17
|
+
- **`coderio run --timeout` 超时改为优雅中断**:原实现超时后直接退出
|
|
18
|
+
进程、daemon 线程在解释器拆解中继续调度 langgraph futures——每个长
|
|
19
|
+
任务都死于 `RuntimeError: cannot schedule new futures after shutdown`
|
|
20
|
+
撕毁竞态(bench 尸检:11 个失败中 6 个此模式)。现在 deadline 走
|
|
21
|
+
HeadlessStream 的 `is_interrupted()`(与 TUI Esc 同一通道),引擎在
|
|
22
|
+
下一个 chunk 边界干净中断、确定性关闭 stream 生成器;两级 join
|
|
23
|
+
(预算 + 可配宽限 CODERIO_TIMEOUT_GRACE),不配合的引擎超宽限才硬
|
|
24
|
+
退 124。实证:password-recovery 从崩溃死亡转通过。
|
|
25
|
+
- **RequirementsRecapGate(harness 第 5 道门)**:多需求 CODE 任务
|
|
26
|
+
首次宣布 done 时强制一次性需求自审——逐条列出原始需求的验证证据,
|
|
27
|
+
缺证据的先补。治 bench 尸检中 "80% 完成就宣布 done" 模式(nginx
|
|
28
|
+
7/8、decommissioning 5/6、vim 4/5)。触发启发式保证单问句任务零开
|
|
29
|
+
销,一次性不重复。
|
|
30
|
+
- **Terminal-Bench 适配器**:容器内绝对路径调用 coderio(修复 uv 安
|
|
31
|
+
装后 ~/.local/bin 不在 PATH 的问题);安装脚本加 PEP 668 override、
|
|
32
|
+
apt python3-pip 兜底、PyPI 镜像。
|
|
33
|
+
- **基准成绩(terminal-bench-core 0.1.1,40 题确定性子集)**:
|
|
34
|
+
优化前单轮 5/40(coderio 实跑口径 5/14=36%),修复后单轮 **12/40**
|
|
35
|
+
(+140%)。细节见 `docs/benchmarks/terminal-bench-core-0.1.1-coderio-2026-10-10.md`
|
|
36
|
+
+ `terminal-bench-scoreboard-2026-10-10.json`。
|
|
37
|
+
|
|
38
|
+
## [0.6.0] — 2026-09-23
|
|
39
|
+
|
|
40
|
+
### Added — 2026-09-20/21 change-plan batch (D1-1…D1-4, Phase 2, Phase 3)
|
|
41
|
+
|
|
42
|
+
- **`/resume` 后重建 harness ground-truth(D1-1)**:`HarnessState` 是
|
|
43
|
+
middleware 实例属性、不随 checkpointer 持久化,恢复会话后模型引用上一轮
|
|
44
|
+
读过的文件会被 GroundingGate 强制重读——门看起来在抽风,实际是失明。
|
|
45
|
+
新增 `harness.seed_read_state()`:resume 时从会话历史扫描 `read_file`
|
|
46
|
+
工具调用,经 `_norm_path()` 归一化后 seed 进 `content_read_files` 与
|
|
47
|
+
`not_found_files`(语义与 `observe()` 完全一致:grep/ls 只进 read_files,
|
|
48
|
+
失败读取进 not_found_files;per-turn 状态刻意不 seed)。`run_deep_agent`
|
|
49
|
+
每轮接线一次(幂等,新会话 seed 为空)。端到端正反两向测试:恢复会话
|
|
50
|
+
引用旧文件不再强制续跑;从未读过的文件仍被拦。
|
|
51
|
+
- **多模态 provider 能力门控(D1-2)**:`build_user_content` 此前对所有
|
|
52
|
+
provider 一律发 Anthropic image block——OpenAI 协议 profile 发图是 guaranteed
|
|
53
|
+
400 且错误信息不提示真实原因。现在按 `provider_kind` 分流:anthropic 走
|
|
54
|
+
image block,其余转 OpenAI `image_url` data-URL 形状。kind 解析新增
|
|
55
|
+
`llm.factory.resolved_provider_kind()`,与 `build_chat_model` 同层解析
|
|
56
|
+
(named profile → registry → config),修的是 #24 同类"用原始字段代替实际
|
|
57
|
+
客户端"的 bug 类。
|
|
58
|
+
- **live eval 证据体系(Phase 2)**:`scripts/live_eval/`——10 个真实
|
|
59
|
+
provider 任务(fix-and-test ×3 / known-bug / read-and-answer ×2 /
|
|
60
|
+
**对抗性 ×4**:写完不跑就说完成、`echo pytest` 假验证、无据引用等),
|
|
61
|
+
每个任务自带可自动判定判据(测试通过 / 输出匹配 / Gate 信号),行为断言
|
|
62
|
+
不断言 prose,结果记录模型版本。运行器复用 `TurnSpec` + 用户自己的
|
|
63
|
+
~/.coderio 配置与 key。首轮真实运行(stepfun_api / water18-0910):
|
|
64
|
+
**9/10 通过**;唯一 FAIL 经查是任务设计缺陷(对抗前提"模型不会读"不成立
|
|
65
|
+
——模型自读了,引用有据,Gate 的沉默是正确的),D3 v2 重跑通过,
|
|
66
|
+
**修正后任务集 10/10**。报告:`docs/live-eval/results-2026-09-21-water18-0910.md`。
|
|
67
|
+
同一轮还抓到一次真实 429 限流——正是 mock 测试结构上不可能覆盖的
|
|
68
|
+
provider 行为。
|
|
69
|
+
- **deepagents 兼容摸底(D1-3)**:PyPI 上 0.8 尚不存在(最新 0.7.15),
|
|
70
|
+
真正未验证的敞口是 `>=0.7.6` 区间只测过 0.7.6。一次性 venv 装 0.7.15
|
|
71
|
+
跑全量:**1352 passed / 0 failed**——钉死区间干净,维持
|
|
72
|
+
`deepagents>=0.7.6,<0.8`,"0.8 发布时重跑摸底"转为显式跟踪项。
|
|
73
|
+
- **上游怪癖命名化(Phase 3)**:`_deepagents_compat.ensure_todos_middleware()`
|
|
74
|
+
收编 deepagents 0.7.6 移除 `write_todos` 的 re-add,带上游版本、原因、
|
|
75
|
+
移除条件与测试——"一个上游怪癖 = 一个命名条目",替代散落的 inline 补丁
|
|
76
|
+
(2026-07-28 事故的根因模式)。
|
|
77
|
+
- **microcompact middleware(Phase 3)**:本地零模型调用的上下文修剪——
|
|
78
|
+
估算超上下文窗口 90% 时把最旧 tool result 换成占位串(保留最近 5 个),
|
|
79
|
+
只操作副本(图状态与 session jsonl 保留全量),节省 <256 token 则不动。
|
|
80
|
+
推迟 deepagents 的昂贵摘要。仅在 context_limit 已知时启用。
|
|
81
|
+
- **command_policy 黄金判定表(Phase 3)**:`tests/tools/test_command_policy_golden.py`
|
|
82
|
+
——50 个 curated 案例(每个规则族的 must-block + 必须放行的正常命令)
|
|
83
|
+
机械绑定真实 `CommandPolicy`,防"改一个正则静默削弱/过度拦截"的漂移。
|
|
84
|
+
- **可执行架构门(Phase 3)**:`architecture-policy.yaml` +
|
|
85
|
+
`scripts/architecture/check.py`——把架构文档的分层规则(cli→agent→能力层)
|
|
86
|
+
与文件行数预算变成 AST 检查;**baseline 语义:只卡新增违规**,存量 4 个
|
|
87
|
+
超大文件入库不阻塞;`llm→cli` 等 4 处现存向上导入升级为带理由和移除
|
|
88
|
+
条件的显式例外。含变异测试(注入新违规必须变红)。
|
|
89
|
+
|
|
90
|
+
### Fixed — 2026-09-23 WhaleDock incident batch
|
|
91
|
+
|
|
92
|
+
A real-world session (auditing the WhaleDock project, model water18-0910)
|
|
93
|
+
ended with the agent force-pushing the public repo over a private docs
|
|
94
|
+
repo and `rm -rf`-ing the local working tree — then REPLAYING the entire
|
|
95
|
+
destructive sequence after the user's explicit error report. Four fixes,
|
|
96
|
+
root-caused from the session jsonl:
|
|
97
|
+
|
|
98
|
+
- **Esc 中断后的上下文失忆(P0)**:`_handle_interrupt` 按设计删除整条
|
|
99
|
+
checkpoint(防悬空 tool_calls),但 `_build_inputs` 只检查"checkpointer
|
|
100
|
+
对象存在"就只发新消息——中断后的下一轮,模型在空图里只看到重发的
|
|
101
|
+
那条消息(内容复述了任务意图),把它当全新任务执行,原样重放了整个
|
|
102
|
+
破坏序列(证据:模型对怒斥的回应是"你好!有什么我可以帮你的?")。
|
|
103
|
+
现在 `_build_inputs` 用 `get_tuple` 探测线程是否真有状态,无状态则
|
|
104
|
+
回退完整会话历史——这才是注释里一直宣称的"falls back to full session
|
|
105
|
+
history"。
|
|
106
|
+
- **`permission_mode="auto"` 静默映射 FULL(P0)**:旧值 "auto" 被
|
|
107
|
+
normalize 成 FULL(零确认档),而它字面直觉像 auto_edit——事故
|
|
108
|
+
session 里 `git push --force`/`rm -rf`/`git clean -fd`/`git reset
|
|
109
|
+
--hard` 全部零提示执行。现在 loader 与 normalize 双双拒绝该值并给出
|
|
110
|
+
迁移指引(plan/confirm/auto_edit/full)。宁可启动报错,不要静默
|
|
111
|
+
FULL。
|
|
112
|
+
- **失控守卫(harness 第 5/6 道防线)**:同一工具同参 ≥3 次 → 结果附
|
|
113
|
+
带"STOP repeating,用文字说明你要什么"指令 + harness_warn;单 turn
|
|
114
|
+
execute 超 40 次 → "停下来向用户汇报"指令 + harness_warn。针对事故
|
|
115
|
+
中 30 条自比较命令的螺旋与 60+ 命令的重放轮。
|
|
116
|
+
- **投诉/重发保护**:用户重发此前消息(空白归一化精确匹配)→ 用户消息
|
|
117
|
+
附带 harness 注记"这是投诉/重试,不是新任务,先复述理解再动手";
|
|
118
|
+
用户消息含 agent 指向的投诉标记(你犯了/我让你/what did you do 等)
|
|
119
|
+
→ 首个工具结果携带"先用文字说明 (1) 错在哪 (2) 修复计划"的一次性
|
|
120
|
+
强制要求。均为软注入,不阻断。
|
|
121
|
+
- **live eval 新增 R 类鲁棒性任务(R1,失忆回归探针)**:对话专属事实
|
|
122
|
+
(暗号)必须跨 Esc 中断存活——turn 1 读文件+记暗号后被中断(复现
|
|
123
|
+
事故的中断位置),turn 2 禁用工具考暗号。暗号只存在于 turn 1 的
|
|
124
|
+
用户消息里,失忆时任何工具都无法找回,判定无歧义。真实 provider
|
|
125
|
+
运行(step-3.7-flash,2026-09-24)通过:证据
|
|
126
|
+
`docs/live-eval/results-2026-09-24-step-3.7-flash.md`。
|
|
127
|
+
- **context_limit 全 profile 覆盖**:探测原本只在 onboarding 时发生——
|
|
128
|
+
/model 切换、手工加 profile 的模型永远没有窗口数据(microcompact
|
|
129
|
+
对其静默关闭)。新增 `llm.factory.ensure_context_limit()`:在
|
|
130
|
+
build_turn_spec 单一 choke point,未知则探测一次(≤4s)、进程内
|
|
131
|
+
记忆(含失败,防止无该端点的 provider 每轮付探测延迟)、成功则
|
|
132
|
+
read-modify-write 持久化进 config.toml 的对应 profile/[model]。
|
|
133
|
+
|
|
134
|
+
### Fixed
|
|
135
|
+
|
|
136
|
+
- **README 订阅额度表述(D1-4)**:中英 README 的"订阅额度跑本地 agent"改为
|
|
137
|
+
不依赖智谱白名单的"用你自己的订阅 key 直连官方端点"——白名单口径未经智谱
|
|
138
|
+
确认前,不替用户主张未验证的计费行为(问询邮件草稿在改动计划文档里)。
|
|
139
|
+
|
|
140
|
+
### Removed
|
|
141
|
+
|
|
142
|
+
- **`context_summary` 死代码(Phase 3)**:`session/store.py` 的压缩截断管道
|
|
143
|
+
自 deepagents 迁移后没有任何生产者(grep 只见读取方/skip 逻辑)——删除
|
|
144
|
+
函数与调用点,各引用处注释标注为 legacy kind。旧会话文件仍完整加载
|
|
145
|
+
(不再静默丢弃被摘要取代的消息)。
|
|
146
|
+
|
|
147
|
+
### Security
|
|
148
|
+
|
|
149
|
+
- **Corrupt credentials backup permissions**: restrict a newly created
|
|
150
|
+
`.corrupt` backup before copying potentially recoverable API keys into it.
|
|
151
|
+
POSIX backups now retain 0600 under a normal 022 umask; exclusive creation
|
|
152
|
+
preserves the first backup. A real-filesystem regression covers this path.
|
|
153
|
+
|
|
154
|
+
- **httpx2 2.10.0 → 2.12.0**(连带 httpcore2 → 2.12.0):PyPI 漏洞库 2026-09-09
|
|
155
|
+
收录 httpx2 2.10.0 的三条 CVE(CVE-2026-84379 / CVE-2026-84380,修复于 2.11.0;
|
|
156
|
+
CVE-2026-84382,修复于 2.12.0)。httpx2 经 langchain-openai → openai SDK 进入
|
|
157
|
+
依赖树(2026-08-14 进锁);同一份锁 09-08 审计通过、09-09 被全矩阵 6 腿拦下——
|
|
158
|
+
依赖集合没变,是公告新发布。`uv lock --upgrade-package httpx2` 定向升级后
|
|
159
|
+
pip-audit 复审 0 漏洞。
|
|
160
|
+
|
|
161
|
+
### Fixed
|
|
162
|
+
|
|
163
|
+
- **web_fetch 大小上限在完整下载后才生效(#18)**:`client.get()` 把响应体
|
|
164
|
+
全量读入内存后,1MB 上限才在结果上执行——它只约束模型看到的文本,不约束
|
|
165
|
+
传输;发 1.1MB 后暂停的服务会把整个 turn 拖到读超时。改为 `client.stream`
|
|
166
|
+
有界读取:达到上限立即中止连接,重定向响应体也不再全量读取。真实 socket
|
|
167
|
+
回归测试覆盖 stall 与完整大响应两种形态。
|
|
168
|
+
- **TUI 权限门装配异常时默认放行(#19)**:`TuiPermissionGate._ask` 在挂载的
|
|
169
|
+
tui 对象缺少确认接口时返回 True,与 bare gate 的 "can't ask = deny" 契约
|
|
170
|
+
相反——装配缺陷会静默放行所有破坏性工具。改为 fail-closed 拒绝。
|
|
171
|
+
- **流式 usage 被逐块重复累加(#21)**:流式 provider 把累计 usage 挂在每个
|
|
172
|
+
chunk 上,langchain 合并 AIMessageChunk 时将其求和——updates 模式的完整
|
|
173
|
+
消息携带虚高总量(实测 stepfun_api:服务端 16/28,聚合 208/180)。现在
|
|
174
|
+
`_run_stream` 跟踪每个模型调用最后一次 chunk 级累计值(即厂商总量),
|
|
175
|
+
`_emit_message` 优先消费它;非流式 provider 回退到完整消息的
|
|
176
|
+
usage_metadata。`/cost` 与性能门数值恢复可信。
|
|
177
|
+
- **文档残留同步(#20)**:架构文档移除已删除的 `on_truncated`、修正 skills
|
|
178
|
+
计数(13 = 12 Lion-Skills + 1 bundled)、exit_code 描述改为"结构化已接入、
|
|
179
|
+
文本回退仍存在";ROADMAP 移除已完成的 ToolResult 结构化条目。
|
|
180
|
+
- **/setup 完成向导后 0.8 秒崩溃(#25)**:`set_timer` 的回调是返回
|
|
181
|
+
`dismiss()` AwaitComplete 的 lambda——Textual 的回调调用器会 await 可等待
|
|
182
|
+
的返回值,而在 screen 自身消息泵里 await dismiss 会抛
|
|
183
|
+
`ScreenError` 直接崩溃。回调改为不返回值的函数,附回归测试。
|
|
184
|
+
- **命名 profile 激活时模型名显示/落盘错误(#24)**:启动 banner、
|
|
185
|
+
`coderio config`、会话元数据、/model 提示读的都是 `[model].default` 原始
|
|
186
|
+
字段而非 profile 解析结果(实测:banner 显示 step-3.7-flash,实际运行
|
|
187
|
+
water18-0910)。新增 `resolved_model_name()`,5 处展示/落盘统一改用
|
|
188
|
+
实际模型名(或模型对象的 `model_name`)。实际请求不受影响,纯显示与
|
|
189
|
+
元数据修复。
|
|
190
|
+
- **⏹ 中断按钮周边暗色色块(#23)**:`$error 20%` / `$accent 20%` 的 alpha
|
|
191
|
+
色在按钮自身近黑底上合成(toolbar 与 panel 均透明),形成与面板不融合的
|
|
192
|
+
暗块。改用不透明的 `$accent-muted` / `$error-muted` 主题混合色,附样式
|
|
193
|
+
断言测试。
|
|
194
|
+
|
|
195
|
+
- **Live verification scripts**: migrate both harness/deepagent scripts to
|
|
196
|
+
`TurnSpec`. They still passed removed keyword arguments after the engine
|
|
197
|
+
refactor and raised TypeError before reaching the provider. Regression
|
|
198
|
+
tests replace only the model and exercise the real graph and tools.
|
|
199
|
+
|
|
200
|
+
- **POSIX sandbox fallback timeout**: `job` and degraded `write` now kill the
|
|
201
|
+
process group before reaping the shell. Previously the timeout killed only
|
|
202
|
+
the shell, leaving child processes running; degraded timeout results now
|
|
203
|
+
retain the visible sandbox warning. Real-process regression tests cover the
|
|
204
|
+
production backend in `off`, `job`, and degraded `write` modes.
|
|
205
|
+
|
|
206
|
+
- **PyPI 项目页外链为空**:仓库里一直写着项目 URLs,但用的是内联键
|
|
207
|
+
`project-urls = {...}`——它不是 PEP 621 字段,hatchling 静默忽略,构建出的
|
|
208
|
+
wheel 没有 Project-URL 头(线上 0.5.0 的 `info.project_urls` 为 null)。
|
|
209
|
+
改为标准的 `[project.urls]` 子表(Homepage/Repository/Issues/Changelog/
|
|
210
|
+
Documentation),随下次发版生效。
|
|
211
|
+
|
|
9
212
|
## [0.5.0] — 2026-09-04
|
|
10
213
|
|
|
11
214
|
### Security — 2026-09-04 third-party audit batch (P0; each fix re-verified by an independent adversarial round, mutation-tested, and runtime-audited)
|
|
@@ -816,7 +1019,9 @@ weaker than the documentation's promise. All fixed and double-checked:
|
|
|
816
1019
|
- Rich stream UI + Textual TUI with foldable thinking.
|
|
817
1020
|
- jsonl session persistence with compression truncation.
|
|
818
1021
|
|
|
819
|
-
[Unreleased]: https://github.com/Lion-1209/coderio/compare/v0.
|
|
1022
|
+
[Unreleased]: https://github.com/Lion-1209/coderio/compare/v0.6.1...HEAD
|
|
1023
|
+
[0.6.1]: https://github.com/Lion-1209/coderio/compare/v0.6.0...v0.6.1
|
|
1024
|
+
[0.6.0]: https://github.com/Lion-1209/coderio/compare/v0.5.0...v0.6.0
|
|
820
1025
|
[0.5.0]: https://github.com/Lion-1209/coderio/compare/v0.4.4...v0.5.0
|
|
821
1026
|
[0.4.4]: https://github.com/Lion-1209/coderio/releases/tag/v0.4.4
|
|
822
1027
|
[0.4.3]: https://github.com/Lion-1209/coderio/releases/tag/v0.4.3
|
|
@@ -87,3 +87,32 @@ Include:
|
|
|
87
87
|
- The model and provider you're using.
|
|
88
88
|
- Steps to reproduce.
|
|
89
89
|
- The session file if relevant (`~/.coderio/sessions/*.jsonl`).
|
|
90
|
+
|
|
91
|
+
## Contribution terms
|
|
92
|
+
|
|
93
|
+
> 条款要点(中文摘要,以英文为准):提交 PR 或以任何形式贡献代码/文档,即表示你同意贡献以
|
|
94
|
+
> MIT 授权本项目,并授予项目所有者不可撤销的再许可权利(用于未来可能的商业组件双许可);
|
|
95
|
+
> 你保留自己贡献的版权。不接受的个别情况请在提交前提出,一般都可以协商。
|
|
96
|
+
|
|
97
|
+
By submitting a pull request, or posting code, docs, or any other
|
|
98
|
+
contribution to this repository, you agree that:
|
|
99
|
+
|
|
100
|
+
1. Your contribution is licensed to the project under the repository's
|
|
101
|
+
current license (MIT), **and**
|
|
102
|
+
2. You grant the project owner (Lion / Lion-1209) a perpetual,
|
|
103
|
+
irrevocable, worldwide, royalty-free, non-exclusive right to use,
|
|
104
|
+
reproduce, modify, sublicense (including under other licenses), and
|
|
105
|
+
distribute your contribution as part of this project or products
|
|
106
|
+
based on it, **and**
|
|
107
|
+
3. You confirm you have the legal right to submit it (your own work, or
|
|
108
|
+
work you are authorized to contribute). If you contribute in the
|
|
109
|
+
course of employment, you confirm your employer approves this
|
|
110
|
+
submission.
|
|
111
|
+
|
|
112
|
+
Bug-report material (logs, traces, photos) attached to issues is used
|
|
113
|
+
only to reproduce and fix problems. You keep the copyright to your
|
|
114
|
+
contribution. These terms keep the project permissively licensed while
|
|
115
|
+
preserving the owner's ability to evolve licensing later (e.g.
|
|
116
|
+
dual-licensing around future commercial components). If you need your
|
|
117
|
+
contribution handled under different terms, say so in the issue/PR
|
|
118
|
+
**before** submitting and we'll work it out — most cases are fine.
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: coderio
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.6.1
|
|
4
4
|
Summary: A skill-driven coding agent — structural harness, foldable thinking TUI, deepagents engine.
|
|
5
|
+
Project-URL: Homepage, https://github.com/Lion-1209/coderio
|
|
6
|
+
Project-URL: Repository, https://github.com/Lion-1209/coderio
|
|
7
|
+
Project-URL: Issues, https://github.com/Lion-1209/coderio/issues
|
|
8
|
+
Project-URL: Changelog, https://github.com/Lion-1209/coderio/blob/main/CHANGELOG.md
|
|
9
|
+
Project-URL: Documentation, https://github.com/Lion-1209/coderio/blob/main/docs/coderio-architecture.md
|
|
5
10
|
Author: coderio contributors
|
|
6
11
|
License-Expression: MIT
|
|
7
12
|
License-File: LICENSE
|
|
@@ -81,7 +86,7 @@ Not prompt-level soft rules — a system-level control based on tool-call ground
|
|
|
81
86
|
|
|
82
87
|
### Where coderio fits
|
|
83
88
|
|
|
84
|
-
- **Your endpoint, no middleman.** Bring the API you already pay for: Zhipu **GLM Coding Plan** and StepFun **Step Plan** connect directly over the Anthropic protocol
|
|
89
|
+
- **Your endpoint, no middleman.** Bring the API you already pay for: Zhipu **GLM Coding Plan** and StepFun **Step Plan** connect directly over the Anthropic protocol with your own subscription key (no proxy layer), and OpenAI / Anthropic / Ollama / any OpenAI-compatible endpoint work the same way, with multi-profile switching.
|
|
85
90
|
- **Enforcement, not vibes.** Verified completion, trust-gated repo config, four-tier permissions, a command blacklist for accident prevention, SSRF-protected web_fetch — each layer isolated in its own module.
|
|
86
91
|
- **A reference you can actually read.** A layered monolith (~16k lines of Python) where harness, permissions, sandbox and trust are separate, individually tested modules — built as a working reference for people building their own agents.
|
|
87
92
|
|
|
@@ -37,7 +37,7 @@ coderio # 首次启动进入 onboarding 向导(选 provider、填 API key
|
|
|
37
37
|
|
|
38
38
|
### 原生支持中文 Coding Plan
|
|
39
39
|
|
|
40
|
-
智谱 **GLM Coding Plan** 和阶跃 **StepFun Step Plan** 开箱即用(Anthropic
|
|
40
|
+
智谱 **GLM Coding Plan** 和阶跃 **StepFun Step Plan** 开箱即用(Anthropic 协议直连)——用你自己的订阅 key 直连官方端点,不需要转发、不需要中间层。同时支持 OpenAI / Anthropic / Ollama / 任意 OpenAI 兼容端点,多 profile 一键切换。
|
|
41
41
|
|
|
42
42
|
### 多模态输入
|
|
43
43
|
|
|
@@ -139,7 +139,7 @@ TUI 内输入 `/` 查看全部命令(/resume 恢复会话、/mode 切权限、
|
|
|
139
139
|
## 已知限制
|
|
140
140
|
|
|
141
141
|
- Windows 写沙箱当前等价于 job 档(真隔离待 ACL,文档如实标注);沙箱命令经 `cmd /c` 包装,引号/`$VAR` 语义与 Git Bash 直跑不同;**macOS 无 OS 级沙箱**(bubblewrap 是 Linux 专属,macOS 上沙箱档仅作用于 Linux)——对抗性场景请用 VM
|
|
142
|
-
- Linux 未安装 bubblewrap 时 write 沙箱降级为直接执行:模型输出会带 `[sandbox unavailable]` 标注,且 `auto_allow_if_sandboxed` 自动失效(execute
|
|
142
|
+
- Linux 未安装 bubblewrap 时 write 沙箱降级为直接执行:模型输出会带 `[sandbox unavailable]` 标注,且 `auto_allow_if_sandboxed` 自动失效(execute 恢复逐条确认);Windows 上该标志也不生效(Job 档不隔离文件写)
|
|
143
143
|
- 黑白名单为防手滑设计(正则可被混淆绕过),对抗性场景用沙箱 / VM
|
|
144
144
|
|
|
145
145
|
## 起源
|
|
@@ -37,7 +37,7 @@ Not prompt-level soft rules — a system-level control based on tool-call ground
|
|
|
37
37
|
|
|
38
38
|
### Where coderio fits
|
|
39
39
|
|
|
40
|
-
- **Your endpoint, no middleman.** Bring the API you already pay for: Zhipu **GLM Coding Plan** and StepFun **Step Plan** connect directly over the Anthropic protocol
|
|
40
|
+
- **Your endpoint, no middleman.** Bring the API you already pay for: Zhipu **GLM Coding Plan** and StepFun **Step Plan** connect directly over the Anthropic protocol with your own subscription key (no proxy layer), and OpenAI / Anthropic / Ollama / any OpenAI-compatible endpoint work the same way, with multi-profile switching.
|
|
41
41
|
- **Enforcement, not vibes.** Verified completion, trust-gated repo config, four-tier permissions, a command blacklist for accident prevention, SSRF-protected web_fetch — each layer isolated in its own module.
|
|
42
42
|
- **A reference you can actually read.** A layered monolith (~16k lines of Python) where harness, permissions, sandbox and trust are separate, individually tested modules — built as a working reference for people building their own agents.
|
|
43
43
|
|
|
@@ -33,8 +33,6 @@ coderio 是单人业余项目,维护者用自有工作时间开发和维护。
|
|
|
33
33
|
|
|
34
34
|
- **macOS 沙箱方案**:评估 `sandbox-exec` 落地;若成本过高,则明确宣布
|
|
35
35
|
macOS 暂无 OS 级沙箱并保持文档口径(当前已是如此,但需要一个正式决策)。
|
|
36
|
-
- **ToolResult 结构化**:bash 的 exit_code 目前靠正则从结果字符串里提取
|
|
37
|
-
(`[exit_code: N]` 标记),上游格式一变解析就断。计划改为结构化结果对象。
|
|
38
36
|
- **Textual 上游跟踪**:Screen layers 滚动渲染 bug 曾在本仓记录;2026-09-02
|
|
39
37
|
于 textual 8.2.8 复测(两种复现)均不可复现——大概率上游已修复,维持跟踪。
|
|
40
38
|
- **确认体验扩展**:文件写入已有 diff 预览;shell 命令确认计划增加风险
|
|
@@ -64,7 +64,7 @@ API key 不写在 config 里,按 `provider_id` 存凭据文件(见下文)
|
|
|
64
64
|
| `whitelist_mode` | bool,`false` | `true` = 白名单模式:首个 token 不在允许集合里的命令进入确认流程(full 模式仍放行),不是硬阻断 |
|
|
65
65
|
| `allowed_commands` | list[str],`[]` | 白名单追加(仅 `whitelist_mode = true` 时生效)。如 `["docker", "kubectl"]` |
|
|
66
66
|
| `sandbox_mode` | str,`"off"` | `off` / `job`(进程树资源限制 + 可靠杀死)/ `write`(Linux bubblewrap 真写隔离)。**Windows 上 `write` 目前等价于 `job`**,无文件写隔离——启动时会有显式警告;**macOS 上沙箱档不生效**(无 OS 级沙箱)。沙箱无法提供而降级的场景(如 Linux 未装 bwrap)会在工具输出带 `[sandbox unavailable]` 标注 |
|
|
67
|
-
| `auto_allow_if_sandboxed` | bool,`false` |
|
|
67
|
+
| `auto_allow_if_sandboxed` | bool,`false` | 仅在沙箱提供**文件写边界**(Linux bwrap write)时 execute 免确认。平台感知:Windows(Job 只限资源不隔离写盘)、macOS、Linux 无 bwrap、Linux `job` 档——这些"无文件写边界"的组合下自动失效(execute 恢复逐条确认,并打印原因)。黑名单始终生效 |
|
|
68
68
|
| `sandbox_fs` | 表(见下) | Linux bubblewrap 文件系统隔离四元组;Windows 忽略 |
|
|
69
69
|
|
|
70
70
|
### [tools.sandbox_fs](四元组,Linux bwrap only)
|
|
@@ -90,6 +90,7 @@ allow_read = ["secrets/public.pem"] # 从 deny_read 里凿开只读
|
|
|
90
90
|
| `[skills]` | `harness` | `true` | 四道验证门开关(`false` = agent 想说完成就说完成) |
|
|
91
91
|
| `[skills]` | `repo_url` | Lion-Skills | `coderio skills install` 的默认仓库 |
|
|
92
92
|
| `[session]` | `save_dir` | `"~/.coderio/sessions"` | 会话 jsonl 与 sqlite 检查点的存放目录 |
|
|
93
|
+
| `[session]` | `retention_days` | `0` | 会话 jsonl 超过该天数(按文件 mtime)在启动时清除;`0` = 永不过期(默认,删除用户数据必须显式开启)。会话文件以属主只读权限落盘 |
|
|
93
94
|
| `[cli]` | `theme` | `"dark"` | TUI 主题 |
|
|
94
95
|
| `[cli]` | `show_tool_output` | `true` | TUI 里显示工具输出摘要行 |
|
|
95
96
|
|