@tokensrc/codex 1.14.16 → 1.14.18

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.
Files changed (66) hide show
  1. package/README.md +73 -71
  2. package/dist/client.d.ts +21 -16
  3. package/dist/client.js +198 -116
  4. package/dist/client.js.map +1 -1
  5. package/dist/command-directory.js +3 -2
  6. package/dist/command-directory.js.map +1 -1
  7. package/dist/commands.d.ts +0 -1
  8. package/dist/commands.js +479 -273
  9. package/dist/commands.js.map +1 -1
  10. package/dist/credentials.d.ts +3 -75
  11. package/dist/credentials.js +2 -338
  12. package/dist/credentials.js.map +1 -1
  13. package/dist/index.d.ts +2 -8
  14. package/dist/index.js +2 -8
  15. package/dist/index.js.map +1 -1
  16. package/dist/managed-credential-v3-envelope.d.ts +38 -14
  17. package/dist/managed-credential-v3-envelope.js +116 -25
  18. package/dist/managed-credential-v3-envelope.js.map +1 -1
  19. package/dist/managed-credential-v3-flow.d.ts +0 -17
  20. package/dist/managed-credential-v3-flow.js +107 -110
  21. package/dist/managed-credential-v3-flow.js.map +1 -1
  22. package/dist/managed-credential-v3.d.ts +0 -8
  23. package/dist/managed-credential-v3.js +0 -23
  24. package/dist/managed-credential-v3.js.map +1 -1
  25. package/dist/profile.d.ts +2 -6
  26. package/dist/profile.js +26 -23
  27. package/dist/profile.js.map +1 -1
  28. package/dist/protocol.d.ts +1284 -799
  29. package/dist/protocol.js +494 -277
  30. package/dist/protocol.js.map +1 -1
  31. package/dist/request-bound-device-v6-flow.d.ts +42 -0
  32. package/dist/request-bound-device-v6-flow.js +403 -0
  33. package/dist/request-bound-device-v6-flow.js.map +1 -0
  34. package/dist/request-bound-device-v6-state.d.ts +397 -0
  35. package/dist/request-bound-device-v6-state.js +221 -0
  36. package/dist/request-bound-device-v6-state.js.map +1 -0
  37. package/dist/selection.d.ts +5 -0
  38. package/dist/selection.js +20 -2
  39. package/dist/selection.js.map +1 -1
  40. package/dist/token-pool-v4-upload-flow.js +5 -1
  41. package/dist/token-pool-v4-upload-flow.js.map +1 -1
  42. package/package.json +2 -2
  43. package/dist/credential-supervisor.d.ts +0 -17
  44. package/dist/credential-supervisor.js +0 -84
  45. package/dist/credential-supervisor.js.map +0 -1
  46. package/dist/enrollment-envelope.d.ts +0 -18
  47. package/dist/enrollment-envelope.js +0 -112
  48. package/dist/enrollment-envelope.js.map +0 -1
  49. package/dist/enrollment-flow.d.ts +0 -27
  50. package/dist/enrollment-flow.js +0 -224
  51. package/dist/enrollment-flow.js.map +0 -1
  52. package/dist/migration-login-batch.d.ts +0 -66
  53. package/dist/migration-login-batch.js +0 -202
  54. package/dist/migration-login-batch.js.map +0 -1
  55. package/dist/retirement-flow.d.ts +0 -38
  56. package/dist/retirement-flow.js +0 -78
  57. package/dist/retirement-flow.js.map +0 -1
  58. package/dist/short-lived-delivery-flow.d.ts +0 -41
  59. package/dist/short-lived-delivery-flow.js +0 -141
  60. package/dist/short-lived-delivery-flow.js.map +0 -1
  61. package/dist/short-lived-delivery-journal.d.ts +0 -34
  62. package/dist/short-lived-delivery-journal.js +0 -137
  63. package/dist/short-lived-delivery-journal.js.map +0 -1
  64. package/dist/short-lived-delivery.d.ts +0 -26
  65. package/dist/short-lived-delivery.js +0 -139
  66. package/dist/short-lived-delivery.js.map +0 -1
@@ -1,137 +0,0 @@
1
- import { createPrivateKey } from "node:crypto";
2
- import { homedir } from "node:os";
3
- import { join } from "node:path";
4
- import { z } from "zod";
5
- import { readJsonIfExists, removePrivateFileDurably, withPrivateFileLock, writePrivateJson } from "./private-file.js";
6
- const JournalSchema = z.strictObject({
7
- schemaVersion: z.literal(2),
8
- tenantId: z.string().min(1).max(255),
9
- assignmentId: z.string().min(1).max(255),
10
- idempotencyKey: z.string().min(8).max(255),
11
- clientKey: z.strictObject({
12
- version: z.literal(1),
13
- algorithm: z.literal("X25519-HKDF-SHA256-AES-256-GCM"),
14
- publicKey: z.string().length(43).regex(/^[A-Za-z0-9_-]+$/)
15
- }),
16
- privateKeyPkcs8: z.string().min(1).max(512).regex(/^[A-Za-z0-9_-]+$/),
17
- deliveryId: z.string().min(1).max(255).nullable(),
18
- ackExpiresAt: z.string().datetime({ offset: true }).nullable(),
19
- createdAt: z.string().datetime({ offset: true }),
20
- updatedAt: z.string().datetime({ offset: true })
21
- });
22
- function journalPath(env = process.env) {
23
- const codexHome = env.CODEX_HOME?.trim() || join(homedir(), ".codex");
24
- return join(codexHome, ".numa-short-lived-delivery-journal.json");
25
- }
26
- export async function readCodexShortLivedDeliveryJournal(env = process.env) {
27
- const raw = await readJsonIfExists(journalPath(env));
28
- if (raw === undefined)
29
- return undefined;
30
- const parsed = JournalSchema.safeParse(raw);
31
- if (!parsed.success) {
32
- throw Object.assign(new Error("The private short-lived delivery journal is invalid."), {
33
- code: "short_lived_delivery_journal_invalid"
34
- });
35
- }
36
- return parsed.data;
37
- }
38
- export async function loadOrCreateCodexShortLivedDeliveryJournal(input) {
39
- const env = input.env ?? process.env;
40
- const path = journalPath(env);
41
- return withPrivateFileLock(path, async () => {
42
- const existing = await readCodexShortLivedDeliveryJournal(env);
43
- if (existing) {
44
- if (existing.tenantId !== input.tenantId || existing.assignmentId !== input.assignmentId) {
45
- throw Object.assign(new Error("Another short-lived credential delivery is still pending locally."), { code: "short_lived_delivery_state_conflict" });
46
- }
47
- return existing;
48
- }
49
- if (input.privateKey.asymmetricKeyType !== "x25519") {
50
- throw Object.assign(new Error("The short-lived delivery private key is invalid."), {
51
- code: "short_lived_delivery_journal_invalid"
52
- });
53
- }
54
- const encoded = input.privateKey.export({ format: "der", type: "pkcs8" });
55
- if (!Buffer.isBuffer(encoded))
56
- throw new Error("Unable to export the short-lived delivery private key.");
57
- try {
58
- const timestamp = new Date(input.now).toISOString();
59
- const journal = {
60
- schemaVersion: 2,
61
- tenantId: input.tenantId,
62
- assignmentId: input.assignmentId,
63
- idempotencyKey: input.idempotencyKey,
64
- clientKey: input.clientKey,
65
- privateKeyPkcs8: encoded.toString("base64url"),
66
- deliveryId: null,
67
- ackExpiresAt: null,
68
- createdAt: timestamp,
69
- updatedAt: timestamp
70
- };
71
- await writePrivateJson(path, journal);
72
- return journal;
73
- }
74
- finally {
75
- encoded.fill(0);
76
- }
77
- });
78
- }
79
- export function openCodexShortLivedDeliveryJournalPrivateKey(journal) {
80
- const encoded = Buffer.from(journal.privateKeyPkcs8, "base64url");
81
- try {
82
- if (encoded.toString("base64url") !== journal.privateKeyPkcs8)
83
- throw new Error("non-canonical key");
84
- const key = createPrivateKey({ key: encoded, format: "der", type: "pkcs8" });
85
- if (key.asymmetricKeyType !== "x25519")
86
- throw new Error("unexpected key type");
87
- return key;
88
- }
89
- catch (error) {
90
- throw Object.assign(new Error("The private short-lived delivery journal is invalid.", { cause: error }), {
91
- code: "short_lived_delivery_journal_invalid"
92
- });
93
- }
94
- finally {
95
- encoded.fill(0);
96
- }
97
- }
98
- export async function markCodexShortLivedDeliveryJournalIssued(expected, deliveryId, ackExpiresAt, now, env = process.env) {
99
- const path = journalPath(env);
100
- return withPrivateFileLock(path, async () => {
101
- const current = await readCodexShortLivedDeliveryJournal(env);
102
- if (!current || current.idempotencyKey !== expected.idempotencyKey
103
- || current.assignmentId !== expected.assignmentId) {
104
- throw Object.assign(new Error("The short-lived delivery journal changed unexpectedly."), {
105
- code: "short_lived_delivery_state_conflict"
106
- });
107
- }
108
- if (current.deliveryId && current.deliveryId !== deliveryId) {
109
- throw Object.assign(new Error("The replayed delivery does not match its private journal."), {
110
- code: "short_lived_delivery_state_conflict"
111
- });
112
- }
113
- const updated = JournalSchema.parse({
114
- ...current,
115
- deliveryId,
116
- ackExpiresAt,
117
- updatedAt: new Date(now).toISOString()
118
- });
119
- await writePrivateJson(path, updated);
120
- return updated;
121
- });
122
- }
123
- export async function clearCodexShortLivedDeliveryJournal(expectedIdempotencyKey, env = process.env) {
124
- const path = journalPath(env);
125
- await withPrivateFileLock(path, async () => {
126
- const current = await readCodexShortLivedDeliveryJournal(env);
127
- if (!current)
128
- return;
129
- if (current.idempotencyKey !== expectedIdempotencyKey) {
130
- throw Object.assign(new Error("The short-lived delivery journal changed unexpectedly."), {
131
- code: "short_lived_delivery_state_conflict"
132
- });
133
- }
134
- await removePrivateFileDurably(path);
135
- });
136
- }
137
- //# sourceMappingURL=short-lived-delivery-journal.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"short-lived-delivery-journal.js","sourceRoot":"","sources":["../src/short-lived-delivery-journal.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- import { type KeyObject } from "node:crypto";
2
- import { type CodexShortLivedDeliveryClientKey, type CodexShortLivedDeliveryResponse, type CodexShortLivedCredentialBundle } from "./protocol.js";
3
- export interface CodexShortLivedDeliveryKeyPair {
4
- clientKey: CodexShortLivedDeliveryClientKey;
5
- privateKey: KeyObject;
6
- }
7
- export declare function createCodexShortLivedDeliveryKeyPair(): CodexShortLivedDeliveryKeyPair;
8
- export declare function codexShortLivedDeliveryAad(delivery: {
9
- tenantId: string;
10
- subject: string;
11
- assignmentId: string;
12
- managedAccountId: string;
13
- providerAccountId: string;
14
- lineageId: string;
15
- generationVersion: number;
16
- deliveryId: string;
17
- credentialExpiresAt: string;
18
- ackExpiresAt: string;
19
- }): Buffer;
20
- /** Decrypts a Server-owned lineage delivery. The plaintext contract cannot contain an RT. */
21
- export declare function openCodexShortLivedCredentialDelivery(input: {
22
- tenantId: string;
23
- response: CodexShortLivedDeliveryResponse;
24
- privateKey: KeyObject;
25
- now?: number;
26
- }): CodexShortLivedCredentialBundle;
@@ -1,139 +0,0 @@
1
- import { createDecipheriv, createPublicKey, diffieHellman, generateKeyPairSync, hkdfSync } from "node:crypto";
2
- import { CodexServiceError } from "./errors.js";
3
- import { CodexShortLivedCredentialBundleSchema } from "./protocol.js";
4
- const ALGORITHM = "X25519-HKDF-SHA256-AES-256-GCM";
5
- const HKDF_INFO_PREFIX = "active-code-inbox/codex-short-lived-delivery/key/v1\0";
6
- const BASE64URL = /^[A-Za-z0-9_-]+$/u;
7
- export function createCodexShortLivedDeliveryKeyPair() {
8
- const { publicKey, privateKey } = generateKeyPairSync("x25519");
9
- const exported = publicKey.export({ format: "jwk" });
10
- if (exported.kty !== "OKP" || exported.crv !== "X25519" || typeof exported.x !== "string") {
11
- throw invalidEnvelope("Unable to create a short-lived credential delivery key.");
12
- }
13
- decodeCanonicalBase64url(exported.x, 32, "Unable to create a short-lived credential delivery key.");
14
- return {
15
- clientKey: { version: 1, algorithm: ALGORITHM, publicKey: exported.x },
16
- privateKey
17
- };
18
- }
19
- export function codexShortLivedDeliveryAad(delivery) {
20
- return Buffer.from(JSON.stringify({
21
- schemaVersion: 2,
22
- tenant: required(delivery.tenantId, "tenantId"),
23
- subject: required(delivery.subject, "subject"),
24
- assignmentId: required(delivery.assignmentId, "assignmentId"),
25
- managedAccountId: required(delivery.managedAccountId, "managedAccountId"),
26
- providerAccountId: required(delivery.providerAccountId, "providerAccountId"),
27
- lineageId: required(delivery.lineageId, "lineageId"),
28
- generationVersion: positiveInteger(delivery.generationVersion, "generationVersion"),
29
- deliveryId: required(delivery.deliveryId, "deliveryId"),
30
- credentialExpiresAt: validInstant(delivery.credentialExpiresAt, "credentialExpiresAt"),
31
- ackExpiresAt: validInstant(delivery.ackExpiresAt, "ackExpiresAt")
32
- }), "utf8");
33
- }
34
- /** Decrypts a Server-owned lineage delivery. The plaintext contract cannot contain an RT. */
35
- export function openCodexShortLivedCredentialDelivery(input) {
36
- const delivery = input.response.delivery;
37
- if (delivery.status !== "AWAITING_ACK" || delivery.envelope.version !== 1
38
- || delivery.envelope.algorithm !== ALGORITHM || input.privateKey.asymmetricKeyType !== "x25519") {
39
- throw invalidEnvelope("The account service returned an unsupported short-lived credential envelope.");
40
- }
41
- const ephemeralPublicKey = decodeCanonicalBase64url(delivery.envelope.ephemeralPublicKey, 32, "The account service returned an invalid delivery public key.");
42
- const salt = decodeCanonicalBase64url(delivery.envelope.salt, 32, "The account service returned an invalid delivery salt.");
43
- const nonce = decodeCanonicalBase64url(delivery.envelope.nonce, 12, "The account service returned an invalid delivery nonce.");
44
- const authenticationTag = decodeCanonicalBase64url(delivery.envelope.authenticationTag, 16, "The account service returned an invalid delivery authentication tag.");
45
- const ciphertext = decodeCanonicalBase64url(delivery.envelope.ciphertext, undefined, "The account service returned invalid delivery ciphertext.");
46
- const serverPublicKey = createPublicKey({
47
- key: {
48
- kty: "OKP",
49
- crv: "X25519",
50
- x: ephemeralPublicKey.toString("base64url")
51
- },
52
- format: "jwk"
53
- });
54
- const sharedSecret = diffieHellman({ privateKey: input.privateKey, publicKey: serverPublicKey });
55
- const key = Buffer.from(hkdfSync("sha256", sharedSecret, salt, Buffer.from(`${HKDF_INFO_PREFIX}${delivery.id}`, "utf8"), 32));
56
- let plaintext;
57
- try {
58
- const decipher = createDecipheriv("aes-256-gcm", key, nonce, { authTagLength: 16 });
59
- decipher.setAAD(codexShortLivedDeliveryAad({
60
- tenantId: input.tenantId,
61
- subject: delivery.subject,
62
- assignmentId: delivery.assignmentId,
63
- managedAccountId: delivery.managedAccountId,
64
- providerAccountId: delivery.providerAccountId,
65
- lineageId: delivery.lineageId,
66
- generationVersion: delivery.generationVersion,
67
- deliveryId: delivery.id,
68
- credentialExpiresAt: delivery.credentialExpiresAt,
69
- ackExpiresAt: delivery.ackExpiresAt
70
- }));
71
- decipher.setAuthTag(authenticationTag);
72
- plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
73
- let raw;
74
- try {
75
- raw = JSON.parse(plaintext.toString("utf8"));
76
- }
77
- catch {
78
- throw invalidEnvelope("The account service returned an invalid short-lived credential payload.");
79
- }
80
- const parsed = CodexShortLivedCredentialBundleSchema.safeParse(raw);
81
- if (!parsed.success) {
82
- throw invalidEnvelope("The account service returned an invalid short-lived credential payload.");
83
- }
84
- const bundle = parsed.data;
85
- if (bundle.deliveryId !== delivery.id
86
- || bundle.managedAccountId !== delivery.managedAccountId
87
- || bundle.providerAccountId !== delivery.providerAccountId
88
- || bundle.lineageId !== delivery.lineageId
89
- || bundle.generationVersion !== delivery.generationVersion
90
- || bundle.expiresAt !== delivery.credentialExpiresAt) {
91
- throw invalidEnvelope("The short-lived credential payload does not match its delivery metadata.");
92
- }
93
- const now = input.now ?? Date.now();
94
- if (Date.parse(bundle.expiresAt) <= now || Date.parse(delivery.ackExpiresAt) <= now) {
95
- throw new CodexServiceError("The short-lived credential delivery has expired.", "short_lived_credential_delivery_expired");
96
- }
97
- return bundle;
98
- }
99
- catch (error) {
100
- if (error instanceof CodexServiceError)
101
- throw error;
102
- throw invalidEnvelope("Unable to authenticate the short-lived credential delivery.");
103
- }
104
- finally {
105
- plaintext?.fill(0);
106
- sharedSecret.fill(0);
107
- key.fill(0);
108
- }
109
- }
110
- function decodeCanonicalBase64url(value, length, message) {
111
- if (!value || !BASE64URL.test(value))
112
- throw invalidEnvelope(message);
113
- const decoded = Buffer.from(value, "base64url");
114
- if ((length !== undefined && decoded.length !== length)
115
- || decoded.toString("base64url") !== value) {
116
- throw invalidEnvelope(message);
117
- }
118
- return decoded;
119
- }
120
- function required(value, name) {
121
- const normalized = value.trim();
122
- if (!normalized)
123
- throw invalidEnvelope(`${name} is required.`);
124
- return normalized;
125
- }
126
- function positiveInteger(value, name) {
127
- if (!Number.isInteger(value) || value <= 0)
128
- throw invalidEnvelope(`${name} is invalid.`);
129
- return value;
130
- }
131
- function validInstant(value, name) {
132
- if (!Number.isFinite(Date.parse(value)))
133
- throw invalidEnvelope(`${name} is invalid.`);
134
- return value;
135
- }
136
- function invalidEnvelope(message) {
137
- return new CodexServiceError(message, "invalid_short_lived_credential_envelope");
138
- }
139
- //# sourceMappingURL=short-lived-delivery.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"short-lived-delivery.js","sourceRoot":"","sources":["../src/short-lived-delivery.ts"],"names":[],"mappings":"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"}