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.
- package/README.md +5 -3
- package/config/codex-releases/{rust-v0.142.0.json → rust-v0.144.1.json} +6 -6
- package/crates/sks-core/Cargo.lock +1 -1
- package/crates/sks-core/Cargo.toml +1 -1
- package/dist/cli/install-helpers.js +255 -440
- package/dist/cli/router.js +53 -4
- package/dist/commands/codex-app.js +8 -3
- package/dist/commands/codex-lb.js +169 -40
- package/dist/commands/codex.js +6 -5
- package/dist/commands/doctor.js +60 -26
- package/dist/commands/versioning.js +7 -0
- package/dist/config/skills-manifest.json +57 -57
- package/dist/core/agents/agent-central-ledger.js +9 -0
- package/dist/core/agents/agent-cleanup-executor.js +334 -41
- package/dist/core/agents/agent-cleanup.js +20 -1
- package/dist/core/agents/agent-command-surface.js +2 -1
- package/dist/core/agents/agent-effort-policy.js +46 -33
- package/dist/core/agents/agent-janitor.js +9 -10
- package/dist/core/agents/agent-namespace-safety.js +56 -0
- package/dist/core/agents/agent-orchestrator.js +26 -4
- package/dist/core/agents/agent-output-validator.js +1 -1
- package/dist/core/agents/agent-proof-evidence.js +16 -2
- package/dist/core/agents/agent-role-config.js +3 -6
- package/dist/core/agents/agent-roster.js +2 -2
- package/dist/core/agents/agent-runner-codex-exec.js +2 -0
- package/dist/core/agents/agent-runner-process.js +1 -0
- package/dist/core/agents/fast-mode-policy.js +3 -5
- package/dist/core/agents/native-cli-session-swarm.js +18 -1
- package/dist/core/agents/native-worker-backend-router.js +180 -108
- package/dist/core/agents/parallel-write-fixture.js +15 -10
- package/dist/core/agents/runtime-proof-summary.js +21 -3
- package/dist/core/agents/work-partition/repo-inventory.js +68 -7
- package/dist/core/code-structure.js +5 -4
- package/dist/core/codex/codex-config-guard.js +31 -9
- package/dist/core/codex-app/codex-app-fast-ui-repair.js +51 -20
- package/dist/core/codex-app/codex-app-restart.js +38 -8
- package/dist/core/codex-app/codex-app-ui-state-snapshot.js +11 -3
- package/dist/core/codex-app/sks-menubar.js +100 -40
- package/dist/core/codex-app.js +60 -17
- package/dist/core/codex-compat/codex-hook-warning-detector.js +10 -1
- package/dist/core/codex-compat/codex-release-manifest.js +6 -6
- package/dist/core/codex-control/codex-0139-doctor-real-probe.js +7 -1
- package/dist/core/codex-control/codex-0139-image-path-real-probe.js +14 -8
- package/dist/core/codex-control/codex-0139-probe-runner.js +103 -28
- package/dist/core/codex-control/codex-0139-real-probe-summary.js +7 -3
- package/dist/core/codex-control/codex-0139-real-probes.js +21 -6
- package/dist/core/codex-control/codex-0139-sandbox-real-probe.js +39 -13
- package/dist/core/codex-control/codex-0139-web-search-probe.js +11 -8
- package/dist/core/codex-control/{codex-0142-capability.js → codex-0144-capability.js} +22 -22
- package/dist/core/codex-control/codex-0144-collab-agent-real-probe.js +63 -0
- package/dist/core/codex-control/codex-model-metadata.js +8 -4
- package/dist/core/codex-control/codex-multi-agent-event-normalizer.js +5 -1
- package/dist/core/codex-control/codex-reliability-shield.js +4 -1
- package/dist/core/codex-control/codex-sdk-adapter.js +53 -6
- package/dist/core/codex-control/codex-sdk-config-policy.js +2 -1
- package/dist/core/codex-control/codex-sdk-sandbox-policy.js +6 -3
- package/dist/core/codex-lb/codex-lb-env.js +107 -0
- package/dist/core/codex-lb/codex-lb-tool-catalog.js +478 -0
- package/dist/core/codex-native/codex-native-feature-broker.js +22 -22
- package/dist/core/codex-native/codex-native-feature-matrix.js +2 -2
- package/dist/core/codex-native/native-capability-postcheck.js +16 -8
- package/dist/core/codex-native/native-capability-repair-matrix.js +76 -27
- package/dist/core/codex-plugins/codex-plugin-json.js +67 -21
- package/dist/core/codex-plugins/codex-plugin-repair.js +118 -0
- package/dist/core/codex-runtime/codex-desktop-config-policy.js +306 -0
- package/dist/core/commands/agent-command.js +19 -0
- package/dist/core/commands/basic-cli.js +45 -24
- package/dist/core/commands/gc-command.js +27 -4
- package/dist/core/commands/image-ux-review-command.js +55 -24
- package/dist/core/commands/mad-sks-command.js +152 -132
- package/dist/core/commands/naruto-command.js +41 -10
- package/dist/core/commands/pipeline-command.js +1 -0
- package/dist/core/commands/wiki-command.js +179 -83
- package/dist/core/computer-use-live-evidence.js +166 -3
- package/dist/core/computer-use-status.js +5 -2
- package/dist/core/daemon/sksd-hook-daemon-entrypoint.js +2 -2
- package/dist/core/daemon/sksd-hook-daemon.js +171 -28
- package/dist/core/daemon/sksd-hook-dispatch.js +2 -2
- package/dist/core/dfix/verification-selector.js +6 -4
- package/dist/core/doctor/browser-use-repair.js +54 -13
- package/dist/core/doctor/codex-0139-doctor.js +3 -2
- package/dist/core/doctor/computer-use-repair.js +28 -39
- package/dist/core/doctor/doctor-codex-startup-repair.js +19 -9
- package/dist/core/doctor/doctor-context7-repair.js +1 -1
- package/dist/core/doctor/doctor-dirty-planner.js +1 -1
- package/dist/core/doctor/doctor-native-capability-repair.js +74 -3
- package/dist/core/doctor/imagegen-repair.js +47 -12
- package/dist/core/doctor/legacy-global-hook-cleanup.js +179 -0
- package/dist/core/feature-registry.js +25 -31
- package/dist/core/fsx.js +54 -6
- package/dist/core/harness-conflicts.js +1 -1
- package/dist/core/hooks-runtime/code-pack-freshness-preflight.js +5 -4
- package/dist/core/hooks-runtime/hook-invocation-dedupe.js +147 -0
- package/dist/core/hooks-runtime/hook-io.js +6 -0
- package/dist/core/hooks-runtime.js +17 -2
- package/dist/core/image/image-artifact-path-contract.js +8 -6
- package/dist/core/image/image-artifact-registry.js +5 -1
- package/dist/core/image-ux-review/imagegen-adapter.js +5 -2
- package/dist/core/imagegen/imagegen-capability.js +10 -13
- package/dist/core/imagegen/require-imagegen.js +37 -11
- package/dist/core/managed-assets/managed-assets-manifest.js +1 -5
- package/dist/core/naruto/naruto-work-graph.js +70 -4
- package/dist/core/naruto/naruto-write-e2e.js +3 -4
- package/dist/core/ops/reporting.js +3 -0
- package/dist/core/pipeline-internals/runtime-core.js +12 -7
- package/dist/core/pipeline-internals/runtime-gates.js +17 -1
- package/dist/core/ppt/style-tokens.js +1 -1
- package/dist/core/ppt-review/index.js +1 -1
- package/dist/core/ppt-review/slide-exporter.js +23 -17
- package/dist/core/ppt-review/slide-imagegen-review.js +1 -1
- package/dist/core/ppt-review/slide-issue-extraction.js +4 -2
- package/dist/core/product-design-plugin.js +2 -2
- package/dist/core/proof/route-finalizer.js +1 -1
- package/dist/core/proof-field.js +3 -3
- package/dist/core/provider/model-router.js +68 -3
- package/dist/core/release/gate-manifest.js +18 -12
- package/dist/core/release/gate-pack-manifest.js +1 -1
- package/dist/core/release/package-size-budget.js +2 -0
- package/dist/core/release/release-gate-affected-selector.js +1 -1
- package/dist/core/release/release-gate-dag.js +43 -3
- package/dist/core/release/release-gate-hermetic-env.js +28 -17
- package/dist/core/release/release-real-contract.js +416 -0
- package/dist/core/retention/retention-budget.js +25 -6
- package/dist/core/retention.js +980 -101
- package/dist/core/routes/constants.js +1 -1
- package/dist/core/routes/evidence.js +4 -4
- package/dist/core/routes/model-mode-router.js +3 -0
- package/dist/core/routes/ppt-policy.js +1 -1
- package/dist/core/routes.js +11 -12
- package/dist/core/secret-redaction.js +4 -0
- package/dist/core/triwiki/code-pack.js +8 -2
- package/dist/core/triwiki/triwiki-cache-key.js +108 -29
- package/dist/core/triwiki-attention.js +13 -6
- package/dist/core/triwiki-provenance.js +274 -0
- package/dist/core/triwiki-runtime.js +21 -7
- package/dist/core/triwiki-wrongness/wrongness-ledger.js +178 -59
- package/dist/core/triwiki-wrongness/wrongness-retrieval.js +11 -2
- package/dist/core/triwiki-wrongness/wrongness-trust-policy.js +2 -0
- package/dist/core/update/update-migration-state.js +1 -1
- package/dist/core/update/update-notice.js +23 -0
- package/dist/core/update-check.js +69 -25
- package/dist/core/version.js +1 -1
- package/dist/core/wiki-coordinate.js +128 -12
- package/dist/core/work-order-ledger.js +168 -9
- package/dist/core/zellij/zellij-command.js +12 -1
- package/dist/core/zellij/zellij-dashboard-pane.js +3 -3
- package/dist/core/zellij/zellij-launcher.js +15 -14
- package/dist/core/zellij/zellij-pane-proof.js +32 -6
- package/dist/core/zellij/zellij-worker-pane-manager.js +5 -3
- package/dist/scripts/agent-fast-mode-default-check.js +48 -29
- package/dist/scripts/agent-role-config-repair-check.js +25 -4
- package/dist/scripts/agent-wiki-context-proof-check.js +16 -2
- package/dist/scripts/all-feature-deep-completion-check.js +14 -4
- package/dist/scripts/build-dist.js +17 -5
- package/dist/scripts/canonical-test-runner.js +188 -0
- package/dist/scripts/check-command-module-budget.js +38 -16
- package/dist/scripts/check-legacy-free.js +1 -1
- package/dist/scripts/codex-0139-interrupt-agent-check.js +5 -1
- package/dist/scripts/{codex-0142-app-server-v2-check.js → codex-0144-app-server-v2-check.js} +11 -10
- package/dist/scripts/{codex-0142-binary-identity-check.js → codex-0144-binary-identity-check.js} +4 -4
- package/dist/scripts/codex-0144-capability-check.js +21 -0
- package/dist/scripts/{codex-0139-real-probes-check.js → codex-0144-core-real-probes-check.js} +19 -5
- package/dist/scripts/{codex-0142-doctor-wiring-check.js → codex-0144-doctor-wiring-check.js} +6 -6
- package/dist/scripts/{codex-0142-manifest-check.js → codex-0144-manifest-check.js} +11 -3
- package/dist/scripts/{codex-0142-policy-check.js → codex-0144-policy-check.js} +2 -2
- package/dist/scripts/{codex-0142-thread-store-check.js → codex-0144-thread-store-check.js} +3 -3
- package/dist/scripts/codex-app-provider-model-ui-check.js +57 -8
- package/dist/scripts/codex-app-ui-preservation-check.js +35 -4
- package/dist/scripts/codex-control-side-effect-scope-check.js +2 -2
- package/dist/scripts/codex-effort-auto-discovery-check.js +1 -1
- package/dist/scripts/codex-lb-fast-mode-truth-check.js +1 -0
- package/dist/scripts/{codex-lb-gpt55-fast-profile-check.js → codex-lb-gpt56-fast-profile-check.js} +56 -5
- package/dist/scripts/codex-model-metadata-check.js +1 -1
- package/dist/scripts/codex-sdk-sandbox-policy-check.js +5 -1
- package/dist/scripts/codex-sdk-version-compat-check.js +2 -1
- package/dist/scripts/dfix-fixture-check.js +1 -1
- package/dist/scripts/docs-truthfulness-check.js +1 -1
- package/dist/scripts/doctor-codex-startup-repair-check.js +35 -10
- package/dist/scripts/doctor-context7-repair-check.js +2 -1
- package/dist/scripts/doctor-fix-proves-codex-read-check.js +1 -1
- package/dist/scripts/doctor-fixes-codex-app-fast-ui-check.js +34 -7
- package/dist/scripts/doctor-imagegen-repair-check.js +14 -4
- package/dist/scripts/doctor-startup-config-repair-blackbox.js +1 -1
- package/dist/scripts/doctor-startup-config-repair-check.js +1 -1
- package/dist/scripts/gate-policy-audit-check.js +2 -2
- package/dist/scripts/install-update-preserves-config-check.js +1 -1
- package/dist/scripts/legacy-gate-inventory-check.js +7 -5
- package/dist/scripts/legacy-strong-inventory-check.js +7 -5
- package/dist/scripts/legacy-upgrade-matrix-check.js +5 -5
- package/dist/scripts/lib/native-cli-session-swarm-check-lib.js +175 -14
- package/dist/scripts/mad-sks-app-ui-no-mutation-check.js +166 -6
- package/dist/scripts/mutation-callsite-coverage-check.js +0 -11
- package/dist/scripts/naruto-shadow-clone-swarm-check.js +88 -50
- package/dist/scripts/npm-publish-performance-check.js +2 -1
- package/dist/scripts/package-published-contract-check.js +9 -0
- package/dist/scripts/packlist-performance-check.js +5 -2
- package/dist/scripts/postinstall-safe-side-effects-check.js +8 -3
- package/dist/scripts/ppt-no-mock-as-real-check.js +3 -1
- package/dist/scripts/product-design-plugin-routing-check.js +1 -1
- package/dist/scripts/release-check-stamp.js +182 -2
- package/dist/scripts/release-dag-full-coverage-check.js +7 -7
- package/dist/scripts/release-dynamic-presets-check.js +8 -0
- package/dist/scripts/release-gate-dag-runner-check.js +3 -2
- package/dist/scripts/release-gate-dag-runner.js +24 -11
- package/dist/scripts/release-gate-existence-audit.js +8 -9
- package/dist/scripts/release-gate-script-parity-check.js +1 -1
- package/dist/scripts/release-real-check.js +368 -157
- package/dist/scripts/release-runtime-truth-matrix-check.js +22 -0
- package/dist/scripts/route-proof-artifact-structure-check.js +1 -0
- package/dist/scripts/scheduler-batch-dispatch-check.js +1 -1
- package/dist/scripts/search-visibility-gate-lib.js +1 -1
- package/dist/scripts/seo-geo-route-identity-check.js +30 -4
- package/dist/scripts/sizecheck.js +7 -2
- package/dist/scripts/sks-1-11-gate-lib.js +53 -6
- package/dist/scripts/sks-menubar-install-check.js +7 -0
- package/dist/scripts/sks-uninstall-regression-check.js +1 -1
- package/dist/scripts/sksd-daemon-check.js +16 -6
- package/dist/scripts/update-default-command-check.js +4 -2
- package/dist/scripts/write-build-manifest.js +2 -1
- package/dist/scripts/zellij-layout-valid-check.js +31 -6
- package/dist/scripts/zellij-pane-proof-check.js +33 -2
- package/dist/scripts/zellij-real-session-cleanup-check.js +122 -2
- package/dist/scripts/zellij-real-session-launch-check.js +76 -5
- package/dist/scripts/zellij-slot-pane-renderer-check.js +4 -4
- package/package.json +27 -30
- package/schemas/codex/{app-server-0.142 → app-server-0.144}/codex_app_server_protocol.v2.schemas.json +1146 -781
- package/schemas/codex/codex-0139-real-probe-result.schema.json +39 -5
- package/schemas/codex/ppt-slide-issue-ledger.schema.json +2 -1
- package/dist/core/codex-control/codex-0139-multi-agent-real-probe.js +0 -107
- package/dist/scripts/agent-native-release-gate.js +0 -274
- package/dist/scripts/codex-0142-capability-check.js +0 -21
- package/dist/scripts/command-performance-scorecard-check.js +0 -204
- package/dist/scripts/config-managed-merge-callsite-coverage-check.js +0 -212
- package/dist/scripts/dollar-performance-scorecard-check.js +0 -257
- package/dist/scripts/gate-timing-check.js +0 -16
- package/dist/scripts/ops-maturity-scorecard-check.js +0 -12
- package/dist/scripts/performance-baseline-check.js +0 -12
- package/dist/scripts/performance-improvement-report-check.js +0 -58
- package/dist/scripts/release-parallel-check.js +0 -389
- package/dist/scripts/release-runner-efficiency-check.js +0 -15
- package/dist/scripts/retention-long-run-smoke-check.js +0 -299
- 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
|
|
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:
|
|
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 : '
|
|
36
|
+
dry_command_warning: dryAccepted ? null : 'permissions-profile alias was advertised but the real sandbox no-op failed'
|
|
36
37
|
},
|
|
37
|
-
blockers: ok ? [] : [
|
|
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
|
|
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
|
|
55
|
-
const
|
|
56
|
-
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
...(
|
|
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.
|
|
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
|
|
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
|
|
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-
|
|
41
|
-
schema: 'sks.codex-
|
|
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 ? [] : [
|
|
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
|
|
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
|
|
23
|
-
if (process.env.
|
|
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-
|
|
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 ? [] : ['
|
|
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-
|
|
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 ? [] : ['
|
|
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
|
|
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
|
|
75
|
-
const rootArtifact = path.join(root, '.sneakoscope', 'codex', 'codex-
|
|
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-
|
|
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 ? [] : [`
|
|
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 ? [] : ['
|
|
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.
|
|
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.
|
|
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-
|
|
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-
|
|
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(
|
|
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-
|
|
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(
|
|
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-
|
|
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-
|
|
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
|
|
72
|
-
|
|
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
|
|
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:
|
|
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
|
|
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 =
|
|
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:
|
|
13
|
+
ok: true,
|
|
11
14
|
sandboxMode: 'workspace-write',
|
|
12
|
-
blockers:
|
|
15
|
+
blockers: []
|
|
13
16
|
};
|
|
14
17
|
}
|
|
15
18
|
const confirmed = contract.user_confirmed_full_access === true && contract.mad_sks_authorized === true;
|