sneakoscope 6.0.2 → 6.1.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 (242) hide show
  1. package/README.md +5 -3
  2. package/config/codex-releases/{rust-v0.142.0.json → rust-v0.144.1.json} +6 -6
  3. package/crates/sks-core/Cargo.lock +1 -1
  4. package/crates/sks-core/Cargo.toml +1 -1
  5. package/dist/cli/install-helpers.js +255 -440
  6. package/dist/cli/router.js +53 -4
  7. package/dist/commands/codex-app.js +8 -3
  8. package/dist/commands/codex-lb.js +169 -40
  9. package/dist/commands/codex.js +6 -5
  10. package/dist/commands/doctor.js +60 -26
  11. package/dist/commands/versioning.js +7 -0
  12. package/dist/config/skills-manifest.json +57 -57
  13. package/dist/core/agents/agent-central-ledger.js +9 -0
  14. package/dist/core/agents/agent-cleanup-executor.js +334 -41
  15. package/dist/core/agents/agent-cleanup.js +20 -1
  16. package/dist/core/agents/agent-command-surface.js +2 -1
  17. package/dist/core/agents/agent-effort-policy.js +46 -33
  18. package/dist/core/agents/agent-janitor.js +9 -10
  19. package/dist/core/agents/agent-namespace-safety.js +56 -0
  20. package/dist/core/agents/agent-orchestrator.js +26 -4
  21. package/dist/core/agents/agent-output-validator.js +1 -1
  22. package/dist/core/agents/agent-proof-evidence.js +16 -2
  23. package/dist/core/agents/agent-role-config.js +3 -6
  24. package/dist/core/agents/agent-roster.js +2 -2
  25. package/dist/core/agents/agent-runner-codex-exec.js +2 -0
  26. package/dist/core/agents/agent-runner-process.js +1 -0
  27. package/dist/core/agents/fast-mode-policy.js +3 -5
  28. package/dist/core/agents/native-cli-session-swarm.js +18 -1
  29. package/dist/core/agents/native-worker-backend-router.js +180 -108
  30. package/dist/core/agents/parallel-write-fixture.js +15 -10
  31. package/dist/core/agents/runtime-proof-summary.js +21 -3
  32. package/dist/core/agents/work-partition/repo-inventory.js +68 -7
  33. package/dist/core/code-structure.js +5 -4
  34. package/dist/core/codex/codex-config-guard.js +31 -9
  35. package/dist/core/codex-app/codex-app-fast-ui-repair.js +51 -20
  36. package/dist/core/codex-app/codex-app-restart.js +38 -8
  37. package/dist/core/codex-app/codex-app-ui-state-snapshot.js +11 -3
  38. package/dist/core/codex-app/sks-menubar.js +100 -40
  39. package/dist/core/codex-app.js +60 -17
  40. package/dist/core/codex-compat/codex-hook-warning-detector.js +10 -1
  41. package/dist/core/codex-compat/codex-release-manifest.js +6 -6
  42. package/dist/core/codex-control/codex-0139-doctor-real-probe.js +7 -1
  43. package/dist/core/codex-control/codex-0139-image-path-real-probe.js +14 -8
  44. package/dist/core/codex-control/codex-0139-probe-runner.js +103 -28
  45. package/dist/core/codex-control/codex-0139-real-probe-summary.js +7 -3
  46. package/dist/core/codex-control/codex-0139-real-probes.js +21 -6
  47. package/dist/core/codex-control/codex-0139-sandbox-real-probe.js +39 -13
  48. package/dist/core/codex-control/codex-0139-web-search-probe.js +11 -8
  49. package/dist/core/codex-control/{codex-0142-capability.js → codex-0144-capability.js} +22 -22
  50. package/dist/core/codex-control/codex-0144-collab-agent-real-probe.js +63 -0
  51. package/dist/core/codex-control/codex-model-metadata.js +8 -4
  52. package/dist/core/codex-control/codex-multi-agent-event-normalizer.js +5 -1
  53. package/dist/core/codex-control/codex-reliability-shield.js +4 -1
  54. package/dist/core/codex-control/codex-sdk-adapter.js +53 -6
  55. package/dist/core/codex-control/codex-sdk-config-policy.js +2 -1
  56. package/dist/core/codex-control/codex-sdk-sandbox-policy.js +6 -3
  57. package/dist/core/codex-lb/codex-lb-env.js +107 -0
  58. package/dist/core/codex-lb/codex-lb-tool-catalog.js +478 -0
  59. package/dist/core/codex-native/codex-native-feature-broker.js +22 -22
  60. package/dist/core/codex-native/codex-native-feature-matrix.js +2 -2
  61. package/dist/core/codex-native/native-capability-postcheck.js +16 -8
  62. package/dist/core/codex-native/native-capability-repair-matrix.js +76 -27
  63. package/dist/core/codex-plugins/codex-plugin-json.js +67 -21
  64. package/dist/core/codex-plugins/codex-plugin-repair.js +118 -0
  65. package/dist/core/codex-runtime/codex-desktop-config-policy.js +306 -0
  66. package/dist/core/commands/agent-command.js +19 -0
  67. package/dist/core/commands/basic-cli.js +45 -24
  68. package/dist/core/commands/gc-command.js +27 -4
  69. package/dist/core/commands/image-ux-review-command.js +55 -24
  70. package/dist/core/commands/mad-sks-command.js +152 -132
  71. package/dist/core/commands/naruto-command.js +41 -10
  72. package/dist/core/commands/pipeline-command.js +1 -0
  73. package/dist/core/commands/wiki-command.js +179 -83
  74. package/dist/core/computer-use-live-evidence.js +166 -3
  75. package/dist/core/computer-use-status.js +5 -2
  76. package/dist/core/daemon/sksd-hook-daemon-entrypoint.js +2 -2
  77. package/dist/core/daemon/sksd-hook-daemon.js +171 -28
  78. package/dist/core/daemon/sksd-hook-dispatch.js +2 -2
  79. package/dist/core/dfix/verification-selector.js +6 -4
  80. package/dist/core/doctor/browser-use-repair.js +54 -13
  81. package/dist/core/doctor/codex-0139-doctor.js +3 -2
  82. package/dist/core/doctor/computer-use-repair.js +28 -39
  83. package/dist/core/doctor/doctor-codex-startup-repair.js +19 -9
  84. package/dist/core/doctor/doctor-context7-repair.js +1 -1
  85. package/dist/core/doctor/doctor-dirty-planner.js +1 -1
  86. package/dist/core/doctor/doctor-native-capability-repair.js +74 -3
  87. package/dist/core/doctor/imagegen-repair.js +47 -12
  88. package/dist/core/doctor/legacy-global-hook-cleanup.js +179 -0
  89. package/dist/core/feature-registry.js +25 -31
  90. package/dist/core/fsx.js +54 -6
  91. package/dist/core/harness-conflicts.js +1 -1
  92. package/dist/core/hooks-runtime/code-pack-freshness-preflight.js +5 -4
  93. package/dist/core/hooks-runtime/hook-invocation-dedupe.js +147 -0
  94. package/dist/core/hooks-runtime/hook-io.js +6 -0
  95. package/dist/core/hooks-runtime.js +17 -2
  96. package/dist/core/image/image-artifact-path-contract.js +8 -6
  97. package/dist/core/image/image-artifact-registry.js +5 -1
  98. package/dist/core/image-ux-review/imagegen-adapter.js +5 -2
  99. package/dist/core/imagegen/imagegen-capability.js +10 -13
  100. package/dist/core/imagegen/require-imagegen.js +37 -11
  101. package/dist/core/managed-assets/managed-assets-manifest.js +1 -5
  102. package/dist/core/naruto/naruto-work-graph.js +70 -4
  103. package/dist/core/naruto/naruto-write-e2e.js +3 -4
  104. package/dist/core/ops/reporting.js +3 -0
  105. package/dist/core/pipeline-internals/runtime-core.js +12 -7
  106. package/dist/core/pipeline-internals/runtime-gates.js +17 -1
  107. package/dist/core/ppt/style-tokens.js +1 -1
  108. package/dist/core/ppt-review/index.js +1 -1
  109. package/dist/core/ppt-review/slide-exporter.js +23 -17
  110. package/dist/core/ppt-review/slide-imagegen-review.js +1 -1
  111. package/dist/core/ppt-review/slide-issue-extraction.js +4 -2
  112. package/dist/core/product-design-plugin.js +2 -2
  113. package/dist/core/proof/route-finalizer.js +1 -1
  114. package/dist/core/proof-field.js +3 -3
  115. package/dist/core/provider/model-router.js +68 -3
  116. package/dist/core/release/gate-manifest.js +18 -12
  117. package/dist/core/release/gate-pack-manifest.js +1 -1
  118. package/dist/core/release/package-size-budget.js +2 -0
  119. package/dist/core/release/release-gate-affected-selector.js +1 -1
  120. package/dist/core/release/release-gate-dag.js +43 -3
  121. package/dist/core/release/release-gate-hermetic-env.js +28 -17
  122. package/dist/core/release/release-real-contract.js +416 -0
  123. package/dist/core/retention/retention-budget.js +25 -6
  124. package/dist/core/retention.js +980 -101
  125. package/dist/core/routes/constants.js +1 -1
  126. package/dist/core/routes/evidence.js +4 -4
  127. package/dist/core/routes/model-mode-router.js +3 -0
  128. package/dist/core/routes/ppt-policy.js +1 -1
  129. package/dist/core/routes.js +11 -12
  130. package/dist/core/secret-redaction.js +4 -0
  131. package/dist/core/triwiki/code-pack.js +8 -2
  132. package/dist/core/triwiki/triwiki-cache-key.js +108 -29
  133. package/dist/core/triwiki-attention.js +13 -6
  134. package/dist/core/triwiki-provenance.js +274 -0
  135. package/dist/core/triwiki-runtime.js +21 -7
  136. package/dist/core/triwiki-wrongness/wrongness-ledger.js +178 -59
  137. package/dist/core/triwiki-wrongness/wrongness-retrieval.js +11 -2
  138. package/dist/core/triwiki-wrongness/wrongness-trust-policy.js +2 -0
  139. package/dist/core/update/update-migration-state.js +1 -1
  140. package/dist/core/update/update-notice.js +23 -0
  141. package/dist/core/update-check.js +69 -25
  142. package/dist/core/version.js +1 -1
  143. package/dist/core/wiki-coordinate.js +128 -12
  144. package/dist/core/work-order-ledger.js +168 -9
  145. package/dist/core/zellij/zellij-command.js +12 -1
  146. package/dist/core/zellij/zellij-dashboard-pane.js +3 -3
  147. package/dist/core/zellij/zellij-launcher.js +15 -14
  148. package/dist/core/zellij/zellij-pane-proof.js +32 -6
  149. package/dist/core/zellij/zellij-worker-pane-manager.js +5 -3
  150. package/dist/scripts/agent-fast-mode-default-check.js +48 -29
  151. package/dist/scripts/agent-role-config-repair-check.js +25 -4
  152. package/dist/scripts/agent-wiki-context-proof-check.js +16 -2
  153. package/dist/scripts/all-feature-deep-completion-check.js +14 -4
  154. package/dist/scripts/build-dist.js +17 -5
  155. package/dist/scripts/canonical-test-runner.js +188 -0
  156. package/dist/scripts/check-command-module-budget.js +38 -16
  157. package/dist/scripts/check-legacy-free.js +1 -1
  158. package/dist/scripts/codex-0139-interrupt-agent-check.js +5 -1
  159. package/dist/scripts/{codex-0142-app-server-v2-check.js → codex-0144-app-server-v2-check.js} +11 -10
  160. package/dist/scripts/{codex-0142-binary-identity-check.js → codex-0144-binary-identity-check.js} +4 -4
  161. package/dist/scripts/codex-0144-capability-check.js +21 -0
  162. package/dist/scripts/{codex-0139-real-probes-check.js → codex-0144-core-real-probes-check.js} +19 -5
  163. package/dist/scripts/{codex-0142-doctor-wiring-check.js → codex-0144-doctor-wiring-check.js} +6 -6
  164. package/dist/scripts/{codex-0142-manifest-check.js → codex-0144-manifest-check.js} +11 -3
  165. package/dist/scripts/{codex-0142-policy-check.js → codex-0144-policy-check.js} +2 -2
  166. package/dist/scripts/{codex-0142-thread-store-check.js → codex-0144-thread-store-check.js} +3 -3
  167. package/dist/scripts/codex-app-provider-model-ui-check.js +57 -8
  168. package/dist/scripts/codex-app-ui-preservation-check.js +35 -4
  169. package/dist/scripts/codex-control-side-effect-scope-check.js +2 -2
  170. package/dist/scripts/codex-effort-auto-discovery-check.js +1 -1
  171. package/dist/scripts/codex-lb-fast-mode-truth-check.js +1 -0
  172. package/dist/scripts/{codex-lb-gpt55-fast-profile-check.js → codex-lb-gpt56-fast-profile-check.js} +56 -5
  173. package/dist/scripts/codex-model-metadata-check.js +1 -1
  174. package/dist/scripts/codex-sdk-sandbox-policy-check.js +5 -1
  175. package/dist/scripts/codex-sdk-version-compat-check.js +2 -1
  176. package/dist/scripts/dfix-fixture-check.js +1 -1
  177. package/dist/scripts/docs-truthfulness-check.js +1 -1
  178. package/dist/scripts/doctor-codex-startup-repair-check.js +35 -10
  179. package/dist/scripts/doctor-context7-repair-check.js +2 -1
  180. package/dist/scripts/doctor-fix-proves-codex-read-check.js +1 -1
  181. package/dist/scripts/doctor-fixes-codex-app-fast-ui-check.js +34 -7
  182. package/dist/scripts/doctor-imagegen-repair-check.js +14 -4
  183. package/dist/scripts/doctor-startup-config-repair-blackbox.js +1 -1
  184. package/dist/scripts/doctor-startup-config-repair-check.js +1 -1
  185. package/dist/scripts/gate-policy-audit-check.js +2 -2
  186. package/dist/scripts/install-update-preserves-config-check.js +1 -1
  187. package/dist/scripts/legacy-gate-inventory-check.js +7 -5
  188. package/dist/scripts/legacy-strong-inventory-check.js +7 -5
  189. package/dist/scripts/legacy-upgrade-matrix-check.js +5 -5
  190. package/dist/scripts/lib/native-cli-session-swarm-check-lib.js +175 -14
  191. package/dist/scripts/mad-sks-app-ui-no-mutation-check.js +166 -6
  192. package/dist/scripts/mutation-callsite-coverage-check.js +0 -11
  193. package/dist/scripts/naruto-shadow-clone-swarm-check.js +88 -50
  194. package/dist/scripts/npm-publish-performance-check.js +2 -1
  195. package/dist/scripts/package-published-contract-check.js +9 -0
  196. package/dist/scripts/packlist-performance-check.js +5 -2
  197. package/dist/scripts/postinstall-safe-side-effects-check.js +8 -3
  198. package/dist/scripts/ppt-no-mock-as-real-check.js +3 -1
  199. package/dist/scripts/product-design-plugin-routing-check.js +1 -1
  200. package/dist/scripts/release-check-stamp.js +182 -2
  201. package/dist/scripts/release-dag-full-coverage-check.js +7 -7
  202. package/dist/scripts/release-dynamic-presets-check.js +8 -0
  203. package/dist/scripts/release-gate-dag-runner-check.js +3 -2
  204. package/dist/scripts/release-gate-dag-runner.js +24 -11
  205. package/dist/scripts/release-gate-existence-audit.js +8 -9
  206. package/dist/scripts/release-gate-script-parity-check.js +1 -1
  207. package/dist/scripts/release-real-check.js +368 -157
  208. package/dist/scripts/release-runtime-truth-matrix-check.js +22 -0
  209. package/dist/scripts/route-proof-artifact-structure-check.js +1 -0
  210. package/dist/scripts/scheduler-batch-dispatch-check.js +1 -1
  211. package/dist/scripts/search-visibility-gate-lib.js +1 -1
  212. package/dist/scripts/seo-geo-route-identity-check.js +30 -4
  213. package/dist/scripts/sizecheck.js +7 -2
  214. package/dist/scripts/sks-1-11-gate-lib.js +53 -6
  215. package/dist/scripts/sks-menubar-install-check.js +7 -0
  216. package/dist/scripts/sks-uninstall-regression-check.js +1 -1
  217. package/dist/scripts/sksd-daemon-check.js +16 -6
  218. package/dist/scripts/update-default-command-check.js +4 -2
  219. package/dist/scripts/write-build-manifest.js +2 -1
  220. package/dist/scripts/zellij-layout-valid-check.js +31 -6
  221. package/dist/scripts/zellij-pane-proof-check.js +33 -2
  222. package/dist/scripts/zellij-real-session-cleanup-check.js +122 -2
  223. package/dist/scripts/zellij-real-session-launch-check.js +76 -5
  224. package/dist/scripts/zellij-slot-pane-renderer-check.js +4 -4
  225. package/package.json +27 -30
  226. package/schemas/codex/{app-server-0.142 → app-server-0.144}/codex_app_server_protocol.v2.schemas.json +1146 -781
  227. package/schemas/codex/codex-0139-real-probe-result.schema.json +39 -5
  228. package/schemas/codex/ppt-slide-issue-ledger.schema.json +2 -1
  229. package/dist/core/codex-control/codex-0139-multi-agent-real-probe.js +0 -107
  230. package/dist/scripts/agent-native-release-gate.js +0 -274
  231. package/dist/scripts/codex-0142-capability-check.js +0 -21
  232. package/dist/scripts/command-performance-scorecard-check.js +0 -204
  233. package/dist/scripts/config-managed-merge-callsite-coverage-check.js +0 -212
  234. package/dist/scripts/dollar-performance-scorecard-check.js +0 -257
  235. package/dist/scripts/gate-timing-check.js +0 -16
  236. package/dist/scripts/ops-maturity-scorecard-check.js +0 -12
  237. package/dist/scripts/performance-baseline-check.js +0 -12
  238. package/dist/scripts/performance-improvement-report-check.js +0 -58
  239. package/dist/scripts/release-parallel-check.js +0 -389
  240. package/dist/scripts/release-runner-efficiency-check.js +0 -15
  241. package/dist/scripts/retention-long-run-smoke-check.js +0 -299
  242. package/docs/assets/sneakoscope-architecture-pipeline.jpg +0 -0
@@ -16,7 +16,8 @@ export async function runCodex0139SandboxProfileAliasProbe(input) {
16
16
  const dryArgs = sandboxHelpMentionsAlias ? ['sandbox', '-P', ':read-only', '--', 'true'] : ['-P', ':read-only', '--version'];
17
17
  const dry = await runProcess(codexBin, dryArgs, { timeoutMs: input.timeoutMs || 30000, maxOutputBytes: 64 * 1024 }).catch((err) => ({ code: 1, stdout: '', stderr: err?.message || String(err) }));
18
18
  const dryAccepted = dry.code === 0;
19
- const ok = topLevelHelpMentionsAlias || sandboxHelpMentionsAlias;
19
+ const helpMentionsAlias = topLevelHelpMentionsAlias || sandboxHelpMentionsAlias;
20
+ const ok = helpMentionsAlias && dryAccepted;
20
21
  return {
21
22
  ok,
22
23
  mode: 'actual-cli',
@@ -26,15 +27,18 @@ export async function runCodex0139SandboxProfileAliasProbe(input) {
26
27
  stderr_tail: codex0139ProbeTail(`${help.stderr || ''}\n${sandboxHelp.stderr || ''}\n${dry.stderr || ''}`),
27
28
  artifact_paths: [],
28
29
  evidence: {
29
- help_mentions_P: topLevelHelpMentionsAlias || sandboxHelpMentionsAlias,
30
+ help_mentions_P: helpMentionsAlias,
30
31
  top_level_help_mentions_P: topLevelHelpMentionsAlias,
31
32
  sandbox_help_mentions_P: sandboxHelpMentionsAlias,
32
33
  dry_command_attempted: true,
33
34
  dry_command_line: [codexBin, ...dryArgs],
34
35
  dry_command_accepted: dryAccepted,
35
- dry_command_warning: dryAccepted ? null : 'help proof accepted; dry no-op unsupported in this CLI shape'
36
+ dry_command_warning: dryAccepted ? null : 'permissions-profile alias was advertised but the real sandbox no-op failed'
36
37
  },
37
- blockers: ok ? [] : ['codex_sandbox_profile_alias_help_missing']
38
+ blockers: ok ? [] : [
39
+ ...(helpMentionsAlias ? [] : ['codex_sandbox_profile_alias_help_missing']),
40
+ ...(dryAccepted ? [] : ['codex_sandbox_profile_alias_real_command_failed'])
41
+ ]
38
42
  };
39
43
  }
40
44
  export async function runCodex0139SandboxProxyPreservationProbe(input) {
@@ -44,16 +48,23 @@ export async function runCodex0139SandboxProxyPreservationProbe(input) {
44
48
  return skippedCodex0139Probe('codex_cli_missing');
45
49
  const tempDir = path.join(input.root, '.sneakoscope', 'tmp', 'codex-0139-real-probes', `sandbox-proxy-${Date.now()}`);
46
50
  await ensureDir(tempDir);
47
- const args = ['sandbox', '-P', ':read-only', '-C', tempDir, '--', 'true'];
51
+ const proxyState = {
52
+ HTTPS_PROXY: Boolean(process.env.HTTPS_PROXY),
53
+ HTTP_PROXY: Boolean(process.env.HTTP_PROXY),
54
+ ALL_PROXY: Boolean(process.env.ALL_PROXY)
55
+ };
56
+ const probeScript = 'process.stdout.write(JSON.stringify({HTTPS_PROXY:Boolean(process.env.HTTPS_PROXY),HTTP_PROXY:Boolean(process.env.HTTP_PROXY),ALL_PROXY:Boolean(process.env.ALL_PROXY)}))';
57
+ const args = ['sandbox', '-P', ':read-only', '-C', tempDir, '--', process.execPath, '-e', probeScript];
48
58
  const result = await runProcess(codexBin, args, {
49
59
  cwd: tempDir,
50
60
  timeoutMs: input.timeoutMs || 30000,
51
61
  maxOutputBytes: 64 * 1024
52
62
  }).catch((err) => ({ code: 1, stdout: '', stderr: err?.message || String(err) }));
53
63
  const safeNoopRan = result.code === 0;
54
- const proxyMarkerAvailable = Boolean(process.env.HTTPS_PROXY || process.env.HTTP_PROXY || process.env.ALL_PROXY);
55
- const approvedEscalationPreservationScriptable = process.env.SKS_CODEX_0139_SANDBOX_PROXY_APPROVED_ESCALATION_RETRY === '1';
56
- const ok = safeNoopRan && (!input.requireReal || approvedEscalationPreservationScriptable);
64
+ const observedProxyState = parseProxyState(result.stdout);
65
+ const proxyEnvironmentPreserved = observedProxyState !== null
66
+ && Object.entries(proxyState).every(([key, value]) => observedProxyState[key] === value);
67
+ const ok = safeNoopRan && proxyEnvironmentPreserved;
57
68
  return {
58
69
  ok,
59
70
  mode: 'actual-cli',
@@ -64,16 +75,31 @@ export async function runCodex0139SandboxProxyPreservationProbe(input) {
64
75
  artifact_paths: [tempDir],
65
76
  evidence: {
66
77
  safe_noop_ran: safeNoopRan,
67
- proxy_marker_available: proxyMarkerAvailable,
68
- proxy_marker_checked: proxyMarkerAvailable,
69
- approved_escalation_preservation_scriptable: approvedEscalationPreservationScriptable,
70
- approved_escalation_retry_env: 'SKS_CODEX_0139_SANDBOX_PROXY_APPROVED_ESCALATION_RETRY=1',
78
+ host_proxy_presence: proxyState,
79
+ sandbox_proxy_presence: observedProxyState,
80
+ proxy_marker_checked: true,
81
+ proxy_environment_preserved: proxyEnvironmentPreserved,
71
82
  permissions_profile: ':read-only'
72
83
  },
73
84
  blockers: ok ? [] : [
74
85
  ...(safeNoopRan ? [] : ['codex_sandbox_proxy_safe_noop_failed']),
75
- ...(input.requireReal && !approvedEscalationPreservationScriptable ? ['codex_sandbox_proxy_escalation_preservation_not_safely_scriptable'] : [])
86
+ ...(proxyEnvironmentPreserved ? [] : ['codex_sandbox_proxy_environment_not_preserved'])
76
87
  ]
77
88
  };
78
89
  }
90
+ function parseProxyState(text) {
91
+ try {
92
+ const parsed = JSON.parse(String(text || ''));
93
+ if (!parsed || typeof parsed !== 'object')
94
+ return null;
95
+ return {
96
+ HTTPS_PROXY: parsed.HTTPS_PROXY === true,
97
+ HTTP_PROXY: parsed.HTTP_PROXY === true,
98
+ ALL_PROXY: parsed.ALL_PROXY === true
99
+ };
100
+ }
101
+ catch {
102
+ return null;
103
+ }
104
+ }
79
105
  //# sourceMappingURL=codex-0139-sandbox-real-probe.js.map
@@ -14,10 +14,10 @@ export async function runCodex0139WebSearchRealProbe(input) {
14
14
  return skippedCodex0139Probe('codex_cli_missing');
15
15
  const tempDir = path.join(input.root, '.sneakoscope', 'tmp', 'codex-0139-real-probes', `web-search-${Date.now()}`);
16
16
  await ensureDir(tempDir);
17
- await writeTextAtomic(path.join(tempDir, 'README.md'), 'Temporary Codex 0.139 web-search real probe workspace.\n');
17
+ await writeTextAtomic(path.join(tempDir, 'README.md'), 'Temporary Codex 0.144.1 web-search real probe workspace.\n');
18
18
  const outputFile = path.join(tempDir, 'last-message.txt');
19
- const prompt = 'In code mode, use standalone web search to find the title of https://example.com or OpenAI Codex release 0.139. Return JSON {"used_web_search":true,"answer":"...","sources":[...]}.';
20
- const args = buildCodexExecArgs({ root: tempDir, prompt, outputFile, json: true, extraArgs: [] });
19
+ const prompt = 'In code mode, use standalone web search to find the title of https://example.com. Return JSON {"used_web_search":true,"answer":"...","sources":[...]}.';
20
+ const args = buildCodexExecArgs({ root: tempDir, prompt, outputFile, json: true, extraArgs: ['-c', 'mcp_servers={}'] });
21
21
  const result = await runProcess(codexBin, args, {
22
22
  cwd: tempDir,
23
23
  timeoutMs: input.timeoutMs || 120000,
@@ -32,13 +32,13 @@ export async function runCodex0139WebSearchRealProbe(input) {
32
32
  const output = await fs.readFile(outputFile, 'utf8').catch(() => '');
33
33
  const combined = `${result.stdout || ''}\n${result.stderr || ''}\n${output}`;
34
34
  const sawWebSearchEvent = /\b(web[_ -]?search|search_result|sources?|tool_call|standalone web search)\b/i.test(combined);
35
- const sawPlaintextResult = /(Example Domain|example\.com|OpenAI|Codex|0\.139)/i.test(combined);
35
+ const sawPlaintextResult = /(Example Domain|example\.com)/i.test(combined);
36
36
  const resultContainsExpectedMarker = /"used_web_search"\s*:\s*true|used_web_search/i.test(combined) || sawWebSearchEvent;
37
37
  const processExitedSuccessfully = result.code === 0;
38
- const ok = sawPlaintextResult && resultContainsExpectedMarker;
38
+ const ok = processExitedSuccessfully && sawPlaintextResult && resultContainsExpectedMarker;
39
39
  if (ok) {
40
- await writeJsonAtomic(path.join(input.root, '.sneakoscope', 'codex-0139-code-mode-web-search-policy.json'), {
41
- schema: 'sks.codex-0139-code-mode-web-search-policy.v1',
40
+ await writeJsonAtomic(path.join(input.root, '.sneakoscope', 'codex-0144-code-mode-web-search-policy.json'), {
41
+ schema: 'sks.codex-0144-code-mode-web-search-policy.v1',
42
42
  ok: true,
43
43
  generated_at: new Date().toISOString(),
44
44
  allow_standalone_web_search_in_code_mode: true,
@@ -66,7 +66,10 @@ export async function runCodex0139WebSearchRealProbe(input) {
66
66
  process_warning: processExitedSuccessfully ? null : 'Codex emitted web-search evidence before process timeout/nonzero exit.',
67
67
  output_file: outputFile
68
68
  },
69
- blockers: ok ? [] : ['codex_web_search_real_probe_failed']
69
+ blockers: ok ? [] : [
70
+ ...(processExitedSuccessfully ? [] : ['codex_web_search_process_failed_or_timed_out']),
71
+ ...(!sawPlaintextResult || !resultContainsExpectedMarker ? ['codex_web_search_real_probe_failed'] : [])
72
+ ]
70
73
  };
71
74
  }
72
75
  //# sourceMappingURL=codex-0139-web-search-probe.js.map
@@ -5,7 +5,7 @@ import { CURRENT_CODEX_RELEASE_MANIFEST } from '../codex-compat/codex-release-ma
5
5
  import { compareSemverLike } from '../codex-compat/codex-version-policy.js';
6
6
  import { ensureDir, nowIso, packageRoot, readJson, runProcess, sha256, writeJsonAtomic } from '../fsx.js';
7
7
  import { resolveCodexRuntime } from '../codex-runtime/resolve-codex-runtime.js';
8
- export const CODEX_0142_FEATURE_KEYS = [
8
+ export const CODEX_0144_FEATURE_KEYS = [
9
9
  'runtime_identity',
10
10
  'protocol_schema_generation',
11
11
  'multi_agent_mode_schema',
@@ -19,13 +19,13 @@ export const CODEX_0142_FEATURE_KEYS = [
19
19
  'remote_native_environment_schema',
20
20
  'app_server_overload_schema'
21
21
  ];
22
- export async function detectCodex0142Capability(input = {}) {
23
- if (process.env.SKS_CODEX_0142_FAKE === '1')
22
+ export async function detectCodex0144Capability(input = {}) {
23
+ if (process.env.SKS_CODEX_0144_FAKE === '1')
24
24
  return fakeCapability();
25
25
  const root = input.root || process.cwd();
26
26
  const runtime = await resolveCodexRuntime({
27
27
  explicitPath: input.codexBin || null,
28
- requestedBy: 'codex-0142-capability'
28
+ requestedBy: 'codex-0144-capability'
29
29
  });
30
30
  if (!runtime.identity) {
31
31
  return blockedCapability('blocked', null, null, [...runtime.blockers]);
@@ -37,7 +37,7 @@ export async function detectCodex0142Capability(input = {}) {
37
37
  const states = featureStatesFromSchema(schemaProbe.text, schemaProbe.ok, appServerClientText);
38
38
  const blockers = [
39
39
  ...(versionOk ? [] : ['codex_0_142_required']),
40
- ...(schemaProbe.ok ? [] : ['codex_0142_schema_generation_failed']),
40
+ ...(schemaProbe.ok ? [] : ['codex_0144_schema_generation_failed']),
41
41
  ...Object.values(states).flatMap((state) => state.blockers)
42
42
  ];
43
43
  const realEnough = blockers.length === 0
@@ -47,7 +47,7 @@ export async function detectCodex0142Capability(input = {}) {
47
47
  && schemaProbe.sha256 === CURRENT_CODEX_RELEASE_MANIFEST.generatedSchemaSha256
48
48
  && Object.values(states).every((state) => state.certainty === 'actual' || state.certainty === 'discovered');
49
49
  return {
50
- schema: 'sks.codex-0142-capability.v1',
50
+ schema: 'sks.codex-0144-capability.v1',
51
51
  generated_at: nowIso(),
52
52
  ok: blockers.length === 0,
53
53
  release_authorizing: realEnough,
@@ -60,23 +60,23 @@ export async function detectCodex0142Capability(input = {}) {
60
60
  feature_states: states,
61
61
  blockers,
62
62
  warnings: [
63
- ...(realEnough ? [] : ['codex_0142_not_release_authorizing_until_schema_hash_and_all_required_real_probes_match']),
63
+ ...(realEnough ? [] : ['codex_0144_not_release_authorizing_until_schema_hash_and_all_required_real_probes_match']),
64
64
  ...(input.requireReal && blockers.length ? ['required_real_probe_blocked'] : [])
65
65
  ]
66
66
  };
67
67
  }
68
- export async function writeCodex0142CapabilityArtifacts(root, input = {}) {
68
+ export async function writeCodex0144CapabilityArtifacts(root, input = {}) {
69
69
  const probeInput = { root };
70
70
  if (input.codexBin !== undefined)
71
71
  probeInput.codexBin = input.codexBin || null;
72
72
  if (input.requireReal !== undefined)
73
73
  probeInput.requireReal = input.requireReal;
74
- const report = await detectCodex0142Capability(probeInput);
75
- const rootArtifact = path.join(root, '.sneakoscope', 'codex', 'codex-0142-capability.json');
74
+ const report = await detectCodex0144Capability(probeInput);
75
+ const rootArtifact = path.join(root, '.sneakoscope', 'codex', 'codex-0144-capability.json');
76
76
  await writeJsonAtomic(rootArtifact, report);
77
77
  let missionArtifact = null;
78
78
  if (input.missionId) {
79
- missionArtifact = path.join(root, '.sneakoscope', 'missions', input.missionId, 'codex-0142-capability.json');
79
+ missionArtifact = path.join(root, '.sneakoscope', 'missions', input.missionId, 'codex-0144-capability.json');
80
80
  await writeJsonAtomic(missionArtifact, report);
81
81
  }
82
82
  return { report, root_artifact: rootArtifact, mission_artifact: missionArtifact };
@@ -89,7 +89,7 @@ function featureStatesFromSchema(schemaText, schemaOk, appServerClientText = '')
89
89
  supported: found,
90
90
  certainty: found ? 'actual' : schemaOk ? 'unverified' : 'failed',
91
91
  evidence: found ? needles.map((needle) => `generated_schema_contains:${needle}`) : [],
92
- blockers: found ? [] : [`codex_0142_${key}_not_verified`]
92
+ blockers: found ? [] : [`codex_0144_${key}_not_verified`]
93
93
  };
94
94
  };
95
95
  return {
@@ -132,11 +132,11 @@ function currentTimeState(schemaTextLower, schemaOk, appServerClientText) {
132
132
  supported: clientHandlesCurrentTime,
133
133
  certainty: clientHandlesCurrentTime ? 'discovered' : schemaOk ? 'unverified' : 'failed',
134
134
  evidence: clientHandlesCurrentTime ? ['sks_app_server_v2_client_handles:currentTime/read'] : [],
135
- blockers: clientHandlesCurrentTime ? [] : ['codex_0142_current_time_read_handler_not_verified']
135
+ blockers: clientHandlesCurrentTime ? [] : ['codex_0144_current_time_read_handler_not_verified']
136
136
  };
137
137
  }
138
138
  async function schemaProbeForMode(root, codexBin, requireReal) {
139
- if (!requireReal && process.env.SKS_CODEX_0142_REFRESH !== '1') {
139
+ if (!requireReal && process.env.SKS_CODEX_0144_REFRESH !== '1') {
140
140
  const shipped = await shippedSchemaProbe();
141
141
  if (shipped.ok)
142
142
  return shipped;
@@ -144,7 +144,7 @@ async function schemaProbeForMode(root, codexBin, requireReal) {
144
144
  return generateSchemaProbe(root, codexBin);
145
145
  }
146
146
  async function shippedSchemaProbe() {
147
- const schemaRoot = path.join(packageRoot(), 'schemas', 'codex', 'app-server-0.142');
147
+ const schemaRoot = path.join(packageRoot(), 'schemas', 'codex', 'app-server-0.144');
148
148
  const files = await listFiles(schemaRoot).catch(() => []);
149
149
  if (!files.length)
150
150
  return { ok: false, text: 'shipped schema cache missing', sha256: null, mode: 'shipped-manifest-cache' };
@@ -166,7 +166,7 @@ async function generateSchemaProbe(root, codexBin) {
166
166
  if (cached?.ok === true && typeof cached.text === 'string' && cached.sha256) {
167
167
  return { ok: true, text: cached.text, sha256: cached.sha256, mode: 'real-schema' };
168
168
  }
169
- const out = path.join(os.tmpdir(), `sks-codex-0142-schema-${process.pid}-${Date.now()}`);
169
+ const out = path.join(os.tmpdir(), `sks-codex-0144-schema-${process.pid}-${Date.now()}`);
170
170
  await ensureDir(out);
171
171
  const result = await runProcess(codexBin, ['app-server', 'generate-json-schema', '--out', out], {
172
172
  cwd: root,
@@ -208,7 +208,7 @@ async function schemaCachePath(root, codexBin) {
208
208
  platform: process.platform,
209
209
  arch: process.arch
210
210
  }));
211
- return path.join(root, '.sneakoscope', 'cache', 'codex-0142-schema', `${key}.json`);
211
+ return path.join(root, '.sneakoscope', 'cache', 'codex-0144-schema', `${key}.json`);
212
212
  }
213
213
  function canonicalSchemaContent(file, text) {
214
214
  if (!file.endsWith('.json'))
@@ -240,14 +240,14 @@ async function listFiles(dir) {
240
240
  return out.sort();
241
241
  }
242
242
  function blockedCapability(probeMode, runtime, schemaSha, blockers) {
243
- const state = Object.fromEntries(CODEX_0142_FEATURE_KEYS.map((key) => [key, {
243
+ const state = Object.fromEntries(CODEX_0144_FEATURE_KEYS.map((key) => [key, {
244
244
  supported: false,
245
245
  certainty: 'failed',
246
246
  evidence: [],
247
247
  blockers
248
248
  }]));
249
249
  return {
250
- schema: 'sks.codex-0142-capability.v1',
250
+ schema: 'sks.codex-0144-capability.v1',
251
251
  generated_at: nowIso(),
252
252
  ok: false,
253
253
  release_authorizing: false,
@@ -263,14 +263,14 @@ function blockedCapability(probeMode, runtime, schemaSha, blockers) {
263
263
  };
264
264
  }
265
265
  function fakeCapability() {
266
- const state = Object.fromEntries(CODEX_0142_FEATURE_KEYS.map((key) => [key, {
266
+ const state = Object.fromEntries(CODEX_0144_FEATURE_KEYS.map((key) => [key, {
267
267
  supported: true,
268
268
  certainty: 'hermetic_fixture',
269
269
  evidence: [`fixture:${key}`],
270
270
  blockers: []
271
271
  }]));
272
272
  return {
273
- schema: 'sks.codex-0142-capability.v1',
273
+ schema: 'sks.codex-0144-capability.v1',
274
274
  generated_at: nowIso(),
275
275
  ok: true,
276
276
  release_authorizing: false,
@@ -285,4 +285,4 @@ function fakeCapability() {
285
285
  warnings: ['fixture_capability_is_not_release_authorizing']
286
286
  };
287
287
  }
288
- //# sourceMappingURL=codex-0142-capability.js.map
288
+ //# sourceMappingURL=codex-0144-capability.js.map
@@ -0,0 +1,63 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { findCodexBinary } from '../codex-adapter.js';
4
+ import { ensureDir, runProcess } from '../fsx.js';
5
+ import { codex0139ProbeTail, skippedCodex0139Probe } from './codex-0139-real-probes.js';
6
+ const CURRENT_COLLAB_TOOLS = ['spawnAgent', 'sendInput', 'resumeAgent', 'wait', 'closeAgent'];
7
+ export async function runCodex0144CollabAgentToolSchemaRealProbe(input) {
8
+ const started = Date.now();
9
+ const codexBin = input.codexBin || await findCodexBinary();
10
+ if (!codexBin)
11
+ return skippedCodex0139Probe('codex_cli_missing');
12
+ const tempDir = path.join(input.root, '.sneakoscope', 'tmp', 'codex-0139-real-probes', `collab-schema-${Date.now()}`);
13
+ await ensureDir(tempDir);
14
+ const args = ['app-server', 'generate-json-schema', '--out', tempDir];
15
+ const result = await runProcess(codexBin, args, {
16
+ cwd: input.root,
17
+ timeoutMs: Math.min(input.timeoutMs || 60_000, 60_000),
18
+ maxOutputBytes: 256 * 1024
19
+ }).catch((err) => ({ code: 1, stdout: '', stderr: err instanceof Error ? err.message : String(err) }));
20
+ const schemaPath = path.join(tempDir, 'codex_app_server_protocol.v2.schemas.json');
21
+ const schema = await readJson(schemaPath);
22
+ const tools = Array.isArray(schema?.definitions?.CollabAgentTool?.enum)
23
+ ? schema.definitions.CollabAgentTool.enum.map(String)
24
+ : [];
25
+ const currentNamesPresent = CURRENT_COLLAB_TOOLS.every((name) => tools.includes(name));
26
+ const legacyInterruptAbsent = !tools.includes('interruptAgent') && !tools.includes('interrupt_agent');
27
+ const collabItemPresent = JSON.stringify(schema?.definitions?.ThreadItem || {}).includes('collabAgentToolCall')
28
+ || JSON.stringify(schema || {}).includes('collabAgentToolCall');
29
+ const processExitedSuccessfully = result.code === 0;
30
+ const ok = processExitedSuccessfully && currentNamesPresent && legacyInterruptAbsent && collabItemPresent;
31
+ return {
32
+ ok,
33
+ mode: 'actual-cli',
34
+ command_line: [codexBin, ...args],
35
+ duration_ms: Date.now() - started,
36
+ stdout_tail: codex0139ProbeTail(result.stdout),
37
+ stderr_tail: codex0139ProbeTail(result.stderr),
38
+ artifact_paths: [schemaPath],
39
+ evidence: {
40
+ schema_generated_by_runtime: processExitedSuccessfully,
41
+ collab_agent_thread_item_present: collabItemPresent,
42
+ collab_agent_tools: tools,
43
+ expected_collab_agent_tools: CURRENT_COLLAB_TOOLS,
44
+ current_names_present: currentNamesPresent,
45
+ legacy_interrupt_agent_absent: legacyInterruptAbsent
46
+ },
47
+ blockers: ok ? [] : [
48
+ ...(processExitedSuccessfully ? [] : ['codex_collab_agent_schema_generation_failed']),
49
+ ...(currentNamesPresent ? [] : ['codex_collab_agent_current_tool_names_missing']),
50
+ ...(legacyInterruptAbsent ? [] : ['codex_collab_agent_legacy_interrupt_name_present']),
51
+ ...(collabItemPresent ? [] : ['codex_collab_agent_thread_item_missing'])
52
+ ]
53
+ };
54
+ }
55
+ async function readJson(file) {
56
+ try {
57
+ return JSON.parse(await fs.readFile(file, 'utf8'));
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
63
+ //# sourceMappingURL=codex-0144-collab-agent-real-probe.js.map
@@ -57,19 +57,23 @@ async function readCodexCliMetadata(model) {
57
57
  return null;
58
58
  }
59
59
  function normalizePayload(payload, fallbackModel, source) {
60
- const catalog = Array.isArray(payload?.models) ? payload.models : null;
60
+ const catalog = Array.isArray(payload?.data) ? payload.data : Array.isArray(payload?.models) ? payload.models : null;
61
61
  const reportedSelection = String(payload?.selected_model || payload?.current_model || payload?.active_model || '').trim();
62
62
  const requestedModel = String(fallbackModel || reportedSelection).trim();
63
63
  const row = catalog
64
64
  ? requestedModel
65
- ? catalog.find((candidate) => String(candidate?.id || candidate?.model || candidate?.name || '') === requestedModel) || null
65
+ ? catalog.find((candidate) => String(candidate?.id || candidate?.model || candidate?.slug || candidate?.name || '') === requestedModel) || null
66
66
  : null
67
67
  : payload?.model_metadata || payload?.metadata || payload;
68
68
  if (!row) {
69
69
  return metadata(requestedModel, [], 'medium', source, [requestedModel ? 'codex_model_not_found_in_advertised_catalog' : 'codex_model_selection_unknown']);
70
70
  }
71
- const efforts = normalizeAdvertisedEfforts(row?.advertised_efforts || row?.advertisedEfforts || row?.reasoning_efforts || row?.reasoningEfforts || payload?.advertised_efforts);
72
- return metadata(String(row?.model || row?.id || row?.name || requestedModel), efforts, row?.default_effort || row?.defaultEffort || payload?.default_effort || 'medium', source, efforts.length ? [] : ['codex_model_metadata_efforts_missing']);
71
+ const effortRows = row?.supportedReasoningEfforts || row?.supported_reasoning_levels || row?.supported_reasoning_efforts || [];
72
+ const structuredEfforts = Array.isArray(effortRows)
73
+ ? effortRows.map((entry) => entry?.reasoningEffort || entry?.effort || entry)
74
+ : [];
75
+ const efforts = normalizeAdvertisedEfforts(structuredEfforts.length ? structuredEfforts : row?.advertised_efforts || row?.advertisedEfforts || row?.reasoning_efforts || row?.reasoningEfforts || payload?.advertised_efforts);
76
+ return metadata(String(row?.model || row?.id || row?.slug || row?.name || requestedModel), efforts, row?.default_reasoning_level || row?.defaultReasoningLevel || row?.default_effort || row?.defaultEffort || payload?.default_effort || 'medium', source, efforts.length ? [] : ['codex_model_metadata_efforts_missing']);
73
77
  }
74
78
  function metadata(model, efforts, defaultEffort, source, blockers) {
75
79
  const advertised = normalizeAdvertisedEfforts(efforts);
@@ -1,6 +1,10 @@
1
1
  export function normalizeCodexMultiAgentEventName(name) {
2
2
  const sourceName = String(name || '');
3
- const normalized = sourceName.trim().toLowerCase().replace(/[-.\s]+/g, '_');
3
+ const normalized = sourceName
4
+ .trim()
5
+ .replace(/([a-z0-9])([A-Z])/g, '$1_$2')
6
+ .toLowerCase()
7
+ .replace(/[-.\s]+/g, '_');
4
8
  if (normalized === 'start_agent' || normalized === 'spawn_agent' || normalized === 'subagent_start') {
5
9
  return { canonical: 'start_agent', stage: 'start', source_name: sourceName };
6
10
  }
@@ -1,8 +1,11 @@
1
1
  import { nowIso } from '../fsx.js';
2
2
  export const CODEX_RELIABILITY_SHIELD_SCHEMA = 'sks.codex-reliability-shield.v1';
3
+ export function codexTimeoutClassForRoute(route, fallback = 'standard') {
4
+ return /^\$?naruto$/i.test(String(route || '').trim()) ? 'long' : fallback;
5
+ }
3
6
  export function normalizeCodexReliabilityPolicy(input) {
4
7
  const policy = input.reliabilityPolicy || {};
5
- const timeoutClass = policy.timeoutClass || (input.tier === 'orchestrator' ? 'long' : 'standard');
8
+ const timeoutClass = codexTimeoutClassForRoute(input.route, policy.timeoutClass || (input.tier === 'orchestrator' ? 'long' : 'standard'));
6
9
  const fallbackIdle = timeoutClass === 'short' ? 20_000 : timeoutClass === 'long' ? 180_000 : 60_000;
7
10
  return {
8
11
  maxEmptyResultRetries: clampInt(policy.maxEmptyResultRetries, 1, 0, 3),
@@ -1,9 +1,12 @@
1
+ import os from 'node:os';
1
2
  import path from 'node:path';
2
3
  import { appendJsonlBounded } from '../fsx.js';
3
4
  import { buildCodexExecutionPolicy, buildCodexSdkConfig } from './codex-sdk-config-policy.js';
4
5
  import { buildCodexSdkEnv } from './codex-sdk-env-policy.js';
5
6
  import { translateCodexSdkEvent } from './codex-event-translator.js';
7
+ import { codexTimeoutClassForRoute } from './codex-reliability-shield.js';
6
8
  import { resolveCodexRuntime } from '../codex-runtime/resolve-codex-runtime.js';
9
+ import { codexLbToolCatalogPath, ensureCodexLbToolCatalog, isCodexLbGpt56Model } from '../codex-lb/codex-lb-tool-catalog.js';
7
10
  export async function runRealCodexSdkTask(input, policy) {
8
11
  const mod = await import('@openai/codex-sdk');
9
12
  const Codex = mod.Codex || mod.default?.Codex || mod.default;
@@ -15,11 +18,30 @@ export async function runRealCodexSdkTask(input, policy) {
15
18
  });
16
19
  if (!runtime.identity)
17
20
  throw new Error(`Codex runtime not found: ${runtime.blockers.join(',')}`);
21
+ const toolCatalog = await prepareCodexLbToolCatalog(input, policy);
22
+ if (toolCatalog.required && !toolCatalog.ok) {
23
+ return {
24
+ ok: false,
25
+ sdkThreadId: '',
26
+ sdkRunId: null,
27
+ events: [],
28
+ finalResponse: '',
29
+ structuredOutput: null,
30
+ blockers: [...new Set(['codex_lb_gpt56_tool_catalog_unavailable', ...(toolCatalog.blockers || [])])],
31
+ liveEventsWritten: false,
32
+ runtimeIdentity: runtime.identity,
33
+ executionPolicy: buildCodexExecutionPolicy(input),
34
+ raw: { tool_catalog: toolCatalog }
35
+ };
36
+ }
18
37
  const executionPolicy = buildCodexExecutionPolicy(input);
38
+ const runtimeConfig = toolCatalog.ok && toolCatalog.path
39
+ ? { ...policy.config, model_catalog_json: toolCatalog.path }
40
+ : policy.config;
19
41
  const codex = new Codex({
20
42
  codexPathOverride: runtime.identity.realpath,
21
43
  env: policy.env,
22
- config: policy.config
44
+ config: runtimeConfig
23
45
  });
24
46
  const threadOptions = {
25
47
  workingDirectory: input.cwd,
@@ -71,7 +93,7 @@ export async function runRealCodexSdkTask(input, policy) {
71
93
  liveEventsWritten,
72
94
  runtimeIdentity: runtime.identity,
73
95
  executionPolicy,
74
- raw: { timeout_ms: timeoutMs, aborted: true }
96
+ raw: { timeout_ms: timeoutMs, aborted: true, tool_catalog: toolCatalog }
75
97
  };
76
98
  }
77
99
  finally {
@@ -90,7 +112,7 @@ export async function runRealCodexSdkTask(input, policy) {
90
112
  liveEventsWritten,
91
113
  runtimeIdentity: runtime.identity,
92
114
  executionPolicy,
93
- raw: { failed_event: failed }
115
+ raw: { failed_event: failed, tool_catalog: toolCatalog }
94
116
  };
95
117
  }
96
118
  const structuredOutput = parseStructuredOutput(finalResponse, Boolean(input.outputSchema));
@@ -105,7 +127,7 @@ export async function runRealCodexSdkTask(input, policy) {
105
127
  runtimeIdentity: runtime.identity,
106
128
  executionPolicy,
107
129
  liveEventsWritten,
108
- raw: { item_count: events.filter((event) => String(event?.type || '').startsWith('item.')).length }
130
+ raw: { item_count: events.filter((event) => String(event?.type || '').startsWith('item.')).length, tool_catalog: toolCatalog }
109
131
  };
110
132
  }
111
133
  export function codexSdkRuntimePolicies(input) {
@@ -113,11 +135,36 @@ export function codexSdkRuntimePolicies(input) {
113
135
  const config = buildCodexSdkConfig(input);
114
136
  return { env, config };
115
137
  }
116
- function codexSdkTurnTimeoutMs(input) {
138
+ async function prepareCodexLbToolCatalog(input, policy) {
139
+ const provider = String(policy.config.model_provider || '');
140
+ const model = String(policy.config.model || input.model || '');
141
+ if (provider !== 'codex-lb' || !isCodexLbGpt56Model(model)) {
142
+ return { schema: 'sks.codex-lb-tool-catalog.v1', ok: true, required: false, status: 'not_required', path: null, blockers: [] };
143
+ }
144
+ const providers = policy.config.model_providers;
145
+ const baseUrl = String(providers?.['codex-lb']?.base_url || policy.env.CODEX_LB_BASE_URL || '');
146
+ const apiKey = String(policy.env.CODEX_LB_API_KEY || '');
147
+ const isolatedCodexHome = String(policy.env.CODEX_HOME || '');
148
+ if (!isolatedCodexHome) {
149
+ return { schema: 'sks.codex-lb-tool-catalog.v1', ok: false, required: true, status: 'blocked', path: null, blockers: ['codex_sdk_isolated_codex_home_missing'] };
150
+ }
151
+ // Model catalogs contain no bearer secret and are identity-bound, owner-only
152
+ // files. Keep one validated global cache so isolated worker CODEX_HOME roots do
153
+ // not each spend a model-call slot fetching the same catalog.
154
+ const sharedCodexHome = String(process.env.CODEX_HOME || path.join(os.homedir(), '.codex'));
155
+ return ensureCodexLbToolCatalog({
156
+ codexHome: isolatedCodexHome,
157
+ outputPath: codexLbToolCatalogPath(sharedCodexHome),
158
+ baseUrl,
159
+ apiKey,
160
+ timeoutMs: 5000
161
+ });
162
+ }
163
+ export function codexSdkTurnTimeoutMs(input) {
117
164
  const explicit = Number(process.env.SKS_CODEX_SDK_TURN_TIMEOUT_MS);
118
165
  if (Number.isFinite(explicit) && explicit > 0)
119
166
  return Math.max(1000, Math.floor(explicit));
120
- const timeoutClass = input.reliabilityPolicy?.timeoutClass || (input.tier === 'orchestrator' ? 'long' : 'standard');
167
+ const timeoutClass = codexTimeoutClassForRoute(input.route, input.reliabilityPolicy?.timeoutClass || (input.tier === 'orchestrator' ? 'long' : 'standard'));
121
168
  if (timeoutClass === 'short')
122
169
  return 45_000;
123
170
  if (timeoutClass === 'long')
@@ -1,3 +1,4 @@
1
+ import { mapCodexSdkSandboxPolicy } from './codex-sdk-sandbox-policy.js';
1
2
  export function buildCodexSdkConfig(input) {
2
3
  const model = String(input.model || process.env.SKS_CODEX_MODEL || process.env.CODEX_MODEL || '').trim();
3
4
  const serviceTier = String(input.serviceTier || process.env.SKS_SERVICE_TIER || 'fast');
@@ -37,7 +38,7 @@ export function buildCodexSdkConfig(input) {
37
38
  return config;
38
39
  }
39
40
  export function buildCodexExecutionPolicy(input) {
40
- const sandbox = String(input.requestedScopeContract?.sandbox || process.env.SKS_CODEX_SANDBOX || 'workspace-write');
41
+ const sandbox = mapCodexSdkSandboxPolicy(input).sandboxMode;
41
42
  const approval = String(process.env.SKS_CODEX_APPROVAL || (String(input.tier || '') === 'verifier' ? 'never' : 'on-request'));
42
43
  const network = String(process.env.SKS_CODEX_NETWORK || 'disabled');
43
44
  const webSearch = String(process.env.SKS_CODEX_WEB_SEARCH || 'cached');
@@ -1,15 +1,18 @@
1
1
  export function mapCodexSdkSandboxPolicy(input) {
2
2
  const contract = input.requestedScopeContract || {};
3
- if (input.sandboxPolicy === 'read-only')
3
+ if (input.sandboxPolicy === 'read-only' || contract.read_only === true || contract.sandbox === 'read-only') {
4
4
  return { ok: true, sandboxMode: 'read-only', blockers: [] };
5
+ }
5
6
  if (input.sandboxPolicy === 'workspace-write') {
6
7
  const allowed = Array.isArray(contract.allowed_paths) ? contract.allowed_paths : [];
7
8
  const writes = Array.isArray(contract.write_paths) ? contract.write_paths : [];
8
9
  const scoped = allowed.length > 0 || writes.length > 0;
10
+ if (!scoped)
11
+ return { ok: true, sandboxMode: 'read-only', blockers: [] };
9
12
  return {
10
- ok: scoped,
13
+ ok: true,
11
14
  sandboxMode: 'workspace-write',
12
- blockers: scoped ? [] : ['codex_sdk_workspace_write_scope_contract_missing']
15
+ blockers: []
13
16
  };
14
17
  }
15
18
  const confirmed = contract.user_confirmed_full_access === true && contract.mad_sks_authorized === true;