coderouter-cli 2.7.5__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.5 → coderouter_cli-2.7.7}/CHANGELOG.md +158 -0
- {coderouter_cli-2.7.5 → 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.5 → coderouter_cli-2.7.7}/coderouter/adapters/registry.py +6 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/config/schemas.py +162 -3
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/gguf_introspect.py +19 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/ingress/launcher_routes.py +215 -20
- coderouter_cli-2.7.7/coderouter/launcher_speculative.py +333 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/launcher-quickstart.en.md +2 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/launcher-quickstart.md +2 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/launcher.en.md +55 -1
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/launcher.md +55 -1
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/llamacpp-direct.en.md +26 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/llamacpp-direct.md +26 -0
- coderouter_cli-2.7.7/docs/designs/external-agents-adapter.md +606 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/remote-access.en.md +6 -6
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/remote-access.md +6 -6
- coderouter_cli-2.7.7/examples/providers-agent-cli.yaml +166 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/providers.llamacpp-vllm.yaml +7 -0
- {coderouter_cli-2.7.5 → 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.5 → coderouter_cli-2.7.7}/tests/test_gguf_introspect.py +25 -0
- coderouter_cli-2.7.7/tests/test_launcher_mtp.py +440 -0
- coderouter_cli-2.7.7/tests/test_launcher_mtp_fallback.py +272 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/.gitignore +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/LICENSE +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/README.en.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/README.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/__init__.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/__main__.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/adapters/__init__.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/adapters/anthropic_native.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/adapters/base.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/adapters/openai_compat.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/cli.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/cli_stats.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/config/__init__.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/config/capability_registry.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/config/env_file.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/config/loader.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/cost.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/data/__init__.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/data/model-capabilities.yaml +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/doctor.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/doctor_apply.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/env_security.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/errors.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/__init__.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/_fingerprint.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/backend_health.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/context_budget.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/continuous_probe.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/drift_actions.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/drift_detection.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/memory_budget.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/memory_pressure.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/self_healing.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/tool_loop.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/hardware.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/ingress/__init__.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/ingress/anthropic_routes.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/ingress/app.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/ingress/dashboard_routes.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/ingress/metrics_routes.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/ingress/openai_routes.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/language_tax.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/logging.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/metrics/__init__.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/metrics/collector.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/metrics/prometheus.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/output_filters.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/plugins/__init__.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/plugins/base.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/plugins/loader.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/plugins/registry.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/routing/__init__.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/routing/adaptive.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/routing/auto_router.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/routing/budget.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/routing/capability.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/routing/fallback.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/state/__init__.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/state/audit_log.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/state/replay.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/state/request_log.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/state/store.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/state/suggest_rules.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/token_estimation.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/token_estimation_accurate.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/translation/__init__.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/translation/anthropic.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/translation/convert.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/translation/tool_repair.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/README.en.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/README.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/assets/dashboard-demo.png +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/claude-code-llamacpp-vllm.en.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/claude-code-llamacpp-vllm.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/gguf_dl.en.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/gguf_dl.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/hf-ollama-models.en.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/hf-ollama-models.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/install-backends.en.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/install-backends.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/lmstudio-direct.en.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/lmstudio-direct.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/verify-ollama-0.23.1.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/concepts/architecture.en.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/concepts/architecture.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/concepts/context-budget.en.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/concepts/context-budget.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/concepts/continuous-probing.en.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/concepts/continuous-probing.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/concepts/drift-detection.en.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/concepts/drift-detection.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/concepts/partial-stitch.en.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/concepts/partial-stitch.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/designs/v1.5-dashboard-mockup.html +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/designs/v1.6-auto-router-verification.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/designs/v1.6-auto-router.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/free-tier-guide.en.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/free-tier-guide.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/language-tax.en.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/language-tax.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/security.en.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/security.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/troubleshooting.en.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/troubleshooting.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/usage-guide.en.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/usage-guide.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/low-memory-integration.en.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/low-memory-integration.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/openrouter-roster/CHANGES.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/openrouter-roster/README.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/openrouter-roster/latest.json +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/retrospectives/v0.4.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/retrospectives/v0.5-verify.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/retrospectives/v0.5.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/retrospectives/v0.6.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/retrospectives/v0.7.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/retrospectives/v1.0-verify.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/retrospectives/v1.0.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/start/quickstart.en.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/start/quickstart.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/start/when-do-i-need-coderouter.en.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/start/when-do-i-need-coderouter.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/.env.example +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/README.md +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/providers-multiagent.yaml +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/providers.context-budget-test.yaml +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/providers.nvidia-nim.yaml +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/providers.ollama-auto-custom.yaml +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/providers.ollama-auto.yaml +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/providers.ollama-free-chain.yaml +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/providers.raspberrypi.yaml +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/providers.yaml +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/scripts/demo_traffic.sh +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/scripts/openrouter_roster_diff.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/scripts/smoke_v2_2.sh +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/scripts/verify-providers.yaml +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/scripts/verify_ollama_0_23.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/scripts/verify_v0_5.sh +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/scripts/verify_v1_0.sh +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/__init__.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/conftest.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_adapter_anthropic.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_audit_log.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_auto_router.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_auto_router_cjk.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_backend_health.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_budget.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_capability.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_capability_degraded_payload.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_capability_registry.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_capability_registry_cache_control.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_capability_tool_choice.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_claude_code_suitability.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_cli.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_cli_bind_warning.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_cli_stats.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_config.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_config_shim_actions.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_context_budget.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_continuous_probe.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_dashboard_endpoint.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_doctor.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_doctor_apply.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_doctor_cache_probe.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_drift_actions.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_drift_detection.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_drift_detection_integration.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_env_file.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_env_security.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_errors.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_examples_yaml.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fallback.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fallback_anthropic.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fallback_cache_control.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fallback_cache_observed.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fallback_cache_strip.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fallback_empty_response.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fallback_misconfig_warn.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fallback_paid_gate.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fallback_thinking.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fallback_tool_choice_emulate.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_h1_prometheus_drift.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_h2_h6_translation.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_h3_client_reuse.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_h4_h5_guards.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_h7_probe_restore.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_h8_launcher_auth.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_mA_routing.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_mB_adapters.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_mC_convert.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_mD_logging_metrics.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_mE_config_validation.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_mF_ingress.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_guards_tool_loop.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_hardware.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_ingress_anthropic.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_ingress_count_tokens.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_ingress_profile.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_language_tax.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_language_tax_integration.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_launcher_provider_sync.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_memory_budget.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_memory_pressure.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_metrics_cache.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_metrics_collector.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_metrics_cost.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_metrics_endpoint.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_metrics_jsonl.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_metrics_prometheus.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_metrics_prometheus_cache.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_models_passthrough.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_openai_compat.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_openrouter_roster_diff.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_output_filters.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_output_filters_adapters.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_partial_stitch.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_plugins_integration.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_plugins_loader.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_plugins_registry.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_reasoning_strip.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_repair_byte_fallback.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_request_log.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_role_normalization.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_routing_adaptive.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_self_healing.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_setup_sh.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_state_store.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_token_estimation.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_token_estimation_accurate.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_tokens_saved_metric.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_tool_repair.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_tool_repair_lenient.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_tool_repair_r4.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_toolrepair_bench.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_translation_anthropic.py +0 -0
- {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_translation_reverse.py +0 -0
|
@@ -9,6 +9,164 @@ 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
|
+
|
|
101
|
+
## [v2.7.6] — 2026-07-09 (Launcher MTP / speculative-decoding support)
|
|
102
|
+
|
|
103
|
+
**PR #59 / #60**. Adds Multi-Token Prediction (MTP) / speculative-decoding
|
|
104
|
+
support to the llama.cpp launcher (both the Web UI and the desktop GUI), closing the
|
|
105
|
+
gap where operators had to hand-assemble `--spec-type` / `--model-draft`
|
|
106
|
+
flags. Fully backward compatible: the new fields default to auto-detection
|
|
107
|
+
with a silent no-op fallback, no config-schema changes, no new dependencies.
|
|
108
|
+
|
|
109
|
+
### Added
|
|
110
|
+
|
|
111
|
+
- **`resolve_speculative()` / `find_draft_companion()`**
|
|
112
|
+
(`coderouter/launcher_speculative.py`) — shared decision logic for both
|
|
113
|
+
launchers. `mtp_mode="auto"` (default) first checks the selected gguf's
|
|
114
|
+
own metadata for embedded nextn layers (`{arch}.nextn_predict_layers > 0`)
|
|
115
|
+
and, if present, emits `--spec-type draft-mtp` with no separate draft
|
|
116
|
+
model; otherwise it scans the *same folder* as the main gguf for a
|
|
117
|
+
companion draft/MTP file (name hint or shared prefix, size under 50% of
|
|
118
|
+
the main model, architecture-matched when readable) and wires up
|
|
119
|
+
`--spec-type draft-mtp|draft-simple --model-draft <path>`; otherwise it
|
|
120
|
+
starts normally and logs that no companion was found. An explicit
|
|
121
|
+
`draft_model_path` skips detection entirely (400 if the path doesn't
|
|
122
|
+
exist); `mtp_mode="off"` never emits speculative flags. When the operator
|
|
123
|
+
supplies `--spec-type` in extra args, auto-detection defers to it and
|
|
124
|
+
adds nothing.
|
|
125
|
+
Both knobs are llama.cpp-only — vllm/mlx reject them with a 400.
|
|
126
|
+
- **`POST /api/launcher/start`**: new optional `draft_model_path` and
|
|
127
|
+
`mtp_mode` (`"auto"` / `"off"`) fields; the response now carries the
|
|
128
|
+
resolved flags as `"speculative"`. `-md` / `--model-draft` /
|
|
129
|
+
`--spec-draft-model` join the existing `-m`/`--model` denylist for
|
|
130
|
+
`options`/`extra_args` (llama.cpp) — the draft model can only be set via
|
|
131
|
+
`draft_model_path`. The remaining spec knobs (`--spec-type`,
|
|
132
|
+
`--spec-draft-n-max/-n-min/-p-min`, `-ngld`, `-devd`) stay free-form.
|
|
133
|
+
- **GGUF introspection** (`coderouter/gguf_introspect.py`): `GGUFInfo` now
|
|
134
|
+
reports `n_nextn` and the derived `supports_mtp` property, read from
|
|
135
|
+
`{arch}.nextn_predict_layers`.
|
|
136
|
+
- **`--split-mode tensor` crash warning**: known llama.cpp issue #24309 —
|
|
137
|
+
a nextn-embedded model combined with tensor split can crash. The launcher
|
|
138
|
+
detects the combination and logs a warning recommending `--split-mode
|
|
139
|
+
layer` without blocking the launch.
|
|
140
|
+
- **UI**: Web LAUNCH form gets "MTP/draft gguf (空欄で自動検出)" text field
|
|
141
|
+
+ "MTP" `auto`/`off` select. Desktop GUI (`launcher_gui.py`) gets the
|
|
142
|
+
matching Entry + a "MTP自動検出" checkbox (default on).
|
|
143
|
+
- **Automatic MTP startup-crash fallback**: when speculative flags were added
|
|
144
|
+
by AUTO detection (`mtp_mode="auto"`, no explicit `draft_model_path`) and the
|
|
145
|
+
backend dies during startup (non-zero exit within ~3 min), the launcher
|
|
146
|
+
relaunches it ONCE without the speculative flags and logs
|
|
147
|
+
`[launcher] MTP startup failure detected (exit code ...); retrying without
|
|
148
|
+
speculative decoding` plus the flag-free command. This covers architectures
|
|
149
|
+
whose `draft-mtp` support in llama.cpp is still immature (detection is right
|
|
150
|
+
but the MTP context fails to initialize, e.g. `failed to measure MTP context
|
|
151
|
+
memory`). Explicit `draft_model_path` / operator-supplied `--spec-type` are
|
|
152
|
+
never auto-retried, and the retry can never loop (single-shot, guarded).
|
|
153
|
+
Implemented in both the Web launcher (`launcher_routes.py`) and the desktop
|
|
154
|
+
GUI (`launcher_gui.py`).
|
|
155
|
+
|
|
156
|
+
### Docs
|
|
157
|
+
|
|
158
|
+
- `docs/backends/launcher.md`/`.en.md`: new "MTP / speculative decoding"
|
|
159
|
+
section (auto-detection order, companion-file convention, `mtp_mode=off`,
|
|
160
|
+
extra-args deferral, `-md` denylist, issue #24309 caveat, API fields), plus
|
|
161
|
+
the LAUNCH form field table and denylist note updated.
|
|
162
|
+
- `docs/backends/llamacpp-direct.md`/`.en.md`: manual `--spec-type
|
|
163
|
+
draft-mtp` / `--model-draft` / `--spec-draft-n-max` usage example, with a
|
|
164
|
+
pointer to the launcher's auto-detection.
|
|
165
|
+
- `docs/backends/launcher-quickstart.md`/`.en.md`: one-line pointer to the
|
|
166
|
+
new MTP section.
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
12
170
|
## [v2.7.5] — 2026-07-06 (External-bind startup warning + remote-access guide + docs i18n)
|
|
13
171
|
|
|
14
172
|
Driven by the first field report against the v2.7.0 Host-validation
|
|
@@ -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
|