Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
298 commits
Select commit Hold shift + click to select a range
acdac3f
fix(connect): a process-owned journal is ours to unwind, not a conflict
Sep 1, 2026
dbec900
fix(remote-gui): drop plaintext pairing and bound the unauthenticated…
Sep 1, 2026
af95d59
fix(connect): preserve the sync handler exit code on the connected br…
Sep 1, 2026
dad1712
test(remote-gui): stub the prompt happy-dom does not implement
Sep 1, 2026
20f3c11
fix(connect): restore the catalog the user had, and stop calling a st…
Sep 1, 2026
1d99dd5
feat(two-plane): filter hub usage by client key
Aug 27, 2026
872b945
feat(two-plane): add client machine and hub GUI planes
Aug 27, 2026
90c7e8f
test(two-plane): cover machine relay and GUI routing
Aug 27, 2026
fcd79c4
feat(deploy): add loopback hub management ingress
Aug 27, 2026
ccf319c
test(two-plane): align shared-base shell assertions
Aug 27, 2026
6999656
test(deploy): cover hub management ingress boundaries
Aug 27, 2026
4f27ee8
feat(two-plane): harden relay and offline target states
Aug 27, 2026
a8fdcf6
feat(deploy): harden management ingress allowlist
Aug 27, 2026
e3f6cf8
fix(two-plane): repair remote verification failures
Aug 27, 2026
7d8b878
docs(deploy): add remote hub deployment guide
Aug 27, 2026
a3fe759
fix(two-plane): unblock client start and GUI verification
Aug 27, 2026
5cdef72
fix(client): a hub without client state is disconnected, not mismatch…
Aug 27, 2026
61710ef
docs(devlog): phase-4 gui screenshot evidence
Aug 27, 2026
bf221bc
fix(hub): the hub role never rewrites its host client configs on star…
Aug 27, 2026
fedbe0a
fix(two-plane): declare the machine plane, enable relay, and finish t…
Sep 1, 2026
0a73858
fix(connect): seed default config on a fresh machine instead of refus…
Aug 27, 2026
16ddd3e
fix(two-plane): authenticate the relayed pairing exchange and isolate…
Sep 1, 2026
7bf2823
docs(devlog): clisu-oracle dogfood record — full connect lifecycle pr…
Aug 27, 2026
95639f0
fix(two-plane): a standalone install neither probes nor announces the…
Sep 1, 2026
76257cc
test(deploy): assert the ingress role rule where the message is actua…
Sep 1, 2026
25c784f
feat(hardening): add recoverable data key rotation API
Aug 27, 2026
b829320
feat(hardening): bound pairing attempts and add session logout
Aug 27, 2026
10a3198
feat(hardening): validate remote protocol catalog and relay
Aug 27, 2026
2ea6313
feat(hardening): recover client key rotation through token backup
Aug 27, 2026
b12093b
feat(hardening): add api key rotation controls
Aug 27, 2026
be2ee7d
test(hardening): cover rotation pairing catalog and relay negatives
Aug 27, 2026
913d2a5
docs(i18n): synchronize remote hub hardening across locales
Aug 27, 2026
88d9889
fix(hardening): gate startup on rotation recovery state
Aug 27, 2026
9bded9c
feat(hardening): expose remote session logout control
Aug 27, 2026
ad7acdb
fix(hardening): keep one-time rotation secret visible
Aug 27, 2026
c693700
fix(hardening): reject mismatched catalog validators
Aug 27, 2026
e5bca8d
test(hardening): cover subprocess protocol skew matrix
Aug 27, 2026
bd0064d
test(hardening): reject rotation secrets and revoke ids in argv
Aug 27, 2026
9088d60
fix(hardening): bound remote session logout request
Aug 27, 2026
54d799c
test(hardening): keep rotation evidence secret-free
Aug 27, 2026
c22792e
fix(hardening): drop a stray import fragment and guard an undefined r…
Aug 27, 2026
5da9f17
fix(hardening): repair phase six full-suite regressions
Aug 27, 2026
6a71a41
fix(hardening): confirm the abort before rewinding, and never delete …
Sep 1, 2026
0e443d8
fix(hardening): declare the four routes this phase adds
Sep 1, 2026
dd8c3e6
feat(cli): declare ocx connect rotate as a capability
Sep 1, 2026
efefe36
fix(hardening): keep the remaining two-plane UI off a standalone install
Sep 1, 2026
278fd61
Merge pull request #2771 from lidge-jun/codex/remote-hub-design
lidge-jun Sep 1, 2026
87459f8
Merge pull request #2772 from lidge-jun/codex/remote-hub-p1
lidge-jun Sep 1, 2026
39e5aef
Merge pull request #2776 from lidge-jun/codex/remote-hub-p2
lidge-jun Sep 1, 2026
fd8b6b8
Merge pull request #2777 from lidge-jun/codex/remote-hub-p3
lidge-jun Sep 1, 2026
163feb6
Merge pull request #2781 from lidge-jun/codex/remote-hub-p4
lidge-jun Sep 1, 2026
6d732d3
Merge pull request #2786 from lidge-jun/codex/remote-hub-p5
lidge-jun Sep 1, 2026
9232df0
Merge pull request #2789 from lidge-jun/codex/remote-hub-p6
lidge-jun Sep 1, 2026
3275b5a
docs(devlog): remote hub restack planning unit (#3149)
lidge-jun Sep 1, 2026
b27bab0
docs(devlog): close out the remote hub merge train (#3159)
lidge-jun Sep 1, 2026
c692831
docs(devlog): record the objective closeout and worktree realignment …
lidge-jun Sep 1, 2026
75d9ada
docs(devlog): verify the four review fixes reached dev (#3161)
lidge-jun Sep 1, 2026
7ac4c9f
docs(devlog): close the remote hub restack unit (#3162)
lidge-jun Sep 1, 2026
2f2629f
docs(skill): teach ocx the remote hub roles, pairing boundary, and di…
lidge-jun Sep 1, 2026
e236c36
fix(catalog): read Copilot context window limits (#3163)
Ingwannu Sep 1, 2026
75090d4
fix(codex): preserve request-owned main pins (#3166)
Ingwannu Sep 1, 2026
e40245e
fix(client): tell the dashboard it is a client (#3169)
lidge-jun Sep 1, 2026
e92aa33
fix(cli): route ocx models new-policy and new-arrivals to the runtime…
lidge-jun Sep 1, 2026
7386b52
fix(combo): apply the combo default effort the target can actually re…
lidge-jun Sep 1, 2026
0d8147c
docs(reference): document the readyz protocol fields and the remote-h…
lidge-jun Sep 1, 2026
22a643a
test(combo): update the failover e2e assertion the effort fix invalid…
lidge-jun Sep 1, 2026
e582aee
fix(gui): stop the mobile topbar and integration cards overflowing (#…
lidge-jun Sep 1, 2026
2e2da87
fix(codex): rotate accounts on wrapped quota failures (#3176)
Vadevious Sep 1, 2026
0d6424f
fix(responses): surface provider 413 as terminal context overflow (#3…
Ingwannu Sep 1, 2026
51c4917
fix(export): preserve Hermes vision capabilities (#3178)
lidge-jun Sep 1, 2026
eceb02d
fix(remote): restore authenticated GUI health (#3179)
lidge-jun Sep 1, 2026
634d9e5
fix(codex): retry caller main after pool rejection (carry of #3135) (…
lidge-jun Sep 1, 2026
865a36e
fix(claude): keep proxy admission keys out of subscription launches (…
lidge-jun Sep 1, 2026
3b9cddf
docs(devlog): close the multiplatform QA and GUI unit (#3181)
lidge-jun Sep 1, 2026
fecb77a
fix(codex): serialize native-main refresh on the CODEX_HOME claim (re…
lidge-jun Sep 1, 2026
afd5b46
fix(compact): route combo compact requests through the failover path …
lidge-jun Sep 1, 2026
fe766e1
fix(codex): throttle repeated failed pool quota primes (rebase of #30…
lidge-jun Sep 1, 2026
ea29e25
fix(service): report the wait that was actually spent, not the budget…
lidge-jun Sep 1, 2026
d335570
fix duplicate Codex restore after graceful stop (#3187)
lidge-jun Sep 1, 2026
5ccf7c8
fix(cli): let an explicit different --port start a sibling (rebase of…
lidge-jun Sep 1, 2026
5557772
fix(openai): exclude user-owned alias overlays from canonical seed va…
lidge-jun Sep 1, 2026
c870714
fix(usage): price aggregator models spelled vendor/model (#3194)
lidge-jun Sep 1, 2026
f3bcc67
fix(responses): strip ChatGPT citation control markers before the cli…
lidge-jun Sep 1, 2026
4be4326
docs(devlog): drop remote home-path citations the privacy scanner fla…
lidge-jun Sep 1, 2026
ef6a163
fix(capacity): count uncalibrated Codex plans instead of excluding th…
lidge-jun Sep 1, 2026
88c4275
feat(combo): adapt reasoning effort to target capabilities (#2731) (#…
lidge-jun Sep 1, 2026
c17bc94
fix(codex): verify auth.json identity, not just content, before publi…
lidge-jun Sep 1, 2026
52d9416
feat(responses): opt-in ceiling for oversized outbound passthrough bo…
lidge-jun Sep 1, 2026
c7f3f6f
feat(router): summarize compaction on the default provider when no ca…
lidge-jun Sep 1, 2026
59449fa
docs(codex): explain why routed models are gated during reserve mode …
lidge-jun Sep 1, 2026
55400ef
feat(anthropic): add claude-fable-5-1 with official Fable 5.1 pricing…
lidge-jun Sep 1, 2026
fcf0da2
test(quota): move the malformed-plan pool test onto the #3198 contrac…
olddonkey Sep 1, 2026
53c09a2
fix(server): allow POST /v1/alpha/search on the loopback listener (#3…
lidge-jun Sep 1, 2026
6a6efa9
feat(catalog): per-provider retainModels opt-in (#1690, carries #2860…
lidge-jun Sep 1, 2026
0d73d65
feat(images): relay Codex image_gen to xAI Imagine with Grok OAuth (c…
lidge-jun Sep 1, 2026
4a382be
feat(codex): opt-in authless Codex Desktop routing mode (#1107) (#3207)
lidge-jun Sep 1, 2026
e1eb8c5
docs(cli): explain shim-free Codex token injection boundaries (#2713)…
lidge-jun Sep 1, 2026
5bc6939
feat(proxy): startup Windows system-proxy discovery behind proxy "aut…
lidge-jun Sep 1, 2026
941cb45
feat(providers): opt-in OS keychain storage for provider API keys (#1…
lidge-jun Sep 1, 2026
5fc7d07
feat(cursor): seed claude-fable-5-1 at 1M ahead of the Cursor lineup …
lidge-jun Sep 1, 2026
d975fea
feat(catalog): durable display names for discovered models (#2201, ca…
lidge-jun Sep 1, 2026
ef7b3c9
feat(quota): per-account Gem/Cla quota for Google Antigravity (#1082)…
lidge-jun Sep 1, 2026
356e495
feat(oauth): generic pool-settings contract for OAuth providers (#695…
lidge-jun Sep 1, 2026
f84dbf9
fix(ci): declare the provider keychain capability and refresh the Cur…
lidge-jun Sep 1, 2026
6fe4631
feat(responses): opt-in upstream Responses WebSocket transport (#2816…
lidge-jun Sep 1, 2026
519bba7
feat(codex): opt-in reset-credit auto-redemption before expiry (#822)…
lidge-jun Sep 1, 2026
85f7ef9
devlog: wp14 carry record and wp15 disposition (#3221)
lidge-jun Sep 1, 2026
d23eab4
fix(responses): keep the reserved functions group intact for codex-sp…
lidge-jun Sep 1, 2026
b732b0d
fix(responses): scope the self-named namespace scrub to declared bare…
lidge-jun Sep 2, 2026
261b7e0
fix(cli): stop a sibling start from persisting its port into config.p…
lidge-jun Sep 2, 2026
86dee69
docs(readme): stack the four demo gifs one per row so they stop getti…
lidge-jun Sep 2, 2026
1c8278b
fix: fail over zero-output incomplete combo streams (#3236)
lidge-jun Sep 2, 2026
98444a5
docs(readme): shrink the stacked demo gifs to 560px (#3237)
lidge-jun Sep 2, 2026
e4d4815
docs(readme): orca-style feature rows — caption left, gif right (#3238)
lidge-jun Sep 2, 2026
744d12d
fix(subagents): auto-fallback encrypted V2 spawns to native Codex wit…
lidge-jun Sep 2, 2026
00f4dcc
feat(shadow-call): per-source-model replacement mapping (Plan B)
yorkane Sep 2, 2026
7f00d0e
fix(subagents): let encrypted-task recovery run before the synthesize…
lidge-jun Sep 2, 2026
b54508c
fix(agents): allow Codexless V2 task recovery (#3241)
lidge-jun Sep 2, 2026
2cb5921
revert(subagents): drop the synthesized native chain for encrypted sp…
lidge-jun Sep 2, 2026
7aa64bb
feat(cursor): derive the picker seed from the capability table and la…
lidge-jun Sep 2, 2026
f607233
feat(server): advertise api_types and capabilities on the raw /v1/mod…
lidge-jun Sep 2, 2026
72a7c4a
docs: Cursor Private Inference connector guide (#3231)
lidge-jun Sep 2, 2026
83838e7
feat(cursor): let the Codex Fast toggle reach Cursor's fast variant (…
lidge-jun Sep 2, 2026
8a7d003
docs(devlog): bug-label drawdown campaign record and main->dev regres…
lidge-jun Sep 2, 2026
8d2dd66
feat(cursor): expose -fast identities to clients without a Fast toggl…
lidge-jun Sep 2, 2026
21416a7
docs(cursor): record the stack landing SHAs and close residual R5 (#3…
lidge-jun Sep 2, 2026
8fb4e6e
docs(cursor): closeout verification on the landed dev (#3244)
lidge-jun Sep 2, 2026
fd5ccab
feat(cursor): read-only Private Inference status route for the dashbo…
lidge-jun Sep 2, 2026
879d748
feat(gui): Cursor integration tab, overview card, DSH label (#3248)
lidge-jun Sep 2, 2026
7d25f99
docs(cursor): dashboard section and read-only surface note (#3249)
lidge-jun Sep 2, 2026
19b0157
fix(windows): server.stop drains the config-dir ACL flight; retrying …
lidge-jun Sep 2, 2026
a6ee24f
fix(windows): writable fsync handles, hermetic ACL test lanes, teardo…
lidge-jun Sep 2, 2026
847f4f1
merge dev into main for the v2.40.0 release
Sep 2, 2026
ac78647
Merge pull request #3261 from lidge-jun/codex/promote-main-2400
lidge-jun Sep 2, 2026
7ce0ba5
fix(release): pass the bump job's permissions through the reusable-wo…
lidge-jun Sep 2, 2026
aaa9eaf
fix(release): pass the bump job's permissions through the reusable-wo…
lidge-jun Sep 2, 2026
35ff3a4
Merge pull request #3263 from lidge-jun/codex/promote-main-2400-relfix
lidge-jun Sep 2, 2026
272ff6b
fix(release): move dev to 2.41.0 after v2.40.0 (#3265)
lidge-jun Sep 2, 2026
7424719
docs(devlog): Windows CI repair and v2.40.0 release outcome (#3267)
lidge-jun Sep 2, 2026
ee24bab
ci(service-lifecycle): trigger on release.yml; devlog for the bot-PR …
lidge-jun Sep 2, 2026
345e217
docs(devlog): Cursor bundle effort-table roadmap (260902_cursor_bundl…
lidge-jun Sep 2, 2026
bc8ea07
feat(cursor): read the Private Inference effort table from the instal…
lidge-jun Sep 2, 2026
410a48a
refactor(cursor): canonical Claude-id normalizer replaces the three F…
lidge-jun Sep 2, 2026
862e914
feat(models): advertise max_output_tokens on /v1/models rows (#3274)
lidge-jun Sep 2, 2026
2ab9d94
feat(cursor): opt-in effort-variant rows for models outside Cursor's …
lidge-jun Sep 2, 2026
7ce713e
feat(gui): Cursor tab shows effort-ladder provenance and a hint for t…
lidge-jun Sep 2, 2026
529639a
docs(cursor): identify the Private Inference build, gateway precedenc…
lidge-jun Sep 2, 2026
b0a42ca
fix(chat-native): share transient send budget across recovery (#3254)
luvs01 Sep 2, 2026
fd324dc
fix(oauth): honor Kiro reset-aligned cooldown without Retry-After (#3…
luvs01 Sep 2, 2026
3d3c4fe
feat(models): roll out Gemini 3.8 Flash across Antigravity, Google, a…
lidge-jun Sep 2, 2026
938c013
fix(responses): bridge write_stdin through exec (#3246)
Eleven-is-cool Sep 2, 2026
34c9e98
fix(responses): stop the background write storm on responses-state.js…
lidge-jun Sep 2, 2026
fc08fc2
fix(gui): stop the log panel from jittering as rows scroll in (#3290)
lidge-jun Sep 2, 2026
f0bbaaf
docs(devlog): Gemini 3.8 Flash rollout closeout (#3292)
lidge-jun Sep 2, 2026
6b2dfde
fix(combos): shorten request-rate cooldowns and send Retry-After on c…
Veritas-7 Sep 2, 2026
85d40ca
fix(usage): aggregate complete ledger incrementally (#3270)
Paosder Sep 2, 2026
3c7c021
fix(providers): save the dashboard provider editor atomically (#3296)
lidge-jun Sep 2, 2026
4cf3e91
fix(cli): retry liveness probes before ocx claude spawns a proxy (#3297)
Veritas-7 Sep 2, 2026
e9a5b0f
fix(combos): fail over provider-scoped quota caps (#3298)
RHODIZSECURITY Sep 2, 2026
15b43e5
test: make provider-option E2E hermetic (#3301)
lidge-jun Sep 2, 2026
2e74a35
fix(combos): skip exhausted provider quotas (#3302)
RHODIZSECURITY Sep 2, 2026
eac662e
fix(connect): return rotation creation time (#3307)
lidge-jun Sep 2, 2026
906511f
fix(connect): use catalog inactivity timeout (#3310)
lidge-jun Sep 2, 2026
472c785
fix(cli): report reachable status dashboard URL (#3308)
lidge-jun Sep 2, 2026
b3e205e
fix(integrations): route hub clients through loopback (#3309)
lidge-jun Sep 2, 2026
af314b0
docs(devlog): close out the bug-labelled drawdown campaign (#3311)
lidge-jun Sep 2, 2026
878f754
feat(models): add Muse Spark 1.3 on the 1.2 spec (#3317)
lidge-jun Sep 3, 2026
7a529a2
docs+ci: record contributor work landed without a co-author trailer, …
lidge-jun Sep 3, 2026
bb27c26
docs(devlog): close out the contributor credit restoration unit (#3319)
lidge-jun Sep 3, 2026
ff1ac6b
feat(providers): add the direct Meta Model API provider (#3321)
lidge-jun Sep 3, 2026
38f8a81
fix(cursor): keep the cursor/ slug in the picker for unbranded rows (…
lidge-jun Sep 3, 2026
1aa839a
feat(oauth): import the Muse Code CLI credential behind a ToS warning…
lidge-jun Sep 3, 2026
81a1fc1
feat(gui): give both Meta providers their brand mark (#3338)
lidge-jun Sep 3, 2026
01d85aa
Merge commit '81a1fc1cc' into codex/promote-main-2410
Sep 3, 2026
b15cbb2
fix(ci): close the carry gate on an unclosed HTML comment (#3343)
lidge-jun Sep 3, 2026
2b5a38a
fix(deps): override fast-uri to ^3.1.7 and qs to ^6.16.0 to resolve C…
lidge-jun Sep 3, 2026
1f00ff5
test(semver): measure the ReDoS guard as best-of-N, not one sample (#…
lidge-jun Sep 3, 2026
a02da4c
Merge commit '1f00ff52b' into codex/promote-main-2410
Sep 3, 2026
4600f80
Merge pull request #3342 from lidge-jun/codex/promote-main-2410
lidge-jun Sep 3, 2026
78c630a
test: stop three CI timing flakes from blocking the release train (#3…
lidge-jun Sep 3, 2026
162d11e
fix(release): move dev to 2.42.0 after v2.41.0 (#3354)
github-actions[bot] Sep 3, 2026
bea573a
feat(meta): read Muse subscription usage from the response stream (#3…
lidge-jun Sep 3, 2026
ef086ab
docs(meta): correct the Muse quota story across the note, docs, CLI a…
lidge-jun Sep 3, 2026
1cc2ff2
feat(gui): state how old a passively observed quota is (#3359)
lidge-jun Sep 3, 2026
b5777aa
feat(meta): surface the active account's observed subscription window…
lidge-jun Sep 3, 2026
664d80c
fix(gui): plain-dollar cost cells, effort-only cell, and overlap clip…
lidge-jun Sep 3, 2026
548414a
docs(devlog): open the 260904 repository hygiene campaign unit
Sep 3, 2026
67de941
docs(devlog): harden the T4 scratch rule after the auditor caught a f…
Sep 3, 2026
491a45b
docs(devlog): record the four audit rounds behind the deletion ledger
Sep 3, 2026
1abb792
docs(devlog): record wp1/wp2 branch cleanup and the orphan-branch fai…
Sep 3, 2026
07ae3ab
docs(devlog): record the wp1 deletion outcome and post-deletion verif…
Sep 3, 2026
f825858
fix(oauth): add the OpenAI deviceauth grant for headless ChatGPT logi…
lidge-jun Sep 3, 2026
8a0c108
fix(cli): stop claiming logs --follow implies JSONL (#3372)
lidge-jun Sep 3, 2026
1c6243f
docs(devlog): record the PR and issue drawdown ledger
Sep 3, 2026
53a2adf
fix(cursor): break repeated narration across tool cycles (#3371)
lidge-jun Sep 3, 2026
d753fa5
fix(gui): expose all combo strategies in selector (#3373)
lidge-jun Sep 3, 2026
883e3f7
docs(devlog): close out the 260904 repository hygiene campaign
Sep 3, 2026
d81016b
docs(devlog): record per-PR verdicts with landing measurements
Sep 3, 2026
e3e00cf
docs(credits): record the unlinked-trailer gap the hygiene gate canno…
Sep 3, 2026
164977e
docs(devlog): record contributor credit verification for the carry PRs
Sep 3, 2026
82c8bed
docs(devlog): record per-issue verdicts and the consolidation map
Sep 3, 2026
42f7f1f
docs(devlog): close the hygiene campaign unit into _fin with live fin…
Sep 3, 2026
604e87b
docs(devlog): dashboard-minimal roadmap — inventory, three reviewer o…
lidge-jun Sep 3, 2026
e713864
feat(gui): collapse the sidebar footer into two orb rows and move the…
lidge-jun Sep 3, 2026
5a67c46
feat(gui): dashboard shows health, sync, sidecars and memory — settin…
lidge-jun Sep 3, 2026
d060f53
fix(codex,cli,gui): surface the device login so a headless hub can ad…
lidge-jun Sep 3, 2026
cfa0383
feat(gui): Models catalog — one advanced disclosure, provider ⋯, v2 s…
lidge-jun Sep 3, 2026
a333811
fix(models): normalize mobile tab spacing and stabilize Combos layout…
lidge-jun Sep 3, 2026
5ebeb45
docs(devlog): close out the 260904 bug stack train (#3392)
lidge-jun Sep 3, 2026
a13cfc8
feat(gui): Integrations shows the clients on this machine first (#3391)
lidge-jun Sep 3, 2026
4c8d9b5
feat(gui): Codex account cards show one primary action; the rest sit …
lidge-jun Sep 3, 2026
3eca228
feat(gui): Usage — five cards, caveat on the coverage card, year heat…
lidge-jun Sep 3, 2026
59bc82f
feat(gui): Startup — the hero answers, details wait (#3396)
lidge-jun Sep 3, 2026
b295439
feat(gui): page polish — Providers, Logs, Subagents, Combos, Routing …
lidge-jun Sep 3, 2026
ea3231a
chore(gui): prune orphaned i18n keys, sync web-dashboard docs (#3399)
lidge-jun Sep 3, 2026
cd98a69
fix(codex): inject experimental_realtime_ws_base_url so desktop voice…
lidge-jun Sep 3, 2026
f4ceae1
feat(codex): register gpt-6-astra preemptively as an account-gated na…
lidge-jun Sep 3, 2026
4a4f95f
fix(responses): preserve unknown upstream usage fields through the br…
lidge-jun Sep 3, 2026
d4ef2b3
test(responses): pin unknown usage-field passthrough across forward, …
lidge-jun Sep 3, 2026
9c29e44
Merge pull request #3408 from lidge-jun/codex/260904-hygiene-closeout
lidge-jun Sep 3, 2026
6f634ed
fix(codex): list gpt-6-astra unconditionally so the request reaches u…
Sep 4, 2026
db2e2eb
Merge pull request #3410 from lidge-jun/codex/260904-astra-ungate
lidge-jun Sep 4, 2026
d617a04
chore(codex): pin the shipped gpt-6-astra upstream row
Sep 4, 2026
c5671b6
fix(codex): project gpt-6-astra from its own shipped row, not Sol
Sep 4, 2026
39952d5
fix(adapters): neutralize the Codex identity line for GPT-6 and later
Sep 4, 2026
d96b311
test(codex): pin the shipped Astra projection and record the unit
Sep 4, 2026
d7b649d
fix(credits): mask the contributor emails that fail privacy:scan
Sep 4, 2026
4dbf614
Merge pull request #3412 from lidge-jun/codex/260904-astra-schema-ali…
lidge-jun Sep 4, 2026
c2870fb
fix(codex): let the 1M opt-in raise gpt-6-astra to its own ceiling
Sep 4, 2026
19017e9
Merge pull request #3414 from lidge-jun/codex/260904-astra-optin-window
lidge-jun Sep 4, 2026
0e76b20
revert(gui): restore the dashboard affordances the minimal pass colla…
Sep 4, 2026
afd5392
docs(pr-assets): restored dashboard, models and usage screenshots
Sep 4, 2026
07414e0
Merge pull request #3415 from lidge-jun/codex/260904-restore-dashboar…
lidge-jun Sep 4, 2026
8b30d60
revert(gui): show every Integrations client without a disclosure
Sep 4, 2026
8b60e4c
Merge pull request #3418 from lidge-jun/codex/260904-restore-integrat…
lidge-jun Sep 4, 2026
072df52
fix(codex,gui): restore the plan and ticket badges on the main accoun…
lidge-jun Sep 4, 2026
48f8186
Merge pull request #3427 from lidge-jun/codex/promote-main-2420-badges
lidge-jun Sep 4, 2026
ea52f6b
feat(auth): opt-in management API auth disable for local access
yorkane Sep 2, 2026
e53d849
fix(auth): accept localhost origin when management auth is disabled
yorkane Sep 2, 2026
322adcb
feat(auth): disableOriginCheck option for external reverse proxy
yorkane Sep 2, 2026
de90bae
fix(gui): clarify shadow-call per-source mapping rows
yorkane Sep 2, 2026
e25ba0e
feat(shadow-call): custom source model mappings replace shared fallback
yorkane Sep 2, 2026
9a18fbb
Merge upstream/main (v2.42.0) into local patch branch
yorkane Sep 4, 2026
ee870bd
feat(guard): per-provider undeclaredToolAllowlist drops phantom tool …
yorkane Sep 4, 2026
b4c502c
docs(providers): document undeclaredToolAllowlist
yorkane Sep 4, 2026
b946ae2
feat(bridge): repair leaked tool-call envelopes in exec freeform input
yorkane Sep 5, 2026
6c47c3b
feat(bridge): namespace-leak phantom calls become exec directive feed…
yorkane Sep 5, 2026
7e627f7
feat(bridge): repair mis-shaped Codex tool-call names before the phan…
yorkane Sep 5, 2026
42c8fd5
feat(bridge): strip sandbox-namespace prefixes from emitted tool names
yorkane Sep 5, 2026
98327a9
refactor(bridge): unify wrong-tool-name repairs into one guard
yorkane Sep 5, 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
  •  
  •  
  •  
225 changes: 225 additions & 0 deletions .github/scripts/pr-carry-attribution.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,225 @@
"use strict";

/**
* Attribution for work carried from another author's pull request.
*
* When a maintainer lands someone else's pull request by reimplementing,
* carrying, or rebasing it, the resulting commit is authored by the maintainer.
* The contributor survives only through a Co-authored-by trailer -- that trailer
* is what GitHub reads for the contributor graph, the repository's contributor
* list, and the author's own profile activity.
*
* This exists because the repository did it both ways for months. 53c09a247
* says "Clean reimplementation of #3193" and names alan7629 in a trailer;
* 5734a1caf says "Reimplements #2797 by @rrmlima" and names nobody. Both
* sentences are equally sincere, and only the first is data. A scan of dev
* found 27 landings whose author is named in prose and nowhere a tool can read;
* CREDITS.md is the record of those, and this check is why the list should not
* grow.
*
* The check reads the pull request's own text, not its diff, because that is
* where a carry declares itself.
*/

const CARRY_VERB_RE =
/\b(?:re-?implement(?:s|ed|ing|ation of)?|supersed(?:e|es|ed|ing)|carry(?: of)?|carries|carrying|carried(?: from)?|rebase(?: of)?|rebasing|adopts the design from)\b/gi;

/**
* Every reference in one window, keeping any owner/repo qualifier.
*
* A bare "#2797" means this repository. "other/project#2797" does not, and
* resolving it here would look up an unrelated pull request of the same number
* in this one -- comparing the trailer against the wrong person. Qualified
* references are captured so they can be dropped rather than misread.
*/
const REF_RE = /(?:([\w.-]+\/[\w.-]+))?#(\d+)/g;

/**
* The window a carry verb governs: to the end of its sentence, capped at 80
* characters. Both bounds are load-bearing.
*
* The sentence bound is why "Supersedes #3193. Fixes #3192." reports only
* #3193 -- that is 53c09a247's real body, and a fixed-width window would have
* pulled the issue it closes into the carry set and demanded a trailer for the
* reporter. The width cap is why a verb cannot reach across a paragraph into an
* unrelated reference list.
*/
const SENTENCE_END_RE = /[.!?](?:\s|$)|\n/;

function carryWindow(text, from) {
const slice = text.slice(from, from + 80);
const end = slice.search(SENTENCE_END_RE);
return end === -1 ? slice : slice.slice(0, end);
}

const TRAILER_RE = /^[ \t]*co-authored-by:[ \t]*(.+)$/gim;

const FENCED_CODE_RE = /^[ \t]*(\u0060{3,}|~{3,})[\s\S]*?^[ \t]*\1[ \t]*$/gm;
const INLINE_CODE_RE = /\u0060[^\u0060\n]*\u0060/g;
/**
* HTML comments, which GitHub never renders.
*
* The `(?:-->|$)` alternative is load-bearing and matches `pr-quality.cjs`: an
* UNCLOSED comment runs to the end of the text, because that is what GitHub
* does with it. Without the alternative, `<!--` with no terminator matched
* nothing, so everything after it stayed in the scanned text while GitHub
* rendered none of it — an author could write a carry claim that the gate reads
* and no human ever sees, or bury one the gate misses in text that renders.
* Either direction is a divergence between what is enforced and what is shown.
*
* CodeQL flagged the same shape as `js/incomplete-multi-character-sanitization`
* on #3342. The alert's own framing (HTML element injection) does not apply —
* this output is matched by regex, never rendered — but the underlying
* observation, that the strip is incomplete, is correct for this gate's purpose.
*/
const HTML_COMMENT_RE = /<!--[\s\S]*?(?:-->|$)/g;

/**
* Carry language inside a fenced block, an inline span, or an HTML comment is
* quoted material, not a declaration. A pull request that explains the gate
* itself -- this one does -- must not trip it.
*/
function strippedText(text) {
if (typeof text !== "string") return "";
return text
.replace(FENCED_CODE_RE, "")
.replace(HTML_COMMENT_RE, "")
.replace(INLINE_CODE_RE, "");
}

function hasLabel(labels, name) {
return (labels || []).some(
(label) => (typeof label === "string" ? label : label?.name) === name,
);
}

/** Pull request numbers this text claims to carry, supersede, or rebase. */
function referencedCarryNumbers(...texts) {
const found = new Set();
for (const text of texts) {
const stripped = strippedText(text);
CARRY_VERB_RE.lastIndex = 0;
let verb;
while ((verb = CARRY_VERB_RE.exec(stripped)) !== null) {
const window = carryWindow(stripped, verb.index + verb[0].length);
REF_RE.lastIndex = 0;
let ref;
while ((ref = REF_RE.exec(window)) !== null) {
// A qualified reference names a pull request in another repository.
if (ref[1]) continue;
found.add(Number(ref[2]));
}
}
}
return found;
}

function trailerValues(...texts) {
const values = [];
for (const text of texts) {
if (typeof text !== "string") continue;
TRAILER_RE.lastIndex = 0;
let match;
while ((match = TRAILER_RE.exec(text)) !== null) values.push(match[1].toLowerCase());
}
return values;
}

/**
* A GitHub login is not a git identity. The scan behind CREDITS.md produced
* eleven false positives from that assumption alone: a login like "asmith92"
* does not appear anywhere in a trailer that reads "A. Smith <a@example.com>",
* even though they are the same person. Match on any of the three identifiers
* the referenced pull request actually carries.
*/
function parseTrailer(value) {
const match = /^\s*(.*?)\s*<([^>]*)>\s*$/.exec(value);
if (match) return { name: match[1].toLowerCase(), email: match[2].toLowerCase() };
return { name: value.trim().toLowerCase(), email: "" };
}

/**
* Substring matching is not good enough here, and the failure is not exotic:
* an author named "Ann" would be satisfied by "Co-authored-by: Joanne
* <other@example.com>", and a short login can appear inside an unrelated
* address. A trailer credits someone only when its name or its email equals an
* identifier the referenced pull request actually carries.
*/
function trailerNames(author, trailers) {
if (!author) return true;
const names = new Set(
[author.login, ...(author.names || [])]
.filter((value) => typeof value === "string" && value.trim() !== "")
.map((value) => value.trim().toLowerCase()),
);
const emails = new Set(
(author.emails || [])
.filter((value) => typeof value === "string" && value.trim() !== "")
.map((value) => value.trim().toLowerCase()),
);
if (names.size === 0 && emails.size === 0) return true;
return trailers.some(
(trailer) =>
(trailer.name !== "" && names.has(trailer.name)) ||
(trailer.email !== "" && emails.has(trailer.email)) ||
// A GitHub noreply address carries the login after the numeric id,
// before the "@" -- that is the only identifier many trailers have.
(trailer.email.endsWith("@users.noreply.github.com") &&
names.has(trailer.email.replace(/^[^@]*?(\d+\+)?/, "").split("@")[0])),
);
}

/**
* @returns {{ code: string, paths: string[] }[]} empty when the pull request may proceed
*/
function assessCarryAttribution({
prAuthorLogin = "",
title = "",
body = "",
commits = [],
labels = [],
referencedAuthors = {},
} = {}) {
if (hasLabel(labels, "attribution-approved")) return [];

const referenced = referencedCarryNumbers(title, body, ...commits);
if (referenced.size === 0) return [];

// The squash body is assembled from the pull request body and the branch's
// commit messages, so both are where an author can put the trailer today.
const trailers = trailerValues(body, ...commits).map(parseTrailer);
const uncredited = [];

for (const number of referenced) {
const author = referencedAuthors[number];
// An unresolved author is a pass. A rate limit or a deleted account must
// never be the reason a merge is blocked.
if (!author) continue;
// Referencing your own earlier branch is ordinary maintenance.
if (
author.login &&
prAuthorLogin &&
author.login.toLowerCase() === prAuthorLogin.toLowerCase()
) {
continue;
}
if (!trailerNames(author, trailers)) uncredited.push("#" + number);
}

if (uncredited.length === 0) return [];
return [
{
code: "missing_coauthor_credit",
paths: uncredited.sort(),
},
];
}

module.exports = {
CARRY_VERB_RE,
carryWindow,
assessCarryAttribution,
referencedCarryNumbers,
strippedText,
trailerValues,
};
Loading
Loading