The JSDoc comment in cors.ts explains why Access-Control-Allow-Origin
is intentionally excluded from CORS_HEADERS. The test regex was
matching the comment text, causing a false failure.
- api-keys: remove flaky console.log assertion (route now uses Pino
structured logger via console.error, not console.log)
- chat-pipeline: update REQUIRE_API_KEY test to reflect authz pipeline
enforcement moved to route layer (handleChat no longer checks it)
- chat-pipeline: accept both 'Invalid'/'Incorrect' API key error formats
- CodexExecutor: isCodexResponsesWebSocketRequired now defaults to HTTP
unless codexTransport='websocket' is set in providerSpecificData
- CodexExecutor: store defaults to false unless openaiStoreEnabled=true
- CodexExecutor: WS unavailable now falls back to HTTP via super.execute()
instead of returning 503 (dead code path after guard refactor)
- Meta AI: X-FB-Friendly-Name updated from useAbraSendMessageMutation
to useEctoSendMessageSubscription
- Proxy middleware: tests now verify authz/pipeline.ts (refactored from proxy.ts)
- Chat pipeline: accept both 'Invalid'/'Incorrect' API key error messages
- Qwen retry: selective setTimeout mock to avoid tripping body read timeout
- Treat status 499 as terminal non-retryable error in both priority and
round-robin combo loops — no fallback to other models when client is gone
- Propagate AbortSignal from request into handleComboChat so the combo
loop can detect client disconnects before starting new model attempts
- Make retry/fallback delays abort-aware via signal.addEventListener
- Add 5 unit tests covering 499 early-exit, signal.aborted pre-check,
multi-model abort, 502 contrast behavior, and abort-during-wait
Integrated into release/v3.7.2 — implements conversation continuity for muse-spark-web executor with SHA-256 prefix hashing, TTL cache, and eviction-on-error
Allow the prepublish script to choose between webpack and turbopack
using the OMNIROUTE_USE_TURBOPACK environment variable.
This keeps the default build path explicit while making it possible to
switch bundlers for packaging and release workflows without editing the
script.
Windows CI requestSingleInstanceLock() reliably fails because the
USERPROFILE sanitization (needed for Next.js build) persists across
steps. The lock mechanism uses a named pipe tied to userData path,
which doesn't work with the synthetic USERPROFILE.
Linux and macOS smoke tests remain required gates.
Windows smoke test exits code=0 because requestSingleInstanceLock()
fails silently when the APPDATA/<productName> directory doesn't exist.
Pre-create the directory so the lock file can be written.
Also enables ELECTRON_SMOKE_STREAM_LOGS=1 in CI for better debugging.
Centralize remote image downloads behind a shared helper that
validates outbound URLs, enforces redirect and size limits, and
applies request timeouts before bytes are read.
Wire the helper into image generation and vision bridge flows so
remote image inputs and result URLs follow the same fetch policy and
block redirects to private hosts. Update key management routes to use
structured logging and document the WebSocket bridge secret in the
example environment file.
The billing header fingerprint was computed from the first user message text
via computeFingerprint(), which changes every conversation turn. This mutated
the system[] prefix on each request, invalidating Anthropic's prompt-cache
prefix and forcing ~100% cache_create (vs 96% cache_read with stable prefix).
Now uses a per-day SHA-256 hash of the date + ccVersion, keeping the billing
header format while preserving prompt-cache prefix stability across turns.
Includes 6 unit tests.
The prompt_cache_key was derived from the account-wide workspaceId, meaning
all conversations from the same OAuth account shared one cache partition.
The official Codex CLI uses conversation_id (a unique UUID per session).
Priority: body.session_id > body.conversation_id > workspaceId.
Session IDs are captured BEFORE deletion from the body.
Includes 10 unit tests.