@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
package/dist/credentials.js
CHANGED
|
@@ -3,7 +3,8 @@ import { readFile, rm } from "node:fs/promises";
|
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import * as codexMultiAuthCli from "codex-multi-auth/cli";
|
|
6
|
-
import {
|
|
6
|
+
import { CodexServiceError } from "./errors.js";
|
|
7
|
+
import { readJsonIfExists, removePrivateFileDurably, withPrivateFileLock, writePrivateJson, writePrivateText } from "./private-file.js";
|
|
7
8
|
const externalApi = codexMultiAuthCli;
|
|
8
9
|
function paths(env = process.env) {
|
|
9
10
|
const codexHome = env.CODEX_HOME?.trim() || join(homedir(), ".codex");
|
|
@@ -13,6 +14,14 @@ function paths(env = process.env) {
|
|
|
13
14
|
configPath: join(codexHome, "config.toml")
|
|
14
15
|
};
|
|
15
16
|
}
|
|
17
|
+
function managedLineageStatePath(env = process.env) {
|
|
18
|
+
const codexHome = env.CODEX_HOME?.trim() || join(homedir(), ".codex");
|
|
19
|
+
return join(codexHome, ".numa-managed-lineage.json");
|
|
20
|
+
}
|
|
21
|
+
function managedRetirementTombstonePath(env = process.env) {
|
|
22
|
+
const codexHome = env.CODEX_HOME?.trim() || join(homedir(), ".codex");
|
|
23
|
+
return join(codexHome, ".numa-retirement-tombstone.json");
|
|
24
|
+
}
|
|
16
25
|
async function optionalText(path) {
|
|
17
26
|
try {
|
|
18
27
|
return await readFile(path, "utf8");
|
|
@@ -41,6 +50,10 @@ export async function restoreCodexFileCredentials(env = process.env) {
|
|
|
41
50
|
await writePrivateText(value.authPath, backup);
|
|
42
51
|
return { action: "restored", ...value };
|
|
43
52
|
}
|
|
53
|
+
/** Removes the legacy full-auth backup before entering or leaving schema-v2 managed mode. */
|
|
54
|
+
export async function discardCodexFileCredentialBackup(env = process.env) {
|
|
55
|
+
await removePrivateFileDurably(paths(env).backupPath);
|
|
56
|
+
}
|
|
44
57
|
export async function inspectLocalCodexCredentialStatus(expectedAccountId, env = process.env) {
|
|
45
58
|
const authPath = paths(env).authPath;
|
|
46
59
|
if (externalApi.inspectCodexCredentialStatus) {
|
|
@@ -88,6 +101,321 @@ function validJwt(token) {
|
|
|
88
101
|
return false;
|
|
89
102
|
}
|
|
90
103
|
}
|
|
104
|
+
function requiredValue(value, name) {
|
|
105
|
+
const normalized = value.trim();
|
|
106
|
+
if (!normalized)
|
|
107
|
+
throw new CodexServiceError(`${name} is required.`, "invalid_managed_codex_credentials");
|
|
108
|
+
return normalized;
|
|
109
|
+
}
|
|
110
|
+
function parseManagedLineageState(value) {
|
|
111
|
+
if (!value || typeof value !== "object")
|
|
112
|
+
return undefined;
|
|
113
|
+
const state = value;
|
|
114
|
+
if (state.schemaVersion !== 2
|
|
115
|
+
|| (state.tenantId !== undefined && typeof state.tenantId !== "string")
|
|
116
|
+
|| typeof state.assignmentId !== "string"
|
|
117
|
+
|| typeof state.managedAccountId !== "string"
|
|
118
|
+
|| typeof state.lineageId !== "string"
|
|
119
|
+
|| typeof state.generationVersion !== "number"
|
|
120
|
+
|| !Number.isInteger(state.generationVersion)
|
|
121
|
+
|| state.generationVersion <= 0
|
|
122
|
+
|| typeof state.providerAccountId !== "string"
|
|
123
|
+
|| typeof state.deliveryId !== "string"
|
|
124
|
+
|| typeof state.credentialExpiresAt !== "string"
|
|
125
|
+
|| !Number.isFinite(Date.parse(state.credentialExpiresAt))
|
|
126
|
+
|| typeof state.ackExpiresAt !== "string"
|
|
127
|
+
|| !Number.isFinite(Date.parse(state.ackExpiresAt))
|
|
128
|
+
|| (state.ackedAt !== null && typeof state.ackedAt !== "string")
|
|
129
|
+
|| (state.ackedAt !== null && !Number.isFinite(Date.parse(state.ackedAt)))
|
|
130
|
+
|| (state.phase !== "INSTALLING" && state.phase !== "INSTALLED_PENDING_ACK"
|
|
131
|
+
&& state.phase !== "INSTALLED")
|
|
132
|
+
|| typeof state.updatedAt !== "string")
|
|
133
|
+
return undefined;
|
|
134
|
+
if (state.previous !== null && state.previous !== undefined) {
|
|
135
|
+
const previous = state.previous;
|
|
136
|
+
if (!previous || typeof previous.assignmentId !== "string"
|
|
137
|
+
|| typeof previous.lineageId !== "string"
|
|
138
|
+
|| !Number.isInteger(previous.generationVersion)
|
|
139
|
+
|| previous.generationVersion <= 0)
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
schemaVersion: 2,
|
|
144
|
+
tenantId: state.tenantId?.trim() || null,
|
|
145
|
+
assignmentId: state.assignmentId,
|
|
146
|
+
managedAccountId: state.managedAccountId,
|
|
147
|
+
lineageId: state.lineageId,
|
|
148
|
+
generationVersion: state.generationVersion,
|
|
149
|
+
providerAccountId: state.providerAccountId,
|
|
150
|
+
deliveryId: state.deliveryId,
|
|
151
|
+
credentialExpiresAt: state.credentialExpiresAt,
|
|
152
|
+
ackExpiresAt: state.ackExpiresAt,
|
|
153
|
+
ackedAt: state.ackedAt ?? null,
|
|
154
|
+
phase: state.phase,
|
|
155
|
+
updatedAt: state.updatedAt,
|
|
156
|
+
previous: state.previous ?? null
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
function parseRetirementTombstone(value) {
|
|
160
|
+
if (!value || typeof value !== "object")
|
|
161
|
+
return undefined;
|
|
162
|
+
const tombstone = value;
|
|
163
|
+
if (tombstone.schemaVersion !== 2
|
|
164
|
+
|| typeof tombstone.retirementId !== "string"
|
|
165
|
+
|| typeof tombstone.expectedRevision !== "number"
|
|
166
|
+
|| !Number.isInteger(tombstone.expectedRevision)
|
|
167
|
+
|| tombstone.expectedRevision <= 0
|
|
168
|
+
|| typeof tombstone.idempotencyKey !== "string"
|
|
169
|
+
|| typeof tombstone.assignmentId !== "string"
|
|
170
|
+
|| typeof tombstone.lineageId !== "string"
|
|
171
|
+
|| typeof tombstone.generationVersion !== "number"
|
|
172
|
+
|| !Number.isInteger(tombstone.generationVersion)
|
|
173
|
+
|| tombstone.generationVersion <= 0
|
|
174
|
+
|| typeof tombstone.deletedAt !== "string"
|
|
175
|
+
|| !Number.isFinite(Date.parse(tombstone.deletedAt))
|
|
176
|
+
|| (tombstone.acknowledgedAt !== null && typeof tombstone.acknowledgedAt !== "string")
|
|
177
|
+
|| (typeof tombstone.acknowledgedAt === "string"
|
|
178
|
+
&& !Number.isFinite(Date.parse(tombstone.acknowledgedAt))))
|
|
179
|
+
return undefined;
|
|
180
|
+
return {
|
|
181
|
+
schemaVersion: 2,
|
|
182
|
+
retirementId: tombstone.retirementId,
|
|
183
|
+
expectedRevision: tombstone.expectedRevision,
|
|
184
|
+
idempotencyKey: tombstone.idempotencyKey,
|
|
185
|
+
assignmentId: tombstone.assignmentId,
|
|
186
|
+
lineageId: tombstone.lineageId,
|
|
187
|
+
generationVersion: tombstone.generationVersion,
|
|
188
|
+
deletedAt: tombstone.deletedAt,
|
|
189
|
+
acknowledgedAt: tombstone.acknowledgedAt ?? null
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
async function installedAuthMatches(input, env) {
|
|
193
|
+
const raw = await optionalText(paths(env).authPath);
|
|
194
|
+
if (!raw)
|
|
195
|
+
return false;
|
|
196
|
+
try {
|
|
197
|
+
const auth = JSON.parse(raw);
|
|
198
|
+
return auth.auth_mode === "chatgpt"
|
|
199
|
+
&& auth.tokens?.id_token === input.idToken
|
|
200
|
+
&& auth.tokens?.access_token === input.accessToken
|
|
201
|
+
&& auth.tokens?.account_id === input.providerAccountId;
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
export async function readManagedCodexLineageState(env = process.env) {
|
|
208
|
+
return parseManagedLineageState(await readJsonIfExists(managedLineageStatePath(env)));
|
|
209
|
+
}
|
|
210
|
+
export async function readManagedCodexRetirementTombstone(env = process.env) {
|
|
211
|
+
return parseRetirementTombstone(await readJsonIfExists(managedRetirementTombstonePath(env)));
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Removes only the exact managed lineage currently installed in auth.json.
|
|
215
|
+
* The Secret-free tombstone is committed first so a process crash can retry
|
|
216
|
+
* the Server ACK without restoring or redisclosing credentials.
|
|
217
|
+
*/
|
|
218
|
+
export async function prepareManagedCodexLineageRetirement(input, now = Date.now(), env = process.env) {
|
|
219
|
+
const retirementId = requiredValue(input.retirementId, "retirementId");
|
|
220
|
+
const idempotencyKey = requiredValue(input.idempotencyKey, "idempotencyKey");
|
|
221
|
+
if (!Number.isInteger(input.expectedRevision) || input.expectedRevision <= 0) {
|
|
222
|
+
throw new CodexServiceError("expectedRevision must be a positive integer.", "invalid_assignment_retirement_request");
|
|
223
|
+
}
|
|
224
|
+
const value = paths(env);
|
|
225
|
+
return withPrivateFileLock(value.authPath, async () => {
|
|
226
|
+
// A full auth.json backup can contain a real refresh token. Schema-v2 is
|
|
227
|
+
// Server-owned, so neither enrollment nor retirement may retain it.
|
|
228
|
+
await removePrivateFileDurably(value.backupPath);
|
|
229
|
+
const existing = await readManagedCodexRetirementTombstone(env);
|
|
230
|
+
if (existing?.retirementId === retirementId) {
|
|
231
|
+
if (existing.expectedRevision === input.expectedRevision)
|
|
232
|
+
return existing;
|
|
233
|
+
const retried = { ...existing, expectedRevision: input.expectedRevision, idempotencyKey };
|
|
234
|
+
await writePrivateJson(managedRetirementTombstonePath(env), retried);
|
|
235
|
+
return retried;
|
|
236
|
+
}
|
|
237
|
+
if (existing && existing.acknowledgedAt === null) {
|
|
238
|
+
throw new CodexServiceError("Another local retirement acknowledgement is still pending.", "assignment_retirement_local_state_conflict");
|
|
239
|
+
}
|
|
240
|
+
const state = await readManagedCodexLineageState(env);
|
|
241
|
+
if (!state || state.phase === "INSTALLING") {
|
|
242
|
+
throw new CodexServiceError("No completely installed managed lineage is available for local retirement.", "assignment_retirement_local_state_not_found");
|
|
243
|
+
}
|
|
244
|
+
const timestamp = new Date(now).toISOString();
|
|
245
|
+
const tombstone = {
|
|
246
|
+
schemaVersion: 2,
|
|
247
|
+
retirementId,
|
|
248
|
+
expectedRevision: input.expectedRevision,
|
|
249
|
+
idempotencyKey,
|
|
250
|
+
assignmentId: state.assignmentId,
|
|
251
|
+
lineageId: state.lineageId,
|
|
252
|
+
generationVersion: state.generationVersion,
|
|
253
|
+
deletedAt: timestamp,
|
|
254
|
+
acknowledgedAt: null
|
|
255
|
+
};
|
|
256
|
+
await writePrivateJson(managedRetirementTombstonePath(env), tombstone);
|
|
257
|
+
const local = await inspectLocalCodexCredentialStatus(undefined, env);
|
|
258
|
+
if (local.accountId === undefined || local.accountId === state.providerAccountId) {
|
|
259
|
+
await removePrivateFileDurably(value.authPath);
|
|
260
|
+
}
|
|
261
|
+
await removePrivateFileDurably(managedLineageStatePath(env));
|
|
262
|
+
return tombstone;
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
export async function markManagedCodexRetirementAcknowledged(retirementId, acknowledgedAt, env = process.env) {
|
|
266
|
+
const normalizedRetirementId = requiredValue(retirementId, "retirementId");
|
|
267
|
+
const normalizedAcknowledgedAt = requiredInstant(acknowledgedAt, "acknowledgedAt");
|
|
268
|
+
const authPath = paths(env).authPath;
|
|
269
|
+
return withPrivateFileLock(authPath, async () => {
|
|
270
|
+
const current = await readManagedCodexRetirementTombstone(env);
|
|
271
|
+
if (!current || current.retirementId !== normalizedRetirementId) {
|
|
272
|
+
throw new CodexServiceError("The retirement ACK does not match the local deletion tombstone.", "assignment_retirement_local_state_conflict");
|
|
273
|
+
}
|
|
274
|
+
if (current.acknowledgedAt)
|
|
275
|
+
return current;
|
|
276
|
+
const acknowledged = { ...current, acknowledgedAt: normalizedAcknowledgedAt };
|
|
277
|
+
await writePrivateJson(managedRetirementTombstonePath(env), acknowledged);
|
|
278
|
+
return acknowledged;
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
/** Installs a Server-delivered user-bound lineage without writing an account pool. */
|
|
282
|
+
export async function installManagedCodexLineageCredentials(rawInput, now = Date.now(), env = process.env, hooks = {}) {
|
|
283
|
+
const input = {
|
|
284
|
+
tenantId: requiredValue(rawInput.tenantId, "tenantId"),
|
|
285
|
+
deliveryId: requiredValue(rawInput.deliveryId, "deliveryId"),
|
|
286
|
+
assignmentId: requiredValue(rawInput.assignmentId, "assignmentId"),
|
|
287
|
+
managedAccountId: requiredValue(rawInput.managedAccountId, "managedAccountId"),
|
|
288
|
+
lineageId: requiredValue(rawInput.lineageId, "lineageId"),
|
|
289
|
+
generationVersion: rawInput.generationVersion,
|
|
290
|
+
providerAccountId: requiredValue(rawInput.providerAccountId, "providerAccountId"),
|
|
291
|
+
accessToken: requiredValue(rawInput.accessToken, "accessToken"),
|
|
292
|
+
idToken: requiredValue(rawInput.idToken, "idToken"),
|
|
293
|
+
credentialExpiresAt: requiredInstant(rawInput.credentialExpiresAt, "credentialExpiresAt"),
|
|
294
|
+
ackExpiresAt: requiredInstant(rawInput.ackExpiresAt, "ackExpiresAt"),
|
|
295
|
+
...(rawInput.lastRefresh ? { lastRefresh: rawInput.lastRefresh } : {})
|
|
296
|
+
};
|
|
297
|
+
if (!Number.isInteger(input.generationVersion) || input.generationVersion <= 0) {
|
|
298
|
+
throw new CodexServiceError("generationVersion must be a positive integer.", "invalid_managed_codex_credentials");
|
|
299
|
+
}
|
|
300
|
+
if (!validJwt(input.idToken)) {
|
|
301
|
+
throw new CodexServiceError("The account service returned an invalid id_token.", "invalid_managed_codex_credentials");
|
|
302
|
+
}
|
|
303
|
+
const value = paths(env);
|
|
304
|
+
const statePath = managedLineageStatePath(env);
|
|
305
|
+
return withPrivateFileLock(value.authPath, async () => {
|
|
306
|
+
await removePrivateFileDurably(value.backupPath);
|
|
307
|
+
const current = await readManagedCodexLineageState(env);
|
|
308
|
+
const sameTenant = current?.tenantId === input.tenantId
|
|
309
|
+
|| current?.tenantId === null && current.assignmentId === input.assignmentId;
|
|
310
|
+
const sameLineage = sameTenant && current?.assignmentId === input.assignmentId
|
|
311
|
+
&& current.lineageId === input.lineageId;
|
|
312
|
+
if (sameLineage && current.generationVersion > input.generationVersion) {
|
|
313
|
+
throw new CodexServiceError("Refusing to install a stale lineage generation.", "lineage_version_conflict");
|
|
314
|
+
}
|
|
315
|
+
if (sameLineage && current.generationVersion === input.generationVersion
|
|
316
|
+
&& current.deliveryId === input.deliveryId) {
|
|
317
|
+
if (current.phase === "INSTALLED" || current.phase === "INSTALLED_PENDING_ACK") {
|
|
318
|
+
if (!(await installedAuthMatches(input, env))) {
|
|
319
|
+
throw new CodexServiceError("The same lineage generation has different local credentials.", "lineage_version_conflict");
|
|
320
|
+
}
|
|
321
|
+
return {
|
|
322
|
+
action: "UNCHANGED",
|
|
323
|
+
authPath: value.authPath,
|
|
324
|
+
statePath,
|
|
325
|
+
state: current
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
if (sameLineage && current.generationVersion === input.generationVersion
|
|
330
|
+
&& current.deliveryId !== input.deliveryId
|
|
331
|
+
&& Date.parse(input.credentialExpiresAt) <= Date.parse(current.credentialExpiresAt)
|
|
332
|
+
&& !(current.phase !== "INSTALLED" && Date.parse(current.ackExpiresAt) <= now)) {
|
|
333
|
+
throw new CodexServiceError("Refusing to install an older short-lived delivery for the current lineage generation.", "lineage_version_conflict");
|
|
334
|
+
}
|
|
335
|
+
const timestamp = new Date(now).toISOString();
|
|
336
|
+
const previous = current ? {
|
|
337
|
+
assignmentId: current.assignmentId,
|
|
338
|
+
lineageId: current.lineageId,
|
|
339
|
+
generationVersion: current.generationVersion
|
|
340
|
+
} : null;
|
|
341
|
+
const installing = {
|
|
342
|
+
schemaVersion: 2,
|
|
343
|
+
tenantId: input.tenantId,
|
|
344
|
+
assignmentId: input.assignmentId,
|
|
345
|
+
managedAccountId: input.managedAccountId,
|
|
346
|
+
lineageId: input.lineageId,
|
|
347
|
+
generationVersion: input.generationVersion,
|
|
348
|
+
providerAccountId: input.providerAccountId,
|
|
349
|
+
deliveryId: input.deliveryId,
|
|
350
|
+
credentialExpiresAt: input.credentialExpiresAt,
|
|
351
|
+
ackExpiresAt: input.ackExpiresAt,
|
|
352
|
+
ackedAt: null,
|
|
353
|
+
phase: "INSTALLING",
|
|
354
|
+
updatedAt: timestamp,
|
|
355
|
+
previous
|
|
356
|
+
};
|
|
357
|
+
const recovering = sameLineage
|
|
358
|
+
&& current?.generationVersion === input.generationVersion
|
|
359
|
+
&& current.deliveryId === input.deliveryId
|
|
360
|
+
&& current.phase === "INSTALLING";
|
|
361
|
+
await writePrivateJson(statePath, installing);
|
|
362
|
+
await hooks.afterInstallingState?.();
|
|
363
|
+
await externalApi.ensureCodexCliFileAuthStore?.(value.configPath);
|
|
364
|
+
await writePrivateJson(value.authPath, {
|
|
365
|
+
auth_mode: "chatgpt",
|
|
366
|
+
OPENAI_API_KEY: null,
|
|
367
|
+
tokens: {
|
|
368
|
+
id_token: input.idToken,
|
|
369
|
+
access_token: input.accessToken,
|
|
370
|
+
// The real refresh token is Server-owned. This local, random placeholder
|
|
371
|
+
// preserves the official auth.json shape but is never usable upstream.
|
|
372
|
+
refresh_token: randomBytes(48).toString("base64url"),
|
|
373
|
+
account_id: input.providerAccountId
|
|
374
|
+
},
|
|
375
|
+
last_refresh: input.lastRefresh ?? timestamp
|
|
376
|
+
});
|
|
377
|
+
await hooks.afterAuthWrite?.();
|
|
378
|
+
const installed = { ...installing, phase: "INSTALLED_PENDING_ACK" };
|
|
379
|
+
await writePrivateJson(statePath, installed);
|
|
380
|
+
return {
|
|
381
|
+
action: recovering ? "RECOVERED" : "INSTALLED",
|
|
382
|
+
authPath: value.authPath,
|
|
383
|
+
statePath,
|
|
384
|
+
state: installed
|
|
385
|
+
};
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
export async function markManagedCodexLineageDeliveryAcknowledged(deliveryId, ackedAt, env = process.env) {
|
|
389
|
+
const normalizedDeliveryId = requiredValue(deliveryId, "deliveryId");
|
|
390
|
+
const normalizedAckedAt = requiredInstant(ackedAt, "ackedAt");
|
|
391
|
+
const authPath = paths(env).authPath;
|
|
392
|
+
return withPrivateFileLock(authPath, async () => {
|
|
393
|
+
const current = await readManagedCodexLineageState(env);
|
|
394
|
+
if (!current || current.deliveryId !== normalizedDeliveryId) {
|
|
395
|
+
throw new CodexServiceError("The delivery ACK does not match the locally installed credentials.", "short_lived_delivery_state_conflict");
|
|
396
|
+
}
|
|
397
|
+
if (current.phase === "INSTALLING") {
|
|
398
|
+
throw new CodexServiceError("The short-lived credentials have not finished installing.", "short_lived_delivery_state_conflict");
|
|
399
|
+
}
|
|
400
|
+
if (current.phase === "INSTALLED" && current.ackedAt)
|
|
401
|
+
return current;
|
|
402
|
+
const acknowledged = {
|
|
403
|
+
...current,
|
|
404
|
+
phase: "INSTALLED",
|
|
405
|
+
ackedAt: normalizedAckedAt,
|
|
406
|
+
updatedAt: normalizedAckedAt
|
|
407
|
+
};
|
|
408
|
+
await writePrivateJson(managedLineageStatePath(env), acknowledged);
|
|
409
|
+
return acknowledged;
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
function requiredInstant(value, name) {
|
|
413
|
+
const normalized = requiredValue(value, name);
|
|
414
|
+
if (!Number.isFinite(Date.parse(normalized))) {
|
|
415
|
+
throw new CodexServiceError(`${name} must be an ISO-8601 instant.`, "invalid_managed_codex_credentials");
|
|
416
|
+
}
|
|
417
|
+
return normalized;
|
|
418
|
+
}
|
|
91
419
|
export async function writeCodexChatgptFileCredentials(credentials, now = Date.now(), env = process.env) {
|
|
92
420
|
if (!validJwt(credentials.idToken))
|
|
93
421
|
throw new Error("The account service returned an invalid id_token.");
|
|
@@ -115,16 +443,33 @@ export async function writeCodexChatgptFileCredentials(credentials, now = Date.n
|
|
|
115
443
|
}
|
|
116
444
|
export async function resetManagedCodexFileCredentials(accountId, env = process.env) {
|
|
117
445
|
const value = paths(env);
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
446
|
+
return withPrivateFileLock(value.authPath, async () => {
|
|
447
|
+
const managedState = await readManagedCodexLineageState(env);
|
|
448
|
+
if (managedState) {
|
|
449
|
+
await removePrivateFileDurably(value.backupPath);
|
|
450
|
+
const status = await inspectLocalCodexCredentialStatus(accountId ?? managedState.providerAccountId, env);
|
|
451
|
+
if (status.accountId === managedState.providerAccountId) {
|
|
452
|
+
await removePrivateFileDurably(value.authPath);
|
|
453
|
+
await removePrivateFileDurably(managedLineageStatePath(env));
|
|
454
|
+
return { action: "removed", ...value };
|
|
455
|
+
}
|
|
456
|
+
await removePrivateFileDurably(managedLineageStatePath(env));
|
|
457
|
+
return { action: "unchanged", ...value };
|
|
458
|
+
}
|
|
459
|
+
const backup = await optionalText(value.backupPath);
|
|
460
|
+
if (backup !== undefined) {
|
|
461
|
+
await writePrivateText(value.authPath, backup);
|
|
462
|
+
await rm(managedLineageStatePath(env), { force: true });
|
|
463
|
+
return { action: "restored", ...value };
|
|
464
|
+
}
|
|
465
|
+
const status = await inspectLocalCodexCredentialStatus(accountId, env);
|
|
466
|
+
if (accountId && status.accountId === accountId) {
|
|
467
|
+
await rm(value.authPath, { force: true });
|
|
468
|
+
await rm(managedLineageStatePath(env), { force: true });
|
|
469
|
+
return { action: "removed", ...value };
|
|
470
|
+
}
|
|
471
|
+
await rm(managedLineageStatePath(env), { force: true });
|
|
472
|
+
return { action: "unchanged", ...value };
|
|
473
|
+
});
|
|
129
474
|
}
|
|
130
475
|
//# sourceMappingURL=credentials.js.map
|
package/dist/credentials.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { CodexEnrollmentCandidateEnvelope, CodexEnrollmentCandidateIngress } from "./protocol.js";
|
|
2
|
+
export interface SealCodexEnrollmentCandidateInput {
|
|
3
|
+
tenantId: string;
|
|
4
|
+
intentId: string;
|
|
5
|
+
revision: number;
|
|
6
|
+
idempotencyKey: string;
|
|
7
|
+
refreshToken: string;
|
|
8
|
+
ingress: CodexEnrollmentCandidateIngress;
|
|
9
|
+
}
|
|
10
|
+
export declare function codexEnrollmentCandidateAad(input: {
|
|
11
|
+
tenantId: string;
|
|
12
|
+
intentId: string;
|
|
13
|
+
revision: number;
|
|
14
|
+
idempotencyKey: string;
|
|
15
|
+
keyId: string;
|
|
16
|
+
}): Buffer;
|
|
17
|
+
/** Encrypts the one-shot refresh credential without accepting provider identity input. */
|
|
18
|
+
export declare function sealCodexEnrollmentCandidate(input: SealCodexEnrollmentCandidateInput): CodexEnrollmentCandidateEnvelope;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { createCipheriv, createPublicKey, diffieHellman, generateKeyPairSync, hkdfSync, randomBytes } from "node:crypto";
|
|
2
|
+
import { CodexServiceError } from "./errors.js";
|
|
3
|
+
const ALGORITHM = "X25519-HKDF-SHA256-AES-256-GCM";
|
|
4
|
+
const HKDF_INFO_PREFIX = "active-code-inbox/codex-enrollment-candidate/key/v1\0";
|
|
5
|
+
const BASE64URL = /^[A-Za-z0-9_-]+$/u;
|
|
6
|
+
const MAX_REFRESH_TOKEN_BYTES = 8_192;
|
|
7
|
+
export function codexEnrollmentCandidateAad(input) {
|
|
8
|
+
return Buffer.from(JSON.stringify({
|
|
9
|
+
schemaVersion: 2,
|
|
10
|
+
tenant: required(input.tenantId, "tenantId"),
|
|
11
|
+
intentId: required(input.intentId, "intentId"),
|
|
12
|
+
revision: nonnegativeInteger(input.revision, "revision"),
|
|
13
|
+
idempotencyKey: required(input.idempotencyKey, "idempotencyKey"),
|
|
14
|
+
keyId: required(input.keyId, "keyId")
|
|
15
|
+
}), "utf8");
|
|
16
|
+
}
|
|
17
|
+
/** Encrypts the one-shot refresh credential without accepting provider identity input. */
|
|
18
|
+
export function sealCodexEnrollmentCandidate(input) {
|
|
19
|
+
if (input.ingress.envelopeVersion !== 1 || input.ingress.algorithm !== ALGORITHM) {
|
|
20
|
+
throw invalidEnvelope("The account service advertised an unsupported enrollment envelope.");
|
|
21
|
+
}
|
|
22
|
+
const refreshToken = required(input.refreshToken, "refreshToken");
|
|
23
|
+
if (Buffer.byteLength(refreshToken, "utf8") > MAX_REFRESH_TOKEN_BYTES) {
|
|
24
|
+
throw invalidEnvelope("The official Codex refresh credential exceeds the supported size.");
|
|
25
|
+
}
|
|
26
|
+
let plaintext;
|
|
27
|
+
let sharedSecret;
|
|
28
|
+
let key;
|
|
29
|
+
try {
|
|
30
|
+
decodeCanonicalBase64url(input.ingress.publicKey, 32, "The account service advertised an invalid enrollment public key.");
|
|
31
|
+
const salt = randomBytes(32);
|
|
32
|
+
const nonce = randomBytes(12);
|
|
33
|
+
plaintext = Buffer.from(JSON.stringify({ schemaVersion: 2, refreshToken }), "utf8");
|
|
34
|
+
if (plaintext.length > input.ingress.maxCiphertextBytes) {
|
|
35
|
+
throw invalidEnvelope("The encrypted enrollment candidate exceeds the service limit.");
|
|
36
|
+
}
|
|
37
|
+
const { publicKey, privateKey } = generateKeyPairSync("x25519");
|
|
38
|
+
const exported = publicKey.export({ format: "jwk" });
|
|
39
|
+
if (exported.kty !== "OKP" || exported.crv !== "X25519" || typeof exported.x !== "string") {
|
|
40
|
+
throw invalidEnvelope("Unable to create an enrollment encryption key.");
|
|
41
|
+
}
|
|
42
|
+
const ephemeralPublicKey = decodeCanonicalBase64url(exported.x, 32, "Unable to create an enrollment encryption key.");
|
|
43
|
+
const serverKey = createPublicKey({
|
|
44
|
+
key: { kty: "OKP", crv: "X25519", x: input.ingress.publicKey },
|
|
45
|
+
format: "jwk"
|
|
46
|
+
});
|
|
47
|
+
sharedSecret = diffieHellman({ privateKey, publicKey: serverKey });
|
|
48
|
+
key = Buffer.from(hkdfSync("sha256", sharedSecret, salt, Buffer.from(`${HKDF_INFO_PREFIX}${input.ingress.keyId}`, "utf8"), 32));
|
|
49
|
+
const aad = codexEnrollmentCandidateAad({
|
|
50
|
+
tenantId: input.tenantId,
|
|
51
|
+
intentId: input.intentId,
|
|
52
|
+
revision: input.revision,
|
|
53
|
+
idempotencyKey: input.idempotencyKey,
|
|
54
|
+
keyId: input.ingress.keyId
|
|
55
|
+
});
|
|
56
|
+
const cipher = createCipheriv("aes-256-gcm", key, nonce, { authTagLength: 16 });
|
|
57
|
+
cipher.setAAD(aad);
|
|
58
|
+
const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
|
|
59
|
+
const authenticationTag = cipher.getAuthTag();
|
|
60
|
+
if (ciphertext.length > input.ingress.maxCiphertextBytes) {
|
|
61
|
+
throw invalidEnvelope("The encrypted enrollment candidate exceeds the service limit.");
|
|
62
|
+
}
|
|
63
|
+
const envelope = {
|
|
64
|
+
version: 1,
|
|
65
|
+
algorithm: ALGORITHM,
|
|
66
|
+
keyId: input.ingress.keyId,
|
|
67
|
+
ephemeralPublicKey: ephemeralPublicKey.toString("base64url"),
|
|
68
|
+
salt: salt.toString("base64url"),
|
|
69
|
+
nonce: nonce.toString("base64url"),
|
|
70
|
+
ciphertext: ciphertext.toString("base64url"),
|
|
71
|
+
authenticationTag: authenticationTag.toString("base64url")
|
|
72
|
+
};
|
|
73
|
+
const requestBytes = Buffer.byteLength(JSON.stringify({
|
|
74
|
+
schemaVersion: 2,
|
|
75
|
+
revision: input.revision,
|
|
76
|
+
envelope
|
|
77
|
+
}), "utf8");
|
|
78
|
+
if (requestBytes > input.ingress.maxRequestBytes) {
|
|
79
|
+
throw invalidEnvelope("The encrypted enrollment request exceeds the service limit.");
|
|
80
|
+
}
|
|
81
|
+
return envelope;
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
plaintext?.fill(0);
|
|
85
|
+
sharedSecret?.fill(0);
|
|
86
|
+
key?.fill(0);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function decodeCanonicalBase64url(value, length, message) {
|
|
90
|
+
if (!BASE64URL.test(value))
|
|
91
|
+
throw invalidEnvelope(message);
|
|
92
|
+
const decoded = Buffer.from(value, "base64url");
|
|
93
|
+
if (decoded.length !== length || decoded.toString("base64url") !== value) {
|
|
94
|
+
throw invalidEnvelope(message);
|
|
95
|
+
}
|
|
96
|
+
return decoded;
|
|
97
|
+
}
|
|
98
|
+
function required(value, name) {
|
|
99
|
+
const normalized = value.trim();
|
|
100
|
+
if (!normalized)
|
|
101
|
+
throw invalidEnvelope(`${name} is required.`);
|
|
102
|
+
return normalized;
|
|
103
|
+
}
|
|
104
|
+
function nonnegativeInteger(value, name) {
|
|
105
|
+
if (!Number.isInteger(value) || value < 0)
|
|
106
|
+
throw invalidEnvelope(`${name} is invalid.`);
|
|
107
|
+
return value;
|
|
108
|
+
}
|
|
109
|
+
function invalidEnvelope(message) {
|
|
110
|
+
return new CodexServiceError(message, "invalid_enrollment_envelope");
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=enrollment-envelope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrollment-envelope.js","sourceRoot":"","sources":["../src/enrollment-envelope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { CodexServiceClient } from "./client.js";
|
|
2
|
+
import { withOneShotCodexLogin, type OneShotCodexLoginOptions } from "./enrollment-login.js";
|
|
3
|
+
import type { CodexEnrollmentCandidateResponse } from "./protocol.js";
|
|
4
|
+
type EnrollmentClient = Pick<CodexServiceClient, "getEnrollmentIntent" | "claimEnrollmentIntent" | "heartbeatEnrollmentIntent" | "uploadEnrollmentCandidate">;
|
|
5
|
+
type OneShotLogin = typeof withOneShotCodexLogin;
|
|
6
|
+
export interface ExecuteCodexEnrollmentLoginInput {
|
|
7
|
+
client: EnrollmentClient;
|
|
8
|
+
tenantId: string;
|
|
9
|
+
intentId: string;
|
|
10
|
+
deviceAuth?: boolean;
|
|
11
|
+
loginOptions?: Omit<OneShotCodexLoginOptions, "mode">;
|
|
12
|
+
heartbeatIntervalMs?: number;
|
|
13
|
+
candidateTransportRetryDelaysMs?: readonly number[];
|
|
14
|
+
candidateRetryDelaysMs?: readonly number[];
|
|
15
|
+
wait?: (milliseconds: number) => Promise<void>;
|
|
16
|
+
randomId?: () => string;
|
|
17
|
+
oneShotLogin?: OneShotLogin;
|
|
18
|
+
requireInitialAwaitingCli?: boolean;
|
|
19
|
+
/** Re-proves the current Bearer is the existing claimant before restarting login. */
|
|
20
|
+
resumeClaimedIntent?: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Claims one server-created intent, runs an isolated official login, and sends
|
|
24
|
+
* only an authenticated encrypted refresh-token envelope to that exact intent.
|
|
25
|
+
*/
|
|
26
|
+
export declare function executeCodexEnrollmentLogin(input: ExecuteCodexEnrollmentLoginInput): Promise<CodexEnrollmentCandidateResponse>;
|
|
27
|
+
export {};
|