@bitkyc08/opencodex 2.78.0 → 2.79.0

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 (71) hide show
  1. package/gui/dist/assets/App-BOUa-ek3.js +54 -0
  2. package/gui/dist/assets/App-CSJvmjNs.css +1 -0
  3. package/gui/dist/assets/{Tray-DiJpSub0.js → Tray-DUtzB4zF.js} +1 -1
  4. package/gui/dist/assets/{index-DmQB8D_R.css → index-Brk6F3fn.css} +1 -1
  5. package/gui/dist/assets/index-DwHNDF4s.js +94 -0
  6. package/gui/dist/assets/{quota-summary-B_a96nXj.js → quota-summary-BuL4WIBo.js} +1 -1
  7. package/gui/dist/index.html +2 -2
  8. package/package.json +3 -2
  9. package/src/adapters/devin.ts +22 -1
  10. package/src/claude/desktop-picker.ts +11 -9
  11. package/src/claude/inbound-content-options.ts +29 -2
  12. package/src/claude/intercept/local-ca-files.ts +265 -0
  13. package/src/claude/intercept/local-ca-windows.ts +73 -0
  14. package/src/claude/intercept/local-ca.ts +12 -24
  15. package/src/claude/intercept/picker-ca-persistence.ts +106 -0
  16. package/src/claude/intercept/picker-ca-startup.ts +16 -0
  17. package/src/claude/intercept/picker-ca-store.ts +70 -0
  18. package/src/claude/intercept/picker-ca.ts +43 -9
  19. package/src/claude/intercept/picker-runtime.ts +14 -4
  20. package/src/claude/intercept/runtime.ts +32 -23
  21. package/src/cli/ensure-readiness.ts +48 -0
  22. package/src/cli/gui-pair-client.ts +15 -7
  23. package/src/cli/gui.ts +4 -1
  24. package/src/cli/hub.ts +1 -0
  25. package/src/cli/index.ts +10 -11
  26. package/src/cli/status.ts +2 -2
  27. package/src/cli/update-restart-child.ts +4 -1
  28. package/src/codex/account-credit-use.ts +8 -2
  29. package/src/codex/auth-api/account-pause-group.ts +113 -0
  30. package/src/codex/auth-api/routes.ts +18 -12
  31. package/src/codex/auth-context.ts +45 -3
  32. package/src/codex/autostart-health.ts +10 -0
  33. package/src/codex/pool-credit-policy.ts +67 -0
  34. package/src/generated/compatibility-version.json +106 -46
  35. package/src/lib/gui-pair-capability.ts +1 -1
  36. package/src/lib/gui-pair-intent.ts +170 -0
  37. package/src/lib/windows-owner-acl.ts +143 -0
  38. package/src/providers/openai-sidecar-credit.ts +26 -0
  39. package/src/providers/openai-sidecar.ts +35 -0
  40. package/src/server/claude-messages.ts +1 -0
  41. package/src/server/gui-pair-delivery.ts +23 -0
  42. package/src/server/index/serve-options.ts +5 -8
  43. package/src/server/live-native-calls.ts +94 -0
  44. package/src/server/live.ts +28 -5
  45. package/src/server/local-management-read-client.ts +15 -11
  46. package/src/server/management/oauth-account-routes.ts +15 -0
  47. package/src/server/management/route-registry.ts +1 -0
  48. package/src/server/management/shared.ts +9 -3
  49. package/src/server/messages-native-scope.ts +57 -0
  50. package/src/server/messages-native.ts +9 -0
  51. package/src/server/responses/adapter-dispatch.ts +31 -2
  52. package/src/server/responses/compact.ts +17 -2
  53. package/src/server/responses/core-auth.ts +18 -1
  54. package/src/server/responses/core-codex-account.ts +18 -8
  55. package/src/server/responses/non-replayable-error.ts +48 -0
  56. package/src/server/responses/passthrough-delivery.ts +5 -1
  57. package/src/server/responses/passthrough-dispatch.ts +21 -19
  58. package/src/server/responses/request-prepare.ts +11 -1
  59. package/src/server/responses/sidecar-execution.ts +1 -0
  60. package/src/server/search.ts +4 -0
  61. package/src/server/startup-health-cache.ts +2 -6
  62. package/src/vision/describe.ts +17 -10
  63. package/src/vision/index.ts +1 -0
  64. package/src/web-search/executor.ts +17 -10
  65. package/src/web-search/format-result.ts +304 -20
  66. package/src/web-search/loop.ts +2 -1
  67. package/src/web-search/passthrough-bridge.ts +1 -0
  68. package/src/web-search/run-turn-loop.ts +1 -1
  69. package/gui/dist/assets/App-BtfG5id-.js +0 -54
  70. package/gui/dist/assets/App-lCIslZ1L.css +0 -1
  71. package/gui/dist/assets/index-Btc3Ogw4.js +0 -94
@@ -6,11 +6,11 @@
6
6
  "files": [
7
7
  {
8
8
  "path": "bun.lock",
9
- "sha256": "2dc53f5af56ecbf269cb692769b4c9910f9d1aa1d7658ae4deb66444129fcdfd"
9
+ "sha256": "c065612db20131683fd657dce98b6c51745ed9fadfeb56ea0c3edd823da39cc4"
10
10
  },
11
11
  {
12
12
  "path": "package.json",
13
- "sha256": "c429f802391480166ada348d017be8e45411aa92891dabc46bf332ea9ad6a999"
13
+ "sha256": "90cabe2689a17d5376a3d50526cbe2a6b4f5a441dd829476770e14aacda15281"
14
14
  },
15
15
  {
16
16
  "path": "scripts/model-metadata.source.json",
@@ -354,7 +354,7 @@
354
354
  },
355
355
  {
356
356
  "path": "src/adapters/devin.ts",
357
- "sha256": "dfa109ecb5c4ad95c29a4713ff6245244ac731868d90436af4b3a13ad3b87a56"
357
+ "sha256": "13c4afa1f3789e63ef73563ab56503970e38dc40c697877e81be8d4cc1e7c734"
358
358
  },
359
359
  {
360
360
  "path": "src/adapters/devin/cloud-direct/auth.ts",
@@ -882,7 +882,7 @@
882
882
  },
883
883
  {
884
884
  "path": "src/claude/desktop-picker.ts",
885
- "sha256": "d10d6826b572f12f8f6b27facaa80fac7c0d98812ebb4e658f8978d10f12a687"
885
+ "sha256": "84502b1936f7ecbac709ada0ab4abb1407bb4f45bcf72d91ed7388e58a82e070"
886
886
  },
887
887
  {
888
888
  "path": "src/claude/desktop-policy.ts",
@@ -934,7 +934,7 @@
934
934
  },
935
935
  {
936
936
  "path": "src/claude/inbound-content-options.ts",
937
- "sha256": "47a9c490be54035a89d65bbbd936685d51f14fb2511c8429d20a961154be7f9e"
937
+ "sha256": "d8ee5df821f9d6a1b2836bb52a8390c54b69aa57bebbcd3fa7ac2ebb505fc7f6"
938
938
  },
939
939
  {
940
940
  "path": "src/claude/inbound-debug.ts",
@@ -976,9 +976,17 @@
976
976
  "path": "src/claude/intercept/listener.ts",
977
977
  "sha256": "20d0cb9b82824ed156a771498a423d8be04a972e6447dd935e0ebf66569eb062"
978
978
  },
979
+ {
980
+ "path": "src/claude/intercept/local-ca-files.ts",
981
+ "sha256": "a044ed31ce54ee5b77622973c77204c9426e96d3c8291075f12fb680a787bce5"
982
+ },
983
+ {
984
+ "path": "src/claude/intercept/local-ca-windows.ts",
985
+ "sha256": "d637cdf4d2a84b6071bc8710e4c7c05f292548138208569e69b8d600ae35e462"
986
+ },
979
987
  {
980
988
  "path": "src/claude/intercept/local-ca.ts",
981
- "sha256": "5344c5e90053515dfd8f6efe04180f0f96f66fadd1d4d20e96568a0592070919"
989
+ "sha256": "b078505389400efd1e1b36a517becde644d9e9193492a9b17e5edd2ea6e691cf"
982
990
  },
983
991
  {
984
992
  "path": "src/claude/intercept/model-bindings.ts",
@@ -996,9 +1004,21 @@
996
1004
  "path": "src/claude/intercept/picker-ca-cleanup.ts",
997
1005
  "sha256": "11166443791f3b0578c3fdcea3d91c6b127ddf2ec4df36b678173b9fc2e410a1"
998
1006
  },
1007
+ {
1008
+ "path": "src/claude/intercept/picker-ca-persistence.ts",
1009
+ "sha256": "09d04582cb9d04a20e54f2c066345ed59df42671b233dc7c606061af9b1794e3"
1010
+ },
1011
+ {
1012
+ "path": "src/claude/intercept/picker-ca-startup.ts",
1013
+ "sha256": "301a018a6202c5f5a900e667b89427805ddf70a4c114b0b82425da2f37b63eeb"
1014
+ },
1015
+ {
1016
+ "path": "src/claude/intercept/picker-ca-store.ts",
1017
+ "sha256": "229a7d567e85679018443d91b6c8b1b4a9e365887dd324df31d6bfda58156d5d"
1018
+ },
999
1019
  {
1000
1020
  "path": "src/claude/intercept/picker-ca.ts",
1001
- "sha256": "4afa56ccad7adf07082dbf49ac0c46b8f75a678b50f28bcbb5e5237a812c6c93"
1021
+ "sha256": "f01671b033809904a8024e2344d32f1e531792ee0ba43c1a337e538dcf9869a7"
1002
1022
  },
1003
1023
  {
1004
1024
  "path": "src/claude/intercept/picker-listener.ts",
@@ -1010,7 +1030,7 @@
1010
1030
  },
1011
1031
  {
1012
1032
  "path": "src/claude/intercept/picker-runtime.ts",
1013
- "sha256": "239680f4c0010c09fc7c3eedca791d4e5cc65d4b7e2a261d5107cbf7ce29ae96"
1033
+ "sha256": "53a9cca52259bbac84d8cdfa1962f042e7fe7537e11021ccd3e356bdc3e83216"
1014
1034
  },
1015
1035
  {
1016
1036
  "path": "src/claude/intercept/picker-trust.ts",
@@ -1022,7 +1042,7 @@
1022
1042
  },
1023
1043
  {
1024
1044
  "path": "src/claude/intercept/runtime.ts",
1025
- "sha256": "a6b12bc624a8add7556a57eafef5fb5d23955faa97200a440970f994ee398a76"
1045
+ "sha256": "5e6c4f3c925b9bf9513b257d86db3a04b0bed2acadfbcddebda1c5cc015efc7c"
1026
1046
  },
1027
1047
  {
1028
1048
  "path": "src/claude/intercept/settings.ts",
@@ -1320,17 +1340,21 @@
1320
1340
  "path": "src/cli/ensure-desired-integrations.ts",
1321
1341
  "sha256": "dee843db093485031b339fd1528ed3c4ebc3d3fac5be53cdbff47482d374bc8a"
1322
1342
  },
1343
+ {
1344
+ "path": "src/cli/ensure-readiness.ts",
1345
+ "sha256": "6cbd94430f73cc6ac5c2d038098e697da75e95ee21ea05537f73f59fb2b72591"
1346
+ },
1323
1347
  {
1324
1348
  "path": "src/cli/export-command.ts",
1325
1349
  "sha256": "ae2732e794d511e7f74005e8328e6c288e41e1b7d532f1dced796d4e5283992b"
1326
1350
  },
1327
1351
  {
1328
1352
  "path": "src/cli/gui-pair-client.ts",
1329
- "sha256": "bb889bbffb9df45d4140c39ec99c4f0576ac5b9fb6bc081cc7c33729dcc8fadc"
1353
+ "sha256": "e149579629cabf46463367cc2b9b42337baa4a796c3059b106824c3d56089e31"
1330
1354
  },
1331
1355
  {
1332
1356
  "path": "src/cli/gui.ts",
1333
- "sha256": "07718c3a593b4db052992b30546b91cf69df521bd3be5a4eb1fb796fd2775b0d"
1357
+ "sha256": "dd27180892a3134be24dfbc525deacd20fca2c83d8f722cf41dc6cba74c3e9bf"
1334
1358
  },
1335
1359
  {
1336
1360
  "path": "src/cli/help-catalog.ts",
@@ -1354,11 +1378,11 @@
1354
1378
  },
1355
1379
  {
1356
1380
  "path": "src/cli/hub.ts",
1357
- "sha256": "9deda8595eff11f751510d662de9ed15327c31a142b9c03c21fae6fa1e7995ba"
1381
+ "sha256": "664d1cb26e67dbba38753bf0ce105f0c45816723cbc63f489dc16b96a0fe398c"
1358
1382
  },
1359
1383
  {
1360
1384
  "path": "src/cli/index.ts",
1361
- "sha256": "ab158db7999cb12f2c74a5f101f0067d48cce13fb3a507a83f8083647eee06d4"
1385
+ "sha256": "9bd93af4b7913ce722e0d51b2bb9241774335d289eddf7047a7c1ccc2346a19f"
1362
1386
  },
1363
1387
  {
1364
1388
  "path": "src/cli/init.ts",
@@ -1594,7 +1618,7 @@
1594
1618
  },
1595
1619
  {
1596
1620
  "path": "src/cli/status.ts",
1597
- "sha256": "422a1b231ab77cd73ba0001bc900db499a7c464b27c07a2032365f412258a146"
1621
+ "sha256": "4ef524e96c37bab4708b1de62e8069c2dd40c75ca05946e9375cf34ce5c15912"
1598
1622
  },
1599
1623
  {
1600
1624
  "path": "src/cli/stop-approval.ts",
@@ -1646,7 +1670,7 @@
1646
1670
  },
1647
1671
  {
1648
1672
  "path": "src/cli/update-restart-child.ts",
1649
- "sha256": "169ef469662dbdbeebefff8b4c7ef3a6663763666abce1d693afdee732c93c25"
1673
+ "sha256": "e034981d71828d0a4d743e768207742101813749998574fa0dfab9616110c820"
1650
1674
  },
1651
1675
  {
1652
1676
  "path": "src/cli/update-restart-home.ts",
@@ -1846,7 +1870,7 @@
1846
1870
  },
1847
1871
  {
1848
1872
  "path": "src/codex/account-credit-use.ts",
1849
- "sha256": "4bc92e2e006618fab75b460a937dda1fb34b7eb2e29f7a5687c87a80470cde3e"
1873
+ "sha256": "5eea9770afa87ee4683e7111137fed2fdd37530c5c1cd4f5c3c9124df604475c"
1850
1874
  },
1851
1875
  {
1852
1876
  "path": "src/codex/account-id.ts",
@@ -1916,6 +1940,10 @@
1916
1940
  "path": "src/codex/auth-api/account-list.ts",
1917
1941
  "sha256": "9334a6e895d843ab53f669681821c4eaabb51dc8449ad9d7757da72aa6d91417"
1918
1942
  },
1943
+ {
1944
+ "path": "src/codex/auth-api/account-pause-group.ts",
1945
+ "sha256": "8a4dc18bed84efeb6b35fc2da9822ca266f0635957e31917f2ed4404993983d5"
1946
+ },
1919
1947
  {
1920
1948
  "path": "src/codex/auth-api/http.ts",
1921
1949
  "sha256": "82eeb171e8ca439619ad8a2e0104f250b7268f1e69e5a37ecbab908fe44b925f"
@@ -1946,7 +1974,7 @@
1946
1974
  },
1947
1975
  {
1948
1976
  "path": "src/codex/auth-api/routes.ts",
1949
- "sha256": "e1cf949c54f9c63141b5a5316d7f5cc9e14a23df45d03ac5ac0898eead022466"
1977
+ "sha256": "691f19febde4e5863537658cef2a03f614af62da5a18acf376bb0e6a4a1ffd22"
1950
1978
  },
1951
1979
  {
1952
1980
  "path": "src/codex/auth-api/runtime-config.ts",
@@ -1958,11 +1986,11 @@
1958
1986
  },
1959
1987
  {
1960
1988
  "path": "src/codex/auth-context.ts",
1961
- "sha256": "2c8242642dd6f23c6a36bf988dd473b96b5e10133028e32857d219bdf3bbc0b4"
1989
+ "sha256": "769ee5cffce92933f200e923e14dac75b3a98fea0b1bf96f96c254344f6aa032"
1962
1990
  },
1963
1991
  {
1964
1992
  "path": "src/codex/autostart-health.ts",
1965
- "sha256": "c4ca8ca25b8087a2b6fd8e11c3a41c04a445a381c23b1f720f5ecf813d6c1287"
1993
+ "sha256": "bbd30686f19e73d40e1b3fbdb7cd20d9439459d19b4697c8410dac58bcb1b239"
1966
1994
  },
1967
1995
  {
1968
1996
  "path": "src/codex/catalog-admission.ts",
@@ -2556,6 +2584,10 @@
2556
2584
  "path": "src/codex/plugins-doctor.ts",
2557
2585
  "sha256": "51344b58e99a143d2c7d397481e5b2a26c86ab0a1c61db5b153068793e4d3cab"
2558
2586
  },
2587
+ {
2588
+ "path": "src/codex/pool-credit-policy.ts",
2589
+ "sha256": "7c0d970583cd789a25169867e6ffb30afa770639d9a3101e79eb80b99b8385e5"
2590
+ },
2559
2591
  {
2560
2592
  "path": "src/codex/pool-refresh-backoff.ts",
2561
2593
  "sha256": "6f4e7a8658d8bf7bcb4076a0ebdfbca8b2fec69294fde9c83730615bb9cfb7b4"
@@ -3858,7 +3890,11 @@
3858
3890
  },
3859
3891
  {
3860
3892
  "path": "src/lib/gui-pair-capability.ts",
3861
- "sha256": "2567d5d0fc153d34c354f6e3bae6355f1bd1e5d272263999ebd6ed8f94d52e87"
3893
+ "sha256": "b1beb3aa9ea5325a89b8a38d404eb6351b421a3af0d7a244ca39b73634c14677"
3894
+ },
3895
+ {
3896
+ "path": "src/lib/gui-pair-intent.ts",
3897
+ "sha256": "1f905ca823d68b14cec4aa3690cadf1eef0d270dd4b1674db414ba4ad652f5d7"
3862
3898
  },
3863
3899
  {
3864
3900
  "path": "src/lib/handled-signal-exit.ts",
@@ -4156,6 +4192,10 @@
4156
4192
  "path": "src/lib/windows-elevation.ts",
4157
4193
  "sha256": "9e82e443b441282b4d38fa7830882de5303a886926793db9813f804c36c99c03"
4158
4194
  },
4195
+ {
4196
+ "path": "src/lib/windows-owner-acl.ts",
4197
+ "sha256": "c45f9756367161f43515e60879fdcc52f096dae4ce4a18657bed70c8ab2f7555"
4198
+ },
4159
4199
  {
4160
4200
  "path": "src/lib/windows-secret-acl.ts",
4161
4201
  "sha256": "3100c8468917e0484c287bb1a6b05b1a74c5916207ddc2dfc63318f17ed0eecd"
@@ -4788,9 +4828,13 @@
4788
4828
  "path": "src/providers/ollama-show.ts",
4789
4829
  "sha256": "b08bfca5a2919ef4ddc8fe8999e663a3220634c21cffcd06bc07c59dae188d0a"
4790
4830
  },
4831
+ {
4832
+ "path": "src/providers/openai-sidecar-credit.ts",
4833
+ "sha256": "52ecdd022dfe4115ea975f0ca39ba18b350ec70794a78c43dfbfde2891e893c6"
4834
+ },
4791
4835
  {
4792
4836
  "path": "src/providers/openai-sidecar.ts",
4793
- "sha256": "ed078175c3a9f225c07d956bcbaa2a60fb076877ab17a38c64f2cb44a75a2eae"
4837
+ "sha256": "782b962f5ef44ca55352a8a6e5b1ed079d4a5cbeab47ed52a813d811629e6934"
4794
4838
  },
4795
4839
  {
4796
4840
  "path": "src/providers/openai-tier-startup.ts",
@@ -5490,7 +5534,7 @@
5490
5534
  },
5491
5535
  {
5492
5536
  "path": "src/server/claude-messages.ts",
5493
- "sha256": "430e7cb89d22834ae71a2d06eec970842ed0f17fc2d1a72aa36adf47411a062e"
5537
+ "sha256": "34a498b80ce5f669527662ede39dddae9df6a319e63d47849975ecaa961fe5ea"
5494
5538
  },
5495
5539
  {
5496
5540
  "path": "src/server/context-history.ts",
@@ -5536,6 +5580,10 @@
5536
5580
  "path": "src/server/gui-freshness.ts",
5537
5581
  "sha256": "e9ac2c6e6eb61384acac7626b77dc29439a899b0bac953b1152b5ba4d804d4da"
5538
5582
  },
5583
+ {
5584
+ "path": "src/server/gui-pair-delivery.ts",
5585
+ "sha256": "3f5ca5fd233d69d675aae4cc6d39e8dbf65470b2306442e215c70ecb032540ab"
5586
+ },
5539
5587
  {
5540
5588
  "path": "src/server/gui-session.ts",
5541
5589
  "sha256": "c42ee4a9d0b9469685f98dfbb8fc8171d90c7065a4d4418c95ee04fcd7f20e01"
@@ -5598,7 +5646,7 @@
5598
5646
  },
5599
5647
  {
5600
5648
  "path": "src/server/index/serve-options.ts",
5601
- "sha256": "6c3d664df04aa39d5507fe02cc3adfd43c824cdbab420813b932ca234c074ef1"
5649
+ "sha256": "8dcf2c84e39366e7eef476f2657e5226bc7300ab7ae2fd3450108b1c366c0a31"
5602
5650
  },
5603
5651
  {
5604
5652
  "path": "src/server/index/spend-ledger-lifecycle.ts",
@@ -5648,9 +5696,13 @@
5648
5696
  "path": "src/server/live-call-bindings.ts",
5649
5697
  "sha256": "1cf1bb07147df0154d347c352b85428a380fcab7f9f25e070cfe693736a3098c"
5650
5698
  },
5699
+ {
5700
+ "path": "src/server/live-native-calls.ts",
5701
+ "sha256": "b8c7162277cd75fa54341386d70d6833c06ab19c988a18312cbceb8bdf967cff"
5702
+ },
5651
5703
  {
5652
5704
  "path": "src/server/live.ts",
5653
- "sha256": "306158ee88e1a4fa521eee0a69c17548d893040a3c9514676d7a426b420af92c"
5705
+ "sha256": "7f4fe2ed446a93cf7cdbfc5cd9a45730f62bc102d8fe3ceb1130c2db82b30354"
5654
5706
  },
5655
5707
  {
5656
5708
  "path": "src/server/local-account-switch-auth.ts",
@@ -5662,7 +5714,7 @@
5662
5714
  },
5663
5715
  {
5664
5716
  "path": "src/server/local-management-read-client.ts",
5665
- "sha256": "cfcd49d5abef41be9059f16f5a3180c5ca1685d1de0d7d7e0b8e2091e308a57f"
5717
+ "sha256": "46fa7303021b9c785addf887ef5eab9e13f989cd94af193e961ed7c05ceb247d"
5666
5718
  },
5667
5719
  {
5668
5720
  "path": "src/server/local-provider-reload-client.ts",
@@ -5814,7 +5866,7 @@
5814
5866
  },
5815
5867
  {
5816
5868
  "path": "src/server/management/oauth-account-routes.ts",
5817
- "sha256": "55abc70c590468fe548d9b7e3ad6d5b8623e8b1f31c222561643320166be6829"
5869
+ "sha256": "89365a43108c4fcd1120f2643d5a2bcca5fef322065bf194873861098fa36e71"
5818
5870
  },
5819
5871
  {
5820
5872
  "path": "src/server/management/protocol-routes.ts",
@@ -5854,7 +5906,7 @@
5854
5906
  },
5855
5907
  {
5856
5908
  "path": "src/server/management/route-registry.ts",
5857
- "sha256": "7b61f2305ab72fbbca48ea7bcb9cd1f6164daa51bf3ff6e3277b5a1c301c4b73"
5909
+ "sha256": "f6cff873e844b11d5990aa0d771cddd3fedc860cf7d6b6fcfd692fb12f5c16b5"
5858
5910
  },
5859
5911
  {
5860
5912
  "path": "src/server/management/routing-analytics-routes.ts",
@@ -5874,7 +5926,7 @@
5874
5926
  },
5875
5927
  {
5876
5928
  "path": "src/server/management/shared.ts",
5877
- "sha256": "1f64751627779cdda6636ffb5442b9dbbcd73599740f9cc8c4c14d427a8fc0b3"
5929
+ "sha256": "9290f81ce76412f14f4205698bd0bc4512346eaee9ef7132cd457b7af30f0b48"
5878
5930
  },
5879
5931
  {
5880
5932
  "path": "src/server/management/sibling-guard.ts",
@@ -5944,9 +5996,13 @@
5944
5996
  "path": "src/server/messages-native-oauth.ts",
5945
5997
  "sha256": "a594bf3b8a9f79ac77cd55acab4573b6acf949921cf96a1d12c6f1e48763d7fa"
5946
5998
  },
5999
+ {
6000
+ "path": "src/server/messages-native-scope.ts",
6001
+ "sha256": "c529062519b72e9ee5763663b646138726c51380822864b87d6cfad88f7f0297"
6002
+ },
5947
6003
  {
5948
6004
  "path": "src/server/messages-native.ts",
5949
- "sha256": "b4f1603117baa247b6bd54326e3ddd54d3c885b4904b2f054751c01ba51dfbbb"
6005
+ "sha256": "f466ebef7399197ad038b2d56124d7c40ff9805e53bf0c2d02cef5b134ea7619"
5950
6006
  },
5951
6007
  {
5952
6008
  "path": "src/server/models-capabilities.ts",
@@ -6094,7 +6150,7 @@
6094
6150
  },
6095
6151
  {
6096
6152
  "path": "src/server/responses/adapter-dispatch.ts",
6097
- "sha256": "319c5a2da348cf1c0c6e0f31f11d992a3caccc147cc5d8af08f8f414bb72c9b3"
6153
+ "sha256": "a0222c7c8a503f93c8122e064991bcb14252adccdf1ac65b01807c2d8b0a270a"
6098
6154
  },
6099
6155
  {
6100
6156
  "path": "src/server/responses/agent-task-recovery-cache.ts",
@@ -6158,7 +6214,7 @@
6158
6214
  },
6159
6215
  {
6160
6216
  "path": "src/server/responses/compact.ts",
6161
- "sha256": "2a4c065ce18b3dfe24ee085df8abab976a8f1fb5e26cd01267d98fb18d60c9ca"
6217
+ "sha256": "c369659cd76e724abaf47198a4bd19109cecdd23bef1eb77e4c11a375f3da0d4"
6162
6218
  },
6163
6219
  {
6164
6220
  "path": "src/server/responses/compaction-recovery-policy.ts",
@@ -6182,11 +6238,11 @@
6182
6238
  },
6183
6239
  {
6184
6240
  "path": "src/server/responses/core-auth.ts",
6185
- "sha256": "fcae80bb4024bad1824624e9d16a8f6455b94dee269ad718f37e0e9741707bd8"
6241
+ "sha256": "f0efe9541c66eb6282f8427432578dca11be7051b7c34867c6522d9039bf008c"
6186
6242
  },
6187
6243
  {
6188
6244
  "path": "src/server/responses/core-codex-account.ts",
6189
- "sha256": "53602a707e6d7bf7ad5e10f8965266b39e06d56177d3937deb95f40c15f196ec"
6245
+ "sha256": "ee0557aac9735359ab45cafd64f7d26e86c6d94ac76ed112252ed9736b6af226"
6190
6246
  },
6191
6247
  {
6192
6248
  "path": "src/server/responses/core-combo-failure.ts",
@@ -6300,6 +6356,10 @@
6300
6356
  "path": "src/server/responses/native-tool-results.ts",
6301
6357
  "sha256": "16e4f9f68bd2a60fcff0cb1d19049dce7c03dab8d7cc03380c69c5974a641a0d"
6302
6358
  },
6359
+ {
6360
+ "path": "src/server/responses/non-replayable-error.ts",
6361
+ "sha256": "4b22357dd182a51aa348a55865ffbf0bb48b4d6cb8ec3907e7751919aadc0998"
6362
+ },
6303
6363
  {
6304
6364
  "path": "src/server/responses/outbound-body-guard.ts",
6305
6365
  "sha256": "d6073c677abe1a00ea85991b6a58335e28a6386ec88baceeecc84642ea437cdb"
@@ -6310,11 +6370,11 @@
6310
6370
  },
6311
6371
  {
6312
6372
  "path": "src/server/responses/passthrough-delivery.ts",
6313
- "sha256": "20b9a194046bedd1996d6e3a48eafc15ab029852930a9e94c11df24abf647ceb"
6373
+ "sha256": "87a0541e8ce51da17ac536f14331fa3193d99a6b72dd70ada0875553c67cc58b"
6314
6374
  },
6315
6375
  {
6316
6376
  "path": "src/server/responses/passthrough-dispatch.ts",
6317
- "sha256": "c2e7c16619bb6c26304edabde63a95f5e9fd0511237db8b48314dd80e5317681"
6377
+ "sha256": "e94a8720e080c0ca7c734e862cd2e617dd55022c75e9cbd2629058d7313d88a5"
6318
6378
  },
6319
6379
  {
6320
6380
  "path": "src/server/responses/passthrough-error.ts",
@@ -6338,7 +6398,7 @@
6338
6398
  },
6339
6399
  {
6340
6400
  "path": "src/server/responses/request-prepare.ts",
6341
- "sha256": "b28d13eb747da7cc61d09617742082e83d1046133e9c52da950687a890665f06"
6401
+ "sha256": "2ea9db1882f2a63a47e6ee2bae40a21a650536edde0f4e37233f0a99dab6e1f6"
6342
6402
  },
6343
6403
  {
6344
6404
  "path": "src/server/responses/request-send-budget.ts",
@@ -6378,7 +6438,7 @@
6378
6438
  },
6379
6439
  {
6380
6440
  "path": "src/server/responses/sidecar-execution.ts",
6381
- "sha256": "b2b343a546c7cbcdd372ffcdac4cbb90c643daf80946aa564a63466a43c8368d"
6441
+ "sha256": "eca29aa48b1e63da62f54064ea4aa4e7ceae059124c9837bf5fb2029bff3daa6"
6382
6442
  },
6383
6443
  {
6384
6444
  "path": "src/server/responses/skills-snapshot.ts",
@@ -6410,7 +6470,7 @@
6410
6470
  },
6411
6471
  {
6412
6472
  "path": "src/server/search.ts",
6413
- "sha256": "a7fdcf33833d28aae54e40cecc789a6d7c44906f10eb457f071b50d2878a9800"
6473
+ "sha256": "318a820d06e482a60cf600b76987519f3de0b634a3228fe58be668fd9daf442e"
6414
6474
  },
6415
6475
  {
6416
6476
  "path": "src/server/sse-frame-buffer.ts",
@@ -6426,7 +6486,7 @@
6426
6486
  },
6427
6487
  {
6428
6488
  "path": "src/server/startup-health-cache.ts",
6429
- "sha256": "d811b597d5fe44de11f80a526dc1e1437a154d7461fe1bad2b04bdc5c274613f"
6489
+ "sha256": "0f79c004ae81f5e8c4d4c908f1bd50c5a5c2441b924b12d4fa7c05c75d432597"
6430
6490
  },
6431
6491
  {
6432
6492
  "path": "src/server/stop-teardown.ts",
@@ -7026,7 +7086,7 @@
7026
7086
  },
7027
7087
  {
7028
7088
  "path": "src/vision/describe.ts",
7029
- "sha256": "0b175ccccdd999ea41440be350a264639f755357737608de057124dd6a7b11ac"
7089
+ "sha256": "37c24beb525d38c9f82dd1a67eacee00375abbd803d9da3fc744f357aa899fdb"
7030
7090
  },
7031
7091
  {
7032
7092
  "path": "src/vision/eligibility.ts",
@@ -7038,7 +7098,7 @@
7038
7098
  },
7039
7099
  {
7040
7100
  "path": "src/vision/index.ts",
7041
- "sha256": "dc2ef3c7b6898eb8938695c1941cecefce86f25836243ba6bc4db2cd91c5400a"
7101
+ "sha256": "66fc9bdda6a590416ca082253e655de6963cb89023615ff489881a1fb236db20"
7042
7102
  },
7043
7103
  {
7044
7104
  "path": "src/vision/plan.ts",
@@ -7078,11 +7138,11 @@
7078
7138
  },
7079
7139
  {
7080
7140
  "path": "src/web-search/executor.ts",
7081
- "sha256": "fd7eed132b645efd472944cdc4eacf5e6546258cd805bafe3b828bc9ca0c35c9"
7141
+ "sha256": "de37df4e5dd8d57a50271b708cc180cef94dc215c03766ed76cbb49cdd63a025"
7082
7142
  },
7083
7143
  {
7084
7144
  "path": "src/web-search/format-result.ts",
7085
- "sha256": "d0698e78c55bd5d861645f27af5f0cc7ce122f50a81c8fba57d9c4d3f4e8d010"
7145
+ "sha256": "6fb56f39dfa2d6c8910edd0cb1d101f6121b9c53dc08903627900cfc055b95e6"
7086
7146
  },
7087
7147
  {
7088
7148
  "path": "src/web-search/gemini-executor.ts",
@@ -7094,7 +7154,7 @@
7094
7154
  },
7095
7155
  {
7096
7156
  "path": "src/web-search/loop.ts",
7097
- "sha256": "8f8007336e9645f317aeefeaf8ddc7321e892b186c7e4eb5cdc577040506a912"
7157
+ "sha256": "88cb405912a912c2ccf4cea4261ab727aa4d01b1b49f57081f7cf5d926d6b94b"
7098
7158
  },
7099
7159
  {
7100
7160
  "path": "src/web-search/ollama-executor.ts",
@@ -7106,7 +7166,7 @@
7106
7166
  },
7107
7167
  {
7108
7168
  "path": "src/web-search/passthrough-bridge.ts",
7109
- "sha256": "12e1b0ed4252c02e09b92bc34481f6e2c5f0dca4fafb041c2b838c13013f88cb"
7169
+ "sha256": "1cf30bdab0d60d57a0e57a710223238fb3af4e5f01eb761872f8d60583f99451"
7110
7170
  },
7111
7171
  {
7112
7172
  "path": "src/web-search/progress-stream.ts",
@@ -7114,7 +7174,7 @@
7114
7174
  },
7115
7175
  {
7116
7176
  "path": "src/web-search/run-turn-loop.ts",
7117
- "sha256": "417eefc2c6b2ff7974a9b65d2e256c5067f110bbb667a7df124d7b3ef0d961b1"
7177
+ "sha256": "5566c3ad172e63fd507db0da79886acc9803af8a6c956df2033a8ce34461dbe4"
7118
7178
  },
7119
7179
  {
7120
7180
  "path": "src/web-search/sidecar-providers.ts",
@@ -3,7 +3,7 @@ import { isLocalAttestationSecret } from "./local-management-attestation";
3
3
 
4
4
  export const GUI_PAIR_METHOD = "POST";
5
5
  export const GUI_PAIR_PATH = "/api/gui/pairing-grants";
6
- export const GUI_PAIR_CAPABILITY_VERSION = "v1";
6
+ export const GUI_PAIR_CAPABILITY_VERSION = "v2";
7
7
  export const GUI_PAIR_EXPECTED_PID_HEADER = "x-opencodex-gui-pair-expected-pid";
8
8
  export const GUI_PAIR_NONCE_HEADER = "x-opencodex-gui-pair-nonce";
9
9
  export const GUI_PAIR_EXPIRES_AT_HEADER = "x-opencodex-gui-pair-expires-at";
@@ -0,0 +1,170 @@
1
+ import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
2
+ import { closeSync, constants, fstatSync, lstatSync, mkdirSync, openSync, readdirSync, readSync, rmdirSync, unlinkSync, writeFileSync, type BigIntStats } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { getConfigDir } from "../config/paths";
5
+ import { assertNotRealHomeUnderTest } from "./test-home-guard";
6
+ import { forgetEphemeralSecretPath, hardenSecretDir, hardenSecretPath, windowsSecretAclApplies } from "./windows-secret-acl";
7
+
8
+ import { verifyWindowsPrivateEntries, WINDOWS_OWNER_ACL_TIMEOUT_MS } from "./windows-owner-acl";
9
+
10
+ export const GUI_PAIR_INTENT_HEADER = "x-opencodex-gui-pair-intent";
11
+ const TOKEN = /^[A-Za-z0-9_-]{43}$/;
12
+ const INTENT_NAME = /^[0-9a-f]{64}$/;
13
+ // Records outlive their ~10s capability only when the publishing CLI died; a wide
14
+ // margin keeps an active command's fresh record from ever looking stale.
15
+ const STALE_INTENT_MS = 60_000;
16
+ const STALE_INTENT_SWEEP_LIMIT = 256;
17
+ const digest = (value: string) => createHash("sha256").update(value).digest("hex");
18
+
19
+ function owned(stat: BigIntStats): boolean {
20
+ return process.platform === "win32" || (stat.uid === BigInt(process.getuid!()) && (stat.mode & 0o022n) === 0n);
21
+ }
22
+ function same(a: BigIntStats, b: BigIntStats): boolean {
23
+ return a.dev === b.dev && a.ino === b.ino && a.ctimeNs === b.ctimeNs;
24
+ }
25
+ function directory(path: string): BigIntStats {
26
+ const stat = lstatSync(path, { bigint: true });
27
+ if (!stat.isDirectory() || stat.isSymbolicLink() || !owned(stat)) throw new Error("Unsafe GUI pairing intent directory");
28
+ return stat;
29
+ }
30
+ function location(capability: string, configDir: string): { dir: string; path: string } {
31
+ if (!TOKEN.test(capability)) throw new Error("Invalid GUI pairing capability");
32
+ const dir = join(configDir, "gui-pair-intents");
33
+ return { dir, path: join(dir, digest(`opencodex-gui-pair-intent-v1\n${capability}`)) };
34
+ }
35
+ function releaseConsumeLock(path: string, identity: BigIntStats): boolean {
36
+ try {
37
+ if (!same(identity, lstatSync(path, { bigint: true }))) return false;
38
+ rmdirSync(path);
39
+ return true;
40
+ } catch {
41
+ return false;
42
+ }
43
+ }
44
+
45
+ function removeOwned(path: string, identity: BigIntStats): void {
46
+ try {
47
+ if (same(identity, lstatSync(path, { bigint: true }))) unlinkSync(path);
48
+ } catch { /* expired or already consumed; never remove a replacement */ }
49
+ forgetEphemeralSecretPath(path);
50
+ }
51
+
52
+ /** Best-effort stale cleanup; bound per-entry work before creating the next expiring intent. */
53
+ function sweepStaleIntents(dir: string): void {
54
+ let names: string[];
55
+ try { names = readdirSync(dir); } catch { return; }
56
+ const now = Date.now();
57
+ // Count every entry, including foreign and fresh ones, rather than only successful deletes.
58
+ // This caps metadata/deletion work, not readdirSync's array allocation or syscall duration.
59
+ // Bun 1.4.0 also snapshots names behind opendirSync, so an iterator alone is not a memory cap.
60
+ const limit = Math.min(names.length, STALE_INTENT_SWEEP_LIMIT);
61
+ for (let index = 0; index < limit; index++) {
62
+ const name = names[index]!;
63
+ if (!INTENT_NAME.test(name)) continue;
64
+ const path = join(dir, name);
65
+ try {
66
+ const stat = lstatSync(path, { bigint: true });
67
+ if (!stat.isFile() || stat.isSymbolicLink() || !owned(stat) || stat.nlink !== 1n) continue;
68
+ if (now - Number(stat.mtimeMs) < STALE_INTENT_MS) continue;
69
+ removeOwned(path, stat);
70
+ } catch { /* leave unreadable entries alone */ }
71
+ }
72
+ }
73
+
74
+ export interface GuiPairIntent {
75
+ proof: string;
76
+ dispose(): void;
77
+ }
78
+
79
+ /**
80
+ * Prove write access to the private configuration home, separately from runtime-state reads.
81
+ * Only a SHA-256 commitment goes to disk; the random verifier remains in the requesting CLI.
82
+ * This is an owner-write boundary, NOT proof of human presence or protection from a fully
83
+ * privileged same-user process. The existing HMAC binds PID, port, origin, nonce and expiry.
84
+ */
85
+ export function createGuiPairIntent(capability: string, configDir = getConfigDir()): GuiPairIntent {
86
+ assertNotRealHomeUnderTest(configDir);
87
+ directory(configDir);
88
+ const { dir, path } = location(capability, configDir);
89
+ try { mkdirSync(dir, { mode: 0o700 }); }
90
+ catch (error) { if ((error as NodeJS.ErrnoException).code !== "EEXIST") throw error; }
91
+ directory(dir);
92
+ if (!hardenSecretDir(dir, { required: true, deadlineMs: 2_000 }).ok) throw new Error("GUI pairing intent ACL refused");
93
+ sweepStaleIntents(dir);
94
+ const parent = directory(dir);
95
+ const proof = randomBytes(32).toString("base64url");
96
+ const fd = openSync(path, "wx", 0o600);
97
+ let identity = fstatSync(fd, { bigint: true });
98
+ try {
99
+ writeFileSync(fd, `${digest(proof)}\n`, "utf8");
100
+ if (!hardenSecretPath(path, { required: true, deadlineMs: 2_000 }).ok) throw new Error("GUI pairing intent ACL refused");
101
+ identity = fstatSync(fd, { bigint: true });
102
+ if (!same(identity, lstatSync(path, { bigint: true })) || !owned(identity)
103
+ || identity.nlink !== 1n || parent.dev !== directory(dir).dev || parent.ino !== directory(dir).ino) {
104
+ throw new Error("GUI pairing intent changed during publication");
105
+ }
106
+ } catch (error) {
107
+ identity = fstatSync(fd, { bigint: true });
108
+ closeSync(fd);
109
+ removeOwned(path, identity);
110
+ throw error;
111
+ }
112
+ closeSync(fd);
113
+ // Disposal consumes the record: the same directory, identity and content checks as
114
+ // redemption, so a corrupted or replaced commitment is retained on every platform.
115
+ const dispose = (): void => { consumeGuiPairIntent(capability, proof, configDir); };
116
+ return { proof, dispose };
117
+ }
118
+
119
+ /** Called only after the existing process-bound, expiring capability passed authorization. */
120
+ export function consumeGuiPairIntent(capability: string | null, proof: string | null, configDir = getConfigDir()): boolean {
121
+ if (!capability || !proof || !TOKEN.test(capability) || !TOKEN.test(proof)) return false;
122
+ let fd: number | undefined;
123
+ let consumeLock: string | undefined;
124
+ let consumeLockIdentity: BigIntStats | undefined;
125
+ try {
126
+ assertNotRealHomeUnderTest(configDir);
127
+ directory(configDir);
128
+ const { dir, path } = location(capability, configDir);
129
+ const parent = directory(dir);
130
+ consumeLock = `${path}.consuming`;
131
+ mkdirSync(consumeLock, { mode: 0o700 });
132
+ consumeLockIdentity = directory(consumeLock);
133
+ const lockedParent = directory(dir);
134
+ if (parent.dev !== lockedParent.dev || parent.ino !== lockedParent.ino) return false;
135
+ const before = lstatSync(path, { bigint: true });
136
+ if (!before.isFile() || before.isSymbolicLink() || !owned(before) || before.nlink !== 1n || before.size !== 65n) return false;
137
+ // Do not block on a substituted FIFO. Windows retains descriptor/path identity checks.
138
+ const flags = constants.O_RDONLY | (process.platform === "win32" ? 0 : constants.O_NOFOLLOW | constants.O_NONBLOCK);
139
+ fd = openSync(path, flags);
140
+ const opened = fstatSync(fd, { bigint: true });
141
+ if (!same(before, opened) || !opened.isFile()) return false;
142
+ const bytes = Buffer.alloc(66);
143
+ const size = readSync(fd, bytes, 0, bytes.length, 0);
144
+ if (size !== 65 || !timingSafeEqual(bytes.subarray(0, size), Buffer.from(`${digest(proof)}\n`))) return false;
145
+ const after = fstatSync(fd, { bigint: true });
146
+ if (!same(opened, after) || !same(after, lstatSync(path, { bigint: true }))
147
+ || parent.dev !== directory(dir).dev || parent.ino !== directory(dir).ino) return false;
148
+ closeSync(fd); fd = undefined;
149
+ // Verify only a matching commitment, with its descriptor closed and lock held.
150
+ // Redemption must never harden an untrusted record into acceptable authority.
151
+ if (windowsSecretAclApplies() && !verifyWindowsPrivateEntries([
152
+ { path: dir, directory: true }, { path, directory: false },
153
+ ], WINDOWS_OWNER_ACL_TIMEOUT_MS)) return false;
154
+ const verifiedParent = directory(dir);
155
+ if (parent.dev !== verifiedParent.dev || parent.ino !== verifiedParent.ino
156
+ || !same(after, lstatSync(path, { bigint: true }))) return false;
157
+ unlinkSync(path);
158
+ forgetEphemeralSecretPath(path);
159
+ return true;
160
+ } catch { return false; }
161
+ finally {
162
+ try {
163
+ if (fd !== undefined) closeSync(fd);
164
+ } finally {
165
+ if (consumeLock && consumeLockIdentity) {
166
+ releaseConsumeLock(consumeLock, consumeLockIdentity);
167
+ }
168
+ }
169
+ }
170
+ }