Skip to content

Commit 622cdc0

Browse files
committed
test: stop two suites from sharing one fixture home
The full suite failed a different number of tests on each run of an identical tree — 9 one run, 2 the next — with server-auth's pool-retry cases the most frequent victims. Pushing was the real casualty: prepush runs the whole suite, so a random subset of pushes was rejected. server-auth.test.ts and management-provider-validation.test.ts both declared TEST_DIR as join(import.meta.dir, .tmp-server-auth-test) — the same literal — and both delete and recreate it while pointing OPENCODEX_HOME there. The 665b65643 split copied the path when it moved those cases into their own file. bun test v1.3.14 (0d9b296a) 🚀 opencodex proxy running on http://localhost:64074 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64078 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64083 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64085 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64139 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64142 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64188 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64192 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64196 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64200 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64204 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64208 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard [opencodex] OAuth refresh started provider=kimi account=account-…5fda [opencodex] OAuth refresh joined existing operation provider=kimi account=account-…5fda [opencodex] OAuth refresh joined existing operation provider=kimi account=account-…5fda [opencodex] OAuth refresh joined existing operation provider=kimi account=account-…5fda [opencodex] OAuth refresh joined existing operation provider=kimi account=account-…5fda [opencodex] OAuth refresh joined existing operation provider=kimi account=account-…5fda [opencodex] OAuth refresh joined existing operation provider=kimi account=account-…5fda [opencodex] OAuth refresh joined existing operation provider=kimi account=account-…5fda [opencodex] OAuth refresh joined existing operation provider=kimi account=account-…5fda [opencodex] OAuth refresh joined existing operation provider=kimi account=account-…5fda [opencodex] OAuth credentials rotated and persisted provider=kimi account=account-…5fda [opencodex] OAuth refresh started provider=kimi account=account-…5fda [opencodex] OAuth refresh started provider=kimi account=account-…5fda [opencodex] OAuth credentials rotated and persisted provider=kimi account=account-…5fda [opencodex] OAuth refresh started provider=kimi account=account-…5fda [opencodex] OAuth refresh started provider=kimi account=account-…5fda [opencodex] OAuth refresh started provider=kimi account=account-…5fda [opencodex] OAuth refresh started provider=kimi account=account-…5fda [opencodex] OAuth refresh started provider=kimi account=account-…5fda [opencodex] OAuth refresh joined existing operation provider=kimi account=account-…5fda 🚀 opencodex proxy running on http://localhost:64289 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64293 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard [storage-policy] skip under_threshold [storage-policy] ok mode=quarantine removed=1 freedBytes=100 [storage-policy] ok mode=permanent removed=1 freedBytes=100 [storage-policy] defer codex_busy [storage-policy] ok mode=quarantine removed=1 freedBytes=100 [storage-policy] ok mode=quarantine removed=2 freedBytes=200 [storage-policy] ok mode=quarantine removed=1 freedBytes=100 🚀 opencodex proxy running on http://localhost:64348 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64350 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64352 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64356 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64358 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64360 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64362 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64364 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64366 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64367 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64369 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64371 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64373 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64375 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64377 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64383 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64440 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64443 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64445 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64448 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64450 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64452 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64454 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard [opencodex] OAuth refresh started provider=kimi account=account-…7da3 [opencodex] OAuth credentials rotated and persisted provider=kimi account=account-…7da3 [opencodex] OAuth refresh started provider=kimi account=account-…7da3 🚀 opencodex proxy running on http://localhost:64527 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64529 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64531 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64533 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64535 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64537 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64539 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64541 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64546 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64548 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64614 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64616 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64618 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64620 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64628 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64630 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64632 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64641 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64646 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64655 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64659 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64661 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64664 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64669 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64674 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64678 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64680 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64683 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64763 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64774 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard [opencodex] combo default effort omitted { provider: "a", model: "m1", requestedEffort: "high", capability: "unsupported", } [opencodex] combo default effort omitted { provider: "b", model: "m2", requestedEffort: "high", capability: "unsupported", } 🚀 opencodex proxy running on http://localhost:64914 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64916 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard [opencodex] OAuth refresh started provider=kiro account=account-…1fb5 [opencodex] OAuth credentials rotated and persisted provider=kiro account=account-…1fb5 🚀 opencodex proxy running on http://localhost:64918 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64920 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard [opencodex] OAuth refresh started provider=kiro account=account-…1fb5 [opencodex] OAuth credentials rotated and persisted provider=kiro account=account-…1fb5 🚀 opencodex proxy running on http://localhost:64922 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard [opencodex] OAuth refresh started provider=kiro account=account-…1fb5 [opencodex] OAuth credentials rotated and persisted provider=kiro account=account-…1fb5 [opencodex] multi-agent guidance excluded: hidden-model:picker_hidden, v1-model:surface_incompatible, missing-model:missing_catalog_entry, displaced-model:outside_display_limit 🚀 opencodex proxy running on http://localhost:64927 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64932 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64938 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64993 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64996 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:64998 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65000 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65002 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65004 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65019 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65021 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65023 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65025 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65027 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65029 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65031 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65033 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65035 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65038 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65042 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65045 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65048 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65053 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65059 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65062 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65065 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65068 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65071 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65073 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65076 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65079 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65082 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65084 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65087 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65093 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65099 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65105 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65110 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65115 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65120 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65125 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65130 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65135 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65140 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65145 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65150 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65155 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65160 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65165 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65231 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65236 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65241 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65246 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65251 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65256 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65261 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65266 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65271 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65276 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65281 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65286 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65291 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65296 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65301 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65306 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65311 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65316 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65321 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65326 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65331 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65333 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65337 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65341 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65346 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65350 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65353 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65358 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65363 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65368 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65373 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65378 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65383 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65389 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65395 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65401 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65403 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65405 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65408 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65413 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65418 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65423 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65427 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65429 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65431 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65433 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65435 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65437 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65439 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65441 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65443 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65445 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65447 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65449 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65479 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65481 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65483 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65485 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:65487 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard mock/test-model 모델을 haiku 그룹으로 옮겼습니다. [opencodex] OAuth refresh started provider=kiro account=account-…fce5 [opencodex] OAuth refresh joined existing operation provider=kiro account=account-…fce5 [opencodex] OAuth credentials rotated and persisted provider=kiro account=account-…fce5 [opencodex] OAuth refresh started provider=kiro account=account-…fce5 [opencodex] OAuth credentials rotated and persisted provider=kiro account=account-…fce5 [opencodex] OAuth refresh started provider=kiro account=account-…84db [opencodex] OAuth credentials rotated and persisted provider=kiro account=account-…84db [opencodex] OAuth refresh started provider=kiro account=account-…fce5 [opencodex] OAuth refresh started provider=kiro account=account-…2d3c [opencodex] OAuth refresh started provider=kiro account=account-…653b [opencodex] OAuth refresh started provider=kiro account=account-…e03b [opencodex] OAuth credentials rotated and persisted provider=kiro account=account-…e03b [opencodex] OAuth refresh started provider=kiro account=account-…fce5 [opencodex] OAuth credentials rotated and persisted provider=kiro account=account-…fce5 [opencodex] OAuth refresh joined existing operation provider=xai account=account-…89e4 🚀 opencodex proxy running on http://localhost:49234 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49236 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49297 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49302 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49304 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49306 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49308 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49310 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49312 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49317 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49319 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49322 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49325 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49327 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49329 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49331 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49333 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49335 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49337 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49389 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49391 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49393 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49395 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49397 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49399 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard [opencodex] OAuth refresh started provider=kimi account=account-…49e4 [opencodex] OAuth credentials rotated and persisted provider=kimi account=account-…49e4 🚀 opencodex proxy running on http://localhost:49406 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49408 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49410 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49412 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49414 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49416 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49418 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard 🚀 opencodex proxy running on http://localhost:49420 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management API GET / → GUI dashboard [opencodex] gpt-5.4: multi-agent guidance injected (surface=collab, 128 chars) [opencodex] gpt-5.4: effort cap applied (ultra -> high, main turn) 🚀 opencodex proxy running on http://localhost:49422 POST /v1/responses → provider translation POST /v1/chat/completions → OpenAI-compatible clients GET /healthz → health check GET /api/* → management A…
1 parent 616ea99 commit 622cdc0

3 files changed

Lines changed: 99 additions & 4 deletions

File tree

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import { describe, expect, test } from "bun:test";
2+
import { readdirSync, readFileSync } from "node:fs";
3+
import { join } from "node:path";
4+
5+
/**
6+
* A fixed fixture directory shared by two test files is a silent flake factory.
7+
*
8+
* `bun test --isolate` gives each file its own module registry, but every file shares one
9+
* process and one filesystem. Two files that delete and recreate the same path while
10+
* pointing OPENCODEX_HOME at it will destroy each other's config and credentials whenever
11+
* the suite happens to overlap them. The failure surfaces as an unrelated assertion (a 401
12+
* where a 400 was expected) in whichever file lost the race, and the failure count changes
13+
* from run to run.
14+
*
15+
* That is exactly how `.tmp-server-auth-test` came to be declared by both
16+
* server-auth.test.ts and management-provider-validation.test.ts: the 665b65643 split copied
17+
* the path literal without renaming it. Reviewers do not reliably catch a duplicated string
18+
* across two large files, so assert it here instead.
19+
*/
20+
const TESTS_DIR = import.meta.dir;
21+
22+
/** `join(import.meta.dir, ".tmp-foo")` and the template-literal spelling of the same thing. */
23+
const FIXTURE_LITERAL = /import\.meta\.dir\s*,\s*(["'`])(\.tmp-[^"'`]*)\1/g;
24+
25+
/** This guard quotes the offending literal in its own prose, so it must skip itself. */
26+
const SELF = "fixture-dir-uniqueness.test.ts";
27+
28+
function testFiles(): string[] {
29+
return readdirSync(TESTS_DIR)
30+
.filter(name => name.endsWith(".test.ts") && name !== SELF)
31+
.sort();
32+
}
33+
34+
/**
35+
* Strip comments before scanning. The fix for the original flake left an explanatory comment
36+
* naming the old path in both files, and a naive scan reads that as a live declaration — the
37+
* first version of this guard failed exactly that way.
38+
*/
39+
function withoutComments(source: string): string {
40+
return source
41+
.replace(/\/\*[\s\S]*?\*\//g, "")
42+
.replace(/(^|[^:])\/\/.*$/gm, "$1");
43+
}
44+
45+
describe("test fixture directories", () => {
46+
test("no static fixture directory is shared by two test files", () => {
47+
const owners = new Map<string, string[]>();
48+
49+
for (const file of testFiles()) {
50+
const source = withoutComments(readFileSync(join(TESTS_DIR, file), "utf8"));
51+
for (const match of source.matchAll(FIXTURE_LITERAL)) {
52+
const literal = match[2]!;
53+
// Paths carrying a runtime value (`${process.pid}`, a counter, mkdtemp output) are
54+
// already per-run and cannot collide, so they are not the hazard this guards.
55+
if (literal.includes("${")) continue;
56+
const list = owners.get(literal) ?? [];
57+
if (!list.includes(file)) list.push(file);
58+
owners.set(literal, list);
59+
}
60+
}
61+
62+
// Name the offenders rather than just failing a count: the fix is to give one of them its
63+
// own directory, and the message should say which files to look at.
64+
const shared = [...owners.entries()]
65+
.filter(([, files]) => files.length > 1)
66+
.map(([literal, files]) => `${literal} <- ${files.join(", ")}`);
67+
68+
expect(shared).toEqual([]);
69+
});
70+
71+
test("the two files behind the original flake no longer use a fixed path", () => {
72+
// Regression pin for the specific pair. Both now derive a per-run directory, which also
73+
// makes two concurrent runs of the SAME file safe — something a rename alone would miss.
74+
for (const file of ["server-auth.test.ts", "management-provider-validation.test.ts"]) {
75+
const source = withoutComments(readFileSync(join(TESTS_DIR, file), "utf8"));
76+
expect(source).not.toContain('join(import.meta.dir, ".tmp-server-auth-test")');
77+
expect(source).toContain("mkdtempSync(join(tmpdir()");
78+
}
79+
});
80+
});

tests/management-provider-validation.test.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { afterEach, beforeEach, describe, expect, setDefaultTimeout, spyOn, test } from "bun:test";
22
import { managementFetch as fetch, ManagementRequest as Request } from "./helpers/management-auth";
3-
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
3+
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
4+
import { tmpdir } from "node:os";
45
import { join } from "node:path";
56
import { saveCodexAccountCredential } from "../src/codex/account-store";
67
import { getTrackedCodexWebSocketCountForAccount } from "../src/codex/websocket-registry";
@@ -41,7 +42,11 @@ setDefaultTimeout(60_000);
4142
const previousApiToken = process.env.OPENCODEX_API_AUTH_TOKEN;
4243
const previousOpencodexHome = process.env.OPENCODEX_HOME;
4344
const originalGlobalFetch = globalThis.fetch;
44-
const TEST_DIR = join(import.meta.dir, ".tmp-server-auth-test");
45+
// A per-run directory, not a fixed path. The 665b65643 split copied server-auth.test.ts's
46+
// ".tmp-server-auth-test" literal verbatim, so both files deleted and recreated the same
47+
// directory while pointing OPENCODEX_HOME at it. See the comment in server-auth.test.ts for
48+
// the full failure mode; mkdtempSync also covers two concurrent runs of this file alone.
49+
const TEST_DIR = mkdtempSync(join(tmpdir(), "ocx-management-provider-validation-"));
4550
let isolatedCodexHome: IsolatedCodexHome | null = null;
4651

4752
function config(hostname?: string): OcxConfig {

tests/server-auth.test.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
2-
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
2+
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
33
import { request as httpRequest } from "node:http";
4+
import { tmpdir } from "node:os";
45
import { join } from "node:path";
56
import { saveCodexAccountCredential } from "../src/codex/account-store";
67
import { getTrackedCodexWebSocketCountForAccount } from "../src/codex/websocket-registry";
@@ -36,7 +37,16 @@ import { configuredAdminToken } from "../src/lib/admin-secrets";
3637
const previousApiToken = process.env.OPENCODEX_API_AUTH_TOKEN;
3738
const previousOpencodexHome = process.env.OPENCODEX_HOME;
3839
const originalGlobalFetch = globalThis.fetch;
39-
const TEST_DIR = join(import.meta.dir, ".tmp-server-auth-test");
40+
// A per-run directory, not a fixed path. This used to be
41+
// join(import.meta.dir, ".tmp-server-auth-test"), the exact same literal that
42+
// management-provider-validation.test.ts also declared, and both files delete and
43+
// recreate it while pointing OPENCODEX_HOME there. `bun test --isolate` gives each file
44+
// its own module registry but shares one process and one filesystem, so whichever run was
45+
// mid-test when the other wiped the directory lost its config and credentials and started
46+
// answering 401 where the test expected the upstream's original 400. That also breaks two
47+
// concurrent runs of THIS file alone, which a rename could not fix. mkdtempSync matches the
48+
// isolation convention already used by tests/helpers/isolated-codex-home.ts.
49+
const TEST_DIR = mkdtempSync(join(tmpdir(), "ocx-server-auth-"));
4050
let isolatedCodexHome: IsolatedCodexHome | null = null;
4151

4252
function config(hostname?: string): OcxConfig {

0 commit comments

Comments
 (0)