@iam-brain/opencode-codex-auth 0.1.7 → 0.1.8
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 +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/codex-native.d.ts +6 -2
- package/dist/lib/codex-native.d.ts.map +1 -1
- package/dist/lib/codex-native.js +106 -27
- package/dist/lib/codex-native.js.map +1 -1
- package/dist/lib/config.d.ts +7 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +40 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/fetch-orchestrator.d.ts +5 -0
- package/dist/lib/fetch-orchestrator.d.ts.map +1 -1
- package/dist/lib/fetch-orchestrator.js +20 -2
- package/dist/lib/fetch-orchestrator.js.map +1 -1
- package/dist/lib/installer-cli.d.ts.map +1 -1
- package/dist/lib/installer-cli.js +5 -1
- package/dist/lib/installer-cli.js.map +1 -1
- package/dist/lib/paths.d.ts +8 -0
- package/dist/lib/paths.d.ts.map +1 -1
- package/dist/lib/paths.js +29 -2
- package/dist/lib/paths.js.map +1 -1
- package/dist/lib/personality-skill.d.ts +17 -0
- package/dist/lib/personality-skill.d.ts.map +1 -0
- package/dist/lib/personality-skill.js +136 -0
- package/dist/lib/personality-skill.js.map +1 -0
- package/dist/lib/rotation.d.ts.map +1 -1
- package/dist/lib/rotation.js +64 -73
- package/dist/lib/rotation.js.map +1 -1
- package/dist/lib/session-affinity.d.ts +26 -0
- package/dist/lib/session-affinity.d.ts.map +1 -0
- package/dist/lib/session-affinity.js +166 -0
- package/dist/lib/session-affinity.js.map +1 -0
- package/package.json +1 -1
- package/schemas/codex-config.schema.json +7 -0
package/README.md
CHANGED
|
@@ -54,12 +54,14 @@ The installer does two things:
|
|
|
54
54
|
- `Codex Compact.md.disabled`
|
|
55
55
|
3. Creates `~/.config/opencode/codex-config.json` with defaults when missing.
|
|
56
56
|
4. Synchronizes `~/.config/opencode/commands/create-personality.md` for `/create-personality` (created/updated as needed).
|
|
57
|
+
5. Synchronizes `~/.config/opencode/skills/personality-builder/SKILL.md` (plus references) for skill-driven personality workflows.
|
|
57
58
|
|
|
58
59
|
At plugin startup, files are reconciled against runtime mode:
|
|
59
60
|
|
|
60
61
|
- `mode: "collab"` -> `.md.disabled` files are activated to `.md`
|
|
61
62
|
- `mode: "native"` or `mode: "codex"` -> Codex agents are disabled to `.md.disabled`
|
|
62
63
|
- `/create-personality` command template is synchronized to the latest managed version.
|
|
64
|
+
- `personality-builder` skill template bundle is synchronized to the latest managed version.
|
|
63
65
|
|
|
64
66
|
To install only the agent templates (no `opencode.json` edits):
|
|
65
67
|
|
|
@@ -102,6 +104,8 @@ Create guided custom personalities with:
|
|
|
102
104
|
|
|
103
105
|
- Provider auth marker: `~/.local/share/opencode/auth.json`
|
|
104
106
|
- Plugin multi-account store: `~/.config/opencode/codex-accounts.json`
|
|
107
|
+
- Session affinity cache: `~/.config/opencode/cache/codex-session-affinity.json`
|
|
108
|
+
- Quota snapshot cache: `~/.config/opencode/cache/codex-snapshots.json`
|
|
105
109
|
|
|
106
110
|
Legacy sources can be imported explicitly from the auth menu:
|
|
107
111
|
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAyCjD,eAAO,MAAM,qBAAqB,EAAE,MA6LnC,CAAA;AAED,eAAe,qBAAqB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { tool } from "@opencode-ai/plugin";
|
|
2
2
|
import { listAccountsForTools, removeAccountByIndex, switchAccountByIndex, toggleAccountEnabledByIndex } from "./lib/accounts-tools";
|
|
3
3
|
import { CodexAuthPlugin, refreshAccessToken } from "./lib/codex-native";
|
|
4
|
-
import { ensureDefaultConfigFile, getCompatInputSanitizerEnabled, getCustomSettings, getDebugEnabled, getHeaderSnapshotsEnabled, getMode, getPidOffsetEnabled, getPersonality, getProactiveRefreshBufferMs, getProactiveRefreshEnabled, getSpoofMode, getQuietMode, loadConfigFile, resolveConfig } from "./lib/config";
|
|
4
|
+
import { ensureDefaultConfigFile, getCompatInputSanitizerEnabled, getCustomSettings, getDebugEnabled, getHeaderTransformDebugEnabled, getHeaderSnapshotsEnabled, getMode, getRotationStrategy, getPidOffsetEnabled, getPersonality, getProactiveRefreshBufferMs, getProactiveRefreshEnabled, getSpoofMode, getQuietMode, loadConfigFile, resolveConfig } from "./lib/config";
|
|
5
5
|
import { createLogger } from "./lib/logger";
|
|
6
6
|
import { reconcileOrchestratorAgentsState } from "./lib/orchestrator-agents";
|
|
7
7
|
import { generatePersonaSpec } from "./lib/persona-tool";
|
|
8
8
|
import { createPersonalityFile } from "./lib/personality-create";
|
|
9
9
|
import { installCreatePersonalityCommand } from "./lib/personality-command";
|
|
10
|
+
import { installPersonalityBuilderSkill } from "./lib/personality-skill";
|
|
10
11
|
import { runOneProactiveRefreshTick } from "./lib/proactive-refresh";
|
|
11
12
|
import { toolOutputForStatus } from "./lib/codex-status-tool";
|
|
12
13
|
import { requireOpenAIMultiOauthAuth, saveAuthStorage } from "./lib/storage";
|
|
@@ -19,6 +20,7 @@ export const OpenAIMultiAuthPlugin = async (input) => {
|
|
|
19
20
|
}
|
|
20
21
|
await ensureDefaultConfigFile({ env: process.env }).catch(() => { });
|
|
21
22
|
await installCreatePersonalityCommand({ force: true }).catch(() => { });
|
|
23
|
+
await installPersonalityBuilderSkill({ force: true }).catch(() => { });
|
|
22
24
|
const cfg = resolveConfig({
|
|
23
25
|
env: process.env,
|
|
24
26
|
file: loadConfigFile({ env: process.env })
|
|
@@ -66,9 +68,11 @@ export const OpenAIMultiAuthPlugin = async (input) => {
|
|
|
66
68
|
mode: runtimeMode,
|
|
67
69
|
quietMode: getQuietMode(cfg),
|
|
68
70
|
pidOffsetEnabled: getPidOffsetEnabled(cfg),
|
|
71
|
+
rotationStrategy: getRotationStrategy(cfg),
|
|
69
72
|
spoofMode: getSpoofMode(cfg),
|
|
70
73
|
compatInputSanitizer: getCompatInputSanitizerEnabled(cfg),
|
|
71
74
|
headerSnapshots: getHeaderSnapshotsEnabled(cfg),
|
|
75
|
+
headerTransformDebug: getHeaderTransformDebugEnabled(cfg),
|
|
72
76
|
customSettings: getCustomSettings(cfg)
|
|
73
77
|
});
|
|
74
78
|
const z = tool.schema;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAE1C,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,2BAA2B,EAC5B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACxE,OAAO,EACL,uBAAuB,EACvB,8BAA8B,EAC9B,iBAAiB,EACjB,eAAe,EACf,yBAAyB,EACzB,OAAO,EACP,mBAAmB,EACnB,cAAc,EACd,2BAA2B,EAC3B,0BAA0B,EAC1B,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,aAAa,EACd,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAA;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAChE,OAAO,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAA;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,EAAE,2BAA2B,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAEtD,IAAI,SAA2C,CAAA;AAE/C,MAAM,CAAC,MAAM,qBAAqB,GAAW,KAAK,EAAE,KAAK,EAAE,EAAE;IAC3D,IAAI,SAAS,EAAE,CAAC;QACd,SAAS,CAAC,IAAI,EAAE,CAAA;QAChB,SAAS,GAAG,SAAS,CAAA;IACvB,CAAC;IAED,MAAM,uBAAuB,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IACnE,MAAM,+BAA+B,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Hooks, PluginInput } from "@opencode-ai/plugin";
|
|
2
2
|
import { type IdTokenClaims } from "./claims";
|
|
3
3
|
import type { Logger } from "./logger";
|
|
4
|
-
import type { AccountRecord, OpenAIAuthMode, OpenAIOAuthDomain } from "./types";
|
|
4
|
+
import type { AccountRecord, OpenAIAuthMode, OpenAIOAuthDomain, RotationStrategy } from "./types";
|
|
5
5
|
import type { CodexSpoofMode, CustomSettings, PersonalityOption, PluginRuntimeMode } from "./config";
|
|
6
6
|
type BrowserOpenInvocation = {
|
|
7
7
|
command: string;
|
|
@@ -39,6 +39,7 @@ export declare const __testOnly: {
|
|
|
39
39
|
resolveHookAgentName: typeof resolveHookAgentName;
|
|
40
40
|
resolveCollaborationModeKind: typeof resolveCollaborationModeKind;
|
|
41
41
|
resolveSubagentHeaderValue: typeof resolveSubagentHeaderValue;
|
|
42
|
+
isOAuthDebugEnabled: typeof isOAuthDebugEnabled;
|
|
42
43
|
stopOAuthServer: typeof stopOAuthServer;
|
|
43
44
|
};
|
|
44
45
|
export declare function refreshAccessToken(refreshToken: string): Promise<TokenResponse>;
|
|
@@ -48,10 +49,11 @@ declare function composeCodexSuccessRedirectUrl(tokens: TokenResponse, options?:
|
|
|
48
49
|
}): string;
|
|
49
50
|
declare function buildOAuthSuccessHtml(mode?: CodexSpoofMode): string;
|
|
50
51
|
declare function buildOAuthErrorHtml(error: string): string;
|
|
52
|
+
declare function isOAuthDebugEnabled(): boolean;
|
|
51
53
|
declare function stopOAuthServer(): void;
|
|
52
54
|
declare function modeForRuntimeMode(runtimeMode: PluginRuntimeMode): OpenAIAuthMode;
|
|
53
55
|
export declare function upsertAccount(openai: OpenAIOAuthDomain, incoming: AccountRecord): AccountRecord;
|
|
54
|
-
type CodexOriginator = "codex_cli_rs" | "codex_exec";
|
|
56
|
+
type CodexOriginator = "opencode" | "codex_cli_rs" | "codex_exec";
|
|
55
57
|
declare function buildCodexUserAgent(originator: CodexOriginator): string;
|
|
56
58
|
declare function resolveRequestUserAgent(spoofMode: CodexSpoofMode, originator: CodexOriginator): string;
|
|
57
59
|
type CodexCollaborationModeKind = "plan" | "code" | "execute" | "pair_programming";
|
|
@@ -65,9 +67,11 @@ export type CodexAuthPluginOptions = {
|
|
|
65
67
|
mode?: PluginRuntimeMode;
|
|
66
68
|
quietMode?: boolean;
|
|
67
69
|
pidOffsetEnabled?: boolean;
|
|
70
|
+
rotationStrategy?: RotationStrategy;
|
|
68
71
|
spoofMode?: CodexSpoofMode;
|
|
69
72
|
compatInputSanitizer?: boolean;
|
|
70
73
|
headerSnapshots?: boolean;
|
|
74
|
+
headerTransformDebug?: boolean;
|
|
71
75
|
};
|
|
72
76
|
export declare function CodexAuthPlugin(input: PluginInput, opts?: CodexAuthPluginOptions): Promise<Hooks>;
|
|
73
77
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-native.d.ts","sourceRoot":"","sources":["../../lib/codex-native.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAS7D,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,UAAU,CAAA;AAuBjB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,KAAK,EAEV,aAAa,EAEb,cAAc,EACd,iBAAiB,
|
|
1
|
+
{"version":3,"file":"codex-native.d.ts","sourceRoot":"","sources":["../../lib/codex-native.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/codex-native.js
CHANGED
|
@@ -9,7 +9,7 @@ import { CodexStatus } from "./codex-status";
|
|
|
9
9
|
import { saveSnapshots } from "./codex-status-storage";
|
|
10
10
|
import { PluginFatalError, formatWaitTime, isPluginFatalError, toSyntheticErrorResponse } from "./fatal-errors";
|
|
11
11
|
import { buildIdentityKey, ensureIdentityKey, normalizeEmail, normalizePlan } from "./identity";
|
|
12
|
-
import { defaultSnapshotsPath } from "./paths";
|
|
12
|
+
import { defaultSessionAffinityPath, defaultSnapshotsPath } from "./paths";
|
|
13
13
|
import { createStickySessionState, selectAccount } from "./rotation";
|
|
14
14
|
import { ensureOpenAIOAuthDomain, getOpenAIOAuthDomain, importLegacyInstallData, listOpenAIOAuthDomains, loadAuthStorage, saveAuthStorage, setAccountCooldown, shouldOfferLegacyTransfer } from "./storage";
|
|
15
15
|
import { toolOutputForStatus } from "./codex-status-tool";
|
|
@@ -22,6 +22,7 @@ import { sanitizeRequestPayloadForCompat } from "./compat-sanitizer";
|
|
|
22
22
|
import { fetchQuotaSnapshotFromBackend } from "./codex-quota-fetch";
|
|
23
23
|
import { createRequestSnapshots } from "./request-snapshots";
|
|
24
24
|
import { CODEX_OAUTH_SUCCESS_HTML } from "./oauth-pages";
|
|
25
|
+
import { createSessionExistsFn, loadSessionAffinity, pruneSessionAffinitySnapshot, readSessionAffinitySnapshot, saveSessionAffinity, writeSessionAffinitySnapshot } from "./session-affinity";
|
|
25
26
|
const CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
|
|
26
27
|
const ISSUER = "https://auth.openai.com";
|
|
27
28
|
const CODEX_API_ENDPOINT = "https://chatgpt.com/backend-api/codex/responses";
|
|
@@ -192,6 +193,7 @@ export const __testOnly = {
|
|
|
192
193
|
resolveHookAgentName,
|
|
193
194
|
resolveCollaborationModeKind,
|
|
194
195
|
resolveSubagentHeaderValue,
|
|
196
|
+
isOAuthDebugEnabled,
|
|
195
197
|
stopOAuthServer
|
|
196
198
|
};
|
|
197
199
|
async function exchangeCodeForTokens(code, redirectUri, pkce) {
|
|
@@ -373,7 +375,8 @@ let oauthServer;
|
|
|
373
375
|
let pendingOAuth;
|
|
374
376
|
let oauthServerCloseTimer;
|
|
375
377
|
function isOAuthDebugEnabled() {
|
|
376
|
-
|
|
378
|
+
const raw = process.env.CODEX_AUTH_DEBUG?.trim().toLowerCase();
|
|
379
|
+
return raw === "1" || raw === "true" || raw === "yes" || raw === "on";
|
|
377
380
|
}
|
|
378
381
|
function emitOAuthDebug(event, meta = {}) {
|
|
379
382
|
if (!isOAuthDebugEnabled())
|
|
@@ -680,7 +683,8 @@ function rewriteUrl(requestInput) {
|
|
|
680
683
|
return parsed;
|
|
681
684
|
}
|
|
682
685
|
function opencodeUserAgent() {
|
|
683
|
-
|
|
686
|
+
const version = resolvePluginVersion();
|
|
687
|
+
return `opencode/${version} (${os.platform()} ${os.release()}; ${os.arch()})`;
|
|
684
688
|
}
|
|
685
689
|
let cachedPluginVersion;
|
|
686
690
|
let cachedMacProductVersion;
|
|
@@ -858,6 +862,8 @@ function resolveCodexPlatformSignature(platform = process.platform) {
|
|
|
858
862
|
return `${platform} ${os.release()}; ${architecture}`;
|
|
859
863
|
}
|
|
860
864
|
function buildCodexUserAgent(originator) {
|
|
865
|
+
if (originator === "opencode")
|
|
866
|
+
return opencodeUserAgent();
|
|
861
867
|
const buildVersion = resolvePluginVersion();
|
|
862
868
|
const terminalToken = resolveTerminalUserAgentToken();
|
|
863
869
|
const prefix = `${originator}/${buildVersion} (${resolveCodexPlatformSignature()}) ${terminalToken}`;
|
|
@@ -1017,7 +1023,7 @@ function isTuiWorkerInvocation(argv) {
|
|
|
1017
1023
|
}
|
|
1018
1024
|
function resolveCodexOriginator(spoofMode, argv = process.argv) {
|
|
1019
1025
|
if (spoofMode !== "codex")
|
|
1020
|
-
return "
|
|
1026
|
+
return "opencode";
|
|
1021
1027
|
const normalizedArgv = argv.map((entry) => String(entry));
|
|
1022
1028
|
if (isTuiWorkerInvocation(normalizedArgv))
|
|
1023
1029
|
return "codex_cli_rs";
|
|
@@ -1152,7 +1158,7 @@ function hydrateAccountIdentityFromAccessClaims(account) {
|
|
|
1152
1158
|
ensureAccountAuthTypes(account);
|
|
1153
1159
|
ensureIdentityKey(account);
|
|
1154
1160
|
}
|
|
1155
|
-
async function selectCatalogAuthCandidate(authMode, pidOffsetEnabled) {
|
|
1161
|
+
async function selectCatalogAuthCandidate(authMode, pidOffsetEnabled, rotationStrategy) {
|
|
1156
1162
|
try {
|
|
1157
1163
|
const auth = await loadAuthStorage();
|
|
1158
1164
|
const domain = getOpenAIOAuthDomain(auth, authMode);
|
|
@@ -1161,7 +1167,7 @@ async function selectCatalogAuthCandidate(authMode, pidOffsetEnabled) {
|
|
|
1161
1167
|
}
|
|
1162
1168
|
const selected = selectAccount({
|
|
1163
1169
|
accounts: domain.accounts,
|
|
1164
|
-
strategy: domain.strategy,
|
|
1170
|
+
strategy: rotationStrategy ?? domain.strategy,
|
|
1165
1171
|
activeIdentityKey: domain.activeIdentityKey,
|
|
1166
1172
|
now: Date.now(),
|
|
1167
1173
|
stickyPidOffset: pidOffsetEnabled
|
|
@@ -1461,7 +1467,7 @@ export async function CodexAuthPlugin(input, opts = {}) {
|
|
|
1461
1467
|
};
|
|
1462
1468
|
};
|
|
1463
1469
|
const requestSnapshots = createRequestSnapshots({
|
|
1464
|
-
enabled: opts.headerSnapshots === true,
|
|
1470
|
+
enabled: opts.headerSnapshots === true || opts.headerTransformDebug === true,
|
|
1465
1471
|
log: opts.log
|
|
1466
1472
|
});
|
|
1467
1473
|
const showToast = async (message, variant = "info", quietMode = false) => {
|
|
@@ -1757,7 +1763,37 @@ export async function CodexAuthPlugin(input, opts = {}) {
|
|
|
1757
1763
|
}
|
|
1758
1764
|
if (!hasOAuth)
|
|
1759
1765
|
return {};
|
|
1760
|
-
const
|
|
1766
|
+
const sessionAffinityPath = defaultSessionAffinityPath();
|
|
1767
|
+
const loadedSessionAffinity = await loadSessionAffinity(sessionAffinityPath).catch(() => ({ version: 1 }));
|
|
1768
|
+
const initialSessionAffinity = readSessionAffinitySnapshot(loadedSessionAffinity, authMode);
|
|
1769
|
+
const sessionExists = createSessionExistsFn(process.env);
|
|
1770
|
+
await pruneSessionAffinitySnapshot(initialSessionAffinity, sessionExists).catch(() => 0);
|
|
1771
|
+
const orchestratorState = createFetchOrchestratorState();
|
|
1772
|
+
orchestratorState.seenSessionKeys = initialSessionAffinity.seenSessionKeys;
|
|
1773
|
+
const stickySessionState = createStickySessionState();
|
|
1774
|
+
stickySessionState.bySessionKey = initialSessionAffinity.stickyBySessionKey;
|
|
1775
|
+
const hybridSessionState = createStickySessionState();
|
|
1776
|
+
hybridSessionState.bySessionKey = initialSessionAffinity.hybridBySessionKey;
|
|
1777
|
+
let sessionAffinityPersistQueue = Promise.resolve();
|
|
1778
|
+
const persistSessionAffinityState = () => {
|
|
1779
|
+
sessionAffinityPersistQueue = sessionAffinityPersistQueue
|
|
1780
|
+
.then(async () => {
|
|
1781
|
+
await pruneSessionAffinitySnapshot({
|
|
1782
|
+
seenSessionKeys: orchestratorState.seenSessionKeys,
|
|
1783
|
+
stickyBySessionKey: stickySessionState.bySessionKey,
|
|
1784
|
+
hybridBySessionKey: hybridSessionState.bySessionKey
|
|
1785
|
+
}, sessionExists);
|
|
1786
|
+
await saveSessionAffinity(async (current) => writeSessionAffinitySnapshot(current, authMode, {
|
|
1787
|
+
seenSessionKeys: orchestratorState.seenSessionKeys,
|
|
1788
|
+
stickyBySessionKey: stickySessionState.bySessionKey,
|
|
1789
|
+
hybridBySessionKey: hybridSessionState.bySessionKey
|
|
1790
|
+
}), sessionAffinityPath);
|
|
1791
|
+
})
|
|
1792
|
+
.catch(() => {
|
|
1793
|
+
// best-effort persistence
|
|
1794
|
+
});
|
|
1795
|
+
};
|
|
1796
|
+
const catalogAuth = await selectCatalogAuthCandidate(authMode, opts.pidOffsetEnabled === true, opts.rotationStrategy);
|
|
1761
1797
|
const catalogModels = await getCodexModelCatalog({
|
|
1762
1798
|
accessToken: catalogAuth.accessToken,
|
|
1763
1799
|
accountId: catalogAuth.accountId,
|
|
@@ -1770,23 +1806,47 @@ export async function CodexAuthPlugin(input, opts = {}) {
|
|
|
1770
1806
|
fallbackModels: STATIC_FALLBACK_MODELS,
|
|
1771
1807
|
personality: opts.personality
|
|
1772
1808
|
});
|
|
1773
|
-
const orchestratorState = createFetchOrchestratorState();
|
|
1774
|
-
const stickySessionState = createStickySessionState();
|
|
1775
1809
|
return {
|
|
1776
1810
|
apiKey: OAUTH_DUMMY_KEY,
|
|
1777
1811
|
async fetch(requestInput, init) {
|
|
1778
1812
|
const baseRequest = new Request(requestInput, init);
|
|
1813
|
+
const inboundCollaborationModeKind = baseRequest.headers.get(INTERNAL_COLLABORATION_MODE_HEADER) ?? undefined;
|
|
1814
|
+
if (opts.headerTransformDebug === true) {
|
|
1815
|
+
await requestSnapshots.captureRequest("before-header-transform", baseRequest, {
|
|
1816
|
+
spoofMode,
|
|
1817
|
+
...(inboundCollaborationModeKind
|
|
1818
|
+
? { collaborationModeKind: inboundCollaborationModeKind }
|
|
1819
|
+
: {})
|
|
1820
|
+
});
|
|
1821
|
+
}
|
|
1779
1822
|
const outbound = new Request(rewriteUrl(baseRequest), baseRequest);
|
|
1780
1823
|
const inboundOriginator = outbound.headers.get("originator")?.trim();
|
|
1781
|
-
const outboundOriginator = inboundOriginator === "
|
|
1824
|
+
const outboundOriginator = inboundOriginator === "opencode" ||
|
|
1825
|
+
inboundOriginator === "codex_exec" ||
|
|
1826
|
+
inboundOriginator === "codex_cli_rs"
|
|
1782
1827
|
? inboundOriginator
|
|
1783
1828
|
: resolveCodexOriginator(spoofMode);
|
|
1784
1829
|
outbound.headers.set("originator", outboundOriginator);
|
|
1785
|
-
outbound.headers.
|
|
1830
|
+
const inboundUserAgent = outbound.headers.get("user-agent")?.trim();
|
|
1831
|
+
if (spoofMode === "native" && inboundUserAgent) {
|
|
1832
|
+
outbound.headers.set("user-agent", inboundUserAgent);
|
|
1833
|
+
}
|
|
1834
|
+
else {
|
|
1835
|
+
outbound.headers.set("user-agent", resolveRequestUserAgent(spoofMode, outboundOriginator));
|
|
1836
|
+
}
|
|
1786
1837
|
const collaborationModeKind = outbound.headers.get(INTERNAL_COLLABORATION_MODE_HEADER);
|
|
1787
1838
|
if (collaborationModeKind) {
|
|
1788
1839
|
outbound.headers.delete(INTERNAL_COLLABORATION_MODE_HEADER);
|
|
1789
1840
|
}
|
|
1841
|
+
const subagentHeader = outbound.headers.get("x-openai-subagent")?.trim();
|
|
1842
|
+
const isSubagentRequest = Boolean(subagentHeader);
|
|
1843
|
+
if (opts.headerTransformDebug === true) {
|
|
1844
|
+
await requestSnapshots.captureRequest("after-header-transform", outbound, {
|
|
1845
|
+
spoofMode,
|
|
1846
|
+
...(collaborationModeKind ? { collaborationModeKind } : {}),
|
|
1847
|
+
...(isSubagentRequest ? { subagent: subagentHeader } : {})
|
|
1848
|
+
});
|
|
1849
|
+
}
|
|
1790
1850
|
let selectedIdentityKey;
|
|
1791
1851
|
await requestSnapshots.captureRequest("before-auth", outbound, {
|
|
1792
1852
|
spoofMode,
|
|
@@ -1801,6 +1861,11 @@ export async function CodexAuthPlugin(input, opts = {}) {
|
|
|
1801
1861
|
let email;
|
|
1802
1862
|
let plan;
|
|
1803
1863
|
try {
|
|
1864
|
+
if (isSubagentRequest && context?.sessionKey) {
|
|
1865
|
+
orchestratorState.seenSessionKeys.delete(context.sessionKey);
|
|
1866
|
+
stickySessionState.bySessionKey.delete(context.sessionKey);
|
|
1867
|
+
hybridSessionState.bySessionKey.delete(context.sessionKey);
|
|
1868
|
+
}
|
|
1804
1869
|
await saveAuthStorage(undefined, async (authFile) => {
|
|
1805
1870
|
const now = Date.now();
|
|
1806
1871
|
const openai = authFile.openai;
|
|
@@ -1834,8 +1899,9 @@ export async function CodexAuthPlugin(input, opts = {}) {
|
|
|
1834
1899
|
let sawInvalidGrant = false;
|
|
1835
1900
|
let sawRefreshFailure = false;
|
|
1836
1901
|
let sawMissingRefresh = false;
|
|
1902
|
+
const rotationStrategy = opts.rotationStrategy ?? domain.strategy ?? "sticky";
|
|
1837
1903
|
opts.log?.debug("rotation begin", {
|
|
1838
|
-
strategy:
|
|
1904
|
+
strategy: rotationStrategy,
|
|
1839
1905
|
activeIdentityKey: domain.activeIdentityKey,
|
|
1840
1906
|
totalAccounts: domain.accounts.length,
|
|
1841
1907
|
enabledAccounts: enabled.length,
|
|
@@ -1843,14 +1909,19 @@ export async function CodexAuthPlugin(input, opts = {}) {
|
|
|
1843
1909
|
sessionKey: context?.sessionKey ?? null
|
|
1844
1910
|
});
|
|
1845
1911
|
while (attempted.size < domain.accounts.length) {
|
|
1912
|
+
const sessionState = rotationStrategy === "sticky"
|
|
1913
|
+
? stickySessionState
|
|
1914
|
+
: rotationStrategy === "hybrid"
|
|
1915
|
+
? hybridSessionState
|
|
1916
|
+
: undefined;
|
|
1846
1917
|
const selected = selectAccount({
|
|
1847
1918
|
accounts: domain.accounts,
|
|
1848
|
-
strategy:
|
|
1919
|
+
strategy: rotationStrategy,
|
|
1849
1920
|
activeIdentityKey: domain.activeIdentityKey,
|
|
1850
1921
|
now,
|
|
1851
1922
|
stickyPidOffset: opts.pidOffsetEnabled === true,
|
|
1852
|
-
stickySessionKey: context?.sessionKey,
|
|
1853
|
-
stickySessionState,
|
|
1923
|
+
stickySessionKey: isSubagentRequest ? undefined : context?.sessionKey,
|
|
1924
|
+
stickySessionState: sessionState,
|
|
1854
1925
|
onDebug: (event) => {
|
|
1855
1926
|
opts.log?.debug("rotation decision", event);
|
|
1856
1927
|
}
|
|
@@ -1875,6 +1946,9 @@ export async function CodexAuthPlugin(input, opts = {}) {
|
|
|
1875
1946
|
break;
|
|
1876
1947
|
}
|
|
1877
1948
|
attempted.add(attemptKey);
|
|
1949
|
+
if (!isSubagentRequest && context?.sessionKey && sessionState) {
|
|
1950
|
+
persistSessionAffinityState();
|
|
1951
|
+
}
|
|
1878
1952
|
opts.log?.debug("rotation candidate selected", {
|
|
1879
1953
|
attemptKey,
|
|
1880
1954
|
selectedIdentityKey: selected.identityKey,
|
|
@@ -2030,6 +2104,17 @@ export async function CodexAuthPlugin(input, opts = {}) {
|
|
|
2030
2104
|
},
|
|
2031
2105
|
quietMode: opts.quietMode === true,
|
|
2032
2106
|
state: orchestratorState,
|
|
2107
|
+
onSessionObserved: ({ event, sessionKey }) => {
|
|
2108
|
+
if (isSubagentRequest) {
|
|
2109
|
+
orchestratorState.seenSessionKeys.delete(sessionKey);
|
|
2110
|
+
stickySessionState.bySessionKey.delete(sessionKey);
|
|
2111
|
+
hybridSessionState.bySessionKey.delete(sessionKey);
|
|
2112
|
+
return;
|
|
2113
|
+
}
|
|
2114
|
+
if (event === "new" || event === "resume" || event === "switch") {
|
|
2115
|
+
persistSessionAffinityState();
|
|
2116
|
+
}
|
|
2117
|
+
},
|
|
2033
2118
|
showToast,
|
|
2034
2119
|
onAttemptRequest: async ({ attempt, maxAttempts, request, auth, sessionKey }) => {
|
|
2035
2120
|
await requestSnapshots.captureRequest("outbound-attempt", request, {
|
|
@@ -2121,7 +2206,7 @@ export async function CodexAuthPlugin(input, opts = {}) {
|
|
|
2121
2206
|
const { redirectUri } = await startOAuthServer();
|
|
2122
2207
|
const pkce = await generatePKCE();
|
|
2123
2208
|
const state = generateState();
|
|
2124
|
-
const authUrl = buildAuthorizeUrl(redirectUri, pkce, state, "codex_cli_rs");
|
|
2209
|
+
const authUrl = buildAuthorizeUrl(redirectUri, pkce, state, spoofMode === "codex" ? "codex_cli_rs" : "opencode");
|
|
2125
2210
|
const callbackPromise = waitForOAuthCallback(pkce, state, authMode);
|
|
2126
2211
|
void tryOpenUrlInBrowser(authUrl, opts.log);
|
|
2127
2212
|
process.stdout.write(`\nGo to: ${authUrl}\n`);
|
|
@@ -2187,7 +2272,7 @@ export async function CodexAuthPlugin(input, opts = {}) {
|
|
|
2187
2272
|
const { redirectUri } = await startOAuthServer();
|
|
2188
2273
|
const pkce = await generatePKCE();
|
|
2189
2274
|
const state = generateState();
|
|
2190
|
-
const authUrl = buildAuthorizeUrl(redirectUri, pkce, state, "codex_cli_rs");
|
|
2275
|
+
const authUrl = buildAuthorizeUrl(redirectUri, pkce, state, spoofMode === "codex" ? "codex_cli_rs" : "opencode");
|
|
2191
2276
|
const callbackPromise = waitForOAuthCallback(pkce, state, authMode);
|
|
2192
2277
|
void tryOpenUrlInBrowser(authUrl, opts.log);
|
|
2193
2278
|
return {
|
|
@@ -2369,15 +2454,9 @@ export async function CodexAuthPlugin(input, opts = {}) {
|
|
|
2369
2454
|
const modelOptions = isRecord(hookInput.model.options) ? hookInput.model.options : {};
|
|
2370
2455
|
const promptCacheKey = resolvePromptCacheKey(modelOptions);
|
|
2371
2456
|
if (spoofMode === "native") {
|
|
2372
|
-
output.headers
|
|
2373
|
-
|
|
2374
|
-
|
|
2375
|
-
output.headers.conversation_id = promptCacheKey;
|
|
2376
|
-
}
|
|
2377
|
-
else {
|
|
2378
|
-
delete output.headers.session_id;
|
|
2379
|
-
delete output.headers.conversation_id;
|
|
2380
|
-
}
|
|
2457
|
+
output.headers.session_id = hookInput.sessionID;
|
|
2458
|
+
delete output.headers["OpenAI-Beta"];
|
|
2459
|
+
delete output.headers.conversation_id;
|
|
2381
2460
|
}
|
|
2382
2461
|
else {
|
|
2383
2462
|
output.headers.session_id = promptCacheKey ?? hookInput.sessionID;
|