Skip to content
Closed
Show file tree
Hide file tree
Changes from 121 commits
Commits
Show all changes
196 commits
Select commit Hold shift + click to select a range
b0a8274
fix(compact): omit oversized non-state tool tail
Komzpa Jul 12, 2026
f96db59
fix(proxy): extend websocket stream budget
Komzpa Jul 15, 2026
6fe16a3
fix(proxy): route native websocket relay through stream budget
Komzpa Jul 15, 2026
2688a20
fix(compact): preserve required tool-tail anchors
Komzpa Jul 15, 2026
378b894
fix(proxy): use stream budget for websocket reconnects
Komzpa Jul 15, 2026
fdae381
fix(proxy): preserve required compact tool anchors
Komzpa Jul 15, 2026
43809f9
fix(proxy): allow GET codex search control requests
Komzpa Jul 16, 2026
44b075f
fix(proxy): allow codex search preflight
Komzpa Jul 16, 2026
04c43be
fix(proxy): bypass auth for codex search preflight
Komzpa Jul 16, 2026
1373c30
fix(proxy): keep codex search preflight method set minimal
Komzpa Jul 16, 2026
10eb1c0
ci: retry transient GitHub API failures
Komzpa Jul 16, 2026
6dd86d0
fix(proxy): rebase security-work routing onto current main
Komzpa Jul 15, 2026
48f0ee9
fix(proxy): guard security lineage migration
Komzpa Jul 15, 2026
b92981b
fix(proxy): preserve file affinity across security retries
Komzpa Jul 16, 2026
b1de73f
fix(proxy): retire stale response-create gates
Komzpa Jul 16, 2026
fb20f69
fix(proxy): keep bridge mixin within architecture limit
Komzpa Jul 16, 2026
bdeed06
fix(proxy): refuse created bridge replay
Komzpa Jul 16, 2026
2288ea9
fix(db): merge security and retention migration heads
Komzpa Jul 16, 2026
1f97651
fix(proxy): preserve bridge security lineage claims
Komzpa Jul 16, 2026
7988f0f
fix(proxy): preserve terminal security lineage
Komzpa Jul 16, 2026
980b577
fix(proxy): retire denied bridge owner
Komzpa Jul 16, 2026
cd1fa80
test(proxy): stub bridge registration in security gate test
Komzpa Jul 17, 2026
6909bee
fix(proxy): persist terminal security lineage
Komzpa Jul 17, 2026
ea24b41
fix(proxy): persist owner-pinned security lineage
Komzpa Jul 17, 2026
04e23e1
fix(proxy): complete codex search preflight contract
Komzpa Jul 17, 2026
29936d3
Merge remote-tracking branch 'origin/main' into work/pr1383-simplicit…
Komzpa Jul 17, 2026
ea99729
fix(streaming): retry previsible capacity disconnects
Komzpa Jul 17, 2026
b9a5531
Merge remote-tracking branch 'origin/main' into HEAD
Komzpa Jul 17, 2026
1316705
fix(db): retain security lineage quota schema
Komzpa Jul 17, 2026
063d8ef
fix(streaming): preserve previsible retry exhaustion errors
Komzpa Jul 17, 2026
28b3915
fix(proxy): preserve stream no-replay boundary
Komzpa Jul 17, 2026
ffa24b9
fix(streaming): bound post-refresh transient retries
Komzpa Jul 17, 2026
5d8545c
test(streaming): pin visible upstream failure no-replay
Komzpa Jul 17, 2026
4b34afc
fix(streaming): fail over post-refresh transient exhaustion
Komzpa Jul 17, 2026
c744f29
fix(streaming): preserve post-dispatch retry boundaries
Komzpa Jul 17, 2026
82f598e
fix(proxy): preserve security replay accounting
Komzpa Jul 17, 2026
b90cc9f
fix(proxy): retry output-free HTTP bridge overloads
Komzpa Jul 16, 2026
4cef9ba
fix(proxy): retry selected-model capacity bridge errors
Komzpa Jul 16, 2026
c987bf8
fix(proxy): retry nonstream overload status errors
Komzpa Jul 16, 2026
389fa88
fix(proxy): retry initial stream eof before surfacing
Komzpa Jul 16, 2026
a7e63c5
fix(proxy): preserve stream eof error after retries
Komzpa Jul 16, 2026
ad31f7d
fix(proxy): retry accepted bridge eof
Komzpa Jul 16, 2026
55b40b2
fix(proxy): address accepted retry review
Komzpa Jul 16, 2026
fc86a9d
fix(proxy): keep bridge stream closes account-neutral
Komzpa Jul 19, 2026
0148a2f
test(ci): reset proxy architecture ratchet baselines
Komzpa Jul 19, 2026
5686bb5
fix(proxy): keep native websocket receive closes account-neutral
Komzpa Jul 19, 2026
4a66e73
test(ci): reset proxy architecture ratchet baselines
Komzpa Jul 19, 2026
09cd0f9
fix(proxy): ignore session stickiness for preferred owners
Komzpa Jul 20, 2026
6438559
fix(proxy): preserve precreated retry terminal errors
Komzpa Jul 20, 2026
5c1c3ef
fix(proxy): reuse only account for precreated reattach
Komzpa Jul 20, 2026
86d5c2a
fix(proxy): reuse only account for anchored precreated retry
Komzpa Jul 20, 2026
45c37f5
fix(proxy): treat no-account message as retry fallback signal
Komzpa Jul 20, 2026
fcb4231
fix(proxy): match degraded no-account fallback message
Komzpa Jul 20, 2026
b0fb1dd
fix(compact): preserve historical side-effect anchors
Komzpa Jul 20, 2026
0b1fbbf
Merge remote-tracking branch 'origin/pr/1403' into fix/security-work-…
Komzpa Jul 22, 2026
1a7dab6
fix(compact): retain code-mode side-effect pairs
Komzpa Jul 22, 2026
0219488
fix(compact): preserve paired side effects before head context
Komzpa Jul 22, 2026
c896bb9
fix(proxy): retain pending close failure
Komzpa Jul 22, 2026
43699dc
fix(proxy): preserve websocket drop account health
Komzpa Jul 22, 2026
b4411ed
fix(websocket): settle dropped accounts before reuse
Komzpa Jul 22, 2026
0fbd47f
docs(spec): document deferred websocket penalty
Komzpa Jul 22, 2026
bded829
fix(websocket): retain deferred settlement ownership
Komzpa Jul 22, 2026
572d440
fix(streaming): retry previsible capacity disconnects
Komzpa Jul 17, 2026
eb15cbd
fix(streaming): preserve previsible retry exhaustion errors
Komzpa Jul 17, 2026
05e09af
fix(proxy): preserve stream no-replay boundary
Komzpa Jul 17, 2026
e731fa8
fix(streaming): bound post-refresh transient retries
Komzpa Jul 17, 2026
7c45a8d
test(streaming): pin visible upstream failure no-replay
Komzpa Jul 17, 2026
d29c973
fix(streaming): fail over post-refresh transient exhaustion
Komzpa Jul 17, 2026
28ed993
fix(streaming): preserve post-dispatch retry boundaries
Komzpa Jul 17, 2026
74c076f
fix(streaming): preserve terminal no-replay boundaries
Komzpa Jul 22, 2026
397ed29
fix(streaming): retry post-refresh connect failures
Komzpa Jul 22, 2026
8145f38
fix(proxy): fail closed security bridge retry
Komzpa Jul 22, 2026
15c8272
fix(proxy): preserve safe bridge retry continuity
Komzpa Jul 22, 2026
5175252
fix(proxy): preserve continuity retry ownership
Komzpa Jul 22, 2026
29ec95e
fix(proxy): retry transient hard owner once
Komzpa Jul 22, 2026
9c1821b
Merge remote-tracking branch 'refs/remotes/codex-lb-prs/pr-1183' into…
Komzpa Jul 22, 2026
02068d0
Merge remote-tracking branch 'refs/remotes/codex-lb-prs/pr-1235' into…
Komzpa Jul 22, 2026
895fc41
Merge remote-tracking branch 'refs/remotes/codex-lb-prs/pr-1353' into…
Komzpa Jul 22, 2026
a2eda77
Merge remote-tracking branch 'refs/remotes/codex-lb-prs/pr-1383' into…
Komzpa Jul 22, 2026
12fb121
Merge remote-tracking branch 'refs/remotes/codex-lb-prs/pr-1384' into…
Komzpa Jul 22, 2026
dcd4a6f
Merge remote-tracking branch 'refs/remotes/codex-lb-prs/pr-1389' into…
Komzpa Jul 22, 2026
c48e257
fix(proxy): keep security denial prelude suppressed
Komzpa Jul 21, 2026
b8c3c6e
fix(compact): preserve historical side-effect anchors
Komzpa Jul 20, 2026
0cc4e36
fix(compact): import session sticky helper
Komzpa Jul 22, 2026
631dab9
fix(proxy): restore compact bridge invariants
Komzpa Jul 22, 2026
696c224
fix(proxy): reconcile aggregate retry invariants
Komzpa Jul 22, 2026
4f6992c
fix(proxy): retry active hard-affinity owner
Komzpa Jul 22, 2026
a53f462
Merge repaired PR #1384 head into live aggregate
Komzpa Jul 22, 2026
9b2e80b
Merge repaired PR #1389 head into live aggregate
Komzpa Jul 22, 2026
2c3379f
Merge repaired PR #1402 head into live aggregate
Komzpa Jul 22, 2026
c5a0d25
Merge repaired PR #1418 head into live aggregate
Komzpa Jul 22, 2026
aebd09f
fix(proxy): clear security retry affinity
Komzpa Jul 22, 2026
efc4c27
Merge commit '2cf21a75f27eea71d9e73c9e9427cc67d72c09f0' into repair/p…
Komzpa Jul 22, 2026
f486441
fix(proxy): preserve continuity owner across retries
Komzpa Jul 22, 2026
3f2e46e
test(proxy): enforce hard retry owner continuity
Komzpa Jul 22, 2026
bad4137
fix(proxy): close continuity review gaps
Komzpa Jul 22, 2026
8c296e8
fix(proxy): retry transient hard owner once
Komzpa Jul 22, 2026
edc7892
Merge commit '4833d4fb1f904ffbb259ed570421557f73b41993' into repair/p…
Komzpa Jul 22, 2026
28d1870
fix(compact): elide observed inline images at wire cap
Komzpa Jul 22, 2026
647542c
fix(proxy): reconstruct current live aggregate on main
Komzpa Jul 22, 2026
e01da86
fix(compact): match tool pairs by wire variant
Komzpa Jul 22, 2026
4e2b1ec
fix(compact): preserve conversation tail continuity
Komzpa Jul 22, 2026
107cb1d
style(compact): format request trimming helpers
Komzpa Jul 22, 2026
a0ca6a2
fix(compact): preserve occurrence-aware tool identity
Komzpa Jul 22, 2026
d0331d8
fix(proxy): stabilize parallel replay identity
Komzpa Jul 22, 2026
cd1c237
fix(proxy): close security rebind replay gaps
Komzpa Jul 22, 2026
8cbd3e5
fix(proxy): preserve preferred-owner conflict evidence
Komzpa Jul 22, 2026
c556aee
fix(proxy): preserve post-refresh failure ordering
Komzpa Jul 22, 2026
095a5c7
fix(proxy): reconcile aggregate retry contracts
Komzpa Jul 22, 2026
eea08e5
fix(proxy): retain buffered reasoning prelude
Komzpa Jul 22, 2026
a8f40c1
fix(proxy): drain deferred failover penalties
Komzpa Jul 22, 2026
c5c2c1a
fix(proxy): restore aggregate unit contracts
Komzpa Jul 22, 2026
7d49ac9
fix(quota-planner): compare reset epochs in UTC
Komzpa Jul 22, 2026
6118f4d
fix(proxy): enforce bridge startup security guards
Komzpa Jul 22, 2026
293fa6e
fix(proxy): drain terminal retry penalties
Komzpa Jul 22, 2026
2fd62ed
fix(compact): preserve image compaction context
Komzpa Jul 22, 2026
7503ab9
fix(proxy): propagate startup safety guards
Komzpa Jul 22, 2026
33e9900
fix(proxy): retain deferred retry penalties
Komzpa Jul 22, 2026
c60d649
test(proxy): preserve bridge compatibility coverage
Komzpa Jul 22, 2026
753a5b6
style(proxy): stay within bridge architecture budget
Komzpa Jul 22, 2026
1e47827
test(compact): retain historical side-effect coverage
Komzpa Jul 22, 2026
14f3ca2
fix(proxy): settle deferred penalties before terminal exits
Komzpa Jul 22, 2026
f8bf052
fix(proxy): preserve bridge security and replay identity
Komzpa Jul 22, 2026
b5455a2
refactor(proxy): move bridge cleanup activity
Komzpa Jul 22, 2026
dfe54f3
fix(proxy): enforce security gate on bridge reuse
Komzpa Jul 22, 2026
98d6ada
Merge remote-tracking branch 'refs/remotes/codex-lb-prs/pr-1442' into…
Komzpa Jul 22, 2026
83e5c75
fix(proxy): recover account-neutral sticky resends
Komzpa Jul 23, 2026
f5d69fe
fix(proxy): rebind portable hard turn-state replay
Komzpa Jul 23, 2026
3055d1b
fix(proxy): retry output-free HTTP bridge overloads
Komzpa Jul 16, 2026
da79d46
fix(proxy): retry selected-model capacity bridge errors
Komzpa Jul 16, 2026
48bd5d8
fix(proxy): retry nonstream overload status errors
Komzpa Jul 16, 2026
5b2ec55
fix(proxy): retry initial stream eof before surfacing
Komzpa Jul 16, 2026
6f9fa9b
fix(proxy): preserve stream eof error after retries
Komzpa Jul 16, 2026
ae10bbb
fix(proxy): retry accepted bridge eof
Komzpa Jul 16, 2026
eac09a4
fix(proxy): address accepted retry review
Komzpa Jul 16, 2026
8f3765e
fix(proxy): keep bridge stream closes account-neutral
Komzpa Jul 19, 2026
9052970
fix(proxy): retain pending close failure
Komzpa Jul 22, 2026
7abf479
fix(proxy): bound capacity retries by output and deadline
Komzpa Jul 22, 2026
13a4001
fix(http-bridge): respect queued admission waiters
Komzpa Jul 22, 2026
a680cc3
refactor(ci): split metadata fetch changes from retry PR
Komzpa Jul 23, 2026
3646455
fix(http-bridge): preserve detached retry cleanup
Komzpa Jul 23, 2026
1abbdb3
fix(streaming): preserve exhausted upstream error
Komzpa Jul 23, 2026
8062170
fix(proxy): allow GET codex search control requests
Komzpa Jul 16, 2026
8137ce6
fix(proxy): allow codex search preflight
Komzpa Jul 16, 2026
ce47ea3
fix(proxy): bypass auth for codex search preflight
Komzpa Jul 16, 2026
a7b94f9
fix(proxy): keep codex search preflight method set minimal
Komzpa Jul 16, 2026
8891e44
fix(proxy): complete codex search preflight contract
Komzpa Jul 17, 2026
e0f7b5b
fix(compact): elide observed inline images at wire cap
Komzpa Jul 22, 2026
81bd8ae
fix(compact): handle eligible inline tool images safely
Komzpa Jul 22, 2026
4636400
style(compact): format request trimming helpers
Komzpa Jul 22, 2026
9fe5663
fix(compact): preserve context and nested file pins
Komzpa Jul 22, 2026
4faece1
fix(compact): preserve inline image and file ownership
Komzpa Jul 23, 2026
3a9e966
fix(compact): omit oversized non-state tool tail
Komzpa Jul 12, 2026
3c9d3c7
fix(compact): preserve required tool-tail anchors
Komzpa Jul 15, 2026
74a7a9c
fix(compact): match tool pairs by wire variant
Komzpa Jul 22, 2026
061fe0a
fix(compact): preserve conversation tail continuity
Komzpa Jul 22, 2026
446a309
style(compact): format request trimming helpers
Komzpa Jul 22, 2026
1aee9db
fix(compact): preserve occurrence-aware tool identity
Komzpa Jul 22, 2026
61e0200
fix(proxy): stabilize parallel replay identity
Komzpa Jul 22, 2026
3e51fcd
fix(db): persist security lineage markers
Komzpa Jul 22, 2026
91c3835
fix(security): persist previous-response lineage
Komzpa Jul 22, 2026
7a7abdb
fix(security): enforce previous-response markers
Komzpa Jul 22, 2026
14d47ed
fix(security): preserve durable lineage fail-closed
Komzpa Jul 23, 2026
8422d10
test(security): prove cross-transport lineage enforcement
Komzpa Jul 23, 2026
7db123a
fix(security): enforce marked file lineage
Komzpa Jul 23, 2026
6e587bf
fix(security): adapt lineage markers to current main
Komzpa Jul 28, 2026
49d30aa
test(compact): type captured upstream payload
Komzpa Jul 28, 2026
40ccb93
fix(security): satisfy current CI gates
Komzpa Jul 28, 2026
bf81904
Merge remote-tracking branch 'refs/remotes/codex-lb-prs/pr-1183' into…
Komzpa Jul 28, 2026
49eb81a
Merge remote-tracking branch 'refs/remotes/codex-lb-prs/pr-1457' into…
Komzpa Jul 28, 2026
78db836
Merge remote-tracking branch 'refs/remotes/codex-lb-prs/pr-1235' into…
Komzpa Jul 28, 2026
8e21937
Merge remote-tracking branch 'refs/remotes/codex-lb-prs/pr-1383' into…
Komzpa Jul 28, 2026
4b3f5c1
Merge remote-tracking branch 'refs/remotes/codex-lb-prs/pr-1384' into…
Komzpa Jul 28, 2026
02b0e4b
Merge remote-tracking branch 'refs/remotes/codex-lb-prs/pr-1402' into…
Komzpa Jul 28, 2026
2e812a8
fix(db): merge security migration heads
Komzpa Jul 28, 2026
0ef16b3
fix(stack): merge current migration heads
Komzpa Jul 28, 2026
b9efeba
Merge remote-tracking branch 'refs/remotes/origin/pr-1183' into HEAD
Komzpa Jul 28, 2026
920ea42
fix(proxy): do not replay empty upstream streams
Komzpa Jul 28, 2026
60fd95f
test(compact): type captured compact payload
Komzpa Jul 28, 2026
c4ad9f3
Merge remote-tracking branch 'refs/remotes/origin/pr-1384' into HEAD
Komzpa Jul 28, 2026
2dfcea3
Merge remote-tracking branch 'refs/remotes/origin/pr-1457' into HEAD
Komzpa Jul 28, 2026
4296cc9
fix(proxy): retry websocket EOF before visible output
Komzpa Jul 17, 2026
fc4c22f
fix(proxy): keep websocket replay cleanup visible during backoff
Komzpa Jul 17, 2026
dbcc52b
docs(openspec): document websocket replay budget
Komzpa Jul 17, 2026
79a42ce
feat(ui): complete zh-CN dashboard translations (#1436)
crowscc Jul 28, 2026
0eb65c4
fix(proxy): retire websocket upstream before next create
Komzpa Jul 28, 2026
71ab7e6
test(streaming): scope empty EOF no-replay to anchored turns
Komzpa Jul 28, 2026
9191d96
Merge remote-tracking branch 'refs/remotes/fork/fix/selected-model-ca…
Komzpa Jul 28, 2026
3dcdd12
Merge remote-tracking branch 'refs/remotes/origin/pr-1388' into HEAD
Komzpa Jul 28, 2026
d580ba5
fix(proxy): preserve stream EOF retry in aggregate
Komzpa Jul 28, 2026
b91d9bb
docs(contributors): restore chronological contributor order (#1518)
Soju06 Jul 28, 2026
175b029
Merge remote-tracking branch 'refs/remotes/codex-lb-prs/pr-1442' into…
Komzpa Jul 29, 2026
004257d
Merge live codex-lb head f5d69fe after reconciliation
Komzpa Jul 29, 2026
5f37cff
fix(proxy): preserve portable compaction replay after live reconcile
Komzpa Jul 29, 2026
06204ff
fix(db): remap live security lineage aggregate revision
Komzpa Jul 29, 2026
6f33c3f
fix(db): drop legacy bridge pending tool columns
Komzpa Jul 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/scripts/detect_changed_areas.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ def _pull_request_files(event: dict[str, Any]) -> list[str]:
try:
payload, link = request_json(url)
except GitHubApiError as exc:
if not exc.transient:
raise SystemExit(f"GitHub PR files request failed: {exc}") from exc
print(
f"warning: GitHub PR files request failed after retries; falling back to the full CI suite: {exc}",
flush=True,
Expand All @@ -98,6 +100,9 @@ def _pull_request_files(event: dict[str, Any]) -> list[str]:
for item in payload:
if isinstance(item, dict) and isinstance(item.get("filename"), str):
files.append(item["filename"])
previous_filename = item.get("previous_filename")
if isinstance(previous_filename, str):
files.append(previous_filename)
url = next_link(link)
return files

Expand Down
8 changes: 1 addition & 7 deletions .github/scripts/fetch_pr_labels.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,7 @@ def main() -> int:
try:
payload, link = request_json(url, token=os.environ.get("GH_TOKEN") or os.environ.get("GITHUB_TOKEN"))
except GitHubApiError as exc:
print(
f"warning: GitHub PR labels request failed after retries; continuing without override labels: {exc}",
file=sys.stderr,
flush=True,
)
labels.clear()
break
raise SystemExit(f"GitHub PR labels request failed after retries: {exc}") from exc
if not isinstance(payload, list):
raise SystemExit(f"GitHub PR labels request returned {type(payload).__name__}, expected list")
labels.extend(item["name"] for item in payload if isinstance(item, dict) and isinstance(item.get("name"), str))
Expand Down
58 changes: 53 additions & 5 deletions .github/scripts/github_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,67 @@
from collections.abc import Callable
from typing import Any

RETRY_STATUS_CODES = {429, 500, 502, 503, 504}
RETRY_STATUS_CODES = {500, 502, 503, 504}
RATE_LIMIT_STATUS_CODES = {403, 429}
DEFAULT_ATTEMPTS = 5
DEFAULT_BASE_DELAY_SECONDS = 2.0
DEFAULT_TIMEOUT_SECONDS = 30.0
RATE_LIMIT_DETAIL_MARKERS = (
"api rate limit exceeded",
"rate limit exceeded",
"secondary rate limit",
"abuse detection mechanism",
)


class GitHubApiError(RuntimeError):
"""Raised when a GitHub API request fails after retries."""
"""Raised when a GitHub API request fails."""

def __init__(self, message: str, *, transient: bool = True) -> None:
super().__init__(message)
self.transient = transient


def _is_rate_limit_http_error(exc: urllib.error.HTTPError, detail: str) -> bool:
if exc.code not in RATE_LIMIT_STATUS_CODES:
return False
if exc.code == 429:
return True
headers = exc.headers
retry_after = headers.get("Retry-After")
rate_remaining = headers.get("X-RateLimit-Remaining")
rate_reset = headers.get("X-RateLimit-Reset")
if retry_after or (rate_remaining == "0" and rate_reset):
return True
try:
payload = json.loads(detail)
except json.JSONDecodeError:
payload = {}
message = payload.get("message") if isinstance(payload, dict) else None
if not isinstance(message, str):
return False
message = message.lower()
return "rate limit" in message or "abuse detection" in message


def _retry_delay(attempt_index: int, base_delay_seconds: float) -> float:
return min(base_delay_seconds * (2**attempt_index), 30.0)


def _is_transient_http_error(exc: urllib.error.HTTPError, detail: str) -> bool:
if exc.code in RETRY_STATUS_CODES:
return True
if _is_rate_limit_http_error(exc, detail):
return True
if exc.code != 403:
return False
Comment thread
Komzpa marked this conversation as resolved.
Outdated
remaining = exc.headers.get("x-ratelimit-remaining") if exc.headers is not None else None
if remaining == "0":
return True
normalized_detail = detail.lower()
return any(marker in normalized_detail for marker in RATE_LIMIT_DETAIL_MARKERS)


def request_json(
url: str,
*,
Expand Down Expand Up @@ -57,12 +104,13 @@ def request_json(
except urllib.error.HTTPError as exc:
detail = exc.read().decode("utf-8", errors="replace")
last_error = f"HTTP {exc.code}: {detail[:500]}"
if exc.code not in RETRY_STATUS_CODES or attempt_index + 1 >= attempts:
raise GitHubApiError(last_error) from exc
transient = _is_transient_http_error(exc, detail)
if not transient or attempt_index + 1 >= attempts:
raise GitHubApiError(last_error, transient=transient) from exc
except (urllib.error.URLError, TimeoutError, json.JSONDecodeError) as exc:
last_error = str(exc)
if attempt_index + 1 >= attempts:
raise GitHubApiError(last_error) from exc
raise GitHubApiError(last_error, transient=True) from exc

delay = _retry_delay(attempt_index, base_delay_seconds)
print(
Expand Down
5 changes: 1 addition & 4 deletions app/core/clients/codex.py
Original file line number Diff line number Diff line change
Expand Up @@ -272,10 +272,7 @@ async def open_ws_with_route_metadata(
failure_phase="connect",
# No response.create frame can be delivered before the
# websocket open returns to its caller.
retryable_same_contract=is_process_network_failure(
exc,
include_permanent_dns=False,
),
retryable_same_contract=is_pre_dispatch_connection_failure(exc),
) from None
raise RuntimeError("unreachable Codex client websocket fallback state")

Expand Down
21 changes: 21 additions & 0 deletions app/core/clients/proxy.py
Original file line number Diff line number Diff line change
Expand Up @@ -3175,6 +3175,17 @@ async def _stream_via_http_after_websocket_rejection(
retryable_same_contract=True,
failed_session=None,
) from exc
if raise_for_status and exc.retryable_same_contract:
raise ProxyResponseError(
exc.status_code or 502,
openai_error(routed_error_code, response_error_message),
failure_phase="connect",
retryable_same_contract=True,
failure_detail=failure_detail,
failure_exception_type=failure_exception_type,
upstream_status_code=exc.status_code,
upstream_error_code=routed_error_code,
) from exc
yield format_sse_event(
response_failed_event(routed_error_code, response_error_message, response_id=get_request_id()),
)
Expand Down Expand Up @@ -3206,6 +3217,16 @@ async def _stream_via_http_after_websocket_rejection(
retryable_same_contract=retryable_same_contract,
failed_session=client_session,
) from exc
if raise_for_status and retryable_same_contract:
raise ProxyResponseError(
502,
openai_error(error_code or "upstream_unavailable", response_error_message),
failure_phase="connect",
retryable_same_contract=True,
failure_detail=failure_detail,
failure_exception_type=failure_exception_type,
failed_session=client_session,
) from exc
yield format_sse_event(
response_failed_event(
error_code or "upstream_unavailable", response_error_message, response_id=get_request_id()
Expand Down
1 change: 1 addition & 0 deletions app/core/config/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,7 @@ class Settings(BaseSettings):
http_responses_session_bridge_codex_idle_ttl_seconds: float = Field(default=900.0, gt=0)
http_responses_session_bridge_codex_prewarm_enabled: bool = False
http_responses_session_bridge_stuck_gate_retire_after_seconds: float = Field(default=300.0, gt=0)
http_responses_session_bridge_response_created_timeout_seconds: float = Field(default=120.0, gt=0)
http_responses_session_bridge_max_sessions: int = Field(default=256, gt=0)
http_responses_session_bridge_queue_limit: int = Field(default=8, gt=0)
http_responses_session_bridge_gateway_safe_mode: bool = False
Expand Down
Loading
Loading