codex-multi-auth 2.0.2 → 2.1.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.
Files changed (121) hide show
  1. package/README.md +17 -5
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +91 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/account-policy.d.ts +22 -0
  6. package/dist/lib/account-policy.d.ts.map +1 -0
  7. package/dist/lib/account-policy.js +159 -0
  8. package/dist/lib/account-policy.js.map +1 -0
  9. package/dist/lib/accounts.d.ts.map +1 -1
  10. package/dist/lib/accounts.js +2 -1
  11. package/dist/lib/accounts.js.map +1 -1
  12. package/dist/lib/budget-guard.d.ts +39 -0
  13. package/dist/lib/budget-guard.d.ts.map +1 -0
  14. package/dist/lib/budget-guard.js +201 -0
  15. package/dist/lib/budget-guard.js.map +1 -0
  16. package/dist/lib/codex-manager/commands/account.d.ts +13 -0
  17. package/dist/lib/codex-manager/commands/account.d.ts.map +1 -0
  18. package/dist/lib/codex-manager/commands/account.js +156 -0
  19. package/dist/lib/codex-manager/commands/account.js.map +1 -0
  20. package/dist/lib/codex-manager/commands/bridge.d.ts +6 -0
  21. package/dist/lib/codex-manager/commands/bridge.d.ts.map +1 -0
  22. package/dist/lib/codex-manager/commands/bridge.js +100 -0
  23. package/dist/lib/codex-manager/commands/bridge.js.map +1 -0
  24. package/dist/lib/codex-manager/commands/budget.d.ts +12 -0
  25. package/dist/lib/codex-manager/commands/budget.d.ts.map +1 -0
  26. package/dist/lib/codex-manager/commands/budget.js +123 -0
  27. package/dist/lib/codex-manager/commands/budget.js.map +1 -0
  28. package/dist/lib/codex-manager/commands/integrations.d.ts +6 -0
  29. package/dist/lib/codex-manager/commands/integrations.d.ts.map +1 -0
  30. package/dist/lib/codex-manager/commands/integrations.js +78 -0
  31. package/dist/lib/codex-manager/commands/integrations.js.map +1 -0
  32. package/dist/lib/codex-manager/commands/models.d.ts +14 -0
  33. package/dist/lib/codex-manager/commands/models.d.ts.map +1 -0
  34. package/dist/lib/codex-manager/commands/models.js +74 -0
  35. package/dist/lib/codex-manager/commands/models.js.map +1 -0
  36. package/dist/lib/codex-manager/commands/monitor.d.ts +22 -0
  37. package/dist/lib/codex-manager/commands/monitor.d.ts.map +1 -0
  38. package/dist/lib/codex-manager/commands/monitor.js +94 -0
  39. package/dist/lib/codex-manager/commands/monitor.js.map +1 -0
  40. package/dist/lib/codex-manager/commands/rotation.d.ts +1 -0
  41. package/dist/lib/codex-manager/commands/rotation.d.ts.map +1 -1
  42. package/dist/lib/codex-manager/commands/rotation.js +293 -10
  43. package/dist/lib/codex-manager/commands/rotation.js.map +1 -1
  44. package/dist/lib/codex-manager/commands/usage.d.ts +13 -0
  45. package/dist/lib/codex-manager/commands/usage.d.ts.map +1 -0
  46. package/dist/lib/codex-manager/commands/usage.js +347 -0
  47. package/dist/lib/codex-manager/commands/usage.js.map +1 -0
  48. package/dist/lib/codex-manager/help.d.ts.map +1 -1
  49. package/dist/lib/codex-manager/help.js +8 -0
  50. package/dist/lib/codex-manager/help.js.map +1 -1
  51. package/dist/lib/codex-manager.d.ts.map +1 -1
  52. package/dist/lib/codex-manager.js +42 -2
  53. package/dist/lib/codex-manager.js.map +1 -1
  54. package/dist/lib/config.d.ts.map +1 -1
  55. package/dist/lib/config.js +2 -22
  56. package/dist/lib/config.js.map +1 -1
  57. package/dist/lib/constants.d.ts +1 -0
  58. package/dist/lib/constants.d.ts.map +1 -1
  59. package/dist/lib/constants.js +1 -0
  60. package/dist/lib/constants.js.map +1 -1
  61. package/dist/lib/env-parsing.d.ts +21 -0
  62. package/dist/lib/env-parsing.d.ts.map +1 -0
  63. package/dist/lib/env-parsing.js +34 -0
  64. package/dist/lib/env-parsing.js.map +1 -0
  65. package/dist/lib/index.d.ts +9 -0
  66. package/dist/lib/index.d.ts.map +1 -1
  67. package/dist/lib/index.js +9 -0
  68. package/dist/lib/index.js.map +1 -1
  69. package/dist/lib/integration-generators.d.ts +14 -0
  70. package/dist/lib/integration-generators.d.ts.map +1 -0
  71. package/dist/lib/integration-generators.js +93 -0
  72. package/dist/lib/integration-generators.js.map +1 -0
  73. package/dist/lib/local-bridge.d.ts +17 -0
  74. package/dist/lib/local-bridge.d.ts.map +1 -0
  75. package/dist/lib/local-bridge.js +249 -0
  76. package/dist/lib/local-bridge.js.map +1 -0
  77. package/dist/lib/local-client-tokens.d.ts +37 -0
  78. package/dist/lib/local-client-tokens.d.ts.map +1 -0
  79. package/dist/lib/local-client-tokens.js +200 -0
  80. package/dist/lib/local-client-tokens.js.map +1 -0
  81. package/dist/lib/model-capability-matrix.d.ts +38 -0
  82. package/dist/lib/model-capability-matrix.d.ts.map +1 -0
  83. package/dist/lib/model-capability-matrix.js +89 -0
  84. package/dist/lib/model-capability-matrix.js.map +1 -0
  85. package/dist/lib/policy/runtime-policy.d.ts +59 -0
  86. package/dist/lib/policy/runtime-policy.d.ts.map +1 -0
  87. package/dist/lib/policy/runtime-policy.js +156 -0
  88. package/dist/lib/policy/runtime-policy.js.map +1 -0
  89. package/dist/lib/proactive-refresh.js +4 -4
  90. package/dist/lib/proactive-refresh.js.map +1 -1
  91. package/dist/lib/refresh-lease.d.ts.map +1 -1
  92. package/dist/lib/refresh-lease.js +1 -10
  93. package/dist/lib/refresh-lease.js.map +1 -1
  94. package/dist/lib/routing-profiles.d.ts +36 -0
  95. package/dist/lib/routing-profiles.d.ts.map +1 -0
  96. package/dist/lib/routing-profiles.js +203 -0
  97. package/dist/lib/routing-profiles.js.map +1 -0
  98. package/dist/lib/runtime-rotation-proxy.d.ts.map +1 -1
  99. package/dist/lib/runtime-rotation-proxy.js +96 -6
  100. package/dist/lib/runtime-rotation-proxy.js.map +1 -1
  101. package/dist/lib/usage/index.d.ts +5 -0
  102. package/dist/lib/usage/index.d.ts.map +1 -0
  103. package/dist/lib/usage/index.js +5 -0
  104. package/dist/lib/usage/index.js.map +1 -0
  105. package/dist/lib/usage/ledger.d.ts +12 -0
  106. package/dist/lib/usage/ledger.d.ts.map +1 -0
  107. package/dist/lib/usage/ledger.js +493 -0
  108. package/dist/lib/usage/ledger.js.map +1 -0
  109. package/dist/lib/usage/pricing.d.ts +11 -0
  110. package/dist/lib/usage/pricing.d.ts.map +1 -0
  111. package/dist/lib/usage/pricing.js +67 -0
  112. package/dist/lib/usage/pricing.js.map +1 -0
  113. package/dist/lib/usage/redaction.d.ts +10 -0
  114. package/dist/lib/usage/redaction.d.ts.map +1 -0
  115. package/dist/lib/usage/redaction.js +129 -0
  116. package/dist/lib/usage/redaction.js.map +1 -0
  117. package/dist/lib/usage/types.d.ts +89 -0
  118. package/dist/lib/usage/types.d.ts.map +1 -0
  119. package/dist/lib/usage/types.js +2 -0
  120. package/dist/lib/usage/types.js.map +1 -0
  121. package/package.json +1 -1
@@ -0,0 +1,201 @@
1
+ import { existsSync, promises as fs } from "node:fs";
2
+ import { basename, join } from "node:path";
3
+ import { logWarn } from "./logger.js";
4
+ import { getCodexMultiAuthDir } from "./runtime-paths.js";
5
+ import { isRecord, sleep } from "./utils.js";
6
+ const BUDGET_GUARD_FILE_NAME = "budget-guards.json";
7
+ const RETRYABLE_FS_CODES = new Set(["EBUSY", "EPERM"]);
8
+ const VALID_WINDOWS = new Set(["hour", "day", "week", "month"]);
9
+ let writeQueue = Promise.resolve();
10
+ function isRetryableFsError(error) {
11
+ const code = error?.code;
12
+ return typeof code === "string" && RETRYABLE_FS_CODES.has(code);
13
+ }
14
+ function normalizeKey(value) {
15
+ const normalized = value.trim().toLowerCase().replace(/[^a-z0-9._:-]+/g, "-");
16
+ return normalized.length > 0 ? normalized.slice(0, 100) : null;
17
+ }
18
+ function normalizePositiveNumber(value) {
19
+ return typeof value === "number" && Number.isFinite(value) && value > 0
20
+ ? value
21
+ : undefined;
22
+ }
23
+ function normalizeLimit(key, value) {
24
+ if (!isRecord(value))
25
+ return null;
26
+ const window = typeof value.window === "string" && VALID_WINDOWS.has(value.window)
27
+ ? value.window
28
+ : null;
29
+ if (!window)
30
+ return null;
31
+ return {
32
+ key,
33
+ window,
34
+ maxRequests: normalizePositiveNumber(value.maxRequests),
35
+ maxTokens: normalizePositiveNumber(value.maxTokens),
36
+ maxCostUsd: normalizePositiveNumber(value.maxCostUsd),
37
+ updatedAt: typeof value.updatedAt === "number" && Number.isFinite(value.updatedAt)
38
+ ? value.updatedAt
39
+ : 0,
40
+ };
41
+ }
42
+ function emptyStore() {
43
+ return { version: 1, limits: {} };
44
+ }
45
+ function normalizeStore(value) {
46
+ if (!isRecord(value) || value.version !== 1)
47
+ return emptyStore();
48
+ const limits = {};
49
+ if (isRecord(value.limits)) {
50
+ for (const [rawKey, raw] of Object.entries(value.limits)) {
51
+ const key = normalizeKey(rawKey);
52
+ if (!key)
53
+ continue;
54
+ const limit = normalizeLimit(key, raw);
55
+ if (limit)
56
+ limits[key] = limit;
57
+ }
58
+ }
59
+ return { version: 1, limits };
60
+ }
61
+ async function readFileWithRetry(path) {
62
+ let lastError;
63
+ for (let attempt = 0; attempt < 5; attempt += 1) {
64
+ try {
65
+ return await fs.readFile(path, "utf8");
66
+ }
67
+ catch (error) {
68
+ lastError = error;
69
+ if (!isRetryableFsError(error) || attempt >= 4)
70
+ throw error;
71
+ await sleep(10 * 2 ** attempt);
72
+ }
73
+ }
74
+ throw lastError instanceof Error
75
+ ? lastError
76
+ : new Error("budget guard read retry exhausted");
77
+ }
78
+ export function getBudgetGuardPath() {
79
+ return join(getCodexMultiAuthDir(), BUDGET_GUARD_FILE_NAME);
80
+ }
81
+ export function normalizeBudgetKey(value) {
82
+ return normalizeKey(value);
83
+ }
84
+ export async function loadBudgetGuardStore() {
85
+ const path = getBudgetGuardPath();
86
+ if (!existsSync(path))
87
+ return emptyStore();
88
+ try {
89
+ return normalizeStore(JSON.parse(await readFileWithRetry(path)));
90
+ }
91
+ catch (error) {
92
+ logWarn(`Failed to load budget guards from ${basename(path)}: ${error instanceof Error ? error.message : String(error)}`);
93
+ return emptyStore();
94
+ }
95
+ }
96
+ export async function saveBudgetGuardStore(store) {
97
+ const path = getBudgetGuardPath();
98
+ const payload = normalizeStore(store);
99
+ const task = async () => {
100
+ await fs.mkdir(getCodexMultiAuthDir(), { recursive: true, mode: 0o700 });
101
+ const tempPath = `${path}.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2, 8)}.tmp`;
102
+ let moved = false;
103
+ try {
104
+ await fs.writeFile(tempPath, `${JSON.stringify(payload, null, 2)}\n`, {
105
+ encoding: "utf8",
106
+ mode: 0o600,
107
+ });
108
+ for (let attempt = 0; attempt < 5; attempt += 1) {
109
+ try {
110
+ await fs.rename(tempPath, path);
111
+ moved = true;
112
+ return;
113
+ }
114
+ catch (error) {
115
+ if (!isRetryableFsError(error) || attempt >= 4)
116
+ throw error;
117
+ await sleep(10 * 2 ** attempt);
118
+ }
119
+ }
120
+ }
121
+ finally {
122
+ if (!moved) {
123
+ try {
124
+ await fs.unlink(tempPath);
125
+ }
126
+ catch {
127
+ // Best-effort temp cleanup.
128
+ }
129
+ }
130
+ }
131
+ };
132
+ const queued = writeQueue.catch(() => undefined).then(task);
133
+ writeQueue = queued.then(() => undefined, () => undefined);
134
+ await queued;
135
+ }
136
+ export function upsertBudgetLimit(store, limit, now = Date.now()) {
137
+ const key = normalizeKey(limit.key);
138
+ if (!key)
139
+ throw new Error("Budget key is required");
140
+ const next = normalizeLimit(key, { ...limit, key, updatedAt: now });
141
+ if (!next)
142
+ throw new Error("Invalid budget limit");
143
+ store.limits[key] = next;
144
+ return next;
145
+ }
146
+ export function getBudgetWindowStart(window, now = Date.now()) {
147
+ const date = new Date(now);
148
+ if (window === "hour") {
149
+ date.setUTCMinutes(0, 0, 0);
150
+ return date.getTime();
151
+ }
152
+ if (window === "day") {
153
+ date.setUTCHours(0, 0, 0, 0);
154
+ return date.getTime();
155
+ }
156
+ if (window === "week") {
157
+ date.setUTCHours(0, 0, 0, 0);
158
+ const day = date.getUTCDay();
159
+ const mondayOffset = day === 0 ? 6 : day - 1;
160
+ date.setUTCDate(date.getUTCDate() - mondayOffset);
161
+ return date.getTime();
162
+ }
163
+ date.setUTCDate(1);
164
+ date.setUTCHours(0, 0, 0, 0);
165
+ return date.getTime();
166
+ }
167
+ export function evaluateBudgetGuard(limit, summary) {
168
+ const reasons = [];
169
+ if (typeof limit.maxRequests === "number" &&
170
+ summary.totals.requests >= limit.maxRequests) {
171
+ reasons.push(`request limit reached (${summary.totals.requests}/${limit.maxRequests})`);
172
+ }
173
+ if (typeof limit.maxTokens === "number" &&
174
+ summary.totals.totalTokens >= limit.maxTokens) {
175
+ reasons.push(`token limit reached (${summary.totals.totalTokens}/${limit.maxTokens})`);
176
+ }
177
+ if (typeof limit.maxCostUsd === "number" &&
178
+ summary.totals.costUsd >= limit.maxCostUsd) {
179
+ reasons.push(`cost limit reached (${summary.totals.costUsd.toFixed(6)}/${limit.maxCostUsd.toFixed(6)})`);
180
+ }
181
+ return {
182
+ key: limit.key,
183
+ window: limit.window,
184
+ allowed: reasons.length === 0,
185
+ reasons,
186
+ usage: {
187
+ requests: summary.totals.requests,
188
+ totalTokens: summary.totals.totalTokens,
189
+ costUsd: summary.totals.costUsd,
190
+ },
191
+ limits: {
192
+ maxRequests: limit.maxRequests ?? null,
193
+ maxTokens: limit.maxTokens ?? null,
194
+ maxCostUsd: limit.maxCostUsd ?? null,
195
+ },
196
+ };
197
+ }
198
+ export function resetBudgetGuardWriteQueueForTests() {
199
+ writeQueue = Promise.resolve();
200
+ }
201
+ //# sourceMappingURL=budget-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget-guard.js","sourceRoot":"","sources":["../../lib/budget-guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { loadAccountPolicyStore, saveAccountPolicyStore } from "../../account-policy.js";
2
+ import type { AccountStorageV3 } from "../../storage.js";
3
+ export interface AccountCommandDeps {
4
+ setStoragePath: (path: string | null) => void;
5
+ loadAccounts: () => Promise<AccountStorageV3 | null>;
6
+ loadPolicyStore?: typeof loadAccountPolicyStore;
7
+ savePolicyStore?: typeof saveAccountPolicyStore;
8
+ logInfo?: (message: string) => void;
9
+ logError?: (message: string) => void;
10
+ getNow?: () => number;
11
+ }
12
+ export declare function runAccountCommand(args: string[], deps: AccountCommandDeps): Promise<number>;
13
+ //# sourceMappingURL=account.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../../../lib/codex-manager/commands/account.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,sBAAsB,EAEtB,sBAAsB,EAGtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAqB,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE5E,MAAM,WAAW,kBAAkB;IAClC,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9C,YAAY,EAAE,MAAM,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACrD,eAAe,CAAC,EAAE,OAAO,sBAAsB,CAAC;IAChD,eAAe,CAAC,EAAE,OAAO,sBAAsB,CAAC;IAChD,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;CACtB;AAkDD,wBAAsB,iBAAiB,CACtC,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE,kBAAkB,GACtB,OAAO,CAAC,MAAM,CAAC,CA2HjB"}
@@ -0,0 +1,156 @@
1
+ import { getAccountPolicyKey, loadAccountPolicyStore, normalizeAccountPolicyTag, saveAccountPolicyStore, upsertAccountPolicy, } from "../../account-policy.js";
2
+ function printAccountUsage(logInfo) {
3
+ logInfo([
4
+ "Usage:",
5
+ " codex auth account tag <index> <tag>",
6
+ " codex auth account untag <index> <tag>",
7
+ " codex auth account weight <index> <0..10>",
8
+ " codex auth account pause|unpause|drain|undrain <index>",
9
+ " codex auth account note <index> <text>",
10
+ " codex auth account policy list [--json]",
11
+ ].join("\n"));
12
+ }
13
+ function parseAccountIndex(value) {
14
+ if (!value || !/^\d+$/.test(value))
15
+ return null;
16
+ const parsed = Number.parseInt(value, 10);
17
+ return Number.isSafeInteger(parsed) && parsed > 0 ? parsed - 1 : null;
18
+ }
19
+ function resolveAccount(storage, index) {
20
+ if (!storage || index === null || index < 0 || index >= storage.accounts.length) {
21
+ return null;
22
+ }
23
+ const account = storage.accounts[index];
24
+ return account ? { account, index } : null;
25
+ }
26
+ function policySummary(store, storage) {
27
+ return (storage?.accounts ?? []).map((account, index) => {
28
+ const accountKey = getAccountPolicyKey(account, index);
29
+ const policy = store.accounts[accountKey];
30
+ return {
31
+ index: index + 1,
32
+ label: `Account ${index + 1}`,
33
+ accountKey,
34
+ tags: policy?.tags ?? [],
35
+ weight: policy?.weight ?? 1,
36
+ paused: policy?.paused ?? false,
37
+ drained: policy?.drained ?? false,
38
+ note: policy?.note ?? null,
39
+ };
40
+ });
41
+ }
42
+ export async function runAccountCommand(args, deps) {
43
+ const logInfo = deps.logInfo ?? console.log;
44
+ const logError = deps.logError ?? console.error;
45
+ const [command, ...rest] = args;
46
+ if (!command || command === "--help" || command === "-h") {
47
+ printAccountUsage(logInfo);
48
+ return 0;
49
+ }
50
+ deps.setStoragePath(null);
51
+ const storage = await deps.loadAccounts();
52
+ const loadStore = deps.loadPolicyStore ?? loadAccountPolicyStore;
53
+ const saveStore = deps.savePolicyStore ?? saveAccountPolicyStore;
54
+ const store = await loadStore();
55
+ if (command === "policy") {
56
+ const [subcommand, ...policyArgs] = rest;
57
+ if (subcommand !== "list") {
58
+ logError(`Unknown account policy command: ${subcommand ?? "(missing)"}`);
59
+ return 1;
60
+ }
61
+ const unknown = policyArgs.find((arg) => arg !== "--json" && arg !== "-j");
62
+ if (unknown) {
63
+ logError(`Unknown account policy list option: ${unknown}`);
64
+ return 1;
65
+ }
66
+ const payload = {
67
+ command: "account policy list",
68
+ accounts: policySummary(store, storage),
69
+ };
70
+ if (policyArgs.includes("--json") || policyArgs.includes("-j")) {
71
+ logInfo(JSON.stringify(payload, null, 2));
72
+ return 0;
73
+ }
74
+ if (payload.accounts.length === 0) {
75
+ logInfo("No accounts configured.");
76
+ return 0;
77
+ }
78
+ for (const entry of payload.accounts) {
79
+ const markers = [
80
+ `weight=${entry.weight}`,
81
+ entry.paused ? "paused" : null,
82
+ entry.drained ? "drained" : null,
83
+ entry.tags.length > 0 ? `tags=${entry.tags.join(",")}` : null,
84
+ entry.note ? "note" : null,
85
+ ].filter((value) => value !== null);
86
+ logInfo(`${entry.index}. ${entry.label} | ${markers.join(" | ")}`);
87
+ }
88
+ return 0;
89
+ }
90
+ const accountIndex = parseAccountIndex(rest[0]);
91
+ const resolved = resolveAccount(storage, accountIndex);
92
+ if (!resolved) {
93
+ logError("Account index is required and must reference a configured account.");
94
+ return 1;
95
+ }
96
+ const accountKey = getAccountPolicyKey(resolved.account, resolved.index);
97
+ const now = deps.getNow?.() ?? Date.now();
98
+ if (command === "tag" || command === "untag") {
99
+ const tag = normalizeAccountPolicyTag(rest[1] ?? "");
100
+ if (!tag) {
101
+ logError(`${command} requires a tag value.`);
102
+ return 1;
103
+ }
104
+ const policy = upsertAccountPolicy(store, accountKey, (next) => {
105
+ if (command === "tag" && !next.tags.includes(tag))
106
+ next.tags.push(tag);
107
+ if (command === "untag") {
108
+ next.tags = next.tags.filter((existing) => existing !== tag);
109
+ }
110
+ }, now);
111
+ await saveStore(store);
112
+ logInfo(`${command === "tag" ? "Tagged" : "Removed tag from"} account ${resolved.index + 1}: ${policy.tags.join(",") || "none"}`);
113
+ return 0;
114
+ }
115
+ if (command === "weight") {
116
+ const weight = rest[1] === undefined ? Number.NaN : Number.parseFloat(rest[1]);
117
+ if (!Number.isFinite(weight) || weight < 0 || weight > 10) {
118
+ logError("weight requires a number from 0 to 10.");
119
+ return 1;
120
+ }
121
+ upsertAccountPolicy(store, accountKey, (next) => {
122
+ next.weight = weight;
123
+ }, now);
124
+ await saveStore(store);
125
+ logInfo(`Set account ${resolved.index + 1} weight to ${weight}.`);
126
+ return 0;
127
+ }
128
+ if (["pause", "unpause", "drain", "undrain"].includes(command)) {
129
+ upsertAccountPolicy(store, accountKey, (next) => {
130
+ if (command === "pause")
131
+ next.paused = true;
132
+ if (command === "unpause")
133
+ next.paused = false;
134
+ if (command === "drain")
135
+ next.drained = true;
136
+ if (command === "undrain")
137
+ next.drained = false;
138
+ }, now);
139
+ await saveStore(store);
140
+ logInfo(`Updated account ${resolved.index + 1}: ${command}.`);
141
+ return 0;
142
+ }
143
+ if (command === "note") {
144
+ const note = rest.slice(1).join(" ").trim();
145
+ upsertAccountPolicy(store, accountKey, (next) => {
146
+ next.note = note.length > 0 ? note.slice(0, 500) : null;
147
+ }, now);
148
+ await saveStore(store);
149
+ logInfo(`Updated account ${resolved.index + 1} note.`);
150
+ return 0;
151
+ }
152
+ logError(`Unknown account command: ${command}`);
153
+ printAccountUsage(logInfo);
154
+ return 1;
155
+ }
156
+ //# sourceMappingURL=account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.js","sourceRoot":"","sources":["../../../../lib/codex-manager/commands/account.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface BridgeCommandDeps {
2
+ logInfo?: (message: string) => void;
3
+ logError?: (message: string) => void;
4
+ }
5
+ export declare function runBridgeCommand(args: string[], deps?: BridgeCommandDeps): Promise<number>;
6
+ //# sourceMappingURL=bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../../../lib/codex-manager/commands/bridge.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IACjC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAkCD,wBAAsB,gBAAgB,CACrC,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,GAAE,iBAAsB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAoEjB"}
@@ -0,0 +1,100 @@
1
+ import { addLocalClientToken, loadLocalClientTokenStore, revokeLocalClientToken, rotateLocalClientToken, } from "../../local-client-tokens.js";
2
+ function printBridgeUsage(logInfo) {
3
+ logInfo([
4
+ "Usage:",
5
+ " codex auth bridge token create [--label <label>]",
6
+ " codex auth bridge token list",
7
+ " codex auth bridge token rotate <id>",
8
+ " codex auth bridge token revoke <id>",
9
+ ].join("\n"));
10
+ }
11
+ function parseLabel(args) {
12
+ let label;
13
+ for (let i = 0; i < args.length; i += 1) {
14
+ const arg = args[i];
15
+ if (arg === "--label") {
16
+ const value = args[i + 1];
17
+ if (!value)
18
+ return { ok: false, message: "Missing value for --label" };
19
+ label = value;
20
+ i += 1;
21
+ continue;
22
+ }
23
+ if (arg?.startsWith("--label=")) {
24
+ label = arg.slice("--label=".length);
25
+ continue;
26
+ }
27
+ return { ok: false, message: `Unknown bridge token option: ${arg ?? ""}` };
28
+ }
29
+ return { ok: true, label };
30
+ }
31
+ export async function runBridgeCommand(args, deps = {}) {
32
+ const logInfo = deps.logInfo ?? console.log;
33
+ const logError = deps.logError ?? console.error;
34
+ if (args.includes("--help") || args.includes("-h")) {
35
+ printBridgeUsage(logInfo);
36
+ return 0;
37
+ }
38
+ const [area, action, ...rest] = args;
39
+ if (area !== "token") {
40
+ logError("Expected `codex auth bridge token ...`");
41
+ return 1;
42
+ }
43
+ if (action === "create") {
44
+ const parsed = parseLabel(rest);
45
+ if (!parsed.ok) {
46
+ logError(parsed.message);
47
+ return 1;
48
+ }
49
+ const created = await addLocalClientToken({ label: parsed.label });
50
+ logInfo(`Token id: ${created.record.id}`);
51
+ logInfo(`Token prefix: ${created.record.prefix}`);
52
+ logInfo(`Token: ${created.plainToken}`);
53
+ return 0;
54
+ }
55
+ if (action === "list") {
56
+ const store = await loadLocalClientTokenStore();
57
+ if (store.tokens.length === 0) {
58
+ logInfo("No local bridge tokens configured.");
59
+ return 0;
60
+ }
61
+ for (const token of store.tokens) {
62
+ const state = token.revokedAt === null ? "active" : "revoked";
63
+ logInfo(`${token.id} ${token.prefix} ${token.label} ${state}`);
64
+ }
65
+ return 0;
66
+ }
67
+ if (action === "rotate") {
68
+ const id = rest[0];
69
+ if (!id) {
70
+ logError("Missing token id");
71
+ return 1;
72
+ }
73
+ const rotated = await rotateLocalClientToken({ id });
74
+ if (!rotated) {
75
+ logError("Token not found or already revoked.");
76
+ return 1;
77
+ }
78
+ logInfo(`Token id: ${rotated.record.id}`);
79
+ logInfo(`Token prefix: ${rotated.record.prefix}`);
80
+ logInfo(`Token: ${rotated.plainToken}`);
81
+ return 0;
82
+ }
83
+ if (action === "revoke") {
84
+ const id = rest[0];
85
+ if (!id) {
86
+ logError("Missing token id");
87
+ return 1;
88
+ }
89
+ const revoked = await revokeLocalClientToken(id);
90
+ if (!revoked) {
91
+ logError("Token not found or already revoked.");
92
+ return 1;
93
+ }
94
+ logInfo("Token revoked.");
95
+ return 0;
96
+ }
97
+ logError(`Unknown bridge token action: ${action ?? ""}`);
98
+ return 1;
99
+ }
100
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../../../lib/codex-manager/commands/bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { loadBudgetGuardStore, saveBudgetGuardStore } from "../../budget-guard.js";
2
+ import { summarizeUsageLedger } from "../../usage/index.js";
3
+ export interface BudgetCommandDeps {
4
+ loadStore?: typeof loadBudgetGuardStore;
5
+ saveStore?: typeof saveBudgetGuardStore;
6
+ summarizeUsage?: typeof summarizeUsageLedger;
7
+ logInfo?: (message: string) => void;
8
+ logError?: (message: string) => void;
9
+ getNow?: () => number;
10
+ }
11
+ export declare function runBudgetCommand(args: string[], deps?: BudgetCommandDeps): Promise<number>;
12
+ //# sourceMappingURL=budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../../../../lib/codex-manager/commands/budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,oBAAoB,EAEpB,oBAAoB,EAGpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,WAAW,iBAAiB;IACjC,SAAS,CAAC,EAAE,OAAO,oBAAoB,CAAC;IACxC,SAAS,CAAC,EAAE,OAAO,oBAAoB,CAAC;IACxC,cAAc,CAAC,EAAE,OAAO,oBAAoB,CAAC;IAC7C,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;CACtB;AAqBD,wBAAsB,gBAAgB,CACrC,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,GAAE,iBAAsB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAoHjB"}
@@ -0,0 +1,123 @@
1
+ import { evaluateBudgetGuard, getBudgetWindowStart, loadBudgetGuardStore, normalizeBudgetKey, saveBudgetGuardStore, upsertBudgetLimit, } from "../../budget-guard.js";
2
+ import { summarizeUsageLedger } from "../../usage/index.js";
3
+ const VALID_WINDOWS = new Set(["hour", "day", "week", "month"]);
4
+ function printBudgetUsage(logInfo) {
5
+ logInfo([
6
+ "Usage:",
7
+ " codex auth budget limit <key> --window <hour|day|week|month> [--requests N] [--tokens N] [--cost USD]",
8
+ " codex auth budget check <key> [--json]",
9
+ " codex auth budget list [--json]",
10
+ ].join("\n"));
11
+ }
12
+ function parsePositiveNumber(value) {
13
+ if (!value)
14
+ return null;
15
+ const parsed = Number.parseFloat(value);
16
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
17
+ }
18
+ export async function runBudgetCommand(args, deps = {}) {
19
+ const logInfo = deps.logInfo ?? console.log;
20
+ const logError = deps.logError ?? console.error;
21
+ const [command, ...rest] = args;
22
+ if (!command || command === "--help" || command === "-h") {
23
+ printBudgetUsage(logInfo);
24
+ return 0;
25
+ }
26
+ const loadStore = deps.loadStore ?? loadBudgetGuardStore;
27
+ const saveStore = deps.saveStore ?? saveBudgetGuardStore;
28
+ const store = await loadStore();
29
+ const now = deps.getNow?.() ?? Date.now();
30
+ if (command === "list") {
31
+ const json = rest.includes("--json") || rest.includes("-j");
32
+ const limits = Object.values(store.limits).sort((a, b) => a.key.localeCompare(b.key));
33
+ if (json) {
34
+ logInfo(JSON.stringify({ command: "budget list", limits }, null, 2));
35
+ return 0;
36
+ }
37
+ if (limits.length === 0) {
38
+ logInfo("No budget limits configured.");
39
+ return 0;
40
+ }
41
+ for (const limit of limits) {
42
+ logInfo(`${limit.key}: window=${limit.window}, requests=${limit.maxRequests ?? "none"}, tokens=${limit.maxTokens ?? "none"}, cost=${limit.maxCostUsd ?? "none"}`);
43
+ }
44
+ return 0;
45
+ }
46
+ const key = normalizeBudgetKey(rest[0] ?? "");
47
+ if (!key) {
48
+ logError("Budget key is required.");
49
+ return 1;
50
+ }
51
+ if (command === "limit") {
52
+ let window = null;
53
+ let maxRequests;
54
+ let maxTokens;
55
+ let maxCostUsd;
56
+ for (let i = 1; i < rest.length; i += 1) {
57
+ const arg = rest[i];
58
+ const value = rest[i + 1];
59
+ if (arg === "--window") {
60
+ if (!value || !VALID_WINDOWS.has(value)) {
61
+ logError("--window must be hour, day, week, or month.");
62
+ return 1;
63
+ }
64
+ window = value;
65
+ i += 1;
66
+ continue;
67
+ }
68
+ if (arg === "--requests" || arg === "--tokens" || arg === "--cost") {
69
+ const parsed = parsePositiveNumber(value);
70
+ if (parsed === null) {
71
+ logError(`${arg} requires a positive number.`);
72
+ return 1;
73
+ }
74
+ if (arg === "--requests")
75
+ maxRequests = parsed;
76
+ if (arg === "--tokens")
77
+ maxTokens = parsed;
78
+ if (arg === "--cost")
79
+ maxCostUsd = parsed;
80
+ i += 1;
81
+ continue;
82
+ }
83
+ logError(`Unknown budget limit option: ${arg ?? "(missing)"}`);
84
+ return 1;
85
+ }
86
+ if (!window) {
87
+ logError("--window is required.");
88
+ return 1;
89
+ }
90
+ if (!maxRequests && !maxTokens && !maxCostUsd) {
91
+ logError("At least one of --requests, --tokens, or --cost is required.");
92
+ return 1;
93
+ }
94
+ const limit = upsertBudgetLimit(store, { key, window, maxRequests, maxTokens, maxCostUsd }, now);
95
+ await saveStore(store);
96
+ logInfo(`Saved budget limit ${limit.key} (${limit.window}).`);
97
+ return 0;
98
+ }
99
+ if (command === "check") {
100
+ const limit = store.limits[key];
101
+ if (!limit) {
102
+ logError(`Budget limit not found: ${key}`);
103
+ return 1;
104
+ }
105
+ const summary = await (deps.summarizeUsage ?? summarizeUsageLedger)({
106
+ since: getBudgetWindowStart(limit.window, now),
107
+ by: "model",
108
+ });
109
+ const evaluation = evaluateBudgetGuard(limit, summary);
110
+ if (rest.includes("--json") || rest.includes("-j")) {
111
+ logInfo(JSON.stringify({ command: "budget check", evaluation }, null, 2));
112
+ return evaluation.allowed ? 0 : 1;
113
+ }
114
+ logInfo(evaluation.allowed
115
+ ? `Budget ${key} allows usage.`
116
+ : `Budget ${key} blocked: ${evaluation.reasons.join("; ")}`);
117
+ return evaluation.allowed ? 0 : 1;
118
+ }
119
+ logError(`Unknown budget command: ${command}`);
120
+ printBudgetUsage(logInfo);
121
+ return 1;
122
+ }
123
+ //# sourceMappingURL=budget.js.map