@lesliechan721/aw 0.1.0-beta.8 → 0.1.0-beta.9
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/dist/authoring/scripts/add-skill.mjs +4 -4
- package/dist/authoring/scripts/add-skill.mjs.map +1 -1
- package/dist/authoring/scripts/init-plugin.mjs +4 -4
- package/dist/authoring/scripts/init-plugin.mjs.map +1 -1
- package/dist/authoring/scripts/lib/plugin-version-check.mjs +1 -1
- package/dist/authoring/scripts/lib/skill-scaffold.d.mts +77 -90
- package/dist/authoring/scripts/lib/skill-scaffold.mjs +99 -120
- package/dist/authoring/scripts/lib/skill-scaffold.mjs.map +1 -1
- package/dist/authoring/scripts/remove-plugin.mjs +1 -1
- package/dist/authoring/scripts/remove-plugin.mjs.map +1 -1
- package/dist/authoring/scripts/validate-plugin.mjs +34 -778
- package/dist/authoring/scripts/validate-plugin.mjs.map +1 -1
- package/dist/scripts/aw-skill-eval-materializer.d.ts +24 -0
- package/dist/scripts/{plugin-eval-materializer.js → aw-skill-eval-materializer.js} +34 -145
- package/dist/scripts/aw-skill-eval-materializer.js.map +1 -0
- package/dist/scripts/bundle-plugins.d.ts +1 -0
- package/dist/scripts/bundle-plugins.js +2 -1
- package/dist/scripts/bundle-plugins.js.map +1 -1
- package/dist/scripts/plugin-staging.d.ts +5 -6
- package/dist/scripts/plugin-staging.js +12 -13
- package/dist/scripts/plugin-staging.js.map +1 -1
- package/dist/src/authoring/workspace-commands.d.ts +2 -1
- package/dist/src/authoring/workspace-commands.js.map +1 -1
- package/dist/src/commands/aw-capabilities.d.ts +2 -2
- package/dist/src/commands/aw-capabilities.js +6 -11
- package/dist/src/commands/aw-capabilities.js.map +1 -1
- package/dist/src/commands/catalog-dev-source.d.ts +18 -12
- package/dist/src/commands/catalog-dev-source.js +241 -305
- package/dist/src/commands/catalog-dev-source.js.map +1 -1
- package/dist/src/commands/catalog-generation.d.ts +6 -19
- package/dist/src/commands/catalog-generation.js +10 -11
- package/dist/src/commands/catalog-generation.js.map +1 -1
- package/dist/src/commands/catalog-publication-inspection.d.ts +28 -27
- package/dist/src/commands/catalog-publication-inspection.js +139 -50
- package/dist/src/commands/catalog-publication-inspection.js.map +1 -1
- package/dist/src/commands/catalog-publication-journal.d.ts +49 -0
- package/dist/src/commands/catalog-publication-journal.js +147 -0
- package/dist/src/commands/catalog-publication-journal.js.map +1 -0
- package/dist/src/commands/catalog-publication-target.d.ts +2 -1
- package/dist/src/commands/catalog-publication-target.js +37 -2
- package/dist/src/commands/catalog-publication-target.js.map +1 -1
- package/dist/src/commands/catalog-publish.d.ts +51 -15
- package/dist/src/commands/catalog-publish.js +576 -219
- package/dist/src/commands/catalog-publish.js.map +1 -1
- package/dist/src/commands/catalog-source.d.ts +3 -28
- package/dist/src/commands/catalog-source.js +29 -140
- package/dist/src/commands/catalog-source.js.map +1 -1
- package/dist/src/commands/catalog-status.d.ts +6 -26
- package/dist/src/commands/catalog-status.js +8 -146
- package/dist/src/commands/catalog-status.js.map +1 -1
- package/dist/src/commands/catalog-workspace-resolution.d.ts +13 -0
- package/dist/src/commands/catalog-workspace-resolution.js +42 -0
- package/dist/src/commands/catalog-workspace-resolution.js.map +1 -0
- package/dist/src/commands/dependency-operation-plan.d.ts +88 -9
- package/dist/src/commands/dependency-operation-plan.js +331 -6
- package/dist/src/commands/dependency-operation-plan.js.map +1 -1
- package/dist/src/commands/init.d.ts +5 -11
- package/dist/src/commands/init.js +30 -51
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/offline-cleanup-evidence.d.ts +20 -0
- package/dist/src/commands/offline-cleanup-evidence.js +87 -9
- package/dist/src/commands/offline-cleanup-evidence.js.map +1 -1
- package/dist/src/commands/options.d.ts +6 -1
- package/dist/src/commands/options.js +64 -6
- package/dist/src/commands/options.js.map +1 -1
- package/dist/src/commands/plugin-capabilities.js +4 -0
- package/dist/src/commands/plugin-capabilities.js.map +1 -1
- package/dist/src/commands/rebuild-command.d.ts +10 -8
- package/dist/src/commands/rebuild-command.js +1217 -426
- package/dist/src/commands/rebuild-command.js.map +1 -1
- package/dist/src/commands/rebuild-integration.d.ts +54 -6
- package/dist/src/commands/rebuild-integration.js +691 -364
- package/dist/src/commands/rebuild-integration.js.map +1 -1
- package/dist/src/commands/rebuild-operations.d.ts +2 -0
- package/dist/src/commands/rebuild-operations.js +31 -17
- package/dist/src/commands/rebuild-operations.js.map +1 -1
- package/dist/src/commands/skill-eval.d.ts +33 -0
- package/dist/src/commands/skill-eval.js +363 -0
- package/dist/src/commands/skill-eval.js.map +1 -0
- package/dist/src/commands/{status-v5.d.ts → status-v6.d.ts} +59 -26
- package/dist/src/commands/{status-v5.js → status-v6.js} +882 -79
- package/dist/src/commands/status-v6.js.map +1 -0
- package/dist/src/commands/sync-command.d.ts +21 -0
- package/dist/src/commands/sync-command.js +206 -0
- package/dist/src/commands/sync-command.js.map +1 -0
- package/dist/src/commands/wizard.d.ts +2 -2
- package/dist/src/commands/write-commands.js +1 -43
- package/dist/src/commands/write-commands.js.map +1 -1
- package/dist/src/constants.d.ts +5 -4
- package/dist/src/constants.js +5 -4
- package/dist/src/constants.js.map +1 -1
- package/dist/src/eval/manifest-v1.d.ts +66 -0
- package/dist/src/eval/manifest-v1.js +326 -0
- package/dist/src/eval/manifest-v1.js.map +1 -0
- package/dist/src/generators/local-plugin.d.ts +3 -0
- package/dist/src/generators/local-plugin.js +123 -55
- package/dist/src/generators/local-plugin.js.map +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +412 -152
- package/dist/src/index.js.map +1 -1
- package/dist/src/output/command-receipt.d.ts +58 -8
- package/dist/src/output/command-receipt.js +141 -11
- package/dist/src/output/command-receipt.js.map +1 -1
- package/dist/src/output/model.d.ts +3 -11
- package/dist/src/portable/commands.d.ts +2 -2
- package/dist/src/portable/commands.js +2 -8
- package/dist/src/portable/commands.js.map +1 -1
- package/dist/src/portable/materializer.d.ts +1 -4
- package/dist/src/portable/materializer.js +0 -2
- package/dist/src/portable/materializer.js.map +1 -1
- package/dist/src/tui/catalog-generation.d.ts +20 -41
- package/dist/src/tui/catalog-generation.js +65 -224
- package/dist/src/tui/catalog-generation.js.map +1 -1
- package/dist/src/tui/components.js +1 -2
- package/dist/src/tui/components.js.map +1 -1
- package/dist/src/tui/console-app-v4.js +461 -330
- package/dist/src/tui/console-app-v4.js.map +1 -1
- package/dist/src/tui/controller-runtime.d.ts +3 -5
- package/dist/src/tui/controller-runtime.js +182 -187
- package/dist/src/tui/controller-runtime.js.map +1 -1
- package/dist/src/tui/controller.d.ts +42 -45
- package/dist/src/tui/controller.js +454 -407
- package/dist/src/tui/controller.js.map +1 -1
- package/dist/src/tui/diagnostics.d.ts +1 -2
- package/dist/src/tui/diagnostics.js.map +1 -1
- package/dist/src/tui/index.d.ts +1 -1
- package/dist/src/tui/index.js +1 -1
- package/dist/src/tui/index.js.map +1 -1
- package/dist/src/tui/model.d.ts +81 -13
- package/dist/src/tui/model.js +378 -95
- package/dist/src/tui/model.js.map +1 -1
- package/dist/src/tui/router.d.ts +9 -0
- package/dist/src/tui/router.js.map +1 -1
- package/dist/src/types.d.ts +54 -47
- package/dist/src/types.js.map +1 -1
- package/dist/src/utils/agent-version.d.ts +4 -1
- package/dist/src/utils/agent-version.js +28 -3
- package/dist/src/utils/agent-version.js.map +1 -1
- package/dist/src/utils/catalog-digests.d.ts +7 -0
- package/dist/src/utils/catalog-digests.js +27 -0
- package/dist/src/utils/catalog-digests.js.map +1 -1
- package/dist/src/utils/catalog-generation-control-snapshot.d.ts +11 -0
- package/dist/src/utils/catalog-generation-control-snapshot.js +45 -0
- package/dist/src/utils/catalog-generation-control-snapshot.js.map +1 -0
- package/dist/src/utils/catalog-generation-error.d.ts +2 -1
- package/dist/src/utils/catalog-generation-error.js +12 -0
- package/dist/src/utils/catalog-generation-error.js.map +1 -1
- package/dist/src/utils/catalog-generation-resolver.d.ts +10 -3
- package/dist/src/utils/catalog-generation-resolver.js +90 -76
- package/dist/src/utils/catalog-generation-resolver.js.map +1 -1
- package/dist/src/utils/catalog-generation-service.d.ts +24 -33
- package/dist/src/utils/catalog-generation-service.js +253 -567
- package/dist/src/utils/catalog-generation-service.js.map +1 -1
- package/dist/src/utils/catalog-generation-state.d.ts +4 -0
- package/dist/src/utils/catalog-generation-state.js +73 -106
- package/dist/src/utils/catalog-generation-state.js.map +1 -1
- package/dist/src/utils/catalog-generation-store.d.ts +16 -26
- package/dist/src/utils/catalog-generation-store.js +154 -290
- package/dist/src/utils/catalog-generation-store.js.map +1 -1
- package/dist/src/utils/catalog-manifest-v6.d.ts +5 -0
- package/dist/src/utils/{catalog-manifest-v5.js → catalog-manifest-v6.js} +23 -35
- package/dist/src/utils/catalog-manifest-v6.js.map +1 -0
- package/dist/src/utils/catalog-operation-context.d.ts +6 -14
- package/dist/src/utils/catalog-operation-context.js +68 -169
- package/dist/src/utils/catalog-operation-context.js.map +1 -1
- package/dist/src/utils/catalog-public-error.js +1 -4
- package/dist/src/utils/catalog-public-error.js.map +1 -1
- package/dist/src/utils/catalog-runtime-projection.d.ts +3 -0
- package/dist/src/utils/catalog-runtime-projection.js +5 -40
- package/dist/src/utils/catalog-runtime-projection.js.map +1 -1
- package/dist/src/utils/catalog-snapshot.d.ts +2 -2
- package/dist/src/utils/catalog-source-references.d.ts +7 -0
- package/dist/src/utils/catalog-source-references.js +44 -55
- package/dist/src/utils/catalog-source-references.js.map +1 -1
- package/dist/src/utils/catalog-sources.js +25 -9
- package/dist/src/utils/catalog-sources.js.map +1 -1
- package/dist/src/utils/codex-config.d.ts +2 -0
- package/dist/src/utils/codex-config.js +22 -1
- package/dist/src/utils/codex-config.js.map +1 -1
- package/dist/src/utils/codex-manager.d.ts +50 -2
- package/dist/src/utils/codex-manager.js +160 -6
- package/dist/src/utils/codex-manager.js.map +1 -1
- package/dist/src/utils/codex-reconciler.d.ts +131 -0
- package/dist/src/utils/codex-reconciler.js +327 -0
- package/dist/src/utils/codex-reconciler.js.map +1 -0
- package/dist/src/utils/codex-shared-native.d.ts +56 -0
- package/dist/src/utils/codex-shared-native.js +87 -0
- package/dist/src/utils/codex-shared-native.js.map +1 -0
- package/dist/src/utils/codex-surface-analysis.d.ts +44 -0
- package/dist/src/utils/codex-surface-analysis.js +247 -0
- package/dist/src/utils/codex-surface-analysis.js.map +1 -0
- package/dist/src/utils/git-catalog-provider.js +56 -115
- package/dist/src/utils/git-catalog-provider.js.map +1 -1
- package/dist/src/utils/manifest.d.ts +1 -3
- package/dist/src/utils/manifest.js +1 -3
- package/dist/src/utils/manifest.js.map +1 -1
- package/dist/src/utils/multi-source-catalog.d.ts +1 -10
- package/dist/src/utils/multi-source-catalog.js +8 -175
- package/dist/src/utils/multi-source-catalog.js.map +1 -1
- package/dist/src/utils/native-cli.d.ts +34 -0
- package/dist/src/utils/native-cli.js +91 -0
- package/dist/src/utils/native-cli.js.map +1 -1
- package/dist/src/utils/orphan-marketplace-cleanup.js +1 -0
- package/dist/src/utils/orphan-marketplace-cleanup.js.map +1 -1
- package/dist/src/utils/ownership.d.ts +0 -10
- package/dist/src/utils/ownership.js +3 -88
- package/dist/src/utils/ownership.js.map +1 -1
- package/dist/src/utils/path-catalog-provider.d.ts +1 -1
- package/dist/src/utils/path-catalog-provider.js +45 -62
- package/dist/src/utils/path-catalog-provider.js.map +1 -1
- package/dist/src/utils/paths.d.ts +0 -1
- package/dist/src/utils/paths.js +0 -1
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/plugin-config-write.js +0 -5
- package/dist/src/utils/plugin-config-write.js.map +1 -1
- package/dist/src/utils/plugin-intent-state.d.ts +39 -0
- package/dist/src/utils/plugin-intent-state.js +325 -0
- package/dist/src/utils/plugin-intent-state.js.map +1 -0
- package/dist/src/utils/target-eligibility.d.ts +3 -2
- package/dist/src/utils/target-eligibility.js +4 -3
- package/dist/src/utils/target-eligibility.js.map +1 -1
- package/package.json +5 -4
- package/dist/scripts/aw-skill-eval-engine.d.ts +0 -13
- package/dist/scripts/aw-skill-eval-engine.js +0 -31
- package/dist/scripts/aw-skill-eval-engine.js.map +0 -1
- package/dist/scripts/codex-eval-app-server.d.ts +0 -91
- package/dist/scripts/codex-eval-app-server.js +0 -1334
- package/dist/scripts/codex-eval-app-server.js.map +0 -1
- package/dist/scripts/codex-eval-isolation.d.ts +0 -61
- package/dist/scripts/codex-eval-isolation.js +0 -318
- package/dist/scripts/codex-eval-isolation.js.map +0 -1
- package/dist/scripts/codex-eval-process-management.d.ts +0 -8
- package/dist/scripts/codex-eval-process-management.js +0 -69
- package/dist/scripts/codex-eval-process-management.js.map +0 -1
- package/dist/scripts/codex-eval-process-tree.d.ts +0 -38
- package/dist/scripts/codex-eval-process-tree.js +0 -803
- package/dist/scripts/codex-eval-process-tree.js.map +0 -1
- package/dist/scripts/codex-eval-runtime-config.d.ts +0 -62
- package/dist/scripts/codex-eval-runtime-config.js +0 -843
- package/dist/scripts/codex-eval-runtime-config.js.map +0 -1
- package/dist/scripts/codex-trigger-eval.d.ts +0 -84
- package/dist/scripts/codex-trigger-eval.js +0 -968
- package/dist/scripts/codex-trigger-eval.js.map +0 -1
- package/dist/scripts/eval-plugin-skills-audited.d.ts +0 -6
- package/dist/scripts/eval-plugin-skills-audited.js +0 -261
- package/dist/scripts/eval-plugin-skills-audited.js.map +0 -1
- package/dist/scripts/eval-plugin-skills.d.ts +0 -45
- package/dist/scripts/eval-plugin-skills.js +0 -1589
- package/dist/scripts/eval-plugin-skills.js.map +0 -1
- package/dist/scripts/eval-run-layout.d.ts +0 -17
- package/dist/scripts/eval-run-layout.js +0 -26
- package/dist/scripts/eval-run-layout.js.map +0 -1
- package/dist/scripts/plugin-eval-contract.d.ts +0 -189
- package/dist/scripts/plugin-eval-contract.js +0 -745
- package/dist/scripts/plugin-eval-contract.js.map +0 -1
- package/dist/scripts/plugin-eval-materializer.d.ts +0 -13
- package/dist/scripts/plugin-eval-materializer.js.map +0 -1
- package/dist/scripts/skill-reporting.d.ts +0 -212
- package/dist/scripts/skill-reporting.js +0 -922
- package/dist/scripts/skill-reporting.js.map +0 -1
- package/dist/src/commands/catalog-context.d.ts +0 -52
- package/dist/src/commands/catalog-context.js +0 -156
- package/dist/src/commands/catalog-context.js.map +0 -1
- package/dist/src/commands/status-v5.js.map +0 -1
- package/dist/src/utils/catalog-manifest-v5.d.ts +0 -5
- package/dist/src/utils/catalog-manifest-v5.js.map +0 -1
- package/dist/src/utils/catalog-source-cache.d.ts +0 -62
- package/dist/src/utils/catalog-source-cache.js +0 -321
- package/dist/src/utils/catalog-source-cache.js.map +0 -1
- package/dist/src/utils/codex-project-surface.d.ts +0 -3
- package/dist/src/utils/codex-project-surface.js +0 -49
- package/dist/src/utils/codex-project-surface.js.map +0 -1
- package/dist/src/utils/plugin-release.d.ts +0 -2
- package/dist/src/utils/plugin-release.js +0 -2
- package/dist/src/utils/plugin-release.js.map +0 -1
|
@@ -1,843 +0,0 @@
|
|
|
1
|
-
import { execFile } from 'node:child_process';
|
|
2
|
-
import { createHash } from 'node:crypto';
|
|
3
|
-
import os from 'node:os';
|
|
4
|
-
import path from 'node:path';
|
|
5
|
-
import { promisify } from 'node:util';
|
|
6
|
-
import fs from 'fs-extra';
|
|
7
|
-
import { ParseError, parseTOML } from 'toml-eslint-parser';
|
|
8
|
-
import { CODEX_EVAL_CREDENTIAL_CONFIG_LINES } from './codex-eval-isolation.js';
|
|
9
|
-
export const DEFAULT_CODEX_EVAL_MODEL = 'gpt-5.6-luna';
|
|
10
|
-
const MODEL_CONFIG_KEYS = new Set([
|
|
11
|
-
'model',
|
|
12
|
-
'model_provider',
|
|
13
|
-
'model_reasoning_effort',
|
|
14
|
-
'model_reasoning_summary',
|
|
15
|
-
'model_verbosity',
|
|
16
|
-
]);
|
|
17
|
-
const OPENAI_AUTH_FILES = ['auth.json', '.credentials.json'];
|
|
18
|
-
const EVAL_PROCESS_PASSTHROUGH_ENV = [
|
|
19
|
-
'PATH',
|
|
20
|
-
'LANG',
|
|
21
|
-
'LC_ALL',
|
|
22
|
-
'HTTP_PROXY',
|
|
23
|
-
'HTTPS_PROXY',
|
|
24
|
-
'ALL_PROXY',
|
|
25
|
-
'NO_PROXY',
|
|
26
|
-
'SSL_CERT_FILE',
|
|
27
|
-
'SSL_CERT_DIR',
|
|
28
|
-
'NODE_EXTRA_CA_CERTS',
|
|
29
|
-
];
|
|
30
|
-
const RESERVED_PROVIDER_ENV = new Set([
|
|
31
|
-
...EVAL_PROCESS_PASSTHROUGH_ENV,
|
|
32
|
-
'HOME',
|
|
33
|
-
'USERPROFILE',
|
|
34
|
-
'CODEX_HOME',
|
|
35
|
-
'TMPDIR',
|
|
36
|
-
'TEMP',
|
|
37
|
-
'TMP',
|
|
38
|
-
'NODE_OPTIONS',
|
|
39
|
-
'NODE_PATH',
|
|
40
|
-
'BASH_ENV',
|
|
41
|
-
'ENV',
|
|
42
|
-
'LD_PRELOAD',
|
|
43
|
-
]);
|
|
44
|
-
const SENSITIVE_PASSTHROUGH_ENV = new Set([
|
|
45
|
-
'HTTP_PROXY',
|
|
46
|
-
'HTTPS_PROXY',
|
|
47
|
-
'ALL_PROXY',
|
|
48
|
-
'NO_PROXY',
|
|
49
|
-
]);
|
|
50
|
-
const ACTIVE_RUNTIME_ROOTS = new Set();
|
|
51
|
-
const ACTIVE_SIGNAL_CLEANUPS = new Set();
|
|
52
|
-
const CAPSULE_SIGNALS = ['SIGINT', 'SIGTERM'];
|
|
53
|
-
const RUNTIME_ROOT_REMOVE_ATTEMPTS = 4;
|
|
54
|
-
const RUNTIME_ROOT_REMOVE_RETRY_MS = 50;
|
|
55
|
-
export const CODEX_EVAL_CLI_ENTRY_ENV = 'AW_PLUGIN_EVAL_CLI_ENTRY';
|
|
56
|
-
export const CODEX_EVAL_CLI_NODE_ENV = 'AW_PLUGIN_EVAL_CLI_NODE';
|
|
57
|
-
const capsuleSignalHandlers = new Map();
|
|
58
|
-
let capsuleSignalCleanupInProgress = false;
|
|
59
|
-
let codexEvalSignalShutdownRequested = false;
|
|
60
|
-
const execFileAsync = promisify(execFile);
|
|
61
|
-
async function materializeEvalCliLauncher(root, cliEntry) {
|
|
62
|
-
const entry = path.resolve(cliEntry);
|
|
63
|
-
const stat = await fs.stat(entry).catch(() => null);
|
|
64
|
-
if (!stat?.isFile()) {
|
|
65
|
-
throw new Error(`Codex eval CLI entry is not a regular file: ${entry}`);
|
|
66
|
-
}
|
|
67
|
-
const bin = path.join(root, 'bin');
|
|
68
|
-
await fs.ensureDir(bin, { mode: 0o700 });
|
|
69
|
-
if (process.platform === 'win32') {
|
|
70
|
-
const launcher = path.join(bin, 'aw.cmd');
|
|
71
|
-
await fs.writeFile(launcher, `@"%${CODEX_EVAL_CLI_NODE_ENV}%" "%${CODEX_EVAL_CLI_ENTRY_ENV}%" %*\r\n` +
|
|
72
|
-
'@exit /b %errorlevel%\r\n', { encoding: 'utf8', mode: 0o700 });
|
|
73
|
-
return bin;
|
|
74
|
-
}
|
|
75
|
-
const launcher = path.join(bin, 'aw');
|
|
76
|
-
await fs.writeFile(launcher, `#!/bin/sh\nexec "$${CODEX_EVAL_CLI_NODE_ENV}" "$${CODEX_EVAL_CLI_ENTRY_ENV}" "$@"\n`, { encoding: 'utf8', mode: 0o700 });
|
|
77
|
-
await fs.chmod(launcher, 0o700);
|
|
78
|
-
return bin;
|
|
79
|
-
}
|
|
80
|
-
async function pruneEvalCliDeployment(root) {
|
|
81
|
-
await Promise.all([
|
|
82
|
-
fs.remove(path.join(root, 'plugins')),
|
|
83
|
-
fs.remove(path.join(root, 'pnpm-lock.yaml')),
|
|
84
|
-
fs.remove(path.join(root, 'node_modules', '.modules.yaml')),
|
|
85
|
-
fs.remove(path.join(root, 'node_modules', '.pnpm-workspace-state-v1.json')),
|
|
86
|
-
fs.remove(path.join(root, 'node_modules', '.pnpm', 'lock.yaml')),
|
|
87
|
-
fs.remove(path.join(root, 'node_modules', '.pnpm', 'node_modules', '@lesliechan721', 'aw')),
|
|
88
|
-
]);
|
|
89
|
-
const removals = [];
|
|
90
|
-
async function visit(current, insideNodeModules = false) {
|
|
91
|
-
const entries = await fs.readdir(current, { withFileTypes: true });
|
|
92
|
-
for (const entry of entries) {
|
|
93
|
-
const target = path.join(current, entry.name);
|
|
94
|
-
if (entry.isSymbolicLink())
|
|
95
|
-
continue;
|
|
96
|
-
if (entry.isDirectory()) {
|
|
97
|
-
if (['.git', '.agents', '.codex'].includes(entry.name) ||
|
|
98
|
-
(insideNodeModules && entry.name === '.bin')) {
|
|
99
|
-
removals.push(target);
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
await visit(target, insideNodeModules || entry.name === 'node_modules');
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
else if (entry.isFile() && (entry.name.endsWith('.ts') || entry.name.endsWith('.map'))) {
|
|
106
|
-
removals.push(target);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
await visit(root);
|
|
111
|
-
for (let index = 0; index < removals.length; index += 64) {
|
|
112
|
-
await Promise.all(removals.slice(index, index + 64).map((target) => fs.remove(target)));
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
async function assertContainedEvalCliDeployment(root, forbiddenBytes) {
|
|
116
|
-
const canonicalRoot = await fs.realpath(root);
|
|
117
|
-
const files = [];
|
|
118
|
-
const links = [];
|
|
119
|
-
async function visit(current, insideNodeModules = false) {
|
|
120
|
-
for (const entry of await fs.readdir(current, { withFileTypes: true })) {
|
|
121
|
-
const target = path.join(current, entry.name);
|
|
122
|
-
if (entry.isSymbolicLink()) {
|
|
123
|
-
const resolved = await fs.realpath(target);
|
|
124
|
-
if (resolved !== canonicalRoot && !resolved.startsWith(`${canonicalRoot}${path.sep}`)) {
|
|
125
|
-
throw new Error(`Codex eval CLI deployment contains escaping symlink ${target}.`);
|
|
126
|
-
}
|
|
127
|
-
links.push({
|
|
128
|
-
path: path.relative(root, target).split(path.sep).join('/'),
|
|
129
|
-
target: await fs.readlink(target),
|
|
130
|
-
});
|
|
131
|
-
continue;
|
|
132
|
-
}
|
|
133
|
-
if (entry.isDirectory()) {
|
|
134
|
-
if (['.git', '.agents', '.codex', 'plugins'].includes(entry.name) ||
|
|
135
|
-
(insideNodeModules && entry.name === '.bin')) {
|
|
136
|
-
throw new Error(`Codex eval CLI deployment contains forbidden directory ${target}.`);
|
|
137
|
-
}
|
|
138
|
-
await visit(target, insideNodeModules || entry.name === 'node_modules');
|
|
139
|
-
}
|
|
140
|
-
else if (entry.isFile()) {
|
|
141
|
-
if (entry.name.endsWith('.ts') || entry.name.endsWith('.map')) {
|
|
142
|
-
throw new Error(`Codex eval CLI deployment contains non-runtime file ${target}.`);
|
|
143
|
-
}
|
|
144
|
-
files.push(target);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
await visit(root);
|
|
149
|
-
const fragments = [...new Set(forbiddenBytes.filter(Boolean))].map((value) => Buffer.from(value));
|
|
150
|
-
const records = [];
|
|
151
|
-
for (let index = 0; index < files.length; index += 64) {
|
|
152
|
-
await Promise.all(files.slice(index, index + 64).map(async (file) => {
|
|
153
|
-
const [content, stat] = await Promise.all([fs.readFile(file), fs.stat(file)]);
|
|
154
|
-
if (fragments.some((fragment) => content.includes(fragment))) {
|
|
155
|
-
throw new Error(`Codex eval CLI deployment contains forbidden host path bytes in ${file}.`);
|
|
156
|
-
}
|
|
157
|
-
records.push({
|
|
158
|
-
path: path.relative(root, file).split(path.sep).join('/'),
|
|
159
|
-
mode: stat.mode & 0o777,
|
|
160
|
-
digest: createHash('sha256').update(content).digest('hex'),
|
|
161
|
-
});
|
|
162
|
-
}));
|
|
163
|
-
}
|
|
164
|
-
records.sort((left, right) => left.path.localeCompare(right.path));
|
|
165
|
-
links.sort((left, right) => left.path.localeCompare(right.path));
|
|
166
|
-
return `sha256:${createHash('sha256').update(JSON.stringify({
|
|
167
|
-
files: records,
|
|
168
|
-
links,
|
|
169
|
-
})).digest('hex')}`;
|
|
170
|
-
}
|
|
171
|
-
async function materializeEvalCliDeployment(options) {
|
|
172
|
-
const target = path.join(options.root, 'cli');
|
|
173
|
-
if (options.deployCli) {
|
|
174
|
-
await options.deployCli(target);
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
const inheritedPnpmEntry = options.sourceEnv.npm_execpath?.trim();
|
|
178
|
-
const pnpmEntry = inheritedPnpmEntry && path.isAbsolute(inheritedPnpmEntry)
|
|
179
|
-
? inheritedPnpmEntry
|
|
180
|
-
: path.join(options.cliPackageRoot, 'node_modules', 'pnpm', 'bin', 'pnpm.cjs');
|
|
181
|
-
const pnpmStat = await fs.stat(pnpmEntry).catch(() => null);
|
|
182
|
-
if (!pnpmStat?.isFile()) {
|
|
183
|
-
throw new Error('Codex eval CLI deployment requires the workspace pnpm runtime. Run pnpm install first.');
|
|
184
|
-
}
|
|
185
|
-
await execFileAsync(process.execPath, [
|
|
186
|
-
path.resolve(pnpmEntry),
|
|
187
|
-
'--filter',
|
|
188
|
-
'@lesliechan721/aw',
|
|
189
|
-
'deploy',
|
|
190
|
-
'--prod',
|
|
191
|
-
'--config.inject-workspace-packages=true',
|
|
192
|
-
'--config.package-import-method=copy',
|
|
193
|
-
target,
|
|
194
|
-
], {
|
|
195
|
-
cwd: path.resolve(options.cliPackageRoot, '..', '..'),
|
|
196
|
-
env: options.sourceEnv,
|
|
197
|
-
maxBuffer: 20 * 1024 * 1024,
|
|
198
|
-
});
|
|
199
|
-
await fs.copyFile(path.join(options.cliPackageRoot, 'package.json'), path.join(target, 'package.json'));
|
|
200
|
-
}
|
|
201
|
-
await pruneEvalCliDeployment(target);
|
|
202
|
-
const repoRoot = path.resolve(options.cliPackageRoot, '..', '..');
|
|
203
|
-
const canonicalRepoRoot = await fs.realpath(repoRoot).catch(() => repoRoot);
|
|
204
|
-
const contentDigest = await assertContainedEvalCliDeployment(target, [repoRoot, canonicalRepoRoot]);
|
|
205
|
-
const entry = path.join(target, 'dist', 'index.js');
|
|
206
|
-
const stat = await fs.stat(entry).catch(() => null);
|
|
207
|
-
if (!stat?.isFile()) {
|
|
208
|
-
throw new Error(`Codex eval CLI deployment is missing ${entry}.`);
|
|
209
|
-
}
|
|
210
|
-
const packageJson = await fs.readJson(path.join(target, 'package.json'));
|
|
211
|
-
if (typeof packageJson.name !== 'string' || typeof packageJson.version !== 'string') {
|
|
212
|
-
throw new Error('Codex eval CLI deployment has invalid package identity.');
|
|
213
|
-
}
|
|
214
|
-
return {
|
|
215
|
-
entry,
|
|
216
|
-
evidence: {
|
|
217
|
-
packageName: packageJson.name,
|
|
218
|
-
packageVersion: packageJson.version,
|
|
219
|
-
contentDigest,
|
|
220
|
-
},
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
function isRecord(value) {
|
|
224
|
-
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
225
|
-
}
|
|
226
|
-
function keySegments(key) {
|
|
227
|
-
return key.keys.map((segment) => segment.type === 'TOMLBare' ? segment.name : segment.value);
|
|
228
|
-
}
|
|
229
|
-
function scalarString(node) {
|
|
230
|
-
return node.type === 'TOMLValue' && node.kind === 'string'
|
|
231
|
-
? node.value
|
|
232
|
-
: undefined;
|
|
233
|
-
}
|
|
234
|
-
function tableEntry(table, key) {
|
|
235
|
-
return table.body.find((entry) => keySegments(entry.key).join('.') === key);
|
|
236
|
-
}
|
|
237
|
-
function inlineStringValues(node) {
|
|
238
|
-
if (!node || node.type !== 'TOMLInlineTable') {
|
|
239
|
-
return [];
|
|
240
|
-
}
|
|
241
|
-
return node.body.flatMap((entry) => {
|
|
242
|
-
const value = scalarString(entry.value);
|
|
243
|
-
return value ? [value] : [];
|
|
244
|
-
});
|
|
245
|
-
}
|
|
246
|
-
function sourceCodexHome(sourceEnv) {
|
|
247
|
-
return path.resolve(sourceEnv.CODEX_HOME ?? path.join(sourceEnv.HOME ?? os.homedir(), '.codex'));
|
|
248
|
-
}
|
|
249
|
-
function topLevelEntries(program) {
|
|
250
|
-
return program.body[0].body;
|
|
251
|
-
}
|
|
252
|
-
function topLevelString(program, key) {
|
|
253
|
-
const entry = topLevelEntries(program).find((candidate) => candidate.type === 'TOMLKeyValue' && keySegments(candidate.key).join('.') === key);
|
|
254
|
-
return entry ? scalarString(entry.value) : undefined;
|
|
255
|
-
}
|
|
256
|
-
function activeProfileTable(program) {
|
|
257
|
-
const profile = topLevelString(program, 'profile');
|
|
258
|
-
if (!profile)
|
|
259
|
-
return undefined;
|
|
260
|
-
return topLevelEntries(program).find((entry) => {
|
|
261
|
-
if (entry.type !== 'TOMLTable')
|
|
262
|
-
return false;
|
|
263
|
-
const segments = keySegments(entry.key);
|
|
264
|
-
return segments.length === 2 && segments[0] === 'profiles' && segments[1] === profile;
|
|
265
|
-
});
|
|
266
|
-
}
|
|
267
|
-
function effectiveModelEntries(program) {
|
|
268
|
-
const entries = new Map();
|
|
269
|
-
for (const entry of topLevelEntries(program)) {
|
|
270
|
-
if (entry.type !== 'TOMLKeyValue')
|
|
271
|
-
continue;
|
|
272
|
-
const key = keySegments(entry.key).join('.');
|
|
273
|
-
if (MODEL_CONFIG_KEYS.has(key))
|
|
274
|
-
entries.set(key, entry);
|
|
275
|
-
}
|
|
276
|
-
for (const entry of activeProfileTable(program)?.body ?? []) {
|
|
277
|
-
const key = keySegments(entry.key).join('.');
|
|
278
|
-
if (MODEL_CONFIG_KEYS.has(key))
|
|
279
|
-
entries.set(key, entry);
|
|
280
|
-
}
|
|
281
|
-
return entries;
|
|
282
|
-
}
|
|
283
|
-
function effectiveModelString(program, key) {
|
|
284
|
-
const entry = effectiveModelEntries(program).get(key);
|
|
285
|
-
return entry ? scalarString(entry.value) : undefined;
|
|
286
|
-
}
|
|
287
|
-
function providerTables(program, provider) {
|
|
288
|
-
return topLevelEntries(program).filter((entry) => {
|
|
289
|
-
if (entry.type !== 'TOMLTable')
|
|
290
|
-
return false;
|
|
291
|
-
const segments = keySegments(entry.key);
|
|
292
|
-
return segments[0] === 'model_providers' && segments[1] === provider;
|
|
293
|
-
});
|
|
294
|
-
}
|
|
295
|
-
function providerEnvironmentNames(tables) {
|
|
296
|
-
const provider = tables.find((table) => keySegments(table.key).length === 2);
|
|
297
|
-
if (!provider)
|
|
298
|
-
return [];
|
|
299
|
-
const names = new Set();
|
|
300
|
-
const envKey = tableEntry(provider, 'env_key');
|
|
301
|
-
const envKeyName = envKey ? scalarString(envKey.value) : undefined;
|
|
302
|
-
if (envKeyName)
|
|
303
|
-
names.add(envKeyName);
|
|
304
|
-
const inlineHeaders = tableEntry(provider, 'env_http_headers');
|
|
305
|
-
for (const name of inlineStringValues(inlineHeaders?.value))
|
|
306
|
-
names.add(name);
|
|
307
|
-
for (const table of tables) {
|
|
308
|
-
const segments = keySegments(table.key);
|
|
309
|
-
if (segments.length !== 3 || segments[2] !== 'env_http_headers')
|
|
310
|
-
continue;
|
|
311
|
-
for (const entry of table.body) {
|
|
312
|
-
const value = scalarString(entry.value);
|
|
313
|
-
if (value)
|
|
314
|
-
names.add(value);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
return [...names].sort((left, right) => left.localeCompare(right));
|
|
318
|
-
}
|
|
319
|
-
function assertSafeProviderEnvironmentName(name, provider) {
|
|
320
|
-
if (!/^[A-Za-z_][A-Za-z0-9_]*$/u.test(name)) {
|
|
321
|
-
throw new Error(`Codex eval model provider ${JSON.stringify(provider)} declares invalid environment variable ${JSON.stringify(name)}.`);
|
|
322
|
-
}
|
|
323
|
-
if (RESERVED_PROVIDER_ENV.has(name) ||
|
|
324
|
-
name.startsWith('AW_') ||
|
|
325
|
-
name.startsWith('XDG_') ||
|
|
326
|
-
name.startsWith('DYLD_')) {
|
|
327
|
-
throw new Error(`Codex eval model provider ${JSON.stringify(provider)} cannot use reserved environment variable ${name}.`);
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
function providerHasEmbeddedBearer(tables) {
|
|
331
|
-
const provider = tables.find((table) => keySegments(table.key).length === 2);
|
|
332
|
-
const entry = provider ? tableEntry(provider, 'experimental_bearer_token') : undefined;
|
|
333
|
-
return Boolean(entry && scalarString(entry.value));
|
|
334
|
-
}
|
|
335
|
-
function providerSensitiveValues(tables) {
|
|
336
|
-
const values = new Set();
|
|
337
|
-
const provider = tables.find((table) => keySegments(table.key).length === 2);
|
|
338
|
-
for (const key of ['base_url', 'experimental_bearer_token']) {
|
|
339
|
-
const entry = provider ? tableEntry(provider, key) : undefined;
|
|
340
|
-
const value = entry ? scalarString(entry.value) : undefined;
|
|
341
|
-
if (value)
|
|
342
|
-
values.add(value);
|
|
343
|
-
}
|
|
344
|
-
const inlineHeaders = provider ? tableEntry(provider, 'http_headers') : undefined;
|
|
345
|
-
for (const value of inlineStringValues(inlineHeaders?.value))
|
|
346
|
-
values.add(value);
|
|
347
|
-
for (const table of tables) {
|
|
348
|
-
const segments = keySegments(table.key);
|
|
349
|
-
if (segments.length !== 3 || segments[2] !== 'http_headers')
|
|
350
|
-
continue;
|
|
351
|
-
for (const entry of table.body) {
|
|
352
|
-
const value = scalarString(entry.value);
|
|
353
|
-
if (value)
|
|
354
|
-
values.add(value);
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
return [...values];
|
|
358
|
-
}
|
|
359
|
-
function addSensitiveValues(runtime, values) {
|
|
360
|
-
const unique = new Set(runtime.sensitiveValues);
|
|
361
|
-
for (const value of values) {
|
|
362
|
-
if (value)
|
|
363
|
-
unique.add(value);
|
|
364
|
-
}
|
|
365
|
-
runtime.sensitiveValues = [...unique].sort((left, right) => right.length - left.length);
|
|
366
|
-
}
|
|
367
|
-
function sensitivePassthroughEnvironment(sourceEnv) {
|
|
368
|
-
const names = [];
|
|
369
|
-
const values = [];
|
|
370
|
-
for (const name of SENSITIVE_PASSTHROUGH_ENV) {
|
|
371
|
-
const value = sourceEnv[name];
|
|
372
|
-
if (value === undefined)
|
|
373
|
-
continue;
|
|
374
|
-
names.push(name);
|
|
375
|
-
if (value)
|
|
376
|
-
values.push(value);
|
|
377
|
-
}
|
|
378
|
-
return { names: names.sort(), values };
|
|
379
|
-
}
|
|
380
|
-
function jsonStringValues(value) {
|
|
381
|
-
if (typeof value === 'string')
|
|
382
|
-
return value ? [value] : [];
|
|
383
|
-
if (Array.isArray(value))
|
|
384
|
-
return value.flatMap(jsonStringValues);
|
|
385
|
-
if (isRecord(value))
|
|
386
|
-
return Object.values(value).flatMap(jsonStringValues);
|
|
387
|
-
return [];
|
|
388
|
-
}
|
|
389
|
-
function renderFilteredConfig(options) {
|
|
390
|
-
const lines = [...CODEX_EVAL_CREDENTIAL_CONFIG_LINES];
|
|
391
|
-
for (const [key, entry] of effectiveModelEntries(options.program)) {
|
|
392
|
-
if (key === 'model')
|
|
393
|
-
continue;
|
|
394
|
-
if (key === 'model_provider')
|
|
395
|
-
continue;
|
|
396
|
-
lines.push(options.content.slice(entry.range[0], entry.range[1]));
|
|
397
|
-
}
|
|
398
|
-
lines.push(`model = ${JSON.stringify(options.model)}`);
|
|
399
|
-
lines.push(`model_provider = ${JSON.stringify(options.providerOverride ?? options.provider)}`);
|
|
400
|
-
for (const table of options.tables) {
|
|
401
|
-
lines.push(options.content.slice(table.range[0], table.range[1]));
|
|
402
|
-
}
|
|
403
|
-
return `${lines.join('\n\n')}\n`;
|
|
404
|
-
}
|
|
405
|
-
function evidenceDigest(value) {
|
|
406
|
-
return `sha256:${createHash('sha256').update(JSON.stringify({
|
|
407
|
-
...value,
|
|
408
|
-
credentialStores: {
|
|
409
|
-
cliAuth: 'file',
|
|
410
|
-
mcpOauth: 'file',
|
|
411
|
-
secretAuthStorage: false,
|
|
412
|
-
},
|
|
413
|
-
})).digest('hex')}`;
|
|
414
|
-
}
|
|
415
|
-
export function cleanCodexEvalRuntimeConfig(sourceEnv = process.env, modelOverride) {
|
|
416
|
-
const model = modelOverride ?? DEFAULT_CODEX_EVAL_MODEL;
|
|
417
|
-
const sensitivePassthrough = sensitivePassthroughEnvironment(sourceEnv);
|
|
418
|
-
const descriptor = {
|
|
419
|
-
inherited: false,
|
|
420
|
-
model,
|
|
421
|
-
modelProvider: 'openai',
|
|
422
|
-
credentialSource: sourceEnv.OPENAI_API_KEY ? 'environment' : 'openai-auth',
|
|
423
|
-
};
|
|
424
|
-
return {
|
|
425
|
-
...descriptor,
|
|
426
|
-
configToml: [
|
|
427
|
-
...CODEX_EVAL_CREDENTIAL_CONFIG_LINES,
|
|
428
|
-
`model = ${JSON.stringify(model)}`,
|
|
429
|
-
'model_provider = "openai"',
|
|
430
|
-
'',
|
|
431
|
-
].join('\n'),
|
|
432
|
-
providerEnvironment: sourceEnv.OPENAI_API_KEY
|
|
433
|
-
? { OPENAI_API_KEY: sourceEnv.OPENAI_API_KEY }
|
|
434
|
-
: {},
|
|
435
|
-
sourceCodexHome: sourceCodexHome(sourceEnv),
|
|
436
|
-
copyOpenAiAuth: !sourceEnv.OPENAI_API_KEY,
|
|
437
|
-
sensitiveEnvironmentNames: [
|
|
438
|
-
...(sourceEnv.OPENAI_API_KEY ? ['OPENAI_API_KEY'] : []),
|
|
439
|
-
...sensitivePassthrough.names,
|
|
440
|
-
].sort(),
|
|
441
|
-
sensitiveValues: [
|
|
442
|
-
...(sourceEnv.OPENAI_API_KEY ? [sourceEnv.OPENAI_API_KEY] : []),
|
|
443
|
-
...sensitivePassthrough.values,
|
|
444
|
-
],
|
|
445
|
-
evidenceDigest: evidenceDigest(descriptor),
|
|
446
|
-
};
|
|
447
|
-
}
|
|
448
|
-
export async function resolveCodexEvalRuntimeConfig(options) {
|
|
449
|
-
const sourceEnv = options.sourceEnv ?? process.env;
|
|
450
|
-
if (!options.inheritUserConfig) {
|
|
451
|
-
if (options.configPath || options.modelProviderOverride) {
|
|
452
|
-
throw new Error('--no-inherit-codex-config cannot be combined with --codex-config or --model-provider.');
|
|
453
|
-
}
|
|
454
|
-
return cleanCodexEvalRuntimeConfig(sourceEnv, options.modelOverride);
|
|
455
|
-
}
|
|
456
|
-
const codexHome = sourceCodexHome(sourceEnv);
|
|
457
|
-
const configPath = path.resolve(options.configPath ?? path.join(codexHome, 'config.toml'));
|
|
458
|
-
if (!(await fs.pathExists(configPath))) {
|
|
459
|
-
if (options.configPath) {
|
|
460
|
-
throw new Error(`Codex eval config does not exist: ${configPath}`);
|
|
461
|
-
}
|
|
462
|
-
return cleanCodexEvalRuntimeConfig(sourceEnv, options.modelOverride);
|
|
463
|
-
}
|
|
464
|
-
const content = await fs.readFile(configPath, 'utf8');
|
|
465
|
-
let program;
|
|
466
|
-
try {
|
|
467
|
-
program = parseTOML(content);
|
|
468
|
-
}
|
|
469
|
-
catch (error) {
|
|
470
|
-
const message = error instanceof ParseError ? error.message : String(error);
|
|
471
|
-
throw new Error(`Unable to parse Codex eval config ${configPath}: ${message}`);
|
|
472
|
-
}
|
|
473
|
-
const provider = options.modelProviderOverride ?? effectiveModelString(program, 'model_provider') ?? 'openai';
|
|
474
|
-
const tables = providerTables(program, provider);
|
|
475
|
-
if (provider !== 'openai' && tables.length === 0) {
|
|
476
|
-
throw new Error(`Codex eval model provider ${JSON.stringify(provider)} is not defined in ${configPath}.`);
|
|
477
|
-
}
|
|
478
|
-
const model = options.modelOverride ?? DEFAULT_CODEX_EVAL_MODEL;
|
|
479
|
-
const builtInOpenAiProvider = provider === 'openai' && tables.length === 0;
|
|
480
|
-
const names = providerEnvironmentNames(tables);
|
|
481
|
-
const providerEnvironment = {};
|
|
482
|
-
for (const name of names) {
|
|
483
|
-
assertSafeProviderEnvironmentName(name, provider);
|
|
484
|
-
const value = sourceEnv[name];
|
|
485
|
-
if (!value) {
|
|
486
|
-
throw new Error(`Codex eval model provider ${JSON.stringify(provider)} requires environment variable ${name}.`);
|
|
487
|
-
}
|
|
488
|
-
providerEnvironment[name] = value;
|
|
489
|
-
}
|
|
490
|
-
if (builtInOpenAiProvider && sourceEnv.OPENAI_API_KEY) {
|
|
491
|
-
providerEnvironment.OPENAI_API_KEY = sourceEnv.OPENAI_API_KEY;
|
|
492
|
-
}
|
|
493
|
-
const embedded = providerHasEmbeddedBearer(tables);
|
|
494
|
-
const environmentCredential = Object.keys(providerEnvironment).length > 0;
|
|
495
|
-
const copyOpenAiAuth = builtInOpenAiProvider && !embedded && !environmentCredential;
|
|
496
|
-
const sensitivePassthrough = sensitivePassthroughEnvironment(sourceEnv);
|
|
497
|
-
const credentialSource = embedded
|
|
498
|
-
? 'embedded'
|
|
499
|
-
: environmentCredential
|
|
500
|
-
? 'environment'
|
|
501
|
-
: copyOpenAiAuth
|
|
502
|
-
? 'openai-auth'
|
|
503
|
-
: 'none';
|
|
504
|
-
const descriptor = {
|
|
505
|
-
inherited: true,
|
|
506
|
-
model,
|
|
507
|
-
modelProvider: provider,
|
|
508
|
-
credentialSource,
|
|
509
|
-
};
|
|
510
|
-
return {
|
|
511
|
-
...descriptor,
|
|
512
|
-
configToml: renderFilteredConfig({
|
|
513
|
-
content,
|
|
514
|
-
program,
|
|
515
|
-
provider,
|
|
516
|
-
tables,
|
|
517
|
-
model,
|
|
518
|
-
providerOverride: options.modelProviderOverride,
|
|
519
|
-
}),
|
|
520
|
-
providerEnvironment,
|
|
521
|
-
sourceCodexHome: codexHome,
|
|
522
|
-
copyOpenAiAuth,
|
|
523
|
-
sensitiveEnvironmentNames: [
|
|
524
|
-
...Object.keys(providerEnvironment),
|
|
525
|
-
...sensitivePassthrough.names,
|
|
526
|
-
].sort(),
|
|
527
|
-
sensitiveValues: [
|
|
528
|
-
...providerSensitiveValues(tables),
|
|
529
|
-
...Object.values(providerEnvironment),
|
|
530
|
-
...sensitivePassthrough.values,
|
|
531
|
-
],
|
|
532
|
-
evidenceDigest: evidenceDigest(descriptor),
|
|
533
|
-
};
|
|
534
|
-
}
|
|
535
|
-
export async function materializeCodexEvalRuntimeHome(runtime, destination, options = {}) {
|
|
536
|
-
await fs.ensureDir(destination);
|
|
537
|
-
await fs.chmod(destination, 0o700).catch(() => undefined);
|
|
538
|
-
const configPath = path.join(destination, 'config.toml');
|
|
539
|
-
const trustedProject = options.trustedProject
|
|
540
|
-
? await fs.realpath(options.trustedProject)
|
|
541
|
-
: null;
|
|
542
|
-
const configToml = trustedProject
|
|
543
|
-
? `${runtime.configToml.trimEnd()}\n\n[projects.${JSON.stringify(trustedProject)}]\ntrust_level = "trusted"\n`
|
|
544
|
-
: runtime.configToml;
|
|
545
|
-
await fs.writeFile(configPath, configToml, { encoding: 'utf8', mode: 0o600 });
|
|
546
|
-
await fs.chmod(configPath, 0o600).catch(() => undefined);
|
|
547
|
-
if (!runtime.copyOpenAiAuth)
|
|
548
|
-
return;
|
|
549
|
-
for (const name of OPENAI_AUTH_FILES) {
|
|
550
|
-
const source = path.join(runtime.sourceCodexHome, name);
|
|
551
|
-
if (!(await fs.pathExists(source)))
|
|
552
|
-
continue;
|
|
553
|
-
const target = path.join(destination, name);
|
|
554
|
-
const content = await fs.readFile(source, 'utf8');
|
|
555
|
-
try {
|
|
556
|
-
addSensitiveValues(runtime, jsonStringValues(JSON.parse(content)));
|
|
557
|
-
}
|
|
558
|
-
catch {
|
|
559
|
-
addSensitiveValues(runtime, [content.trim()]);
|
|
560
|
-
}
|
|
561
|
-
await fs.copyFile(source, target);
|
|
562
|
-
await fs.chmod(target, 0o600).catch(() => undefined);
|
|
563
|
-
}
|
|
564
|
-
}
|
|
565
|
-
export function applyCodexEvalProviderEnvironment(env, runtime) {
|
|
566
|
-
return { ...runtime.providerEnvironment, ...env };
|
|
567
|
-
}
|
|
568
|
-
function filteredEvalProcessEnvironment(sourceEnv) {
|
|
569
|
-
const env = {};
|
|
570
|
-
for (const name of EVAL_PROCESS_PASSTHROUGH_ENV) {
|
|
571
|
-
if (sourceEnv[name] !== undefined)
|
|
572
|
-
env[name] = sourceEnv[name];
|
|
573
|
-
}
|
|
574
|
-
return env;
|
|
575
|
-
}
|
|
576
|
-
function removeCapsuleSignalHandlers() {
|
|
577
|
-
for (const [signal, handler] of capsuleSignalHandlers) {
|
|
578
|
-
process.off(signal, handler);
|
|
579
|
-
}
|
|
580
|
-
capsuleSignalHandlers.clear();
|
|
581
|
-
}
|
|
582
|
-
function delay(milliseconds) {
|
|
583
|
-
return new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
584
|
-
}
|
|
585
|
-
function unregisterRuntimeRoot(registration) {
|
|
586
|
-
ACTIVE_RUNTIME_ROOTS.delete(registration);
|
|
587
|
-
if (ACTIVE_RUNTIME_ROOTS.size === 0 &&
|
|
588
|
-
ACTIVE_SIGNAL_CLEANUPS.size === 0 &&
|
|
589
|
-
!capsuleSignalCleanupInProgress) {
|
|
590
|
-
removeCapsuleSignalHandlers();
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
function addRuntimeRoot(rootPromise) {
|
|
594
|
-
assertCodexEvalCanStartWork();
|
|
595
|
-
const registration = { rootPromise };
|
|
596
|
-
ACTIVE_RUNTIME_ROOTS.add(registration);
|
|
597
|
-
installCapsuleSignalHandlers();
|
|
598
|
-
return registration;
|
|
599
|
-
}
|
|
600
|
-
async function removeRuntimeRoot(registration) {
|
|
601
|
-
if (registration.cleanupPromise)
|
|
602
|
-
return registration.cleanupPromise;
|
|
603
|
-
const cleanupPromise = (async () => {
|
|
604
|
-
let root;
|
|
605
|
-
try {
|
|
606
|
-
root = await registration.rootPromise;
|
|
607
|
-
}
|
|
608
|
-
catch (error) {
|
|
609
|
-
unregisterRuntimeRoot(registration);
|
|
610
|
-
return `Could not allocate a registered Codex eval temporary root: ${error instanceof Error ? error.message : String(error)}`;
|
|
611
|
-
}
|
|
612
|
-
let lastError;
|
|
613
|
-
for (let attempt = 1; attempt <= RUNTIME_ROOT_REMOVE_ATTEMPTS; attempt += 1) {
|
|
614
|
-
try {
|
|
615
|
-
await fs.remove(root);
|
|
616
|
-
unregisterRuntimeRoot(registration);
|
|
617
|
-
return null;
|
|
618
|
-
}
|
|
619
|
-
catch (error) {
|
|
620
|
-
lastError = error;
|
|
621
|
-
if (attempt < RUNTIME_ROOT_REMOVE_ATTEMPTS) {
|
|
622
|
-
await delay(RUNTIME_ROOT_REMOVE_RETRY_MS);
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
return `Could not remove Codex eval temporary root after ${RUNTIME_ROOT_REMOVE_ATTEMPTS} attempts: ` +
|
|
627
|
-
`${root}: ${lastError instanceof Error ? lastError.message : String(lastError)}`;
|
|
628
|
-
})();
|
|
629
|
-
registration.cleanupPromise = cleanupPromise;
|
|
630
|
-
const diagnostic = await cleanupPromise;
|
|
631
|
-
if (diagnostic)
|
|
632
|
-
registration.cleanupPromise = undefined;
|
|
633
|
-
return diagnostic;
|
|
634
|
-
}
|
|
635
|
-
export function assertCodexEvalCanStartWork() {
|
|
636
|
-
if (codexEvalSignalShutdownRequested) {
|
|
637
|
-
throw new Error('Cannot start Codex eval work because signal shutdown is in progress.');
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
export function resetCodexEvalSignalShutdownForTests() {
|
|
641
|
-
if (capsuleSignalCleanupInProgress ||
|
|
642
|
-
ACTIVE_RUNTIME_ROOTS.size > 0 ||
|
|
643
|
-
ACTIVE_SIGNAL_CLEANUPS.size > 0) {
|
|
644
|
-
throw new Error('Cannot reset Codex eval signal shutdown while resources are active.');
|
|
645
|
-
}
|
|
646
|
-
codexEvalSignalShutdownRequested = false;
|
|
647
|
-
}
|
|
648
|
-
export async function cleanupActiveCodexEvalRuntimeCapsules() {
|
|
649
|
-
const diagnostics = (await Promise.all([...ACTIVE_RUNTIME_ROOTS].map(removeRuntimeRoot))).filter((entry) => entry !== null);
|
|
650
|
-
if (diagnostics.length > 0) {
|
|
651
|
-
throw new Error(diagnostics.join('\n'));
|
|
652
|
-
}
|
|
653
|
-
if (ACTIVE_SIGNAL_CLEANUPS.size === 0 &&
|
|
654
|
-
!capsuleSignalCleanupInProgress) {
|
|
655
|
-
removeCapsuleSignalHandlers();
|
|
656
|
-
}
|
|
657
|
-
}
|
|
658
|
-
async function cleanupActiveCodexEvalSignalResources() {
|
|
659
|
-
const diagnostics = [];
|
|
660
|
-
while (ACTIVE_SIGNAL_CLEANUPS.size > 0) {
|
|
661
|
-
const cleanups = [...ACTIVE_SIGNAL_CLEANUPS];
|
|
662
|
-
ACTIVE_SIGNAL_CLEANUPS.clear();
|
|
663
|
-
const results = await Promise.allSettled(cleanups.map((cleanup) => Promise.resolve().then(cleanup)));
|
|
664
|
-
for (const result of results) {
|
|
665
|
-
if (result.status === 'rejected') {
|
|
666
|
-
diagnostics.push(`Codex eval process cleanup failed: ${result.reason instanceof Error ? result.reason.message : String(result.reason)}`);
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
diagnostics.push(...(await Promise.all([...ACTIVE_RUNTIME_ROOTS].map(removeRuntimeRoot))).filter((entry) => entry !== null));
|
|
671
|
-
return diagnostics;
|
|
672
|
-
}
|
|
673
|
-
export function registerCodexEvalSignalCleanup(cleanup) {
|
|
674
|
-
assertCodexEvalCanStartWork();
|
|
675
|
-
ACTIVE_SIGNAL_CLEANUPS.add(cleanup);
|
|
676
|
-
installCapsuleSignalHandlers();
|
|
677
|
-
return () => {
|
|
678
|
-
ACTIVE_SIGNAL_CLEANUPS.delete(cleanup);
|
|
679
|
-
if (ACTIVE_RUNTIME_ROOTS.size === 0 &&
|
|
680
|
-
ACTIVE_SIGNAL_CLEANUPS.size === 0 &&
|
|
681
|
-
!capsuleSignalCleanupInProgress) {
|
|
682
|
-
removeCapsuleSignalHandlers();
|
|
683
|
-
}
|
|
684
|
-
};
|
|
685
|
-
}
|
|
686
|
-
export function registerCodexEvalTemporaryRoot(root) {
|
|
687
|
-
const registration = addRuntimeRoot(Promise.resolve(root));
|
|
688
|
-
return () => unregisterRuntimeRoot(registration);
|
|
689
|
-
}
|
|
690
|
-
export async function createCodexEvalTemporaryRoot(prefix, options = {}) {
|
|
691
|
-
assertCodexEvalCanStartWork();
|
|
692
|
-
const rootPromise = options.allocate?.() ?? fs.mkdtemp(path.join(os.tmpdir(), prefix));
|
|
693
|
-
const registration = addRuntimeRoot(rootPromise);
|
|
694
|
-
let root;
|
|
695
|
-
try {
|
|
696
|
-
root = await rootPromise;
|
|
697
|
-
assertCodexEvalCanStartWork();
|
|
698
|
-
}
|
|
699
|
-
catch (error) {
|
|
700
|
-
if (root) {
|
|
701
|
-
await removeRuntimeRoot(registration);
|
|
702
|
-
}
|
|
703
|
-
else {
|
|
704
|
-
unregisterRuntimeRoot(registration);
|
|
705
|
-
}
|
|
706
|
-
throw error;
|
|
707
|
-
}
|
|
708
|
-
return {
|
|
709
|
-
root,
|
|
710
|
-
cleanup: async () => {
|
|
711
|
-
const diagnostic = await removeRuntimeRoot(registration);
|
|
712
|
-
if (diagnostic)
|
|
713
|
-
throw new Error(diagnostic);
|
|
714
|
-
},
|
|
715
|
-
};
|
|
716
|
-
}
|
|
717
|
-
function installCapsuleSignalHandlers() {
|
|
718
|
-
if (capsuleSignalHandlers.size > 0)
|
|
719
|
-
return;
|
|
720
|
-
for (const signal of CAPSULE_SIGNALS) {
|
|
721
|
-
const handler = () => {
|
|
722
|
-
codexEvalSignalShutdownRequested = true;
|
|
723
|
-
if (capsuleSignalCleanupInProgress)
|
|
724
|
-
return;
|
|
725
|
-
capsuleSignalCleanupInProgress = true;
|
|
726
|
-
void cleanupActiveCodexEvalSignalResources().then((diagnostics) => {
|
|
727
|
-
if (diagnostics.length > 0) {
|
|
728
|
-
process.stderr.write(`${diagnostics.join('\n')}\n`);
|
|
729
|
-
}
|
|
730
|
-
}).finally(() => {
|
|
731
|
-
removeCapsuleSignalHandlers();
|
|
732
|
-
capsuleSignalCleanupInProgress = false;
|
|
733
|
-
try {
|
|
734
|
-
process.kill(process.pid, signal);
|
|
735
|
-
}
|
|
736
|
-
catch {
|
|
737
|
-
process.exitCode = 1;
|
|
738
|
-
}
|
|
739
|
-
});
|
|
740
|
-
};
|
|
741
|
-
capsuleSignalHandlers.set(signal, handler);
|
|
742
|
-
process.on(signal, handler);
|
|
743
|
-
}
|
|
744
|
-
}
|
|
745
|
-
export async function createCodexEvalRuntimeCapsule(runtime, sourceEnv = process.env, options = {}) {
|
|
746
|
-
const temporaryRoot = await createCodexEvalTemporaryRoot('aw-codex-eval-runtime-', options);
|
|
747
|
-
const root = temporaryRoot.root;
|
|
748
|
-
const home = path.join(root, 'codex-home');
|
|
749
|
-
let cleaned = false;
|
|
750
|
-
const cleanup = async () => {
|
|
751
|
-
if (cleaned)
|
|
752
|
-
return;
|
|
753
|
-
await temporaryRoot.cleanup();
|
|
754
|
-
cleaned = true;
|
|
755
|
-
};
|
|
756
|
-
try {
|
|
757
|
-
await materializeCodexEvalRuntimeHome(runtime, home);
|
|
758
|
-
const baseEnv = filteredEvalProcessEnvironment(sourceEnv);
|
|
759
|
-
const cliDeployment = options.cliPackageRoot
|
|
760
|
-
? await materializeEvalCliDeployment({
|
|
761
|
-
root,
|
|
762
|
-
cliPackageRoot: options.cliPackageRoot,
|
|
763
|
-
sourceEnv,
|
|
764
|
-
deployCli: options.deployCli,
|
|
765
|
-
})
|
|
766
|
-
: undefined;
|
|
767
|
-
const cliEntry = cliDeployment?.entry;
|
|
768
|
-
const cliBin = cliEntry ? await materializeEvalCliLauncher(root, cliEntry) : undefined;
|
|
769
|
-
const capsuleRuntime = cliEntry
|
|
770
|
-
? {
|
|
771
|
-
...runtime,
|
|
772
|
-
sensitiveValues: [
|
|
773
|
-
...runtime.sensitiveValues,
|
|
774
|
-
cliEntry,
|
|
775
|
-
root,
|
|
776
|
-
],
|
|
777
|
-
}
|
|
778
|
-
: runtime;
|
|
779
|
-
return {
|
|
780
|
-
home,
|
|
781
|
-
env: applyCodexEvalProviderEnvironment({
|
|
782
|
-
...baseEnv,
|
|
783
|
-
...(cliBin ? {
|
|
784
|
-
PATH: [cliBin, baseEnv.PATH].filter(Boolean).join(path.delimiter),
|
|
785
|
-
[CODEX_EVAL_CLI_ENTRY_ENV]: cliEntry,
|
|
786
|
-
[CODEX_EVAL_CLI_NODE_ENV]: process.execPath,
|
|
787
|
-
} : {}),
|
|
788
|
-
CODEX_HOME: home,
|
|
789
|
-
AW_CODEX_EVAL_RUNTIME_HOME: home,
|
|
790
|
-
AW_CODEX_EVAL_MODEL_PROVIDER: runtime.modelProvider,
|
|
791
|
-
AW_CODEX_EVAL_SENSITIVE_ENV_NAMES: JSON.stringify(runtime.sensitiveEnvironmentNames),
|
|
792
|
-
}, capsuleRuntime),
|
|
793
|
-
runtime: capsuleRuntime,
|
|
794
|
-
cli: cliDeployment?.evidence ?? null,
|
|
795
|
-
cleanup,
|
|
796
|
-
};
|
|
797
|
-
}
|
|
798
|
-
catch (error) {
|
|
799
|
-
await cleanup();
|
|
800
|
-
throw error;
|
|
801
|
-
}
|
|
802
|
-
}
|
|
803
|
-
export function redactCodexEvalText(value, runtime) {
|
|
804
|
-
let redacted = value;
|
|
805
|
-
const secrets = [...new Set(runtime.sensitiveValues)]
|
|
806
|
-
.filter(Boolean)
|
|
807
|
-
.sort((left, right) => right.length - left.length);
|
|
808
|
-
for (const secret of secrets) {
|
|
809
|
-
if (secret)
|
|
810
|
-
redacted = redacted.replaceAll(secret, '[redacted]');
|
|
811
|
-
}
|
|
812
|
-
return redacted;
|
|
813
|
-
}
|
|
814
|
-
export function redactCodexEvalValue(value, runtime) {
|
|
815
|
-
if (typeof value === 'string') {
|
|
816
|
-
return redactCodexEvalText(value, runtime);
|
|
817
|
-
}
|
|
818
|
-
if (Array.isArray(value)) {
|
|
819
|
-
return value.map((entry) => redactCodexEvalValue(entry, runtime));
|
|
820
|
-
}
|
|
821
|
-
if (isRecord(value)) {
|
|
822
|
-
return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, redactCodexEvalValue(entry, runtime)]));
|
|
823
|
-
}
|
|
824
|
-
return value;
|
|
825
|
-
}
|
|
826
|
-
export function codexEvalRuntimeEvidence(runtime) {
|
|
827
|
-
return {
|
|
828
|
-
inherited: runtime.inherited,
|
|
829
|
-
model: runtime.model,
|
|
830
|
-
model_provider: runtime.modelProvider,
|
|
831
|
-
credential_source: runtime.credentialSource,
|
|
832
|
-
credential_stores: {
|
|
833
|
-
cli_auth: 'file',
|
|
834
|
-
mcp_oauth: 'file',
|
|
835
|
-
secret_auth_storage: false,
|
|
836
|
-
},
|
|
837
|
-
config_digest: runtime.evidenceDigest,
|
|
838
|
-
};
|
|
839
|
-
}
|
|
840
|
-
export function isCodexEvalRuntimeEvidence(value) {
|
|
841
|
-
return isRecord(value) && typeof value.model_provider === 'string';
|
|
842
|
-
}
|
|
843
|
-
//# sourceMappingURL=codex-eval-runtime-config.js.map
|