coderouter-cli 2.7.6__tar.gz → 2.7.7__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.6 → coderouter_cli-2.7.7}/CHANGELOG.md +89 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/PKG-INFO +1 -1
- coderouter_cli-2.7.7/coderouter/adapters/agent_cli.py +591 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/adapters/registry.py +6 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/config/schemas.py +162 -3
- coderouter_cli-2.7.7/docs/designs/external-agents-adapter.md +606 -0
- coderouter_cli-2.7.7/examples/providers-agent-cli.yaml +166 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/pyproject.toml +1 -1
- coderouter_cli-2.7.7/tests/test_agent_cli.py +529 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/.gitignore +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/LICENSE +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/README.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/README.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/__main__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/adapters/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/adapters/anthropic_native.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/adapters/base.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/adapters/openai_compat.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/cli.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/cli_stats.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/config/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/config/capability_registry.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/config/env_file.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/config/loader.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/cost.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/data/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/data/model-capabilities.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/doctor.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/doctor_apply.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/env_security.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/errors.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/gguf_introspect.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/_fingerprint.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/backend_health.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/context_budget.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/continuous_probe.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/drift_actions.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/drift_detection.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/memory_budget.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/memory_pressure.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/self_healing.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/tool_loop.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/hardware.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/ingress/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/ingress/anthropic_routes.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/ingress/app.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/ingress/dashboard_routes.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/ingress/launcher_routes.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/ingress/metrics_routes.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/ingress/openai_routes.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/language_tax.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/launcher_speculative.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/logging.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/metrics/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/metrics/collector.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/metrics/prometheus.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/output_filters.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/plugins/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/plugins/base.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/plugins/loader.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/plugins/registry.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/routing/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/routing/adaptive.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/routing/auto_router.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/routing/budget.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/routing/capability.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/routing/fallback.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/state/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/state/audit_log.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/state/replay.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/state/request_log.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/state/store.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/state/suggest_rules.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/token_estimation.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/token_estimation_accurate.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/translation/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/translation/anthropic.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/translation/convert.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/translation/tool_repair.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/README.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/README.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/assets/dashboard-demo.png +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/claude-code-llamacpp-vllm.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/claude-code-llamacpp-vllm.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/gguf_dl.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/gguf_dl.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/hf-ollama-models.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/hf-ollama-models.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/install-backends.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/install-backends.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/launcher-quickstart.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/launcher-quickstart.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/launcher.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/launcher.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/llamacpp-direct.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/llamacpp-direct.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/lmstudio-direct.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/lmstudio-direct.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/verify-ollama-0.23.1.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/concepts/architecture.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/concepts/architecture.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/concepts/context-budget.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/concepts/context-budget.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/concepts/continuous-probing.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/concepts/continuous-probing.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/concepts/drift-detection.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/concepts/drift-detection.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/concepts/partial-stitch.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/concepts/partial-stitch.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/designs/v1.5-dashboard-mockup.html +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/designs/v1.6-auto-router-verification.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/designs/v1.6-auto-router.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/free-tier-guide.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/free-tier-guide.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/language-tax.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/language-tax.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/remote-access.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/remote-access.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/security.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/security.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/troubleshooting.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/troubleshooting.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/usage-guide.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/usage-guide.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/low-memory-integration.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/low-memory-integration.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/openrouter-roster/CHANGES.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/openrouter-roster/README.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/openrouter-roster/latest.json +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/retrospectives/v0.4.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/retrospectives/v0.5-verify.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/retrospectives/v0.5.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/retrospectives/v0.6.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/retrospectives/v0.7.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/retrospectives/v1.0-verify.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/retrospectives/v1.0.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/start/quickstart.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/start/quickstart.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/start/when-do-i-need-coderouter.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/start/when-do-i-need-coderouter.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/.env.example +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/README.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/providers-multiagent.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/providers.context-budget-test.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/providers.llamacpp-vllm.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/providers.nvidia-nim.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/providers.ollama-auto-custom.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/providers.ollama-auto.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/providers.ollama-free-chain.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/providers.raspberrypi.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/providers.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/scripts/demo_traffic.sh +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/scripts/openrouter_roster_diff.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/scripts/smoke_v2_2.sh +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/scripts/verify-providers.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/scripts/verify_ollama_0_23.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/scripts/verify_v0_5.sh +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/scripts/verify_v1_0.sh +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/conftest.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_adapter_anthropic.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_audit_log.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_auto_router.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_auto_router_cjk.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_backend_health.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_budget.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_capability.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_capability_degraded_payload.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_capability_registry.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_capability_registry_cache_control.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_capability_tool_choice.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_claude_code_suitability.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_cli.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_cli_bind_warning.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_cli_stats.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_config.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_config_shim_actions.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_context_budget.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_continuous_probe.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_dashboard_endpoint.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_doctor.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_doctor_apply.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_doctor_cache_probe.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_drift_actions.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_drift_detection.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_drift_detection_integration.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_env_file.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_env_security.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_errors.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_examples_yaml.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fallback.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fallback_anthropic.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fallback_cache_control.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fallback_cache_observed.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fallback_cache_strip.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fallback_empty_response.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fallback_misconfig_warn.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fallback_paid_gate.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fallback_thinking.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fallback_tool_choice_emulate.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_h1_prometheus_drift.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_h2_h6_translation.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_h3_client_reuse.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_h4_h5_guards.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_h7_probe_restore.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_h8_launcher_auth.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_mA_routing.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_mB_adapters.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_mC_convert.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_mD_logging_metrics.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_mE_config_validation.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_mF_ingress.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_gguf_introspect.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_guards_tool_loop.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_hardware.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_ingress_anthropic.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_ingress_count_tokens.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_ingress_profile.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_language_tax.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_language_tax_integration.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_launcher_mtp.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_launcher_mtp_fallback.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_launcher_provider_sync.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_memory_budget.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_memory_pressure.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_metrics_cache.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_metrics_collector.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_metrics_cost.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_metrics_endpoint.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_metrics_jsonl.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_metrics_prometheus.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_metrics_prometheus_cache.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_models_passthrough.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_openai_compat.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_openrouter_roster_diff.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_output_filters.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_output_filters_adapters.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_partial_stitch.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_plugins_integration.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_plugins_loader.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_plugins_registry.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_reasoning_strip.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_repair_byte_fallback.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_request_log.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_role_normalization.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_routing_adaptive.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_self_healing.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_setup_sh.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_state_store.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_token_estimation.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_token_estimation_accurate.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_tokens_saved_metric.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_tool_repair.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_tool_repair_lenient.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_tool_repair_r4.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_toolrepair_bench.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_translation_anthropic.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_translation_reverse.py +0 -0
|
@@ -9,6 +9,95 @@ are kept verbatim where the Japanese text itself is the subject).
|
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
+
## [v2.7.7] — 2026-07-10 (External coding agents: agent_cli adapter, Phase 1a claude)
|
|
13
|
+
|
|
14
|
+
**PR #62 / #63**. Adds a new adapter kind, `agent_cli`, that lets CodeRouter front an external
|
|
15
|
+
coding-agent CLI (Claude Code / Codex / Gemini / Grok) as a single one-shot
|
|
16
|
+
`prompt in → text out` transformation, keeping the "one request = one
|
|
17
|
+
stateless transformation" ethos intact even though the underlying CLI is a
|
|
18
|
+
stateful, multi-turn, filesystem-editing control loop. Phase 1a implements
|
|
19
|
+
only the `claude` target (Claude Code CLI) — the most stable of the four and
|
|
20
|
+
the only one that emits `total_cost_usd` directly, making it the reference
|
|
21
|
+
implementation for the parser and cost path. `codex` / `gemini` / `grok` are
|
|
22
|
+
declared in the config schema for forward compatibility but rejected with a
|
|
23
|
+
clear error until their phase lands (Phase 1b-1d).
|
|
24
|
+
|
|
25
|
+
### Added
|
|
26
|
+
|
|
27
|
+
- **`kind: "agent_cli"` + `AgentCliAdapter`** (`coderouter/adapters/agent_cli.py`,
|
|
28
|
+
new) — invokes the Claude Code CLI one-shot via
|
|
29
|
+
`claude -p --output-format json` (prompt fed on stdin, never on argv, so
|
|
30
|
+
it is never subject to shell interpretation; `shell=True` is never used).
|
|
31
|
+
Key behaviors:
|
|
32
|
+
- Subscription-first OAuth: the child process does NOT inherit the parent
|
|
33
|
+
environment. A minimal env is built explicitly (fixed safe `PATH`,
|
|
34
|
+
`NO_COLOR=1`, `TERM=dumb`, inherited `HOME` for credential-dir
|
|
35
|
+
discovery); `ANTHROPIC_API_KEY` is never forwarded unless the operator
|
|
36
|
+
explicitly lists it in `passthrough_env` (prevents a stray key from
|
|
37
|
+
silently overriding subscription auth). `--bare` is deliberately never
|
|
38
|
+
added — it would skip OAuth/keychain reads.
|
|
39
|
+
- `CODEROUTER_AGENT_DEPTH` recursion guard: the depth is read from the
|
|
40
|
+
environment, incremented, and propagated into the child; `generate()`
|
|
41
|
+
refuses with a non-retryable error once the current depth reaches
|
|
42
|
+
`agent_depth_limit` (default 2).
|
|
43
|
+
- `exec_timeout_s` is enforced independently of `ProviderConfig.timeout_s`
|
|
44
|
+
via `asyncio.wait_for`; on expiry the whole child process *group* is
|
|
45
|
+
`SIGKILL`ed (`start_new_session=True` + `os.killpg`) so the CLI's real
|
|
46
|
+
LLM-call subprocess is never orphaned.
|
|
47
|
+
- Default `read_only` sandbox: `allow_file_writes=False` /
|
|
48
|
+
`sandbox_mode="read_only"` map to claude's `--permission-mode plan`.
|
|
49
|
+
The permission-mode mapping is clamped to read-only whenever
|
|
50
|
+
`allow_file_writes` is False, regardless of `sandbox_mode` (defense in
|
|
51
|
+
depth). `edit` / `full_auto` both map to `acceptEdits`.
|
|
52
|
+
- Pseudo-streaming: no CLI in Phase 1a exposes a stable token stream, so
|
|
53
|
+
`stream()` runs `generate()` once and chunks the final answer into
|
|
54
|
+
content `StreamChunk`s followed by a terminal `finish_reason="stop"`
|
|
55
|
+
chunk carrying usage.
|
|
56
|
+
- `total_cost_usd` (claude's JSON output) propagates to the response as
|
|
57
|
+
the `coderouter_cost_usd` metadata field, feeding the cost dashboard;
|
|
58
|
+
`session_id` similarly surfaces as `coderouter_session_id`.
|
|
59
|
+
- **`AgentCliConfig` schema** (`coderouter/config/schemas.py`) — new
|
|
60
|
+
`ProviderConfig.agent_cli` sub-config (`agent`, `command`, `workdir`,
|
|
61
|
+
`exec_timeout_s`, `allow_file_writes`, `sandbox_mode`, `model`,
|
|
62
|
+
`max_turns`, `passthrough_env`, `agent_depth_limit`), `extra="forbid"`
|
|
63
|
+
like the rest of the module. `ProviderConfig.base_url` is relaxed to
|
|
64
|
+
optional so `agent_cli` providers (which shell out to a local CLI rather
|
|
65
|
+
than calling a URL) can omit it; a `model_validator` restores the
|
|
66
|
+
required-ness of `base_url` for `openai_compat` / `anthropic` and
|
|
67
|
+
requires the `agent_cli` sub-config whenever `kind == "agent_cli"`.
|
|
68
|
+
- **30 new tests** (`tests/test_agent_cli.py`) covering argv construction
|
|
69
|
+
(model/max-turns/permission-mode mapping and the write-clamp), claude JSON
|
|
70
|
+
parsing (success / `is_error` / malformed / missing-field paths), a
|
|
71
|
+
stubbed-subprocess `generate()` path, timeout → process-group kill,
|
|
72
|
+
child-env isolation (no `ANTHROPIC_API_KEY` leak, `passthrough_env`
|
|
73
|
+
allowlist, depth increment), the recursion depth limit, and a TestClient
|
|
74
|
+
end-to-end run through `POST /v1/chat/completions`.
|
|
75
|
+
- New example config: `examples/providers-agent-cli.yaml` — a runnable
|
|
76
|
+
single-provider `agent_cli` setup for `claude`, plus a commented-out
|
|
77
|
+
preview of the future `codex` / `gemini` / `grok` provider blocks.
|
|
78
|
+
- Design doc: `docs/designs/external-agents-adapter.md` — the full Phase 1
|
|
79
|
+
design (architecture, security requirements, per-CLI argv/JSON tables,
|
|
80
|
+
auth policy, test plan). `codex` / `gemini` / `grok` remain Phase
|
|
81
|
+
1b-1d — configuring `agent_cli.agent` to any of them is accepted at
|
|
82
|
+
config-load time but rejected with a clear, non-retryable error
|
|
83
|
+
(`"agent 'codex' is not implemented in Phase 1a (claude only)"`) when the
|
|
84
|
+
adapter is constructed.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
### Fixed
|
|
89
|
+
|
|
90
|
+
- **Paid gate blocked the example config** (PR #63): the `ALLOW_PAID` env var
|
|
91
|
+
overrides the yaml `allow_paid`, so the example's `allow_paid: true` was
|
|
92
|
+
silently defeated. Subscription-OAuth claude has zero incremental cost —
|
|
93
|
+
the example now marks the provider `paid: false` (grok stays `paid: true`,
|
|
94
|
+
API-metered).
|
|
95
|
+
- **`Not logged in` under the minimal child env** (PR #63): on macOS the
|
|
96
|
+
Claude Code CLI resolves its Keychain credential via `USER`; the child env
|
|
97
|
+
now inherits `USER`/`LOGNAME` alongside `HOME`. Failures reported as an
|
|
98
|
+
`is_error` result JSON on stdout (exit 1, empty stderr) now surface the
|
|
99
|
+
actual `result` text in provider-failed logs instead of an empty tail.
|
|
100
|
+
|
|
12
101
|
## [v2.7.6] — 2026-07-09 (Launcher MTP / speculative-decoding support)
|
|
13
102
|
|
|
14
103
|
**PR #59 / #60**. Adds Multi-Token Prediction (MTP) / speculative-decoding
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: coderouter-cli
|
|
3
|
-
Version: 2.7.
|
|
3
|
+
Version: 2.7.7
|
|
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
|