coderouter-cli 2.7.6__tar.gz → 2.7.8__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.8}/CHANGELOG.md +177 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/PKG-INFO +1 -1
- coderouter_cli-2.7.8/coderouter/adapters/agent_cli.py +780 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/adapters/registry.py +6 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/config/schemas.py +200 -5
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/guards/backend_health.py +63 -1
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/logging.py +60 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/routing/fallback.py +37 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/README.en.md +1 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/README.md +1 -0
- coderouter_cli-2.7.8/docs/backends/external-agents.en.md +233 -0
- coderouter_cli-2.7.8/docs/backends/external-agents.md +233 -0
- coderouter_cli-2.7.8/docs/designs/external-agents-adapter.md +623 -0
- coderouter_cli-2.7.8/examples/providers-agent-cli.yaml +193 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/pyproject.toml +1 -1
- coderouter_cli-2.7.8/tests/test_agent_cli.py +868 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_backend_health.py +182 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fix_mE_config_validation.py +41 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/.gitignore +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/LICENSE +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/README.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/README.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/__main__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/adapters/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/adapters/anthropic_native.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/adapters/base.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/adapters/openai_compat.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/cli.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/cli_stats.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/config/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/config/capability_registry.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/config/env_file.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/config/loader.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/cost.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/data/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/data/model-capabilities.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/doctor.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/doctor_apply.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/env_security.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/errors.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/gguf_introspect.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/guards/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/guards/_fingerprint.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/guards/context_budget.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/guards/continuous_probe.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/guards/drift_actions.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/guards/drift_detection.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/guards/memory_budget.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/guards/memory_pressure.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/guards/self_healing.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/guards/tool_loop.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/hardware.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/ingress/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/ingress/anthropic_routes.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/ingress/app.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/ingress/dashboard_routes.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/ingress/launcher_routes.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/ingress/metrics_routes.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/ingress/openai_routes.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/language_tax.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/launcher_speculative.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/metrics/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/metrics/collector.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/metrics/prometheus.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/output_filters.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/plugins/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/plugins/base.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/plugins/loader.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/plugins/registry.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/routing/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/routing/adaptive.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/routing/auto_router.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/routing/budget.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/routing/capability.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/state/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/state/audit_log.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/state/replay.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/state/request_log.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/state/store.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/state/suggest_rules.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/token_estimation.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/token_estimation_accurate.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/translation/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/translation/anthropic.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/translation/convert.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/coderouter/translation/tool_repair.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/assets/dashboard-demo.png +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/backends/claude-code-llamacpp-vllm.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/backends/claude-code-llamacpp-vllm.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/backends/gguf_dl.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/backends/gguf_dl.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/backends/hf-ollama-models.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/backends/hf-ollama-models.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/backends/install-backends.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/backends/install-backends.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/backends/launcher-quickstart.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/backends/launcher-quickstart.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/backends/launcher.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/backends/launcher.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/backends/llamacpp-direct.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/backends/llamacpp-direct.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/backends/lmstudio-direct.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/backends/lmstudio-direct.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/backends/verify-ollama-0.23.1.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/concepts/architecture.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/concepts/architecture.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/concepts/context-budget.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/concepts/context-budget.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/concepts/continuous-probing.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/concepts/continuous-probing.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/concepts/drift-detection.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/concepts/drift-detection.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/concepts/partial-stitch.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/concepts/partial-stitch.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/designs/v1.5-dashboard-mockup.html +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/designs/v1.6-auto-router-verification.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/designs/v1.6-auto-router.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/guides/free-tier-guide.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/guides/free-tier-guide.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/guides/language-tax.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/guides/language-tax.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/guides/remote-access.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/guides/remote-access.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/guides/security.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/guides/security.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/guides/troubleshooting.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/guides/troubleshooting.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/guides/usage-guide.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/guides/usage-guide.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/low-memory-integration.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/low-memory-integration.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/openrouter-roster/CHANGES.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/openrouter-roster/README.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/openrouter-roster/latest.json +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/retrospectives/v0.4.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/retrospectives/v0.5-verify.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/retrospectives/v0.5.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/retrospectives/v0.6.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/retrospectives/v0.7.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/retrospectives/v1.0-verify.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/retrospectives/v1.0.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/start/quickstart.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/start/quickstart.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/start/when-do-i-need-coderouter.en.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/docs/start/when-do-i-need-coderouter.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/examples/.env.example +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/examples/README.md +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/examples/providers-multiagent.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/examples/providers.context-budget-test.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/examples/providers.llamacpp-vllm.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/examples/providers.nvidia-nim.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/examples/providers.ollama-auto-custom.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/examples/providers.ollama-auto.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/examples/providers.ollama-free-chain.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/examples/providers.raspberrypi.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/examples/providers.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/scripts/demo_traffic.sh +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/scripts/openrouter_roster_diff.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/scripts/smoke_v2_2.sh +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/scripts/verify-providers.yaml +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/scripts/verify_ollama_0_23.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/scripts/verify_v0_5.sh +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/scripts/verify_v1_0.sh +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/__init__.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/conftest.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_adapter_anthropic.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_audit_log.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_auto_router.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_auto_router_cjk.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_budget.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_capability.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_capability_degraded_payload.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_capability_registry.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_capability_registry_cache_control.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_capability_tool_choice.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_claude_code_suitability.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_cli.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_cli_bind_warning.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_cli_stats.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_config.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_config_shim_actions.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_context_budget.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_continuous_probe.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_dashboard_endpoint.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_doctor.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_doctor_apply.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_doctor_cache_probe.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_drift_actions.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_drift_detection.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_drift_detection_integration.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_env_file.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_env_security.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_errors.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_examples_yaml.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fallback.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fallback_anthropic.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fallback_cache_control.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fallback_cache_observed.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fallback_cache_strip.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fallback_empty_response.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fallback_misconfig_warn.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fallback_paid_gate.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fallback_thinking.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fallback_tool_choice_emulate.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fix_h1_prometheus_drift.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fix_h2_h6_translation.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fix_h3_client_reuse.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fix_h4_h5_guards.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fix_h7_probe_restore.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fix_h8_launcher_auth.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fix_mA_routing.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fix_mB_adapters.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fix_mC_convert.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fix_mD_logging_metrics.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_fix_mF_ingress.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_gguf_introspect.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_guards_tool_loop.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_hardware.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_ingress_anthropic.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_ingress_count_tokens.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_ingress_profile.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_language_tax.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_language_tax_integration.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_launcher_mtp.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_launcher_mtp_fallback.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_launcher_provider_sync.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_memory_budget.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_memory_pressure.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_metrics_cache.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_metrics_collector.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_metrics_cost.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_metrics_endpoint.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_metrics_jsonl.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_metrics_prometheus.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_metrics_prometheus_cache.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_models_passthrough.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_openai_compat.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_openrouter_roster_diff.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_output_filters.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_output_filters_adapters.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_partial_stitch.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_plugins_integration.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_plugins_loader.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_plugins_registry.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_reasoning_strip.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_repair_byte_fallback.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_request_log.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_role_normalization.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_routing_adaptive.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_self_healing.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_setup_sh.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_state_store.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_token_estimation.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_token_estimation_accurate.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_tokens_saved_metric.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_tool_repair.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_tool_repair_lenient.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_tool_repair_r4.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_toolrepair_bench.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_translation_anthropic.py +0 -0
- {coderouter_cli-2.7.6 → coderouter_cli-2.7.8}/tests/test_translation_reverse.py +0 -0
|
@@ -9,6 +9,183 @@ are kept verbatim where the Japanese text itself is the subject).
|
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
+
## [v2.7.8] — 2026-07-10 (agent_cli Phase 1d: grok)
|
|
13
|
+
|
|
14
|
+
Adds the second target to the `agent_cli` adapter: `agent: grok` (the xAI
|
|
15
|
+
Grok CLI) is now implemented alongside `claude` from Phase 1a. The
|
|
16
|
+
implementation was verified against the real CLI (grok v0.2.93, [stable]
|
|
17
|
+
channel, 2026-07-10), and several design-time assumptions from the 2026-07
|
|
18
|
+
research did not survive contact with it: the CLI now supports OAuth
|
|
19
|
+
subscription login (the design assumed grok was API-key-only with no
|
|
20
|
+
subscription path), `--sandbox` takes a profile value
|
|
21
|
+
(`off|workspace|read-only|strict`) rather than being a bare flag, a
|
|
22
|
+
Claude-Code-compatible `--permission-mode` exists, and `-p`/`--single` only
|
|
23
|
+
accepts the prompt as an argv value (stdin is not accepted as the prompt) —
|
|
24
|
+
so the adapter delivers the prompt via a temp file instead. The grok CLI is
|
|
25
|
+
still early beta: version pinning is recommended, and the JSON output is
|
|
26
|
+
parsed defensively so schema churn degrades into retryable fallback rather
|
|
27
|
+
than hard failure. `codex` / `gemini` remain schema-declared but rejected
|
|
28
|
+
(Phase 1b/1c pending).
|
|
29
|
+
|
|
30
|
+
### Added
|
|
31
|
+
|
|
32
|
+
- **`agent: grok` builder/parser in `AgentCliAdapter`**
|
|
33
|
+
(`coderouter/adapters/agent_cli.py`) — invokes the Grok CLI one-shot as
|
|
34
|
+
`grok --prompt-file <workdir>/.coderouter-prompt-<uuid>.txt
|
|
35
|
+
--output-format json -m <model> --cwd <workdir> --max-turns <N>
|
|
36
|
+
--no-memory --sandbox read-only --permission-mode plan` (read_only
|
|
37
|
+
default). Auth is subscription-first, same as claude: the CLI's OAuth
|
|
38
|
+
login (`grok login`, SuperGrok / X Premium+) stores credentials at
|
|
39
|
+
`~/.grok/auth.json` (7-day expiry, auto-refresh; `GROK_HOME` overrides),
|
|
40
|
+
which the adapter's `HOME` inheritance reaches with
|
|
41
|
+
`passthrough_env: []`. For CI/API-key use the CLI reads
|
|
42
|
+
`GROK_CODE_XAI_API_KEY` (not `XAI_API_KEY`) — list it in
|
|
43
|
+
`passthrough_env` only if needed; it takes precedence over OAuth.
|
|
44
|
+
- **`sandbox_mode` → grok flag mapping** — `read_only` →
|
|
45
|
+
`--sandbox read-only --permission-mode plan`; `edit` →
|
|
46
|
+
`--sandbox workspace --permission-mode acceptEdits`; `full_auto` →
|
|
47
|
+
`--sandbox workspace --always-approve`. As with claude, the effective
|
|
48
|
+
mode is clamped to read-only whenever `allow_file_writes=false`,
|
|
49
|
+
regardless of `sandbox_mode` (defense in depth). Unlike claude,
|
|
50
|
+
`full_auto` maps distinctly from `edit`.
|
|
51
|
+
- **Prompt delivery via `--prompt-file`** — grok's `-p`/`--single` requires
|
|
52
|
+
the prompt as an argv VALUE (verified on the real CLI: stdin is not
|
|
53
|
+
accepted as the prompt), and putting huge prompts on argv would hit
|
|
54
|
+
Linux's `MAX_ARG_STRLEN` (~128KiB) and expose the full prompt text to
|
|
55
|
+
`ps`. The adapter instead writes the prompt to a mode-`0600` temp file
|
|
56
|
+
inside the isolated workdir and passes `--prompt-file`; the file is
|
|
57
|
+
always deleted afterwards, including on the timeout and error paths.
|
|
58
|
+
- **`--no-memory` always passed** — grok has a cross-session memory
|
|
59
|
+
feature; disabling it unconditionally preserves the
|
|
60
|
+
"one request = one stateless transformation" ethos (a previous call's
|
|
61
|
+
memory can never leak into the next response). Not configurable.
|
|
62
|
+
- **grok JSON parsing + zero-usage reporting** — `--output-format json`
|
|
63
|
+
emits a single JSON object `{"text", "stopReason", "sessionId",
|
|
64
|
+
"requestId", "thought"?}` (verified on grok v0.2.93). `text` becomes the
|
|
65
|
+
final answer; `sessionId` surfaces as the `coderouter_session_id`
|
|
66
|
+
response metadata. There are NO token-usage or cost fields, so usage is
|
|
67
|
+
reported as zeros and `coderouter_cost_usd` stays 0 unless the operator
|
|
68
|
+
sets unit prices in `ProviderConfig.cost` (in contrast to claude's
|
|
69
|
+
direct `total_cost_usd`). Parsing is defensive: anything malformed
|
|
70
|
+
raises a retryable `AdapterError` and the fallback chain advances.
|
|
71
|
+
Runtime errors (exit 1 with the error text on stderr) surface a stderr
|
|
72
|
+
tail in the `AdapterError` message.
|
|
73
|
+
|
|
74
|
+
### Changed
|
|
75
|
+
|
|
76
|
+
- **Unsupported-agent error message** — constructing the adapter with a
|
|
77
|
+
not-yet-implemented agent now lists what IS implemented (e.g.
|
|
78
|
+
`agent 'codex' is not implemented yet (implemented: claude, grok)`)
|
|
79
|
+
instead of the Phase-1a-specific "claude only" wording. Still
|
|
80
|
+
`retryable=False` — a configuration error, not a fallback candidate.
|
|
81
|
+
- **Schema docstrings** (`coderouter/config/schemas.py`) — `AgentCliConfig`
|
|
82
|
+
field descriptions updated for the two-agent reality; the design-time
|
|
83
|
+
"grok requires `XAI_API_KEY` in `passthrough_env`" validation note was
|
|
84
|
+
dropped as obsolete (grok now supports subscription OAuth).
|
|
85
|
+
- **Docs & examples** — `docs/backends/external-agents.md`/`.en.md` gain a
|
|
86
|
+
full grok section (config example, adapter argv, sandbox mapping table,
|
|
87
|
+
prompt-file rationale, `--no-memory` rationale, JSON schema and
|
|
88
|
+
zero-usage note, OAuth setup steps, early-beta/version-pin caveat) and
|
|
89
|
+
updated implementation-status wording. The design doc
|
|
90
|
+
`docs/designs/external-agents-adapter.md` gets a new appendix §11.3
|
|
91
|
+
recording the verified deltas between the 2026-07 research and grok
|
|
92
|
+
v0.2.93 (body text left as the historical record).
|
|
93
|
+
`examples/providers-agent-cli.yaml` promotes grok out of the
|
|
94
|
+
not-implemented preview into a documented (still commented-out, so
|
|
95
|
+
copying the file doesn't require grok to be installed) block with the
|
|
96
|
+
corrected model (`grok-4.5` — `grok-code-fast-1` was retired
|
|
97
|
+
2026-05-15), `paid: false` for subscription OAuth, and
|
|
98
|
+
`passthrough_env: []`.
|
|
99
|
+
|
|
100
|
+
## [v2.7.7] — 2026-07-10 (External coding agents: agent_cli adapter, Phase 1a claude)
|
|
101
|
+
|
|
102
|
+
**PR #62 / #63**. Adds a new adapter kind, `agent_cli`, that lets CodeRouter front an external
|
|
103
|
+
coding-agent CLI (Claude Code / Codex / Gemini / Grok) as a single one-shot
|
|
104
|
+
`prompt in → text out` transformation, keeping the "one request = one
|
|
105
|
+
stateless transformation" ethos intact even though the underlying CLI is a
|
|
106
|
+
stateful, multi-turn, filesystem-editing control loop. Phase 1a implements
|
|
107
|
+
only the `claude` target (Claude Code CLI) — the most stable of the four and
|
|
108
|
+
the only one that emits `total_cost_usd` directly, making it the reference
|
|
109
|
+
implementation for the parser and cost path. `codex` / `gemini` / `grok` are
|
|
110
|
+
declared in the config schema for forward compatibility but rejected with a
|
|
111
|
+
clear error until their phase lands (Phase 1b-1d).
|
|
112
|
+
|
|
113
|
+
### Added
|
|
114
|
+
|
|
115
|
+
- **`kind: "agent_cli"` + `AgentCliAdapter`** (`coderouter/adapters/agent_cli.py`,
|
|
116
|
+
new) — invokes the Claude Code CLI one-shot via
|
|
117
|
+
`claude -p --output-format json` (prompt fed on stdin, never on argv, so
|
|
118
|
+
it is never subject to shell interpretation; `shell=True` is never used).
|
|
119
|
+
Key behaviors:
|
|
120
|
+
- Subscription-first OAuth: the child process does NOT inherit the parent
|
|
121
|
+
environment. A minimal env is built explicitly (fixed safe `PATH`,
|
|
122
|
+
`NO_COLOR=1`, `TERM=dumb`, inherited `HOME` for credential-dir
|
|
123
|
+
discovery); `ANTHROPIC_API_KEY` is never forwarded unless the operator
|
|
124
|
+
explicitly lists it in `passthrough_env` (prevents a stray key from
|
|
125
|
+
silently overriding subscription auth). `--bare` is deliberately never
|
|
126
|
+
added — it would skip OAuth/keychain reads.
|
|
127
|
+
- `CODEROUTER_AGENT_DEPTH` recursion guard: the depth is read from the
|
|
128
|
+
environment, incremented, and propagated into the child; `generate()`
|
|
129
|
+
refuses with a non-retryable error once the current depth reaches
|
|
130
|
+
`agent_depth_limit` (default 2).
|
|
131
|
+
- `exec_timeout_s` is enforced independently of `ProviderConfig.timeout_s`
|
|
132
|
+
via `asyncio.wait_for`; on expiry the whole child process *group* is
|
|
133
|
+
`SIGKILL`ed (`start_new_session=True` + `os.killpg`) so the CLI's real
|
|
134
|
+
LLM-call subprocess is never orphaned.
|
|
135
|
+
- Default `read_only` sandbox: `allow_file_writes=False` /
|
|
136
|
+
`sandbox_mode="read_only"` map to claude's `--permission-mode plan`.
|
|
137
|
+
The permission-mode mapping is clamped to read-only whenever
|
|
138
|
+
`allow_file_writes` is False, regardless of `sandbox_mode` (defense in
|
|
139
|
+
depth). `edit` / `full_auto` both map to `acceptEdits`.
|
|
140
|
+
- Pseudo-streaming: no CLI in Phase 1a exposes a stable token stream, so
|
|
141
|
+
`stream()` runs `generate()` once and chunks the final answer into
|
|
142
|
+
content `StreamChunk`s followed by a terminal `finish_reason="stop"`
|
|
143
|
+
chunk carrying usage.
|
|
144
|
+
- `total_cost_usd` (claude's JSON output) propagates to the response as
|
|
145
|
+
the `coderouter_cost_usd` metadata field, feeding the cost dashboard;
|
|
146
|
+
`session_id` similarly surfaces as `coderouter_session_id`.
|
|
147
|
+
- **`AgentCliConfig` schema** (`coderouter/config/schemas.py`) — new
|
|
148
|
+
`ProviderConfig.agent_cli` sub-config (`agent`, `command`, `workdir`,
|
|
149
|
+
`exec_timeout_s`, `allow_file_writes`, `sandbox_mode`, `model`,
|
|
150
|
+
`max_turns`, `passthrough_env`, `agent_depth_limit`), `extra="forbid"`
|
|
151
|
+
like the rest of the module. `ProviderConfig.base_url` is relaxed to
|
|
152
|
+
optional so `agent_cli` providers (which shell out to a local CLI rather
|
|
153
|
+
than calling a URL) can omit it; a `model_validator` restores the
|
|
154
|
+
required-ness of `base_url` for `openai_compat` / `anthropic` and
|
|
155
|
+
requires the `agent_cli` sub-config whenever `kind == "agent_cli"`.
|
|
156
|
+
- **30 new tests** (`tests/test_agent_cli.py`) covering argv construction
|
|
157
|
+
(model/max-turns/permission-mode mapping and the write-clamp), claude JSON
|
|
158
|
+
parsing (success / `is_error` / malformed / missing-field paths), a
|
|
159
|
+
stubbed-subprocess `generate()` path, timeout → process-group kill,
|
|
160
|
+
child-env isolation (no `ANTHROPIC_API_KEY` leak, `passthrough_env`
|
|
161
|
+
allowlist, depth increment), the recursion depth limit, and a TestClient
|
|
162
|
+
end-to-end run through `POST /v1/chat/completions`.
|
|
163
|
+
- New example config: `examples/providers-agent-cli.yaml` — a runnable
|
|
164
|
+
single-provider `agent_cli` setup for `claude`, plus a commented-out
|
|
165
|
+
preview of the future `codex` / `gemini` / `grok` provider blocks.
|
|
166
|
+
- Design doc: `docs/designs/external-agents-adapter.md` — the full Phase 1
|
|
167
|
+
design (architecture, security requirements, per-CLI argv/JSON tables,
|
|
168
|
+
auth policy, test plan). `codex` / `gemini` / `grok` remain Phase
|
|
169
|
+
1b-1d — configuring `agent_cli.agent` to any of them is accepted at
|
|
170
|
+
config-load time but rejected with a clear, non-retryable error
|
|
171
|
+
(`"agent 'codex' is not implemented in Phase 1a (claude only)"`) when the
|
|
172
|
+
adapter is constructed.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
### Fixed
|
|
177
|
+
|
|
178
|
+
- **Paid gate blocked the example config** (PR #63): the `ALLOW_PAID` env var
|
|
179
|
+
overrides the yaml `allow_paid`, so the example's `allow_paid: true` was
|
|
180
|
+
silently defeated. Subscription-OAuth claude has zero incremental cost —
|
|
181
|
+
the example now marks the provider `paid: false` (grok stays `paid: true`,
|
|
182
|
+
API-metered).
|
|
183
|
+
- **`Not logged in` under the minimal child env** (PR #63): on macOS the
|
|
184
|
+
Claude Code CLI resolves its Keychain credential via `USER`; the child env
|
|
185
|
+
now inherits `USER`/`LOGNAME` alongside `HOME`. Failures reported as an
|
|
186
|
+
`is_error` result JSON on stdout (exit 1, empty stderr) now surface the
|
|
187
|
+
actual `result` text in provider-failed logs instead of an empty tail.
|
|
188
|
+
|
|
12
189
|
## [v2.7.6] — 2026-07-09 (Launcher MTP / speculative-decoding support)
|
|
13
190
|
|
|
14
191
|
**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.8
|
|
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
|