coderouter-cli 2.9.3__tar.gz → 2.10.0__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.9.3 → coderouter_cli-2.10.0}/.gitignore +1 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/CHANGELOG.md +187 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/PKG-INFO +5 -2
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/README.md +3 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/cli.py +125 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/config/schemas.py +51 -1
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/ingress/launcher_routes.py +796 -3
- coderouter_cli-2.10.0/coderouter/launcher_devices.py +518 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/translation/anthropic.py +26 -5
- coderouter_cli-2.10.0/coderouter/vscode_init.py +573 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/backends/launcher-quickstart.en.md +2 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/backends/launcher-quickstart.md +2 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/backends/launcher.en.md +161 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/backends/launcher.md +225 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/guides/troubleshooting.md +47 -0
- coderouter_cli-2.10.0/docs/guides/vscode.md +163 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/openrouter-roster/CHANGES.md +10 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/openrouter-roster/latest.json +6 -6
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/examples/providers.llamacpp-vllm.yaml +47 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/pyproject.toml +2 -2
- coderouter_cli-2.10.0/tests/test_launcher_config_bench.py +160 -0
- coderouter_cli-2.10.0/tests/test_launcher_devices.py +538 -0
- coderouter_cli-2.10.0/tests/test_launcher_devices_detect.py +196 -0
- coderouter_cli-2.10.0/tests/test_launcher_devices_routes.py +633 -0
- coderouter_cli-2.10.0/tests/test_launcher_gui_devices.py +492 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_launcher_gui_readiness.py +9 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_role_normalization.py +50 -13
- coderouter_cli-2.10.0/tests/test_vscode_init.py +561 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/LICENSE +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/README.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/__main__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/adapters/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/adapters/anthropic_native.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/adapters/base.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/adapters/openai_compat.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/adapters/registry.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/cli_stats.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/config/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/config/capability_registry.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/config/env_file.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/config/loader.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/cost.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/data/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/data/model-capabilities.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/doctor.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/doctor_apply.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/env_security.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/errors.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/gguf_introspect.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/guards/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/guards/_fingerprint.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/guards/backend_health.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/guards/context_budget.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/guards/continuous_probe.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/guards/drift_actions.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/guards/drift_detection.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/guards/memory_budget.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/guards/memory_pressure.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/guards/self_healing.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/guards/tool_loop.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/hardware.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/ingress/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/ingress/anthropic_routes.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/ingress/app.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/ingress/dashboard_routes.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/ingress/metrics_routes.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/ingress/openai_routes.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/language_tax.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/launcher_speculative.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/launcher_swap.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/logging.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/metrics/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/metrics/collector.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/metrics/prometheus.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/output_filters.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/plugins/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/plugins/base.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/plugins/loader.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/plugins/registry.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/routing/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/routing/adaptive.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/routing/auto_router.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/routing/budget.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/routing/capability.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/routing/fallback.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/state/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/state/audit_log.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/state/replay.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/state/request_log.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/state/store.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/state/suggest_rules.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/token_estimation.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/token_estimation_accurate.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/translation/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/translation/convert.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/coderouter/translation/tool_repair.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/README.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/README.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/assets/dashboard-demo.png +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/backends/claude-code-llamacpp-vllm.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/backends/claude-code-llamacpp-vllm.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/backends/external-agents.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/backends/external-agents.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/backends/gguf_dl.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/backends/gguf_dl.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/backends/hf-ollama-models.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/backends/hf-ollama-models.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/backends/install-backends.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/backends/install-backends.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/backends/llamacpp-direct.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/backends/llamacpp-direct.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/backends/lmstudio-direct.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/backends/lmstudio-direct.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/backends/verify-ollama-0.23.1.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/concepts/architecture.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/concepts/architecture.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/concepts/context-budget.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/concepts/context-budget.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/concepts/continuous-probing.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/concepts/continuous-probing.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/concepts/drift-detection.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/concepts/drift-detection.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/concepts/partial-stitch.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/concepts/partial-stitch.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/designs/agent-cli-plugin-extraction.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/designs/external-agents-adapter.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/designs/launcher-model-swap.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/designs/orchestration-companion.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/designs/v1.5-dashboard-mockup.html +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/designs/v1.6-auto-router-verification.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/designs/v1.6-auto-router.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/guides/free-tier-guide.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/guides/free-tier-guide.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/guides/language-tax.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/guides/language-tax.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/guides/remote-access.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/guides/remote-access.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/guides/security.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/guides/security.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/guides/subagent-routing.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/guides/subagent-routing.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/guides/troubleshooting.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/guides/usage-guide.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/guides/usage-guide.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/low-memory-integration.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/low-memory-integration.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/openrouter-roster/README.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/retrospectives/v0.4.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/retrospectives/v0.5-verify.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/retrospectives/v0.5.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/retrospectives/v0.6.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/retrospectives/v0.7.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/retrospectives/v1.0-verify.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/retrospectives/v1.0.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/start/quickstart.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/start/quickstart.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/start/when-do-i-need-coderouter.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/docs/start/when-do-i-need-coderouter.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/examples/.env.example +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/examples/README.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/examples/providers-agent-cli.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/examples/providers-multiagent.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/examples/providers.context-budget-test.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/examples/providers.nvidia-nim.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/examples/providers.ollama-auto-custom.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/examples/providers.ollama-auto.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/examples/providers.ollama-free-chain.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/examples/providers.raspberrypi.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/examples/providers.swap.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/examples/providers.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/scripts/demo_traffic.sh +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/scripts/openrouter_roster_diff.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/scripts/smoke_v2_2.sh +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/scripts/verify-providers.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/scripts/verify_ollama_0_23.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/scripts/verify_v0_5.sh +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/scripts/verify_v1_0.sh +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/conftest.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_adapter_anthropic.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_agent_cli.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_audit_log.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_auto_router.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_auto_router_cjk.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_backend_health.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_budget.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_capability.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_capability_degraded_payload.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_capability_registry.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_capability_registry_cache_control.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_capability_tool_choice.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_claude_code_suitability.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_cli.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_cli_bind_warning.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_cli_stats.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_config.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_config_shim_actions.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_context_budget.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_continuous_probe.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_dashboard_endpoint.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_doctor.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_doctor_apply.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_doctor_cache_probe.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_drift_actions.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_drift_detection.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_drift_detection_integration.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_env_file.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_env_security.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_errors.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_examples_yaml.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fallback.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fallback_anthropic.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fallback_cache_control.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fallback_cache_observed.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fallback_cache_strip.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fallback_empty_response.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fallback_misconfig_warn.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fallback_paid_gate.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fallback_thinking.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fallback_tool_choice_emulate.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fix_h1_prometheus_drift.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fix_h2_h6_translation.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fix_h3_client_reuse.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fix_h4_h5_guards.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fix_h7_probe_restore.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fix_h8_launcher_auth.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fix_mA_routing.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fix_mB_adapters.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fix_mC_convert.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fix_mD_logging_metrics.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fix_mE_config_validation.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_fix_mF_ingress.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_gguf_introspect.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_guards_tool_loop.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_hardware.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_ingress_anthropic.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_ingress_count_tokens.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_ingress_profile.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_language_tax.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_language_tax_integration.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_launcher_mtp.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_launcher_mtp_fallback.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_launcher_provider_sync.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_launcher_readiness_restart.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_launcher_swap.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_launcher_swap_review.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_memory_budget.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_memory_pressure.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_metrics_cache.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_metrics_collector.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_metrics_cost.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_metrics_endpoint.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_metrics_jsonl.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_metrics_prometheus.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_metrics_prometheus_cache.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_models_passthrough.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_openai_compat.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_openrouter_roster_diff.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_output_filters.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_output_filters_adapters.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_partial_stitch.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_plugin_adapter.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_plugins_integration.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_plugins_loader.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_plugins_registry.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_reasoning_strip.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_repair_byte_fallback.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_request_log.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_routing_adaptive.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_self_healing.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_setup_sh.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_state_store.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_token_estimation.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_token_estimation_accurate.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_tokens_saved_metric.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_tool_repair.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_tool_repair_lenient.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_tool_repair_r4.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_toolrepair_bench.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_translation_anthropic.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.10.0}/tests/test_translation_reverse.py +0 -0
|
@@ -9,6 +9,193 @@ are kept verbatim where the Japanese text itself is the subject).
|
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
+
## [v2.10.0] — 2026-07-20 (VSCode workspace scaffolder)
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- **`coderouter vscode-init` — one-shot VSCode workspace scaffolder.**
|
|
17
|
+
Writes `.vscode/settings.json` with `terminal.integrated.env.osx` /
|
|
18
|
+
`.linux` / `.windows` populated so a Claude Code session launched
|
|
19
|
+
from VSCode's integrated terminal auto-points at CodeRouter with no
|
|
20
|
+
manual `ANTHROPIC_BASE_URL` juggling. Optionally emits a direnv
|
|
21
|
+
`.envrc` (`--with-envrc`). The command is **idempotent** (re-running
|
|
22
|
+
with the same arguments is a no-op) and **conflict-aware**: if an
|
|
23
|
+
existing `settings.json` has different values for one of our managed
|
|
24
|
+
keys, the file is left untouched and a unified diff is printed —
|
|
25
|
+
operators re-run with `--force` to overwrite. Unrelated top-level
|
|
26
|
+
keys (`editor.fontSize`, `python.testing.pytestEnabled`, etc.) and
|
|
27
|
+
unrelated env keys inside the terminal blocks (a user's `PATH`
|
|
28
|
+
tweak) are preserved verbatim on merge. All writes are atomic
|
|
29
|
+
(temp file + `os.replace`) so a partial write cannot corrupt an
|
|
30
|
+
existing `settings.json`. Non-Claude-Code extensions (Cline / Roo
|
|
31
|
+
Code / Kilo Code / Continue.dev) are handled by a cheat sheet
|
|
32
|
+
printed at end of run plus the fuller `docs/guides/vscode.md` —
|
|
33
|
+
`vscode-init` deliberately does NOT reach into those extensions'
|
|
34
|
+
own config schemas (each ships its own release cadence, so any
|
|
35
|
+
automation would need continuous maintenance to follow). The
|
|
36
|
+
Continue.dev cheat-sheet snippet is built via `json.dumps` rather
|
|
37
|
+
than hand-formatted concatenation, so it is guaranteed to be
|
|
38
|
+
syntactically valid JSON (an early hand-formatted version leaked
|
|
39
|
+
an extra `}` from mismatched f-string / plain-string brace
|
|
40
|
+
escaping; a test round-trips the snippet through `json.loads` to
|
|
41
|
+
pin the invariant). Options: `--target PATH` (default cwd),
|
|
42
|
+
`--port PORT` (default **8088**, matching every docs / quickstart
|
|
43
|
+
example — note that `coderouter serve` alone still defaults to
|
|
44
|
+
4000, so if you serve on 4000 pass `--port 4000` here too),
|
|
45
|
+
`--profile NAME` (adds `CODEROUTER_MODE=<profile>` to the terminal
|
|
46
|
+
env for header-less profile routing), `--with-envrc` (also emit
|
|
47
|
+
`.envrc`), `--dry-run` (compute diffs but write nothing —
|
|
48
|
+
byte-identical to the write path minus the final `os.replace`),
|
|
49
|
+
and `--force` (overwrite conflicting values). Exit codes: 0 clean,
|
|
50
|
+
2 conflicts (nothing was written for the conflicting file), 1
|
|
51
|
+
hard error (unparseable JSON, missing target directory, write
|
|
52
|
+
failure). Implementation lives in `coderouter/vscode_init.py`
|
|
53
|
+
(stdlib only — no new runtime deps, keeping the strict-5-package
|
|
54
|
+
rule in `pyproject.toml` intact); the CLI wrapper
|
|
55
|
+
(`_run_vscode_init` in `coderouter/cli.py`) mirrors the existing
|
|
56
|
+
`stats` / `audit` / `replay` "thin argparse plumbing + logic in a
|
|
57
|
+
sibling module" pattern. See `tests/test_vscode_init.py` (33 cases
|
|
58
|
+
across happy paths, merge preservation, conflict detection,
|
|
59
|
+
`--force`, `--dry-run` byte parity, `.envrc`, malformed inputs,
|
|
60
|
+
JSON validity of the Continue.dev snippet, and CLI wrapper
|
|
61
|
+
plumbing) and the new `docs/guides/vscode.md` for the full Cline /
|
|
62
|
+
Roo / Continue.dev cheat sheet.
|
|
63
|
+
|
|
64
|
+
### Documentation
|
|
65
|
+
|
|
66
|
+
- **Launcher port ↔ `providers.yaml` mismatch, three ways to prevent
|
|
67
|
+
it.** New section
|
|
68
|
+
["providers.yaml とのポート整合"](docs/backends/launcher.md#providersyaml-とのポート整合食い違いを構造的に防ぐ)
|
|
69
|
+
in the Launcher guide walks through the three coexisting patterns
|
|
70
|
+
— (A) hardcoded `providers.yaml` with matching Launcher port
|
|
71
|
+
(traditional), (B) v2.7.4 Launcher auto-sync
|
|
72
|
+
(`launcher-<backend>-<port>` provider names, no `providers.yaml`
|
|
73
|
+
edit needed), and (C) the recommended hybrid where
|
|
74
|
+
`option_profiles` pins the port so the Launcher UI and
|
|
75
|
+
`providers.yaml` cannot drift. Includes a copy-paste `cr-check`
|
|
76
|
+
shell function that runs `coderouter doctor --check-model <name>`
|
|
77
|
+
against every hand-declared provider before work begins so
|
|
78
|
+
operators catch a port mismatch in seconds rather than after a
|
|
79
|
+
session of quiet fallback churn. The symptom side (dashboard's
|
|
80
|
+
`unhealthy` badge + half-and-half `provider-failed` events in the
|
|
81
|
+
ring buffer while requests still succeed via fallback) is
|
|
82
|
+
documented as a new
|
|
83
|
+
[troubleshooting §1-7](docs/guides/troubleshooting.md#1-7-transport-error-all-connections-failed--ポート不一致の疑い)
|
|
84
|
+
entry, cross-linked back to the Launcher guide for the fix. Both
|
|
85
|
+
additions are Japanese-side only (English counterpart will follow
|
|
86
|
+
in a later docs-sync commit).
|
|
87
|
+
|
|
88
|
+
### Fixed
|
|
89
|
+
|
|
90
|
+
- **`ProviderConfig.timeout_s` upper bound raised from 600s (10 min) to
|
|
91
|
+
86400s (24h)** (#76, contributed by @firelzrd). The previous 10-minute
|
|
92
|
+
ceiling was too restrictive for long-running local model inference —
|
|
93
|
+
configurations that legitimately need multi-hour timeouts (heavy
|
|
94
|
+
reasoning models, large-context sweeps, batch operations) were being
|
|
95
|
+
rejected by the Pydantic `le=600` validator before the request could
|
|
96
|
+
even leave the router. The default (30s) and lower bound (1s) are
|
|
97
|
+
unchanged, so existing configs are unaffected; only users who were
|
|
98
|
+
hitting the ceiling gain the new headroom.
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## [v2.9.4] — 2026-07-19 (launcher device selection & bench sweep, cache-stable system prompt)
|
|
103
|
+
|
|
104
|
+
### Added
|
|
105
|
+
|
|
106
|
+
- **llama.cpp device selection (`--device` / `--tensor-split`) in the
|
|
107
|
+
Launcher.** Both the desktop GUI and the Web edition can now detect
|
|
108
|
+
available `llama-server` devices (via `--list-devices`), display their
|
|
109
|
+
VRAM, and let the operator pick which one(s) to offload to instead of
|
|
110
|
+
always relying on llama.cpp's own default placement. New shared module
|
|
111
|
+
`coderouter/launcher_devices.py` (dataclasses + pure functions only, no
|
|
112
|
+
pydantic, so the standalone GUI can import it without the `coderouter`
|
|
113
|
+
package) owns detection/caching (`detect_llama_devices`,
|
|
114
|
+
`parse_list_devices`, a 60s TTL cache keyed by binary path),
|
|
115
|
+
CLI-fragment building (`DeviceSelection.to_cli_args` — empty selection
|
|
116
|
+
emits nothing, preserving today's launch command byte-for-byte),
|
|
117
|
+
VRAM-ratio tensor-split suggestion (`suggest_tensor_split`), and backend
|
|
118
|
+
grouping (`backend_of` / `group_by_backend` / `selectable_devices`) so a
|
|
119
|
+
GPU listed twice under different backends (e.g. `CUDA0` and `Vulkan1`
|
|
120
|
+
for the same physical card) is never double-counted and cross-backend
|
|
121
|
+
configs are never auto-generated. Devices reporting `0 MiB` (e.g. macOS
|
|
122
|
+
`BLAS: Accelerate`) are still shown for information but excluded from
|
|
123
|
+
selection/suggestion. `StartRequest` gained `device_ids` / `tensor_split`
|
|
124
|
+
(both default empty — existing Web clients are unaffected), and
|
|
125
|
+
`GET /api/launcher/devices` (`?backend=`, `?refresh=1`) returns the
|
|
126
|
+
probe plus a per-backend `suggested_tensor_split` and `auto_configs`.
|
|
127
|
+
`launcher_gui.py`'s LAUNCH form gained a device checklist (🔍 Detect,
|
|
128
|
+
falling back to a manual comma-separated entry on detection failure)
|
|
129
|
+
and a tensor-split field that auto-hides when one or fewer devices are
|
|
130
|
+
detected. See `tests/test_launcher_devices.py`,
|
|
131
|
+
`tests/test_launcher_devices_detect.py`,
|
|
132
|
+
`tests/test_launcher_devices_routes.py`,
|
|
133
|
+
`tests/test_launcher_gui_devices.py`, and the new "Device selection"
|
|
134
|
+
section in `docs/backends/launcher.md` / `launcher.en.md`.
|
|
135
|
+
- **Bench sweep: automated device-configuration benchmarking against an
|
|
136
|
+
external `llmbench`.** Both Launcher editions can now drive a list of
|
|
137
|
+
device configurations (e.g. `CUDA0` alone / `CUDA1` alone / a
|
|
138
|
+
multi-GPU split) through start → wait for readiness → run an external
|
|
139
|
+
bench command → stop → advance to the next configuration, then compare
|
|
140
|
+
the results. `coderouter/launcher_devices.py` supplies the shared
|
|
141
|
+
`SweepPlan` / `SweepStep` / `SweepState` state machine,
|
|
142
|
+
`build_auto_sweep_configs` (one config per selectable device plus one
|
|
143
|
+
per multi-device backend group), `render_bench_command` (template
|
|
144
|
+
placeholders `{port}` `{config}` `{base_url}` `{results_dir}` `{runs}`,
|
|
145
|
+
expanded via plain string substitution rather than `str.format` so JSON
|
|
146
|
+
braces in the command aren't misinterpreted, then `shlex`-split with
|
|
147
|
+
`posix=False` on Windows to keep backslash paths intact), and
|
|
148
|
+
`load_latest_results` / `summarize_results` (best-effort, alias-tolerant
|
|
149
|
+
extraction of `tokens_per_sec` / `ttft_ms` / `latency_ms` from the
|
|
150
|
+
newest `llmbench` results JSON). New `LauncherBenchConfig`
|
|
151
|
+
(`command_template` / `runs` / `results_dir` / `readiness_timeout_s`,
|
|
152
|
+
read from an optional `launcher.bench:` block — omitted entirely by
|
|
153
|
+
default, so existing `providers.yaml` files are unaffected) supplies
|
|
154
|
+
the sweep's defaults. The Web edition gained
|
|
155
|
+
`POST /api/launcher/sweep/start` (token-gated; 409 if a sweep is
|
|
156
|
+
already running, 400 for empty `configs` or a busy/unavailable port),
|
|
157
|
+
`GET /api/launcher/sweep/status`, `POST /api/launcher/sweep/abort`
|
|
158
|
+
(token-gated), and `GET /api/launcher/sweep/logs`, backed by a new
|
|
159
|
+
`_SweepRunner` that reuses the existing `spawn_process` /
|
|
160
|
+
`stop_process` / `proc.ready` readiness primitives. `launcher_gui.py`
|
|
161
|
+
gained a "📊 Bench sweep" button opening a separate `SweepWindow` with
|
|
162
|
+
its own `_SweepWorker` thread, reusing `poll_until_ready` for readiness
|
|
163
|
+
and driving the same external bench subprocess model. See
|
|
164
|
+
`tests/test_launcher_config_bench.py` and the new "Bench sweep" section
|
|
165
|
+
in `docs/backends/launcher.md` / `launcher.en.md`.
|
|
166
|
+
|
|
167
|
+
### Fixed
|
|
168
|
+
|
|
169
|
+
- **Mid-conversation `role:"system"` messages are no longer hoisted into
|
|
170
|
+
the top-level `system` field.** (#75, contributed by @firelzrd.)
|
|
171
|
+
Claude Code CLI ≥ 2.1.154 emits volatile system reminders as
|
|
172
|
+
`role:"system"` messages *inside* `messages[]`; hoisting them meant the
|
|
173
|
+
serialized prompt's head changed every turn, so llama.cpp / LM Studio
|
|
174
|
+
style prefix-matching KV caches were invalidated wholesale (a captured
|
|
175
|
+
real session measured only 11.8 % reusable prefix between consecutive
|
|
176
|
+
requests). `normalize_message_roles()` now splits by position: leading
|
|
177
|
+
system messages (before any emitted turn) are hoisted as before — the
|
|
178
|
+
legitimate OpenAI-style system prompt — while mid-conversation ones are
|
|
179
|
+
coerced to `user` in place, keeping `messages` append-only and the
|
|
180
|
+
prompt head stable as the conversation grows. See
|
|
181
|
+
`tests/test_role_normalization.py`
|
|
182
|
+
(`test_leading_system_is_hoisted_but_mid_conversation_is_not`,
|
|
183
|
+
`test_system_prompt_is_stable_as_conversation_grows`).
|
|
184
|
+
|
|
185
|
+
### Security
|
|
186
|
+
|
|
187
|
+
- **Dependency bumps for two fresh advisories** (lockfile-only; both
|
|
188
|
+
verified with a clean `uv sync --frozen` + full test suite, 1905
|
|
189
|
+
passed): `click` 8.3.2 → 8.4.2 (PYSEC-2026-2132, fix ≥ 8.3.3;
|
|
190
|
+
transitive via uvicorn) and `json-repair` 0.59.10 → 0.61.5
|
|
191
|
+
(GHSA-xf7x-x43h-rpqh, CVSS 7.5, fix ≥ 0.60.1). The `json-repair`
|
|
192
|
+
floor in `pyproject.toml` was raised from `>=0.30` to `>=0.60.1` so
|
|
193
|
+
fresh installs can never resolve a vulnerable version; `uv.lock` also
|
|
194
|
+
records the new lockfile revision 3 format (upload-time metadata)
|
|
195
|
+
emitted by current uv.
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
12
199
|
## [v2.9.3] — 2026-07-12 (GUI/Web parity, swap polish, launcher UI fixes)
|
|
13
200
|
|
|
14
201
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: coderouter-cli
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.10.0
|
|
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
|
|
@@ -40,7 +40,7 @@ Requires-Dist: types-pyyaml>=6.0.12; extra == 'dev'
|
|
|
40
40
|
Provides-Extra: doctor
|
|
41
41
|
Requires-Dist: ruamel-yaml>=0.18.6; extra == 'doctor'
|
|
42
42
|
Provides-Extra: repair
|
|
43
|
-
Requires-Dist: json-repair>=0.
|
|
43
|
+
Requires-Dist: json-repair>=0.60.1; extra == 'repair'
|
|
44
44
|
Description-Content-Type: text/markdown
|
|
45
45
|
|
|
46
46
|
<h1 align="center">CodeRouter</h1>
|
|
@@ -132,6 +132,8 @@ ANTHROPIC_BASE_URL=http://localhost:8088 ANTHROPIC_AUTH_TOKEN=dummy claude
|
|
|
132
132
|
|
|
133
133
|
これだけ。Claude Code はいつも通り動きますが、裏ではローカルの Ollama が答えています。
|
|
134
134
|
|
|
135
|
+
**VSCode の統合ターミナルから使う場合** は、環境変数の書き忘れを避けるため `coderouter vscode-init` が便利です。プロジェクトルートで 1 回叩くと `.vscode/settings.json` に `terminal.integrated.env.*` をマージ書き込みするので、以後 VSCode のターミナルで `claude` と打つだけで通ります。Cline / Roo Code / Continue.dev の設定コピペも含めて → [VSCode 連携ガイド](./docs/guides/vscode.md)
|
|
136
|
+
|
|
135
137
|
---
|
|
136
138
|
|
|
137
139
|
## 自分に必要?
|
|
@@ -281,6 +283,7 @@ providers:
|
|
|
281
283
|
| 無料で回す | [無料枠ガイド](./docs/guides/free-tier-guide.md) |
|
|
282
284
|
| llama.cpp / vllm を GUI で起動 | [Launcher ガイド](./docs/backends/launcher.md) |
|
|
283
285
|
| 言語税を計測・回避する | [言語税ガイド](./docs/guides/language-tax.md) |
|
|
286
|
+
| VSCode / Cline / Continue から使う | [VSCode 連携ガイド](./docs/guides/vscode.md) |
|
|
284
287
|
| 別の PC から安全に繋ぐ | [リモートアクセスガイド](./docs/guides/remote-access.md) |
|
|
285
288
|
| 詰まった | [トラブルシューティング](./docs/guides/troubleshooting.md) |
|
|
286
289
|
| 設計を知りたい | [アーキテクチャ詳細](./docs/concepts/architecture.md) |
|
|
@@ -87,6 +87,8 @@ ANTHROPIC_BASE_URL=http://localhost:8088 ANTHROPIC_AUTH_TOKEN=dummy claude
|
|
|
87
87
|
|
|
88
88
|
これだけ。Claude Code はいつも通り動きますが、裏ではローカルの Ollama が答えています。
|
|
89
89
|
|
|
90
|
+
**VSCode の統合ターミナルから使う場合** は、環境変数の書き忘れを避けるため `coderouter vscode-init` が便利です。プロジェクトルートで 1 回叩くと `.vscode/settings.json` に `terminal.integrated.env.*` をマージ書き込みするので、以後 VSCode のターミナルで `claude` と打つだけで通ります。Cline / Roo Code / Continue.dev の設定コピペも含めて → [VSCode 連携ガイド](./docs/guides/vscode.md)
|
|
91
|
+
|
|
90
92
|
---
|
|
91
93
|
|
|
92
94
|
## 自分に必要?
|
|
@@ -236,6 +238,7 @@ providers:
|
|
|
236
238
|
| 無料で回す | [無料枠ガイド](./docs/guides/free-tier-guide.md) |
|
|
237
239
|
| llama.cpp / vllm を GUI で起動 | [Launcher ガイド](./docs/backends/launcher.md) |
|
|
238
240
|
| 言語税を計測・回避する | [言語税ガイド](./docs/guides/language-tax.md) |
|
|
241
|
+
| VSCode / Cline / Continue から使う | [VSCode 連携ガイド](./docs/guides/vscode.md) |
|
|
239
242
|
| 別の PC から安全に繋ぐ | [リモートアクセスガイド](./docs/guides/remote-access.md) |
|
|
240
243
|
| 詰まった | [トラブルシューティング](./docs/guides/troubleshooting.md) |
|
|
241
244
|
| 設計を知りたい | [アーキテクチャ詳細](./docs/concepts/architecture.md) |
|
|
@@ -336,6 +336,78 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
336
336
|
),
|
|
337
337
|
)
|
|
338
338
|
|
|
339
|
+
# v2.10-A: `coderouter vscode-init` — scaffold a VSCode workspace so
|
|
340
|
+
# Claude Code launched from the integrated terminal auto-points at
|
|
341
|
+
# CodeRouter (no manual env-var juggling). Optionally writes .envrc
|
|
342
|
+
# for direnv users. Cline / Roo / Continue are covered by the cheat
|
|
343
|
+
# sheet printed on completion and docs/guides/vscode.md — this
|
|
344
|
+
# command deliberately does NOT touch those extensions' settings
|
|
345
|
+
# (their schemas change with their own release cadence).
|
|
346
|
+
vscode_init = sub.add_parser(
|
|
347
|
+
"vscode-init",
|
|
348
|
+
help="Scaffold VSCode workspace settings for CodeRouter (v2.10-A).",
|
|
349
|
+
description=(
|
|
350
|
+
"Write .vscode/settings.json (terminal.integrated.env.*) so a "
|
|
351
|
+
"Claude Code session launched from VSCode's integrated terminal "
|
|
352
|
+
"auto-points at CodeRouter. Optionally emit a direnv .envrc. "
|
|
353
|
+
"Idempotent: safe to re-run. Conflict-aware: refuses to overwrite "
|
|
354
|
+
"differing existing values without --force."
|
|
355
|
+
),
|
|
356
|
+
)
|
|
357
|
+
vscode_init.add_argument(
|
|
358
|
+
"--target",
|
|
359
|
+
default=".",
|
|
360
|
+
metavar="PATH",
|
|
361
|
+
help="Workspace root (default: current directory).",
|
|
362
|
+
)
|
|
363
|
+
vscode_init.add_argument(
|
|
364
|
+
"--port",
|
|
365
|
+
type=int,
|
|
366
|
+
default=None,
|
|
367
|
+
metavar="PORT",
|
|
368
|
+
help=(
|
|
369
|
+
"CodeRouter port for ANTHROPIC_BASE_URL. Defaults to 8088 "
|
|
370
|
+
"(matches every docs / quickstart example). Note that "
|
|
371
|
+
"`coderouter serve` alone defaults to 4000; if you serve on "
|
|
372
|
+
"4000, pass --port 4000 here too."
|
|
373
|
+
),
|
|
374
|
+
)
|
|
375
|
+
vscode_init.add_argument(
|
|
376
|
+
"--profile",
|
|
377
|
+
default=None,
|
|
378
|
+
metavar="NAME",
|
|
379
|
+
help=(
|
|
380
|
+
"Preload CODEROUTER_MODE=<profile> so the VSCode terminal "
|
|
381
|
+
"routes to a non-default profile without a per-request header."
|
|
382
|
+
),
|
|
383
|
+
)
|
|
384
|
+
vscode_init.add_argument(
|
|
385
|
+
"--with-envrc",
|
|
386
|
+
action="store_true",
|
|
387
|
+
help=(
|
|
388
|
+
"Also write .envrc (direnv). Run `direnv allow` once after "
|
|
389
|
+
"generation. Tip: keep secrets in a separate .envrc.local."
|
|
390
|
+
),
|
|
391
|
+
)
|
|
392
|
+
vscode_init.add_argument(
|
|
393
|
+
"--dry-run",
|
|
394
|
+
action="store_true",
|
|
395
|
+
help=(
|
|
396
|
+
"Compute all changes and print unified diffs, but do not write "
|
|
397
|
+
"any files. Byte-identical to the write path minus the final "
|
|
398
|
+
"os.replace."
|
|
399
|
+
),
|
|
400
|
+
)
|
|
401
|
+
vscode_init.add_argument(
|
|
402
|
+
"--force",
|
|
403
|
+
action="store_true",
|
|
404
|
+
help=(
|
|
405
|
+
"Overwrite existing conflicting values. Without this flag, a "
|
|
406
|
+
"conflict is reported with a diff and the file is left "
|
|
407
|
+
"untouched (exit 2)."
|
|
408
|
+
),
|
|
409
|
+
)
|
|
410
|
+
|
|
339
411
|
return parser
|
|
340
412
|
|
|
341
413
|
|
|
@@ -432,6 +504,9 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
432
504
|
if args.command == "replay":
|
|
433
505
|
return _run_replay(args)
|
|
434
506
|
|
|
507
|
+
if args.command == "vscode-init":
|
|
508
|
+
return _run_vscode_init(args)
|
|
509
|
+
|
|
435
510
|
print(f"unknown command: {args.command}", file=sys.stderr)
|
|
436
511
|
return 2
|
|
437
512
|
|
|
@@ -765,6 +840,56 @@ def _run_replay(args: argparse.Namespace) -> int:
|
|
|
765
840
|
return 0
|
|
766
841
|
|
|
767
842
|
|
|
843
|
+
def _run_vscode_init(args: argparse.Namespace) -> int:
|
|
844
|
+
"""v2.10-A: drive :func:`coderouter.vscode_init.run_vscode_init`.
|
|
845
|
+
|
|
846
|
+
Kept small and testable — the actual scaffolding logic lives in
|
|
847
|
+
:mod:`coderouter.vscode_init` so tests can exercise it without
|
|
848
|
+
argparse in the way. This wrapper's job is:
|
|
849
|
+
|
|
850
|
+
* resolve the ``--target`` argument to a real directory
|
|
851
|
+
* map ``--port`` (default None) to the module's ``DEFAULT_PORT``
|
|
852
|
+
* translate exceptions (missing target directory) to a friendly
|
|
853
|
+
stderr message + exit 1
|
|
854
|
+
* print the formatted result and propagate the module's exit code
|
|
855
|
+
"""
|
|
856
|
+
from coderouter.vscode_init import (
|
|
857
|
+
DEFAULT_PORT,
|
|
858
|
+
exit_code_for,
|
|
859
|
+
format_result,
|
|
860
|
+
run_vscode_init,
|
|
861
|
+
)
|
|
862
|
+
|
|
863
|
+
target = Path(args.target).expanduser()
|
|
864
|
+
if not target.is_dir():
|
|
865
|
+
print(
|
|
866
|
+
f"vscode-init: target directory does not exist: {target}",
|
|
867
|
+
file=sys.stderr,
|
|
868
|
+
)
|
|
869
|
+
return 1
|
|
870
|
+
|
|
871
|
+
port = args.port if args.port is not None else DEFAULT_PORT
|
|
872
|
+
|
|
873
|
+
try:
|
|
874
|
+
result = run_vscode_init(
|
|
875
|
+
target,
|
|
876
|
+
port=port,
|
|
877
|
+
profile=args.profile,
|
|
878
|
+
with_envrc=args.with_envrc,
|
|
879
|
+
dry_run=args.dry_run,
|
|
880
|
+
force=args.force,
|
|
881
|
+
)
|
|
882
|
+
except FileNotFoundError as exc:
|
|
883
|
+
# Raised only when target vanishes between the pre-check above
|
|
884
|
+
# and the module's own check — unlikely in practice, but map
|
|
885
|
+
# it to the same shape as the pre-check for consistency.
|
|
886
|
+
print(f"vscode-init: {exc}", file=sys.stderr)
|
|
887
|
+
return 1
|
|
888
|
+
|
|
889
|
+
print(format_result(result, dry_run=args.dry_run, port=port))
|
|
890
|
+
return exit_code_for(result)
|
|
891
|
+
|
|
892
|
+
|
|
768
893
|
def _run_check_env(arg_value: str) -> int:
|
|
769
894
|
"""v1.6.3: filesystem / git security checks for `.env`.
|
|
770
895
|
|
|
@@ -394,7 +394,7 @@ class ProviderConfig(BaseModel):
|
|
|
394
394
|
default=False,
|
|
395
395
|
description="If true, only used when ALLOW_PAID=true (plan.md §2.3).",
|
|
396
396
|
)
|
|
397
|
-
timeout_s: float = Field(default=30.0, ge=1.0, le=
|
|
397
|
+
timeout_s: float = Field(default=30.0, ge=1.0, le=86400.0)
|
|
398
398
|
|
|
399
399
|
# v2.6 language-tax track: path to a LOCAL ``tokenizer.json`` for this
|
|
400
400
|
# provider's model, used to measure the CJK over-count vs the char/4
|
|
@@ -1460,6 +1460,49 @@ class LauncherOptionProfile(BaseModel):
|
|
|
1460
1460
|
)
|
|
1461
1461
|
|
|
1462
1462
|
|
|
1463
|
+
class LauncherBenchConfig(BaseModel):
|
|
1464
|
+
"""The ``launcher.bench:`` block — defaults for the bench sweep feature.
|
|
1465
|
+
|
|
1466
|
+
設計 §4.1。デバイス構成スイープ(起動→readiness→外部ベンチ→停止→次)の
|
|
1467
|
+
既定値を providers.yaml から供給する。未設定(``LauncherConfig.bench`` が
|
|
1468
|
+
None)ならスイープ UI はハードコード既定を使う(完全後方互換)。すべての
|
|
1469
|
+
フィールドに ``default`` があるので、既存 YAML は無改変で通過する。
|
|
1470
|
+
"""
|
|
1471
|
+
|
|
1472
|
+
model_config = ConfigDict(extra="forbid")
|
|
1473
|
+
|
|
1474
|
+
command_template: str = Field(
|
|
1475
|
+
default="llmbench run --model local-openai --runs {runs}",
|
|
1476
|
+
description=(
|
|
1477
|
+
"外部ベンチコマンドのテンプレ。``{port}`` ``{config}`` "
|
|
1478
|
+
"``{base_url}`` ``{results_dir}`` ``{runs}`` を単純置換で展開して "
|
|
1479
|
+
"argv 化する(``str.format`` ではないので JSON 波括弧で誤爆しない)。"
|
|
1480
|
+
),
|
|
1481
|
+
)
|
|
1482
|
+
runs: int = Field(
|
|
1483
|
+
default=5,
|
|
1484
|
+
ge=1,
|
|
1485
|
+
le=1000,
|
|
1486
|
+
description="1 構成あたりのベンチ実行回数。``{runs}`` に展開される。",
|
|
1487
|
+
)
|
|
1488
|
+
results_dir: str | None = Field(
|
|
1489
|
+
default=None,
|
|
1490
|
+
description=(
|
|
1491
|
+
"llmbench の results/ ディレクトリ。相対はサーバ CWD 基準。"
|
|
1492
|
+
"設定時のみスイープ結果 JSON を読み比較サマリを付与する。"
|
|
1493
|
+
),
|
|
1494
|
+
)
|
|
1495
|
+
readiness_timeout_s: float = Field(
|
|
1496
|
+
default=300.0,
|
|
1497
|
+
ge=5.0,
|
|
1498
|
+
le=3600.0,
|
|
1499
|
+
description=(
|
|
1500
|
+
"スイープの各構成でサーバが ready になるのを待つ最大秒数。"
|
|
1501
|
+
"大きな GGUF ロードを考慮した既定 5 分。"
|
|
1502
|
+
),
|
|
1503
|
+
)
|
|
1504
|
+
|
|
1505
|
+
|
|
1463
1506
|
class SwapModelSpec(BaseModel):
|
|
1464
1507
|
"""One entry in ``launcher.swap.models`` (docs/designs/launcher-model-swap.md).
|
|
1465
1508
|
|
|
@@ -1863,6 +1906,13 @@ class LauncherConfig(BaseModel):
|
|
|
1863
1906
|
"behavior."
|
|
1864
1907
|
),
|
|
1865
1908
|
)
|
|
1909
|
+
bench: LauncherBenchConfig | None = Field(
|
|
1910
|
+
default=None,
|
|
1911
|
+
description=(
|
|
1912
|
+
"デバイス構成ベンチスイープ(設計 §4)の既定値。None(既定)なら "
|
|
1913
|
+
"スイープ UI はハードコード既定を使う=完全後方互換。"
|
|
1914
|
+
),
|
|
1915
|
+
)
|
|
1866
1916
|
|
|
1867
1917
|
@model_validator(mode="after")
|
|
1868
1918
|
def _check_auto_restart_backoff_ordered(self) -> LauncherConfig:
|