sneakoscope 8.1.2 → 8.2.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 (261) hide show
  1. package/README.md +96 -58
  2. package/crates/sks-core/Cargo.lock +1 -1
  3. package/crates/sks-core/Cargo.toml +1 -1
  4. package/dist/bin/fast-inline.js +5 -51
  5. package/dist/cli/command-manifest-lite.js +2 -1
  6. package/dist/cli/command-registry.js +2 -1
  7. package/dist/cli/global-mode-router.js +1 -1
  8. package/dist/cli/install-helpers-codex-lb-config.js +112 -914
  9. package/dist/cli/install-helpers-codex-lb-shared.js +3 -44
  10. package/dist/cli/install-helpers-install-support.js +4 -20
  11. package/dist/cli/install-helpers.js +36 -2716
  12. package/dist/cli/router.js +9 -9
  13. package/dist/commands/bridge-command-output.js +111 -0
  14. package/dist/commands/bridge.js +320 -0
  15. package/dist/commands/codex-app.js +39 -123
  16. package/dist/commands/doctor-helpers.js +380 -0
  17. package/dist/commands/doctor-profile.js +3 -0
  18. package/dist/commands/doctor.js +114 -873
  19. package/dist/commands/mad-sks.js +0 -4
  20. package/dist/config/skills-manifest.json +1 -1
  21. package/dist/core/agents/agent-effort-policy.js +11 -21
  22. package/dist/core/agents/agent-recursion-guard.js +26 -0
  23. package/dist/core/agents/agent-runner-codex-exec.js +7 -9
  24. package/dist/core/architecture-hardening/contracts/contracts.js +225 -161
  25. package/dist/core/architecture-hardening/state/state-service.js +49 -13
  26. package/dist/core/auto-review.js +15 -9
  27. package/dist/core/codex/codex-config-guard.js +8 -0
  28. package/dist/core/codex-adapter.js +8 -10
  29. package/dist/core/codex-app/codex-app-fast-ui-repair.js +7 -29
  30. package/dist/core/codex-app/codex-app-launcher.js +10 -12
  31. package/dist/core/codex-app/codex-app-restart.js +10 -12
  32. package/dist/core/codex-app/menubar/constants.js +2 -5
  33. package/dist/core/codex-app/menubar/global-install.js +3 -2
  34. package/dist/core/codex-app/menubar/installer/result.js +23 -0
  35. package/dist/core/codex-app/menubar/installer/runtime.js +28 -0
  36. package/dist/core/codex-app/menubar/installer.js +5 -96
  37. package/dist/core/codex-app/menubar/migration.js +1 -42
  38. package/dist/core/codex-app/openrouter-provider.js +0 -78
  39. package/dist/core/codex-app.js +97 -360
  40. package/dist/core/codex-control/codex-app-server-runtime-env.js +8 -28
  41. package/dist/core/codex-control/codex-current-image-path-real-probe.js +2 -3
  42. package/dist/core/codex-control/codex-current-web-search-probe.js +2 -3
  43. package/dist/core/codex-control/codex-sdk-adapter.js +5 -48
  44. package/dist/core/codex-control/codex-task-runner.js +16 -60
  45. package/dist/core/codex-control/desktop-bridge-launch-guard.js +227 -0
  46. package/dist/core/codex-exec-output-schema.js +11 -13
  47. package/dist/core/codex-lb/bridge-contracts.js +2 -0
  48. package/dist/core/codex-lb/bridge-runtime-validation/capability.js +104 -0
  49. package/dist/core/codex-lb/bridge-runtime-validation/catalog.js +52 -0
  50. package/dist/core/codex-lb/bridge-runtime-validation/shared.js +109 -0
  51. package/dist/core/codex-lb/bridge-runtime-validation/status.js +250 -0
  52. package/dist/core/codex-lb/bridge-runtime-validation.js +106 -0
  53. package/dist/core/codex-lb/capability-runner.js +505 -201
  54. package/dist/core/codex-lb/codex-lb-env.js +179 -12
  55. package/dist/core/codex-lb/combined-catalog/builder.js +86 -0
  56. package/dist/core/codex-lb/combined-catalog/contracts.js +5 -0
  57. package/dist/core/codex-lb/combined-catalog/normalize.js +170 -0
  58. package/dist/core/codex-lb/combined-catalog/persistence.js +207 -0
  59. package/dist/core/codex-lb/combined-catalog/shared.js +12 -0
  60. package/dist/core/codex-lb/combined-catalog/storage.js +171 -0
  61. package/dist/core/codex-lb/combined-catalog.js +12 -0
  62. package/dist/core/codex-lb/desktop-bridge/client.js +4 -1
  63. package/dist/core/codex-lb/desktop-bridge/header-policy.js +48 -63
  64. package/dist/core/codex-lb/desktop-bridge/http-forward.js +115 -83
  65. package/dist/core/codex-lb/desktop-bridge/launchd.js +20 -13
  66. package/dist/core/codex-lb/desktop-bridge/location-rewrite.js +4 -1
  67. package/dist/core/codex-lb/desktop-bridge/security.js +381 -267
  68. package/dist/core/codex-lb/desktop-bridge/server.js +148 -19
  69. package/dist/core/codex-lb/desktop-bridge/state.js +56 -70
  70. package/dist/core/codex-lb/desktop-bridge/types.js +6 -1
  71. package/dist/core/codex-lb/desktop-bridge/websocket-forward.js +281 -106
  72. package/dist/core/codex-lb/desktop-bridge-migration/historical-config.js +245 -0
  73. package/dist/core/codex-lb/desktop-bridge-migration/historical-toml.js +56 -0
  74. package/dist/core/codex-lb/desktop-bridge-migration/metadata.js +73 -0
  75. package/dist/core/codex-lb/desktop-bridge-migration/receipt.js +52 -0
  76. package/dist/core/codex-lb/desktop-bridge-migration/retired-runtime-cleanup.js +106 -0
  77. package/dist/core/codex-lb/desktop-bridge-migration/types.js +1 -0
  78. package/dist/core/codex-lb/desktop-bridge-migration.js +238 -0
  79. package/dist/core/codex-lb/desktop-controller-v3/catalog.js +257 -0
  80. package/dist/core/codex-lb/desktop-controller-v3/diagnostics.js +62 -0
  81. package/dist/core/codex-lb/desktop-controller-v3/lifecycle-commands.js +203 -0
  82. package/dist/core/codex-lb/desktop-controller-v3/live-probes.js +293 -0
  83. package/dist/core/codex-lb/desktop-controller-v3/preflight-probes.js +144 -0
  84. package/dist/core/codex-lb/desktop-controller-v3/provider-commands.js +182 -0
  85. package/dist/core/codex-lb/desktop-controller-v3/shared.js +279 -0
  86. package/dist/core/codex-lb/desktop-controller-v3/status.js +269 -0
  87. package/dist/core/codex-lb/desktop-controller-v3/types.js +1 -0
  88. package/dist/core/codex-lb/desktop-controller-v3/verification.js +89 -0
  89. package/dist/core/codex-lb/desktop-controller-v3.js +67 -0
  90. package/dist/core/codex-lb/desktop-controller.js +2 -1730
  91. package/dist/core/codex-lb/desktop-service.js +462 -627
  92. package/dist/core/codex-lb/migration-receipt.js +560 -118
  93. package/dist/core/codex-lb/probes/auxiliary-surfaces-probe.js +37 -53
  94. package/dist/core/codex-lb/probes/bridge-probe.js +125 -64
  95. package/dist/core/codex-lb/probes/catalog-probe.js +36 -136
  96. package/dist/core/codex-lb/probes/computer-use-probe.js +63 -39
  97. package/dist/core/codex-lb/probes/image-generation-probe.js +98 -41
  98. package/dist/core/codex-lb/probes/probe-evidence.js +32 -33
  99. package/dist/core/codex-lb/probes/voice-realtime-probe.js +69 -43
  100. package/dist/core/codex-lb/provider-credentials/configuration.js +127 -0
  101. package/dist/core/codex-lb/provider-credentials/locks.js +11 -0
  102. package/dist/core/codex-lb/provider-credentials/private-snapshot.js +28 -0
  103. package/dist/core/codex-lb/provider-credentials/removal.js +33 -0
  104. package/dist/core/codex-lb/provider-credentials/resolution.js +59 -0
  105. package/dist/core/codex-lb/provider-credentials/runtime.js +55 -0
  106. package/dist/core/codex-lb/provider-credentials/types.js +1 -0
  107. package/dist/core/codex-lb/provider-credentials/validation-store.js +137 -0
  108. package/dist/core/codex-lb/provider-credentials.js +5 -0
  109. package/dist/core/codex-lb/provider-registry.js +323 -0
  110. package/dist/core/codex-lb/provider-route-policy.js +118 -0
  111. package/dist/core/codex-lb/request-route-resolver.js +172 -0
  112. package/dist/core/codex-lb/route-index.js +148 -0
  113. package/dist/core/codex-lb/trusted-deep-evidence.js +158 -286
  114. package/dist/core/commands/basic-cli.js +1 -1
  115. package/dist/core/commands/check-command.js +3 -10
  116. package/dist/core/commands/gate-result-contract.js +10 -14
  117. package/dist/core/commands/intent-normalization/normalizer.js +1 -1
  118. package/dist/core/commands/mad-sks-command.js +2 -6
  119. package/dist/core/commands/release-command.js +11 -1
  120. package/dist/core/commands/telegram-command.js +46 -6
  121. package/dist/core/doctor/doctor-readiness-matrix.js +9 -7
  122. package/dist/core/doctor/skill-legacy-surface.js +5 -5
  123. package/dist/core/evidence/v2/evidence-key.js +30 -3
  124. package/dist/core/feature-fixtures.js +8 -1
  125. package/dist/core/feature-registry.js +3 -2
  126. package/dist/core/hooks-runtime/stop-finalization.js +11 -1
  127. package/dist/core/hooks-runtime/subagent-context.js +15 -1
  128. package/dist/core/hooks-runtime/subagent-skill-availability-contract.js +1 -1
  129. package/dist/core/hooks-runtime/tool-output-quarantine.js +1 -1
  130. package/dist/core/hooks-runtime.js +73 -87
  131. package/dist/core/image-ux-review/imagegen-adapter.js +108 -94
  132. package/dist/core/image-ux-review/real-callout-extractor.js +144 -14
  133. package/dist/core/imagegen/desktop-bridge-imagegen-target.js +77 -0
  134. package/dist/core/imagegen/imagegen-capability.js +43 -151
  135. package/dist/core/init/skills/filesystem.js +89 -0
  136. package/dist/core/init/skills/inventory.js +97 -0
  137. package/dist/core/init/skills/manifest.js +151 -0
  138. package/dist/core/init/skills.js +5 -325
  139. package/dist/core/init.js +0 -63
  140. package/dist/core/install/installed-package-smoke.js +1 -1
  141. package/dist/core/managed-assets/managed-assets-manifest.js +0 -1
  142. package/dist/core/policy/latest-version-guidance.js +15 -2
  143. package/dist/core/preflight/parallel-preflight-engine.js +27 -51
  144. package/dist/core/provider/provider-badge.js +9 -4
  145. package/dist/core/provider/provider-context.js +57 -107
  146. package/dist/core/providers/openrouter/openrouter-account.js +3 -1
  147. package/dist/core/providers/openrouter/openrouter-secret-store.js +91 -22
  148. package/dist/core/release/desktop-bridge-release-evidence.js +457 -0
  149. package/dist/core/release/gate-manifest.js +0 -1
  150. package/dist/core/release/main-push-guard.js +13 -0
  151. package/dist/core/release/main-push-receipt.js +11 -0
  152. package/dist/core/release/physical-release-gates.js +664 -61
  153. package/dist/core/release/publish-preflight.js +3 -3
  154. package/dist/core/release/release-gate-batch-runner.js +19 -6
  155. package/dist/core/release/release-gate-dag.js +33 -6
  156. package/dist/core/release/release-gate-node.js +1 -3
  157. package/dist/core/release/release-gate-output-contract.js +55 -0
  158. package/dist/core/release/release-pack-contract.js +1 -1
  159. package/dist/core/release/release-pack-receipt.js +209 -8
  160. package/dist/core/release/release-real-contract.js +1 -1
  161. package/dist/core/release/stage-publish.js +106 -28
  162. package/dist/core/retention/temp-lease.js +204 -0
  163. package/dist/core/retention.js +18 -195
  164. package/dist/core/routes.js +1 -2
  165. package/dist/core/safety/intent-contract/intent-contract.js +3 -3
  166. package/dist/core/subagents/naruto-host-credentials.js +6 -1
  167. package/dist/core/subagents/official-subagent-config.js +27 -9
  168. package/dist/core/subagents/official-subagent-runner.js +14 -31
  169. package/dist/core/subagents/wave-lifecycle.js +36 -8
  170. package/dist/core/subagents/wave-parent-guidance.js +2 -1
  171. package/dist/core/telegram/doctor.js +2 -2
  172. package/dist/core/telegram/liveness.js +10 -4
  173. package/dist/core/triwiki/context-graph/compiler/index.js +18 -18
  174. package/dist/core/update/update-migration-state/fast-mode-config.js +172 -0
  175. package/dist/core/update/update-migration-state/session-state-split.js +247 -0
  176. package/dist/core/update/update-migration-state/simple-stages.js +46 -0
  177. package/dist/core/update/update-migration-state.js +4 -481
  178. package/dist/core/version.js +1 -1
  179. package/dist/native/sks-menubar/Sources/OperationCoordinator.swift +28 -4
  180. package/dist/native/sks-menubar/Sources/OperationModels.swift +112 -2
  181. package/dist/native/sks-menubar/Sources/ProviderRouteExplanation.swift +21 -0
  182. package/dist/native/sks-menubar/Sources/ProvidersBridgeCatalog.swift +140 -0
  183. package/dist/native/sks-menubar/Sources/ProvidersOpenRouter.swift +107 -470
  184. package/dist/native/sks-menubar/Sources/ProvidersReliability.swift +27 -197
  185. package/dist/native/sks-menubar/Sources/ProvidersRoutingTruth.swift +335 -269
  186. package/dist/native/sks-menubar/Sources/ProvidersViewController.swift +233 -437
  187. package/dist/native/sks-menubar/Sources/RemoteCodingViewController.swift +16 -7
  188. package/dist/native/sks-menubar/Sources/SecureProcessEnvelope.swift +39 -9
  189. package/dist/native/sks-menubar/Sources/TelegramSupport.swift +56 -0
  190. package/dist/scripts/canonical-test-runner.js +7 -1
  191. package/dist/scripts/check-runtime-schemas.js +7 -2
  192. package/dist/scripts/codex-sdk-real-smoke-check.js +3 -1
  193. package/dist/scripts/desktop-bridge-capabilities-check.js +123 -0
  194. package/dist/scripts/{codex-lb-desktop-bridge-latency-check.js → desktop-bridge-latency-check.js} +61 -16
  195. package/dist/scripts/desktop-bridge-real-evidence-check.js +64 -0
  196. package/dist/scripts/{codex-lb-desktop-bridge-check.js → desktop-bridge-transport-check.js} +92 -155
  197. package/dist/scripts/desktop-bridge-transport-client.js +116 -0
  198. package/dist/scripts/desktop-bridge-unification-check.js +276 -0
  199. package/dist/scripts/doctor-fixes-codex-app-fast-ui-check.js +12 -8
  200. package/dist/scripts/gate-policy-audit-check.js +52 -2
  201. package/dist/scripts/provider-badge-context-check.js +55 -12
  202. package/dist/scripts/publish-preflight.js +1 -2
  203. package/dist/scripts/release-affected-selector-check.js +1 -2
  204. package/dist/scripts/release-aggressive-resource-governor-check.js +1 -1
  205. package/dist/scripts/release-cache-glob-hashing-check.js +1 -0
  206. package/dist/scripts/release-cache-version-neutral-fixture-check.js +1 -0
  207. package/dist/scripts/release-full-parallelism-blackbox.js +1 -1
  208. package/dist/scripts/release-gate-batch-runner-check.js +9 -0
  209. package/dist/scripts/release-gate-dag-runner-check.js +6 -0
  210. package/dist/scripts/release-gate-dag-runner.js +4 -2
  211. package/dist/scripts/release-metadata-check.js +16 -3
  212. package/dist/scripts/release-pack-receipt.js +29 -6
  213. package/dist/scripts/release-physical-gates-check.js +39 -0
  214. package/dist/scripts/release-real-check.js +7 -5
  215. package/package.json +6 -8
  216. package/release-gates.v2.json +156 -157
  217. package/runtime-required-scripts.json +11 -11
  218. package/schemas/codex/desktop-bridge-status-v3.schema.json +286 -0
  219. package/schemas/codex/desktop-capabilities-v3.schema.json +198 -0
  220. package/schemas/release/release-gate-node.schema.json +2 -3
  221. package/dist/cli/codex-lb-setup-warning-output.js +0 -17
  222. package/dist/cli/install-helpers-codex-lb-chain.js +0 -529
  223. package/dist/commands/codex-lb.js +0 -1232
  224. package/dist/core/architecture-hardening/migration/migration.js +0 -111
  225. package/dist/core/codex-app/auxiliary-oauth-policy.js +0 -36
  226. package/dist/core/codex-app/catalog-compat/catalog-service.js +0 -104
  227. package/dist/core/codex-app/child-policy/child-policy.js +0 -35
  228. package/dist/core/codex-app/desktop-routing-snapshot.js +0 -233
  229. package/dist/core/codex-app/glm-model-profile.js +0 -1
  230. package/dist/core/codex-app/glm-profile-installer.js +0 -191
  231. package/dist/core/codex-app/glm-profile-schema.js +0 -42
  232. package/dist/core/codex-app/multi-provider-router.js +0 -391
  233. package/dist/core/codex-app/openrouter-activate.js +0 -405
  234. package/dist/core/codex-app/openrouter-model-catalog.js +0 -217
  235. package/dist/core/codex-app/provider-child-policy.js +0 -64
  236. package/dist/core/codex-app/provider-mode.js +0 -91
  237. package/dist/core/codex-app/provider-session-policy.js +0 -85
  238. package/dist/core/codex-app/session-policy/session-pinning.js +0 -68
  239. package/dist/core/codex-control/codex-lb-launch-recovery.js +0 -319
  240. package/dist/core/codex-lb/codex-lb-setup.js +0 -293
  241. package/dist/core/codex-lb/codex-lb-tool-catalog.js +0 -456
  242. package/dist/core/codex-lb/codex-lb-tool-output-recovery.js +0 -290
  243. package/dist/core/codex-lb/desktop-center-credentials.js +0 -1083
  244. package/dist/core/codex-lb/desktop-mode.js +0 -32
  245. package/dist/core/codex-lb/desktop-real-evidence.js +0 -168
  246. package/dist/core/codex-lb/legacy-migration.js +0 -576
  247. package/dist/core/codex-lb/native-openai-transport/transport.js +0 -68
  248. package/dist/core/codex-lb/provider-routing/provider-router.js +0 -58
  249. package/dist/core/codex-lb/routing-truth.js +0 -327
  250. package/dist/core/imagegen/codex-lb-imagegen-target.js +0 -92
  251. package/dist/native/sks-menubar/Sources/ProvidersConnectTest.swift +0 -118
  252. package/dist/native/sks-menubar/Sources/ProvidersFastMode.swift +0 -17
  253. package/dist/native/sks-menubar/Sources/ProvidersMultiProvider.swift +0 -331
  254. package/dist/native/sks-menubar/Sources/ProvidersRoleModels.swift +0 -260
  255. package/dist/scripts/codex-lb-catalog-passthrough-check.js +0 -120
  256. package/dist/scripts/codex-lb-desktop-auth-invariant-check.js +0 -169
  257. package/dist/scripts/codex-lb-desktop-capabilities-check.js +0 -287
  258. package/dist/scripts/codex-lb-desktop-real-evidence-check.js +0 -123
  259. package/dist/scripts/codex-lb-fast-mode-truth-check.js +0 -114
  260. package/dist/scripts/codex-lb-fast-ui-preservation-check.js +0 -152
  261. package/dist/scripts/codex-lb-gpt56-fast-profile-check.js +0 -231
@@ -1,120 +0,0 @@
1
- #!/usr/bin/env node
2
- import fs from 'node:fs/promises';
3
- import http, {} from 'node:http';
4
- import os from 'node:os';
5
- import path from 'node:path';
6
- import { ensureCodexLbToolCatalog, normalizeCodexLbToolCatalog } from '../core/codex-lb/codex-lb-tool-catalog.js';
7
- import { assertGate, emitGate } from './gate-lib.js';
8
- const gatewayKey = 'catalog-gate-secret';
9
- const sensitiveEcho = 'Bearer catalog-gate-secret-must-not-persist';
10
- const model = {
11
- id: 'future-codex-model',
12
- display_name: 'Future Codex',
13
- supported_reasoning_levels: [{ effort: 'high', future_effort_field: true }],
14
- truncation_policy: { mode: 'tokens', future_policy_field: 17 },
15
- use_responses_lite: true,
16
- future_unknown_field: {
17
- nested: ['preserve', { exactly: true }]
18
- },
19
- debug_echoed_authorization: sensitiveEcho
20
- };
21
- const payload = { models: [model] };
22
- const normalized = normalizeCodexLbToolCatalog(payload);
23
- const normalizedRow = normalized.catalog.models[0];
24
- let observedAuthorization = '';
25
- let observedPath = '';
26
- const upstream = http.createServer((request, response) => {
27
- observedAuthorization = String(request.headers.authorization || '');
28
- observedPath = String(request.url || '');
29
- response.writeHead(200, {
30
- 'content-type': 'application/json',
31
- etag: '"catalog-gate-v2"'
32
- });
33
- response.end(JSON.stringify(payload));
34
- });
35
- const upstreamPort = await listen(upstream);
36
- const temporaryRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'sks-codex-lb-catalog-gate-'));
37
- let ensured = null;
38
- let persisted = null;
39
- let metadata = null;
40
- try {
41
- const home = path.join(temporaryRoot, 'home');
42
- const codexHome = path.join(home, '.codex');
43
- await fs.mkdir(codexHome, { recursive: true });
44
- ensured = await ensureCodexLbToolCatalog({
45
- codexHome,
46
- baseUrl: `http://127.0.0.1:${upstreamPort}/backend-api/codex`,
47
- apiKey: gatewayKey,
48
- clientVersion: '0.145.0'
49
- });
50
- if (ensured.ok) {
51
- persisted = JSON.parse(await fs.readFile(ensured.path, 'utf8'));
52
- metadata = JSON.parse(await fs.readFile(`${ensured.path}.meta.json`, 'utf8'));
53
- }
54
- }
55
- finally {
56
- await close(upstream);
57
- await fs.rm(temporaryRoot, { recursive: true, force: true });
58
- }
59
- const persistedRow = Array.isArray(persisted?.models)
60
- ? persisted.models[0]
61
- : undefined;
62
- const idToSlug = normalized.ok === true
63
- && normalizedRow?.id === model.id
64
- && normalizedRow?.slug === model.id;
65
- const unknownFieldPassthrough = JSON.stringify(normalizedRow?.future_unknown_field) === JSON.stringify(model.future_unknown_field)
66
- && JSON.stringify(persistedRow?.future_unknown_field) === JSON.stringify(model.future_unknown_field);
67
- const fullResponses = normalized.tools_transport === 'full_responses'
68
- && normalizedRow?.use_responses_lite === false
69
- && persistedRow?.use_responses_lite === false;
70
- const secretSafe = normalizedRow?.debug_echoed_authorization === undefined
71
- && persistedRow?.debug_echoed_authorization === undefined
72
- && !JSON.stringify(persisted || {}).includes(gatewayKey)
73
- && !JSON.stringify(persisted || {}).includes(sensitiveEcho);
74
- const fetchedAndBound = ensured?.ok === true
75
- && ensured.status === 'repaired'
76
- && ensured.identity_verified === true
77
- && observedAuthorization === `Bearer ${gatewayKey}`
78
- && observedPath === '/backend-api/codex/models'
79
- && metadata?.identity?.contract === 'codex-model-catalog-pass-through.v2'
80
- && metadata?.unknown_fields_preserved === true
81
- && metadata?.upstream_etag === '"catalog-gate-v2"';
82
- const report = {
83
- schema: 'sks.codex-lb-catalog-passthrough-check.v1',
84
- ok: idToSlug && unknownFieldPassthrough && fullResponses && secretSafe && fetchedAndBound,
85
- id_to_slug: idToSlug,
86
- unknown_field_passthrough: unknownFieldPassthrough,
87
- full_responses: fullResponses,
88
- secret_safe: secretSafe,
89
- localhost_fetch_verified: fetchedAndBound,
90
- contract: normalized.contract,
91
- blockers: [
92
- ...(idToSlug ? [] : ['catalog_id_to_slug_failed']),
93
- ...(unknownFieldPassthrough ? [] : ['catalog_unknown_field_changed']),
94
- ...(fullResponses ? [] : ['catalog_full_responses_not_enforced']),
95
- ...(secretSafe ? [] : ['catalog_secret_persisted']),
96
- ...(fetchedAndBound ? [] : ['catalog_localhost_fetch_unverified'])
97
- ]
98
- };
99
- assertGate(report.ok, 'codex-lb catalog pass-through gate failed', report);
100
- emitGate('codex-lb:catalog-passthrough', {
101
- contract: report.contract,
102
- id_to_slug: report.id_to_slug,
103
- unknown_field_passthrough: report.unknown_field_passthrough,
104
- full_responses: report.full_responses,
105
- localhost_fetch_verified: report.localhost_fetch_verified
106
- });
107
- async function listen(server) {
108
- await new Promise((resolve, reject) => {
109
- server.once('error', reject);
110
- server.listen(0, '127.0.0.1', resolve);
111
- });
112
- return server.address().port;
113
- }
114
- async function close(server) {
115
- if (!server.listening)
116
- return;
117
- await new Promise((resolve, reject) => {
118
- server.close((error) => error ? reject(error) : resolve());
119
- });
120
- }
@@ -1,169 +0,0 @@
1
- #!/usr/bin/env node
2
- import fs from 'node:fs/promises';
3
- import os from 'node:os';
4
- import path from 'node:path';
5
- import { configureCodexLbDesktopRouting } from '../cli/install-helpers.js';
6
- import { assertDesktopAuthUnchangedBySks, captureCodexAuthSnapshot } from '../core/codex-lb/desktop-auth-invariant.js';
7
- import { safeWriteCodexConfigToml } from '../core/codex-runtime/codex-desktop-config-policy.js';
8
- import { assertGate, emitGate } from './gate-lib.js';
9
- const temporaryRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'sks-codex-lb-desktop-auth-gate-'));
10
- let report;
11
- try {
12
- report = await runCheck(temporaryRoot);
13
- }
14
- finally {
15
- await fs.rm(temporaryRoot, { recursive: true, force: true });
16
- }
17
- assertGate(report.ok, 'codex-lb Desktop auth invariant gate failed', report);
18
- emitGate('codex-lb:desktop-auth-invariant', {
19
- auth_byte_invariant: report.auth_byte_invariant,
20
- auth_invariant_rollback: report.auth_invariant_rollback,
21
- conflict_rejected_without_mutation: report.conflict_rejected_without_mutation,
22
- rollback_conflict_preserved: report.rollback_conflict_preserved
23
- });
24
- async function runCheck(root) {
25
- const home = path.join(root, 'home');
26
- const codexHome = path.join(home, '.codex');
27
- const configPath = path.join(codexHome, 'config.toml');
28
- const authPath = path.join(codexHome, 'auth.json');
29
- await fs.mkdir(codexHome, { recursive: true });
30
- const initialConfig = [
31
- 'model = "user-owned-model"',
32
- 'model_reasoning_effort = "high"',
33
- 'service_tier = "standard"',
34
- '',
35
- '[features]',
36
- 'fast_mode = false',
37
- ''
38
- ].join('\n');
39
- const authBytes = Buffer.from([
40
- '{',
41
- ' "auth_mode": "chatgpt",',
42
- ' "account_id": "acct-auth-gate",',
43
- ' "tokens": {',
44
- ' "access_token": "desktop-oauth-access",',
45
- ' "refresh_token": "desktop-oauth-refresh"',
46
- ' }',
47
- '}',
48
- ''
49
- ].join('\n'));
50
- await fs.writeFile(configPath, initialConfig, { mode: 0o600 });
51
- await fs.writeFile(authPath, authBytes, { mode: 0o600 });
52
- const before = await captureCodexAuthSnapshot({ home });
53
- const configured = await configureCodexLbDesktopRouting({
54
- mode: 'desktop-native-bridge',
55
- home,
56
- bridgeBaseUrl: 'http://127.0.0.1:52145/backend-api/codex',
57
- remoteBaseUrl: 'https://lb.example.test/backend-api/codex',
58
- gatewayAuthTransport: 'x-codex-lb-api-key'
59
- });
60
- const after = await captureCodexAuthSnapshot({ home });
61
- await assertDesktopAuthUnchangedBySks(before, after);
62
- const authAfterBytes = await fs.readFile(authPath);
63
- const configuredText = await fs.readFile(configPath, 'utf8');
64
- const conflictConfigPath = path.join(codexHome, 'conflict-config.toml');
65
- const conflictConfig = [
66
- 'model_provider = "user-provider"',
67
- '',
68
- '[model_providers.user-provider]',
69
- 'name = "user-provider"',
70
- 'base_url = "https://user.example.test/v1"',
71
- 'wire_api = "responses"',
72
- ''
73
- ].join('\n');
74
- await fs.writeFile(conflictConfigPath, conflictConfig, { mode: 0o600 });
75
- const conflictBeforeAuth = await fs.readFile(authPath);
76
- const conflict = await configureCodexLbDesktopRouting({
77
- mode: 'desktop-native-bridge',
78
- home,
79
- configPath: conflictConfigPath,
80
- authPath,
81
- bridgeBaseUrl: 'http://127.0.0.1:52145/backend-api/codex',
82
- remoteBaseUrl: 'https://lb.example.test/backend-api/codex',
83
- gatewayAuthTransport: 'x-codex-lb-api-key'
84
- });
85
- const conflictAfterAuth = await fs.readFile(authPath);
86
- const conflictAfterConfig = await fs.readFile(conflictConfigPath, 'utf8');
87
- const rollbackHome = path.join(root, 'rollback-home');
88
- const rollbackCodexHome = path.join(rollbackHome, '.codex');
89
- const rollbackConfigPath = path.join(rollbackCodexHome, 'config.toml');
90
- const rollbackAuthPath = path.join(rollbackCodexHome, 'auth.json');
91
- const rollbackInitialConfig = 'service_tier = "standard"\n';
92
- const rollbackInitialAuth = '{"auth_mode":"chatgpt","account_id":"acct-rollback","tokens":{"access_token":"before"}}\n';
93
- const rollbackRotatedAuth = '{"auth_mode":"chatgpt","account_id":"acct-rollback","tokens":{"access_token":"after"}}\n';
94
- await fs.mkdir(rollbackCodexHome, { recursive: true });
95
- await fs.writeFile(rollbackConfigPath, rollbackInitialConfig, { mode: 0o600 });
96
- await fs.writeFile(rollbackAuthPath, rollbackInitialAuth, { mode: 0o600 });
97
- const originalReadFile = fs.readFile.bind(fs);
98
- const originalWriteFile = fs.writeFile.bind(fs);
99
- let rollbackAuthReads = 0;
100
- fs.readFile = async (file, ...args) => {
101
- if (path.resolve(String(file)) === path.resolve(rollbackAuthPath)) {
102
- rollbackAuthReads += 1;
103
- if (rollbackAuthReads === 2) {
104
- await originalWriteFile(rollbackAuthPath, rollbackRotatedAuth, { mode: 0o600 });
105
- }
106
- }
107
- return originalReadFile(file, ...args);
108
- };
109
- let invariantRollback;
110
- try {
111
- invariantRollback = await configureCodexLbDesktopRouting({
112
- mode: 'desktop-native-bridge',
113
- home: rollbackHome,
114
- bridgeBaseUrl: 'http://127.0.0.1:52146/backend-api/codex',
115
- remoteBaseUrl: 'https://lb.example.test/backend-api/codex',
116
- gatewayAuthTransport: 'x-codex-lb-api-key'
117
- });
118
- }
119
- finally {
120
- ;
121
- fs.readFile = originalReadFile;
122
- fs.writeFile = originalWriteFile;
123
- }
124
- const invariantRollbackConfig = await fs.readFile(rollbackConfigPath, 'utf8');
125
- const invariantRollbackAuth = await fs.readFile(rollbackAuthPath, 'utf8');
126
- const concurrentUserEdit = `${configuredText.trimEnd()}\n# concurrent user edit retained\n`;
127
- await fs.writeFile(configPath, concurrentUserEdit, { mode: 0o600 });
128
- const rollback = await safeWriteCodexConfigToml(configPath, configuredText, initialConfig, 'codex-lb-desktop-routing-auth-invariant-rollback-gate', { verifyUnchangedBeforeWrite: true });
129
- const afterRollbackAttempt = await fs.readFile(configPath, 'utf8');
130
- const authByteInvariant = configured.ok === true
131
- && configured.oauth_preserved === true
132
- && configured.auth_mutated === false
133
- && before.sha256 !== null
134
- && before.sha256 === after.sha256
135
- && authAfterBytes.equals(authBytes);
136
- const conflictRejectedWithoutMutation = conflict.ok === false
137
- && conflict.status === 'failed'
138
- && conflict.blockers.includes('desktop_config_conflict')
139
- && conflictAfterConfig === conflictConfig
140
- && conflictAfterAuth.equals(conflictBeforeAuth);
141
- const authInvariantRollback = invariantRollback.ok === false
142
- && invariantRollback.blockers.includes('desktop_auth_byte_invariant_failed')
143
- && invariantRollback.rollback?.config_restored === true
144
- && invariantRollbackConfig === rollbackInitialConfig
145
- && invariantRollbackAuth === rollbackRotatedAuth;
146
- const rollbackConflictPreserved = rollback.ok === false
147
- && rollback.status === 'concurrent_change_detected'
148
- && afterRollbackAttempt === concurrentUserEdit;
149
- return {
150
- schema: 'sks.codex-lb-desktop-auth-invariant-check.v1',
151
- ok: authByteInvariant
152
- && authInvariantRollback
153
- && conflictRejectedWithoutMutation
154
- && rollbackConflictPreserved,
155
- auth_byte_invariant: authByteInvariant,
156
- auth_invariant_rollback: authInvariantRollback,
157
- conflict_rejected_without_mutation: conflictRejectedWithoutMutation,
158
- rollback_conflict_preserved: rollbackConflictPreserved,
159
- routing_status: configured.status,
160
- conflict_status: conflict.status,
161
- rollback_status: rollback.status,
162
- blockers: [
163
- ...(authByteInvariant ? [] : ['desktop_auth_bytes_changed']),
164
- ...(authInvariantRollback ? [] : ['desktop_auth_invariant_rollback_failed']),
165
- ...(conflictRejectedWithoutMutation ? [] : ['desktop_config_conflict_mutated_state']),
166
- ...(rollbackConflictPreserved ? [] : ['desktop_rollback_overwrote_concurrent_edit'])
167
- ]
168
- };
169
- }
@@ -1,287 +0,0 @@
1
- #!/usr/bin/env node
2
- import { runCodexLbDesktopCapabilityReport, shapeCodexLbDesktopCapabilityStatus } from '../core/codex-lb/capability-runner.js';
3
- import { assertGate, emitGate } from './gate-lib.js';
4
- const checkedAt = '2026-07-28T00:00:00.000Z';
5
- const manifest = {
6
- schema_version: 'codex-lb.desktop-capabilities.v1',
7
- routes: {
8
- responses_http: true,
9
- models: true,
10
- images_generations: true,
11
- realtime_calls: true,
12
- files: true,
13
- transcribe: true,
14
- images_edits: true,
15
- thread_goal: true,
16
- memories_trace_summarize: true,
17
- safety_arc: true,
18
- agent_identities_jwks: true
19
- },
20
- tools: {
21
- image_generation: true,
22
- computer_use_passthrough: true,
23
- web_search: true
24
- }
25
- };
26
- const catalog = {
27
- models: [{
28
- id: 'future-codex-model',
29
- display_name: 'Future Codex',
30
- supported_reasoning_levels: [{ effort: 'high' }],
31
- truncation_policy: { mode: 'tokens' },
32
- additional_speed_tiers: ['fast'],
33
- service_tiers: [{ id: 'priority' }],
34
- use_responses_lite: false,
35
- future_catalog_field: true
36
- }]
37
- };
38
- const advertisedOnly = runCodexLbDesktopCapabilityReport({
39
- mode: 'desktop-native-bridge',
40
- level: 'shallow',
41
- configured: true,
42
- oauthPreserved: true,
43
- checkedAt,
44
- manifest,
45
- gatewayAuth: {
46
- transport: 'x-codex-lb-api-key',
47
- configured: true,
48
- observed: false
49
- },
50
- providerIdentity: {
51
- configured: true,
52
- source: 'config'
53
- },
54
- browserUse: {
55
- advertised: true,
56
- source: 'manifest'
57
- },
58
- plugins: {
59
- advertised: true,
60
- source: 'manifest'
61
- }
62
- });
63
- const advertisedStatus = shapeCodexLbDesktopCapabilityStatus(advertisedOnly);
64
- const fixtureOnly = runCodexLbDesktopCapabilityReport({
65
- mode: 'desktop-native-bridge',
66
- level: 'deep',
67
- configured: true,
68
- oauthPreserved: true,
69
- checkedAt,
70
- manifest,
71
- gatewayAuth: {
72
- transport: 'x-codex-lb-api-key',
73
- configured: true,
74
- observed: true,
75
- fixture: true
76
- },
77
- providerIdentity: {
78
- verified: true,
79
- fixture: true,
80
- source: 'transport'
81
- },
82
- bridge: {
83
- configured: true,
84
- processRunning: true,
85
- transportAttempted: true,
86
- httpRoundTrip: true,
87
- websocketRoundTrip: true,
88
- fixture: true
89
- },
90
- catalog: {
91
- catalog,
92
- configuredServiceTier: 'fast',
93
- pickerControlVisible: true,
94
- pickerSelectedModel: 'future-codex-model',
95
- requestServiceTier: 'fast',
96
- responseActualServiceTier: 'priority',
97
- fixture: true
98
- },
99
- imageGeneration: {
100
- attempted: true,
101
- requestToolsPresent: true,
102
- events: [{ type: 'response.image_generation_call.completed' }],
103
- artifactMaterialized: true,
104
- fixture: true
105
- },
106
- computerUse: {
107
- attempted: true,
108
- events: [{ type: 'response.computer_call.created' }],
109
- localExecutorCompleted: true,
110
- outputSubmitted: true,
111
- followUpCompleted: true,
112
- sessionAffinityPreserved: true,
113
- fixture: true
114
- },
115
- browserUse: {
116
- verified: true,
117
- fixture: true,
118
- source: 'deep_probe'
119
- },
120
- voiceMode: {
121
- attempted: true,
122
- createRouteVerified: true,
123
- locationReceived: true,
124
- locationRewritten: true,
125
- websocketUpgraded: true,
126
- serverEventSeen: true,
127
- cleanClose: true,
128
- ownerBindingVerified: true,
129
- fixture: true
130
- },
131
- plugins: {
132
- verified: true,
133
- fixture: true,
134
- source: 'deep_probe'
135
- },
136
- auxiliarySurfaces: {
137
- attempted: true,
138
- inputEvents: [{ type: 'future.desktop.event', payload: { keep: true } }],
139
- outputEvents: [{ type: 'future.desktop.event', payload: { keep: true } }],
140
- requestBodyHashPreserved: true,
141
- sessionAffinityPreserved: true,
142
- fixture: true
143
- }
144
- });
145
- const fixtureStatus = shapeCodexLbDesktopCapabilityStatus(fixtureOnly);
146
- const textOnly = runCodexLbDesktopCapabilityReport({
147
- mode: 'cli-provider',
148
- level: 'transport',
149
- configured: true,
150
- oauthPreserved: false,
151
- checkedAt,
152
- manifest,
153
- textResponses: {
154
- attempted: true,
155
- verified: true,
156
- source: 'transport',
157
- evidence: { response_completed: true }
158
- },
159
- browserUse: {
160
- advertised: true,
161
- source: 'manifest'
162
- },
163
- plugins: {
164
- advertised: true,
165
- source: 'manifest'
166
- }
167
- });
168
- const authIndependentBase = {
169
- mode: 'cli-provider',
170
- level: 'shallow',
171
- configured: true,
172
- checkedAt,
173
- manifest,
174
- gatewayAuth: {
175
- transport: 'x-codex-lb-api-key',
176
- configured: true,
177
- observed: false
178
- },
179
- providerIdentity: {
180
- requiresOauth: true,
181
- configured: true
182
- },
183
- catalog: {
184
- catalog,
185
- configuredServiceTier: 'fast'
186
- },
187
- browserUse: {
188
- advertised: true,
189
- source: 'manifest'
190
- },
191
- plugins: {
192
- advertised: true,
193
- source: 'manifest'
194
- }
195
- };
196
- const oauthAvailable = runCodexLbDesktopCapabilityReport({
197
- ...authIndependentBase,
198
- oauthPreserved: true
199
- });
200
- const oauthMissing = runCodexLbDesktopCapabilityReport({
201
- ...authIndependentBase,
202
- oauthPreserved: false
203
- });
204
- const fixtureVerifiableKeys = [
205
- 'gateway_auth_transport',
206
- 'provider_identity',
207
- 'bridge',
208
- 'catalog',
209
- 'model_picker',
210
- 'fast_mode',
211
- 'image_generation',
212
- 'computer_use',
213
- 'browser_use',
214
- 'voice_mode',
215
- 'plugins',
216
- 'auxiliary_surfaces'
217
- ];
218
- const authIndependentKeys = [
219
- 'gateway_auth_transport',
220
- 'catalog',
221
- 'model_picker',
222
- 'fast_mode',
223
- 'image_generation',
224
- 'computer_use',
225
- 'browser_use',
226
- 'voice_mode',
227
- 'plugins',
228
- 'auxiliary_surfaces'
229
- ];
230
- const textIndependentKeys = [
231
- 'image_generation',
232
- 'computer_use',
233
- 'browser_use',
234
- 'voice_mode',
235
- 'plugins',
236
- 'auxiliary_surfaces'
237
- ];
238
- const advertisedNotVerified = advertisedStatus.ready === false
239
- && advertisedOnly.overall === 'available_unverified'
240
- && capabilityEntries(advertisedOnly).every(([, evidence]) => evidence.state !== 'verified');
241
- const fixtureNotVerified = fixtureStatus.ready === false
242
- && fixtureOnly.overall === 'available_unverified'
243
- && fixtureVerifiableKeys.every((key) => fixtureOnly[key].state === 'available_unverified');
244
- const textDoesNotPromoteOtherCapabilities = textOnly.text_responses.state === 'verified'
245
- && textIndependentKeys.every((key) => textOnly[key].state !== 'verified');
246
- const independentFromAuthMode = oauthAvailable.provider_identity.state === 'available_unverified'
247
- && oauthMissing.provider_identity.state === 'blocked'
248
- && authIndependentKeys.every((key) => (oauthAvailable[key].state === oauthMissing[key].state
249
- && JSON.stringify(oauthAvailable[key].blockers) === JSON.stringify(oauthMissing[key].blockers)));
250
- const report = {
251
- schema: 'sks.codex-lb-desktop-capabilities-check.v1',
252
- ok: advertisedNotVerified
253
- && fixtureNotVerified
254
- && textDoesNotPromoteOtherCapabilities
255
- && independentFromAuthMode,
256
- advertised_not_verified: advertisedNotVerified,
257
- fixture_not_verified: fixtureNotVerified,
258
- text_does_not_promote_other_capabilities: textDoesNotPromoteOtherCapabilities,
259
- independent_from_auth_mode: independentFromAuthMode,
260
- states: {
261
- advertised_only: advertisedOnly.overall,
262
- fixture_only: fixtureOnly.overall,
263
- text_only: textOnly.overall,
264
- oauth_available_provider_identity: oauthAvailable.provider_identity.state,
265
- oauth_missing_provider_identity: oauthMissing.provider_identity.state
266
- },
267
- blockers: [
268
- ...(advertisedNotVerified ? [] : ['manifest_or_config_promoted_to_verified']),
269
- ...(fixtureNotVerified ? [] : ['fixture_evidence_promoted_to_verified']),
270
- ...(textDoesNotPromoteOtherCapabilities ? [] : ['text_response_evidence_promoted_other_capability']),
271
- ...(independentFromAuthMode ? [] : ['independent_capability_changed_with_auth_mode'])
272
- ]
273
- };
274
- assertGate(report.ok, 'codex-lb Desktop capability evidence gate failed', report);
275
- emitGate('codex-lb:desktop-capabilities', {
276
- advertised_not_verified: report.advertised_not_verified,
277
- fixture_not_verified: report.fixture_not_verified,
278
- text_does_not_promote_other_capabilities: report.text_does_not_promote_other_capabilities,
279
- independent_from_auth_mode: report.independent_from_auth_mode
280
- });
281
- function capabilityEntries(report) {
282
- return Object.entries(report)
283
- .filter((entry) => {
284
- const value = entry[1];
285
- return Boolean(value && typeof value === 'object' && 'state' in value && 'evidence' in value);
286
- });
287
- }