@yansigit/opencodex 2.36.1 → 2.36.2-dev.20260829.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +9 -4
  2. package/gui/dist/assets/{ApiKeys-CsmNyf4I.js → ApiKeys-BhwqQvO8.js} +1 -1
  3. package/gui/dist/assets/{Claude-B4sHsGTD.js → Claude-DYNY8SHC.js} +1 -1
  4. package/gui/dist/assets/{CodexSet-BuAQ4YQn.js → CodexSet-tSN1aWmM.js} +1 -1
  5. package/gui/dist/assets/{FileIntegrationPage-BC65sEaS.js → FileIntegrationPage-B68tn2JT.js} +1 -1
  6. package/gui/dist/assets/{Grok-DNJWlISf.js → Grok-Dr6FN8SD.js} +1 -1
  7. package/gui/dist/assets/{Integrations-vGJshFZK.js → Integrations-jvqYofMm.js} +2 -2
  8. package/gui/dist/assets/{IntegrationsOverview-DYMkDFHE.js → IntegrationsOverview-Bjc7JSgw.js} +1 -1
  9. package/gui/dist/assets/{Logs-Coc7_RPP.js → Logs-C23CdgmP.js} +1 -1
  10. package/gui/dist/assets/{Models-CKVT8Meb.js → Models-Ci4wK3HO.js} +1 -1
  11. package/gui/dist/assets/{NumberStepper-Dug4wR8n.js → NumberStepper-nggECFok.js} +1 -1
  12. package/gui/dist/assets/Providers-DasIL4ng.js +1 -0
  13. package/gui/dist/assets/{RestoreDialog-BpuvVU2w.js → RestoreDialog-CW7LbS-w.js} +1 -1
  14. package/gui/dist/assets/{Startup-DAUQqNEN.js → Startup-Cx3dZre0.js} +1 -1
  15. package/gui/dist/assets/{Storage-DfP95SlJ.js → Storage-D0iUYQED.js} +1 -1
  16. package/gui/dist/assets/{Subagents-CMNsZLfk.js → Subagents-phLFffyl.js} +1 -1
  17. package/gui/dist/assets/{Usage-ESFRfBMO.js → Usage-NvYxG04o.js} +1 -1
  18. package/gui/dist/assets/{codex-stale-banner-W4FhikN7.js → codex-stale-banner-B5VQPO3t.js} +1 -1
  19. package/gui/dist/assets/{data-surface-B8PX8rjm.js → data-surface-B0APtUxm.js} +1 -1
  20. package/gui/dist/assets/{data-surface-CETFXqiA.js → data-surface-OiQUZok8.js} +1 -1
  21. package/gui/dist/assets/index-C8flH881.css +1 -0
  22. package/gui/dist/assets/{index-DHQHBRhb.js → index-CZ1jyQCF.js} +3 -3
  23. package/gui/dist/assets/{model-display-OBTJhQwT.js → model-display-Dlrzica2.js} +1 -1
  24. package/gui/dist/assets/{provider-payload-CJRJUn7w.js → provider-payload-Ca3Ff8oP.js} +1 -1
  25. package/gui/dist/assets/{section-tabs-B8sLMiz6.js → section-tabs-Bpm5lFcZ.js} +1 -1
  26. package/gui/dist/assets/shared-BHpPx-nZ.js +69 -0
  27. package/gui/dist/index.html +3 -3
  28. package/package.json +2 -1
  29. package/src/adapters/base.ts +2 -0
  30. package/src/adapters/command-code.ts +2 -1
  31. package/src/adapters/google-http.ts +34 -14
  32. package/src/adapters/google.ts +4 -1
  33. package/src/cli/dispatch.ts +2 -2
  34. package/src/cli/help.ts +2 -2
  35. package/src/cli/index.ts +9 -1
  36. package/src/cli/init.ts +52 -3
  37. package/src/cli/registry.ts +2 -2
  38. package/src/codex/account-lifecycle.ts +4 -8
  39. package/src/codex/inject.ts +14 -9
  40. package/src/config/process-state.ts +15 -0
  41. package/src/config.ts +17 -0
  42. package/src/generated/compatibility-version.json +67 -47
  43. package/src/lib/bun-stream-caps.ts +2 -1
  44. package/src/lib/pinned-http.ts +7 -1
  45. package/src/lib/process-control.ts +3 -2
  46. package/src/lib/provider-outbound.ts +77 -27
  47. package/src/lib/provider-runtime-fetch.ts +23 -0
  48. package/src/lib/provider-tls-profile.ts +97 -11
  49. package/src/lib/server-tls.ts +47 -0
  50. package/src/lib/test-provider-fetch.ts +6 -0
  51. package/src/lib/test-server-start.ts +5 -0
  52. package/src/lib/upstream-retry.ts +39 -25
  53. package/src/oauth/anthropic.ts +4 -3
  54. package/src/oauth/chatgpt.ts +7 -3
  55. package/src/oauth/command-code.ts +3 -2
  56. package/src/oauth/cursor.ts +3 -2
  57. package/src/oauth/github-copilot.ts +7 -5
  58. package/src/oauth/google-antigravity.ts +5 -4
  59. package/src/oauth/key-providers.ts +11 -13
  60. package/src/oauth/kimi.ts +7 -6
  61. package/src/oauth/kiro.ts +3 -2
  62. package/src/oauth/nous.ts +5 -5
  63. package/src/oauth/transport.ts +77 -0
  64. package/src/oauth/xai.ts +5 -4
  65. package/src/providers/replit/probe.ts +8 -3
  66. package/src/providers/xai-transport.ts +16 -2
  67. package/src/server/auth-cors.ts +15 -1
  68. package/src/server/chat-native.ts +9 -3
  69. package/src/server/index.ts +63 -23
  70. package/src/server/management/config-routes.ts +117 -15
  71. package/src/server/management/context.ts +4 -0
  72. package/src/server/management/provider-routes.ts +1 -0
  73. package/src/server/responses/compact.ts +5 -2
  74. package/src/server/responses/core.ts +16 -19
  75. package/src/server/responses/fetch-helpers.ts +15 -7
  76. package/src/server/ws-bridge.ts +33 -4
  77. package/src/service.ts +10 -1
  78. package/src/types/config.ts +9 -0
  79. package/src/types/provider.ts +2 -0
  80. package/src/types.ts +1 -0
  81. package/gui/dist/assets/Providers-DyaCHRWL.js +0 -1
  82. package/gui/dist/assets/index-pLho_LBF.css +0 -1
  83. package/gui/dist/assets/shared-DI18-uF7.js +0 -69
@@ -10,7 +10,7 @@
10
10
  },
11
11
  {
12
12
  "path": "package.json",
13
- "sha256": "386cbf136df4cfea377839680ef5b85b3962298770bed851d7b6d37feac97909"
13
+ "sha256": "156bbb9f877255eab4dcfc8cd19e12f9a5a5af868c32cd46aa2665873afec641"
14
14
  },
15
15
  {
16
16
  "path": "scripts/model-metadata.source.json",
@@ -42,7 +42,7 @@
42
42
  },
43
43
  {
44
44
  "path": "src/adapters/base.ts",
45
- "sha256": "00e88baa1254946252302ddfb32445e2cd41ab583b13a37576a05c46ac6c00b8"
45
+ "sha256": "59018d233c0a70e7a613656a9e4ce5c3ab5208fe08f4e845ce211f0391f83b37"
46
46
  },
47
47
  {
48
48
  "path": "src/adapters/client-fingerprint.ts",
@@ -58,7 +58,7 @@
58
58
  },
59
59
  {
60
60
  "path": "src/adapters/command-code.ts",
61
- "sha256": "ccd77fc6c00ca0010272b2338889ca1026324d634f86329c5b0c0f67d87ca402"
61
+ "sha256": "c2f9a925833acd4b2971b646b1581d017c7999ca5a8b0834952a817de4996684"
62
62
  },
63
63
  {
64
64
  "path": "src/adapters/cursor.ts",
@@ -258,7 +258,7 @@
258
258
  },
259
259
  {
260
260
  "path": "src/adapters/google-http.ts",
261
- "sha256": "83768c8cd3368e55ba6cc2a36c0551fbc67fb94534d27c5bb27e3d7de2dcdf50"
261
+ "sha256": "179dc34fce6ea619ffe38404ab99351aacaa8b22170810177952f3779e6bcf12"
262
262
  },
263
263
  {
264
264
  "path": "src/adapters/google-tool-schema.ts",
@@ -274,7 +274,7 @@
274
274
  },
275
275
  {
276
276
  "path": "src/adapters/google.ts",
277
- "sha256": "f3e4cf72d4fae4f41c33271bf4c2bded5a67b38b3576763e6a388549aaaee9d4"
277
+ "sha256": "eb65eaabbf50f09cc63e25cd182932a0349f3d20154fd28a7b8d072c6523426e"
278
278
  },
279
279
  {
280
280
  "path": "src/adapters/identity.ts",
@@ -550,7 +550,7 @@
550
550
  },
551
551
  {
552
552
  "path": "src/cli/dispatch.ts",
553
- "sha256": "06d982ffba1599a6c8cd897144565b6d71053152b450fd87b76616c15662cedf"
553
+ "sha256": "ca099eb0448c5819a2068e6f03fdf4a721727730301c056c2ecea5d4b66a7761"
554
554
  },
555
555
  {
556
556
  "path": "src/cli/doctor.ts",
@@ -566,15 +566,15 @@
566
566
  },
567
567
  {
568
568
  "path": "src/cli/help.ts",
569
- "sha256": "ef9c993e060dbc16abd858043ff774cda53cf2f4b9edd062279274a34f85e1a9"
569
+ "sha256": "ecc54bce59d6cb85e09c4c818fb67ea7b0b102e59af2b243218704f14e1c7685"
570
570
  },
571
571
  {
572
572
  "path": "src/cli/index.ts",
573
- "sha256": "6c262f1430b49b24144722c34faa65d9fd56626aae43593cf21d838ffdeb5cca"
573
+ "sha256": "001dc7d88c130ceb9ba15a81ecb032b9f6da7bb668fa774f98761f5ab752b1b5"
574
574
  },
575
575
  {
576
576
  "path": "src/cli/init.ts",
577
- "sha256": "ced149008c298c1167f8e710055ec5a293522e81dcc9e3bba2c8049dd32d3ec5"
577
+ "sha256": "4973aac25d36955b827c207d59a81e709ec165982537ecca0520ffbad931c816"
578
578
  },
579
579
  {
580
580
  "path": "src/cli/inspect.ts",
@@ -634,7 +634,7 @@
634
634
  },
635
635
  {
636
636
  "path": "src/cli/registry.ts",
637
- "sha256": "a736410fb02d3e57f42c8bc017c85432c49e302c2c7a6d9b084c45f3b215d1b4"
637
+ "sha256": "53fa757386d8bd2bb14d32dc07a2a5ce91bc71052ad3baf04c5490ef5c39c2da"
638
638
  },
639
639
  {
640
640
  "path": "src/cli/replit-gateway-key-input.ts",
@@ -710,7 +710,7 @@
710
710
  },
711
711
  {
712
712
  "path": "src/codex/account-lifecycle.ts",
713
- "sha256": "1cadb7614d15fa60dea718cfc9cf8845c86416054b16b1f93d52a579f0531c9a"
713
+ "sha256": "6b9032744db6b95f2ac0f1ebb92a568877ce6541643d111226cd0ff0e5c9a173"
714
714
  },
715
715
  {
716
716
  "path": "src/codex/account-namespace-match.ts",
@@ -926,7 +926,7 @@
926
926
  },
927
927
  {
928
928
  "path": "src/codex/inject.ts",
929
- "sha256": "22fe9dc3b8fe3994b921ad619807b899e609834ea69e47c5b9494075327341a2"
929
+ "sha256": "99b541feae9e38c19d52a73a4734605b4db4c968bad8752be7f724776f294c2b"
930
930
  },
931
931
  {
932
932
  "path": "src/codex/injected-marker.ts",
@@ -1198,7 +1198,7 @@
1198
1198
  },
1199
1199
  {
1200
1200
  "path": "src/config.ts",
1201
- "sha256": "ab945b93888473c8165ca9cfe43b5ddca53c01d6de26b5c76b89903471aa7e24"
1201
+ "sha256": "553f844ed9706069e237c02567e7e5b2b6bccb21de0d563e72c0b80758366e68"
1202
1202
  },
1203
1203
  {
1204
1204
  "path": "src/config/atomic-write.ts",
@@ -1214,7 +1214,7 @@
1214
1214
  },
1215
1215
  {
1216
1216
  "path": "src/config/process-state.ts",
1217
- "sha256": "0401a50d89603bab9d638b3e074989b6f07637511d3569833cfa96c916e00ce0"
1217
+ "sha256": "b03935508769df6ccb55b893997b34bbb48e9efd1ce69093e255dff2e3ec5076"
1218
1218
  },
1219
1219
  {
1220
1220
  "path": "src/config/provider-name.ts",
@@ -1878,7 +1878,7 @@
1878
1878
  },
1879
1879
  {
1880
1880
  "path": "src/lib/bun-stream-caps.ts",
1881
- "sha256": "d2255a860bc9ea451abc7913cca76779c41656d35965d80ce10c63ad94e032aa"
1881
+ "sha256": "dac6d3f1dc5a276ad33815d586f08a1e4481a187d9f3862f0f1b6b498249f24b"
1882
1882
  },
1883
1883
  {
1884
1884
  "path": "src/lib/codex-restart-contract.ts",
@@ -1982,7 +1982,7 @@
1982
1982
  },
1983
1983
  {
1984
1984
  "path": "src/lib/pinned-http.ts",
1985
- "sha256": "ac1cd748e53b16109aaae86194fddac88424b508f00bb2e7c7090869f58c9b22"
1985
+ "sha256": "a363fbb9276b6b807c886c26a58710f6def807e800d0eec2811e7bf90fae3752"
1986
1986
  },
1987
1987
  {
1988
1988
  "path": "src/lib/privacy.ts",
@@ -1990,15 +1990,19 @@
1990
1990
  },
1991
1991
  {
1992
1992
  "path": "src/lib/process-control.ts",
1993
- "sha256": "1b48b8040679bcf0fd0128aaeee98bd354ae657663b207820b96bd8b573bfec1"
1993
+ "sha256": "8e906a7a70625025658e6277a20bf2dd0dbf43f37ab3cbb46d5c7bb00ea26c87"
1994
1994
  },
1995
1995
  {
1996
1996
  "path": "src/lib/provider-outbound.ts",
1997
- "sha256": "a1c8576d95e888a92c0f3ae4ca6741e92848ee9bb7dfb4d71f6522108f8b4da2"
1997
+ "sha256": "697a87707334d57da0eb41e70c8e0367778444cc37c670e7bd1b30ec75245c17"
1998
+ },
1999
+ {
2000
+ "path": "src/lib/provider-runtime-fetch.ts",
2001
+ "sha256": "3009c0cd8d142478dc5d0034150266cd03eceebe82eb9743f7417fb4cce7655a"
1998
2002
  },
1999
2003
  {
2000
2004
  "path": "src/lib/provider-tls-profile.ts",
2001
- "sha256": "4dc211524270f8e5b25febefaeb8eb496d2d455e95cb1b3392e79db47622084c"
2005
+ "sha256": "80eebfde40c4fb08e78649bd00751cf3e0bf97474fd5cf7e41323cfbf1038bd5"
2002
2006
  },
2003
2007
  {
2004
2008
  "path": "src/lib/provider-url.ts",
@@ -2024,6 +2028,10 @@
2024
2028
  "path": "src/lib/server-resource-ownership.ts",
2025
2029
  "sha256": "8248c3758eccbc6abc9150fe041e89fb2d05f114f9fc26cb1fb70a6c3b7403ed"
2026
2030
  },
2031
+ {
2032
+ "path": "src/lib/server-tls.ts",
2033
+ "sha256": "eb9db8a459e1ea7884fbb83a51ebc2c9e64d132ddd5543b20f63b90c63a3ea8d"
2034
+ },
2027
2035
  {
2028
2036
  "path": "src/lib/service-secrets.ts",
2029
2037
  "sha256": "2294a011014c249adea0571a1b8e9ce51d76b7c59e654bf9795f360d7ee1b53e"
@@ -2056,6 +2064,14 @@
2056
2064
  "path": "src/lib/test-home-guard.ts",
2057
2065
  "sha256": "da554cdbad6dcadc4bfac238eea77e71629c53b28232017756d8546df92d9603"
2058
2066
  },
2067
+ {
2068
+ "path": "src/lib/test-provider-fetch.ts",
2069
+ "sha256": "ee6111d9f7710be7341cf1fd7c9502c375277a0c1b26de0ccf76c7bd054d8529"
2070
+ },
2071
+ {
2072
+ "path": "src/lib/test-server-start.ts",
2073
+ "sha256": "bbd67095589096c185f22310bc581a0604eaa59e094d595149bfa1ccaa9507ae"
2074
+ },
2059
2075
  {
2060
2076
  "path": "src/lib/token-estimate.ts",
2061
2077
  "sha256": "c90473299655c86ef0118f5a265a71c100bf92e52172d6464a16c8f6ea300ca5"
@@ -2078,7 +2094,7 @@
2078
2094
  },
2079
2095
  {
2080
2096
  "path": "src/lib/upstream-retry.ts",
2081
- "sha256": "520d6f4b0630d31fe3180055b80f60ae6c7e196b5eb6ecc2ab1181b911c91b9d"
2097
+ "sha256": "61201107a882045f524f0739f45ddc1b3a17dce8b633337e78c634082e418c24"
2082
2098
  },
2083
2099
  {
2084
2100
  "path": "src/lib/win-exec.ts",
@@ -2158,7 +2174,7 @@
2158
2174
  },
2159
2175
  {
2160
2176
  "path": "src/oauth/anthropic.ts",
2161
- "sha256": "e09817a0f46855c12678bb919d01611f5815357ace010940c67533945a0eff62"
2177
+ "sha256": "ecb556d5873dd001c32f5fd928106191744615c5486836aa5b0d80fbca3e4cdb"
2162
2178
  },
2163
2179
  {
2164
2180
  "path": "src/oauth/antigravity-routing.ts",
@@ -2170,11 +2186,11 @@
2170
2186
  },
2171
2187
  {
2172
2188
  "path": "src/oauth/chatgpt.ts",
2173
- "sha256": "96bb2c747effa78b35d8a7d8f61647ee3c190a852077e29cdc3d7b6a36dd8d1f"
2189
+ "sha256": "afe0ab0ea17fba30567da47a810369882f6d2842e5c23cd2f001ca88ae863c8b"
2174
2190
  },
2175
2191
  {
2176
2192
  "path": "src/oauth/command-code.ts",
2177
- "sha256": "2894d55a6c2fc644f76a003897893e5fd833887e312b971b772ce1ee3f24a650"
2193
+ "sha256": "aaff68e4240b6154ecf88ea4ca96469c26c77b79f462a75f81685642510246e9"
2178
2194
  },
2179
2195
  {
2180
2196
  "path": "src/oauth/cursor-routing.ts",
@@ -2182,7 +2198,7 @@
2182
2198
  },
2183
2199
  {
2184
2200
  "path": "src/oauth/cursor.ts",
2185
- "sha256": "afc515c357f5bc9f788c07e40a0a1fce6ef3d9887759906e5a48113a720d5673"
2201
+ "sha256": "9b5225d7b195cd0ecc5da2bddcfaa30915110d8c9566c88ea813fe83aa32a5a1"
2186
2202
  },
2187
2203
  {
2188
2204
  "path": "src/oauth/generic-account-failover.ts",
@@ -2190,7 +2206,7 @@
2190
2206
  },
2191
2207
  {
2192
2208
  "path": "src/oauth/github-copilot.ts",
2193
- "sha256": "e0bfa9fa518ffc9b04ec81090540cf614ca217ca7ca3f356bc6f74efb6b1e38f"
2209
+ "sha256": "f7b3dfb84a78733d5c90ca962d392d97d0cc74baf9934ab1e6f3dcaebf71abad"
2194
2210
  },
2195
2211
  {
2196
2212
  "path": "src/oauth/google-aistudio-auth.ts",
@@ -2198,7 +2214,7 @@
2198
2214
  },
2199
2215
  {
2200
2216
  "path": "src/oauth/google-antigravity.ts",
2201
- "sha256": "a5546286e647862c4b6be097495e10ec75ba0026f4c20ab8cb277c1d2697893d"
2217
+ "sha256": "3ca27e7b3325efa6e01f0d499b49e4375184ad0a5299552282e46fc2784db69e"
2202
2218
  },
2203
2219
  {
2204
2220
  "path": "src/oauth/health.ts",
@@ -2210,11 +2226,11 @@
2210
2226
  },
2211
2227
  {
2212
2228
  "path": "src/oauth/key-providers.ts",
2213
- "sha256": "dde0a01280fc4b58fe0b58bb14e2a5efbaf417eaf6dd1ec4c163d50ad6681b84"
2229
+ "sha256": "45636c0ce520a26111f8e2e84999b15c124a1cd9151a84ce693fcc77a7d67d5d"
2214
2230
  },
2215
2231
  {
2216
2232
  "path": "src/oauth/kimi.ts",
2217
- "sha256": "cbbd772bfcf74c1bf6357d494b1b87034c59fbc9ebeda0ccc93e31df431d4a30"
2233
+ "sha256": "a1676c8db242db6295d2c0d6c4fc634cbbbdd8385d0563c520bd5f5fb43eab75"
2218
2234
  },
2219
2235
  {
2220
2236
  "path": "src/oauth/kiro-credentials.ts",
@@ -2222,7 +2238,7 @@
2222
2238
  },
2223
2239
  {
2224
2240
  "path": "src/oauth/kiro.ts",
2225
- "sha256": "81cf6027776e471bf1cfa5122b79e8fb8db7492e905f1521ebc7edcea7861231"
2241
+ "sha256": "8ad77d0dcbf3621a345597bedb404b1ff3e090518d7f49e36d275120e307bc18"
2226
2242
  },
2227
2243
  {
2228
2244
  "path": "src/oauth/local-token-detect.ts",
@@ -2238,7 +2254,7 @@
2238
2254
  },
2239
2255
  {
2240
2256
  "path": "src/oauth/nous.ts",
2241
- "sha256": "49fb089b01a8a118e575069d2308912b7fd661ef882913193b0e9f4d8df28201"
2257
+ "sha256": "d2f9b76fc83eec366a2d7e3f41c6082e06f4996790df9a3ad64797bc69e8c395"
2242
2258
  },
2243
2259
  {
2244
2260
  "path": "src/oauth/open-browser-choice.ts",
@@ -2256,13 +2272,17 @@
2256
2272
  "path": "src/oauth/token-guardian.ts",
2257
2273
  "sha256": "61ab6a126dfec880425247cbe1c09ae387777f5a44cadfd47a96f59b6faf3274"
2258
2274
  },
2275
+ {
2276
+ "path": "src/oauth/transport.ts",
2277
+ "sha256": "7b169a87f47cbede9ef9a83e7509a89d469ddea4bd2a696947db72859ccbfff3"
2278
+ },
2259
2279
  {
2260
2280
  "path": "src/oauth/types.ts",
2261
2281
  "sha256": "4d73927bc99a8363297d6e213fc076c498f524f9400c163e0e6a7c8bfc1a1fe6"
2262
2282
  },
2263
2283
  {
2264
2284
  "path": "src/oauth/xai.ts",
2265
- "sha256": "4dad067c9efba0a966621f94da96decc3b5bc35cf4e076536eced0abb9fa8c88"
2285
+ "sha256": "180f3722ed6150f3bd7516e90793dc75957239ef983b5183be72d7f70120b192"
2266
2286
  },
2267
2287
  {
2268
2288
  "path": "src/providers/alibaba-region-backup.ts",
@@ -2430,7 +2450,7 @@
2430
2450
  },
2431
2451
  {
2432
2452
  "path": "src/providers/replit/probe.ts",
2433
- "sha256": "1b80b009dcaee74f418988465b98169f6fbd317797e9c3a1feef4dc2404be7bb"
2453
+ "sha256": "de93c3d11ce2433769d9c476f438223c9e899739987680367241106990280602"
2434
2454
  },
2435
2455
  {
2436
2456
  "path": "src/providers/replit/setup.ts",
@@ -2458,7 +2478,7 @@
2458
2478
  },
2459
2479
  {
2460
2480
  "path": "src/providers/xai-transport.ts",
2461
- "sha256": "1ac6638465ad2b2a36603ee36aa53176474f9c6ca3253db0a43933ed7b20371d"
2481
+ "sha256": "cae0b92dbabb22ebdfa3ede93b68234cf5159808297d31de7015a11fd6eedd50"
2462
2482
  },
2463
2483
  {
2464
2484
  "path": "src/reasoning-effort.ts",
@@ -2670,7 +2690,7 @@
2670
2690
  },
2671
2691
  {
2672
2692
  "path": "src/server/auth-cors.ts",
2673
- "sha256": "21cb735d7983be6e9f7666a887ea5c58509b32e4ea95cb6392720e9c6d6fc988"
2693
+ "sha256": "3f99dc1c0ab291269b0c7b7e2dff56f41f80fe388a69c4a114de871029a074ed"
2674
2694
  },
2675
2695
  {
2676
2696
  "path": "src/server/background-lifecycle.ts",
@@ -2686,7 +2706,7 @@
2686
2706
  },
2687
2707
  {
2688
2708
  "path": "src/server/chat-native.ts",
2689
- "sha256": "9af301cd743f2501d271f083bb54e1f9bea10c11bb2ac6286542051ab442f6e8"
2709
+ "sha256": "6581fb3a76b0e14d4f274494a0072cddd7f06f565ade314757bc3e1f0ae8a676"
2690
2710
  },
2691
2711
  {
2692
2712
  "path": "src/server/claude-messages.ts",
@@ -2718,7 +2738,7 @@
2718
2738
  },
2719
2739
  {
2720
2740
  "path": "src/server/index.ts",
2721
- "sha256": "748a821368960a58228937a15582cb05a087bcc438849d367dc74c05eb5dbf6c"
2741
+ "sha256": "aac79178e0b42ac34c44a653e5ce8549872b940029fcb442b51ed1e1782c75fb"
2722
2742
  },
2723
2743
  {
2724
2744
  "path": "src/server/lifecycle.ts",
@@ -2770,11 +2790,11 @@
2770
2790
  },
2771
2791
  {
2772
2792
  "path": "src/server/management/config-routes.ts",
2773
- "sha256": "090f6f7ba1d80d2d23fc090134fa6dc4e7114a646d3c41dd4b08eb137255964a"
2793
+ "sha256": "8c081f833a90272aece21bad4b24a422062bd60682bf758dd107337d8f3158b7"
2774
2794
  },
2775
2795
  {
2776
2796
  "path": "src/server/management/context.ts",
2777
- "sha256": "13dfe2bb83ddc157d53b5e5e9340a677d9a80fbf0209f63d8598a8e9da44f269"
2797
+ "sha256": "5f848d9659be27b9be820a8d9ba35165cf158a32880031ce40a4422dc12e5ace"
2778
2798
  },
2779
2799
  {
2780
2800
  "path": "src/server/management/integration-routes.ts",
@@ -2814,7 +2834,7 @@
2814
2834
  },
2815
2835
  {
2816
2836
  "path": "src/server/management/provider-routes.ts",
2817
- "sha256": "7abf9c86655670bc2de1383577b85e1a4cac5e92447d2a77421820e3126a2d97"
2837
+ "sha256": "de8acf5e2bae0daa09cbb5dc5c602ae469a1b149f9704faf3b6fe9a14bea945a"
2818
2838
  },
2819
2839
  {
2820
2840
  "path": "src/server/management/replit-provider-routes.ts",
@@ -2982,11 +3002,11 @@
2982
3002
  },
2983
3003
  {
2984
3004
  "path": "src/server/responses/compact.ts",
2985
- "sha256": "3b1027396757b2771702449bccd5f5ea9eb8826945fee0b8f6c8f1f98e9635e1"
3005
+ "sha256": "6be3d086b7796426787120cc0e76e3a3f2aacddb841af389aee885a75622ea8b"
2986
3006
  },
2987
3007
  {
2988
3008
  "path": "src/server/responses/core.ts",
2989
- "sha256": "abdf102878d968d337a871bee32106f25cf3434a67d1e2669c1109b6bede9687"
3009
+ "sha256": "5da1a9f0fe0f8fc397c50c099adb77360d532e40a87858a45489f61735a938d5"
2990
3010
  },
2991
3011
  {
2992
3012
  "path": "src/server/responses/empty-completion-guard.ts",
@@ -2998,7 +3018,7 @@
2998
3018
  },
2999
3019
  {
3000
3020
  "path": "src/server/responses/fetch-helpers.ts",
3001
- "sha256": "951153aa7dd15eeab8ec4d157013b246d1ae3116e91d7126d8ecd54bba4d538c"
3021
+ "sha256": "68f46232edbdf21cf592793341817dddc92cd31631c458d0d600f3fe4d57266b"
3002
3022
  },
3003
3023
  {
3004
3024
  "path": "src/server/responses/input-admission.ts",
@@ -3074,7 +3094,7 @@
3074
3094
  },
3075
3095
  {
3076
3096
  "path": "src/server/ws-bridge.ts",
3077
- "sha256": "0f7ea03225ddd992fad14dab1dda99a3890a380061f99f0e94fb05efb33e421f"
3097
+ "sha256": "8a15128a892fd89f7ed02f24489a2f3d417bb4c137f08cb3f52d4b94a303a5eb"
3078
3098
  },
3079
3099
  {
3080
3100
  "path": "src/service-manager-probe.ts",
@@ -3082,7 +3102,7 @@
3082
3102
  },
3083
3103
  {
3084
3104
  "path": "src/service.ts",
3085
- "sha256": "03739ace3f831125620b1653c0549d693e4ae67ebd6502604db439b86f38dc35"
3105
+ "sha256": "37313ff096a4407ebf24d9d101dd68e7cd1e7243e4f3b1cba6650a390f7e71e3"
3086
3106
  },
3087
3107
  {
3088
3108
  "path": "src/sidecar/auth.ts",
@@ -3202,7 +3222,7 @@
3202
3222
  },
3203
3223
  {
3204
3224
  "path": "src/types.ts",
3205
- "sha256": "52a9a716b71144a484f6b4cd464fce8331860a24c0f852234bf6e0fec2f573c3"
3225
+ "sha256": "a1e341023c239f28c0c576c368ebfc2cacc1ce27d8ef71afe28455d4cff5ae86"
3206
3226
  },
3207
3227
  {
3208
3228
  "path": "src/types/accounts.ts",
@@ -3210,11 +3230,11 @@
3210
3230
  },
3211
3231
  {
3212
3232
  "path": "src/types/config.ts",
3213
- "sha256": "2947399e84229ff915fbe1677b4b29ddefafbde0cf42a10bdb130460fa1715fd"
3233
+ "sha256": "25dc149222b5fca494828091dfe47f835173b27c95320094a595295cd1bc06b7"
3214
3234
  },
3215
3235
  {
3216
3236
  "path": "src/types/provider.ts",
3217
- "sha256": "e937e0f60553ce3ac100343dff5f911516e667e96869e991c1a7017ed0262da4"
3237
+ "sha256": "4b8412a256df4b69e8947c3e501c919dad20752fca63bc9cf3403eb02ff2c122"
3218
3238
  },
3219
3239
  {
3220
3240
  "path": "src/types/request.ts",
@@ -106,11 +106,12 @@ export function selectEagerPath(
106
106
  version: string = Bun.version,
107
107
  minFixed: string | null = MIN_FIXED_BUN_VERSION,
108
108
  ): EagerRelayDecision | null {
109
- if (platform !== "win32" && platform !== "darwin") {
109
+ if (platform !== "win32" && platform !== "darwin" && platform !== "linux") {
110
110
  return null;
111
111
  }
112
112
 
113
113
  const decision = decideEagerRelay(mode, version, minFixed);
114
+ if (platform === "linux") return decision;
114
115
  if (platform === "win32") return needsClientRewrite ? null : decision;
115
116
  return decision.reason === "config-eager" ? decision : null;
116
117
  }
@@ -173,7 +173,10 @@ function pinnedHttpRequest(
173
173
  failBody(new PinnedHttpError("output_byte_limit", `${context} exceeds ${maxBytes} byte cap`));
174
174
  return;
175
175
  }
176
- try { controller.enqueue(buffer); } catch { /* closed */ }
176
+ try {
177
+ controller.enqueue(buffer);
178
+ if ((controller.desiredSize ?? 0) <= 0) response.pause();
179
+ } catch { /* closed */ }
177
180
  });
178
181
  response.on("end", () => {
179
182
  if (bodySettled) return;
@@ -184,6 +187,9 @@ function pinnedHttpRequest(
184
187
  failBody(error);
185
188
  });
186
189
  },
190
+ pull() {
191
+ response.resume();
192
+ },
187
193
  cancel() {
188
194
  req?.destroy();
189
195
  },
@@ -25,7 +25,7 @@ export function waitForExit(pid: number, timeoutMs: number): boolean {
25
25
  /** Injectable seams so the graceful-stop flow is unit-testable without a live proxy. */
26
26
  export interface GracefulStopIo {
27
27
  fetchFn?: typeof fetch;
28
- readRuntime?: (pid: number) => { port: number; hostname?: string } | null;
28
+ readRuntime?: (pid: number) => { port: number; hostname?: string; origin?: string } | null;
29
29
  waitExit?: (pid: number, timeoutMs: number) => boolean;
30
30
  env?: Record<string, string | undefined>;
31
31
  exitTimeoutMs?: number;
@@ -75,7 +75,8 @@ export async function stopProxyGracefully(pid: number, io: GracefulStopIo = {}):
75
75
  if (token) headers["x-opencodex-api-key"] = token;
76
76
  const fetchFn = io.fetchFn ?? fetch;
77
77
  try {
78
- const res = await fetchFn(`http://${gracefulStopHost(runtime.hostname)}:${runtime.port}/api/stop`, {
78
+ const baseUrl = runtime.origin ?? `http://${gracefulStopHost(runtime.hostname)}:${runtime.port}`;
79
+ const res = await fetchFn(`${baseUrl}/api/stop`, {
79
80
  method: "POST",
80
81
  headers,
81
82
  // Hung proxies with many CLOSE_WAIT clients can be slow to accept; give them
@@ -7,20 +7,20 @@ import {
7
7
  resolvePublicAddresses,
8
8
  } from "./destination-policy";
9
9
  import { pinnedHttpGet, pinnedHttpPost } from "./pinned-http";
10
- import { noProxyMatches, outboundProxyConfigured, proxyForUrl } from "./proxy-env";
10
+ import { proxyForUrl } from "./proxy-env";
11
11
  import { publicProviderBaseUrl } from "./provider-url";
12
12
  import { antigravityOAuthDestinationConfigError, isCanonicalAntigravityUrl, providerTlsFetch } from "./provider-tls-profile";
13
13
  import { waitForProviderRequestSlot } from "../providers/request-pacing";
14
+ import { testProviderFetch } from "./test-provider-fetch";
14
15
 
15
16
  type ProviderGetInit = Omit<RequestInit, "body" | "method" | "redirect">;
16
17
  type ProviderPostInit = ProviderGetInit & { body: string };
17
- type ProviderOutboundConfig = Pick<OcxProviderConfig, "baseUrl" | "allowPrivateNetwork"> & Partial<Pick<OcxProviderConfig, "adapter" | "authMode" | "googleMode" | "tlsProfile">> & {
18
- fetch?: typeof globalThis.fetch;
19
- };
18
+ type ProviderOutboundConfig = Pick<OcxProviderConfig, "baseUrl" | "allowPrivateNetwork"> & Partial<Pick<OcxProviderConfig, "adapter" | "authMode" | "googleMode" | "tlsProfile">>;
20
19
  export interface ProviderOutboundDependencies {
21
20
  resolveAddresses?: typeof resolvePublicAddresses;
22
21
  pinnedGet?: typeof pinnedHttpGet;
23
22
  pinnedPost?: typeof pinnedHttpPost;
23
+ fetch?: typeof globalThis.fetch;
24
24
  }
25
25
 
26
26
  export class ProviderOutboundPolicyError extends Error {
@@ -31,10 +31,6 @@ function pickPinnedAddress(addresses: Array<{ address: string; family: number }>
31
31
  return addresses.find(address => address.family === 4) ?? addresses[0]!;
32
32
  }
33
33
 
34
- function configuredProxyFor(): boolean {
35
- return outboundProxyConfigured();
36
- }
37
-
38
34
  function normalizeProxyHostname(hostname: string): string {
39
35
  const normalized = hostname.trim().toLowerCase().replace(/\.+$/, "");
40
36
  return normalized.startsWith("[") && normalized.endsWith("]")
@@ -48,7 +44,6 @@ function antigravityProfileFetch(
48
44
  url: string,
49
45
  ): typeof globalThis.fetch | undefined {
50
46
  if (name !== "google-antigravity"
51
- || provider.fetch
52
47
  || provider.tlsProfile !== "antigravity-browser"
53
48
  || provider.adapter !== "google"
54
49
  || provider.authMode !== "oauth"
@@ -88,12 +83,41 @@ function warnProxyDnsDegradationOnce(): void {
88
83
  export async function providerRedirectError(response: Response, requestUrl: string): Promise<string | null> {
89
84
  if (response.status < 300 || response.status >= 400) return null;
90
85
  try { await response.body?.cancel(); } catch { /* ignore cancellation failures */ }
91
- const location = response.headers.get("location");
92
- let target = "the final upstream URL";
93
- if (location) {
94
- try { target = publicProviderBaseUrl(new URL(location, requestUrl).toString()); } catch { /* keep fallback */ }
86
+ return `provider at ${publicProviderBaseUrl(requestUrl)} returned ${response.status} redirect; configure the final provider URL directly`;
87
+ }
88
+
89
+ async function requireFinalProviderResponse(response: Response, requestUrl: string): Promise<Response> {
90
+ const redirectError = await providerRedirectError(response, requestUrl);
91
+ if (redirectError) throw new ProviderOutboundPolicyError(redirectError);
92
+ return response;
93
+ }
94
+
95
+ const CREDENTIAL_HEADERS = new Set([
96
+ "authorization",
97
+ "proxy-authorization",
98
+ "cookie",
99
+ "x-api-key",
100
+ "x-goog-api-key",
101
+ "x-amz-security-token",
102
+ "x-opencodex-api-key",
103
+ ]);
104
+
105
+ function hasCredentialHeader(headers: HeadersInit | undefined): boolean {
106
+ if (!headers) return false;
107
+ for (const name of new Headers(headers).keys()) {
108
+ const normalized = name.toLowerCase();
109
+ if (CREDENTIAL_HEADERS.has(normalized)
110
+ || /(?:^|-)(?:api-key|access-token|auth-token|security-token)$/.test(normalized)) return true;
111
+ }
112
+ return false;
113
+ }
114
+
115
+ function urlCarriesCredential(url: URL): boolean {
116
+ if (url.username || url.password) return true;
117
+ for (const name of url.searchParams.keys()) {
118
+ if (/^(?:api[-_]?key|access[-_]?token|auth(?:orization)?|password|secret|token)$/i.test(name)) return true;
95
119
  }
96
- return `provider returned ${response.status} redirect to ${target}; configure the final provider URL directly`;
120
+ return false;
97
121
  }
98
122
 
99
123
  async function providerOutboundRequest(
@@ -113,8 +137,17 @@ async function providerOutboundRequest(
113
137
  if (postUrl?.protocol !== undefined && postUrl.protocol !== "https:") {
114
138
  throw new ProviderOutboundPolicyError("provider POST URL must use HTTPS");
115
139
  }
140
+ const parsed = postUrl ?? new URL(url);
141
+ if (method === "GET"
142
+ && parsed.protocol !== "https:"
143
+ && (hasCredentialHeader(init.headers) || urlCarriesCredential(parsed))) {
144
+ const destination = assessUrlDestination(url)?.kind;
145
+ if (destination !== "localhost" && destination !== "loopback") {
146
+ throw new ProviderOutboundPolicyError("credential-bearing provider GET URL must use HTTPS except for loopback");
147
+ }
148
+ }
116
149
  const profiledFetch = antigravityProfileFetch(name, provider, url);
117
- const fetchOverride = provider.fetch ?? profiledFetch;
150
+ const fetchOverride = dependencies.fetch ?? testProviderFetch(provider) ?? profiledFetch;
118
151
  if (profiledFetch) {
119
152
  // Keep the profiled executor behind the same pre-dispatch DNS boundary as
120
153
  // the pinned path. A proxy owns peer selection, so match the existing
@@ -126,7 +159,10 @@ async function providerOutboundRequest(
126
159
  allowPrivateNetwork: false,
127
160
  });
128
161
  }
129
- return fetchOverride!(url, { ...init, method, redirect: "manual" });
162
+ return requireFinalProviderResponse(
163
+ await fetchOverride!(url, { ...init, method, redirect: "manual" }),
164
+ url,
165
+ );
130
166
  }
131
167
  if (fetchOverride) {
132
168
  // A caller-owned executor cannot be peer-pinned here. This branch keeps literal/config
@@ -147,10 +183,12 @@ async function providerOutboundRequest(
147
183
  });
148
184
  if (destinationError) throw new ProviderOutboundPolicyError(destinationError);
149
185
  }
150
- return fetchOverride(url, { ...init, method, redirect: "manual" });
186
+ return requireFinalProviderResponse(
187
+ await fetchOverride(url, { ...init, method, redirect: "manual" }),
188
+ url,
189
+ );
151
190
  }
152
- const parsed = postUrl ?? new URL(url);
153
- const proxyConfigured = configuredProxyFor();
191
+ const selectedProxy = proxyForUrl(parsed);
154
192
  const resolveAddresses = dependencies.resolveAddresses ?? resolvePublicAddresses;
155
193
  const pinnedGet = dependencies.pinnedGet ?? pinnedHttpGet;
156
194
  const pinnedPost = dependencies.pinnedPost ?? pinnedHttpPost;
@@ -166,7 +204,7 @@ async function providerOutboundRequest(
166
204
  // destination or being pin-connected to the fake-IP (credit #1748). A NO_PROXY
167
205
  // match is a direct route, so it keeps the benchmark answer rejected. Image/Lab
168
206
  // fetch never passes this flag.
169
- allowBenchmarkAddresses: proxyConfigured && !noProxyMatches(parsed),
207
+ allowBenchmarkAddresses: selectedProxy !== undefined,
170
208
  });
171
209
  } catch (error) {
172
210
  const dnsResolutionFailed = error instanceof DestinationDnsResolutionError
@@ -174,16 +212,22 @@ async function providerOutboundRequest(
174
212
  if (!dnsResolutionFailed) {
175
213
  throw new ProviderOutboundPolicyError(error instanceof Error ? error.message : "provider destination was blocked");
176
214
  }
177
- if (!proxyConfigured) throw error;
215
+ if (!selectedProxy) throw error;
178
216
  warnProxyBoundaryOnce();
179
217
  warnProxyDnsDegradationOnce();
180
- return globalThis.fetch(url, { ...init, method, redirect: "manual" });
218
+ return requireFinalProviderResponse(
219
+ await globalThis.fetch(url, { ...init, method, redirect: "manual" }),
220
+ url,
221
+ );
181
222
  }
182
- if (proxyConfigured && !resolved.privateNetwork) {
223
+ if (selectedProxy && !resolved.privateNetwork) {
183
224
  warnProxyBoundaryOnce();
184
- return globalThis.fetch(url, { ...init, method, redirect: "manual" });
225
+ return requireFinalProviderResponse(
226
+ await globalThis.fetch(url, { ...init, method, redirect: "manual" }),
227
+ url,
228
+ );
185
229
  }
186
- if (proxyConfigured && resolved.privateNetwork && !noProxyMatches(parsed)) {
230
+ if (selectedProxy && resolved.privateNetwork) {
187
231
  const hostname = normalizeProxyHostname(parsed.hostname);
188
232
  throw new Error(
189
233
  `provider URL resolves to a private-network destination; add ${hostname} to NO_PROXY before using allowPrivateNetwork with an outbound proxy`,
@@ -196,9 +240,15 @@ async function providerOutboundRequest(
196
240
  };
197
241
  const pinned = pickPinnedAddress(resolved.addresses);
198
242
  if (method === "POST") {
199
- return pinnedPost(url, pinned, (init as ProviderPostInit).body, init.signal ?? undefined, requestOptions);
243
+ return requireFinalProviderResponse(
244
+ await pinnedPost(url, pinned, (init as ProviderPostInit).body, init.signal ?? undefined, requestOptions),
245
+ url,
246
+ );
200
247
  }
201
- return pinnedGet(url, pinned, init.signal ?? undefined, requestOptions);
248
+ return requireFinalProviderResponse(
249
+ await pinnedGet(url, pinned, init.signal ?? undefined, requestOptions),
250
+ url,
251
+ );
202
252
  }
203
253
 
204
254
  export async function providerOutboundGet(