coderouter-cli 2.7.7__tar.gz → 2.7.9__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.
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/CHANGELOG.md +182 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/PKG-INFO +1 -1
- coderouter_cli-2.7.9/coderouter/adapters/agent_cli.py +977 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/config/schemas.py +53 -8
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/backend_health.py +63 -1
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/logging.py +60 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/routing/fallback.py +37 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/README.en.md +1 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/README.md +1 -0
- coderouter_cli-2.7.9/docs/backends/external-agents.en.md +333 -0
- coderouter_cli-2.7.9/docs/backends/external-agents.md +333 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/designs/external-agents-adapter.md +39 -3
- coderouter_cli-2.7.9/examples/providers-agent-cli.yaml +225 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/pyproject.toml +1 -1
- coderouter_cli-2.7.9/tests/test_agent_cli.py +1238 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_backend_health.py +182 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_mE_config_validation.py +41 -0
- coderouter_cli-2.7.7/coderouter/adapters/agent_cli.py +0 -591
- coderouter_cli-2.7.7/examples/providers-agent-cli.yaml +0 -166
- coderouter_cli-2.7.7/tests/test_agent_cli.py +0 -529
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/.gitignore +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/LICENSE +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/README.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/README.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/__init__.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/__main__.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/adapters/__init__.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/adapters/anthropic_native.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/adapters/base.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/adapters/openai_compat.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/adapters/registry.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/cli.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/cli_stats.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/config/__init__.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/config/capability_registry.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/config/env_file.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/config/loader.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/cost.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/data/__init__.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/data/model-capabilities.yaml +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/doctor.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/doctor_apply.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/env_security.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/errors.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/gguf_introspect.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/__init__.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/_fingerprint.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/context_budget.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/continuous_probe.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/drift_actions.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/drift_detection.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/memory_budget.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/memory_pressure.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/self_healing.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/tool_loop.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/hardware.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/ingress/__init__.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/ingress/anthropic_routes.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/ingress/app.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/ingress/dashboard_routes.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/ingress/launcher_routes.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/ingress/metrics_routes.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/ingress/openai_routes.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/language_tax.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/launcher_speculative.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/metrics/__init__.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/metrics/collector.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/metrics/prometheus.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/output_filters.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/plugins/__init__.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/plugins/base.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/plugins/loader.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/plugins/registry.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/routing/__init__.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/routing/adaptive.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/routing/auto_router.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/routing/budget.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/routing/capability.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/state/__init__.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/state/audit_log.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/state/replay.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/state/request_log.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/state/store.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/state/suggest_rules.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/token_estimation.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/token_estimation_accurate.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/translation/__init__.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/translation/anthropic.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/translation/convert.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/translation/tool_repair.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/assets/dashboard-demo.png +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/claude-code-llamacpp-vllm.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/claude-code-llamacpp-vllm.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/gguf_dl.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/gguf_dl.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/hf-ollama-models.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/hf-ollama-models.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/install-backends.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/install-backends.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/launcher-quickstart.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/launcher-quickstart.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/launcher.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/launcher.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/llamacpp-direct.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/llamacpp-direct.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/lmstudio-direct.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/lmstudio-direct.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/verify-ollama-0.23.1.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/concepts/architecture.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/concepts/architecture.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/concepts/context-budget.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/concepts/context-budget.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/concepts/continuous-probing.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/concepts/continuous-probing.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/concepts/drift-detection.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/concepts/drift-detection.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/concepts/partial-stitch.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/concepts/partial-stitch.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/designs/v1.5-dashboard-mockup.html +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/designs/v1.6-auto-router-verification.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/designs/v1.6-auto-router.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/free-tier-guide.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/free-tier-guide.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/language-tax.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/language-tax.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/remote-access.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/remote-access.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/security.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/security.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/troubleshooting.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/troubleshooting.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/usage-guide.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/usage-guide.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/low-memory-integration.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/low-memory-integration.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/openrouter-roster/CHANGES.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/openrouter-roster/README.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/openrouter-roster/latest.json +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/retrospectives/v0.4.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/retrospectives/v0.5-verify.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/retrospectives/v0.5.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/retrospectives/v0.6.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/retrospectives/v0.7.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/retrospectives/v1.0-verify.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/retrospectives/v1.0.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/start/quickstart.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/start/quickstart.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/start/when-do-i-need-coderouter.en.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/start/when-do-i-need-coderouter.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/.env.example +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/README.md +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/providers-multiagent.yaml +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/providers.context-budget-test.yaml +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/providers.llamacpp-vllm.yaml +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/providers.nvidia-nim.yaml +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/providers.ollama-auto-custom.yaml +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/providers.ollama-auto.yaml +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/providers.ollama-free-chain.yaml +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/providers.raspberrypi.yaml +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/providers.yaml +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/scripts/demo_traffic.sh +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/scripts/openrouter_roster_diff.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/scripts/smoke_v2_2.sh +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/scripts/verify-providers.yaml +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/scripts/verify_ollama_0_23.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/scripts/verify_v0_5.sh +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/scripts/verify_v1_0.sh +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/__init__.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/conftest.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_adapter_anthropic.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_audit_log.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_auto_router.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_auto_router_cjk.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_budget.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_capability.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_capability_degraded_payload.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_capability_registry.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_capability_registry_cache_control.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_capability_tool_choice.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_claude_code_suitability.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_cli.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_cli_bind_warning.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_cli_stats.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_config.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_config_shim_actions.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_context_budget.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_continuous_probe.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_dashboard_endpoint.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_doctor.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_doctor_apply.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_doctor_cache_probe.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_drift_actions.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_drift_detection.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_drift_detection_integration.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_env_file.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_env_security.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_errors.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_examples_yaml.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fallback.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fallback_anthropic.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fallback_cache_control.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fallback_cache_observed.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fallback_cache_strip.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fallback_empty_response.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fallback_misconfig_warn.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fallback_paid_gate.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fallback_thinking.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fallback_tool_choice_emulate.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_h1_prometheus_drift.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_h2_h6_translation.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_h3_client_reuse.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_h4_h5_guards.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_h7_probe_restore.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_h8_launcher_auth.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_mA_routing.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_mB_adapters.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_mC_convert.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_mD_logging_metrics.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_mF_ingress.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_gguf_introspect.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_guards_tool_loop.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_hardware.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_ingress_anthropic.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_ingress_count_tokens.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_ingress_profile.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_language_tax.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_language_tax_integration.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_launcher_mtp.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_launcher_mtp_fallback.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_launcher_provider_sync.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_memory_budget.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_memory_pressure.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_metrics_cache.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_metrics_collector.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_metrics_cost.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_metrics_endpoint.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_metrics_jsonl.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_metrics_prometheus.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_metrics_prometheus_cache.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_models_passthrough.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_openai_compat.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_openrouter_roster_diff.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_output_filters.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_output_filters_adapters.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_partial_stitch.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_plugins_integration.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_plugins_loader.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_plugins_registry.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_reasoning_strip.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_repair_byte_fallback.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_request_log.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_role_normalization.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_routing_adaptive.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_self_healing.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_setup_sh.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_state_store.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_token_estimation.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_token_estimation_accurate.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_tokens_saved_metric.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_tool_repair.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_tool_repair_lenient.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_tool_repair_r4.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_toolrepair_bench.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_translation_anthropic.py +0 -0
- {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_translation_reverse.py +0 -0
|
@@ -9,6 +9,188 @@ are kept verbatim where the Japanese text itself is the subject).
|
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
+
## [v2.7.9] — 2026-07-11 (agent_cli Phase 1b: codex)
|
|
13
|
+
|
|
14
|
+
Adds the third target to the `agent_cli` adapter: `agent: codex` (the OpenAI
|
|
15
|
+
Codex CLI) is now implemented alongside `claude` (Phase 1a) and `grok`
|
|
16
|
+
(Phase 1d). The implementation was verified against the real CLI (codex-cli
|
|
17
|
+
0.144.1, 2026-07-11), and one design-time assumption from the 2026-07
|
|
18
|
+
research did not survive contact with it: `codex exec` has no approval flag
|
|
19
|
+
at all (`-a`/`--ask-for-approval` doesn't exist in `exec --help` on
|
|
20
|
+
0.144.1, since non-interactive execution has no approval prompt to control
|
|
21
|
+
in the first place), so the design's separate `edit`/`full_auto` mappings
|
|
22
|
+
(`-a on-request` / `-a never`) collapse into a single `-s workspace-write`
|
|
23
|
+
mapping — unlike claude/grok, codex does not distinguish `edit` from
|
|
24
|
+
`full_auto`. The verified JSONL `turn.completed.usage` payload also carries
|
|
25
|
+
a field the design didn't record, `reasoning_output_tokens`, which is now
|
|
26
|
+
normalized defensively into `completion_tokens_details.reasoning_tokens`.
|
|
27
|
+
Everything else (stdin prompt delivery, `--skip-git-repo-check`,
|
|
28
|
+
`--ephemeral`, the absence of `--max-turns`/`--timeout`, the ~8-day OAuth
|
|
29
|
+
staleness) matched the design closely. `gemini` remains schema-declared but
|
|
30
|
+
rejected (Phase 1c pending).
|
|
31
|
+
|
|
32
|
+
### Added
|
|
33
|
+
|
|
34
|
+
- **`agent: codex` builder/parser in `AgentCliAdapter`**
|
|
35
|
+
(`coderouter/adapters/agent_cli.py`) — invokes the Codex CLI one-shot as
|
|
36
|
+
`codex exec --json --skip-git-repo-check --ephemeral -m <model>
|
|
37
|
+
-C <workdir> -s read-only -` (read_only default). The prompt is delivered
|
|
38
|
+
on stdin with an explicit trailing `-` sentinel — the same channel as
|
|
39
|
+
claude, unlike grok's `--prompt-file` delivery. Output is JSONL on
|
|
40
|
+
stdout (progress goes to stderr); the final answer is the `item.text` of
|
|
41
|
+
the **last** `item.completed` event whose `item.type=="agent_message"`.
|
|
42
|
+
Usage comes from `turn.completed.usage` and is normalized as
|
|
43
|
+
`prompt_tokens=input_tokens` / `completion_tokens=output_tokens`, with
|
|
44
|
+
`cached_input_tokens` kept as `prompt_tokens_details.cached_tokens` (a
|
|
45
|
+
subset of `input_tokens`, not added on top — verified 13810 ⊃ 9984) and
|
|
46
|
+
`reasoning_output_tokens` kept as
|
|
47
|
+
`completion_tokens_details.reasoning_tokens` when nonzero; multiple
|
|
48
|
+
`turn.completed` events, if seen, are summed. `thread_id` (from
|
|
49
|
+
`thread.started`) surfaces as `coderouter_session_id`. Parsing is
|
|
50
|
+
defensive line-by-line — a non-JSON line doesn't abort the rest of the
|
|
51
|
+
stream, but no valid `agent_message` (or empty stdout) raises a
|
|
52
|
+
retryable `AdapterError`, as does any `error` event or `turn.failed`.
|
|
53
|
+
The CLI is pre-1.0 and `--json`'s alias is still `--experimental-json`
|
|
54
|
+
(schema not frozen), so version pinning is recommended alongside the
|
|
55
|
+
defensive parsing.
|
|
56
|
+
- **`sandbox_mode` → codex flag mapping** — `read_only` → `-s read-only`;
|
|
57
|
+
`edit` → `-s workspace-write`; `full_auto` → `-s workspace-write` (same
|
|
58
|
+
as `edit` — `exec` has no approval flag in 0.144.1, and
|
|
59
|
+
`--dangerously-bypass-approvals-and-sandbox` is never used). As with
|
|
60
|
+
claude/grok, the effective mode is clamped to read-only whenever
|
|
61
|
+
`allow_file_writes=false`, regardless of `sandbox_mode`.
|
|
62
|
+
- **`--skip-git-repo-check` always passed** — CodeRouter's isolated workdir
|
|
63
|
+
is never a git repository, and codex's default "trusted directory" check
|
|
64
|
+
fails immediately outside one (exit 1, stderr `Not inside a trusted
|
|
65
|
+
directory and --skip-git-repo-check was not specified.` — field-verified).
|
|
66
|
+
The adapter always passes this flag, so that error should never surface
|
|
67
|
+
in normal operation.
|
|
68
|
+
- **`--ephemeral` always passed** — prevents the session from persisting to
|
|
69
|
+
disk, for the same stateless-transformation rationale as grok's
|
|
70
|
+
`--no-memory`. Not configurable.
|
|
71
|
+
- **`max_turns` ignored for codex** — `codex exec` has neither
|
|
72
|
+
`--max-turns` nor `--timeout`; `AgentCliConfig.max_turns` has no effect
|
|
73
|
+
when `agent: codex`, and `exec_timeout_s` + process-group `SIGKILL` is
|
|
74
|
+
the only time bound.
|
|
75
|
+
- **`coderouter_session_id` via `thread_id`** — same response-metadata
|
|
76
|
+
treatment as claude's `session_id` and grok's `sessionId`.
|
|
77
|
+
|
|
78
|
+
### Changed
|
|
79
|
+
|
|
80
|
+
- **Unsupported-agent error message** — constructing the adapter with a
|
|
81
|
+
not-yet-implemented agent now lists all three implemented agents (e.g.
|
|
82
|
+
`agent 'gemini' is not implemented yet (implemented: claude, codex,
|
|
83
|
+
grok)`) instead of the two-agent wording from v2.7.8.
|
|
84
|
+
- **Schema docstrings** (`coderouter/config/schemas.py`) — `AgentCliConfig`
|
|
85
|
+
field descriptions updated for the three-agent reality, including the
|
|
86
|
+
`max_turns` docstring noting codex ignores it.
|
|
87
|
+
- **Docs & examples** — `docs/backends/external-agents.md`/`.en.md` gain a
|
|
88
|
+
full codex section (config example, adapter argv, stdin-vs-`--prompt-file`
|
|
89
|
+
contrast with grok, sandbox mapping table with the no-approval-flag-in-exec
|
|
90
|
+
note, JSONL schema and usage normalization including
|
|
91
|
+
`reasoning_output_tokens`, OAuth setup with the ~8-day staleness caveat
|
|
92
|
+
and `CODEX_API_KEY`/`OPENAI_API_KEY`/`CODEX_HOME`, and the pre-1.0
|
|
93
|
+
version-pin caveat) and updated implementation-status wording (claude +
|
|
94
|
+
codex + grok implemented; gemini-only rejected). The design doc
|
|
95
|
+
`docs/designs/external-agents-adapter.md` gets a new appendix §11.4
|
|
96
|
+
recording the verified deltas between the 2026-07 research and
|
|
97
|
+
codex-cli 0.144.1 (body text left as the historical record); its header
|
|
98
|
+
status line now lists Phase 1b alongside 1a/1d.
|
|
99
|
+
`examples/providers-agent-cli.yaml` promotes codex out of the
|
|
100
|
+
not-implemented preview into a documented (still commented-out, so
|
|
101
|
+
copying the file doesn't require codex to be installed) block with
|
|
102
|
+
`model: gpt-5.5`, `paid: false` for subscription OAuth, and
|
|
103
|
+
`passthrough_env: []`; the preview section at the bottom is retitled to
|
|
104
|
+
Phase 1c (gemini only), with codex removed from it.
|
|
105
|
+
|
|
106
|
+
## [v2.7.8] — 2026-07-10 (agent_cli Phase 1d: grok)
|
|
107
|
+
|
|
108
|
+
**PR #68**. Adds the second target to the `agent_cli` adapter: `agent: grok` (the xAI
|
|
109
|
+
Grok CLI) is now implemented alongside `claude` from Phase 1a. The
|
|
110
|
+
implementation was verified against the real CLI (grok v0.2.93, [stable]
|
|
111
|
+
channel, 2026-07-10), and several design-time assumptions from the 2026-07
|
|
112
|
+
research did not survive contact with it: the CLI now supports OAuth
|
|
113
|
+
subscription login (the design assumed grok was API-key-only with no
|
|
114
|
+
subscription path), `--sandbox` takes a profile value
|
|
115
|
+
(`off|workspace|read-only|strict`) rather than being a bare flag, a
|
|
116
|
+
Claude-Code-compatible `--permission-mode` exists, and `-p`/`--single` only
|
|
117
|
+
accepts the prompt as an argv value (stdin is not accepted as the prompt) —
|
|
118
|
+
so the adapter delivers the prompt via a temp file instead. The grok CLI is
|
|
119
|
+
still early beta: version pinning is recommended, and the JSON output is
|
|
120
|
+
parsed defensively so schema churn degrades into retryable fallback rather
|
|
121
|
+
than hard failure. `codex` / `gemini` remain schema-declared but rejected
|
|
122
|
+
(Phase 1b/1c pending).
|
|
123
|
+
|
|
124
|
+
### Added
|
|
125
|
+
|
|
126
|
+
- **`agent: grok` builder/parser in `AgentCliAdapter`**
|
|
127
|
+
(`coderouter/adapters/agent_cli.py`) — invokes the Grok CLI one-shot as
|
|
128
|
+
`grok --prompt-file <workdir>/.coderouter-prompt-<uuid>.txt
|
|
129
|
+
--output-format json -m <model> --cwd <workdir> --max-turns <N>
|
|
130
|
+
--no-memory --sandbox read-only --permission-mode plan` (read_only
|
|
131
|
+
default). Auth is subscription-first, same as claude: the CLI's OAuth
|
|
132
|
+
login (`grok login`, SuperGrok / X Premium+) stores credentials at
|
|
133
|
+
`~/.grok/auth.json` (7-day expiry, auto-refresh; `GROK_HOME` overrides),
|
|
134
|
+
which the adapter's `HOME` inheritance reaches with
|
|
135
|
+
`passthrough_env: []`. For CI/API-key use the CLI reads
|
|
136
|
+
`GROK_CODE_XAI_API_KEY` (not `XAI_API_KEY`) — list it in
|
|
137
|
+
`passthrough_env` only if needed; it takes precedence over OAuth.
|
|
138
|
+
- **`sandbox_mode` → grok flag mapping** — `read_only` →
|
|
139
|
+
`--sandbox read-only --permission-mode plan`; `edit` →
|
|
140
|
+
`--sandbox workspace --permission-mode acceptEdits`; `full_auto` →
|
|
141
|
+
`--sandbox workspace --always-approve`. As with claude, the effective
|
|
142
|
+
mode is clamped to read-only whenever `allow_file_writes=false`,
|
|
143
|
+
regardless of `sandbox_mode` (defense in depth). Unlike claude,
|
|
144
|
+
`full_auto` maps distinctly from `edit`.
|
|
145
|
+
- **Prompt delivery via `--prompt-file`** — grok's `-p`/`--single` requires
|
|
146
|
+
the prompt as an argv VALUE (verified on the real CLI: stdin is not
|
|
147
|
+
accepted as the prompt), and putting huge prompts on argv would hit
|
|
148
|
+
Linux's `MAX_ARG_STRLEN` (~128KiB) and expose the full prompt text to
|
|
149
|
+
`ps`. The adapter instead writes the prompt to a mode-`0600` temp file
|
|
150
|
+
inside the isolated workdir and passes `--prompt-file`; the file is
|
|
151
|
+
always deleted afterwards, including on the timeout and error paths.
|
|
152
|
+
- **`--no-memory` always passed** — grok has a cross-session memory
|
|
153
|
+
feature; disabling it unconditionally preserves the
|
|
154
|
+
"one request = one stateless transformation" ethos (a previous call's
|
|
155
|
+
memory can never leak into the next response). Not configurable.
|
|
156
|
+
- **grok JSON parsing + zero-usage reporting** — `--output-format json`
|
|
157
|
+
emits a single JSON object `{"text", "stopReason", "sessionId",
|
|
158
|
+
"requestId", "thought"?}` (verified on grok v0.2.93). `text` becomes the
|
|
159
|
+
final answer; `sessionId` surfaces as the `coderouter_session_id`
|
|
160
|
+
response metadata. There are NO token-usage or cost fields, so usage is
|
|
161
|
+
reported as zeros and `coderouter_cost_usd` stays 0 unless the operator
|
|
162
|
+
sets unit prices in `ProviderConfig.cost` (in contrast to claude's
|
|
163
|
+
direct `total_cost_usd`). Parsing is defensive: anything malformed
|
|
164
|
+
raises a retryable `AdapterError` and the fallback chain advances.
|
|
165
|
+
Runtime errors (exit 1 with the error text on stderr) surface a stderr
|
|
166
|
+
tail in the `AdapterError` message.
|
|
167
|
+
|
|
168
|
+
### Changed
|
|
169
|
+
|
|
170
|
+
- **Unsupported-agent error message** — constructing the adapter with a
|
|
171
|
+
not-yet-implemented agent now lists what IS implemented (e.g.
|
|
172
|
+
`agent 'codex' is not implemented yet (implemented: claude, grok)`)
|
|
173
|
+
instead of the Phase-1a-specific "claude only" wording. Still
|
|
174
|
+
`retryable=False` — a configuration error, not a fallback candidate.
|
|
175
|
+
- **Schema docstrings** (`coderouter/config/schemas.py`) — `AgentCliConfig`
|
|
176
|
+
field descriptions updated for the two-agent reality; the design-time
|
|
177
|
+
"grok requires `XAI_API_KEY` in `passthrough_env`" validation note was
|
|
178
|
+
dropped as obsolete (grok now supports subscription OAuth).
|
|
179
|
+
- **Docs & examples** — `docs/backends/external-agents.md`/`.en.md` gain a
|
|
180
|
+
full grok section (config example, adapter argv, sandbox mapping table,
|
|
181
|
+
prompt-file rationale, `--no-memory` rationale, JSON schema and
|
|
182
|
+
zero-usage note, OAuth setup steps, early-beta/version-pin caveat) and
|
|
183
|
+
updated implementation-status wording. The design doc
|
|
184
|
+
`docs/designs/external-agents-adapter.md` gets a new appendix §11.3
|
|
185
|
+
recording the verified deltas between the 2026-07 research and grok
|
|
186
|
+
v0.2.93 (body text left as the historical record).
|
|
187
|
+
`examples/providers-agent-cli.yaml` promotes grok out of the
|
|
188
|
+
not-implemented preview into a documented (still commented-out, so
|
|
189
|
+
copying the file doesn't require grok to be installed) block with the
|
|
190
|
+
corrected model (`grok-4.5` — `grok-code-fast-1` was retired
|
|
191
|
+
2026-05-15), `paid: false` for subscription OAuth, and
|
|
192
|
+
`passthrough_env: []`.
|
|
193
|
+
|
|
12
194
|
## [v2.7.7] — 2026-07-10 (External coding agents: agent_cli adapter, Phase 1a claude)
|
|
13
195
|
|
|
14
196
|
**PR #62 / #63**. Adds a new adapter kind, `agent_cli`, that lets CodeRouter front an external
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: coderouter-cli
|
|
3
|
-
Version: 2.7.
|
|
3
|
+
Version: 2.7.9
|
|
4
4
|
Summary: Local-first, free-first, fallback-built-in LLM router. Claude Code / OpenAI compatible.
|
|
5
5
|
Project-URL: Homepage, https://github.com/zephel01/CodeRouter
|
|
6
6
|
Project-URL: Repository, https://github.com/zephel01/CodeRouter
|