@claudexor/harness-codex 1.0.1 → 2.1.2
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/attachments.d.ts +4 -0
- package/dist/attachments.d.ts.map +1 -0
- package/dist/attachments.js +11 -0
- package/dist/attachments.js.map +1 -0
- package/dist/auth.d.ts +59 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +154 -0
- package/dist/auth.js.map +1 -0
- package/dist/index.d.ts +26 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +379 -286
- package/dist/index.js.map +1 -1
- package/dist/parse.d.ts +12 -1
- package/dist/parse.d.ts.map +1 -1
- package/dist/parse.js +112 -16
- package/dist/parse.js.map +1 -1
- package/dist/pricing.d.ts.map +1 -1
- package/dist/pricing.js +4 -1
- package/dist/pricing.js.map +1 -1
- package/dist/profile.d.ts +25 -0
- package/dist/profile.d.ts.map +1 -0
- package/dist/profile.js +178 -0
- package/dist/profile.js.map +1 -0
- package/dist/smoke.d.ts +5 -0
- package/dist/smoke.d.ts.map +1 -0
- package/dist/smoke.js +59 -0
- package/dist/smoke.js.map +1 -0
- package/dist/transcript.d.ts +4 -7
- package/dist/transcript.d.ts.map +1 -1
- package/dist/transcript.js +38 -21
- package/dist/transcript.js.map +1 -1
- package/package.json +8 -5
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { HarnessRunSpec } from "@claudexor/schema";
|
|
2
|
+
/** Convert verified image resources to Codex's repeatable file-path arguments. */
|
|
3
|
+
export declare function codexImageArgs(attachments: HarnessRunSpec["attachments"] | undefined): string[];
|
|
4
|
+
//# sourceMappingURL=attachments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../src/attachments.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,WAAW,EAAE,cAAc,CAAC,aAAa,CAAC,GAAG,SAAS,GAAG,MAAM,EAAE,CAM/F"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { readVerifiedAttachmentBytes } from "@claudexor/core";
|
|
2
|
+
/** Convert verified image resources to Codex's repeatable file-path arguments. */
|
|
3
|
+
export function codexImageArgs(attachments) {
|
|
4
|
+
return (attachments ?? []).flatMap((attachment) => {
|
|
5
|
+
if (attachment.kind !== "image")
|
|
6
|
+
return [];
|
|
7
|
+
readVerifiedAttachmentBytes(attachment);
|
|
8
|
+
return ["-i", attachment.path];
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=attachments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../src/attachments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAG9D,kFAAkF;AAClF,MAAM,UAAU,cAAc,CAAC,WAAsD;IACnF,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;QAChD,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,EAAE,CAAC;QAC3C,2BAA2B,CAAC,UAAU,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { runCapture } from "@claudexor/core";
|
|
2
|
+
export declare const CODEX_FILE_AUTH_OVERRIDE = "cli_auth_credentials_store=\"file\"";
|
|
3
|
+
export declare const CODEX_FILE_AUTH_ARGS: readonly ["-c", "cli_auth_credentials_store=\"file\""];
|
|
4
|
+
/**
|
|
5
|
+
* Resolve an OpenAI API key for codex from the environment. Claudexor-managed
|
|
6
|
+
* `api_key` auth mirrors the harness's own variable (`OPENAI_API_KEY`); a
|
|
7
|
+
* dedicated `CLAUDEXOR_CODEX_API_KEY` can override it for multi-key setups.
|
|
8
|
+
*/
|
|
9
|
+
export declare function codexApiKey(): string | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Seed `api_key` auth into an isolated CODEX_HOME. Codex does not read
|
|
12
|
+
* `OPENAI_API_KEY` from the environment when run against an empty config dir
|
|
13
|
+
* (it requires `auth.json`), so an envelope-scoped CODEX_HOME would otherwise
|
|
14
|
+
* fail with 401 even though a key is available. We write the same file
|
|
15
|
+
* `codex login --with-api-key` produces. No-op when not isolated (use codex's
|
|
16
|
+
* native auth), when no key is available, or when auth already exists.
|
|
17
|
+
*/
|
|
18
|
+
export declare function ensureCodexApiAuth(env?: Record<string, string>, allowApiKey?: boolean, apiKeyOverride?: string | null): void;
|
|
19
|
+
/** Claudexor's independent Codex profile; never the operator's ordinary ~/.codex. */
|
|
20
|
+
export declare function defaultNativeCodexHome(): string;
|
|
21
|
+
export type CodexLoginMethod = "chatgpt" | "api_key" | "access_token" | "logged_out" | "unknown";
|
|
22
|
+
export interface CodexLoginProbe {
|
|
23
|
+
/** True for any typed authenticated status; native readiness additionally requires method=chatgpt. */
|
|
24
|
+
authed: boolean;
|
|
25
|
+
method: CodexLoginMethod;
|
|
26
|
+
probeError: string | null;
|
|
27
|
+
}
|
|
28
|
+
export interface CodexLoginProbeOptions {
|
|
29
|
+
/** Exact environment the eventual Codex child will use. */
|
|
30
|
+
env?: Record<string, string | null | undefined>;
|
|
31
|
+
/** Explicit CODEX_HOME for the probe (INV-135, release wave round-17
|
|
32
|
+
* BLOCK): without it the probe re-normalizes onto the DEFAULT native home —
|
|
33
|
+
* a credential-profile probe must inspect ITS OWN store, never the
|
|
34
|
+
* default's. Callers without a profile omit it and keep the default. */
|
|
35
|
+
codexHome?: string;
|
|
36
|
+
abortSignal?: AbortSignal;
|
|
37
|
+
runCapture?: typeof runCapture;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Native-session probe with a distinct PROBE-FAILURE state. `codex login
|
|
41
|
+
* status` exits non-zero both when logged out AND when the CLI cannot even
|
|
42
|
+
* load `~/.codex/config.toml` (e.g. the config uses a newer option enum than
|
|
43
|
+
* the resolved binary understands — the stale-shim case). Collapsing those
|
|
44
|
+
* into "not logged in" hid a real subscription behind a config error; doctor
|
|
45
|
+
* must fail loudly with the CLI's own message instead.
|
|
46
|
+
*/
|
|
47
|
+
export declare function probeLogin(bin?: string, options?: CodexLoginProbeOptions): Promise<CodexLoginProbe>;
|
|
48
|
+
export declare function hasApiKey(): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Auth route the codex child will ACTUALLY run under, read from the same
|
|
51
|
+
* `auth.json` codex itself loads in a Claudexor-created scoped CODEX_HOME.
|
|
52
|
+
* The vendor-owned native home is deliberately not a fallback and must remain
|
|
53
|
+
* opaque. The file's own `auth_mode` field is the typed source of truth:
|
|
54
|
+
* "chatgpt" = subscription session, "apikey" = API key. Null when the file is
|
|
55
|
+
* absent/unreadable or carries an unknown mode — callers must treat that as
|
|
56
|
+
* undisclosed, never guess.
|
|
57
|
+
*/
|
|
58
|
+
export declare function codexAuthModeAt(home: string): "local_session" | "api_key" | null;
|
|
59
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkC,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAK7E,eAAO,MAAM,wBAAwB,wCAAsC,CAAC;AAC5E,eAAO,MAAM,oBAAoB,wDAA4C,CAAC;AAE9E;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,MAAM,GAAG,SAAS,CAUhD;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,WAAW,UAAO,EAClB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAC7B,IAAI,CAiBN;AAED,qFAAqF;AACrF,wBAAgB,sBAAsB,IAAI,MAAM,CAI/C;AAED,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,cAAc,GAAG,YAAY,GAAG,SAAS,CAAC;AACjG,MAAM,WAAW,eAAe;IAC9B,sGAAsG;IACtG,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,2DAA2D;IAC3D,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAChD;;;4EAGwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,UAAU,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,GAAG,GAAE,MAAY,EACjB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,eAAe,CAAC,CAkE1B;AAED,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,GAAG,IAAI,CAYhF"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { labelStreams, providerScrubEnv, runCapture } from "@claudexor/core";
|
|
4
|
+
import { resolveSecret } from "@claudexor/secrets";
|
|
5
|
+
import { ensureDir, redactSecrets, userConfigDir } from "@claudexor/util";
|
|
6
|
+
const BIN = process.env.CLAUDEXOR_CODEX_BIN || "codex";
|
|
7
|
+
export const CODEX_FILE_AUTH_OVERRIDE = 'cli_auth_credentials_store="file"';
|
|
8
|
+
export const CODEX_FILE_AUTH_ARGS = ["-c", CODEX_FILE_AUTH_OVERRIDE];
|
|
9
|
+
/**
|
|
10
|
+
* Resolve an OpenAI API key for codex from the environment. Claudexor-managed
|
|
11
|
+
* `api_key` auth mirrors the harness's own variable (`OPENAI_API_KEY`); a
|
|
12
|
+
* dedicated `CLAUDEXOR_CODEX_API_KEY` can override it for multi-key setups.
|
|
13
|
+
*/
|
|
14
|
+
export function codexApiKey() {
|
|
15
|
+
// The hermetic kill switch is honored inside resolveSecret (single owner).
|
|
16
|
+
const stored = resolveSecret("openai");
|
|
17
|
+
return (process.env.CLAUDEXOR_CODEX_API_KEY ||
|
|
18
|
+
process.env.CODEX_API_KEY ||
|
|
19
|
+
process.env.OPENAI_API_KEY ||
|
|
20
|
+
stored ||
|
|
21
|
+
undefined);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Seed `api_key` auth into an isolated CODEX_HOME. Codex does not read
|
|
25
|
+
* `OPENAI_API_KEY` from the environment when run against an empty config dir
|
|
26
|
+
* (it requires `auth.json`), so an envelope-scoped CODEX_HOME would otherwise
|
|
27
|
+
* fail with 401 even though a key is available. We write the same file
|
|
28
|
+
* `codex login --with-api-key` produces. No-op when not isolated (use codex's
|
|
29
|
+
* native auth), when no key is available, or when auth already exists.
|
|
30
|
+
*/
|
|
31
|
+
export function ensureCodexApiAuth(env, allowApiKey = true, apiKeyOverride) {
|
|
32
|
+
if (!allowApiKey)
|
|
33
|
+
return;
|
|
34
|
+
const home = env?.["CODEX_HOME"];
|
|
35
|
+
if (!home)
|
|
36
|
+
return;
|
|
37
|
+
if (resolve(home) === resolve(defaultNativeCodexHome())) {
|
|
38
|
+
throw new Error("refusing to read or write the vendor-owned native Codex auth store");
|
|
39
|
+
}
|
|
40
|
+
// A profile's namespaced key (INV-135) beats the engine-default slot; the
|
|
41
|
+
// override is exact — a missing profile secret never falls back.
|
|
42
|
+
const apiKey = apiKeyOverride !== undefined ? apiKeyOverride : codexApiKey();
|
|
43
|
+
if (!apiKey)
|
|
44
|
+
return;
|
|
45
|
+
const authPath = join(home, "auth.json");
|
|
46
|
+
if (existsSync(authPath))
|
|
47
|
+
return;
|
|
48
|
+
mkdirSync(home, { recursive: true });
|
|
49
|
+
writeFileSync(authPath, JSON.stringify({ auth_mode: "apikey", OPENAI_API_KEY: apiKey }) + "\n", {
|
|
50
|
+
mode: 0o600,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/** Claudexor's independent Codex profile; never the operator's ordinary ~/.codex. */
|
|
54
|
+
export function defaultNativeCodexHome() {
|
|
55
|
+
const override = process.env.CLAUDEXOR_CODEX_NATIVE_HOME;
|
|
56
|
+
if (override && override.trim())
|
|
57
|
+
return override;
|
|
58
|
+
return join(userConfigDir(), "native", "codex");
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Native-session probe with a distinct PROBE-FAILURE state. `codex login
|
|
62
|
+
* status` exits non-zero both when logged out AND when the CLI cannot even
|
|
63
|
+
* load `~/.codex/config.toml` (e.g. the config uses a newer option enum than
|
|
64
|
+
* the resolved binary understands — the stale-shim case). Collapsing those
|
|
65
|
+
* into "not logged in" hid a real subscription behind a config error; doctor
|
|
66
|
+
* must fail loudly with the CLI's own message instead.
|
|
67
|
+
*/
|
|
68
|
+
export async function probeLogin(bin = BIN, options = {}) {
|
|
69
|
+
try {
|
|
70
|
+
const home = options.codexHome ?? defaultNativeCodexHome();
|
|
71
|
+
ensureDir(home);
|
|
72
|
+
const env = {
|
|
73
|
+
...(options.env ?? {}),
|
|
74
|
+
...providerScrubEnv(),
|
|
75
|
+
CODEX_HOME: home,
|
|
76
|
+
};
|
|
77
|
+
const r = await (options.runCapture ?? runCapture)(bin, [...CODEX_FILE_AUTH_ARGS, "login", "status"], {
|
|
78
|
+
env,
|
|
79
|
+
timeoutMs: 10_000,
|
|
80
|
+
abortSignal: options.abortSignal,
|
|
81
|
+
cancelSignal: "SIGTERM",
|
|
82
|
+
cancelKillDelayMs: 0,
|
|
83
|
+
});
|
|
84
|
+
const text = `${r.stdout}\n${r.stderr}`;
|
|
85
|
+
const statusLines = text
|
|
86
|
+
.replaceAll("\r", "")
|
|
87
|
+
.split("\n")
|
|
88
|
+
.map((line) => line.trim())
|
|
89
|
+
.filter(Boolean);
|
|
90
|
+
// "Not logged in" is codex's NORMAL logged-out answer (exit 1, no error
|
|
91
|
+
// prefix). Anything else on a failing probe is a probe error, not an auth
|
|
92
|
+
// verdict (adapter-local knowledge of the native CLI's output is allowed).
|
|
93
|
+
if (statusLines.some((line) => /^not logged in[.!]?$/i.test(line))) {
|
|
94
|
+
return { authed: false, method: "logged_out", probeError: null };
|
|
95
|
+
}
|
|
96
|
+
if (r.code === 0 && statusLines.some((line) => /^logged in using chatgpt[.!]?$/i.test(line))) {
|
|
97
|
+
return { authed: true, method: "chatgpt", probeError: null };
|
|
98
|
+
}
|
|
99
|
+
if (r.code === 0 &&
|
|
100
|
+
statusLines.some((line) => /^logged in using (?:an? )?api key[.!]?$/i.test(line))) {
|
|
101
|
+
return { authed: true, method: "api_key", probeError: null };
|
|
102
|
+
}
|
|
103
|
+
if (r.code === 0 &&
|
|
104
|
+
statusLines.some((line) => /^logged in using (?:an? )?access token[.!]?$/i.test(line))) {
|
|
105
|
+
return { authed: true, method: "access_token", probeError: null };
|
|
106
|
+
}
|
|
107
|
+
// Redact BEFORE labelStreams truncates: truncation could split a token
|
|
108
|
+
// into a prefix the redactor no longer recognizes.
|
|
109
|
+
const detail = labelStreams(r.stderr, r.stdout, { transform: redactSecrets });
|
|
110
|
+
const reason = detail ?? `codex login status exited with ${r.code ?? r.signal ?? "unknown result"}`;
|
|
111
|
+
return {
|
|
112
|
+
authed: false,
|
|
113
|
+
method: "unknown",
|
|
114
|
+
probeError: r.code === 0 ? `unrecognized login status: ${reason}` : reason,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
return {
|
|
119
|
+
authed: false,
|
|
120
|
+
method: "unknown",
|
|
121
|
+
probeError: [...redactSecrets(err instanceof Error ? err.message : String(err))]
|
|
122
|
+
.slice(0, 300)
|
|
123
|
+
.join(""),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
export function hasApiKey() {
|
|
128
|
+
return Boolean(codexApiKey());
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Auth route the codex child will ACTUALLY run under, read from the same
|
|
132
|
+
* `auth.json` codex itself loads in a Claudexor-created scoped CODEX_HOME.
|
|
133
|
+
* The vendor-owned native home is deliberately not a fallback and must remain
|
|
134
|
+
* opaque. The file's own `auth_mode` field is the typed source of truth:
|
|
135
|
+
* "chatgpt" = subscription session, "apikey" = API key. Null when the file is
|
|
136
|
+
* absent/unreadable or carries an unknown mode — callers must treat that as
|
|
137
|
+
* undisclosed, never guess.
|
|
138
|
+
*/
|
|
139
|
+
export function codexAuthModeAt(home) {
|
|
140
|
+
if (!home.trim() || resolve(home) === resolve(defaultNativeCodexHome()))
|
|
141
|
+
return null;
|
|
142
|
+
try {
|
|
143
|
+
const parsed = JSON.parse(readFileSync(join(home, "auth.json"), "utf8"));
|
|
144
|
+
if (parsed.auth_mode === "chatgpt")
|
|
145
|
+
return "local_session";
|
|
146
|
+
if (parsed.auth_mode === "apikey")
|
|
147
|
+
return "api_key";
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,28 +1,16 @@
|
|
|
1
1
|
import type { HarnessRunSpec } from "@claudexor/schema";
|
|
2
2
|
import type { HarnessAdapter } from "@claudexor/core";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
export declare function
|
|
14
|
-
/**
|
|
15
|
-
* Seed the user's NATIVE codex session (`auth.json`, ChatGPT/subscription mode)
|
|
16
|
-
* into an isolated CODEX_HOME so a Max/Pro subscriber with NO API key can run
|
|
17
|
-
* inside a Claudexor envelope. This is the "subscription-first must actually
|
|
18
|
-
* work" fix: previously the scoped empty CODEX_HOME hid the native session and
|
|
19
|
-
* the run failed demanding an API key.
|
|
20
|
-
*
|
|
21
|
-
* Copies ONLY if the scoped auth is absent and a native `auth.json` exists; never
|
|
22
|
-
* overwrites (codex refreshes the token in place). Returns true when scoped auth
|
|
23
|
-
* is present afterwards. No-op when not isolated or no native session exists.
|
|
24
|
-
*/
|
|
25
|
-
export declare function ensureCodexNativeAuth(env?: Record<string, string>, nativeHome?: string): boolean;
|
|
3
|
+
import { runCliHarness, selectStrictAuthRoute } from "@claudexor/core";
|
|
4
|
+
import { smokeIsolatedApiKey } from "./smoke.js";
|
|
5
|
+
export { canonicalCodexProfileHome } from "./profile.js";
|
|
6
|
+
export declare const BIN: string;
|
|
7
|
+
/** Exported for focused route-policy tests; runtime uses this exact selector. */
|
|
8
|
+
export declare const selectCodexRunAuthRoute: typeof selectStrictAuthRoute;
|
|
9
|
+
export { CODEX_FILE_AUTH_ARGS, CODEX_FILE_AUTH_OVERRIDE, codexApiKey, codexAuthModeAt, defaultNativeCodexHome, ensureCodexApiAuth, probeLogin, } from "./auth.js";
|
|
10
|
+
import { codexApiKey, hasApiKey, probeLogin } from "./auth.js";
|
|
11
|
+
declare function detectVersion(abortSignal?: AbortSignal): Promise<string | null>;
|
|
12
|
+
export declare function redactCodexDoctorDetail(text: string): string;
|
|
13
|
+
export declare function codexNativeEnv(base?: Record<string, string | null | undefined>, codexHome?: string): Record<string, string | null | undefined>;
|
|
26
14
|
/**
|
|
27
15
|
* Inject the Playwright browser MCP as stateless `-c mcp_servers.browser.*`
|
|
28
16
|
* config overrides (live-verified: codex accepts array-valued `-c` overrides and
|
|
@@ -42,11 +30,24 @@ export declare function codexBrowserArgs(browser: HarnessRunSpec["browser"], ext
|
|
|
42
30
|
* mcp_servers.node_repl"), which broke every scoped-home / api_key / MCP run.
|
|
43
31
|
*/
|
|
44
32
|
export declare function codexConfigHasNodeRepl(codexHome: string | null | undefined): boolean;
|
|
45
|
-
export declare function codexExecArgs(spec: Pick<HarnessRunSpec, "access" | "model_hint" | "effort_hint" | "external_context_policy" | "prompt" | "attachments" | "browser"> & {
|
|
33
|
+
export declare function codexExecArgs(spec: Pick<HarnessRunSpec, "access" | "model_hint" | "effort_hint" | "external_context_policy" | "prompt" | "instructions" | "attachments" | "browser"> & {
|
|
46
34
|
resume_session_id?: string | null;
|
|
47
35
|
}, opts?: {
|
|
48
36
|
suppressNodeRepl?: boolean;
|
|
49
37
|
outputSchemaPath?: string | null;
|
|
50
38
|
}): string[];
|
|
51
|
-
|
|
39
|
+
/** The runtime surface the profile module needs (test-stubbable). */
|
|
40
|
+
export type CodexProfileRuntimeDeps = Pick<CodexRuntimeDeps, "probeLogin" | "resolveProfileSecret">;
|
|
41
|
+
type CodexRuntimeDeps = {
|
|
42
|
+
detectVersion: typeof detectVersion;
|
|
43
|
+
probeLogin: typeof probeLogin;
|
|
44
|
+
hasApiKey: typeof hasApiKey;
|
|
45
|
+
codexApiKey: typeof codexApiKey;
|
|
46
|
+
/** Profile-scoped secret resolution (INV-135): reads exactly the profile's
|
|
47
|
+
* namespaced ref, never the engine-default ladder. */
|
|
48
|
+
resolveProfileSecret: (ref: string) => string | null;
|
|
49
|
+
smokeIsolatedApiKey: typeof smokeIsolatedApiKey;
|
|
50
|
+
runCliHarness: typeof runCliHarness;
|
|
51
|
+
};
|
|
52
|
+
export declare function createCodexAdapter(deps?: Partial<CodexRuntimeDeps>): HarnessAdapter;
|
|
52
53
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EASV,cAAc,EACf,MAAM,mBAAmB,CAAC;AAK3B,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAQL,aAAa,EACb,qBAAqB,EAItB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAIzD,eAAO,MAAM,GAAG,QAA6C,CAAC;AAU9D,iFAAiF;AACjF,eAAO,MAAM,uBAAuB,8BAAwB,CAAC;AAE7D,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,WAAW,EACX,eAAe,EACf,sBAAsB,EACtB,kBAAkB,EAClB,UAAU,GACX,MAAM,WAAW,CAAC;AACnB,OAAO,EAEL,WAAW,EAIX,SAAS,EACT,UAAU,EAEX,MAAM,WAAW,CAAC;AA0CnB,iBAAe,aAAa,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAY9E;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,cAAc,CAC5B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAChD,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAM3C;AAmCD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,EAClC,qBAAqB,CAAC,EAAE,cAAc,CAAC,yBAAyB,CAAC,GAChE,MAAM,EAAE,CAaV;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAOpF;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,IAAI,CACR,cAAc,EACZ,QAAQ,GACR,YAAY,GACZ,aAAa,GACb,yBAAyB,GACzB,QAAQ,GACR,cAAc,GACd,aAAa,GACb,SAAS,CACZ,GAAG;IACF,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC,EACD,IAAI,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO,GAC1E,MAAM,EAAE,CA8DV;AA6BD,qEAAqE;AACrE,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,gBAAgB,EAAE,YAAY,GAAG,sBAAsB,CAAC,CAAC;AAEpG,KAAK,gBAAgB,GAAG;IACtB,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,WAAW,EAAE,OAAO,WAAW,CAAC;IAChC;0DACsD;IACtD,oBAAoB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACrD,mBAAmB,EAAE,OAAO,mBAAmB,CAAC;IAChD,aAAa,EAAE,OAAO,aAAa,CAAC;CACrC,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,OAAO,CAAC,gBAAgB,CAAM,GAAG,cAAc,CAqQvF"}
|