oc-codex-multi-auth 6.9.1 → 6.10.1
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 +45 -14
- package/config/README.md +71 -22
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -7
- package/dist/index.js.map +1 -1
- package/dist/lib/auth/server.d.ts.map +1 -1
- package/dist/lib/auth/server.js +7 -3
- package/dist/lib/auth/server.js.map +1 -1
- package/dist/lib/config.d.ts +6 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +9 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/oauth-success.d.ts +1 -0
- package/dist/lib/oauth-success.d.ts.map +1 -1
- package/dist/lib/oauth-success.html +198 -707
- package/dist/lib/oauth-success.js +202 -708
- package/dist/lib/oauth-success.js.map +1 -1
- package/dist/lib/schemas.d.ts +1 -0
- package/dist/lib/schemas.d.ts.map +1 -1
- package/dist/lib/schemas.js +1 -0
- package/dist/lib/schemas.js.map +1 -1
- package/dist/lib/tools/codex-doctor.d.ts.map +1 -1
- package/dist/lib/tools/codex-doctor.js +168 -142
- package/dist/lib/tools/codex-doctor.js.map +1 -1
- package/dist/lib/tools/codex-health.d.ts.map +1 -1
- package/dist/lib/tools/codex-health.js +41 -38
- package/dist/lib/tools/codex-health.js.map +1 -1
- package/dist/lib/tools/codex-refresh.d.ts.map +1 -1
- package/dist/lib/tools/codex-refresh.js +24 -103
- package/dist/lib/tools/codex-refresh.js.map +1 -1
- package/dist/lib/tools/index.d.ts +1 -0
- package/dist/lib/tools/index.d.ts.map +1 -1
- package/dist/lib/tools/index.js.map +1 -1
- package/dist/lib/tools/refresh-account.d.ts +63 -0
- package/dist/lib/tools/refresh-account.d.ts.map +1 -0
- package/dist/lib/tools/refresh-account.js +159 -0
- package/dist/lib/tools/refresh-account.js.map +1 -0
- package/dist/lib/ui/beginner.d.ts +1 -0
- package/dist/lib/ui/beginner.d.ts.map +1 -1
- package/dist/lib/ui/beginner.js +12 -1
- package/dist/lib/ui/beginner.js.map +1 -1
- package/package.json +155 -155
- package/scripts/install-oc-codex-multi-auth-core.js +6 -6
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { tool } from "@opencode-ai/plugin/tool";
|
|
6
6
|
import { loadAccounts } from "../storage.js";
|
|
7
|
-
import { queuedRefresh } from "../refresh-queue.js";
|
|
8
7
|
import { findDisabledAccountsWithFreshCredential, findDisabledTokenSourceDuplicates, findStaleRecoverableAccounts, } from "../accounts/stale-state.js";
|
|
9
8
|
import { formatUiHeader, formatUiItem, paintUiText } from "../ui/format.js";
|
|
10
9
|
import { normalizeToolOutputFormat, renderJsonOutput } from "../runtime.js";
|
|
10
|
+
import { buildRefreshInputs, refreshAndPersistAccount, } from "./refresh-account.js";
|
|
11
11
|
export function createCodexHealthTool(ctx) {
|
|
12
|
-
const { resolveUiRuntime, formatCommandAccountLabel, resolveMaskEmail, getStatusMarker, buildJsonAccountIdentity, } = ctx;
|
|
12
|
+
const { resolveUiRuntime, formatCommandAccountLabel, resolveMaskEmail, getStatusMarker, buildJsonAccountIdentity, reloadCachedAccountManager, } = ctx;
|
|
13
13
|
return tool({
|
|
14
14
|
description: "Check health of all Codex accounts by validating refresh tokens.",
|
|
15
15
|
args: {
|
|
@@ -35,6 +35,7 @@ export function createCodexHealthTool(ctx) {
|
|
|
35
35
|
totalAccounts: 0,
|
|
36
36
|
healthyCount: 0,
|
|
37
37
|
unhealthyCount: 0,
|
|
38
|
+
skippedCount: 0,
|
|
38
39
|
accounts: [],
|
|
39
40
|
});
|
|
40
41
|
}
|
|
@@ -54,42 +55,42 @@ export function createCodexHealthTool(ctx) {
|
|
|
54
55
|
const jsonAccounts = [];
|
|
55
56
|
let healthyCount = 0;
|
|
56
57
|
let unhealthyCount = 0;
|
|
57
|
-
|
|
58
|
+
let skippedCount = 0;
|
|
59
|
+
const inputs = buildRefreshInputs(storage.accounts);
|
|
60
|
+
for (let i = 0; i < inputs.length; i++) {
|
|
61
|
+
const input = inputs[i];
|
|
58
62
|
const account = storage.accounts[i];
|
|
59
|
-
if (!account)
|
|
63
|
+
if (!input || !account)
|
|
60
64
|
continue;
|
|
61
65
|
const label = formatCommandAccountLabel(account, i);
|
|
62
66
|
const displayLabel = formatCommandAccountLabel(account, i, { maskEmail });
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
unhealthyCount++;
|
|
89
|
-
}
|
|
67
|
+
const outcome = await refreshAndPersistAccount(input);
|
|
68
|
+
if (outcome.status === "refreshed") {
|
|
69
|
+
jsonAccounts.push({
|
|
70
|
+
...buildJsonAccountIdentity(i, {
|
|
71
|
+
includeSensitive: includeSensitiveOutput,
|
|
72
|
+
account,
|
|
73
|
+
label,
|
|
74
|
+
}),
|
|
75
|
+
status: "healthy",
|
|
76
|
+
});
|
|
77
|
+
results.push(` ${getStatusMarker(ui, "ok")} ${displayLabel}: Healthy`);
|
|
78
|
+
healthyCount++;
|
|
79
|
+
}
|
|
80
|
+
else if (outcome.status === "skipped") {
|
|
81
|
+
jsonAccounts.push({
|
|
82
|
+
...buildJsonAccountIdentity(i, {
|
|
83
|
+
includeSensitive: includeSensitiveOutput,
|
|
84
|
+
account,
|
|
85
|
+
label,
|
|
86
|
+
}),
|
|
87
|
+
status: "skipped",
|
|
88
|
+
error: "Account is disabled",
|
|
89
|
+
});
|
|
90
|
+
results.push(` ${getStatusMarker(ui, "warning")} ${displayLabel}: Skipped (disabled)`);
|
|
91
|
+
skippedCount++;
|
|
90
92
|
}
|
|
91
|
-
|
|
92
|
-
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
93
|
+
else {
|
|
93
94
|
jsonAccounts.push({
|
|
94
95
|
...buildJsonAccountIdentity(i, {
|
|
95
96
|
includeSensitive: includeSensitiveOutput,
|
|
@@ -97,17 +98,18 @@ export function createCodexHealthTool(ctx) {
|
|
|
97
98
|
label,
|
|
98
99
|
}),
|
|
99
100
|
status: "unhealthy",
|
|
100
|
-
error:
|
|
101
|
+
error: outcome.error,
|
|
101
102
|
});
|
|
102
|
-
results.push(` ${getStatusMarker(ui, "error")} ${displayLabel}:
|
|
103
|
+
results.push(` ${getStatusMarker(ui, "error")} ${displayLabel}: ${outcome.error}`);
|
|
103
104
|
unhealthyCount++;
|
|
104
105
|
}
|
|
105
106
|
}
|
|
107
|
+
await reloadCachedAccountManager();
|
|
106
108
|
results.push("");
|
|
107
|
-
results.push(`Summary: ${healthyCount} healthy, ${unhealthyCount} unhealthy`);
|
|
109
|
+
results.push(`Summary: ${healthyCount} healthy, ${unhealthyCount} unhealthy, ${skippedCount} skipped`);
|
|
108
110
|
// Surface recoverable stale state and disabled token-source duplicates
|
|
109
|
-
// (issue #171).
|
|
110
|
-
//
|
|
111
|
+
// (issue #171). Token verification is destructive to single-use refresh
|
|
112
|
+
// tokens, but this tool persists rotations before reporting health.
|
|
111
113
|
const staleRecoverable = findStaleRecoverableAccounts(storage.accounts);
|
|
112
114
|
const duplicateSlots = findDisabledTokenSourceDuplicates(storage.accounts);
|
|
113
115
|
const staleSlots = staleRecoverable.map((index) => index + 1);
|
|
@@ -127,6 +129,7 @@ export function createCodexHealthTool(ctx) {
|
|
|
127
129
|
totalAccounts: storage.accounts.length,
|
|
128
130
|
healthyCount,
|
|
129
131
|
unhealthyCount,
|
|
132
|
+
skippedCount,
|
|
130
133
|
staleRecoverableSlots: staleSlots,
|
|
131
134
|
disabledDuplicateSlots: dupSlots,
|
|
132
135
|
disabledWithFreshCredentialSlots: absorbedSlots,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-health.js","sourceRoot":"","sources":["../../../lib/tools/codex-health.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAuB,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,
|
|
1
|
+
{"version":3,"file":"codex-health.js","sourceRoot":"","sources":["../../../lib/tools/codex-health.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-refresh.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-refresh.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"codex-refresh.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-refresh.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAOrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CAiFvE"}
|
|
@@ -3,40 +3,11 @@
|
|
|
3
3
|
* Extracted from `index.ts` per RC-1 Phase 2.
|
|
4
4
|
*/
|
|
5
5
|
import { tool } from "@opencode-ai/plugin/tool";
|
|
6
|
-
import { loadAccounts
|
|
7
|
-
import { AccountManager } from "../accounts.js";
|
|
8
|
-
import { queuedRefresh } from "../refresh-queue.js";
|
|
6
|
+
import { loadAccounts } from "../storage.js";
|
|
9
7
|
import { formatUiHeader, formatUiItem, paintUiText } from "../ui/format.js";
|
|
10
|
-
|
|
11
|
-
* Finds the index of the account matching `identity` in `accounts`, using
|
|
12
|
-
* the same organizationId -> accountId -> refreshToken priority order the
|
|
13
|
-
* storage layer's dedup/identity helpers use elsewhere (see
|
|
14
|
-
* `lib/storage/identity.ts`). Kept local rather than importing the shared
|
|
15
|
-
* helper because the barrel does not currently re-export it.
|
|
16
|
-
*/
|
|
17
|
-
function findAccountIndexByIdentity(accounts, identity) {
|
|
18
|
-
const organizationId = identity.organizationId?.trim();
|
|
19
|
-
if (organizationId) {
|
|
20
|
-
const idx = accounts.findIndex((a) => a.organizationId?.trim() === organizationId);
|
|
21
|
-
if (idx >= 0)
|
|
22
|
-
return idx;
|
|
23
|
-
}
|
|
24
|
-
const accountId = identity.accountId?.trim();
|
|
25
|
-
if (accountId) {
|
|
26
|
-
const idx = accounts.findIndex((a) => a.accountId?.trim() === accountId);
|
|
27
|
-
if (idx >= 0)
|
|
28
|
-
return idx;
|
|
29
|
-
}
|
|
30
|
-
const refreshToken = identity.refreshToken?.trim();
|
|
31
|
-
if (refreshToken) {
|
|
32
|
-
const idx = accounts.findIndex((a) => a.refreshToken?.trim() === refreshToken);
|
|
33
|
-
if (idx >= 0)
|
|
34
|
-
return idx;
|
|
35
|
-
}
|
|
36
|
-
return -1;
|
|
37
|
-
}
|
|
8
|
+
import { buildRefreshInputs, refreshAndPersistAccount, } from "./refresh-account.js";
|
|
38
9
|
export function createCodexRefreshTool(ctx) {
|
|
39
|
-
const { resolveUiRuntime, formatCommandAccountLabel, resolveMaskEmail, getStatusMarker,
|
|
10
|
+
const { resolveUiRuntime, formatCommandAccountLabel, resolveMaskEmail, getStatusMarker, reloadCachedAccountManager, } = ctx;
|
|
40
11
|
return tool({
|
|
41
12
|
description: "Manually refresh OAuth tokens for all accounts to verify they're still valid.",
|
|
42
13
|
args: {},
|
|
@@ -60,86 +31,36 @@ export function createCodexRefreshTool(ctx) {
|
|
|
60
31
|
: [`Refreshing ${storage.accounts.length} account(s):`, ""];
|
|
61
32
|
let refreshedCount = 0;
|
|
62
33
|
let failedCount = 0;
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
// other tool/rotation for the full duration of this loop, and
|
|
68
|
-
// mutating `storage` in place and saving it at the end (the old
|
|
69
|
-
// behavior) silently clobbered any rate-limit/cooldown/activeIndex
|
|
70
|
-
// state a concurrent rotation persisted while this loop was running.
|
|
71
|
-
const refreshedAccounts = [];
|
|
72
|
-
for (let i = 0; i < storage.accounts.length; i++) {
|
|
34
|
+
let skippedCount = 0;
|
|
35
|
+
const inputs = buildRefreshInputs(storage.accounts);
|
|
36
|
+
for (let i = 0; i < inputs.length; i++) {
|
|
37
|
+
const input = inputs[i];
|
|
73
38
|
const account = storage.accounts[i];
|
|
74
|
-
if (!account)
|
|
39
|
+
if (!input || !account)
|
|
75
40
|
continue;
|
|
76
41
|
const label = formatCommandAccountLabel(account, i, { maskEmail });
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
};
|
|
82
|
-
try {
|
|
83
|
-
const refreshResult = await queuedRefresh(account.refreshToken);
|
|
84
|
-
if (refreshResult.type === "success") {
|
|
85
|
-
const rotated = refreshResult.refresh !== account.refreshToken;
|
|
86
|
-
refreshedAccounts.push({
|
|
87
|
-
identity,
|
|
88
|
-
refreshToken: refreshResult.refresh,
|
|
89
|
-
accessToken: refreshResult.access,
|
|
90
|
-
expiresAt: refreshResult.expires,
|
|
91
|
-
rotatedAt: rotated ? Date.now() : undefined,
|
|
92
|
-
});
|
|
93
|
-
results.push(` ${getStatusMarker(ui, "ok")} ${label}: Refreshed`);
|
|
94
|
-
refreshedCount++;
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
results.push(` ${getStatusMarker(ui, "error")} ${label}: Failed - ${refreshResult.message ?? refreshResult.reason}`);
|
|
98
|
-
failedCount++;
|
|
99
|
-
}
|
|
42
|
+
const outcome = await refreshAndPersistAccount(input);
|
|
43
|
+
if (outcome.status === "refreshed") {
|
|
44
|
+
results.push(` ${getStatusMarker(ui, "ok")} ${label}: Refreshed`);
|
|
45
|
+
refreshedCount++;
|
|
100
46
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
47
|
+
else if (outcome.status === "skipped") {
|
|
48
|
+
results.push(` ${getStatusMarker(ui, "warning")} ${label}: Skipped (disabled)`);
|
|
49
|
+
skippedCount++;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
results.push(` ${getStatusMarker(ui, "error")} ${label}: Failed - ${outcome.error}`);
|
|
104
53
|
failedCount++;
|
|
105
54
|
}
|
|
106
55
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
for (const outcome of refreshedAccounts) {
|
|
112
|
-
const idx = findAccountIndexByIdentity(current.accounts, outcome.identity);
|
|
113
|
-
if (idx < 0)
|
|
114
|
-
continue; // Account removed concurrently; nothing to apply.
|
|
115
|
-
const target = current.accounts[idx];
|
|
116
|
-
if (!target)
|
|
117
|
-
continue;
|
|
118
|
-
// The refresh was keyed off `outcome.identity.refreshToken` (the
|
|
119
|
-
// pre-refresh value). If the on-disk refreshToken no longer
|
|
120
|
-
// matches it, another process rotated this account mid-flight
|
|
121
|
-
// while our (network-bound) refresh was in progress -- we
|
|
122
|
-
// cannot know which resulting chain is the live one, so skip
|
|
123
|
-
// rather than clobber whatever that other process wrote.
|
|
124
|
-
if (target.refreshToken !== outcome.identity.refreshToken)
|
|
125
|
-
continue;
|
|
126
|
-
target.refreshToken = outcome.refreshToken;
|
|
127
|
-
target.accessToken = outcome.accessToken;
|
|
128
|
-
target.expiresAt = outcome.expiresAt;
|
|
129
|
-
if (outcome.rotatedAt !== undefined) {
|
|
130
|
-
target.tokenRotatedAt = outcome.rotatedAt;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
await persist(current);
|
|
134
|
-
});
|
|
56
|
+
await reloadCachedAccountManager();
|
|
57
|
+
results.push("");
|
|
58
|
+
if (skippedCount > 0) {
|
|
59
|
+
results.push(`Summary: ${refreshedCount} refreshed, ${failedCount} failed, ${skippedCount} skipped`);
|
|
135
60
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
cachedAccountManagerRef.current = reloadedManager;
|
|
139
|
-
accountManagerPromiseRef.current = Promise.resolve(reloadedManager);
|
|
61
|
+
else {
|
|
62
|
+
results.push(`Summary: ${refreshedCount} refreshed, ${failedCount} failed`);
|
|
140
63
|
}
|
|
141
|
-
results.push("");
|
|
142
|
-
results.push(`Summary: ${refreshedCount} refreshed, ${failedCount} failed`);
|
|
143
64
|
if (ui.v2Enabled) {
|
|
144
65
|
return [
|
|
145
66
|
...formatUiHeader(ui, "Refresh accounts"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-refresh.js","sourceRoot":"","sources":["../../../lib/tools/codex-refresh.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAuB,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"codex-refresh.js","sourceRoot":"","sources":["../../../lib/tools/codex-refresh.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,6 +54,7 @@ export type MutableRef<T> = {
|
|
|
54
54
|
export interface ToolContext {
|
|
55
55
|
cachedAccountManagerRef: MutableRef<AccountManager | null>;
|
|
56
56
|
accountManagerPromiseRef: MutableRef<Promise<AccountManager> | null>;
|
|
57
|
+
reloadCachedAccountManager: () => Promise<void>;
|
|
57
58
|
runtimeMetrics: RuntimeMetrics;
|
|
58
59
|
beginnerSafeModeRef: {
|
|
59
60
|
readonly current: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACX,cAAc,EACd,8BAA8B,EAC9B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EACX,gBAAgB,EAChB,wBAAwB,EACxB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EACX,uBAAuB,EACvB,0BAA0B,EAC1B,uBAAuB,EACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AA2B/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAAE,OAAO,EAAE,CAAC,CAAA;CAAE,CAAC;AAE3C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,WAAW;IAE3B,uBAAuB,EAAE,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC3D,wBAAwB,EAAE,UAAU,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/tools/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAoBH,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/tools/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared token refresh persistence for the account-management tools.
|
|
3
|
+
*
|
|
4
|
+
* OpenAI refresh tokens are single-use and rotate on exchange. Any tool that
|
|
5
|
+
* calls `queuedRefresh()` must persist the rotated credential immediately;
|
|
6
|
+
* otherwise the on-disk refresh token is already consumed and the next load
|
|
7
|
+
* reports `refresh_token_reused` for every account.
|
|
8
|
+
*/
|
|
9
|
+
import { type AccountMetadataV3 } from "../storage.js";
|
|
10
|
+
import type { TokenResult } from "../types.js";
|
|
11
|
+
export interface RefreshAccountIdentity {
|
|
12
|
+
organizationId?: string;
|
|
13
|
+
accountId?: string;
|
|
14
|
+
refreshToken: string;
|
|
15
|
+
}
|
|
16
|
+
export interface RefreshAccountInput {
|
|
17
|
+
index: number;
|
|
18
|
+
identity: RefreshAccountIdentity;
|
|
19
|
+
enabled?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface PersistedRefreshResult {
|
|
22
|
+
index: number;
|
|
23
|
+
identity: RefreshAccountIdentity;
|
|
24
|
+
refreshToken: string;
|
|
25
|
+
accessToken: string;
|
|
26
|
+
expiresAt: number;
|
|
27
|
+
rotatedAt?: number;
|
|
28
|
+
persisted: boolean;
|
|
29
|
+
persistError?: string;
|
|
30
|
+
}
|
|
31
|
+
export type AccountRefreshOutcome = {
|
|
32
|
+
status: "skipped";
|
|
33
|
+
index: number;
|
|
34
|
+
identity: RefreshAccountIdentity;
|
|
35
|
+
} | {
|
|
36
|
+
status: "failed";
|
|
37
|
+
index: number;
|
|
38
|
+
identity: RefreshAccountIdentity;
|
|
39
|
+
error: string;
|
|
40
|
+
} | {
|
|
41
|
+
status: "refreshed";
|
|
42
|
+
index: number;
|
|
43
|
+
result: PersistedRefreshResult;
|
|
44
|
+
};
|
|
45
|
+
export declare function findAccountIndexByIdentity(accounts: RefreshAccountIdentity[], identity: RefreshAccountIdentity): number;
|
|
46
|
+
/**
|
|
47
|
+
* Persists one successful refresh in a short storage transaction. The account
|
|
48
|
+
* is re-located from a freshly re-read snapshot, and sibling accounts that
|
|
49
|
+
* share the consumed single-use refresh token are rotated atomically with it.
|
|
50
|
+
*/
|
|
51
|
+
export declare function persistRefreshResult(index: number, identity: RefreshAccountIdentity, refreshResult: Extract<TokenResult, {
|
|
52
|
+
type: "success";
|
|
53
|
+
}>): Promise<PersistedRefreshResult>;
|
|
54
|
+
/**
|
|
55
|
+
* Refreshes one account and persists the rotated credential before reporting
|
|
56
|
+
* success. Disabled standalone accounts are skipped: refreshing them is wrong
|
|
57
|
+
* (they may intentionally retain a dead duplicate credential), while disabled
|
|
58
|
+
* siblings sharing an enabled account's consumed token are still updated by
|
|
59
|
+
* `persistRefreshResult()` so the shared credential remains consistent.
|
|
60
|
+
*/
|
|
61
|
+
export declare function refreshAndPersistAccount(account: RefreshAccountInput): Promise<AccountRefreshOutcome>;
|
|
62
|
+
export declare function buildRefreshInputs(accounts: AccountMetadataV3[]): RefreshAccountInput[];
|
|
63
|
+
//# sourceMappingURL=refresh-account.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh-account.d.ts","sourceRoot":"","sources":["../../../lib/tools/refresh-account.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAEN,KAAK,iBAAiB,EACtB,MAAM,eAAe,CAAC;AAKvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,sBAAsB;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,sBAAsB,CAAC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,sBAAsB,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,qBAAqB,GAC9B;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,sBAAsB,CAAA;CAAE,GACtE;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,sBAAsB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpF;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,CAAC;AAE1E,wBAAgB,0BAA0B,CACzC,QAAQ,EAAE,sBAAsB,EAAE,EAClC,QAAQ,EAAE,sBAAsB,GAC9B,MAAM,CAER;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACzC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,sBAAsB,EAChC,aAAa,EAAE,OAAO,CAAC,WAAW,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,GACtD,OAAO,CAAC,sBAAsB,CAAC,CAoFjC;AAED;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,mBAAmB,GAC1B,OAAO,CAAC,qBAAqB,CAAC,CAsChC;AAED,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE,iBAAiB,EAAE,GAC3B,mBAAmB,EAAE,CAUvB"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared token refresh persistence for the account-management tools.
|
|
3
|
+
*
|
|
4
|
+
* OpenAI refresh tokens are single-use and rotate on exchange. Any tool that
|
|
5
|
+
* calls `queuedRefresh()` must persist the rotated credential immediately;
|
|
6
|
+
* otherwise the on-disk refresh token is already consumed and the next load
|
|
7
|
+
* reports `refresh_token_reused` for every account.
|
|
8
|
+
*/
|
|
9
|
+
import { queuedRefresh } from "../refresh-queue.js";
|
|
10
|
+
import { withAccountStorageTransaction, } from "../storage.js";
|
|
11
|
+
import { findAccountIndexByIdentityKeys, toAccountIdentityKeys, } from "../storage/identity.js";
|
|
12
|
+
export function findAccountIndexByIdentity(accounts, identity) {
|
|
13
|
+
return findAccountIndexByIdentityKeys(accounts, toAccountIdentityKeys(identity));
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Persists one successful refresh in a short storage transaction. The account
|
|
17
|
+
* is re-located from a freshly re-read snapshot, and sibling accounts that
|
|
18
|
+
* share the consumed single-use refresh token are rotated atomically with it.
|
|
19
|
+
*/
|
|
20
|
+
export async function persistRefreshResult(index, identity, refreshResult) {
|
|
21
|
+
const rotated = refreshResult.refresh !== identity.refreshToken;
|
|
22
|
+
const rotatedAt = rotated ? Date.now() : undefined;
|
|
23
|
+
try {
|
|
24
|
+
return await withAccountStorageTransaction(async (current, persist) => {
|
|
25
|
+
if (!current) {
|
|
26
|
+
throw new Error("Account storage is unavailable");
|
|
27
|
+
}
|
|
28
|
+
const idx = findAccountIndexByIdentity(current.accounts, identity);
|
|
29
|
+
if (idx < 0) {
|
|
30
|
+
throw new Error("Account was removed while its token was refreshing");
|
|
31
|
+
}
|
|
32
|
+
const target = current.accounts[idx];
|
|
33
|
+
if (!target) {
|
|
34
|
+
throw new Error("Account was removed while its token was refreshing");
|
|
35
|
+
}
|
|
36
|
+
if (target.refreshToken === identity.refreshToken) {
|
|
37
|
+
if (rotated) {
|
|
38
|
+
// A login can produce sibling org/workspace records sharing one
|
|
39
|
+
// single-use refresh token. Mirror the account-state propagation used
|
|
40
|
+
// by request-time refresh: update those records with the new token and
|
|
41
|
+
// expire their workspace-specific access tokens so they refresh cleanly.
|
|
42
|
+
// Do this before assigning the target, since siblings are matched by
|
|
43
|
+
// the consumed token and the target starts with that token too.
|
|
44
|
+
for (const sibling of current.accounts) {
|
|
45
|
+
if (sibling === target)
|
|
46
|
+
continue;
|
|
47
|
+
if (sibling.refreshToken !== identity.refreshToken)
|
|
48
|
+
continue;
|
|
49
|
+
sibling.refreshToken = refreshResult.refresh;
|
|
50
|
+
sibling.expiresAt = 0;
|
|
51
|
+
if (rotatedAt !== undefined) {
|
|
52
|
+
sibling.tokenRotatedAt = rotatedAt;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
target.refreshToken = refreshResult.refresh;
|
|
57
|
+
target.accessToken = refreshResult.access;
|
|
58
|
+
target.expiresAt = refreshResult.expires;
|
|
59
|
+
if (rotatedAt !== undefined) {
|
|
60
|
+
target.tokenRotatedAt = rotatedAt;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else if (target.refreshToken === refreshResult.refresh) {
|
|
64
|
+
// A sibling account in this process just persisted the same rotation
|
|
65
|
+
// and propagated the new token to this workspace record. Apply only
|
|
66
|
+
// this workspace's freshly returned access token; do not overwrite
|
|
67
|
+
// non-credential state in the fresh snapshot.
|
|
68
|
+
target.accessToken = refreshResult.access;
|
|
69
|
+
target.expiresAt = refreshResult.expires;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// The refresh was keyed off `identity.refreshToken` (the consumed,
|
|
73
|
+
// pre-rotation value). If storage carries neither that token nor the
|
|
74
|
+
// exact rotation returned by this refresh, another process rotated
|
|
75
|
+
// this credential while this network-bound refresh was in flight. We
|
|
76
|
+
// cannot know which resulting chain is live, so fail this
|
|
77
|
+
// verification rather than clobber whatever the other process wrote.
|
|
78
|
+
throw new Error("Refresh token changed concurrently while verification was in progress");
|
|
79
|
+
}
|
|
80
|
+
await persist(current);
|
|
81
|
+
return {
|
|
82
|
+
index,
|
|
83
|
+
identity,
|
|
84
|
+
refreshToken: refreshResult.refresh,
|
|
85
|
+
accessToken: refreshResult.access,
|
|
86
|
+
expiresAt: refreshResult.expires,
|
|
87
|
+
rotatedAt,
|
|
88
|
+
persisted: true,
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
return {
|
|
94
|
+
index,
|
|
95
|
+
identity,
|
|
96
|
+
refreshToken: refreshResult.refresh,
|
|
97
|
+
accessToken: refreshResult.access,
|
|
98
|
+
expiresAt: refreshResult.expires,
|
|
99
|
+
rotatedAt,
|
|
100
|
+
persisted: false,
|
|
101
|
+
persistError: error instanceof Error ? error.message : String(error),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Refreshes one account and persists the rotated credential before reporting
|
|
107
|
+
* success. Disabled standalone accounts are skipped: refreshing them is wrong
|
|
108
|
+
* (they may intentionally retain a dead duplicate credential), while disabled
|
|
109
|
+
* siblings sharing an enabled account's consumed token are still updated by
|
|
110
|
+
* `persistRefreshResult()` so the shared credential remains consistent.
|
|
111
|
+
*/
|
|
112
|
+
export async function refreshAndPersistAccount(account) {
|
|
113
|
+
const { index, identity } = account;
|
|
114
|
+
if (account.enabled === false) {
|
|
115
|
+
return { status: "skipped", index, identity };
|
|
116
|
+
}
|
|
117
|
+
let refreshResult;
|
|
118
|
+
try {
|
|
119
|
+
refreshResult = await queuedRefresh(identity.refreshToken);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
return {
|
|
123
|
+
status: "failed",
|
|
124
|
+
index,
|
|
125
|
+
identity,
|
|
126
|
+
error: error instanceof Error ? error.message : String(error),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
if (refreshResult.type !== "success") {
|
|
130
|
+
return {
|
|
131
|
+
status: "failed",
|
|
132
|
+
index,
|
|
133
|
+
identity,
|
|
134
|
+
error: refreshResult.message ?? refreshResult.reason ?? "token refresh failed",
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
const persisted = await persistRefreshResult(index, identity, refreshResult);
|
|
138
|
+
if (!persisted.persisted) {
|
|
139
|
+
return {
|
|
140
|
+
status: "failed",
|
|
141
|
+
index,
|
|
142
|
+
identity,
|
|
143
|
+
error: persisted.persistError ?? "Failed to persist rotated credential",
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
return { status: "refreshed", index, result: persisted };
|
|
147
|
+
}
|
|
148
|
+
export function buildRefreshInputs(accounts) {
|
|
149
|
+
return accounts.map((account, index) => ({
|
|
150
|
+
index,
|
|
151
|
+
enabled: account.enabled,
|
|
152
|
+
identity: {
|
|
153
|
+
organizationId: account.organizationId,
|
|
154
|
+
accountId: account.accountId,
|
|
155
|
+
refreshToken: account.refreshToken,
|
|
156
|
+
},
|
|
157
|
+
}));
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=refresh-account.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh-account.js","sourceRoot":"","sources":["../../../lib/tools/refresh-account.ts"],"names":[],"mappings":"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"}
|