Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
7092 commits
Select commit Hold shift + click to select a range
55557dc
ci: add portable catalog async contracts and a Windows liveness diagn…
Oct 10, 2026
87e93b7
Merge main into 2.82.0 promotion
Oct 10, 2026
6524ce8
chore(release): open dev at 2.83.0 before releasing 2.82.0 (#6875)
Oct 10, 2026
848ec37
Merge pull request #6878 from lidge-jun/codex/promote-main-2.82.0
Oct 10, 2026
696dadc
fix(opengateway): lower routed custom tools on the Responses wire (#6…
Oct 10, 2026
be23d01
fix(config): coordinate Grok and link writers (#6869)
Oct 10, 2026
4222577
fix(claude): fill the unset Sonnet tier with claude-sonnet-5-5 (#6874)
Oct 10, 2026
fca9cbf
fix(codex): never discard a rotated native-main refresh token on canc…
Oct 10, 2026
0dd7451
fix: release active-turn admission when the client cancels (#6850)
Oct 10, 2026
aa95a48
fix(ollama-native): key response tool calls by native id before index…
Oct 10, 2026
aa09c2c
fix(zcode): carry reasoning ladders and image input into the provider…
Oct 10, 2026
3354119
fix(responses): warn once when a custom provider drops replayed plain…
Oct 10, 2026
7751208
fix(google): let the empty-completion retry replay a pre-output Verte…
Oct 10, 2026
71adcc1
fix(server): release inbound body admission when the client disconnec…
Oct 10, 2026
6c826bd
fix(logs): attribute proxy replay refusals as transport-ambiguous (#6…
Oct 10, 2026
17dbbac
docs(devlog): archive 205 landed units from _plan to _fin (#6884)
Oct 10, 2026
84b9e88
fix(desktop): judge machine-path-conflict from a fresh logon PATH (#6…
Oct 10, 2026
f169bcf
fix(copilot): negotiate Auto for positively restricted accounts (carr…
Oct 10, 2026
2d56558
fix(logs): keep recognized bare upstream error classes in synthesized…
Oct 10, 2026
9f34ea7
test: isolate host settings and bound native Windows fixtures (#6864)
Oct 10, 2026
0025374
fix(chat): promote caller x-session-id on Chat Completions ingress (#…
Oct 10, 2026
5c937a4
fix(codex): keep rediscovering main-account credits after an unavaila…
Oct 10, 2026
fe8864d
fix(responses): report spend-ledger storage refusals as local 503s (#…
Oct 10, 2026
3649d58
test: report the sibling-recycle child's state when it stalls (#6893)
Oct 10, 2026
03b865e
docs(devlog): archive release-train coordination records to _fin (#6896)
Oct 10, 2026
d49df2f
fix(grok): claim coupon redemptions before dispatch and reconcile unc…
Oct 10, 2026
ea678a6
fix(logs): drop credential-shaped upstream diagnostics before they re…
Oct 10, 2026
c61c3f6
fix(copilot): restore the configured wire before each Auto negotiatio…
Oct 10, 2026
eb06a2c
Merge main into 2.83.0 promotion
Oct 10, 2026
518f9ab
chore(release): open dev at 2.84.0 before releasing 2.83.0 (#6902)
Oct 10, 2026
33b3218
Merge pull request #6910 from lidge-jun/codex/promote-main-2.83.0-r2
Oct 10, 2026
7d058f2
fix(server): release eager relay listeners after producer teardown (#…
Oct 10, 2026
19c71a5
fix(logs): refuse upstream diagnostics that repeat a sent credential …
Oct 10, 2026
289d528
test: make the drip-feed probe and plugin lifecycle tests independent…
Oct 10, 2026
77a260f
fix(codex): preserve prompt drafts and validate base imports (#6866)
Oct 10, 2026
1c7c2fa
fix(ollama): bound generated late-tool attribution (#6654)
Oct 10, 2026
09b3e76
fix(link): recover Home-initiated links after outages and make Retry …
Oct 10, 2026
bf09e1a
fix(desktop): explicitly unlock the CLI record lock before closing (#…
Oct 10, 2026
c9e6a72
fix(gui): keep combo capabilities for targets hidden from the picker …
Oct 10, 2026
433764e
fix(grok): keep coupon callers on an operation that may still be spen…
Oct 10, 2026
f189b33
test(usage): keep the credential-shape case off a same-size rewrite (…
Oct 11, 2026
9b6f4b2
fix(link): restore remote hub browser pairing on loopback-bound manag…
Oct 11, 2026
49e50cc
fix(claude): keep loopback MCP servers off the intercept proxy with N…
Oct 11, 2026
c3a4cdf
fix(kimi): omit explicit empty assistant history on native Responses …
Oct 11, 2026
b1f39cd
fix: verify configured credentials by content, route the tray to the …
Oct 11, 2026
7d78598
fix(claude): label alias tier slots in /model; count Anthropic cache …
Oct 11, 2026
e1a2684
fix(claude): keep the NO_PROXY receipt across a failed removal, and d…
Oct 11, 2026
b5f690b
fix: preserve shadow-call user turns, honor ZCode dataBaseDir, forwar…
Oct 11, 2026
862b8f1
fix(cli): harden hub disable, log filters and service startup diagnos…
Oct 11, 2026
777b377
fix(accounts): admit reset Anthropic accounts and report OAuth subscr…
Oct 11, 2026
34bf006
fix(link): verify Child runtime relay and add fingerprint-bound CLI e…
Oct 11, 2026
7af092c
fix(config): preserve remote topology across guarded live saves (#6956)
Oct 11, 2026
0024ac6
fix(claude): reject unverified picker metadata snapshots (#6965)
Oct 12, 2026
7258420
feat(codex): pick, clear and auto-assign each LazyCodex role's reason…
Oct 12, 2026
4fa0967
fix(openai-chat): handle Flash-Next leading-system templates (#6966)
Oct 12, 2026
8eb1fc3
feat(codex): release account pins from the dashboard (#6964)
Oct 12, 2026
561c55b
docs(codex): carry the translated LazyCodex role effort sections (#6970)
Oct 12, 2026
a0191a1
fix(codex): save a model-inheriting LazyCodex role's effort without p…
Oct 12, 2026
8d12a3c
fix(kiro): keep same-organization users as separate accounts (#6981)
Oct 12, 2026
f341b78
fix(responses): read V1 collaboration tools rendered inside code-mode…
Oct 12, 2026
744678f
fix(startup): dashboard installer on compiled ocx and clearer Desktop…
Oct 12, 2026
49ae1f7
docs(integrations): describe effort-only role saves in the translated…
Oct 12, 2026
e4af84a
fix(logs): keep the Codex WebSocket error wrapper's 5xx status and re…
Oct 12, 2026
03a9d31
ci(macos): split the macOS suite into three shards under the same 20-…
Oct 12, 2026
dc45bb2
fix(service): opt-in health sentinel recovers a hung but listening se…
Oct 12, 2026
3e58c2c
fix(anthropic): recover API-key credit-balance refusals before output…
Oct 12, 2026
419860b
fix(codex): deduplicate unchanged effort clamp observations (#7005)
Oct 12, 2026
5f3481b
test(codex): drain quota fixture owners before home removal (#7001)
Oct 12, 2026
4abec7a
fix(responses): frame a decoded ocx1 checkpoint as continuation in th…
Oct 12, 2026
b1832a3
fix(codex): retire stale short-window quota after plan changes (#7002)
Oct 12, 2026
88433c3
fix(gui): cut the LazyCodex role section copy to what a user acts on …
Oct 12, 2026
6a69e54
test(codex): pin cache retention for omitted tertiary and malformed o…
Oct 12, 2026
07a5cf2
fix(responses): scope the checkpoint continuation note to authorized …
Oct 12, 2026
e33a2ce
docs(devlog): record the L2 contributor carry plan, audit and review
Oct 12, 2026
a63267c
Merge #7008: carry five contributor fixes for the 2.84.0 train
Oct 12, 2026
95bee27
fix(ci): run the test runner on Bun 1.4.3 so spawnSync stops losing c…
Oct 12, 2026
c220eec
ci(test): refresh shard durations from a full dispatch and give Windo…
Oct 12, 2026
ed07f0f
test(web-search): run the pacing deadline cases on a virtual clock (#…
Oct 12, 2026
bbe1fc1
fix(anthropic-pool): answer spent quota as a usage limit and lift Ret…
Oct 12, 2026
a061e70
fix(responses): retry and fail over a pooled Codex turn the upstream …
Oct 12, 2026
ce97299
fix(desktop): tray Start at Login shows only what Startup safety veri…
Oct 12, 2026
b993e66
fix(link): read-only Home management, Home Codex settings and one CLI…
Oct 12, 2026
6c27087
feat(gui): opt in custom Responses plaintext reasoning replay (#6961)
Oct 12, 2026
fe6768c
docs(devlog): record the L1 owner bundle and the #6999 split
Oct 12, 2026
c9438df
fix(responses): read deferred V1 collaboration tools from the Codex <…
Oct 12, 2026
43232a4
fix(claude): bound the picker front's discard of an abandoned upload
Oct 12, 2026
ed2e435
docs(devlog): record the L3 lane outcome for #6844 and the #6984 drai…
Oct 12, 2026
72fedca
fix(service): prove OpenCodex Desktop supervision on Windows (#6853)
Oct 12, 2026
57d9e2a
feat(codex): discover the Codex app's bundled CLI on macOS (#6973)
Oct 12, 2026
d89f374
test(link): classify passive-read opens by write capability
Oct 12, 2026
fa11541
docs(devlog): record the L4 lane plan, reviews and outcome for #6853 …
Oct 12, 2026
d91ecf8
fix(codex): check plist text with the XML Char predicate instead of a…
Oct 12, 2026
8f10f23
Merge #7009: land eight owner fixes for 2.84.0
Oct 12, 2026
b71d1e1
Merge #7010: detect deferred V1 collaboration tools and bound the pic…
Oct 12, 2026
bf57900
Merge #7011: recognize Desktop supervision on Windows and discover th…
Oct 12, 2026
bed3b47
feat(meta): seed Muse Wonder on the Meta Model API and Muse Code prov…
Oct 12, 2026
1b53510
fix(codex): default native GPT-6.1 Sol to the 500k context Codex now …
Oct 12, 2026
0180a51
docs(devlog): record the L5 sources, plan and audits for Muse Wonder …
Oct 12, 2026
3bb7a56
Merge #7013: GPT-6.1 Sol 500k default context in Codex and Meta Muse …
Oct 12, 2026
6def866
release: promote dev 3bb7a5612c to main as 2.84.0
Oct 12, 2026
6da2774
chore(release): open dev at 2.85.0 before releasing 2.84.0 (#7014)
Oct 13, 2026
6955343
release: 2.84.0 (#7016)
Oct 13, 2026
e6d7e56
fix(test): isolate diagnostic servers from live Codex restart (#7018)
Oct 13, 2026
d934632
fix(integrations): bound managed config reads and writes (#7029)
Oct 13, 2026
a5cd5a2
fix(diagnostics): preserve home guards in isolated child environments…
Oct 13, 2026
582589c
feat(providers): add Modelflare API-key preset (#7037)
Oct 13, 2026
60752ec
fix(service): require stable numeric health sentinel endpoints (#7031)
Oct 13, 2026
d3d17d5
fix(azure): support an opt-in minimum output-token budget (#7028)
Oct 13, 2026
68e7d0f
fix(responses): parse code-mode declarations in bounded linear time (…
Oct 13, 2026
2f88c48
fix(copilot): terminate requests on negotiated model scope denial (#7…
Oct 13, 2026
8833b04
fix(runtime): bound overflow parsing and batch replay scrubs (#7020)
Oct 13, 2026
a6008d1
fix(codex): safely unlink generated profiles (#7021)
Oct 13, 2026
935c15d
fix(launcher): verify PATH ancestry and reject temporary app bundles …
Oct 13, 2026
3eb5a3c
fix(codex): serve the in-flight token when a native main save is refu…
Oct 13, 2026
9c36822
fix(claude): preserve distinct Desktop aliases with effort fallback (…
Oct 13, 2026
20cd561
feat(codex): let Codex own the native main refresh when a supported b…
Oct 13, 2026
148cfef
fix(startup): let the Codex shim run under OpenCodex Desktop without …
Oct 13, 2026
31cd723
fix(desktop): credit smd-submitted Start at Login job (#7019) (#7033)
Oct 13, 2026
e05b8d3
fix(qoder): recover runTurn keys on scoped 401/429 failures (#6992)
Oct 13, 2026
6c6ceb4
fix(openai-chat): preserve Mistral typed text and thinking blocks (#7…
Oct 13, 2026
76b0d0e
test: preserve generation diagnostics and wait for tray probe readine…
Oct 13, 2026
cfe58b4
fix(responses): preserve tool catalog boundaries across inbound wires…
Oct 13, 2026
daf323d
ci: run only the fast ubuntu subset on PRs; cross-platform matrix on …
Oct 13, 2026
0e2a86d
fix(claude): reject non-regular Desktop configuration reads (#7036)
Oct 13, 2026
a29cb3d
fix(zcode): bound default bootstrap file reads (#7039)
Oct 13, 2026
e2886a6
ci: cross-platform CI manual-only on dev; document CI policy (#7057)
Oct 13, 2026
f5f73ff
fix(codex): offer Ultrafast for GPT-6 Astra and GPT-6.1 Sol in the sp…
Oct 13, 2026
39f5654
fix(anthropic): recognize TypeScript Agent SDK client identity (#7059)
Oct 13, 2026
5b6bff7
fix(codex): reuse WAL-aware opener for pending history probe (#7060)
Oct 13, 2026
b28f23d
fix(update): recognize standalone installs in CLI update checks (#7063)
Oct 13, 2026
0108cf8
fix(service): timestamp and rotate managed service logs (#7064)
Oct 13, 2026
1edd55a
fix: carry ChatGPT launcher, SOCKS5 TLS deadline and 429 triage docs …
Oct 13, 2026
9a02380
test(server): preserve release-on-cancel admission (#7034)
Oct 13, 2026
94fa715
fix(kiro): accept authorized social device grants and quarantine desk…
Oct 13, 2026
16d36fb
fix(codex): preserve shim ownership across APFS reboots (#7061)
Oct 13, 2026
aca5ccf
feat(catalog): infer custom-provider context windows from model metad…
Oct 13, 2026
23acccb
feat(codex): expose declared Ultra Fast in the desktop speed picker (…
Oct 13, 2026
e31757f
fix(cursor): accept the shared freeform fallback field at the exec ga…
Oct 13, 2026
1ff4f7c
fix(anthropic): forward context management for native Claude clients …
Oct 13, 2026
b54a21c
fix(update): recover through launchd/systemd before an unsupervised f…
Oct 13, 2026
4765008
fix(history): rebuild large request-history indexes on a worker threa…
Oct 13, 2026
611bd06
fix(codex): answer the main hard lock as a usage limit, clamp retry t…
Oct 13, 2026
13212e6
feat: add provider-independent advisor runtime (#5955)
Oct 13, 2026
729bcfd
feat(codex): add opt-in Windows desktop compatibility controls (#6079)
Oct 13, 2026
12d5c1b
feat(claude): configure CLI tier defaults and explicitly apply user s…
Oct 13, 2026
2acdb92
feat(clients): add Qoder client integration and config export (#5950)
Oct 13, 2026
9b31677
feat(protocols): Antigravity direct lane for Chat (no internal Respon…
Oct 13, 2026
1cceebe
chore(sponsors): remove PackyCode sponsorship (#7072)
Oct 14, 2026
79df0c9
fix(update): dashboard update restarts through launchd/systemd before…
Oct 14, 2026
f8065e0
feat: Gemini 4 Argon + per-account Antigravity lineup (CLI UA for Arg…
Oct 14, 2026
04b7d51
feat(protocols): Antigravity direct lane for Messages, on by default …
Oct 14, 2026
4a5b0c6
test(history): perturb dev, not ino, for the stale-ledger build case …
Oct 14, 2026
3dda89f
test(compaction): keep the pre-route prime off the shared-probe teard…
Oct 14, 2026
ba865da
test(compaction): stub the in-handler pre-route prime for the native …
Oct 14, 2026
faa8572
release: promote dev ba865da725 to main as 2.85.0
Oct 14, 2026
08bb2e4
chore(release): open dev at 2.86.0 before releasing 2.85.0 (#7093)
Oct 14, 2026
732fba6
Merge pull request #7094 from lidge-jun/release/promote-main-2.85.0
Oct 14, 2026
494c50d
fix(ci): remove the shared root causes of flaky Windows CI (#7107)
Oct 14, 2026
7640a94
chore(release): open dev at 2.87.0 before releasing 2.86.0 (#7109)
Oct 14, 2026
38301b7
release: promote dev 494c50d02f to main as 2.86.0
Oct 14, 2026
409026b
Merge pull request #7110 from lidge-jun/release/promote-main-2.86.0
Oct 14, 2026
1008302
test(codex): allow child generation diagnostics before outer timeout …
Oct 15, 2026
c37161c
fix(codex): show last Windows desktop build assessment (#7113)
Oct 15, 2026
65ad37d
fix(catalog): preserve context inference through provider edits (#7077)
Oct 15, 2026
0b13396
fix(protocols): enforce explicit-empty tool catalogs across delivery …
Oct 15, 2026
60bf4c7
fix(gui): select Advisor model from the routed catalog (#7114)
Oct 15, 2026
ade27f4
fix(usage): keep usage-ledger file ids exact so Windows NTFS ids stop…
Oct 15, 2026
d73e9ab
fix(desktop): serialize shim publication with production process crea…
Oct 15, 2026
8066328
fix(claude): verify Desktop backup and optional metadata reads (carry…
Oct 15, 2026
c410b77
fix(anthropic): pair native beta schemas with effective headers (#7132)
Oct 15, 2026
9f09568
fix(oauth): preserve operator model policy during reconciliation (#7141)
Oct 15, 2026
a460e75
fix(cli): refuse uncertain ownership before publishing sibling runtim…
Oct 15, 2026
ee6cbe2
feat(codex): route hard-locked main-account traffic to a configured f…
Oct 15, 2026
bca6184
test(codex): use shared Windows attest spawn budgets (#7151)
Oct 15, 2026
113eded
feat(cli): configure usage model table row limits (carry #6436) (#7156)
Oct 15, 2026
d9ef862
feat(antigravity): show canonical plan badge in account rows (carry #…
Oct 15, 2026
83bf0c1
feat(codex): opt in to remaining included quota (carry #6629) (#7158)
Oct 15, 2026
408f1d4
feat(combos): require explicit consent for metered targets (carry #68…
Oct 15, 2026
318e483
feat(pricing): support per-model prompt-length overrides (carry #6738…
Oct 15, 2026
b538531
feat(combos): enroll text-only members in vision sidecar (carry #4932…
Oct 15, 2026
afd0bcf
feat(oauth): reset-first strategy for generic OAuth pools (carry #540…
Oct 15, 2026
3f6c696
fix(oauth): print fixed CLI login errors instead of provider bodies (…
Oct 15, 2026
041241a
test(claude): end the linger upload pump when the socket closes (#7180)
Oct 15, 2026
9499167
fix(codex): protect the desktop authority key in-process on Windows x…
Oct 15, 2026
6fa4228
test(google): guard Argon thought separation across client protocols …
Oct 15, 2026
359d31b
fix(codex): carry canonical subagent limits across modes (#7125) (#7128)
Oct 15, 2026
ccb9191
fix(catalog): preserve uncapped native maximum context windows (#7130)
Oct 15, 2026
93133af
fix(responses): strip Google item metadata from native OpenAI request…
Oct 15, 2026
f5c0f50
fix(startup): launch the registered Desktop bundle and executable (#7…
Oct 15, 2026
a3dfe75
fix(responses): frame retained compaction requests as history (#7138)
Oct 15, 2026
9d4c82a
fix(chat): restore DeepSeek reasoning on native tool continuations (#…
Oct 15, 2026
2cd4029
fix(anthropic): surface Opus 5.5 progress as signed commentary (#7143)
Oct 15, 2026
ae95f2d
fix(test): isolate service state from the shared startup home (#7161)
Oct 15, 2026
1549a74
feat(providers): add DeepSeek Harness authenticated account provider …
Oct 15, 2026
6d2ee6d
feat(claude-cli): stable conversation replay and capture-only client …
Oct 15, 2026
973204b
feat(claude-cli): refuse launches when the Claude subscription is exh…
Oct 15, 2026
37fcd24
feat(oauth): code-display login mode for hosts with no reachable loca…
Oct 15, 2026
f089fdf
fix(claude): bind intercept test ports without probe-and-release race…
Oct 15, 2026
fc6502b
test(cli): isolate sibling ensure from a running Desktop app (#7182)
Oct 15, 2026
8ac597a
test(cli): keep audio readiness waits inside their test budget (#7183)
Oct 15, 2026
f3fbf82
fix(oauth): bound refresh consumers and retain stale owners (carry #7…
Oct 15, 2026
a738a5e
fix(oauth): allow Muse Keychain approval and surface actionable login…
Oct 15, 2026
243bf2c
feat(oauth): pin generic pool conversations to request-local accounts…
Oct 15, 2026
b6dffa0
feat(codex): preserve signed-in quota across duplicate pool entries (…
Oct 15, 2026
17e307d
fix(gui): fold Advisor into the Subagents row and collapse its notice…
Oct 15, 2026
49ffccd
feat(vertex): accept credential JSON with secure marker lifecycle (ca…
Oct 15, 2026
b43f931
fix(service): bind Linux health sentinel recovery to pidfd (#7133)
Oct 15, 2026
4ae4936
fix(codex): keep the desktop app open on codex-restart when its picke…
Oct 15, 2026
f997eb8
fix(providers): carry Zed, Qoder, and OpenCode Gemini compatibility (…
Oct 16, 2026
f6e6f1b
fix(catalog): carry Ultra Fast discovery, vision sidecar, model alias…
Oct 16, 2026
d3a84c2
fix(service): carry log rotation identities, Windows lock folder and …
Oct 16, 2026
3785915
fix(responses): carry incomplete reasons, terminal refusals, offline …
Oct 16, 2026
329d91b
feat(advisor): carry bounded retention and adaptive consultation (#71…
Oct 16, 2026
68fad32
feat(antigravity): preserve diagnostic per-model quota evidence (carr…
Oct 16, 2026
9e0ed51
feat(providers): carry opt-in API key round-robin and per-key pacing …
Oct 16, 2026
c03eafd
refactor(proxy): share opaque transport with desktop relay (#7120)
Oct 16, 2026
6ccb47a
fix(combos): carry OAuth combo cooldown, account rotation and health …
Oct 16, 2026
a8d1bb8
feat(gui): carry Combo visibility, workspace panes, Windows picker an…
Oct 16, 2026
300e426
fix(claude): carry translated-lane server tools, refusal/cap/TTL fixe…
Oct 16, 2026
65ef8b3
feat(responses): carry compaction capabilities and reasoning retentio…
Oct 16, 2026
b3cd913
refactor: break config-facade import cycles (189 -> 59 static cyclic …
Oct 16, 2026
7a42860
refactor(oauth): break the ChatGPT OAuth and auth-api import cycles (…
Oct 16, 2026
4ed45e9
feat(cli): carry usage comparison, log history, restart and Codex con…
Oct 16, 2026
050bb44
fix(gui): restore keep-native-v1 qualifier placement (#7237)
Oct 16, 2026
5170724
fix(providers): charge API-key cooldown to the credential sent (#7240)
Oct 16, 2026
64ed834
test: fix Windows default-home isolation fixtures (#7242)
Oct 16, 2026
e498fde
fix(config): preserve legacy OpenCode Go configs after native wire pi…
Oct 16, 2026
a7d3be1
fix(ci): preserve import cycles through macOS path aliases (#7241)
Oct 16, 2026
d3cb552
fix(compact): preserve retained reasoning across native combo failove…
Oct 16, 2026
1f96e40
fix(claude): activate Windows picker after dormant startup (#7243)
Oct 16, 2026
0a568eb
fix(desktop): use Waker::noop for the Rust 1.99 clippy lint (#7246)
Oct 16, 2026
de315e7
fix(cli): preserve Codex opt-out and usage comparison ownership (#7244)
Oct 16, 2026
447c58a
release: promote dev de315e76ad to main as 2.87.0
Oct 16, 2026
947b9b6
chore(release): open dev at 2.88.0 before releasing 2.87.0 (#7248)
Oct 16, 2026
04d4ad8
Merge pull request #7249 from lidge-jun/release/promote-main-2.87.0
Oct 16, 2026
d93965b
fix(ci): keep carry-attribution references whole at the window cap (#…
Oct 16, 2026
a02cecd
fix: carry account recovery, server-tool buffer, and usage correction…
Oct 16, 2026
520865e
fix(startup): skip unused native Codex ownership probes (#7184)
Oct 16, 2026
5d3a2fc
fix(claude): replay Anthropic server-tool exchanges on the translated…
Oct 16, 2026
2a3fd00
fix(google): stop leaked Gemini planning from spreading through repla…
Oct 16, 2026
97a12fd
docs(chatgpt): clarify the app-server shim transport limit (#7227)
Oct 17, 2026
7a29b53
fix(catalog): preserve OpenAI API display name overrides (#7259)
Oct 17, 2026
f190fc4
fix(routing): price refused-then-served rows in routing analytics (#7…
Oct 17, 2026
43a3e39
fix(cli): preserve startup with IPv6 loopback disabled (#7262)
Oct 17, 2026
4b71bdb
fix(chat): return gateway request-history IDs (#7261)
Oct 17, 2026
bdb03fb
fix(responses): reclaim least recently used idle WebSocket at capacit…
Oct 17, 2026
0036a88
fix(opencode-zen): route Claude through Anthropic Messages (#7235)
Oct 17, 2026
7761e04
fix(anthropic): recover rejected thinking without local prefix valida…
Oct 17, 2026
b0d4d18
release: promote dev 7761e04edb to main as 2.88.0
Oct 17, 2026
6936d98
Merge pull request #7264 from lidge-jun/release/promote-main-2.88.0
Oct 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
36 changes: 36 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
**

!package.json
!bun.lock
!tsconfig.json

# The manifest stage needs Git's tracked-file INVENTORY and nothing else: `git ls-files` reads
# the index and never opens an object or a ref. Admitting those two files costs about 1 MB;
# admitting .git wholesale would put 1.3 GB in every local build context. The stage supplies the
# empty objects/ and refs/ directories Git's repository check insists on, in a scratch GIT_DIR.
# No COPY includes either file, so neither reaches an image layer.
!.git/
.git/**
!.git/index
!.git/HEAD

!src/
!src/**
# Optional compatibility path for hosts that already generated the canonical artifact.
!src/generated/compatibility-version.json

!scripts/
scripts/**
!scripts/model-metadata.source.json
!scripts/generate-compatibility-version.ts

!docker/
!docker/**

!gui/
!gui/**
gui/node_modules/
gui/dist/
gui/.vite/

**/*.log
2 changes: 1 addition & 1 deletion .github/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,5 @@ change requires explicit security review under `MAINTAINERS.md`.

- Inspect the complete workflow diff, including event triggers, permissions, conditions, interpolation, and shell behavior.
- Run the local commands represented by changed workflow steps where possible.
- Run `bun run prepush` for CI, release, dependency, packaging, or cross-platform workflow changes.
- Follow the root validation policy: run the suite by default; if a full run is too costly, run at least focused regression tests and document the reason and remaining coverage. Required CI checks still apply before merge.
- Do not claim the workflow itself passed until GitHub Actions reports success for the exact commit.
23 changes: 18 additions & 5 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# Default reviewers
* @lidge-jun @Ingwannu @Wibias
* @lidge-jun @Ingwannu

# High-impact runtime behavior
/src/adapters/ @lidge-jun @Ingwannu @Wibias
/src/providers/ @lidge-jun @Ingwannu @Wibias
/src/codex/ @lidge-jun @Ingwannu @Wibias
/src/server/ @lidge-jun @Ingwannu @Wibias
/src/adapters/ @lidge-jun @Ingwannu
/src/providers/ @lidge-jun @Ingwannu
/src/codex/ @lidge-jun @Ingwannu
/src/server/ @lidge-jun @Ingwannu

# Repository automation and release security
/.github/ @lidge-jun @Ingwannu
Expand All @@ -14,6 +14,7 @@
/bunfig.toml @lidge-jun @Ingwannu
/scripts/release.ts @lidge-jun @Ingwannu
/scripts/release-notes.ts @lidge-jun @Ingwannu
/scripts/release-version-sources.ts @lidge-jun @Ingwannu
/scripts/prepare-package.ts @lidge-jun @Ingwannu
/package.json @lidge-jun @Ingwannu
/bun.lock @lidge-jun @Ingwannu
Expand All @@ -32,3 +33,15 @@
**/AGENTS.md @lidge-jun @Ingwannu
/MAINTAINERS.md @lidge-jun @Ingwannu
/SECURITY.md @lidge-jun @Ingwannu

# Proxy core boundary — owner approval required.
# These four files carry every user's request path, including users of no optional
# subsystem. Optional subsystems (Compatibility Lab and anything added later) register
# into core-owned slots at activation instead of being imported here; the invariant is
# enforced by tests/lab/core-lab-boundary.test.ts and designed in
# devlog/_fin/260814_lab_core_decoupling/.
# Last-match-wins: this block must stay below /src/server/ to take effect.
/src/router.ts @lidge-jun
/src/server/index.ts @lidge-jun
/src/server/lifecycle.ts @lidge-jun
/src/server/responses/core.ts @lidge-jun
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/documentation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ body:
attributes:
label: Documentation location
description: Public documentation URL or repository path.
placeholder: "https://opencodex.me/providers/ or docs/providers.md"
placeholder: "https://opencodex.me/guides/providers/ or docs-site/src/content/docs/guides/providers.md"
validations:
required: true

Expand Down
56 changes: 56 additions & 0 deletions .github/actions/setup-project-bun/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: Setup project Bun
description: >-
Install the package.json Bun pin for a job's role: dependencies.bun for
runtime (default), or testRunnerBun for test-runner.

# Runtime 1.4.2 fixes #6684's Windows Bun.fetch stream truncation. The test runner
# skipped 1.4.2: #4821 reverted #4064 after its multi-file --isolate preload segfault
# (#6713 run 37631558263: Linux 1/4, macOS 2/2, Windows 9/9). It moved from 1.4.0 to
# 1.4.3 for oven-sh/bun#44581: 1.4.0's Bun.spawnSync could lose a child's exit after
# finalizers ran inside an earlier call and spin past its own timeout (#4956).
# Rejoin only after the upstream runner crash is fixed and a green lane=all
# dispatch proves the unified version; then delete testRunnerBun and this role input.
inputs:
role:
description: Bun role to install (runtime or test-runner).
required: false
default: runtime

outputs:
version:
description: The resolved Bun version string.
value: ${{ steps.resolve.outputs.version }}

runs:
using: composite
steps:
- name: Resolve project Bun version
id: resolve
shell: bash
env:
BUN_ROLE: ${{ inputs.role }}
run: |
node <<'NODE'
const pkg = require('./package.json');
const role = process.env.BUN_ROLE;
let key;
let version;
switch (role) {
case 'runtime': key = 'dependencies.bun'; version = pkg.dependencies?.bun; break;
case 'test-runner': key = 'testRunnerBun'; version = pkg.testRunnerBun; break;
default:
console.error(`::error::Unknown Bun role: ${role}`);
process.exit(1);
}
if (typeof version !== 'string' || version !== version.trim() || !/^\d+\.\d+\.\d+$/.test(version)) {
console.error(`::error::Missing or invalid package.json ${key} for Bun role ${role}`);
process.exit(1);
}
require('node:fs').appendFileSync(process.env.GITHUB_OUTPUT, `version=${version}\n`);
console.log(`Using Bun ${version} from package.json ${key} (${role})`);
NODE

- name: Setup Bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
with:
bun-version: ${{ steps.resolve.outputs.version }}
244 changes: 244 additions & 0 deletions .github/scripts/closed-pr-branch-cleanup.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,244 @@
"use strict";

/**
* Deletion planning for branches left behind by closed-without-merge pull
* requests.
*
* GitHub's repository-level `delete_branch_on_merge` only fires on merge, so a
* PR that is closed unmerged leaves its head branch in the repository forever.
* This module decides which of those branches may be deleted; the workflow
* performs the deletion.
*
* Kept as a pure module so the safety rules can be unit-tested without Actions
* and without a live repository.
*/

/** Branches that may never be deleted regardless of pull-request state. */
const PROTECTED_BRANCHES = Object.freeze(["main", "dev", "preview", "gh-pages"]);

/** Branch namespaces explicitly reserved for disposable pull-request work. */
const DISPOSABLE_BRANCH_PREFIXES = Object.freeze(["codex/", "ingw/"]);

/** Default grace period before a closed PR's head branch becomes eligible. */
const DEFAULT_GRACE_DAYS = 14;

function normalizeBranchName(value) {
// Git permits non-ASCII whitespace in ref names, while String#trim removes
// it. Preserve API-provided branch identity byte-for-byte so two distinct
// refs cannot collapse into one deletion candidate.
return typeof value === "string" ? value : "";
}

/**
* A commit id, lowercased for comparison.
*
* The REST and GraphQL APIs are not consistent about case, and a full 40-character
* sha compared case-sensitively against an abbreviated or upper-case one silently
* reads as "different" - which here would mean "keep", so the failure direction is
* safe, but it would make the guard useless rather than protective. Anything that
* is not a plausible hex object id becomes null, i.e. unknown.
*/
function normalizeOid(value) {
const text = String(value || "").trim().toLowerCase();
return /^[0-9a-f]{7,64}$/.test(text) ? text : null;
}

function isProtectedBranch(name) {
return PROTECTED_BRANCHES.includes(normalizeBranchName(name));
}

function toTimestamp(value) {
if (!value) return null;
const ms = Date.parse(String(value));
return Number.isFinite(ms) ? ms : null;
}

/**
* Reasons a candidate branch is kept. Exported so the workflow can log a
* stable, greppable verdict per branch instead of a free-form sentence.
*/
const KEEP_REASONS = Object.freeze({
PROTECTED: "protected-branch",
MERGED: "pull-request-merged",
OPEN: "open-pull-request",
BASE_OF_OPEN: "base-of-open-pull-request",
CROSS_REPOSITORY: "cross-repository-head",
MISSING_CLOSED_AT: "missing-closed-at",
WITHIN_GRACE: "within-grace-period",
OUTSIDE_DISPOSABLE_NAMESPACE: "outside-disposable-namespace",
MOVED_SINCE_CLOSE: "branch-moved-since-close",
UNKNOWN_HEAD_SHA: "unknown-head-sha",
});

/**
* Plan deletions for head branches of closed-unmerged pull requests.
*
* Every rule here is a safety rule, and each one exists because the opposite
* behavior destroys work that is still referenced:
*
* - A branch is a candidate only when *every* pull request that ever used it as
* a head is closed and unmerged. One open or merged PR on the same branch
* keeps it, because reopening a PR whose head branch is gone cannot restore
* the commits.
* - A branch that is the base of an open pull request is kept. Deleting it
* closes the stacked child PR that targets it.
* - Cross-repository (fork) heads are never touched: they live in the
* contributor's repository and this token has no business there.
* - A grace period after `closed_at` leaves room to reopen a PR that was
* closed by mistake.
* - Only branches under namespaces explicitly reserved for disposable pull-
* request work are eligible. Pull-request history alone must not authorize
* deletion of an unrelated persistent branch.
* - Branch names are compared and emitted byte-for-byte. Normalizing Unicode
* whitespace can merge distinct valid refs and delete the wrong branch.
* - The branch must still POINT AT a commit one of those closed pull requests
* had as its head. Matching by NAME alone deletes reused work: `codex/`-style
* names get picked up again all the time, and a branch recreated for new work
* inherits the closed history of every PR that ever used that name. The tip
* moved, so the branch is not the closed PR's branch any more - it only shares
* its label.
* - A branch whose current tip cannot be determined is kept. An unknown tip is
* not evidence of an abandoned branch, and this job's mistakes are not
* recoverable.
*
* @param {object} input
* @param {Array<object>} input.pullRequests Pull requests with
* `headRefName`, `headRefOid`, `baseRefName`, `state`, `merged`, `closedAt`,
* and `isCrossRepository`.
* @param {Array<string|{name: string, oid?: string}>} input.branches Branches
* that currently exist. A bare string carries no tip, which is treated as an
* unknown tip and kept.
* @param {number} [input.now] Current time in milliseconds.
* @param {number} [input.graceDays] Days to wait after `closedAt`.
* @returns {{ deletions: Array<{branch: string, pullRequests: number[]}>,
* keeps: Array<{branch: string, reason: string}> }}
*/
function planClosedPrBranchDeletions({
pullRequests = [],
branches = [],
now = Date.now(),
graceDays = DEFAULT_GRACE_DAYS,
}) {
// Accepts both shapes so an older caller passing bare names still works - it
// just gets the conservative answer, because a name without a tip cannot be
// proven safe to delete.
/** @type {Map<string, string|null>} */
const existing = new Map();
for (const entry of branches) {
const name = normalizeBranchName(typeof entry === "string" ? entry : entry && entry.name);
if (!name) continue;
const oid = typeof entry === "string" ? null : normalizeOid(entry && entry.oid);
existing.set(name, oid);
}
const graceMs = Math.max(0, Number(graceDays) || 0) * 24 * 60 * 60 * 1000;

/** @type {Map<string, object[]>} */
const byHead = new Map();
const openBases = new Set();

for (const pr of pullRequests) {
const head = normalizeBranchName(pr && pr.headRefName);
if (head) {
const list = byHead.get(head) || [];
list.push(pr);
byHead.set(head, list);
}
const isOpen = String(pr && pr.state).toUpperCase() === "OPEN";
if (isOpen) {
const base = normalizeBranchName(pr && pr.baseRefName);
if (base) openBases.add(base);
}
}

const deletions = [];
const keeps = [];

for (const branch of [...existing.keys()].sort()) {
if (isProtectedBranch(branch)) {
keeps.push({ branch, reason: KEEP_REASONS.PROTECTED });
continue;
}

const related = byHead.get(branch) || [];
if (related.length === 0) continue; // No PR ever used it; out of scope.

if (related.some((pr) => pr && pr.isCrossRepository === true)) {
keeps.push({ branch, reason: KEEP_REASONS.CROSS_REPOSITORY });
continue;
}
if (related.some((pr) => pr && pr.merged === true)) {
keeps.push({ branch, reason: KEEP_REASONS.MERGED });
continue;
}
if (related.some((pr) => String(pr && pr.state).toUpperCase() === "OPEN")) {
keeps.push({ branch, reason: KEEP_REASONS.OPEN });
continue;
}
if (openBases.has(branch)) {
keeps.push({ branch, reason: KEEP_REASONS.BASE_OF_OPEN });
continue;
}

const closedTimestamps = related.map((pr) => toTimestamp(pr && pr.closedAt));
if (closedTimestamps.some((ts) => ts === null)) {
keeps.push({ branch, reason: KEEP_REASONS.MISSING_CLOSED_AT });
continue;
}
const newestClosedAt = Math.max(...closedTimestamps);
if (now - newestClosedAt < graceMs) {
keeps.push({ branch, reason: KEEP_REASONS.WITHIN_GRACE });
continue;
}

if (!DISPOSABLE_BRANCH_PREFIXES.some((prefix) => branch.startsWith(prefix))) {
keeps.push({ branch, reason: KEEP_REASONS.OUTSIDE_DISPOSABLE_NAMESPACE });
continue;
}

// The tip check, last because it is the most expensive claim to satisfy and
// the cheaper rules above have already excluded most branches.
//
// A closed PR's head branch is only THIS branch if the branch still points at
// a commit that PR had as its head. Without this, a name reused for new work
// is deleted on the strength of an unrelated PR that happened to share the
// label months earlier - and a deleted branch whose commits were never pushed
// anywhere else is gone.
const currentOid = existing.get(branch) || null;
if (!currentOid) {
keeps.push({ branch, reason: KEEP_REASONS.UNKNOWN_HEAD_SHA });
continue;
}
const closedOids = new Set(
related.map((pr) => normalizeOid(pr && pr.headRefOid)).filter(Boolean),
);
// An empty set means the API gave us no head SHA for any of them, which is the
// unknown case again rather than a licence to delete.
if (closedOids.size === 0) {
keeps.push({ branch, reason: KEEP_REASONS.UNKNOWN_HEAD_SHA });
continue;
}
if (!closedOids.has(currentOid)) {
keeps.push({ branch, reason: KEEP_REASONS.MOVED_SINCE_CLOSE });
continue;
}

deletions.push({
branch,
pullRequests: related
.map((pr) => Number(pr && pr.number))
.filter((n) => Number.isFinite(n))
.sort((a, b) => a - b),
});
}

return { deletions, keeps };
}

module.exports = {
DEFAULT_GRACE_DAYS,
DISPOSABLE_BRANCH_PREFIXES,
KEEP_REASONS,
PROTECTED_BRANCHES,
isProtectedBranch,
planClosedPrBranchDeletions,
};
Loading