@tokensrc/codex 1.13.4 → 1.14.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 +79 -3
- package/dist/client.d.ts +29 -1
- package/dist/client.js +221 -2
- package/dist/client.js.map +1 -1
- package/dist/command-directory.d.ts +1 -0
- package/dist/command-directory.js +3 -2
- package/dist/command-directory.js.map +1 -1
- package/dist/commands.d.ts +8 -2
- package/dist/commands.js +567 -40
- package/dist/commands.js.map +1 -1
- package/dist/console-status.js +1 -1
- package/dist/console-status.js.map +1 -1
- package/dist/credential-supervisor.d.ts +17 -0
- package/dist/credential-supervisor.js +84 -0
- package/dist/credential-supervisor.js.map +1 -0
- package/dist/credentials.d.ts +75 -3
- package/dist/credentials.js +357 -12
- package/dist/credentials.js.map +1 -1
- package/dist/enrollment-envelope.d.ts +18 -0
- package/dist/enrollment-envelope.js +112 -0
- package/dist/enrollment-envelope.js.map +1 -0
- package/dist/enrollment-flow.d.ts +27 -0
- package/dist/enrollment-flow.js +224 -0
- package/dist/enrollment-flow.js.map +1 -0
- package/dist/enrollment-login.d.ts +26 -0
- package/dist/enrollment-login.js +104 -0
- package/dist/enrollment-login.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +17 -3
- package/dist/index.js.map +1 -1
- package/dist/managed-credential-v3-envelope.d.ts +60 -0
- package/dist/managed-credential-v3-envelope.js +234 -0
- package/dist/managed-credential-v3-envelope.js.map +1 -0
- package/dist/managed-credential-v3-flow.d.ts +45 -0
- package/dist/managed-credential-v3-flow.js +499 -0
- package/dist/managed-credential-v3-flow.js.map +1 -0
- package/dist/managed-credential-v3-journal.d.ts +192 -0
- package/dist/managed-credential-v3-journal.js +153 -0
- package/dist/managed-credential-v3-journal.js.map +1 -0
- package/dist/managed-credential-v3.d.ts +117 -0
- package/dist/managed-credential-v3.js +423 -0
- package/dist/managed-credential-v3.js.map +1 -0
- package/dist/migration-login-batch.d.ts +66 -0
- package/dist/migration-login-batch.js +202 -0
- package/dist/migration-login-batch.js.map +1 -0
- package/dist/private-file.d.ts +10 -0
- package/dist/private-file.js +77 -2
- package/dist/private-file.js.map +1 -1
- package/dist/profile.d.ts +10 -0
- package/dist/profile.js +55 -2
- package/dist/profile.js.map +1 -1
- package/dist/protocol.d.ts +1070 -0
- package/dist/protocol.js +560 -0
- package/dist/protocol.js.map +1 -1
- package/dist/retirement-flow.d.ts +38 -0
- package/dist/retirement-flow.js +78 -0
- package/dist/retirement-flow.js.map +1 -0
- package/dist/runtime.d.ts +4 -1
- package/dist/runtime.js +29 -4
- package/dist/runtime.js.map +1 -1
- package/dist/selection.d.ts +10 -1
- package/dist/selection.js +38 -2
- package/dist/selection.js.map +1 -1
- package/dist/short-lived-delivery-flow.d.ts +41 -0
- package/dist/short-lived-delivery-flow.js +141 -0
- package/dist/short-lived-delivery-flow.js.map +1 -0
- package/dist/short-lived-delivery-journal.d.ts +34 -0
- package/dist/short-lived-delivery-journal.js +137 -0
- package/dist/short-lived-delivery-journal.js.map +1 -0
- package/dist/short-lived-delivery.d.ts +26 -0
- package/dist/short-lived-delivery.js +139 -0
- package/dist/short-lived-delivery.js.map +1 -0
- package/dist/tui.js +23 -0
- package/dist/tui.js.map +1 -1
- package/dist/types.d.ts +6 -2
- package/package.json +2 -2
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { sealCodexEnrollmentCandidate } from "./enrollment-envelope.js";
|
|
3
|
+
import { withOneShotCodexLogin } from "./enrollment-login.js";
|
|
4
|
+
import { CodexServiceError } from "./errors.js";
|
|
5
|
+
/**
|
|
6
|
+
* Claims one server-created intent, runs an isolated official login, and sends
|
|
7
|
+
* only an authenticated encrypted refresh-token envelope to that exact intent.
|
|
8
|
+
*/
|
|
9
|
+
export async function executeCodexEnrollmentLogin(input) {
|
|
10
|
+
const randomId = input.randomId ?? randomUUID;
|
|
11
|
+
const oneShotLogin = input.oneShotLogin ?? withOneShotCodexLogin;
|
|
12
|
+
let current = await input.client.getEnrollmentIntent(input.intentId);
|
|
13
|
+
const ingress = current.capabilities.candidateIngress;
|
|
14
|
+
if (!current.capabilities.candidateUpload || !ingress) {
|
|
15
|
+
throw new CodexServiceError("服务端尚未启用加密候选上传;为避免生成无法安全接收的 RT,本次不会启动 OpenAI 登录。", "capability_not_enabled", 409);
|
|
16
|
+
}
|
|
17
|
+
const resumableClaim = input.resumeClaimedIntent === true
|
|
18
|
+
&& ["CLAIMED", "LOGIN_IN_PROGRESS"].includes(current.intent.status)
|
|
19
|
+
&& current.intent.allowedActions.includes("HEARTBEAT");
|
|
20
|
+
if (input.requireInitialAwaitingCli
|
|
21
|
+
&& !resumableClaim
|
|
22
|
+
&& (current.intent.status !== "AWAITING_CLI" || !current.intent.allowedActions.includes("CLAIM"))) {
|
|
23
|
+
throw stateConflict(current);
|
|
24
|
+
}
|
|
25
|
+
if (current.intent.allowedActions.includes("CLAIM") || resumableClaim) {
|
|
26
|
+
current = await input.client.claimEnrollmentIntent(input.intentId, {
|
|
27
|
+
idempotencyKey: randomId(),
|
|
28
|
+
revision: current.intent.revision
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
if (!["CLAIMED", "LOGIN_IN_PROGRESS"].includes(current.intent.status)
|
|
32
|
+
|| !current.intent.allowedActions.includes("HEARTBEAT")) {
|
|
33
|
+
throw stateConflict(current);
|
|
34
|
+
}
|
|
35
|
+
current = await input.client.heartbeatEnrollmentIntent(input.intentId, {
|
|
36
|
+
idempotencyKey: randomId(),
|
|
37
|
+
revision: current.intent.revision,
|
|
38
|
+
phase: "LOGIN_IN_PROGRESS"
|
|
39
|
+
});
|
|
40
|
+
const keepalive = createLoginKeepalive({
|
|
41
|
+
client: input.client,
|
|
42
|
+
intentId: input.intentId,
|
|
43
|
+
current,
|
|
44
|
+
randomId,
|
|
45
|
+
intervalMs: input.heartbeatIntervalMs ?? 30_000
|
|
46
|
+
});
|
|
47
|
+
try {
|
|
48
|
+
return await oneShotLogin({
|
|
49
|
+
...input.loginOptions,
|
|
50
|
+
mode: input.deviceAuth ? "device" : "browser"
|
|
51
|
+
}, async (credentials) => {
|
|
52
|
+
try {
|
|
53
|
+
current = await keepalive.stop();
|
|
54
|
+
const candidateRetryDelays = input.candidateRetryDelaysMs ?? [1_000, 3_000];
|
|
55
|
+
const transportRetryDelays = input.candidateTransportRetryDelaysMs ?? [250, 1_000];
|
|
56
|
+
const wait = input.wait ?? defaultWait;
|
|
57
|
+
for (let candidateAttempt = 0;; candidateAttempt += 1) {
|
|
58
|
+
current = await input.client.heartbeatEnrollmentIntent(input.intentId, {
|
|
59
|
+
idempotencyKey: randomId(),
|
|
60
|
+
revision: current.intent.revision,
|
|
61
|
+
phase: "UPLOADING"
|
|
62
|
+
});
|
|
63
|
+
const revision = current.intent.revision;
|
|
64
|
+
const idempotencyKey = randomId();
|
|
65
|
+
const candidate = {
|
|
66
|
+
schemaVersion: 2,
|
|
67
|
+
revision,
|
|
68
|
+
envelope: sealCodexEnrollmentCandidate({
|
|
69
|
+
tenantId: input.tenantId,
|
|
70
|
+
intentId: input.intentId,
|
|
71
|
+
revision,
|
|
72
|
+
idempotencyKey,
|
|
73
|
+
refreshToken: credentials.refreshToken,
|
|
74
|
+
ingress
|
|
75
|
+
})
|
|
76
|
+
};
|
|
77
|
+
const result = await uploadCandidateWithRetry({
|
|
78
|
+
client: input.client,
|
|
79
|
+
intentId: input.intentId,
|
|
80
|
+
candidate,
|
|
81
|
+
idempotencyKey,
|
|
82
|
+
retryDelays: transportRetryDelays,
|
|
83
|
+
wait
|
|
84
|
+
});
|
|
85
|
+
if (result.result.outcome !== "TEMPORARILY_UNAVAILABLE")
|
|
86
|
+
return result;
|
|
87
|
+
const delay = candidateRetryDelays[candidateAttempt];
|
|
88
|
+
if (delay === undefined)
|
|
89
|
+
return result;
|
|
90
|
+
current = result;
|
|
91
|
+
await wait(delay);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
credentials.refreshToken = "";
|
|
96
|
+
credentials.accessToken = "";
|
|
97
|
+
credentials.idToken = "";
|
|
98
|
+
delete credentials.providerAccountId;
|
|
99
|
+
delete credentials.lastRefresh;
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
await keepalive.stop();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async function uploadCandidateWithRetry(input) {
|
|
108
|
+
let priorAttemptWasUncertain = false;
|
|
109
|
+
for (let attempt = 0;; attempt += 1) {
|
|
110
|
+
try {
|
|
111
|
+
return await input.client.uploadEnrollmentCandidate(input.intentId, input.candidate, input.idempotencyKey);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
if (!isUncertainCandidateUpload(error)) {
|
|
115
|
+
if (priorAttemptWasUncertain) {
|
|
116
|
+
return reconcileCandidateUpload(input.client, input.intentId);
|
|
117
|
+
}
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
priorAttemptWasUncertain = true;
|
|
121
|
+
const delay = input.retryDelays[attempt];
|
|
122
|
+
if (!isRetryableCandidateUpload(error) || delay === undefined) {
|
|
123
|
+
return reconcileCandidateUpload(input.client, input.intentId);
|
|
124
|
+
}
|
|
125
|
+
await input.wait(delay);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function createLoginKeepalive(input) {
|
|
130
|
+
let current = input.current;
|
|
131
|
+
let stopped = false;
|
|
132
|
+
let timer;
|
|
133
|
+
let pending = Promise.resolve();
|
|
134
|
+
let failure;
|
|
135
|
+
const schedule = () => {
|
|
136
|
+
if (stopped || input.intervalMs <= 0)
|
|
137
|
+
return;
|
|
138
|
+
timer = setTimeout(() => {
|
|
139
|
+
pending = input.client.heartbeatEnrollmentIntent(input.intentId, {
|
|
140
|
+
idempotencyKey: input.randomId(),
|
|
141
|
+
revision: current.intent.revision,
|
|
142
|
+
phase: "LOGIN_IN_PROGRESS"
|
|
143
|
+
}).then((response) => {
|
|
144
|
+
current = response;
|
|
145
|
+
schedule();
|
|
146
|
+
}).catch((error) => {
|
|
147
|
+
failure = error;
|
|
148
|
+
});
|
|
149
|
+
}, input.intervalMs);
|
|
150
|
+
timer.unref();
|
|
151
|
+
};
|
|
152
|
+
schedule();
|
|
153
|
+
return {
|
|
154
|
+
async stop() {
|
|
155
|
+
stopped = true;
|
|
156
|
+
if (timer)
|
|
157
|
+
clearTimeout(timer);
|
|
158
|
+
await pending;
|
|
159
|
+
if (failure)
|
|
160
|
+
throw failure;
|
|
161
|
+
return current;
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
function stateConflict(current) {
|
|
166
|
+
if (current.intent.status === "TEMPORARILY_UNAVAILABLE") {
|
|
167
|
+
return new CodexServiceError("This intent retains a prior undispatched candidate that a new login cannot reproduce. Cancel it and create a new enrollment intent.", "enrollment_intent_state_conflict", 409);
|
|
168
|
+
}
|
|
169
|
+
return new CodexServiceError(`Enrollment intent cannot start a new official login from status ${current.intent.status}. Check status before retrying.`, "enrollment_intent_state_conflict", 409);
|
|
170
|
+
}
|
|
171
|
+
function isRetryableCandidateUpload(error) {
|
|
172
|
+
const value = error;
|
|
173
|
+
return value?.code === "codex_service_unavailable"
|
|
174
|
+
|| typeof value?.status === "number" && value.status >= 500 && value.status <= 599
|
|
175
|
+
|| value?.name === "AbortError"
|
|
176
|
+
|| value?.name === "TimeoutError"
|
|
177
|
+
|| error instanceof TypeError;
|
|
178
|
+
}
|
|
179
|
+
function isUncertainCandidateUpload(error) {
|
|
180
|
+
const code = error?.code;
|
|
181
|
+
return isRetryableCandidateUpload(error) || code === "invalid_codex_service_response";
|
|
182
|
+
}
|
|
183
|
+
async function reconcileCandidateUpload(client, intentId) {
|
|
184
|
+
let observed;
|
|
185
|
+
try {
|
|
186
|
+
observed = await client.getEnrollmentIntent(intentId);
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
throw ambiguousCandidateUpload();
|
|
190
|
+
}
|
|
191
|
+
const outcome = candidateOutcomeForStatus(observed.intent.status);
|
|
192
|
+
if (outcome) {
|
|
193
|
+
return {
|
|
194
|
+
...observed,
|
|
195
|
+
result: {
|
|
196
|
+
outcome,
|
|
197
|
+
managedAccountId: observed.intent.resultManagedAccountId,
|
|
198
|
+
lineageId: observed.intent.resultLineageId,
|
|
199
|
+
generationVersion: observed.intent.currentGenerationVersion,
|
|
200
|
+
replayed: true
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
if (["EXPIRED", "CANCELLED"].includes(observed.intent.status)) {
|
|
205
|
+
throw new CodexServiceError(`Enrollment candidate ended in terminal status ${observed.intent.status}; do not reuse its login or upload key.`, `enrollment_candidate_${observed.intent.status.toLowerCase()}`, 409);
|
|
206
|
+
}
|
|
207
|
+
throw ambiguousCandidateUpload();
|
|
208
|
+
}
|
|
209
|
+
function candidateOutcomeForStatus(status) {
|
|
210
|
+
return [
|
|
211
|
+
"READY",
|
|
212
|
+
"ACCOUNT_MISMATCH",
|
|
213
|
+
"IDENTITY_UNVERIFIABLE",
|
|
214
|
+
"TEMPORARILY_UNAVAILABLE",
|
|
215
|
+
"OUTCOME_AMBIGUOUS"
|
|
216
|
+
].includes(status) ? status : undefined;
|
|
217
|
+
}
|
|
218
|
+
function ambiguousCandidateUpload() {
|
|
219
|
+
return new CodexServiceError("The enrollment candidate upload result is not safely known. Do not start another login or submit a new key; inspect this same intent and resume only from a terminal Server result.", "enrollment_candidate_upload_ambiguous", 409);
|
|
220
|
+
}
|
|
221
|
+
function defaultWait(milliseconds) {
|
|
222
|
+
return new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=enrollment-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrollment-flow.js","sourceRoot":"","sources":["../src/enrollment-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type CodexRuntimeOptions } from "./runtime.js";
|
|
2
|
+
export interface OneShotCodexCredentials {
|
|
3
|
+
idToken: string;
|
|
4
|
+
accessToken: string;
|
|
5
|
+
refreshToken: string;
|
|
6
|
+
providerAccountId?: string;
|
|
7
|
+
lastRefresh?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface OneShotCodexLoginContext {
|
|
10
|
+
codexHome: string;
|
|
11
|
+
args: string[];
|
|
12
|
+
env: NodeJS.ProcessEnv;
|
|
13
|
+
}
|
|
14
|
+
export interface OneShotCodexLoginOptions {
|
|
15
|
+
mode?: "browser" | "device";
|
|
16
|
+
env?: NodeJS.ProcessEnv;
|
|
17
|
+
temporaryRoot?: string;
|
|
18
|
+
runtime?: Omit<CodexRuntimeOptions, "env">;
|
|
19
|
+
runner?: (context: OneShotCodexLoginContext) => Promise<number>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Runs one isolated official Codex login without touching the normal Codex home
|
|
23
|
+
* or the codex-multi-auth account pool. Credentials exist only for the duration
|
|
24
|
+
* of `consume`; the isolated home is removed on success, failure, or cancellation.
|
|
25
|
+
*/
|
|
26
|
+
export declare function withOneShotCodexLogin<T>(options: OneShotCodexLoginOptions, consume: (credentials: OneShotCodexCredentials) => Promise<T>): Promise<T>;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { lstat, mkdtemp, readFile, rm } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { CodexRuntimeError } from "./errors.js";
|
|
6
|
+
import { resolveCodexRuntime, runCodexLaunch } from "./runtime.js";
|
|
7
|
+
const MAX_AUTH_FILE_BYTES = 1024 * 1024;
|
|
8
|
+
const OneShotAuthFileSchema = z.strictObject({
|
|
9
|
+
auth_mode: z.literal("chatgpt"),
|
|
10
|
+
OPENAI_API_KEY: z.unknown().optional(),
|
|
11
|
+
tokens: z.strictObject({
|
|
12
|
+
id_token: z.string().min(1),
|
|
13
|
+
access_token: z.string().min(1),
|
|
14
|
+
refresh_token: z.string().min(1),
|
|
15
|
+
account_id: z.string().min(1).optional()
|
|
16
|
+
}),
|
|
17
|
+
last_refresh: z.string().datetime({ offset: true }).optional()
|
|
18
|
+
});
|
|
19
|
+
async function runOfficialLogin(context, runtime) {
|
|
20
|
+
const launch = await resolveCodexRuntime(context.args, {
|
|
21
|
+
...runtime,
|
|
22
|
+
env: context.env
|
|
23
|
+
});
|
|
24
|
+
return runCodexLaunch(launch, context.env, runtime?.binaryEnvNames?.[0]);
|
|
25
|
+
}
|
|
26
|
+
async function readOneShotCredentials(codexHome) {
|
|
27
|
+
const authPath = join(codexHome, "auth.json");
|
|
28
|
+
const file = await lstat(authPath).catch((error) => {
|
|
29
|
+
if (error.code === "ENOENT") {
|
|
30
|
+
throw new CodexRuntimeError("Official Codex login completed without creating auth.json.");
|
|
31
|
+
}
|
|
32
|
+
throw error;
|
|
33
|
+
});
|
|
34
|
+
if (!file.isFile() || file.isSymbolicLink() || file.size > MAX_AUTH_FILE_BYTES) {
|
|
35
|
+
throw new CodexRuntimeError("Official Codex login produced an invalid auth.json file.");
|
|
36
|
+
}
|
|
37
|
+
let decoded;
|
|
38
|
+
let encoded;
|
|
39
|
+
try {
|
|
40
|
+
encoded = await readFile(authPath);
|
|
41
|
+
decoded = JSON.parse(encoded.toString("utf8"));
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
throw new CodexRuntimeError("Official Codex login produced unreadable auth.json data.", {
|
|
45
|
+
cause: error
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
encoded?.fill(0);
|
|
50
|
+
}
|
|
51
|
+
const parsed = OneShotAuthFileSchema.safeParse(decoded);
|
|
52
|
+
if (!parsed.success) {
|
|
53
|
+
throw new CodexRuntimeError("Official Codex login did not produce complete ChatGPT credentials.");
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
idToken: parsed.data.tokens.id_token,
|
|
57
|
+
accessToken: parsed.data.tokens.access_token,
|
|
58
|
+
refreshToken: parsed.data.tokens.refresh_token,
|
|
59
|
+
...(parsed.data.tokens.account_id
|
|
60
|
+
? { providerAccountId: parsed.data.tokens.account_id }
|
|
61
|
+
: {}),
|
|
62
|
+
...(parsed.data.last_refresh ? { lastRefresh: parsed.data.last_refresh } : {})
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Runs one isolated official Codex login without touching the normal Codex home
|
|
67
|
+
* or the codex-multi-auth account pool. Credentials exist only for the duration
|
|
68
|
+
* of `consume`; the isolated home is removed on success, failure, or cancellation.
|
|
69
|
+
*/
|
|
70
|
+
export async function withOneShotCodexLogin(options, consume) {
|
|
71
|
+
const baseEnv = options.env ?? process.env;
|
|
72
|
+
const temporaryRoot = resolve(options.temporaryRoot ?? tmpdir());
|
|
73
|
+
const codexHome = await mkdtemp(join(temporaryRoot, "numa-codex-enrollment-"));
|
|
74
|
+
const args = ["login", ...(options.mode === "device" ? ["--device-auth"] : [])];
|
|
75
|
+
const env = { ...baseEnv, CODEX_HOME: codexHome };
|
|
76
|
+
try {
|
|
77
|
+
const exitCode = await (options.runner
|
|
78
|
+
? options.runner({ codexHome, args, env })
|
|
79
|
+
: runOfficialLogin({ codexHome, args, env }, options.runtime));
|
|
80
|
+
if (exitCode !== 0) {
|
|
81
|
+
throw new CodexRuntimeError(`Official Codex login exited with code ${exitCode}.`);
|
|
82
|
+
}
|
|
83
|
+
const credentials = await readOneShotCredentials(codexHome);
|
|
84
|
+
try {
|
|
85
|
+
return await consume(credentials);
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
credentials.refreshToken = "";
|
|
89
|
+
credentials.accessToken = "";
|
|
90
|
+
credentials.idToken = "";
|
|
91
|
+
delete credentials.providerAccountId;
|
|
92
|
+
delete credentials.lastRefresh;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
try {
|
|
97
|
+
await rm(codexHome, { recursive: true, force: true });
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
throw new CodexRuntimeError("Unable to remove the isolated Codex login directory; remove it before retrying enrollment.", { cause: error });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=enrollment-login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrollment-login.js","sourceRoot":"","sources":["../src/enrollment-login.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -15,4 +15,17 @@ export * from "./config.js";
|
|
|
15
15
|
export * from "./quota-cache.js";
|
|
16
16
|
export * from "./legacy-cleanup.js";
|
|
17
17
|
export * from "./profile.js";
|
|
18
|
+
export * from "./enrollment-login.js";
|
|
19
|
+
export * from "./enrollment-envelope.js";
|
|
20
|
+
export * from "./enrollment-flow.js";
|
|
21
|
+
export * from "./migration-login-batch.js";
|
|
22
|
+
export * from "./short-lived-delivery.js";
|
|
23
|
+
export * from "./short-lived-delivery-flow.js";
|
|
24
|
+
export * from "./short-lived-delivery-journal.js";
|
|
25
|
+
export * from "./credential-supervisor.js";
|
|
26
|
+
export * from "./managed-credential-v3.js";
|
|
27
|
+
export * from "./managed-credential-v3-envelope.js";
|
|
28
|
+
export * from "./managed-credential-v3-flow.js";
|
|
29
|
+
export * from "./managed-credential-v3-journal.js";
|
|
30
|
+
export * from "./retirement-flow.js";
|
|
18
31
|
export { registerCodexCommands } from "./commands.js";
|
package/dist/index.js
CHANGED
|
@@ -24,10 +24,10 @@ export async function createCodexModule(options = {}) {
|
|
|
24
24
|
launchMode: config.launcher.launchMode,
|
|
25
25
|
packageName: "@openai/codex"
|
|
26
26
|
});
|
|
27
|
-
const run = async (args = []) => runCodexLaunch(await resolveRuntime(args), env, config.launcher.binaryEnvNames[0]);
|
|
28
|
-
const app = async (workspace = ".") => {
|
|
27
|
+
const run = async (args = [], launchOptions = {}) => runCodexLaunch(await resolveRuntime(args), env, config.launcher.binaryEnvNames[0], launchOptions);
|
|
28
|
+
const app = async (workspace = ".", launchOptions = {}) => {
|
|
29
29
|
await options.desktopApp?.prepare?.();
|
|
30
|
-
return run(["app", workspace]);
|
|
30
|
+
return run(["app", workspace], launchOptions);
|
|
31
31
|
};
|
|
32
32
|
const module = {
|
|
33
33
|
config,
|
|
@@ -42,6 +42,7 @@ export async function createCodexModule(options = {}) {
|
|
|
42
42
|
status,
|
|
43
43
|
run,
|
|
44
44
|
app,
|
|
45
|
+
env,
|
|
45
46
|
output: options.output ?? process.stdout,
|
|
46
47
|
errorOutput: options.errorOutput ?? process.stderr,
|
|
47
48
|
jsonEnabled: options.jsonEnabled
|
|
@@ -68,5 +69,18 @@ export * from "./config.js";
|
|
|
68
69
|
export * from "./quota-cache.js";
|
|
69
70
|
export * from "./legacy-cleanup.js";
|
|
70
71
|
export * from "./profile.js";
|
|
72
|
+
export * from "./enrollment-login.js";
|
|
73
|
+
export * from "./enrollment-envelope.js";
|
|
74
|
+
export * from "./enrollment-flow.js";
|
|
75
|
+
export * from "./migration-login-batch.js";
|
|
76
|
+
export * from "./short-lived-delivery.js";
|
|
77
|
+
export * from "./short-lived-delivery-flow.js";
|
|
78
|
+
export * from "./short-lived-delivery-journal.js";
|
|
79
|
+
export * from "./credential-supervisor.js";
|
|
80
|
+
export * from "./managed-credential-v3.js";
|
|
81
|
+
export * from "./managed-credential-v3-envelope.js";
|
|
82
|
+
export * from "./managed-credential-v3-flow.js";
|
|
83
|
+
export * from "./managed-credential-v3-journal.js";
|
|
84
|
+
export * from "./retirement-flow.js";
|
|
71
85
|
export { registerCodexCommands } from "./commands.js";
|
|
72
86
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAO,GAAuB,EAAE;IACtE,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;IACzC,MAAM,IAAI,GAAG,oBAAoB,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,CAAC,UAAU,GAAwD,EAAE,EAAE,EAAE,CACzF,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM;QAC5B,CAAC,CAAC,IAAI,kBAAkB,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,GAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC;QAC7G,CAAC,CAAC,MAAM,CAAC;IACb,MAAM,MAAM,GAAG,uBAAuB,CAAC,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,EAAE;QACtF,iBAAiB,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO;KAC/C,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,CAAC,IAAI,GAAa,EAAE,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE;QACxE,GAAG;QACH,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW;QACnC,cAAc,EAAE,MAAM,CAAC,QAAQ,CAAC,cAAc;QAC9C,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,eAAe;QAChD,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU;QACtC,WAAW,EAAE,eAAe;KAC7B,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,KAAK,EAAE,IAAI,GAAa,EAAE,EAAmB,EAAE,CAAC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { type KeyObject } from "node:crypto";
|
|
2
|
+
import { type CodexV3CredentialEnvelope, type CodexV3CredentialIngress, type CodexV3FullCredentialDeliveryResponse, type CodexV3FullCredentialBundle, type CodexShortLivedDeliveryClientKey } from "./protocol.js";
|
|
3
|
+
export interface CodexV3FullCredentialInput {
|
|
4
|
+
refreshToken: string;
|
|
5
|
+
accessToken: string;
|
|
6
|
+
idToken: string;
|
|
7
|
+
providerAccountId: string;
|
|
8
|
+
expiresAt: string;
|
|
9
|
+
}
|
|
10
|
+
export interface CodexV3DeliveryKeyPair {
|
|
11
|
+
clientKey: CodexShortLivedDeliveryClientKey;
|
|
12
|
+
privateKey: KeyObject;
|
|
13
|
+
}
|
|
14
|
+
export declare function codexV3EnrollmentAad(input: {
|
|
15
|
+
tenantId: string;
|
|
16
|
+
subject: string;
|
|
17
|
+
clientRequestId: string;
|
|
18
|
+
idempotencyKey: string;
|
|
19
|
+
keyId: string;
|
|
20
|
+
}): Buffer;
|
|
21
|
+
export declare function codexV3GenerationReportAad(input: {
|
|
22
|
+
tenantId: string;
|
|
23
|
+
subject: string;
|
|
24
|
+
lineageId: string;
|
|
25
|
+
clientRequestId: string;
|
|
26
|
+
idempotencyKey: string;
|
|
27
|
+
expectedGenerationVersion: number;
|
|
28
|
+
rotationMode: "ROTATED" | "RETAINED";
|
|
29
|
+
keyId: string;
|
|
30
|
+
}): Buffer;
|
|
31
|
+
export declare function sealCodexV3Enrollment(input: {
|
|
32
|
+
tenantId: string;
|
|
33
|
+
subject: string;
|
|
34
|
+
clientRequestId: string;
|
|
35
|
+
idempotencyKey: string;
|
|
36
|
+
ingress: CodexV3CredentialIngress;
|
|
37
|
+
credentials: CodexV3FullCredentialInput;
|
|
38
|
+
}): CodexV3CredentialEnvelope;
|
|
39
|
+
export declare function sealCodexV3GenerationReport(input: {
|
|
40
|
+
tenantId: string;
|
|
41
|
+
subject: string;
|
|
42
|
+
lineageId: string;
|
|
43
|
+
clientRequestId: string;
|
|
44
|
+
idempotencyKey: string;
|
|
45
|
+
expectedGenerationVersion: number;
|
|
46
|
+
rotationMode: "ROTATED" | "RETAINED";
|
|
47
|
+
ingress: CodexV3CredentialIngress;
|
|
48
|
+
credentials: CodexV3FullCredentialInput;
|
|
49
|
+
}): CodexV3CredentialEnvelope;
|
|
50
|
+
export declare function createCodexV3DeliveryKeyPair(): CodexV3DeliveryKeyPair;
|
|
51
|
+
export declare function codexV3FullDeliveryAad(input: {
|
|
52
|
+
tenantId: string;
|
|
53
|
+
delivery: CodexV3FullCredentialDeliveryResponse["delivery"];
|
|
54
|
+
}): Buffer;
|
|
55
|
+
export declare function openCodexV3FullCredentialDelivery(input: {
|
|
56
|
+
tenantId: string;
|
|
57
|
+
response: CodexV3FullCredentialDeliveryResponse;
|
|
58
|
+
privateKey: KeyObject;
|
|
59
|
+
now?: number;
|
|
60
|
+
}): CodexV3FullCredentialBundle;
|