@codexhost/cli-darwin-x64 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/THIRD_PARTY_NOTICES.txt +4 -0
- package/app/codexhost-distribution.json +1 -1
- package/app/desktop-controller.mjs +136 -36
- package/app/host-runtime.mjs +6950 -2918
- package/app/plugins/antigravity/plugin.mjs +73 -18
- package/app/plugins/claude-code/plugin.mjs +96 -27
- package/app/plugins/codebuddy/plugin.mjs +73 -18
- package/app/plugins/cursor-cli/plugin.mjs +73 -18
- package/app/plugins/deepseek-harness/plugin.mjs +73 -18
- package/app/plugins/enabled.json +2 -1
- package/app/plugins/grok/plugin.mjs +73 -18
- package/app/plugins/hermes/manifest.json +11 -0
- package/app/plugins/hermes/plugin.mjs +21718 -0
- package/app/plugins/kiro-cli/plugin.mjs +73 -18
- package/app/plugins/omp/plugin.mjs +73 -18
- package/app/plugins/opencode/plugin.mjs +97 -23
- package/app/plugins/pi/plugin.mjs +73 -18
- package/app/renderer-extension.js +957 -565
- package/bin/codexhost +0 -0
- package/libexec/codexhost-shim +0 -0
- package/libexec/codexhost-updater +0 -0
- package/licenses/opencodex-LICENSE.txt +21 -0
- package/package.json +1 -1
|
@@ -18,7 +18,8 @@
|
|
|
18
18
|
"antigravity",
|
|
19
19
|
"kiro-cli",
|
|
20
20
|
"codebuddy",
|
|
21
|
-
"cursor-cli"
|
|
21
|
+
"cursor-cli",
|
|
22
|
+
"hermes"
|
|
22
23
|
];
|
|
23
24
|
var DEFAULT_RENDERER_AGENTS = KNOWN_RENDERER_AGENTS;
|
|
24
25
|
function defaultIdFactory(sequence) {
|
|
@@ -119,14 +120,12 @@
|
|
|
119
120
|
this.#ownershipRequestGenerations.set(state, ++this.#ownershipRequestSequence);
|
|
120
121
|
return state;
|
|
121
122
|
}
|
|
122
|
-
restore(composer, agent, model, thinkingOptionId, permissionModeId
|
|
123
|
+
restore(composer, agent, model, thinkingOptionId, permissionModeId) {
|
|
123
124
|
if (!this.#enabledAgents.has(agent)) return null;
|
|
124
125
|
const state = this.#state(composer);
|
|
125
126
|
this.#pendingSubmissions.delete(state);
|
|
126
127
|
state.agent = agent;
|
|
127
128
|
state.phase = "locked";
|
|
128
|
-
if (agent === "codex" && codexAccountId) state.codexAccountId = codexAccountId;
|
|
129
|
-
else delete state.codexAccountId;
|
|
130
129
|
if (agent === "pi" && model) state.piModel = model;
|
|
131
130
|
else if (agent === "pi") delete state.piModel;
|
|
132
131
|
if (agent === "claude-code" && model) state.claudeModel = model;
|
|
@@ -147,6 +146,8 @@
|
|
|
147
146
|
else if (agent === "codebuddy") delete state.codeBuddyModel;
|
|
148
147
|
if (agent === "cursor-cli" && model) state.cursorCliModel = model;
|
|
149
148
|
else if (agent === "cursor-cli") delete state.cursorCliModel;
|
|
149
|
+
if (agent === "hermes" && model) state.hermesModel = model;
|
|
150
|
+
else if (agent === "hermes") delete state.hermesModel;
|
|
150
151
|
if (agent === "pi" && thinkingOptionId) state.piThinkingOptionId = thinkingOptionId;
|
|
151
152
|
else if (agent === "pi") delete state.piThinkingOptionId;
|
|
152
153
|
if (agent === "claude-code" && thinkingOptionId) {
|
|
@@ -180,7 +181,8 @@
|
|
|
180
181
|
"antigravity",
|
|
181
182
|
"kiro-cli",
|
|
182
183
|
"codebuddy",
|
|
183
|
-
"cursor-cli"
|
|
184
|
+
"cursor-cli",
|
|
185
|
+
"hermes"
|
|
184
186
|
]) {
|
|
185
187
|
const current = state.permissionModeByAgent?.[candidate];
|
|
186
188
|
if (candidate !== agent && current) permissionModeByAgent[candidate] = current;
|
|
@@ -206,6 +208,7 @@
|
|
|
206
208
|
if (agent === "kiro-cli") return state.kiroCliModel;
|
|
207
209
|
if (agent === "codebuddy") return state.codeBuddyModel;
|
|
208
210
|
if (agent === "cursor-cli") return state.cursorCliModel;
|
|
211
|
+
if (agent === "hermes") return state.hermesModel;
|
|
209
212
|
return void 0;
|
|
210
213
|
}
|
|
211
214
|
thinkingOptionForAgent(composer, agent) {
|
|
@@ -243,6 +246,8 @@
|
|
|
243
246
|
else if (agent === "kiro-cli") state.kiroCliModel = model;
|
|
244
247
|
else if (agent === "codebuddy") state.codeBuddyModel = model;
|
|
245
248
|
else if (agent === "cursor-cli") state.cursorCliModel = model;
|
|
249
|
+
else if (agent === "hermes") state.hermesModel = model;
|
|
250
|
+
else state.antigravityModel = model;
|
|
246
251
|
return state;
|
|
247
252
|
}
|
|
248
253
|
setPiConfiguration(composer, model, thinkingOptionId) {
|
|
@@ -310,13 +315,9 @@
|
|
|
310
315
|
clearPendingSubmission(composer) {
|
|
311
316
|
const state = this.#state(composer);
|
|
312
317
|
this.#pendingSubmissions.delete(state);
|
|
313
|
-
if (state.phase === "draft") delete state.codexAccountId;
|
|
314
318
|
}
|
|
315
|
-
recordSubmission(composer
|
|
319
|
+
recordSubmission(composer) {
|
|
316
320
|
const state = this.#state(composer);
|
|
317
|
-
if (state.agent === "codex" && state.phase === "draft" && !state.codexAccountId && codexAccountId) {
|
|
318
|
-
state.codexAccountId = codexAccountId;
|
|
319
|
-
}
|
|
320
321
|
this.#lastSubmittedAgent = state.agent;
|
|
321
322
|
return state;
|
|
322
323
|
}
|
|
@@ -15000,12 +15001,21 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15000
15001
|
plan: external_exports.string().trim().min(1).max(128).optional(),
|
|
15001
15002
|
credits: accountCreditsSnapshotSchema
|
|
15002
15003
|
}).strict();
|
|
15003
|
-
var
|
|
15004
|
+
var harnessAccountIdentityShape = {
|
|
15005
|
+
harnessId: harnessIdSchema,
|
|
15006
|
+
harnessName: external_exports.string().trim().min(1).max(128)
|
|
15007
|
+
};
|
|
15008
|
+
var harnessAccountSourceSchema = external_exports.object(harnessAccountIdentityShape).strict();
|
|
15009
|
+
var harnessAccountSourceListParamsSchema = external_exports.object({}).strict();
|
|
15010
|
+
var harnessAccountSourceListResultSchema = external_exports.object({ sources: external_exports.array(harnessAccountSourceSchema).max(128) }).strict();
|
|
15011
|
+
var harnessAccountInspectParamsSchema = external_exports.object({ harnessId: harnessIdSchema, refresh: external_exports.boolean().optional() }).strict();
|
|
15012
|
+
var harnessAccountInspectResultSchema = external_exports.object({
|
|
15013
|
+
...harnessAccountIdentityShape,
|
|
15014
|
+
account: harnessAccountSnapshotSchema.nullable()
|
|
15015
|
+
}).strict();
|
|
15016
|
+
var harnessAccountListParamsSchema = external_exports.object({ refresh: external_exports.boolean().optional() }).strict();
|
|
15004
15017
|
var harnessAccountListResultSchema = external_exports.object({
|
|
15005
|
-
accounts: external_exports.array(harnessAccountSnapshotSchema.extend(
|
|
15006
|
-
harnessId: harnessIdSchema,
|
|
15007
|
-
harnessName: external_exports.string().min(1)
|
|
15008
|
-
})).max(128)
|
|
15018
|
+
accounts: external_exports.array(harnessAccountSnapshotSchema.extend(harnessAccountIdentityShape)).max(128)
|
|
15009
15019
|
}).strict();
|
|
15010
15020
|
|
|
15011
15021
|
// ../shared-contracts/dist/json-value.js
|
|
@@ -15302,7 +15312,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15302
15312
|
}).strict();
|
|
15303
15313
|
var codexThreadInspectionSchema = external_exports.object({
|
|
15304
15314
|
owner: external_exports.literal("codex"),
|
|
15305
|
-
accountId: nonBlankTextSchema2.optional(),
|
|
15306
15315
|
locked: external_exports.literal(true)
|
|
15307
15316
|
}).strict();
|
|
15308
15317
|
var externalThreadInspectionSchema = external_exports.object({
|
|
@@ -15464,37 +15473,86 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15464
15473
|
accountId: accountIdSchema,
|
|
15465
15474
|
label: nonBlankTextSchema3.max(256),
|
|
15466
15475
|
email: external_exports.string().email().max(320).optional(),
|
|
15467
|
-
planType: codexAccountPlanTypeSchema.optional()
|
|
15468
|
-
|
|
15469
|
-
|
|
15470
|
-
|
|
15476
|
+
planType: codexAccountPlanTypeSchema.optional()
|
|
15477
|
+
}).strict();
|
|
15478
|
+
var codexAccountPhaseSchema = external_exports.enum(["ready", "changing", "unavailable"]);
|
|
15479
|
+
var codexAccountPendingOperationSchema = external_exports.object({
|
|
15480
|
+
operationId: nonBlankTextSchema3.max(1024),
|
|
15481
|
+
kind: external_exports.enum(["login", "switch", "logout", "recovery"])
|
|
15482
|
+
}).strict();
|
|
15483
|
+
var codexAccountCapabilitiesSchema = external_exports.object({
|
|
15484
|
+
manage: external_exports.boolean(),
|
|
15485
|
+
switch: external_exports.boolean(),
|
|
15486
|
+
login: external_exports.boolean(),
|
|
15487
|
+
delete: external_exports.boolean(),
|
|
15488
|
+
recover: external_exports.boolean().optional(),
|
|
15489
|
+
logout: external_exports.boolean().optional(),
|
|
15490
|
+
reason: external_exports.enum([
|
|
15491
|
+
"ssh-single-account",
|
|
15492
|
+
"unsupported-storage",
|
|
15493
|
+
"unsupported-version",
|
|
15494
|
+
"recovery-required",
|
|
15495
|
+
"keyring-unavailable",
|
|
15496
|
+
"migration-required"
|
|
15497
|
+
]).optional()
|
|
15498
|
+
}).strict();
|
|
15499
|
+
var codexAccountListResultSchema = external_exports.object({
|
|
15500
|
+
version: external_exports.literal(2),
|
|
15501
|
+
currentAccountId: accountIdSchema.nullable(),
|
|
15502
|
+
phase: codexAccountPhaseSchema,
|
|
15503
|
+
revision: external_exports.number().int().nonnegative(),
|
|
15504
|
+
instanceId: nonBlankTextSchema3.max(1024).optional(),
|
|
15505
|
+
cleanupRequired: external_exports.boolean().optional(),
|
|
15506
|
+
/** Credentials were adopted; other native homes/history remain unmerged. */
|
|
15507
|
+
legacyHistoryPreserved: external_exports.boolean().optional(),
|
|
15508
|
+
pendingOperation: codexAccountPendingOperationSchema.optional(),
|
|
15509
|
+
capabilities: codexAccountCapabilitiesSchema,
|
|
15510
|
+
accounts: external_exports.array(codexAccountSchema).max(128)
|
|
15471
15511
|
}).strict();
|
|
15472
|
-
var codexAccountListResultSchema = external_exports.object({ accounts: external_exports.array(codexAccountSchema).max(128) }).strict();
|
|
15473
|
-
var codexAccountCreateParamsSchema = external_exports.object({ label: nonBlankTextSchema3.max(256).optional() }).strict();
|
|
15474
15512
|
var codexAccountActivateParamsSchema = external_exports.object({ accountId: accountIdSchema }).strict();
|
|
15513
|
+
var codexAccountSwitchParamsSchema = external_exports.object({ accountId: accountIdSchema }).strict();
|
|
15514
|
+
var codexAccountReadyMutationResultShape = {
|
|
15515
|
+
phase: external_exports.literal("ready"),
|
|
15516
|
+
revision: external_exports.number().int().nonnegative()
|
|
15517
|
+
};
|
|
15518
|
+
var codexAccountSwitchResultSchema = external_exports.object({
|
|
15519
|
+
currentAccountId: accountIdSchema,
|
|
15520
|
+
...codexAccountReadyMutationResultShape
|
|
15521
|
+
}).strict();
|
|
15522
|
+
var codexAccountChangedSchema = codexAccountListResultSchema;
|
|
15475
15523
|
var codexAccountDeleteParamsSchema = external_exports.object({ accountId: accountIdSchema }).strict();
|
|
15476
15524
|
var codexAccountDeleteResultSchema = external_exports.object({ deletedAccountId: accountIdSchema }).strict();
|
|
15477
|
-
var
|
|
15478
|
-
var codexAccountLoginStartParamsSchema = external_exports.object({ accountId: accountIdSchema }).strict();
|
|
15525
|
+
var codexAccountLoginStartParamsSchema = external_exports.object({ accountId: accountIdSchema.optional() }).strict();
|
|
15479
15526
|
var codexAccountLoginStartResultSchema = external_exports.object({
|
|
15480
15527
|
accountId: accountIdSchema,
|
|
15481
15528
|
loginId: nonBlankTextSchema3.max(1024),
|
|
15482
15529
|
verificationUrl: external_exports.string().url().max(16384),
|
|
15483
15530
|
userCode: nonBlankTextSchema3.max(1024)
|
|
15484
15531
|
}).strict();
|
|
15485
|
-
var codexAccountLoginCancelParamsSchema = external_exports.object({
|
|
15532
|
+
var codexAccountLoginCancelParamsSchema = external_exports.object({ loginId: nonBlankTextSchema3.max(1024) }).strict();
|
|
15486
15533
|
var codexAccountLoginCancelResultSchema = external_exports.object({ cancelled: external_exports.boolean() }).strict();
|
|
15487
15534
|
var codexAccountLoginCompletedSchema = external_exports.object({
|
|
15488
15535
|
accountId: accountIdSchema,
|
|
15489
15536
|
loginId: nonBlankTextSchema3.max(1024),
|
|
15490
15537
|
success: external_exports.boolean(),
|
|
15491
|
-
error: external_exports.string().max(4096).nullable()
|
|
15538
|
+
error: external_exports.string().max(4096).nullable(),
|
|
15539
|
+
saved: external_exports.boolean().optional(),
|
|
15540
|
+
cleanupRequired: external_exports.boolean().optional()
|
|
15541
|
+
}).strict();
|
|
15542
|
+
var codexAccountLogoutParamsSchema = external_exports.object({}).strict();
|
|
15543
|
+
var codexAccountLogoutResultSchema = external_exports.object({
|
|
15544
|
+
currentAccountId: external_exports.null(),
|
|
15545
|
+
...codexAccountReadyMutationResultShape
|
|
15492
15546
|
}).strict();
|
|
15493
|
-
var
|
|
15547
|
+
var codexAccountRecoverParamsSchema = external_exports.object({}).strict();
|
|
15548
|
+
var codexAccountRecoverResultSchema = codexAccountListResultSchema;
|
|
15549
|
+
var codexAccountUsageParamsSchema = external_exports.object({ accountId: accountIdSchema, refresh: external_exports.boolean().optional() }).strict();
|
|
15494
15550
|
var codexAccountUsageResultSchema = external_exports.object({
|
|
15495
15551
|
accountId: accountIdSchema,
|
|
15496
15552
|
usage: threadUsageSnapshotSchema.nullable(),
|
|
15497
|
-
accountCredits: accountCreditsSnapshotSchema.optional()
|
|
15553
|
+
accountCredits: accountCreditsSnapshotSchema.optional(),
|
|
15554
|
+
freshness: external_exports.enum(["live", "cached"]),
|
|
15555
|
+
observedAt: external_exports.string().datetime().nullable()
|
|
15498
15556
|
}).strict();
|
|
15499
15557
|
var codexAccountResetCreditConsumeParamsSchema = external_exports.object({
|
|
15500
15558
|
accountId: accountIdSchema,
|
|
@@ -15863,6 +15921,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15863
15921
|
// src/assets/grok-agent.png
|
|
15864
15922
|
var grok_agent_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAAEk9JREFUeNrtnQdsHEUXx5fee40xnQiQ6b23IAiJAWHACV10AQHRRG8GDJgSOggEGAEBg6gGhAIBQknoppjeezGE3kybb3+je6f1fVdm93Z2Zy870iPmfN67mffmzSv/98bzLIxZZpml2ad2n7p86vWp36cBnwZ9UjlVpcHCWvUX1q6rsJbNnsvD/4ItPnX41Jcz0Rr1Fda4xSXGt/k0MWdO4sSat6XJ+FafpuaMSJ3gQWuSjG/yaUK+8M4RPGmyzfyxPk3LF9tZgjdjbTG/M1/gzFBn3Mzvzhc1c9QdF/N78sXMLPXkO386o5lnnllT3ZogP/OzRzPNNJOac8451bBhw0qFoDOKtZ8vasZ2Pv/uuOOOaoklltDCUPKesWH8/NzVyxjzfdapcePGqa222kr/XMFFbDIRgDzIkzGC4Yceeqg6/fTTKzG/GCwyCe/mi5ox5u+3337q4YcfVvPNN1851V9KrdUEII/tZ4z5e++9t/rmm2/UeuutV2v3F3MH1bJ6+cJmiPnt7e3q77//VieccIIp84XayglAntLNEPO33XZb9dtvv2nVP9tss5mo/iGp5HJgjnxxM8L8TTbZRKv9adOmqVVWWSXs7hdqCQpAR7642WD+hhtuqD777DPFOProo6MyH+oICkAO48oY8ydNmqTmmmuusKp/CLwsCOCcbgImLBg044wz6kUtpRlmmKH4npJwaqrMX3PNNdXHH3+smf/zzz+HsfqrUbNXQJw2dIQsyFx2zSKLLKKWWWYZtfrqq+uFFFpttdXUsssuqxZeeGE199xz6/cH/z4NgeBzV1hhBfX2228rGeecc04czIfavQLsuKESIsIwmI2RNGbMGHX++eere++9V73wwgvq888/Vz/88IP69ddf1e+//16kX375Rb+Omn3xxRf1+y+44AK1++67q1VXXVU/T55dh+oNxfyll15avfzyy0XmIwiLLbaY1mAxfEaXV8CeN8QZCS244IJq9OjR6tJLL1V9fX2aqeXGf//9p+nff/8tkrxWbvCcV155RV1++eVq1KhR+nPkM23NZ6mlllLPPfec/nz5fvvvv3+cn9nrFQoQMq3iUdXrrLOOuuiii9S77747hIn8/M8//9RNpc9855139Oet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";
|
|
15865
15923
|
|
|
15924
|
+
// src/assets/hermes-agent.png
|
|
15925
|
+
var hermes_agent_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAH4AAACACAYAAADNu93hAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAfqADAAQAAAABAAAAgAAAAADXkvl6AAApwUlEQVR4Ae2dB5xV1Z3HGXoHRQTpVUAUERXBCIJYYmzR1USTGLElMW2jqRtjLImpuzFmo4muGk3U2I0aE2tQUAGxooJIG3oHBYGh7/c7vjPeub5y35v3ZsDw+3y+3nbuaf9yznszg/Xq7dbuGdg9A7tnYPcM7J6B3TPwcZyBso/joLKMqSHPmqVoxNHxb4MKWA+b4d9CH1fDa9xe0Af6Qm/oBh1hT2gOOkEw/EbO18AymAPT4U2YAUtA5/hY6eNgeI28N2jcgTAEDoD+0AIKlcZeDVNgAjwDb4CZYZfXrmh4I7UddIZ9oClsB6N2A5i2d4BG7wBG/CDQIbpAEyhE1msGeBIehpfB9nZJ7SqGb8Ds7gEaug24Fi8HU7MGTyKd5RA4DY6HrlCodIJX4S74GywEnW+X0c5u+MbMZCfQSEa2E74F6oPPTMdrwZS8EpI4ge+69n8BPg/uBWoi9wR/hdvAc/u002unNHxbtG3bttFbt249YuPGjRretC5GrSncdB+kI6yDxfAGPAP/glmQTY7dJeCbYBZoCzXRXF6+AW4FM9Fu5TEDrSl7dllZ2ZQGDRpsBdfqfDHlOvG/hAPBZSKbXDougGmQb1vpyj9HPSeCnxx2K8cMaPCxMBnSTWah9xZQ38/A1J5Npv/RMA4KbSv63rvUczW4J9mtNDPgun0GTIToxBXz3AzwInwWckWhm7+HYCsUow+PUM9g2CmXVPpV63KNHgruiN0MFWOSc9Vh+v85dINsOoiHD0Cx+uXuX4dyzP+20vPbw1XgLjyXsYr9fBNt3g0aN5t0ykehWO270TwaGsG/nfz4dSxMgmJNaKH1PEkfRkA2jeHhBCi0jWrv1a9ffyGbVTd9zsO/jfzyxSj3M3e1CanD62doexRkkhu+s2AF5NVnPpX4BZO4v6h8F8PvwPBPcK3D1XnkN6ATpZT17w9/gPOh0K9LebVgbU0Zwgo0phs3DdILusAcWABxabBycHNm2XzWaN+dS7vbGjZsWH/79u0Nd+zYUQY6kRHvt44udfajTlRKw2vkk+BmcM2sbWlwN2iOcQn4Ecsvf/z2bzb4LZ9GbQvTQWPEZdTOg8OgI+TanQdD2qbjfxVj245fMPl9gXW4d+gGC8H7Okmtq1SGb8lILoJrGzVq1LF58+Y7+BZOj087QAxUjzS4jedGZKHyG7z3wI+IGkgDu5M3wpvBFFgFfUBjvAYadjgor9+vPKv+n0VcGqV+GeT3Ddmk4XUy51Un0/jjYT04eDe2tv0ncKc/H+xnrasUhtezL4MrMXhZ69att2/YsKEBhs80uG2sf4t52ATD12Tt0/BO5BwwhVvXGtD47jHKYRwojfwrmAn+CPdgWA2vg1kirre5MRh6QbY+1ue5708HnX9v0OCPg6m9E+iUN4Nl7edSyDg5PCuJim14o+3X8DWYRSS/u379+r2M9mjvjXBBTtI8DL4KTH9Gvoe8RF07UmvpBl70SxPVHZx8I1ZDz4K/wU3wGOgkM0ADjISOoNPMhbg2ccNsYnYwaoPe5USjuf6HMZpddDjr0uF6wTx4ASxv9ngYtkN/MN1btw5Sa8p/ljN3TaNfBV8BB7mKH7QMIdXXY3OzrXHjxlu5bkh012vatOn2VAYw9ToJo8C0uAUDrqacaXIzBjUtOlG5tAXHcVIdzwIwoo6DVuCE3gI65FIwtWpIDdQPnHjb+CSYkl9JHTlU03yu+oPv2FelwV4Cs5x9DjLSXwM/xUwDs9E9qXP75z0d7QSwPzqGZWpN9YvUkhPxrRQacjaMwnCzMOI6jDJr82aX03qm9RUY3fXcSTH6OoBrp9G/bMuWLaZEJ2EJZco5VsksgWPs8BhTA8oaeRp2ILwDTrSNek/i2ocb34DT4UWYCkfBCEgn678DNFKQfS+HV0GnCbKDY2AS2MYX4W2w3P1gWR3lVDCLuO8wa9SaimF4O3wyXAVOzGQ40yPGqMDwb3Fu5FmuHKMvxLhO4j9hIhwPSmPPBKPHlO0Ee6wS9RnZq7gRvb/dLIJce3Um2+oKGv4v8Ad4HOKpVOM0hdPA8hqpNxwNOkU66SATwHaCTOe3gak9Kp35QDCb2HZo36NzYRvN4RQYCi5LtaYGNWzJydsP7gI9+Tq4FuaDUbcXuFMeDGvgORgGGvUSuBDcWCmN+SYMgeXwJHSDLhBkpjAjmGLbpW5qhPLU9SKOT4Ptu9wsgcXg/bh0lL5wGGikcXADrIBt4HtxbeeGWaQnbAQd2H7fCjqy6d1otj7H61zoLL4T5Jx1hFFwBDg+3ymHpWAbJZeeVxM5wF/AQ3AZ3AuG3z/gZHgGLmSdX0+kj8NoTpiTcA3odGeAcqKXgfc0iBOgIdQT0AGcoM7gZFtWo6mt1Kux2oPr9XXQBCrA7GC5PmA2UW3YY7StqKgYyLnOsxoOBddq+98WrEt0wLgs93sws+nU1mF/jOQt4FxsSl3roPa3KdgnnVSjH0iW2sHeJxh5NPdehrfgXSi5amJ4DWSamgo/hlFQDo/ACDBiR7NLL2vSpMlU0vs8rk+Cx8EJPhOehSPBSSuHPUHHcAKmQ3O4D4KaceLEfQqOA99bAE/DeLBuI1XnU3NgCPwvtACNtnbTpk0jOW5gr6DDtYT6OM/RHHU4+9QY7Es6w2sYDfYd0KiPguU0+olwBkyBv8CL4Fx8El6FF2AYHIfNvdYxbUfHPgxs2/vWu1OqjF51BQdvlO4DnUHpEIfA76ACnJjvwVTQSEPB8mYEo0Aj3g8a502YCMdCL7gINHZUtm39f4WxoCN4z36k037cvBt0Eo32PNjOUgz/EiwEn20iCldyPi9V5nMcMwXGvjzTiXxvHVwJjqkfTAIdwyXAsSyC9+HrcDmcSDDMpJ2nOL8FfN96ZsP5oIOWXJkmK1fDRoTRbpSZKruBHVcOwoF3h0fAidwDxsCl4IAPhoWwBGbCfeBEWv5amAGdQAeYAysgqm1cLIMHwYlTtptOa7ipc+gsRlfrFKb0tWCGaQd+1NTJ2hD9jsc0/UrqyKGadKADoD+0guFgnzaBc9obrL8L+Nz5sh9NwKXJ+g+HVyGUacP5YtAprT/TeHhUcxVieKNLow6Gv4ODcPKDATit3KxM5qhTNIf28Gt4IHU9hOMEcLKUg1wPK2ErKNPfidAU5oLtOoEejUSNuRGi7XJZOfG+49iMHsv6ntHYE3wmLgemZ9vT4I0wiF8rW78yYjWCjheX/dWww0Cnti0zlH3WkT3fC0JdnNbrAU/CkfAG6Dg6RTl0BvuoE06DeRDmhtPiK1Mqy9aSqfw4MHU7eQ7wZVChPidT7+4P4+ApcDJ6g4P9HDwH88FyGkhGwCiYDdbvBJ8P/wGmUq91ECNxIvhsAjwDTpjGMLXbxxXgZO4Pe0MFOLHeqxTp1vsa3+8BPrj54X/tb1+w7x95yD0dexn0BA3cmfraUY9z8DbY33YQ1JoT56N+6oZO7nU56MA6n30dBC+CfU3XLrdrrmCofGpqzwC/QFr8BZ/RO/Gig98OTujhMAXssA6xHNR1MIa17Vu842QfA3fDXNBQpki9/Azw3VlgdDSjLSffz+/NOQYZWdZzGHwWlsKjYD2fhPvBSNXYTqTZybIaqEopI2Wag/YU3Bc0yIaqlz480WlngPXrtPWorymHI+B2WAV7QrRNx/0gHAzTQefQwRaDAWG61/gGiEuNTlkSNciz1kaUP52PZ+dyfJ2dqZ006oaCOhWeB+sdDU7cJ+CrYBpdzdFBD4AucAB0gNagIT06UUZud76lM/26JupEUWmMzqCz2aeW0CN1br3W4XMjymemYyc4n/EamcvgSXgf4tLZ+4Dj0WhBGn8B+I5j8jpI510IHcEyPVLn5RydB8di38tBx9gCJVEmb8/UmBN9BlHr16ZOyqXg5Bqha2EsvAOuT6fA0RDkIPRwjR2VA9XgEqSBOtKOKfgNzs0s0b5qlMoo4xikgfuCS4dGtowTb1Qq+2S9+Ugnsl9LUy/5vk6pkZQZy3E7rqiGcWFk6+BGcVSHcqFRe8IicP5swwi3731gIDhmlzwdrOhycpLKsr1hOJH+OkbRax2YBn0ORoIe/X04BIZAVHpzPwiTFn2W9txo58Ea0MlySac0M9gH+2aabQbtUsdNHPOVfdWhXMKuB8f5GrwMT0NXWA8uT1F15sJIXwgV0Qec6yQa0+MK0CGtR8N7bp+d1/3BMZVE+Ri+IT0YDXZmEpwGys6ugqFeIL3WCXPio/I9PdkJSSqdxUmalvQFyplBnLyQfl2rdQT7n6+MbqP+YjgXhqWuHYMO8S4shc0Q12BuvAPOTVzdubEWrMMloTXfJrbw2zzOVR8YBM5lSZSv4Y+hF0ahxjBl2dElYEp1or12QL0gnfJpz/c1oJNjlBUqjWS6LSR6QvYYz/sTwehW8+Fb4FgzOZURuw7MWMGgnFaqG//dAEZ9ZaSXldXbkx9db2cJtUAn9jca3nL5Lk++n1P5GMKUeRAshgMhRKPpbD8IastJ93BRw6OGN3OUg2mxtuX8nA2O+aswBcxws8Fo/CkMgXTG0eFcp2dBfJnx3RbQkN9SaoOxy/iBZTPUOGX4Zo0bNxyAI2j8QhyW17IrqeEd2L6gd28EO6SM/NXQ0wuku2p4B1YM2T8ziVnmuWJUWEAdR/DOnfAZ0FjqAHCsD4GG1RnSSaeYA85ZXO4DnLtWRHd9fohVGeqk+8pyZWUNOpD+D+EPh4s1l9Xaz8fwRnV9OqkDuIYrDW/H9vCiRLJuI+cJyDTBJWq6qtqZnBl5LhkGgZtIU70G/Qb8BOZBPKX34J4GXQ7xvjuubfyCSkjv9fjhURkflSt/0YSNbet27doNIyO0plzRldTwlnOnWY/dvCksyEjsAUnrCe/lczSD9IPXYGo+LxapbDn1/B5cs7tAkBuwq+Am0Di/ArNSNK3rJD3hJaiAqHSIlkT6Oj8e+wAn0PD1TPfcb9i+ffv9yQC+39DnxVRSg1muqw3jiVXt08EmdKxH1Y3SnLjOO8n24Z7SNJGx1s08uR2OglHQHOIyZV8C3wHLu6GLynT/FkQdIjxvz/xtxPBmTo1daXTTvb+qRgZoyRwP5JHZpqhyMpPIcn4sqiacwL8Q0TBJ5QBXghOUj9xbHARPQj4f7fJpI11ZP6oNg6PBNG+/y2ESjIcJGOZ1vop+j/MeMAZcBqIyS5jmF6SO0Wct+V2FhkZ4kMZnOa2MrnXr1ukIB3br1q3o63xSw7uDT+ft1TJA6HyWo4ZfDu6O85GTeSQsgVuhMkI4llp+3DoK9sAA/gr3ao5buHafo0MMh14ar3HjRh+mQm5G5Bwbta/AR9I9gePmrmr9N93jSJWRr+E5Hwh1FvG6ZFInoWhGuVZpxPFg5CeV+wp30vJPMOJqQzp85bgxUBnR2JFjX+7tCRrDjNeKPxhpsXnzlmzzo5NMh4+ke74FbYFhq6LeiDfVq/fff989Vfe1a9faXlGVrbPRhvTmYkWZH4lcNn4bbSDBuSnzdFgIf4T3IYnsuxGVKSKT1FHTMr2owGViMVRFt5XyK2n+PMJf/fKyMoMG47PG+7w9/wBUDx4ltZXV5FTSyrZSk980FUMuGUeC6/VdeVTYkrJHgNEzER6DJPKbMzdXi5IULlEZM10f8JNJRbQNDY5xP1zkeajhXffJBm7y/NOy3txuEH2vpudJK7Pjx0H/mjbI+w7SNKlBfgambweWRH60G85Hnr1Jh8uZmL259hvFbDIzvA6uzd2yFSzxM+d6HOi41TbEIdoj7WP3DwzP+q8DzMMZDBQDsCjSoElkmn8nScGEZYzez8PdcAFcA6eBsi03cTO8QCNAZ5kHD8HjRMirHNeDBr0O2kBcIbWHd81YZoy60gAaDt/d78G5/UorI13DKz/WoX6QNEgtn1NJDa+nvZSztuQFHJXRexZcCufBeOgKRoWG7QG/gaVwA9ycOudQ+YWGhn0YFkIXcFKNbjdQOo/Pw2S5tu4DM8FJNMP0AjdNSZc7itZILnGdYUbq2DRbbRpfmfbZ/PXg1GDR2YuijF4Xq91y3eEFcAILkZsa19kXwZ35ZNBoa0EjReWS8iswJf4IZjL4YaT3vtCYTY/OIBp0AVhHPmpMYT9i/QDcMNaW8R23Tv1V0PFzyshnzH7JY7Zyj/CBR+R8M3uBpBGvYZbBo3BBrEqfJXGgdyn3W7gejMpM0ghG6u3wNLRk4F8hAg5iLRxIBLTnnhloFRg9E2ECvAVJd/rmz1kwG7ZAE6gNDaGRh2EjJDK86z9GNwD8GDkVimJ4JzipbHAlnAWNIi85iXYoXSbwmR7+33ATuBF7D5ZDJulIK0BDtiTSx3DsxwQcBX04dxJagRu7ATAKDgejeB6Y8pPIMbjRGg7R8SR5t9Aypmud2bmSfOZ/BuV1cDNnjZVPw8EgHWn10EjL3n8WmsOekfueLoDPgF4+F9aDu/gKWA3ZZBbZjrFdC88ADf0AOHk6UJBj6ACjYAxsgrch1wSZ7TS8TpNvxNt39wtilvG7iaTOs5Cyzsv+kE+7OvT9YIaqsfJd25zUn4G76SAn3si7OdyIHE1nI1PXtuW6/Br0BqM3m3Qos0xz1rk1HL8H/4IeEJVZRQO8CUPgargUPgF7QaYxhvo9JpVGuwJ0mINhBAyC4fBHyOXMFKn8NW+j17nMR/0pbKYrijRavtLDX4LjoA0YmR7/DHrlQRDUCKN1I13PJ3KN/LPAjzKmf98xA1RAJtk/vxadw3EcONljwLQe5LLhpH8fVoIRrCG8r0O4tOhAcTXkhuXcNCWJPOv7NtwCOvQosC2zzXS4FxyLGa01ZJLv/h3cXLaDTI7Jo2oy05k5F0E+zlqtkppe2FnT/VSwE262HoN9QAN5rxJ+fWgHmHZDuU2cPw1HQz/IJY3vuq6cVN+tqp/zufBFUEbFPTjanzh29EYWWeePYC1E68t0voVys+FlWBN7Rwe7Dx4Hoz5THeH+TylzB+j44V6S40WUT7qkULQ0MtK7wu2wDTbAWOgMemZ0IEadS8QvUvctb5QcC7mk4fV21QmugVC3DjcJzARGz3ng82FgRGeT6/IVYAYL9dXW8Sna/AEkcZJon/6Pd0IQcFq4nNSayGjRyK+ARjkFHJQd3AKDoSlY7iYwFZ8Aeq0D+hvMgmzSQEav6dh0+yqsAJ3HCLs6dX4+RzPOjfBm6h6HjGrOk1HwCcjlJBQpqlzuHLsO2gYMoiRyzswUZs0aqRgD3koPNP6jYOSZvjXwtTAATgeXBo09GYx+1+gloBFzyfplOPQF69ZZ5oHr64WwJ1j3/TAfnKBcsg86VTHmIFdb8ecavj28BcGp42XSXffhZhcwkJKMMV0dlfeKOWgj8MUUGtlNjBOrbMeMYFrVaKare2EZ5FIFBcpBR3GSuoOp34zyNoyHRWDatA9JZR+sp6ZZL2l78XKHc2MKeGwSf5jh2uywH8wAg2GnlEZy/dUzTU1/Byf6RHgcjNa6lBN4D9i/umA57V4AC/Js/1eUd/mskYoZ8fGOGFGmYFW/UaOGffijAT8KuQm8EpJEO8VKJjOS1JVM9eIm12PSqD+MsjXOUq69pZD1muZbpypfjdGv4bwc3Pi9AHUtnTI4Zl31ZSgNm+5dzpJqAAXNlkk3hGnrLZXh7ZRGbw6mUb9A8fp/4HnYGbQzGN7oXQz5GH4vyu8HNYr6UhneTplGg+Hd1M2Fuk7vdKFSbj73hrpM9XbEfZBLopvTpJs1g6rG6b5UhrdeJ1UHcEDlYOT7EWpnkJtMJ91jXUoj9oFp4AY4qQ6lYI32Z6UyvAYP66cfu+ZAOQwH5fPusD+Uqg9UnVF+y+c6aeTXWH4t3aRJ43T/uHKSugdRaDZsTlI4VWYgR+e34HW+VJNuva5FyvV9OejVRryd9vO2X+T0ADc4ta2wo86r3fB7cOElfxGyTZs2O/jDRn5ZYnvG/wNHKJ/huC/3nYt8DN+J8m7yCrZfjdIFDWeSEW1UKQ3vGr8RngMNrZdPhX+Am77a1t40aMQnlkbn79d38KfLO/iNoDLgh4Y7yvid93r8QUVZ+B25bBXyw6Pt/DZN3FhGrp/LDQ6DxbnLJetwHp+FfL60qqq3lIZ3coM0vtL4fnw5BpaCg30XalOmR9d3oz6xMHKlgf1T5tRLZRgx8fsWxHnWQTPqiu51rG8fmA99IYnhKVb5MwY/IuezN/C9SsW9L9yv6TEa8Q7MnWuQs7UK8oq48HIRji2oowv4fXne0tiBfF/m9wVXYHTTegiEUEU/TuaB+6GkOoiCBldwxKTvVZYrleHdNIVUb1aJRpfP/M55AdSFTK2ukVFnLFk/YvsCDb4W4obvyT2zX9KPdBStDJzBHJNmCN+pUikMrwcaVVHD9+JaBzDF2VlTW22neJqsVFjfC4qUUEnSo//CBfuBUFwjpTO8jmgmzGeDZ50joaDluqpH1lIkWacRHTZtRngf6AyqCWh8Nyfe0ylCWU5LLpeY6P6jpA36L1ywqQttOBfpDG+g+J2CwZBu45DuHkUrf+fP+cxbpTK80d481Rsjy/R6COjR75D+erZq1epaPgYdykeirtw7Bz4DBQ2C9/KRRo8uPfm8m3dZPgD4/5T1yyul4d2MhWvvBemQKyGdkWemnsXf8yOdQZW3HfN+gUZySff2Y4mDDNIJjklduMG5jb/9HsAO+RLOr+T+b+Ev8CgcC6YvHabY6diPTe7ok27s/Bi6BtIZg9u5xf9wazNjDJs250TnjxvQikz3qyFTW34aij9zXodB3um+VIaP79jdSLkedQUHPpXJmMbuuDXHOVxfDlfDMtARHoGLocY/d6aOqFyC3NFXfVUb23xFy3r+BswA+1yQGKN/G6DBNLbznSninRsdLb7x41blkvg8x41exHQU13kbPu8XYo2mu7ROoyoqI9cN3SlwHVTAC3AHX3x05/g3UKb6Q8FU/CJYrphyyTEbVS26GCVT/UaphrffBYvxbcG5bCQ4cTrDWr/9clefrkOtuG82mAyjoar/nLtXcmndAIlViojX8Okmyyg7CxyEn+Mngh78FrQFJ8bJ1uAPwiJINwncLlhOrpOURLZvejXVF9wPPrtvBh041JFp+XKD67NQjtNq6s7VXRDPPp25NwjyCuJSGF5vdL2Ky471h1NB75wOF8KJMBB8bjTEB8atokmjJzW8/ZsKGi1TlPIou1xKIMyz9YTz+ItmO9dsnT+d8Q/g/hOwOPZcZxkJdW541/MOkE569fngx5e34TcwHly/XN9KLVO95JLG1ujvgP3SGAWJpWQz6T44jvUaGJmi3u85DIp0hu/GfT/uafz4Fz2Hc69ODe+A3EC5RqeTndsfzgQnw3T6MtSGjCj7pfPl0nwKvA5O9DqITzS3Esv3g+E1qvOTKert2yZIZ3gzlRnBZXAzRGXGNOVncqho2crzTB2IF3R9jm4o4s/DtQ3vDdkm12dfSpXjUGsyy2h4Jy+XplFAlMYvOOJ51yjX4Z0bDe9HyUxz6f5HowZH4bRK2sC5nQTlEHUO63QpyFQvj6orl+HtrBu1oRBtqHotH15ZXycwujLJzvUF1/falJNqmm+Uo1GN8wbMSZVzcxePsNSjRAffdeMaDO9GNtO865yZ2rIOg2Y9uLuPZ6GDuVc0wxsdX4dySOeF3K4mB9St2p30Fxrhi9An/eOS3DXFOukaIJvm8lDDr0sVWsDRTx+FyGgPEe/77n90vkyG17iZNncaVae1/34Ujhv+QO4lXuczdYA6Kn+gMpajxgnez2lW2bl9s5b44KGdd03SqWpLGj7bEhT68TYnokyvw0GHKUSreMlMyca+zN/U6cHRqM7kfDpGEumY8eXHebe/iZTJ8HasI3wXwiQkqdD6kkaxE3AaDEtScRHKaPRchjeNupsvBw1+A1wGLneFaCkvmd3435fyfzDetm0PdvmZ5tz6NXwm45txQzZYyLl7j+jyq71cZq1fJ3fdz+RgGVOOKeNY8GPZMkgiGzGNdU9SOFXGzcrFkGvdzaPKjEWNhlwR8Q5llsBFcCd8DrLtV3icVat56pw09F8m958ozSayQRN+aNWOMunWal/WMdVaiBveQHLuNXwFjIaMmSqT92n4EZCPrKsnaMykclKPgbFJX6hBOSMp147eifpPuAJ6gJoPiyCeWn2WTcEw2VJ7/H3/BZH23ExneI2uwY1yo9/v/+PqxQ3toJPY/tfAfcNHZKF00vB9wSi2I0lkZw8F381HpqQr4RxI8q5l7NMB8Ck4G46AxpBNvpduQqPv6LgDQSfR0OPhVLgZ1kA+WkBhM6aGTyR/buA/apyhsIZ0w6nhtYvE1YMbwaYTOTeoRsJH6sw00UaGk+sLAyCJGlFoTJKCacq4ht4AGvFxcDPpxDsI07NZpDP0gG6pcx0meLOTcjdcBYshndJNVLpy3psFN8HtYLQ7B+shqYxGjdQHdKJiyP2CHzWVdTov8TG5zgfD+0nEcXwHXoBE34x2oeA8MKVoBDcN2WRjB8F7oEfWBQ7MdTnTUnMuzxxTtr7Z/9tgMJRBkJnsdcj2btUz1un1sJy0bcqtul/Dc50wOJFZaWWa+p7iXjTDXMy1DjscgkNwGruovPPBfzS4cvAa/SteZJFr9Zch3a7Zuuxkvmskr+QlB2zqvwzSreVueCSTNPr1YIS8BhosyMiZD4nGwK9bOR/tSd25lp9Qf5KjG89gl/04D04Qfdf5jxp4WerhsRzNyFWKFgo3Tf9+HHAilIP4OpzhRRpZ/tMwNs0zb7kheQRCp71XKtnv/4CL0jTgeMKY0jyufDaTByvSPHSeQuSmeVz9VkVFRQN+FFv9Zs2vplGFS4gaBc57XN6LZir3Jfb7SMhpeA1tupwNQXtwcjNcDX3AtdWK9gGd4g/ge3EZYc/DQkj3PF6+GNf26XwYFKtsMdeSSb53CMSXNT+OXQ5HQKIIdpNWZJmuQ8TvxfnRUM2QqfYMrmjjIdj25b42rFK6iPdFd6Pjq0p9cOIXET+El+EleDF1vIajkZZOpvjrwDWpNtWbxk6D6NJjH6PX8f44kSfAmdAWjJ4BcAucB9Umjuva1BwaWwAa8lToCtHI5rJSm/lv1PDazHI6i46dVUam69zhsASsqBDe5T3r0ejLY3U4AHe9ZoRC6k7yjg56EjjwMfAM2G6ud+2XaXUKuEbmKl8bz2+gH2ZZnfcVMOWna/cx7reAILOxu3vH7RxUKV3EO1HtwHT/m6qS+Z2Ymv4MN8Lp0B6i0jOnwprozSKfD6I+De96/3M4EtJFCberqSVXRvoh4BzUtTSau3U3lhrSjV06u3G78lfaLB/ksmxZx63jZJXrmLv4f4KpUS9K512Z7r1PeR1GzzPa50O8rFF1J6xO8yxetibXertYxyq4Fe6DTVCTemvzXbNPZxgJK3L0+5c8DwZuwPnT4C7T/n4KskoPGQym6gugAzwJuQarpy2C88A63BTdCvH3LLcYrobaMoDro8uO6/RZ8DbE+7WzXv+Qvpq9poNzl62fZrdGoHpDWKrNFiO8mUumu2dgJRwPepEdmAPxhu2ME2uU9wVltH8bgrdF33Fd15H+C6L3S3Vun81gzUF1g5sgXd9K1YdC69VBPwuTINO6Hup2PKPBSFc6wQbwuZm1H+SUXvNF8CWN/yVQrUBH0Al+Cd+HE6EjBGn0/4TQaOhYONqJ78L1EO6V6hiM3oy2ovLj0AQoVbvFqvc1+jgPkjip5bqAagLjIbznfsoMnEimxWfBQZgqHoIjIJPKeKADaFDLpxv8du5Pg6GgF6crU6x786n/G6AjKiMhRINHPxa9AsVqr67ruZexhKxmMLrXCn36M+dx5+dWerlOu7N1PQ4VaNBxcAl8AnqnGMnxSpgJoWy643s8vwIOhrWQrkwx7rmRM723BL3/JPD7hJMhyPGNATdAudJoMfpU6jrOYxxm6qapMYVot91zUs84JJORYWpfDuk6rle5QzeS0z2P3rMjU6Ar6DjRZzU5t20/Fr4OZqhrYTRoWHUcPAU+Pxvi2pcbvwfrqEk/6vLdRfS9B5SBDrABQn8M3J7gs7yk8U3xTlyorJCjzmPE+SnhuRrWFW3faLW+ARAGp+ebkUaA7bkEuS9xGbJcXG24cT68BdG6d5Xz39FvI70LuCGMBqKB4LOC5IQ6eVZSSIr2o+HFYNo9FTZDMSfVDehPwX7qqMNgNpiN/gGnwEHwW3BD6hKQTvtx82pw8lzW8umjH03fA8cqK2ApLAOzyXrQSfOpM0lZl7X9wQx3I0TnNvqMRx/KSUoq0/oT8Fjqhc4cW6XOMx30vLlwGRhtRt+voRcUU25qrHtWCp3Tyd4DWoAZ61BQfcHnGjcujfUOtIcDQEdNJ51Cx3oWJsBUMN36icUxO/k6nVmuHHxu2b/C3WCG0iGMxLYQliVO85bO/ACcDpdCNLp/wfXDsBWKIiOrE3webgUHrHfPh3JwoPfARdANlE5yOSTx4kLKGHEOUqOp1vBjcGI0/HfhFXD9uxcGQlRO/gh4BKzLPujsGkkDev0W/Bys7xOp81c5boTQZ6N+IcwA29MxXoA3YU7q+nscdX6NZF23go4S6kh6dJ73gkHg3Ot04d3nOQ9zwWnxZUQ5WddCM9DATSAqI/JL4KSHjoXjeu7NSnM/PM/nqPP9EIKGcnIT6IANoUvq3InfD4KcvG+C0W57RqwROhZ+Ag/C+WAGaQ3fAvscUrcOcTUcDd3BMs6BARLk3PSFL8DtoMP8BuyT5Y6CyWA2STJmnW0MdIUpEPriu87DIaAzl0x6rVH1LpwLDSDIATkwoyQaFWFg3nsKHodwr6ZHo8DIVRr7EngD7ofjIKpGXFjWZzqgbRup3waN9Gn4MnQA5UT/CyrAsmaCy6AzRI3MZU5Z/50wEwwKg2MfsC+h/mxzYR9t9xnYCqGsdjgRHHtJZQMngA3bgefg9/Br+CvMhdCp+NH0dA6ESIs/L+RaZ7oXWqT4Ksdb4CQwEpUGNyLs5yKwncWgAw8A3z0MDofGKS7mGMpa/hX4FOj4hcq503FcHm4Hg6QN3A3ZjP+/PLf/k2AbhHlawnmtGJ12KmVn/wmhA0mOayj/TTCKTK1J3klaRoc6BozCJqChlQY9Gm6DZWB9Hm8ElwXLNYPuYJT7vtc/gRUQ2n+S8yEQzW5cFqwLeXM1TIGDwbXZNuLzYmCZEYz2BRBd01/k2jGUNL1TfzXZ2ECYBmFysh318O9DK9Djs5Ut5JkTdjloaKVjngwPganQOk3tD8IoMKqV6bYHdATluC4F18zQjwc47w86RTE1lspWwWw4AgbAmxCNaOdtMugAoT8bODdT6Sx1IidiX3gYNkHoWPS4hfsvw6mgjKpnIFqmWOf3Uu9I+DwYPe9DqNt1/BvQDoI0vv3vBSGSD+dcQ4T37uK8D5RKF1GxkW+bB8FnYSWE9uPHx3k2GkJ/Oa07OYF67E/A6HgCHoE/wOdgT1Cm1aMgbKrig6rptYZ2OTH6Q13rOL8bhoHRHKTT9ga/CGkGXncD+xwizrH0hVLrxzSwFozs7nAHbIQwBtP7Y/BpcI+wy2kPevxHCAOq6VEDmSoXROr0/HrQ2OPgTGgLcXXkxoGwNzQAl63/gVDXPzjfD3SIUsvAuRlM4fbhOFgMzo+p/hwwaHZJOblDIVsay8cRXPMmwrnwL/Bd0+WFYBQfCZ0gnVpy82AYkHrYl390+Hf8FcwKrq1nPJh2oxmCy5KqA7U/BxraTw6mdMd4JbhZ3WVluter8zFuprKmvpfgePgOuI8wVX4T3KwZpZkitRnPToHToRUolyP3ALY3D1y26iKljqDdJXAjXAEuW2aiTGPhUXLVpheHXumxR4GbrmJoFpWYEtvApWBkuJn7C5gug8NwWk1NuTobjgFTuuu/y4Apvzu4yboJdCrrrG1NoEHbHwQ6gM7svmWXlCl+MMyEYJB8jhW8p0E0kpHu2vdfcAJovE3wBPSDbNLoXwaNegmENdNJvh+sx41dN6hL9aLxSWAWcnzDoS6ClWYLlx3WIM9DPsa2rN5+H5wMDv4K8N4dcBK8BUal66KOlU1NeHge6HwPget30Imc6AyTwaWjrmWgjIX+cAi0gF1KrpF2/BVIanQj2g3WnfBJcOftzlrn+Tu8DT+A18E6p8KRkE3umE3v08Gs8SMw+pWO+TVYBn+CHvCxVVE2Cglmxwk/HFxPXXdttyWYYo1UPVvn2AZGsrvZhaAxjUzlRkzj6PXH84//b+a4kX9QSGNrrHFgWsymLjzU8ENgMjwM74CybrPJSHgZrG8L7NbuGfj4zMD/A1DD7XafOaXCAAAAAElFTkSuQmCC";
|
|
15926
|
+
|
|
15866
15927
|
// src/assets/antigravity-agent.svg
|
|
15867
15928
|
var antigravity_agent_default = 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -1 28 28"><path d="M21.751 22.607c1.34 1.005 3.35.335 1.508-1.508C17.73 15.74 18.904 1 12.037 1 5.17 1 6.342 15.74.815 21.1c-2.01 2.009.167 2.511 1.507 1.506 5.192-3.517 4.857-9.714 9.715-9.714 4.857 0 4.522 6.197 9.714 9.715z" fill="url(%23ag)"/><defs><linearGradient id="ag" x1="2" y1="12" x2="22" y2="12" gradientUnits="userSpaceOnUse"><stop stop-color="%234285F4"/><stop offset=".33" stop-color="%23EA4335"/><stop offset=".66" stop-color="%23FBBC04"/><stop offset="1" stop-color="%2334A853"/></linearGradient></defs></svg>%0A';
|
|
15868
15929
|
|
|
@@ -15893,7 +15954,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15893
15954
|
antigravity: "Antigravity CLI",
|
|
15894
15955
|
"kiro-cli": "Kiro CLI",
|
|
15895
15956
|
codebuddy: "CodeBuddy",
|
|
15896
|
-
"cursor-cli": "Cursor CLI (Experimental)"
|
|
15957
|
+
"cursor-cli": "Cursor CLI (Experimental)",
|
|
15958
|
+
hermes: "Hermes"
|
|
15897
15959
|
};
|
|
15898
15960
|
var PI_PATHS = [
|
|
15899
15961
|
{
|
|
@@ -15980,6 +16042,21 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15980
16042
|
image.style.flex = "none";
|
|
15981
16043
|
return image;
|
|
15982
16044
|
}
|
|
16045
|
+
if (agent === "hermes") {
|
|
16046
|
+
const image = ownerDocument.createElement("img");
|
|
16047
|
+
image.src = hermes_agent_default;
|
|
16048
|
+
image.alt = "";
|
|
16049
|
+
image.draggable = false;
|
|
16050
|
+
image.style.width = `${size}px`;
|
|
16051
|
+
image.style.height = `${size}px`;
|
|
16052
|
+
image.style.objectFit = "contain";
|
|
16053
|
+
image.style.boxSizing = "border-box";
|
|
16054
|
+
image.style.padding = `${Math.max(1, Math.round(size / 16))}px`;
|
|
16055
|
+
image.style.borderRadius = "22.37%";
|
|
16056
|
+
image.style.background = "#d8d8e8";
|
|
16057
|
+
image.style.flex = "none";
|
|
16058
|
+
return image;
|
|
16059
|
+
}
|
|
15983
16060
|
const mark = ownerDocument.createElement("img");
|
|
15984
16061
|
mark.src = grok_agent_default;
|
|
15985
16062
|
mark.alt = "";
|
|
@@ -15992,225 +16069,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15992
16069
|
return mark;
|
|
15993
16070
|
}
|
|
15994
16071
|
|
|
15995
|
-
// src/renderer-codex-account-options.ts
|
|
15996
|
-
var ACCOUNT_COLORS = ["#5b38c9", "#239b88", "#ce6724", "#2878c7", "#b34778", "#65752a"];
|
|
15997
|
-
function codexAccountDisplayName(account) {
|
|
15998
|
-
const full = account.email ?? account.label;
|
|
15999
|
-
const separator = account.email?.lastIndexOf("@") ?? -1;
|
|
16000
|
-
if (!account.email || separator <= 0 || separator === account.email.length - 1) {
|
|
16001
|
-
return { local: full, domain: null, full };
|
|
16002
|
-
}
|
|
16003
|
-
return {
|
|
16004
|
-
local: account.email.slice(0, separator),
|
|
16005
|
-
domain: account.email.slice(separator + 1),
|
|
16006
|
-
full
|
|
16007
|
-
};
|
|
16008
|
-
}
|
|
16009
|
-
function codexAccountPresentationSignature(accounts) {
|
|
16010
|
-
return accounts.map(({ accountId, label, email: email3 }) => `${accountId}\0${label}\0${email3 ?? ""}`).join("");
|
|
16011
|
-
}
|
|
16012
|
-
function accountColor(accountId) {
|
|
16013
|
-
let hash2 = 0;
|
|
16014
|
-
for (const character of accountId) hash2 = hash2 * 31 + character.charCodeAt(0) >>> 0;
|
|
16015
|
-
return ACCOUNT_COLORS[hash2 % ACCOUNT_COLORS.length] ?? ACCOUNT_COLORS[0];
|
|
16016
|
-
}
|
|
16017
|
-
function accountInitial(account) {
|
|
16018
|
-
const display = codexAccountDisplayName(account).local.trim();
|
|
16019
|
-
return display.match(/[\p{L}\p{N}]/u)?.[0]?.toUpperCase() ?? "?";
|
|
16020
|
-
}
|
|
16021
|
-
function setInteractiveHighlight(button) {
|
|
16022
|
-
const update = (hovered) => {
|
|
16023
|
-
const selected = button.getAttribute("aria-checked") === "true";
|
|
16024
|
-
button.style.background = selected || hovered && !button.disabled ? `rgba(127, 127, 127, ${selected ? "0.16" : "0.1"})` : "transparent";
|
|
16025
|
-
};
|
|
16026
|
-
button.addEventListener("pointerenter", () => update(true));
|
|
16027
|
-
button.addEventListener("pointerleave", () => update(false));
|
|
16028
|
-
button.addEventListener("focus", () => update(true));
|
|
16029
|
-
button.addEventListener("blur", () => update(false));
|
|
16030
|
-
}
|
|
16031
|
-
function createRendererCodexAccountGroup(input) {
|
|
16032
|
-
const { ownerDocument: document2 } = input;
|
|
16033
|
-
const root = document2.createElement("div");
|
|
16034
|
-
root.dataset.codexAccountOptions = "true";
|
|
16035
|
-
root.hidden = true;
|
|
16036
|
-
const accountSection = document2.createElement("div");
|
|
16037
|
-
accountSection.setAttribute("role", "group");
|
|
16038
|
-
accountSection.setAttribute("aria-label", input.accountsLabel);
|
|
16039
|
-
accountSection.style.position = "relative";
|
|
16040
|
-
const header = document2.createElement("div");
|
|
16041
|
-
header.style.display = "flex";
|
|
16042
|
-
header.style.alignItems = "center";
|
|
16043
|
-
header.style.gap = "7px";
|
|
16044
|
-
header.style.height = "30px";
|
|
16045
|
-
header.style.padding = "0 34px 0 8px";
|
|
16046
|
-
header.style.color = "inherit";
|
|
16047
|
-
header.style.font = "600 12px/1 system-ui, sans-serif";
|
|
16048
|
-
header.style.opacity = "0.72";
|
|
16049
|
-
header.append(createRendererAgentIcon("codex", 16, document2), input.accountsLabel);
|
|
16050
|
-
const list = document2.createElement("div");
|
|
16051
|
-
list.style.display = "flex";
|
|
16052
|
-
list.style.flexDirection = "column";
|
|
16053
|
-
list.style.gap = "2px";
|
|
16054
|
-
list.style.maxHeight = "132px";
|
|
16055
|
-
list.style.marginBottom = "4px";
|
|
16056
|
-
list.style.paddingLeft = "14px";
|
|
16057
|
-
list.style.overflowY = "auto";
|
|
16058
|
-
list.style.scrollbarWidth = "thin";
|
|
16059
|
-
const manage = document2.createElement("button");
|
|
16060
|
-
manage.type = "button";
|
|
16061
|
-
manage.setAttribute("role", "menuitem");
|
|
16062
|
-
manage.setAttribute("aria-label", input.manageAccountsLabel);
|
|
16063
|
-
manage.title = input.manageAccountsLabel;
|
|
16064
|
-
manage.textContent = "\u2026";
|
|
16065
|
-
manage.style.position = "absolute";
|
|
16066
|
-
manage.style.top = "3px";
|
|
16067
|
-
manage.style.right = "4px";
|
|
16068
|
-
manage.style.display = "inline-flex";
|
|
16069
|
-
manage.style.alignItems = "center";
|
|
16070
|
-
manage.style.justifyContent = "center";
|
|
16071
|
-
manage.style.width = "24px";
|
|
16072
|
-
manage.style.height = "24px";
|
|
16073
|
-
manage.style.padding = "0";
|
|
16074
|
-
manage.style.color = "inherit";
|
|
16075
|
-
manage.style.background = "transparent";
|
|
16076
|
-
manage.style.border = "0";
|
|
16077
|
-
manage.style.borderRadius = "5px";
|
|
16078
|
-
manage.style.font = "600 16px/1 system-ui, sans-serif";
|
|
16079
|
-
manage.style.opacity = "0.56";
|
|
16080
|
-
manage.style.cursor = "pointer";
|
|
16081
|
-
manage.addEventListener("pointerenter", () => {
|
|
16082
|
-
manage.style.background = "rgba(127, 127, 127, 0.1)";
|
|
16083
|
-
manage.style.opacity = "1";
|
|
16084
|
-
});
|
|
16085
|
-
manage.addEventListener("pointerleave", () => {
|
|
16086
|
-
manage.style.background = "transparent";
|
|
16087
|
-
manage.style.opacity = "0.56";
|
|
16088
|
-
});
|
|
16089
|
-
manage.addEventListener("click", input.onManage);
|
|
16090
|
-
accountSection.append(header, list, manage);
|
|
16091
|
-
root.append(accountSection);
|
|
16092
|
-
const badge = document2.createElement("span");
|
|
16093
|
-
badge.setAttribute("aria-hidden", "true");
|
|
16094
|
-
badge.style.display = "none";
|
|
16095
|
-
badge.style.position = "absolute";
|
|
16096
|
-
badge.style.right = "1px";
|
|
16097
|
-
badge.style.bottom = "0";
|
|
16098
|
-
badge.style.width = "9px";
|
|
16099
|
-
badge.style.height = "9px";
|
|
16100
|
-
badge.style.border = "1.5px solid Canvas";
|
|
16101
|
-
badge.style.borderRadius = "50%";
|
|
16102
|
-
badge.style.pointerEvents = "none";
|
|
16103
|
-
const options = /* @__PURE__ */ new Map();
|
|
16104
|
-
let accounts = [];
|
|
16105
|
-
let presentationSignature = "";
|
|
16106
|
-
const rebuild = (nextAccounts) => {
|
|
16107
|
-
list.replaceChildren();
|
|
16108
|
-
options.clear();
|
|
16109
|
-
for (const account of nextAccounts) {
|
|
16110
|
-
const row = document2.createElement("div");
|
|
16111
|
-
const button = document2.createElement("button");
|
|
16112
|
-
button.type = "button";
|
|
16113
|
-
button.dataset.codexAccountId = account.accountId;
|
|
16114
|
-
button.setAttribute("role", "menuitemradio");
|
|
16115
|
-
button.style.display = "grid";
|
|
16116
|
-
button.style.gridTemplateColumns = "20px minmax(0, 1fr) 16px";
|
|
16117
|
-
button.style.alignItems = "center";
|
|
16118
|
-
button.style.gap = "7px";
|
|
16119
|
-
button.style.width = "100%";
|
|
16120
|
-
button.style.height = "32px";
|
|
16121
|
-
button.style.padding = "0 7px";
|
|
16122
|
-
button.style.color = "inherit";
|
|
16123
|
-
button.style.background = "transparent";
|
|
16124
|
-
button.style.border = "0";
|
|
16125
|
-
button.style.borderRadius = "5px";
|
|
16126
|
-
button.style.textAlign = "left";
|
|
16127
|
-
button.style.cursor = "pointer";
|
|
16128
|
-
setInteractiveHighlight(button);
|
|
16129
|
-
const avatar = document2.createElement("span");
|
|
16130
|
-
avatar.textContent = accountInitial(account);
|
|
16131
|
-
avatar.style.display = "inline-flex";
|
|
16132
|
-
avatar.style.alignItems = "center";
|
|
16133
|
-
avatar.style.justifyContent = "center";
|
|
16134
|
-
avatar.style.width = "20px";
|
|
16135
|
-
avatar.style.height = "20px";
|
|
16136
|
-
avatar.style.color = "#fff";
|
|
16137
|
-
avatar.style.background = accountColor(account.accountId);
|
|
16138
|
-
avatar.style.borderRadius = "50%";
|
|
16139
|
-
avatar.style.font = "700 10px/1 system-ui, sans-serif";
|
|
16140
|
-
const displayName = codexAccountDisplayName(account);
|
|
16141
|
-
const name = document2.createElement("span");
|
|
16142
|
-
name.style.display = "flex";
|
|
16143
|
-
name.style.alignItems = "baseline";
|
|
16144
|
-
name.style.minWidth = "0";
|
|
16145
|
-
name.style.gap = "4px";
|
|
16146
|
-
const local = document2.createElement("strong");
|
|
16147
|
-
local.textContent = displayName.local;
|
|
16148
|
-
local.style.minWidth = "0";
|
|
16149
|
-
local.style.overflow = "hidden";
|
|
16150
|
-
local.style.font = "600 13px/1 system-ui, sans-serif";
|
|
16151
|
-
local.style.textOverflow = "ellipsis";
|
|
16152
|
-
local.style.whiteSpace = "nowrap";
|
|
16153
|
-
name.append(local);
|
|
16154
|
-
if (displayName.domain) {
|
|
16155
|
-
const domain2 = document2.createElement("span");
|
|
16156
|
-
domain2.textContent = displayName.domain;
|
|
16157
|
-
domain2.style.maxWidth = "48%";
|
|
16158
|
-
domain2.style.overflow = "hidden";
|
|
16159
|
-
domain2.style.flex = "none";
|
|
16160
|
-
domain2.style.font = "400 11px/1 system-ui, sans-serif";
|
|
16161
|
-
domain2.style.opacity = "0.58";
|
|
16162
|
-
domain2.style.textOverflow = "ellipsis";
|
|
16163
|
-
domain2.style.whiteSpace = "nowrap";
|
|
16164
|
-
name.append(domain2);
|
|
16165
|
-
}
|
|
16166
|
-
const check2 = document2.createElement("span");
|
|
16167
|
-
check2.textContent = "\u2713";
|
|
16168
|
-
check2.setAttribute("aria-hidden", "true");
|
|
16169
|
-
check2.style.width = "16px";
|
|
16170
|
-
check2.style.textAlign = "center";
|
|
16171
|
-
check2.style.font = "600 14px/1 system-ui, sans-serif";
|
|
16172
|
-
check2.style.visibility = "hidden";
|
|
16173
|
-
button.title = displayName.full;
|
|
16174
|
-
button.setAttribute("aria-label", `${input.accountsLabel}: ${displayName.full}`);
|
|
16175
|
-
button.append(avatar, name, check2);
|
|
16176
|
-
button.addEventListener("click", () => input.onSelect(account.accountId));
|
|
16177
|
-
row.append(button);
|
|
16178
|
-
list.append(row);
|
|
16179
|
-
options.set(account.accountId, { row, button, check: check2, action: null });
|
|
16180
|
-
}
|
|
16181
|
-
presentationSignature = codexAccountPresentationSignature(nextAccounts);
|
|
16182
|
-
};
|
|
16183
|
-
const control = {
|
|
16184
|
-
root,
|
|
16185
|
-
badge,
|
|
16186
|
-
options,
|
|
16187
|
-
accounts,
|
|
16188
|
-
render({ accounts: nextAccounts, selectedAccountId, disabled, showBadge }) {
|
|
16189
|
-
const nextSignature = codexAccountPresentationSignature(nextAccounts);
|
|
16190
|
-
if (nextSignature !== presentationSignature) rebuild(nextAccounts);
|
|
16191
|
-
accounts = [...nextAccounts];
|
|
16192
|
-
control.accounts = accounts;
|
|
16193
|
-
root.hidden = accounts.length === 0;
|
|
16194
|
-
const selectedAccount = accounts.find(({ accountId }) => accountId === selectedAccountId);
|
|
16195
|
-
badge.style.display = showBadge && selectedAccount ? "block" : "none";
|
|
16196
|
-
if (selectedAccount) badge.style.background = accountColor(selectedAccount.accountId);
|
|
16197
|
-
for (const account of accounts) {
|
|
16198
|
-
const option = options.get(account.accountId);
|
|
16199
|
-
if (!option) continue;
|
|
16200
|
-
const selected = account.accountId === selectedAccountId;
|
|
16201
|
-
option.button.disabled = disabled;
|
|
16202
|
-
option.button.setAttribute("aria-checked", String(selected));
|
|
16203
|
-
option.button.setAttribute("aria-pressed", String(selected));
|
|
16204
|
-
option.button.style.background = selected ? "rgba(127, 127, 127, 0.16)" : "transparent";
|
|
16205
|
-
option.button.style.cursor = disabled ? "not-allowed" : "pointer";
|
|
16206
|
-
option.button.style.opacity = disabled && !selected ? "0.5" : "1";
|
|
16207
|
-
option.check.style.visibility = selected ? "visible" : "hidden";
|
|
16208
|
-
}
|
|
16209
|
-
}
|
|
16210
|
-
};
|
|
16211
|
-
return control;
|
|
16212
|
-
}
|
|
16213
|
-
|
|
16214
16072
|
// ../../node_modules/lucide/dist/esm/defaultAttributes.mjs
|
|
16215
16073
|
var defaultAttributes = {
|
|
16216
16074
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -16629,7 +16487,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
16629
16487
|
antigravity: "https://antigravity.google/product/antigravity-cli",
|
|
16630
16488
|
"kiro-cli": "https://kiro.dev/docs/cli/",
|
|
16631
16489
|
codebuddy: "https://www.codebuddy.ai/docs/zh/cli/overview",
|
|
16632
|
-
"cursor-cli": "https://cursor.com/docs/cli/installation"
|
|
16490
|
+
"cursor-cli": "https://cursor.com/docs/cli/installation",
|
|
16491
|
+
hermes: "https://hermes-agent.nousresearch.com/docs"
|
|
16633
16492
|
});
|
|
16634
16493
|
function connectionStatusLabel(availability, messages, hasError = false) {
|
|
16635
16494
|
if (hasError && availability !== "notInstalled") return messages.connectionStatusError;
|
|
@@ -17446,9 +17305,8 @@ ${error51.stderrTail}`] : []
|
|
|
17446
17305
|
sessionImportRetryOpen: "Try opening again",
|
|
17447
17306
|
sessionImportRetrying: "Opening...",
|
|
17448
17307
|
connectionsDescription: "View runtime status by Host. Select an item to inspect details or complete its setup.",
|
|
17449
|
-
accountsDescription: "View accounts and limits across Agents, and manage your Codex default account.",
|
|
17450
17308
|
accountConnected: "Accounts",
|
|
17451
|
-
accountDefaultBadge: "
|
|
17309
|
+
accountDefaultBadge: "Current",
|
|
17452
17310
|
accountAdd: "Add Codex account",
|
|
17453
17311
|
accountColumnAccount: "Account",
|
|
17454
17312
|
accountColumnActions: "Manage",
|
|
@@ -17459,20 +17317,32 @@ ${error51.stderrTail}`] : []
|
|
|
17459
17317
|
accountNativeManagementHint: "This account comes from {harness}'s native authentication. This page only displays identity and limits; manage sign-in, sign-out and switching in the native client.",
|
|
17460
17318
|
accountMore: "Codex account actions",
|
|
17461
17319
|
accountDetailsClose: "Close account details",
|
|
17462
|
-
accountDefaultHint: "
|
|
17320
|
+
accountDefaultHint: "This is the current identity for all Codex Threads.",
|
|
17463
17321
|
accountCreditsRemaining: "Remaining",
|
|
17464
17322
|
accountCreditsLoading: "Loading limits\u2026",
|
|
17465
17323
|
accountCreditsEmpty: "No limit data available",
|
|
17466
17324
|
accountCreditsFailed: "Could not load limits",
|
|
17467
17325
|
accountCreditsRetry: "Retry",
|
|
17468
17326
|
accountCreditsRefresh: "Refresh limits",
|
|
17469
|
-
accountCreateFailed: "Could not add the Account.",
|
|
17470
17327
|
accountDelete: "Delete",
|
|
17471
17328
|
accountDeleteConfirm: "Delete this Account and its local data? This cannot be undone.",
|
|
17472
17329
|
accountDeleting: "Deleting Account...",
|
|
17473
17330
|
accountDeleteFailed: "Could not delete the Account.",
|
|
17474
|
-
|
|
17475
|
-
|
|
17331
|
+
accountUse: "Switch",
|
|
17332
|
+
accountLogout: "Sign out",
|
|
17333
|
+
accountLogoutConfirm: "Sign out the current Codex identity? Saved Accounts are retained.",
|
|
17334
|
+
accountLoggingOut: "Signing out...",
|
|
17335
|
+
accountLoggedOut: "Signed out. Saved Accounts are retained.",
|
|
17336
|
+
accountLogoutFailed: "Could not sign out the current Codex identity.",
|
|
17337
|
+
accountRecover: "Recover",
|
|
17338
|
+
accountRecovering: "Recovering Codex...",
|
|
17339
|
+
accountRecoveryRequired: "Codex Account recovery is required before work can continue.",
|
|
17340
|
+
accountLegacyCompatibility: "Native compatibility mode: Codex uses the existing official home. Account management is disabled. Other account homes and their history have not been merged; use the previous version to access them. No source data was migrated or deleted.",
|
|
17341
|
+
accountMigrationRequired: "Legacy Codex data requires migration before this layout can be used. Your data is preserved; use the previous version to access it. This is not a sign-in request.",
|
|
17342
|
+
accountCleanupRequired: "Account saved. Temporary file cleanup is incomplete.",
|
|
17343
|
+
accountSavedUnavailable: "Account saved. Codex is not ready yet.",
|
|
17344
|
+
accountRetryCleanup: "Retry cleanup",
|
|
17345
|
+
accountCleaningUp: "Retrying cleanup...",
|
|
17476
17346
|
accountSignIn: "Sign in",
|
|
17477
17347
|
accountSigningIn: "Starting device sign-in...",
|
|
17478
17348
|
accountVerificationDescription: "Open the verification page and enter this one-time code:",
|
|
@@ -17480,6 +17350,7 @@ ${error51.stderrTail}`] : []
|
|
|
17480
17350
|
accountCopied: "Copied",
|
|
17481
17351
|
accountLoginCancel: "Cancel sign-in",
|
|
17482
17352
|
accountLoginSucceeded: "Sign-in completed.",
|
|
17353
|
+
accountLoginResultUnconfirmed: "Sign-in finished, but its result was not received. Inspect the saved Account state.",
|
|
17483
17354
|
accountLoginFailed: "Sign-in failed.",
|
|
17484
17355
|
accountLoadFailed: "Could not load Codex Accounts.",
|
|
17485
17356
|
accountCreditsUsed: "Used",
|
|
@@ -17656,9 +17527,8 @@ ${error51.stderrTail}`] : []
|
|
|
17656
17527
|
sessionImportRetryOpen: "\u91CD\u8BD5\u6253\u5F00",
|
|
17657
17528
|
sessionImportRetrying: "\u6B63\u5728\u6253\u5F00\u2026\u2026",
|
|
17658
17529
|
connectionsDescription: "\u6309 Host \u67E5\u770B\u8FD0\u884C\u65F6\u72B6\u6001\u3002\u9009\u62E9\u4E00\u9879\uFF0C\u5728\u53F3\u4FA7\u68C0\u67E5\u8BE6\u60C5\u6216\u5B8C\u6210\u914D\u7F6E\u3002",
|
|
17659
|
-
accountsDescription: "\u67E5\u770B\u5404 Agent \u7684\u8D26\u53F7\u4E0E\u989D\u5EA6\uFF0C\u7BA1\u7406 Codex \u9ED8\u8BA4\u8D26\u53F7\u3002",
|
|
17660
17530
|
accountConnected: "\u8D26\u53F7",
|
|
17661
|
-
accountDefaultBadge: "
|
|
17531
|
+
accountDefaultBadge: "\u5F53\u524D",
|
|
17662
17532
|
accountAdd: "\u6DFB\u52A0 Codex \u8D26\u53F7",
|
|
17663
17533
|
accountColumnAccount: "\u8D26\u53F7",
|
|
17664
17534
|
accountColumnActions: "\u7BA1\u7406",
|
|
@@ -17669,20 +17539,32 @@ ${error51.stderrTail}`] : []
|
|
|
17669
17539
|
accountNativeManagementHint: "\u6B64\u8D26\u53F7\u6765\u81EA {harness} \u7684\u539F\u751F\u767B\u5F55\u3002\u8FD9\u91CC\u53EA\u8BFB\u5C55\u793A\u8EAB\u4EFD\u4E0E\u989D\u5EA6\uFF1B\u767B\u5F55\u3001\u9000\u51FA\u548C\u5207\u6362\u8BF7\u5728\u5176\u539F\u751F\u5BA2\u6237\u7AEF\u4E2D\u5B8C\u6210\u3002",
|
|
17670
17540
|
accountMore: "Codex \u8D26\u53F7\u64CD\u4F5C",
|
|
17671
17541
|
accountDetailsClose: "\u5173\u95ED\u8D26\u53F7\u8BE6\u60C5",
|
|
17672
|
-
accountDefaultHint: "\
|
|
17542
|
+
accountDefaultHint: "\u6240\u6709 Codex \u4F1A\u8BDD\u5F53\u524D\u4F7F\u7528\u6B64\u8EAB\u4EFD\u3002",
|
|
17673
17543
|
accountCreditsRemaining: "\u5269\u4F59",
|
|
17674
17544
|
accountCreditsLoading: "\u6B63\u5728\u8BFB\u53D6\u989D\u5EA6\u2026",
|
|
17675
17545
|
accountCreditsEmpty: "\u6682\u65E0\u989D\u5EA6\u6570\u636E",
|
|
17676
17546
|
accountCreditsFailed: "\u989D\u5EA6\u8BFB\u53D6\u5931\u8D25",
|
|
17677
17547
|
accountCreditsRetry: "\u91CD\u8BD5",
|
|
17678
17548
|
accountCreditsRefresh: "\u5237\u65B0\u989D\u5EA6",
|
|
17679
|
-
accountCreateFailed: "\u6DFB\u52A0\u8D26\u53F7\u5931\u8D25\u3002",
|
|
17680
17549
|
accountDelete: "\u5220\u9664",
|
|
17681
17550
|
accountDeleteConfirm: "\u5220\u9664\u6B64\u8D26\u53F7\u53CA\u5176\u672C\u5730\u6570\u636E\uFF1F\u6B64\u64CD\u4F5C\u65E0\u6CD5\u64A4\u9500\u3002",
|
|
17682
17551
|
accountDeleting: "\u6B63\u5728\u5220\u9664\u8D26\u53F7...",
|
|
17683
17552
|
accountDeleteFailed: "\u5220\u9664\u8D26\u53F7\u5931\u8D25\u3002",
|
|
17684
|
-
|
|
17685
|
-
|
|
17553
|
+
accountUse: "\u5207\u6362",
|
|
17554
|
+
accountLogout: "\u9000\u51FA\u767B\u5F55",
|
|
17555
|
+
accountLogoutConfirm: "\u9000\u51FA\u5F53\u524D Codex \u8EAB\u4EFD\uFF1F\u5DF2\u4FDD\u5B58\u7684\u8D26\u53F7\u4F1A\u4FDD\u7559\u3002",
|
|
17556
|
+
accountLoggingOut: "\u6B63\u5728\u9000\u51FA\u767B\u5F55...",
|
|
17557
|
+
accountLoggedOut: "\u5DF2\u9000\u51FA\u767B\u5F55\uFF0C\u4FDD\u5B58\u7684\u8D26\u53F7\u4ECD\u4F1A\u4FDD\u7559\u3002",
|
|
17558
|
+
accountLogoutFailed: "\u65E0\u6CD5\u9000\u51FA\u5F53\u524D Codex \u8EAB\u4EFD\u3002",
|
|
17559
|
+
accountRecover: "\u6062\u590D",
|
|
17560
|
+
accountRecovering: "\u6B63\u5728\u6062\u590D Codex...",
|
|
17561
|
+
accountRecoveryRequired: "\u7EE7\u7EED\u5DE5\u4F5C\u524D\u9700\u8981\u6062\u590D Codex \u8D26\u53F7\u72B6\u6001\u3002",
|
|
17562
|
+
accountLegacyCompatibility: "\u539F\u751F\u517C\u5BB9\u6A21\u5F0F\uFF1A\u7EE7\u7EED\u4F7F\u7528\u539F\u6709\u5B98\u65B9\u76EE\u5F55\uFF0C\u8D26\u53F7\u7BA1\u7406\u6682\u4E0D\u53EF\u7528\u3002\u5176\u4ED6\u8D26\u53F7\u76EE\u5F55\u53CA\u5176\u5386\u53F2\u5C1A\u672A\u5408\u5E76\uFF0C\u8BF7\u4F7F\u7528\u65E7\u7248\u8BBF\u95EE\uFF1B\u6CA1\u6709\u8FC1\u79FB\u6216\u5220\u9664\u539F\u6570\u636E\u3002",
|
|
17563
|
+
accountMigrationRequired: "\u65E7 Codex \u6570\u636E\u5E03\u5C40\u9700\u8981\u8FC1\u79FB\u540E\u624D\u80FD\u4F7F\u7528\u3002\u539F\u6570\u636E\u5DF2\u4FDD\u7559\uFF0C\u8BF7\u4F7F\u7528\u65E7\u7248\u8BBF\u95EE\uFF1B\u8FD9\u4E0D\u662F\u8981\u6C42\u91CD\u65B0\u767B\u5F55\u3002",
|
|
17564
|
+
accountCleanupRequired: "\u8D26\u53F7\u5DF2\u4FDD\u5B58\uFF0C\u4E34\u65F6\u6587\u4EF6\u6E05\u7406\u672A\u5B8C\u6210\u3002",
|
|
17565
|
+
accountSavedUnavailable: "\u8D26\u53F7\u5DF2\u4FDD\u5B58\uFF0CCodex \u5C1A\u672A\u5C31\u7EEA\u3002",
|
|
17566
|
+
accountRetryCleanup: "\u91CD\u8BD5\u6E05\u7406",
|
|
17567
|
+
accountCleaningUp: "\u6B63\u5728\u91CD\u8BD5\u6E05\u7406...",
|
|
17686
17568
|
accountSignIn: "\u767B\u5F55",
|
|
17687
17569
|
accountSigningIn: "\u6B63\u5728\u542F\u52A8\u8BBE\u5907\u767B\u5F55...",
|
|
17688
17570
|
accountVerificationDescription: "\u6253\u5F00\u9A8C\u8BC1\u9875\u9762\u5E76\u8F93\u5165\u4EE5\u4E0B\u4E00\u6B21\u6027\u4EE3\u7801\uFF1A",
|
|
@@ -17690,6 +17572,7 @@ ${error51.stderrTail}`] : []
|
|
|
17690
17572
|
accountCopied: "\u5DF2\u590D\u5236",
|
|
17691
17573
|
accountLoginCancel: "\u53D6\u6D88\u767B\u5F55",
|
|
17692
17574
|
accountLoginSucceeded: "\u767B\u5F55\u6210\u529F\u3002",
|
|
17575
|
+
accountLoginResultUnconfirmed: "\u767B\u5F55\u5DF2\u7ED3\u675F\uFF0C\u4F46\u672A\u6536\u5230\u7ED3\u679C\u3002\u8BF7\u68C0\u67E5\u5DF2\u4FDD\u5B58\u7684\u8D26\u53F7\u72B6\u6001\u3002",
|
|
17693
17576
|
accountLoginFailed: "\u767B\u5F55\u5931\u8D25\u3002",
|
|
17694
17577
|
accountLoadFailed: "\u65E0\u6CD5\u52A0\u8F7D Codex \u8D26\u53F7\u3002",
|
|
17695
17578
|
accountCreditsUsed: "\u5DF2\u7528",
|
|
@@ -17845,8 +17728,6 @@ ${error51.stderrTail}`] : []
|
|
|
17845
17728
|
const messages = rendererSettingsMessages(resolveRendererSettingsLocale(languages));
|
|
17846
17729
|
return {
|
|
17847
17730
|
...messages,
|
|
17848
|
-
codexAccountsLabel: "Codex",
|
|
17849
|
-
manageCodexAccountsLabel: messages.locale === "zh-CN" ? "\u7BA1\u7406 Codex \u8D26\u53F7" : "Manage Codex Accounts",
|
|
17850
17731
|
ownershipErrorLabel: messages.locale === "zh-CN" ? "\u65E0\u6CD5\u786E\u8BA4\u4F1A\u8BDD\u7684 Agent\uFF1B\u91CD\u65B0\u805A\u7126\u7A97\u53E3\u4EE5\u91CD\u8BD5" : "Unable to determine the Thread Agent; refocus the window to retry"
|
|
17851
17732
|
};
|
|
17852
17733
|
}
|
|
@@ -17867,7 +17748,8 @@ ${error51.stderrTail}`] : []
|
|
|
17867
17748
|
antigravity: "https://antigravity.google/product/antigravity-cli",
|
|
17868
17749
|
"kiro-cli": "https://kiro.dev/docs/cli/",
|
|
17869
17750
|
codebuddy: "https://www.codebuddy.ai/docs/zh/cli/overview",
|
|
17870
|
-
"cursor-cli": "https://cursor.com/docs/cli/installation"
|
|
17751
|
+
"cursor-cli": "https://cursor.com/docs/cli/installation",
|
|
17752
|
+
hermes: "https://hermes-agent.nousresearch.com/docs"
|
|
17871
17753
|
};
|
|
17872
17754
|
var CONTROL_ATTRIBUTE = "data-codexhost-agent-control";
|
|
17873
17755
|
var AGENT_MENU_WIDTH = 224;
|
|
@@ -17889,7 +17771,7 @@ ${error51.stderrTail}`] : []
|
|
|
17889
17771
|
const account = state.agent === "codex" && activeAccount ? ` \xB7 ${activeAccount.email ?? activeAccount.label}` : "";
|
|
17890
17772
|
return `Agent: ${RENDERER_AGENT_LABELS[state.agent]}${account}${state.phase === "locked" ? " (locked)" : ""}`;
|
|
17891
17773
|
}
|
|
17892
|
-
function rendererAgentPickerView(state, adapterState, switching, agents, availability = {}
|
|
17774
|
+
function rendererAgentPickerView(state, adapterState, switching, agents, availability = {}) {
|
|
17893
17775
|
const optionDisabled = Object.fromEntries(
|
|
17894
17776
|
agents.map((agent) => [
|
|
17895
17777
|
agent,
|
|
@@ -17904,7 +17786,7 @@ ${error51.stderrTail}`] : []
|
|
|
17904
17786
|
);
|
|
17905
17787
|
return {
|
|
17906
17788
|
label: RENDERER_AGENT_LABELS[state.agent],
|
|
17907
|
-
triggerDisabled: switching || state.phase === "locked" || agents.length < 2
|
|
17789
|
+
triggerDisabled: switching || state.phase === "locked" || agents.length < 2,
|
|
17908
17790
|
nativeModelHidden: switching || state.agent !== "codex",
|
|
17909
17791
|
optionDisabled,
|
|
17910
17792
|
downloadVisible,
|
|
@@ -17929,7 +17811,7 @@ ${error51.stderrTail}`] : []
|
|
|
17929
17811
|
return !menu.hidden;
|
|
17930
17812
|
}
|
|
17931
17813
|
}
|
|
17932
|
-
function mountRendererAgentPicker(composerId, enabledAgents, onSelect, onDownload,
|
|
17814
|
+
function mountRendererAgentPicker(composerId, enabledAgents, onSelect, onDownload, onOpen, groupPreference = getSharedAgentGroupPreferenceStore()) {
|
|
17933
17815
|
const root = document.createElement("div");
|
|
17934
17816
|
root.setAttribute(CONTROL_ATTRIBUTE, composerId);
|
|
17935
17817
|
root.style.display = "inline-flex";
|
|
@@ -18016,23 +17898,6 @@ ${error51.stderrTail}`] : []
|
|
|
18016
17898
|
else menu.hidden = true;
|
|
18017
17899
|
trigger.setAttribute("aria-expanded", "false");
|
|
18018
17900
|
};
|
|
18019
|
-
const codexAccountGroup = createRendererCodexAccountGroup({
|
|
18020
|
-
ownerDocument: document,
|
|
18021
|
-
accountsLabel: groupMessages.codexAccountsLabel,
|
|
18022
|
-
manageAccountsLabel: groupMessages.manageCodexAccountsLabel,
|
|
18023
|
-
onSelect(accountId) {
|
|
18024
|
-
close();
|
|
18025
|
-
trigger.focus();
|
|
18026
|
-
onSelectCodexAccount(accountId);
|
|
18027
|
-
},
|
|
18028
|
-
onManage() {
|
|
18029
|
-
close();
|
|
18030
|
-
openSettingsPage("accounts", trigger);
|
|
18031
|
-
}
|
|
18032
|
-
});
|
|
18033
|
-
const codexAccountOptions = codexAccountGroup.options;
|
|
18034
|
-
const codexAccountContainer = codexAccountGroup.root;
|
|
18035
|
-
trigger.append(codexAccountGroup.badge);
|
|
18036
17901
|
const focusOption = (position) => {
|
|
18037
17902
|
const available = [
|
|
18038
17903
|
...menu.querySelectorAll('[role="menuitemradio"], [role="menuitem"]')
|
|
@@ -18264,7 +18129,6 @@ ${error51.stderrTail}`] : []
|
|
|
18264
18129
|
for (const agent of mainAgents) {
|
|
18265
18130
|
const row = rowsByAgent.get(agent);
|
|
18266
18131
|
if (row) mainChildren.push(row);
|
|
18267
|
-
if (agent === "codex") mainChildren.push(codexAccountContainer);
|
|
18268
18132
|
}
|
|
18269
18133
|
mainGroup.replaceChildren(...mainChildren);
|
|
18270
18134
|
moreRows.replaceChildren(
|
|
@@ -18336,11 +18200,6 @@ ${error51.stderrTail}`] : []
|
|
|
18336
18200
|
menu,
|
|
18337
18201
|
agents: [...enabledAgents],
|
|
18338
18202
|
options,
|
|
18339
|
-
codexAccounts: [],
|
|
18340
|
-
codexAccountOptions,
|
|
18341
|
-
codexAccountContainer,
|
|
18342
|
-
codexAccountGroup,
|
|
18343
|
-
selectCodexAccount: onSelectCodexAccount,
|
|
18344
18203
|
close,
|
|
18345
18204
|
dispose() {
|
|
18346
18205
|
close();
|
|
@@ -18356,17 +18215,13 @@ ${error51.stderrTail}`] : []
|
|
|
18356
18215
|
};
|
|
18357
18216
|
return control;
|
|
18358
18217
|
}
|
|
18359
|
-
function renderRendererAgentPicker(control, state, adapterState, switching, availability = {},
|
|
18360
|
-
control.codexAccounts = [...codexAccounts];
|
|
18361
|
-
const codexOption = control.options.codex;
|
|
18362
|
-
if (codexOption) codexOption.row.hidden = codexAccounts.length > 0;
|
|
18218
|
+
function renderRendererAgentPicker(control, state, adapterState, switching, availability = {}, currentCodexAccount = null, ownershipError = false) {
|
|
18363
18219
|
const view = rendererAgentPickerView(
|
|
18364
18220
|
state,
|
|
18365
18221
|
adapterState,
|
|
18366
18222
|
switching,
|
|
18367
18223
|
control.agents,
|
|
18368
|
-
availability
|
|
18369
|
-
codexAccounts.length
|
|
18224
|
+
availability
|
|
18370
18225
|
);
|
|
18371
18226
|
if (control.iconSlot.dataset.agent !== state.agent) {
|
|
18372
18227
|
control.iconSlot.replaceChildren(createRendererAgentIcon(state.agent));
|
|
@@ -18378,14 +18233,7 @@ ${error51.stderrTail}`] : []
|
|
|
18378
18233
|
"aria-label",
|
|
18379
18234
|
ownershipError ? pickerGroupMessages().ownershipErrorLabel : state.phase === "locked" ? `Agent: ${view.label}` : `Select Agent, current ${view.label}`
|
|
18380
18235
|
);
|
|
18381
|
-
|
|
18382
|
-
control.codexAccountGroup.render({
|
|
18383
|
-
accounts: codexAccounts,
|
|
18384
|
-
selectedAccountId: state.agent === "codex" ? activeAccount?.accountId ?? null : null,
|
|
18385
|
-
disabled: switching || state.phase === "locked",
|
|
18386
|
-
showBadge: state.agent === "codex" && codexAccounts.length > 1
|
|
18387
|
-
});
|
|
18388
|
-
control.trigger.title = ownershipError ? pickerGroupMessages().ownershipErrorLabel : rendererAgentPickerTooltip(state, activeAccount);
|
|
18236
|
+
control.trigger.title = ownershipError ? pickerGroupMessages().ownershipErrorLabel : rendererAgentPickerTooltip(state, currentCodexAccount ?? void 0);
|
|
18389
18237
|
control.trigger.style.cursor = control.trigger.disabled ? "not-allowed" : "pointer";
|
|
18390
18238
|
control.trigger.style.opacity = control.trigger.disabled && !switching ? "0.72" : "1";
|
|
18391
18239
|
control.iconSlot.style.display = switching || ownershipError ? "none" : "inline-flex";
|
|
@@ -21015,7 +20863,7 @@ ${error51.stderrTail}`] : []
|
|
|
21015
20863
|
setNativeControlHidden(control.nativeContextUsageControl, false);
|
|
21016
20864
|
setNativeControlHidden(control.nativePermissionModeControl, hidePermissionMode);
|
|
21017
20865
|
}
|
|
21018
|
-
function mountComposerAgentControl(composer, composerId, sendButton, enabledAgents, onSelect, onDownload,
|
|
20866
|
+
function mountComposerAgentControl(composer, composerId, sendButton, enabledAgents, onSelect, onDownload, onOpenProviderPicker, onSelectModel, onSelectThinking, onSelectPermissionMode, onSelectCommand) {
|
|
21019
20867
|
const nativeModelControl = captureNativeControl(nativeModelControlForComposer(composer));
|
|
21020
20868
|
const nativeContextUsageControl = captureNativeControl(
|
|
21021
20869
|
nativeContextUsageControlForComposer(composer)
|
|
@@ -21028,7 +20876,6 @@ ${error51.stderrTail}`] : []
|
|
|
21028
20876
|
enabledAgents,
|
|
21029
20877
|
onSelect,
|
|
21030
20878
|
onDownload,
|
|
21031
|
-
onSelectCodexAccount,
|
|
21032
20879
|
onOpenProviderPicker
|
|
21033
20880
|
);
|
|
21034
20881
|
const modelPicker = mountRendererModelPicker(composerId, onSelectModel, onSelectThinking);
|
|
@@ -21072,7 +20919,7 @@ ${error51.stderrTail}`] : []
|
|
|
21072
20919
|
refreshCreditsPlacement(control);
|
|
21073
20920
|
return control;
|
|
21074
20921
|
}
|
|
21075
|
-
function renderComposerAgentControl(control, state, adapterState, switching, availability = {}, modelView = { status: "idle" }, permissionModeView = { status: "idle" }, usage = null, accountCredits = null, locale = "en",
|
|
20922
|
+
function renderComposerAgentControl(control, state, adapterState, switching, availability = {}, modelView = { status: "idle" }, permissionModeView = { status: "idle" }, usage = null, accountCredits = null, locale = "en", currentCodexAccount = null, ownershipError = false) {
|
|
21076
20923
|
if (control.usage === null) {
|
|
21077
20924
|
control.usage = mountRendererUsageControl(control.composerId, locale);
|
|
21078
20925
|
}
|
|
@@ -21099,7 +20946,7 @@ ${error51.stderrTail}`] : []
|
|
|
21099
20946
|
adapterState,
|
|
21100
20947
|
switching,
|
|
21101
20948
|
availability,
|
|
21102
|
-
|
|
20949
|
+
currentCodexAccount,
|
|
21103
20950
|
ownershipError
|
|
21104
20951
|
);
|
|
21105
20952
|
reconcileComposerNativeControls(
|
|
@@ -21115,7 +20962,7 @@ ${error51.stderrTail}`] : []
|
|
|
21115
20962
|
permissionModeVisible,
|
|
21116
20963
|
locale
|
|
21117
20964
|
);
|
|
21118
|
-
const selectedCodexAccount = state.agent === "codex" && !ownershipError ?
|
|
20965
|
+
const selectedCodexAccount = state.agent === "codex" && !ownershipError ? currentCodexAccount : void 0;
|
|
21119
20966
|
if (control.usage) {
|
|
21120
20967
|
renderRendererUsageControl(
|
|
21121
20968
|
control.usage,
|
|
@@ -21192,40 +21039,132 @@ ${error51.stderrTail}`] : []
|
|
|
21192
21039
|
}
|
|
21193
21040
|
|
|
21194
21041
|
// src/renderer-codex-account-state.ts
|
|
21195
|
-
function
|
|
21196
|
-
|
|
21197
|
-
|
|
21198
|
-
|
|
21199
|
-
|
|
21200
|
-
|
|
21201
|
-
|
|
21202
|
-
|
|
21042
|
+
function resolveCurrentCodexAccountId(accounts, currentAccountId) {
|
|
21043
|
+
return accounts.some((account) => account.accountId === currentAccountId) ? currentAccountId : null;
|
|
21044
|
+
}
|
|
21045
|
+
function shouldApplyCodexAccountSnapshot(current, next) {
|
|
21046
|
+
if (!current) return true;
|
|
21047
|
+
if (next.instanceId !== void 0 && next.instanceId !== current.instanceId) return true;
|
|
21048
|
+
if (current.instanceId !== void 0 && next.instanceId === void 0) return false;
|
|
21049
|
+
return next.revision >= current.revision;
|
|
21203
21050
|
}
|
|
21204
21051
|
var RendererCodexAccountState = class {
|
|
21205
|
-
constructor(client) {
|
|
21052
|
+
constructor(client, changed = () => void 0) {
|
|
21206
21053
|
this.client = client;
|
|
21054
|
+
let unsubscribe;
|
|
21055
|
+
try {
|
|
21056
|
+
unsubscribe = client.subscribeCodexAccounts?.((state) => {
|
|
21057
|
+
if (this.#apply(state)) changed();
|
|
21058
|
+
});
|
|
21059
|
+
} catch {
|
|
21060
|
+
}
|
|
21061
|
+
this.#unsubscribe = unsubscribe;
|
|
21207
21062
|
}
|
|
21208
21063
|
client;
|
|
21209
21064
|
accounts = [];
|
|
21210
|
-
|
|
21065
|
+
currentAccountId = null;
|
|
21066
|
+
phase = "unavailable";
|
|
21067
|
+
revision = 0;
|
|
21068
|
+
instanceId;
|
|
21069
|
+
cleanupRequired = false;
|
|
21070
|
+
pendingOperation;
|
|
21071
|
+
capabilities = {
|
|
21072
|
+
manage: false,
|
|
21073
|
+
switch: false,
|
|
21074
|
+
login: false,
|
|
21075
|
+
delete: false
|
|
21076
|
+
};
|
|
21211
21077
|
switching = false;
|
|
21078
|
+
#hasSnapshot = false;
|
|
21212
21079
|
#request = null;
|
|
21213
|
-
|
|
21214
|
-
|
|
21080
|
+
#unsubscribe;
|
|
21081
|
+
get readyAccountId() {
|
|
21082
|
+
return resolveCurrentCodexAccountId(
|
|
21083
|
+
this.accounts,
|
|
21084
|
+
this.phase === "ready" ? this.currentAccountId : null
|
|
21085
|
+
);
|
|
21215
21086
|
}
|
|
21216
21087
|
refresh() {
|
|
21217
21088
|
if (this.#request) return this.#request;
|
|
21218
21089
|
this.#request = Promise.resolve().then(() => this.client.listCodexAccounts()).then((result) => {
|
|
21219
|
-
this
|
|
21220
|
-
this.overrideAccountId = this.selection.overrideAccountId;
|
|
21090
|
+
this.#apply(result);
|
|
21221
21091
|
}).catch(() => {
|
|
21222
21092
|
}).finally(() => {
|
|
21223
21093
|
this.#request = null;
|
|
21224
21094
|
});
|
|
21225
21095
|
return this.#request;
|
|
21226
21096
|
}
|
|
21097
|
+
dispose() {
|
|
21098
|
+
this.#unsubscribe?.();
|
|
21099
|
+
}
|
|
21100
|
+
#apply(result) {
|
|
21101
|
+
if (!shouldApplyCodexAccountSnapshot(
|
|
21102
|
+
this.#hasSnapshot ? { instanceId: this.instanceId, revision: this.revision } : null,
|
|
21103
|
+
result
|
|
21104
|
+
)) {
|
|
21105
|
+
return false;
|
|
21106
|
+
}
|
|
21107
|
+
this.#hasSnapshot = true;
|
|
21108
|
+
this.accounts = result.accounts;
|
|
21109
|
+
this.currentAccountId = result.currentAccountId;
|
|
21110
|
+
this.phase = result.phase;
|
|
21111
|
+
this.revision = result.revision;
|
|
21112
|
+
this.instanceId = result.instanceId;
|
|
21113
|
+
this.cleanupRequired = result.cleanupRequired ?? false;
|
|
21114
|
+
this.pendingOperation = result.pendingOperation;
|
|
21115
|
+
this.capabilities = result.capabilities;
|
|
21116
|
+
this.switching = result.phase === "changing";
|
|
21117
|
+
return true;
|
|
21118
|
+
}
|
|
21227
21119
|
};
|
|
21228
21120
|
|
|
21121
|
+
// ../desktop-control/dist/renderer-react-ownership.js
|
|
21122
|
+
function committedReactAncestors(value) {
|
|
21123
|
+
const MAX_VISITED_FIBERS = 2e4;
|
|
21124
|
+
const fiber = (value2) => typeof value2 === "object" && value2 !== null ? value2 : null;
|
|
21125
|
+
const first = fiber(value);
|
|
21126
|
+
if (!first)
|
|
21127
|
+
return [];
|
|
21128
|
+
const previous = [];
|
|
21129
|
+
const seen = /* @__PURE__ */ new Set();
|
|
21130
|
+
for (let node = first; node; node = fiber(node.return)) {
|
|
21131
|
+
if (seen.has(node) || seen.size >= MAX_VISITED_FIBERS)
|
|
21132
|
+
return [];
|
|
21133
|
+
seen.add(node);
|
|
21134
|
+
previous.push(node);
|
|
21135
|
+
}
|
|
21136
|
+
const rootState = fiber(previous.at(-1)?.stateNode);
|
|
21137
|
+
if (!rootState || !("current" in rootState))
|
|
21138
|
+
return previous;
|
|
21139
|
+
const current = fiber(rootState.current);
|
|
21140
|
+
if (!current)
|
|
21141
|
+
return [];
|
|
21142
|
+
const stack = [{ node: current, parent: null }];
|
|
21143
|
+
const alternate = fiber(first.alternate);
|
|
21144
|
+
seen.clear();
|
|
21145
|
+
while (stack.length > 0 && seen.size < MAX_VISITED_FIBERS) {
|
|
21146
|
+
const entry = stack.pop();
|
|
21147
|
+
if (!entry)
|
|
21148
|
+
break;
|
|
21149
|
+
if (seen.has(entry.node))
|
|
21150
|
+
return [];
|
|
21151
|
+
seen.add(entry.node);
|
|
21152
|
+
if (entry.node === first || entry.node === alternate) {
|
|
21153
|
+
const ancestors = [];
|
|
21154
|
+
for (let cursor = entry; cursor; cursor = cursor.parent)
|
|
21155
|
+
ancestors.push(cursor.node);
|
|
21156
|
+
return ancestors;
|
|
21157
|
+
}
|
|
21158
|
+
const sibling = entry.parent && fiber(entry.node.sibling);
|
|
21159
|
+
if (sibling)
|
|
21160
|
+
stack.push({ node: sibling, parent: entry.parent });
|
|
21161
|
+
const child = fiber(entry.node.child);
|
|
21162
|
+
if (child)
|
|
21163
|
+
stack.push({ node: child, parent: entry });
|
|
21164
|
+
}
|
|
21165
|
+
return [];
|
|
21166
|
+
}
|
|
21167
|
+
|
|
21229
21168
|
// src/renderer-request-sender.ts
|
|
21230
21169
|
var RendererMethodUnavailableError = class extends Error {
|
|
21231
21170
|
constructor(method, cause) {
|
|
@@ -21320,6 +21259,7 @@ ${error51.stderrTail}`] : []
|
|
|
21320
21259
|
if (ownership.harnessId === "kiro-cli") return "kiro-cli";
|
|
21321
21260
|
if (ownership.harnessId === "codebuddy") return "codebuddy";
|
|
21322
21261
|
if (ownership.harnessId === "cursor-cli") return "cursor-cli";
|
|
21262
|
+
if (ownership.harnessId === "hermes") return "hermes";
|
|
21323
21263
|
return null;
|
|
21324
21264
|
}
|
|
21325
21265
|
var BrowserSidebarAgentIconRow = class {
|
|
@@ -22080,6 +22020,8 @@ ${error51.stderrTail}`] : []
|
|
|
22080
22020
|
// src/renderer-model-client.ts
|
|
22081
22021
|
var HARNESS_INSPECT_METHOD = "codexhost/harness/inspect";
|
|
22082
22022
|
var HARNESS_PLUGIN_LIST_METHOD = "codexhost/harness/plugins/list";
|
|
22023
|
+
var HARNESS_ACCOUNT_SOURCES_METHOD = "codexhost/harness/accounts/sources";
|
|
22024
|
+
var HARNESS_ACCOUNT_INSPECT_METHOD = "codexhost/harness/accounts/inspect";
|
|
22083
22025
|
var HARNESS_WEB_UI_OPEN_METHOD = "codexhost/harness/web-ui/open";
|
|
22084
22026
|
var THREAD_FORK_METHOD = "codexhost/thread/fork";
|
|
22085
22027
|
var THREAD_INSPECT_METHOD = "codexhost/thread/inspect";
|
|
@@ -22098,12 +22040,14 @@ ${error51.stderrTail}`] : []
|
|
|
22098
22040
|
var UPDATE_STATUS_METHOD = "codexhost/update/status";
|
|
22099
22041
|
var CODEX_ACCOUNT_LIST_METHOD = "codexhost/account/list";
|
|
22100
22042
|
var CODEX_ACCOUNT_REFRESH_METHOD = "codexhost/account/refresh";
|
|
22101
|
-
var CODEX_ACCOUNT_CREATE_METHOD = "codexhost/account/create";
|
|
22102
22043
|
var CODEX_ACCOUNT_DELETE_METHOD = "codexhost/account/delete";
|
|
22103
|
-
var
|
|
22044
|
+
var CODEX_ACCOUNT_SWITCH_METHOD = "codexhost/account/switch";
|
|
22045
|
+
var CODEX_ACCOUNT_CHANGED_METHOD = "codexhost/account/changed";
|
|
22104
22046
|
var CODEX_ACCOUNT_LOGIN_START_METHOD = "codexhost/account/login/start";
|
|
22105
22047
|
var CODEX_ACCOUNT_LOGIN_CANCEL_METHOD = "codexhost/account/login/cancel";
|
|
22106
22048
|
var CODEX_ACCOUNT_LOGIN_COMPLETED_METHOD = "codexhost/account/login/completed";
|
|
22049
|
+
var CODEX_ACCOUNT_LOGOUT_METHOD = "codexhost/account/logout";
|
|
22050
|
+
var CODEX_ACCOUNT_RECOVER_METHOD = "codexhost/account/recover";
|
|
22107
22051
|
var CODEX_ACCOUNT_RESET_CREDIT_CONSUME_METHOD = "codexhost/account/rate-limit-reset/consume";
|
|
22108
22052
|
function isRecord6(value) {
|
|
22109
22053
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -22319,9 +22263,25 @@ ${error51.stderrTail}`] : []
|
|
|
22319
22263
|
);
|
|
22320
22264
|
return codexAccountResetCreditConsumeResultSchema.parse(result);
|
|
22321
22265
|
},
|
|
22322
|
-
async
|
|
22266
|
+
async listHarnessAccountSources() {
|
|
22267
|
+
return harnessAccountSourceListResultSchema.parse(
|
|
22268
|
+
await manager.sendRequest(HARNESS_ACCOUNT_SOURCES_METHOD, {})
|
|
22269
|
+
);
|
|
22270
|
+
},
|
|
22271
|
+
async inspectHarnessAccount(input) {
|
|
22272
|
+
return harnessAccountInspectResultSchema.parse(
|
|
22273
|
+
await manager.sendRequest(
|
|
22274
|
+
HARNESS_ACCOUNT_INSPECT_METHOD,
|
|
22275
|
+
harnessAccountInspectParamsSchema.parse(input)
|
|
22276
|
+
)
|
|
22277
|
+
);
|
|
22278
|
+
},
|
|
22279
|
+
async listHarnessAccounts(input = {}) {
|
|
22323
22280
|
return harnessAccountListResultSchema.parse(
|
|
22324
|
-
await manager.sendRequest(
|
|
22281
|
+
await manager.sendRequest(
|
|
22282
|
+
"codexhost/harness/accounts/list",
|
|
22283
|
+
harnessAccountListParamsSchema.parse(input)
|
|
22284
|
+
)
|
|
22325
22285
|
);
|
|
22326
22286
|
},
|
|
22327
22287
|
async listCodexAccounts() {
|
|
@@ -22332,13 +22292,6 @@ ${error51.stderrTail}`] : []
|
|
|
22332
22292
|
const result = await manager.sendRequest(CODEX_ACCOUNT_REFRESH_METHOD, {});
|
|
22333
22293
|
return codexAccountListResultSchema.parse(result);
|
|
22334
22294
|
},
|
|
22335
|
-
async createCodexAccount(input) {
|
|
22336
|
-
const result = await manager.sendRequest(
|
|
22337
|
-
CODEX_ACCOUNT_CREATE_METHOD,
|
|
22338
|
-
codexAccountCreateParamsSchema.parse(input)
|
|
22339
|
-
);
|
|
22340
|
-
return codexAccountMutationResultSchema.parse(result);
|
|
22341
|
-
},
|
|
22342
22295
|
async deleteCodexAccount(input) {
|
|
22343
22296
|
const result = await manager.sendRequest(
|
|
22344
22297
|
CODEX_ACCOUNT_DELETE_METHOD,
|
|
@@ -22346,12 +22299,37 @@ ${error51.stderrTail}`] : []
|
|
|
22346
22299
|
);
|
|
22347
22300
|
return codexAccountDeleteResultSchema.parse(result);
|
|
22348
22301
|
},
|
|
22349
|
-
async
|
|
22302
|
+
async switchCodexAccount(input) {
|
|
22303
|
+
const result = await manager.sendRequest(
|
|
22304
|
+
CODEX_ACCOUNT_SWITCH_METHOD,
|
|
22305
|
+
codexAccountSwitchParamsSchema.parse(input)
|
|
22306
|
+
);
|
|
22307
|
+
return codexAccountSwitchResultSchema.parse(result);
|
|
22308
|
+
},
|
|
22309
|
+
async logoutCodexAccount(input = {}) {
|
|
22350
22310
|
const result = await manager.sendRequest(
|
|
22351
|
-
|
|
22352
|
-
|
|
22311
|
+
CODEX_ACCOUNT_LOGOUT_METHOD,
|
|
22312
|
+
codexAccountLogoutParamsSchema.parse(input)
|
|
22353
22313
|
);
|
|
22354
|
-
return
|
|
22314
|
+
return codexAccountLogoutResultSchema.parse(result);
|
|
22315
|
+
},
|
|
22316
|
+
async recoverCodexAccounts(input = {}) {
|
|
22317
|
+
const result = await manager.sendRequest(
|
|
22318
|
+
CODEX_ACCOUNT_RECOVER_METHOD,
|
|
22319
|
+
codexAccountRecoverParamsSchema.parse(input)
|
|
22320
|
+
);
|
|
22321
|
+
return codexAccountRecoverResultSchema.parse(result);
|
|
22322
|
+
},
|
|
22323
|
+
subscribeCodexAccounts(listener) {
|
|
22324
|
+
const notifications = notificationTarget(source);
|
|
22325
|
+
if (!notifications?.addNotificationCallback) {
|
|
22326
|
+
throw new Error("Renderer Account notification callback is unavailable");
|
|
22327
|
+
}
|
|
22328
|
+
return notifications.addNotificationCallback(CODEX_ACCOUNT_CHANGED_METHOD, (notification) => {
|
|
22329
|
+
if (!isRecord6(notification) || notification.method !== CODEX_ACCOUNT_CHANGED_METHOD) return;
|
|
22330
|
+
const state = codexAccountChangedSchema.safeParse(notification.params);
|
|
22331
|
+
if (state.success) listener(state.data);
|
|
22332
|
+
});
|
|
22355
22333
|
},
|
|
22356
22334
|
async startCodexAccountLogin(input) {
|
|
22357
22335
|
const result = await manager.sendRequest(
|
|
@@ -22401,6 +22379,13 @@ ${error51.stderrTail}`] : []
|
|
|
22401
22379
|
var OMP_TRANSPORT_MODEL_PREFIX = `${OMP_TRANSPORT_MODEL_ID}@`;
|
|
22402
22380
|
var ANTIGRAVITY_TRANSPORT_MODEL_ID = "codexhost/antigravity-native";
|
|
22403
22381
|
var ANTIGRAVITY_TRANSPORT_MODEL_PREFIX = `${ANTIGRAVITY_TRANSPORT_MODEL_ID}@`;
|
|
22382
|
+
function hermesTransportModelId(model, permissionModeId) {
|
|
22383
|
+
return encodeHarnessPluginRoute({
|
|
22384
|
+
harnessId: harnessIdSchema.parse("hermes"),
|
|
22385
|
+
...model ? { model: harnessModelRefSchema.parse(model) } : {},
|
|
22386
|
+
...permissionModeId ? { permissionModeId: harnessPermissionModeIdSchema.parse(permissionModeId) } : {}
|
|
22387
|
+
});
|
|
22388
|
+
}
|
|
22404
22389
|
function transitionRendererAdapterStatus(current, next, publish) {
|
|
22405
22390
|
if (current.state === next.state && current.reason === next.reason && current.hook === next.hook) {
|
|
22406
22391
|
return false;
|
|
@@ -22670,6 +22655,17 @@ ${error51.stderrTail}`] : []
|
|
|
22670
22655
|
function isCurrentRequestBridge(value) {
|
|
22671
22656
|
return isRecord7(value) && typeof value.hostId === "string" && value.hostId.length > 0 && typeof value.sendRequest === "function" && typeof value.prewarmThreadStart === "function" && typeof value.enqueueRequest === "function";
|
|
22672
22657
|
}
|
|
22658
|
+
function requestTargetOwnerFromHookState(value) {
|
|
22659
|
+
if (!isRecord7(value)) return null;
|
|
22660
|
+
const ownerFrom = (candidate) => {
|
|
22661
|
+
if (!isRecord7(candidate)) return null;
|
|
22662
|
+
const requestClient = candidate.requestClient;
|
|
22663
|
+
const bridge = isCurrentRequestBridge(requestClient) ? requestClient : isCurrentRequestBridge(candidate) ? candidate : null;
|
|
22664
|
+
if (!bridge) return null;
|
|
22665
|
+
return typeof candidate.sendRequest === "function" ? candidate : bridge;
|
|
22666
|
+
};
|
|
22667
|
+
return ownerFrom(value) ?? ownerFrom(value.manager);
|
|
22668
|
+
}
|
|
22673
22669
|
function findActivePrewarmTargets(root) {
|
|
22674
22670
|
const editor = root.querySelector(
|
|
22675
22671
|
'[data-codex-composer], [contenteditable="true"][role="textbox"]'
|
|
@@ -22691,23 +22687,13 @@ ${error51.stderrTail}`] : []
|
|
|
22691
22687
|
return [];
|
|
22692
22688
|
}
|
|
22693
22689
|
const targets = /* @__PURE__ */ new Set();
|
|
22694
|
-
|
|
22695
|
-
for (let depth = 0; depth < 200; depth += 1) {
|
|
22690
|
+
for (const fiber of committedReactAncestors(firstFiber2)) {
|
|
22696
22691
|
let hook = fiber.memoizedState;
|
|
22697
22692
|
for (let hookIndex = 0; hook && hookIndex < 100; hookIndex += 1) {
|
|
22698
|
-
const
|
|
22699
|
-
if (
|
|
22700
|
-
const requestClient = hookState.requestClient;
|
|
22701
|
-
const bridge = isCurrentRequestBridge(requestClient) ? requestClient : isCurrentRequestBridge(hookState) ? hookState : null;
|
|
22702
|
-
if (bridge) {
|
|
22703
|
-
targets.add(typeof hookState.sendRequest === "function" ? hookState : bridge);
|
|
22704
|
-
}
|
|
22705
|
-
}
|
|
22693
|
+
const owner = requestTargetOwnerFromHookState(hook.memoizedState);
|
|
22694
|
+
if (owner) targets.add(owner);
|
|
22706
22695
|
hook = typeof hook.next === "object" && hook.next !== null ? hook.next : null;
|
|
22707
22696
|
}
|
|
22708
|
-
const parent = fiber.return;
|
|
22709
|
-
if (typeof parent !== "object" && typeof parent !== "function" || parent === null) break;
|
|
22710
|
-
fiber = parent;
|
|
22711
22697
|
}
|
|
22712
22698
|
return [...targets];
|
|
22713
22699
|
}
|
|
@@ -22742,7 +22728,7 @@ ${error51.stderrTail}`] : []
|
|
|
22742
22728
|
}
|
|
22743
22729
|
return threadId;
|
|
22744
22730
|
}
|
|
22745
|
-
function
|
|
22731
|
+
function isLegacySevenSlotDraftWrapper(value) {
|
|
22746
22732
|
if (!Array.isArray(value) || value.length !== 7 || value[3] !== value[5] || value[3] !== value[6] || !isRecord7(value[3]) || typeof value[3].get !== "function" || typeof value[2] !== "string" && value[2] !== null) {
|
|
22747
22733
|
return false;
|
|
22748
22734
|
}
|
|
@@ -22753,6 +22739,20 @@ ${error51.stderrTail}`] : []
|
|
|
22753
22739
|
return false;
|
|
22754
22740
|
}
|
|
22755
22741
|
}
|
|
22742
|
+
function duplicatedClientNewThreadId(value) {
|
|
22743
|
+
if (!Array.isArray(value)) return null;
|
|
22744
|
+
const ids = value.filter(
|
|
22745
|
+
(item) => typeof item === "string" && item.startsWith("client-new-thread:")
|
|
22746
|
+
);
|
|
22747
|
+
if (ids.length < 2 || ids.some((id) => id !== ids[0])) return null;
|
|
22748
|
+
return ids[0] ?? null;
|
|
22749
|
+
}
|
|
22750
|
+
function draftIdFromMemoValue(value) {
|
|
22751
|
+
if (isLegacySevenSlotDraftWrapper(value) && typeof value[2] === "string" && value[2].startsWith("client-new-thread:")) {
|
|
22752
|
+
return value[2];
|
|
22753
|
+
}
|
|
22754
|
+
return duplicatedClientNewThreadId(value);
|
|
22755
|
+
}
|
|
22756
22756
|
function findComposerDomIdentity(composer) {
|
|
22757
22757
|
const children = Array.from(composer.children ?? []);
|
|
22758
22758
|
const portals = children.filter((child) => child.hasAttribute("data-above-composer-portal"));
|
|
@@ -22771,9 +22771,8 @@ ${error51.stderrTail}`] : []
|
|
|
22771
22771
|
const memoCache = isRecord7(updateQueue) ? updateQueue.memoCache : null;
|
|
22772
22772
|
const data = isRecord7(memoCache) && Array.isArray(memoCache.data) ? memoCache.data : [];
|
|
22773
22773
|
for (const value of data) {
|
|
22774
|
-
|
|
22775
|
-
|
|
22776
|
-
}
|
|
22774
|
+
const draftId = draftIdFromMemoValue(value);
|
|
22775
|
+
if (draftId) draftIds.add(draftId);
|
|
22777
22776
|
}
|
|
22778
22777
|
const parent = fiber.return;
|
|
22779
22778
|
fiber = (typeof parent === "object" || typeof parent === "function") && parent !== null ? parent : null;
|
|
@@ -22872,7 +22871,7 @@ ${error51.stderrTail}`] : []
|
|
|
22872
22871
|
...model ? { model } : {},
|
|
22873
22872
|
...thinkingOptionId && agent !== "cursor-cli" ? { thinkingOptionId } : {},
|
|
22874
22873
|
...permissionModeId ? { permissionModeId } : {}
|
|
22875
|
-
}) : transportModelIdForAgent(agent);
|
|
22874
|
+
}) : agent === "hermes" ? hermesTransportModelId(model, permissionModeId) : transportModelIdForAgent(agent);
|
|
22876
22875
|
return transportModelId ? { model: transportModelId, reasoningEffort } : officialSelection;
|
|
22877
22876
|
}
|
|
22878
22877
|
function installCurrentRendererAdapter() {
|
|
@@ -22979,19 +22978,39 @@ ${error51.stderrTail}`] : []
|
|
|
22979
22978
|
}
|
|
22980
22979
|
return client.consumeCodexAccountResetCredit(input);
|
|
22981
22980
|
},
|
|
22982
|
-
|
|
22981
|
+
listHarnessAccountSources: () => {
|
|
22982
|
+
const client = currentModelClient();
|
|
22983
|
+
if (!client.listHarnessAccountSources) {
|
|
22984
|
+
throw new Error("Harness account source discovery is unavailable");
|
|
22985
|
+
}
|
|
22986
|
+
return client.listHarnessAccountSources();
|
|
22987
|
+
},
|
|
22988
|
+
inspectHarnessAccount: (input) => {
|
|
22989
|
+
const client = currentModelClient();
|
|
22990
|
+
if (!client.inspectHarnessAccount) {
|
|
22991
|
+
throw new Error("Harness account inspection is unavailable");
|
|
22992
|
+
}
|
|
22993
|
+
return client.inspectHarnessAccount(input);
|
|
22994
|
+
},
|
|
22995
|
+
listHarnessAccounts: (input) => {
|
|
22983
22996
|
const client = currentModelClient();
|
|
22984
22997
|
if (!client.listHarnessAccounts) throw new Error("Harness account inspection is unavailable");
|
|
22985
|
-
return client.listHarnessAccounts();
|
|
22998
|
+
return client.listHarnessAccounts(input);
|
|
22986
22999
|
},
|
|
22987
23000
|
listCodexAccounts: () => currentModelClient().listCodexAccounts(),
|
|
22988
23001
|
refreshCodexAccounts: () => {
|
|
22989
23002
|
const client = currentModelClient();
|
|
22990
23003
|
return client.refreshCodexAccounts?.() ?? client.listCodexAccounts();
|
|
22991
23004
|
},
|
|
22992
|
-
createCodexAccount: (input) => currentModelClient().createCodexAccount(input),
|
|
22993
23005
|
deleteCodexAccount: (input) => currentModelClient().deleteCodexAccount(input),
|
|
22994
|
-
|
|
23006
|
+
switchCodexAccount: (input) => currentModelClient().switchCodexAccount(input),
|
|
23007
|
+
logoutCodexAccount: (input) => currentModelClient().logoutCodexAccount(input),
|
|
23008
|
+
recoverCodexAccounts: (input) => currentModelClient().recoverCodexAccounts(input),
|
|
23009
|
+
subscribeCodexAccounts: (listener) => {
|
|
23010
|
+
const client = currentModelClient();
|
|
23011
|
+
if (!client.subscribeCodexAccounts) throw new Error("Codex Account updates are unavailable");
|
|
23012
|
+
return client.subscribeCodexAccounts(listener);
|
|
23013
|
+
},
|
|
22995
23014
|
startCodexAccountLogin: (input) => currentModelClient().startCodexAccountLogin(input),
|
|
22996
23015
|
cancelCodexAccountLogin: (input) => currentModelClient().cancelCodexAccountLogin(input),
|
|
22997
23016
|
subscribeCodexAccountLogin: (listener) => currentModelClient().subscribeCodexAccountLogin(listener)
|
|
@@ -24285,6 +24304,20 @@ ${error51.stderrTail}`] : []
|
|
|
24285
24304
|
}
|
|
24286
24305
|
}
|
|
24287
24306
|
|
|
24307
|
+
// src/renderer-codex-account-options.ts
|
|
24308
|
+
function codexAccountDisplayName(account) {
|
|
24309
|
+
const full = account.email ?? account.label;
|
|
24310
|
+
const separator = account.email?.lastIndexOf("@") ?? -1;
|
|
24311
|
+
if (!account.email || separator <= 0 || separator === account.email.length - 1) {
|
|
24312
|
+
return { local: full, domain: null, full };
|
|
24313
|
+
}
|
|
24314
|
+
return {
|
|
24315
|
+
local: account.email.slice(0, separator),
|
|
24316
|
+
domain: account.email.slice(separator + 1),
|
|
24317
|
+
full
|
|
24318
|
+
};
|
|
24319
|
+
}
|
|
24320
|
+
|
|
24288
24321
|
// src/settings/accounts-details.ts
|
|
24289
24322
|
function createAccountDetails(document2, messages, input) {
|
|
24290
24323
|
const root = document2.createElement("div");
|
|
@@ -24457,34 +24490,84 @@ ${error51.stderrTail}`] : []
|
|
|
24457
24490
|
const mode = display === "remaining" ? messages.accountCreditsRemaining : messages.accountCreditsUsed;
|
|
24458
24491
|
return `${creditsPeriodLabel2(period, messages)}${messages.locale === "zh-CN" ? "" : " "}${mode}`;
|
|
24459
24492
|
}
|
|
24460
|
-
function
|
|
24461
|
-
|
|
24493
|
+
function comparisonPeriod(periodType) {
|
|
24494
|
+
if (periodType === "five_hour") return "five_hour";
|
|
24495
|
+
if (periodType === "weekly" || periodType === "seven_day") return "seven_day";
|
|
24496
|
+
return null;
|
|
24497
|
+
}
|
|
24498
|
+
function scopedUsageProduct(product) {
|
|
24499
|
+
const suffixes = [
|
|
24500
|
+
[" \xB7 5-hour window", "five_hour"],
|
|
24501
|
+
[" \xB7 Weekly window", "seven_day"],
|
|
24502
|
+
[" \xB7 7-day window", "seven_day"],
|
|
24503
|
+
[" \xB7 5-hour", "five_hour"],
|
|
24504
|
+
[" \xB7 7-day", "seven_day"]
|
|
24505
|
+
];
|
|
24506
|
+
for (const [suffix, period] of suffixes) {
|
|
24507
|
+
if (!product.endsWith(suffix)) continue;
|
|
24508
|
+
const scope = product.slice(0, -suffix.length).trim();
|
|
24509
|
+
if (scope) return { scope, period };
|
|
24510
|
+
}
|
|
24511
|
+
return null;
|
|
24512
|
+
}
|
|
24513
|
+
function splitUsageWindows(credits, messages, filter) {
|
|
24514
|
+
const generic = { columns: {} };
|
|
24515
|
+
const scopedRows = /* @__PURE__ */ new Map();
|
|
24462
24516
|
const additional = [];
|
|
24517
|
+
const addScoped = (scope, period, window2) => {
|
|
24518
|
+
const rows2 = scopedRows.get(scope) ?? [];
|
|
24519
|
+
let row = rows2.find((candidate) => !candidate.columns[period]);
|
|
24520
|
+
if (!row) {
|
|
24521
|
+
row = { scope, columns: {} };
|
|
24522
|
+
rows2.push(row);
|
|
24523
|
+
scopedRows.set(scope, rows2);
|
|
24524
|
+
}
|
|
24525
|
+
row.columns[period] = { ...window2, label: scope, scoped: true };
|
|
24526
|
+
};
|
|
24527
|
+
const addWindow = (window2, period, scope) => {
|
|
24528
|
+
if (scope && period) addScoped(scope, period, window2);
|
|
24529
|
+
else if (!scope && period && !generic.columns[period]) generic.columns[period] = window2;
|
|
24530
|
+
else additional.push(window2);
|
|
24531
|
+
};
|
|
24463
24532
|
const primary = {
|
|
24464
24533
|
label: credits.label ?? creditsPeriodLabel2(credits.periodType, messages),
|
|
24465
24534
|
usedPercent: credits.usedPercent,
|
|
24466
|
-
resetsAt: credits.resetsAt
|
|
24467
|
-
|
|
24468
|
-
|
|
24469
|
-
|
|
24470
|
-
|
|
24471
|
-
|
|
24535
|
+
resetsAt: credits.resetsAt,
|
|
24536
|
+
scoped: Boolean(credits.label && scopedUsageProduct(credits.label))
|
|
24537
|
+
};
|
|
24538
|
+
const primaryScope = credits.label ? scopedUsageProduct(credits.label) : null;
|
|
24539
|
+
addWindow(
|
|
24540
|
+
primary,
|
|
24541
|
+
primaryScope?.period ?? (credits.label ? null : comparisonPeriod(credits.periodType)),
|
|
24542
|
+
primaryScope?.scope
|
|
24543
|
+
);
|
|
24472
24544
|
for (const product of credits.productUsage ?? []) {
|
|
24545
|
+
const scoped = scopedUsageProduct(product.product);
|
|
24473
24546
|
const window2 = {
|
|
24474
24547
|
label: creditsProductLabel(product.product, messages),
|
|
24475
24548
|
usedPercent: product.usagePercent,
|
|
24476
|
-
resetsAt: product.resetsAt
|
|
24549
|
+
resetsAt: product.resetsAt,
|
|
24550
|
+
scoped: Boolean(scoped)
|
|
24477
24551
|
};
|
|
24478
|
-
const
|
|
24479
|
-
|
|
24480
|
-
|
|
24481
|
-
|
|
24482
|
-
|
|
24483
|
-
|
|
24552
|
+
const genericPeriod = product.product === "5-hour window" ? "five_hour" : product.product === "7-day window" ? "seven_day" : null;
|
|
24553
|
+
addWindow(window2, scoped?.period ?? genericPeriod, scoped?.scope);
|
|
24554
|
+
}
|
|
24555
|
+
const structured = [...scopedRows.values()].flat();
|
|
24556
|
+
let rows = Object.keys(generic.columns).length > 0 ? [generic, ...structured] : structured;
|
|
24557
|
+
if (rows.length === 0) rows = [generic];
|
|
24558
|
+
if (filter === "weekly-only") {
|
|
24559
|
+
rows = rows.map((row) => ({
|
|
24560
|
+
...row,
|
|
24561
|
+
columns: row.columns.seven_day ? { seven_day: row.columns.seven_day } : {}
|
|
24562
|
+
})).filter((row) => row.columns.seven_day);
|
|
24563
|
+
if (rows.length === 0) rows = [{ columns: {} }];
|
|
24564
|
+
return { rows, additional: [] };
|
|
24565
|
+
}
|
|
24566
|
+
return { rows, additional };
|
|
24484
24567
|
}
|
|
24485
24568
|
function renderUsageWindow(document2, window2, messages, display) {
|
|
24486
24569
|
const meter = document2.createElement("div");
|
|
24487
|
-
meter.className = "settings-account-usage__meter";
|
|
24570
|
+
meter.className = window2.scoped ? "settings-account-usage__meter settings-account-usage__meter--scoped" : "settings-account-usage__meter";
|
|
24488
24571
|
const label = document2.createElement("span");
|
|
24489
24572
|
label.className = "settings-account-usage__title";
|
|
24490
24573
|
label.textContent = window2.label;
|
|
@@ -24513,7 +24596,7 @@ ${error51.stderrTail}`] : []
|
|
|
24513
24596
|
if (reset) meter.append(reset.timestamp);
|
|
24514
24597
|
return meter;
|
|
24515
24598
|
}
|
|
24516
|
-
function renderAccountUsage(document2, state, messages, display, onRetry) {
|
|
24599
|
+
function renderAccountUsage(document2, state, messages, display, onRetry, filter = "all") {
|
|
24517
24600
|
if (state?.status !== "ready") {
|
|
24518
24601
|
const cell = document2.createElement("td");
|
|
24519
24602
|
cell.colSpan = 2;
|
|
@@ -24535,20 +24618,20 @@ ${error51.stderrTail}`] : []
|
|
|
24535
24618
|
usage.append(retry);
|
|
24536
24619
|
}
|
|
24537
24620
|
cell.append(usage);
|
|
24538
|
-
return { cells: [cell], additional: null };
|
|
24621
|
+
return { cells: [cell], continuationCells: [], additional: null };
|
|
24539
24622
|
}
|
|
24540
|
-
const {
|
|
24541
|
-
const
|
|
24623
|
+
const { rows, additional } = splitUsageWindows(state.credits, messages, filter);
|
|
24624
|
+
const renderCells = (row) => ["five_hour", "seven_day"].map((period) => {
|
|
24542
24625
|
const cell = document2.createElement("td");
|
|
24543
24626
|
cell.className = "settings-account-usage-cell";
|
|
24544
|
-
const window2 = columns[period];
|
|
24627
|
+
const window2 = row.columns[period];
|
|
24545
24628
|
if (window2) cell.append(renderUsageWindow(document2, window2, messages, display));
|
|
24546
24629
|
else {
|
|
24547
24630
|
const missing = document2.createElement("div");
|
|
24548
24631
|
missing.className = "settings-account-usage__missing";
|
|
24549
24632
|
const label = document2.createElement("span");
|
|
24550
24633
|
label.className = "settings-account-usage__title";
|
|
24551
|
-
label.textContent = creditsPeriodLabel2(period, messages);
|
|
24634
|
+
label.textContent = row.scope ?? creditsPeriodLabel2(period, messages);
|
|
24552
24635
|
const dash = document2.createElement("span");
|
|
24553
24636
|
dash.textContent = "\u2014";
|
|
24554
24637
|
dash.setAttribute("aria-hidden", "true");
|
|
@@ -24557,12 +24640,15 @@ ${error51.stderrTail}`] : []
|
|
|
24557
24640
|
}
|
|
24558
24641
|
return cell;
|
|
24559
24642
|
});
|
|
24560
|
-
|
|
24643
|
+
const [firstRow = { columns: {} }, ...continuations] = rows;
|
|
24644
|
+
const cells = renderCells(firstRow);
|
|
24645
|
+
const continuationCells = continuations.map(renderCells);
|
|
24646
|
+
if (!additional.length) return { cells, continuationCells, additional: null };
|
|
24561
24647
|
const extra = document2.createElement("div");
|
|
24562
24648
|
extra.className = "settings-account-extra-usage";
|
|
24563
24649
|
for (const window2 of additional)
|
|
24564
24650
|
extra.append(renderUsageWindow(document2, window2, messages, display));
|
|
24565
|
-
return { cells, additional: extra };
|
|
24651
|
+
return { cells, continuationCells, additional: extra };
|
|
24566
24652
|
}
|
|
24567
24653
|
function renderAccountResetCredits(document2, credits, messages, options) {
|
|
24568
24654
|
const resetCredits = credits.resetCredits;
|
|
@@ -24749,11 +24835,18 @@ ${error51.stderrTail}`] : []
|
|
|
24749
24835
|
agent: "Codex",
|
|
24750
24836
|
plan: accountPlanLabel(account.planType),
|
|
24751
24837
|
highlighted: account.planType === "pro" || account.planType === "prolite",
|
|
24752
|
-
active:
|
|
24838
|
+
active: input.current,
|
|
24753
24839
|
mark
|
|
24754
24840
|
})
|
|
24755
24841
|
);
|
|
24756
|
-
const usage = renderAccountUsage(
|
|
24842
|
+
const usage = renderAccountUsage(
|
|
24843
|
+
document2,
|
|
24844
|
+
input.usage,
|
|
24845
|
+
messages,
|
|
24846
|
+
input.display,
|
|
24847
|
+
input.onRetry,
|
|
24848
|
+
account.planType === "pro" ? "weekly-only" : "all"
|
|
24849
|
+
);
|
|
24757
24850
|
if (usage.additional) personCell.append(usage.additional);
|
|
24758
24851
|
const actionsCell = document2.createElement("td");
|
|
24759
24852
|
actionsCell.className = "settings-account-management-cell";
|
|
@@ -24761,29 +24854,28 @@ ${error51.stderrTail}`] : []
|
|
|
24761
24854
|
management.className = "settings-account-management";
|
|
24762
24855
|
const actions = document2.createElement("div");
|
|
24763
24856
|
actions.className = "settings-account-actions";
|
|
24764
|
-
|
|
24857
|
+
const more = [];
|
|
24858
|
+
if (!input.current) {
|
|
24765
24859
|
const activate = document2.createElement("button");
|
|
24766
24860
|
activate.type = "button";
|
|
24767
24861
|
activate.className = "settings-account-action";
|
|
24768
24862
|
activate.textContent = messages.accountUse;
|
|
24769
24863
|
activate.title = messages.accountDefaultHint;
|
|
24770
24864
|
activate.dataset.accountFocus = `${account.accountId}:activate`;
|
|
24771
|
-
activate.disabled = input.actionsDisabled;
|
|
24865
|
+
activate.disabled = input.actionsDisabled || input.switchDisabled;
|
|
24772
24866
|
activate.addEventListener("click", input.onActivate);
|
|
24773
24867
|
actions.append(activate);
|
|
24774
24868
|
}
|
|
24775
|
-
|
|
24776
|
-
|
|
24777
|
-
|
|
24778
|
-
|
|
24779
|
-
|
|
24780
|
-
|
|
24781
|
-
|
|
24782
|
-
|
|
24783
|
-
|
|
24784
|
-
|
|
24785
|
-
const more = [];
|
|
24786
|
-
if (account.email && input.usage) {
|
|
24869
|
+
const signIn = document2.createElement("button");
|
|
24870
|
+
signIn.type = "button";
|
|
24871
|
+
signIn.className = "settings-account-action";
|
|
24872
|
+
signIn.textContent = messages.accountSignIn;
|
|
24873
|
+
signIn.dataset.accountFocus = `${account.accountId}:login`;
|
|
24874
|
+
signIn.disabled = input.actionsDisabled || input.loginDisabled;
|
|
24875
|
+
signIn.addEventListener("click", input.onSignIn);
|
|
24876
|
+
if (account.email) more.push(signIn);
|
|
24877
|
+
else actions.append(signIn);
|
|
24878
|
+
if (input.usage) {
|
|
24787
24879
|
const refresh = document2.createElement("button");
|
|
24788
24880
|
refresh.type = "button";
|
|
24789
24881
|
refresh.className = "settings-account-action";
|
|
@@ -24793,14 +24885,23 @@ ${error51.stderrTail}`] : []
|
|
|
24793
24885
|
refresh.addEventListener("click", input.onRetry);
|
|
24794
24886
|
more.push(refresh);
|
|
24795
24887
|
}
|
|
24796
|
-
if (
|
|
24888
|
+
if (input.current) {
|
|
24889
|
+
const logout = document2.createElement("button");
|
|
24890
|
+
logout.type = "button";
|
|
24891
|
+
logout.className = "settings-account-action";
|
|
24892
|
+
logout.textContent = messages.accountLogout;
|
|
24893
|
+
logout.dataset.accountFocus = `${account.accountId}:logout`;
|
|
24894
|
+
logout.disabled = input.actionsDisabled || input.logoutDisabled;
|
|
24895
|
+
logout.addEventListener("click", input.onLogout);
|
|
24896
|
+
more.push(logout);
|
|
24897
|
+
} else {
|
|
24797
24898
|
const remove = document2.createElement("button");
|
|
24798
24899
|
remove.type = "button";
|
|
24799
24900
|
remove.className = "settings-account-action settings-account-delete";
|
|
24800
24901
|
remove.textContent = messages.accountDelete;
|
|
24801
24902
|
remove.dataset.accountFocus = `${account.accountId}:delete`;
|
|
24802
24903
|
remove.setAttribute("aria-label", `${messages.accountDelete}: ${name.full}`);
|
|
24803
|
-
remove.disabled = input.actionsDisabled;
|
|
24904
|
+
remove.disabled = input.actionsDisabled || input.deleteDisabled;
|
|
24804
24905
|
remove.addEventListener("click", input.onDelete);
|
|
24805
24906
|
more.push(remove);
|
|
24806
24907
|
}
|
|
@@ -24818,9 +24919,22 @@ ${error51.stderrTail}`] : []
|
|
|
24818
24919
|
);
|
|
24819
24920
|
management.append(actions);
|
|
24820
24921
|
actionsCell.append(management);
|
|
24922
|
+
const continuationRows = usage.continuationCells.map((cells) => {
|
|
24923
|
+
const continuation = document2.createElement("tr");
|
|
24924
|
+
continuation.className = "settings-account-row settings-account-quota-continuation-row";
|
|
24925
|
+
continuation.dataset.accountId = account.accountId;
|
|
24926
|
+
continuation.append(...cells);
|
|
24927
|
+
return continuation;
|
|
24928
|
+
});
|
|
24929
|
+
if (continuationRows.length > 0) {
|
|
24930
|
+
personCell.rowSpan = continuationRows.length + 1;
|
|
24931
|
+
personCell.className += " settings-account-spanning-cell";
|
|
24932
|
+
actionsCell.rowSpan = continuationRows.length + 1;
|
|
24933
|
+
actionsCell.className += " settings-account-spanning-cell";
|
|
24934
|
+
}
|
|
24821
24935
|
row.append(personCell, ...usage.cells, actionsCell);
|
|
24822
24936
|
const reset = input.usage?.status === "ready" ? renderAccountResetCredits(document2, input.usage.credits, messages, input) : null;
|
|
24823
|
-
if (!reset) return [row];
|
|
24937
|
+
if (!reset) return [row, ...continuationRows];
|
|
24824
24938
|
const detailsRow = document2.createElement("tr");
|
|
24825
24939
|
detailsRow.className = "settings-account-details-row";
|
|
24826
24940
|
detailsRow.id = `settings-account-reset-${++resetDetailsSequence}`;
|
|
@@ -24838,9 +24952,9 @@ ${error51.stderrTail}`] : []
|
|
|
24838
24952
|
input.onResetExpanded(!detailsRow.hidden);
|
|
24839
24953
|
});
|
|
24840
24954
|
management.append(reset.summary);
|
|
24841
|
-
return [row, detailsRow];
|
|
24955
|
+
return [row, ...continuationRows, detailsRow];
|
|
24842
24956
|
}
|
|
24843
|
-
function
|
|
24957
|
+
function renderHarnessAccountRows(document2, account, messages, display) {
|
|
24844
24958
|
const row = document2.createElement("tr");
|
|
24845
24959
|
row.className = "settings-account-row";
|
|
24846
24960
|
row.dataset.harnessId = account.harnessId;
|
|
@@ -24864,10 +24978,11 @@ ${error51.stderrTail}`] : []
|
|
|
24864
24978
|
);
|
|
24865
24979
|
const usage = renderAccountUsage(
|
|
24866
24980
|
document2,
|
|
24867
|
-
{ status: "ready", credits: account.credits },
|
|
24981
|
+
{ status: "ready", credits: account.credits, freshness: "live", observedAt: null },
|
|
24868
24982
|
messages,
|
|
24869
24983
|
display,
|
|
24870
|
-
() => void 0
|
|
24984
|
+
() => void 0,
|
|
24985
|
+
account.harnessId === "grok" ? "weekly-only" : "all"
|
|
24871
24986
|
);
|
|
24872
24987
|
if (usage.additional) personCell.append(usage.additional);
|
|
24873
24988
|
const managementCell = document2.createElement("td");
|
|
@@ -24885,14 +25000,71 @@ ${error51.stderrTail}`] : []
|
|
|
24885
25000
|
});
|
|
24886
25001
|
management.append(label, info);
|
|
24887
25002
|
managementCell.append(management);
|
|
25003
|
+
const continuationRows = usage.continuationCells.map((cells) => {
|
|
25004
|
+
const continuation = document2.createElement("tr");
|
|
25005
|
+
continuation.className = "settings-account-row settings-account-quota-continuation-row";
|
|
25006
|
+
continuation.dataset.harnessId = account.harnessId;
|
|
25007
|
+
continuation.append(...cells);
|
|
25008
|
+
return continuation;
|
|
25009
|
+
});
|
|
25010
|
+
if (continuationRows.length > 0) {
|
|
25011
|
+
personCell.rowSpan = continuationRows.length + 1;
|
|
25012
|
+
personCell.className += " settings-account-spanning-cell";
|
|
25013
|
+
managementCell.rowSpan = continuationRows.length + 1;
|
|
25014
|
+
managementCell.className += " settings-account-spanning-cell";
|
|
25015
|
+
}
|
|
24888
25016
|
row.append(personCell, ...usage.cells, managementCell);
|
|
24889
|
-
return row;
|
|
25017
|
+
return [row, ...continuationRows];
|
|
24890
25018
|
}
|
|
24891
25019
|
|
|
24892
25020
|
// src/settings/harness-accounts.ts
|
|
25021
|
+
function sortedAccounts(accounts) {
|
|
25022
|
+
return [...accounts].sort((a, b) => {
|
|
25023
|
+
if (a.harnessId === "antigravity") return b.harnessId === "antigravity" ? 0 : 1;
|
|
25024
|
+
if (b.harnessId === "antigravity") return -1;
|
|
25025
|
+
return a.harnessId.localeCompare(b.harnessId);
|
|
25026
|
+
});
|
|
25027
|
+
}
|
|
24893
25028
|
function createHarnessAccounts(signal, getClient, onChange) {
|
|
24894
25029
|
let accounts = [];
|
|
24895
25030
|
let refreshing = false;
|
|
25031
|
+
const loadProgressively = async (client, force) => {
|
|
25032
|
+
let sources;
|
|
25033
|
+
try {
|
|
25034
|
+
sources = await client.listHarnessAccountSources();
|
|
25035
|
+
} catch {
|
|
25036
|
+
return false;
|
|
25037
|
+
}
|
|
25038
|
+
if (signal.aborted) return true;
|
|
25039
|
+
const byHarnessId = new Map(accounts.map((account) => [account.harnessId, account]));
|
|
25040
|
+
await Promise.all(
|
|
25041
|
+
sources.sources.map(async (source) => {
|
|
25042
|
+
try {
|
|
25043
|
+
const result = await client.inspectHarnessAccount({
|
|
25044
|
+
harnessId: source.harnessId,
|
|
25045
|
+
...force ? { refresh: true } : {}
|
|
25046
|
+
});
|
|
25047
|
+
if (signal.aborted || result.harnessId !== source.harnessId) return;
|
|
25048
|
+
if (result.account) {
|
|
25049
|
+
byHarnessId.set(result.harnessId, {
|
|
25050
|
+
...result.account,
|
|
25051
|
+
harnessId: result.harnessId,
|
|
25052
|
+
harnessName: result.harnessName
|
|
25053
|
+
});
|
|
25054
|
+
} else {
|
|
25055
|
+
byHarnessId.delete(source.harnessId);
|
|
25056
|
+
}
|
|
25057
|
+
} catch {
|
|
25058
|
+
if (!signal.aborted) byHarnessId.delete(source.harnessId);
|
|
25059
|
+
}
|
|
25060
|
+
if (!signal.aborted) {
|
|
25061
|
+
accounts = sortedAccounts(byHarnessId.values());
|
|
25062
|
+
onChange();
|
|
25063
|
+
}
|
|
25064
|
+
})
|
|
25065
|
+
);
|
|
25066
|
+
return true;
|
|
25067
|
+
};
|
|
24896
25068
|
return {
|
|
24897
25069
|
get accounts() {
|
|
24898
25070
|
return accounts;
|
|
@@ -24900,16 +25072,25 @@ ${error51.stderrTail}`] : []
|
|
|
24900
25072
|
get refreshing() {
|
|
24901
25073
|
return refreshing;
|
|
24902
25074
|
},
|
|
24903
|
-
async refresh() {
|
|
25075
|
+
async refresh(force = false) {
|
|
24904
25076
|
if (refreshing || signal.aborted) return;
|
|
24905
25077
|
const client = getClient();
|
|
24906
|
-
if (!client
|
|
25078
|
+
if (!client) return;
|
|
24907
25079
|
refreshing = true;
|
|
25080
|
+
accounts = [];
|
|
24908
25081
|
onChange();
|
|
24909
25082
|
try {
|
|
24910
|
-
const
|
|
24911
|
-
|
|
24912
|
-
|
|
25083
|
+
const progressive = client.listHarnessAccountSources && client.inspectHarnessAccount ? await loadProgressively(
|
|
25084
|
+
{
|
|
25085
|
+
listHarnessAccountSources: client.listHarnessAccountSources.bind(client),
|
|
25086
|
+
inspectHarnessAccount: client.inspectHarnessAccount.bind(client)
|
|
25087
|
+
},
|
|
25088
|
+
force
|
|
25089
|
+
) : false;
|
|
25090
|
+
if (progressive || signal.aborted) return;
|
|
25091
|
+
if (!client.listHarnessAccounts) return;
|
|
25092
|
+
const result = await client.listHarnessAccounts(force ? { refresh: true } : {});
|
|
25093
|
+
if (!signal.aborted) accounts = sortedAccounts(result.accounts);
|
|
24913
25094
|
} catch {
|
|
24914
25095
|
if (!signal.aborted) accounts = [];
|
|
24915
25096
|
} finally {
|
|
@@ -24937,10 +25118,7 @@ ${error51.stderrTail}`] : []
|
|
|
24937
25118
|
const heading = document2.createElement("h1");
|
|
24938
25119
|
heading.className = "settings-section-label";
|
|
24939
25120
|
heading.textContent = messages.pageLabels.accounts;
|
|
24940
|
-
|
|
24941
|
-
description.className = "settings-page-description";
|
|
24942
|
-
description.textContent = messages.accountsDescription;
|
|
24943
|
-
copy.append(heading, description);
|
|
25121
|
+
copy.append(heading);
|
|
24944
25122
|
const add = document2.createElement("button");
|
|
24945
25123
|
add.type = "button";
|
|
24946
25124
|
add.className = "settings-command-button";
|
|
@@ -24990,7 +25168,7 @@ ${error51.stderrTail}`] : []
|
|
|
24990
25168
|
refreshUsage.addEventListener("click", () => {
|
|
24991
25169
|
usageByAccountId.clear();
|
|
24992
25170
|
loadUsage(accounts);
|
|
24993
|
-
void harnessAccounts?.refresh();
|
|
25171
|
+
void harnessAccounts?.refresh(true);
|
|
24994
25172
|
});
|
|
24995
25173
|
search.addEventListener("input", () => render());
|
|
24996
25174
|
toolbar.append(connected, searchWrapper, displayControls, refreshUsage);
|
|
@@ -25001,18 +25179,34 @@ ${error51.stderrTail}`] : []
|
|
|
25001
25179
|
context.content.append(header, status, toolbar, list);
|
|
25002
25180
|
const stopCountdowns = mountAccountResetCountdowns(list, messages, context.signal);
|
|
25003
25181
|
let accounts = [];
|
|
25182
|
+
let currentAccountId = null;
|
|
25183
|
+
let accountPhase = "unavailable";
|
|
25184
|
+
let accountRevision = 0;
|
|
25185
|
+
let accountInstanceId;
|
|
25186
|
+
let hasAccountSnapshot = false;
|
|
25187
|
+
let cleanupRequired = false;
|
|
25188
|
+
let capabilities = {
|
|
25189
|
+
manage: false,
|
|
25190
|
+
switch: false,
|
|
25191
|
+
login: false,
|
|
25192
|
+
delete: false
|
|
25193
|
+
};
|
|
25004
25194
|
let accountCreating = false;
|
|
25005
25195
|
let accountActivating = false;
|
|
25196
|
+
let accountRecovering = false;
|
|
25197
|
+
let accountLoggingOut = false;
|
|
25006
25198
|
let deletingAccountId = null;
|
|
25007
25199
|
let login = null;
|
|
25008
25200
|
let loginStartingAccountId = null;
|
|
25009
25201
|
let loginMessage = null;
|
|
25010
25202
|
let loginRefreshTimer;
|
|
25203
|
+
let loginStartSnapshot;
|
|
25204
|
+
const earlyLoginCompletions = /* @__PURE__ */ new Map();
|
|
25011
25205
|
const usageByAccountId = /* @__PURE__ */ new Map();
|
|
25012
25206
|
let usingResetAccountId = null;
|
|
25013
25207
|
let usageDisplay = "remaining";
|
|
25014
25208
|
const expandedResetAccounts = /* @__PURE__ */ new Set();
|
|
25015
|
-
const accountBusy = () => accountCreating || accountActivating || deletingAccountId !== null || login !== null || loginStartingAccountId !== null || usingResetAccountId !== null;
|
|
25209
|
+
const accountBusy = () => accountCreating || accountActivating || accountRecovering || accountLoggingOut || accountPhase === "changing" || deletingAccountId !== null || login !== null || loginStartingAccountId !== null || usingResetAccountId !== null;
|
|
25016
25210
|
const clearLoginRefresh = () => {
|
|
25017
25211
|
if (loginRefreshTimer === void 0) return;
|
|
25018
25212
|
document2.defaultView?.clearTimeout(loginRefreshTimer);
|
|
@@ -25028,14 +25222,16 @@ ${error51.stderrTail}`] : []
|
|
|
25028
25222
|
() => client().refreshCodexAccounts?.() ?? client().listCodexAccounts(),
|
|
25029
25223
|
{
|
|
25030
25224
|
success(result) {
|
|
25031
|
-
const
|
|
25032
|
-
|
|
25033
|
-
);
|
|
25034
|
-
if (
|
|
25225
|
+
const refreshedLogin = login;
|
|
25226
|
+
const snapshotAdvanced = loginStartSnapshot && (result.instanceId !== void 0 && result.instanceId !== loginStartSnapshot.instanceId || result.instanceId === loginStartSnapshot.instanceId && result.revision > loginStartSnapshot.revision);
|
|
25227
|
+
setAccounts(result);
|
|
25228
|
+
if (refreshedLogin && snapshotAdvanced && result.phase !== "changing" && !(result.pendingOperation?.kind === "login" && result.pendingOperation.operationId === refreshedLogin.loginId)) {
|
|
25035
25229
|
login = null;
|
|
25036
|
-
|
|
25230
|
+
loginStartSnapshot = void 0;
|
|
25231
|
+
loginMessage = messages.accountLoginResultUnconfirmed;
|
|
25232
|
+
render();
|
|
25233
|
+
return;
|
|
25037
25234
|
}
|
|
25038
|
-
setAccounts(result.accounts);
|
|
25039
25235
|
scheduleLoginRefresh();
|
|
25040
25236
|
},
|
|
25041
25237
|
failure() {
|
|
@@ -25048,14 +25244,26 @@ ${error51.stderrTail}`] : []
|
|
|
25048
25244
|
const render = () => {
|
|
25049
25245
|
const restoreFocus = accountListFocusRestorer(list, search);
|
|
25050
25246
|
body.replaceChildren();
|
|
25051
|
-
status.
|
|
25247
|
+
status.replaceChildren();
|
|
25248
|
+
const cleanupOnly = cleanupRequired && accountPhase === "ready";
|
|
25249
|
+
const accountStatus = cleanupRequired ? cleanupOnly ? messages.accountCleanupRequired : messages.accountSavedUnavailable : accountPhase === "unavailable" && capabilities.reason === "recovery-required" ? messages.accountRecoveryRequired : capabilities.reason === "migration-required" ? accountPhase === "ready" && currentAccountId !== null ? messages.accountLegacyCompatibility : messages.accountMigrationRequired : loginMessage;
|
|
25250
|
+
if (accountStatus) status.append(accountStatus);
|
|
25251
|
+
if ((cleanupRequired || capabilities.reason === "recovery-required") && capabilities.recover) {
|
|
25252
|
+
const recover = document2.createElement("button");
|
|
25253
|
+
recover.type = "button";
|
|
25254
|
+
recover.className = "settings-command-button settings-command-button--secondary";
|
|
25255
|
+
recover.textContent = cleanupOnly ? accountRecovering ? messages.accountCleaningUp : messages.accountRetryCleanup : accountRecovering ? messages.accountRecovering : messages.accountRecover;
|
|
25256
|
+
recover.disabled = accountBusy();
|
|
25257
|
+
recover.addEventListener("click", recoverAccounts);
|
|
25258
|
+
status.append(" ", recover);
|
|
25259
|
+
}
|
|
25052
25260
|
connectedCount.textContent = String(accounts.length + harnessAccounts.accounts.length);
|
|
25053
25261
|
updateDisplay(usageDisplay);
|
|
25054
25262
|
search.disabled = login !== null || loginStartingAccountId !== null;
|
|
25055
25263
|
for (const [display, button] of displayButtons) {
|
|
25056
25264
|
button.setAttribute("aria-pressed", String(display === usageDisplay));
|
|
25057
25265
|
}
|
|
25058
|
-
refreshUsage.disabled = (!getClient()?.inspectCodexAccountUsage ||
|
|
25266
|
+
refreshUsage.disabled = (!getClient()?.inspectCodexAccountUsage || accounts.length === 0) && !getClient()?.listHarnessAccounts || harnessAccounts?.refreshing === true || [...usageByAccountId.values()].some((usage) => usage.status === "loading") || accountBusy();
|
|
25059
25267
|
const query = search.value.trim().toLocaleLowerCase();
|
|
25060
25268
|
const visibleAccounts = accounts.filter(
|
|
25061
25269
|
(account) => `Codex ${account.email ?? ""} ${account.label} ${accountPlanLabel(account.planType) ?? ""}`.toLocaleLowerCase().includes(query)
|
|
@@ -25072,19 +25280,25 @@ ${error51.stderrTail}`] : []
|
|
|
25072
25280
|
emptyRow.append(emptyCell);
|
|
25073
25281
|
body.append(emptyRow);
|
|
25074
25282
|
}
|
|
25075
|
-
add.disabled = accountBusy();
|
|
25283
|
+
add.disabled = accountBusy() || !capabilities.login;
|
|
25076
25284
|
for (const account of visibleAccounts) {
|
|
25077
25285
|
body.append(
|
|
25078
25286
|
...renderAccountRows(document2, account, messages, {
|
|
25287
|
+
current: accountPhase === "ready" && account.accountId === currentAccountId,
|
|
25079
25288
|
usage: usageByAccountId.get(account.accountId),
|
|
25080
25289
|
display: usageDisplay,
|
|
25081
25290
|
actionsDisabled: accountBusy(),
|
|
25291
|
+
switchDisabled: !capabilities.switch,
|
|
25292
|
+
loginDisabled: !capabilities.login,
|
|
25293
|
+
deleteDisabled: !capabilities.delete,
|
|
25294
|
+
logoutDisabled: !capabilities.logout,
|
|
25082
25295
|
usingReset: usingResetAccountId === account.accountId,
|
|
25083
25296
|
resetDisabled: accountBusy(),
|
|
25084
25297
|
resetExpanded: expandedResetAccounts.has(account.accountId),
|
|
25085
|
-
onActivate: () =>
|
|
25298
|
+
onActivate: () => switchAccount(account.accountId),
|
|
25086
25299
|
onSignIn: () => startLogin(account.accountId),
|
|
25087
25300
|
onDelete: () => deleteAccount(account.accountId),
|
|
25301
|
+
onLogout: logoutAccount,
|
|
25088
25302
|
onRetry: () => {
|
|
25089
25303
|
usageByAccountId.delete(account.accountId);
|
|
25090
25304
|
loadUsage(accounts);
|
|
@@ -25093,7 +25307,7 @@ ${error51.stderrTail}`] : []
|
|
|
25093
25307
|
if (open) expandedResetAccounts.add(account.accountId);
|
|
25094
25308
|
else expandedResetAccounts.delete(account.accountId);
|
|
25095
25309
|
},
|
|
25096
|
-
...getClient()?.consumeCodexAccountResetCredit ? { onUseReset: () => useReset(account.accountId) } : {}
|
|
25310
|
+
...account.accountId === currentAccountId && accountPhase === "ready" && getClient()?.consumeCodexAccountResetCredit ? { onUseReset: () => useReset(account.accountId) } : {}
|
|
25097
25311
|
})
|
|
25098
25312
|
);
|
|
25099
25313
|
if (login?.accountId === account.accountId) {
|
|
@@ -25148,8 +25362,43 @@ ${error51.stderrTail}`] : []
|
|
|
25148
25362
|
body.append(verificationRow);
|
|
25149
25363
|
}
|
|
25150
25364
|
}
|
|
25365
|
+
if (login && !accounts.some((account) => account.accountId === login?.accountId)) {
|
|
25366
|
+
const verification = document2.createElement("div");
|
|
25367
|
+
verification.className = "settings-account-verification";
|
|
25368
|
+
const prompt = document2.createElement("span");
|
|
25369
|
+
prompt.textContent = messages.accountVerificationDescription;
|
|
25370
|
+
const link = document2.createElement("a");
|
|
25371
|
+
link.href = login.verificationUrl;
|
|
25372
|
+
link.target = "_blank";
|
|
25373
|
+
link.rel = "noopener noreferrer";
|
|
25374
|
+
link.textContent = login.verificationUrl;
|
|
25375
|
+
const code = document2.createElement("code");
|
|
25376
|
+
code.textContent = login.userCode;
|
|
25377
|
+
const copyCode = document2.createElement("button");
|
|
25378
|
+
copyCode.type = "button";
|
|
25379
|
+
copyCode.className = "settings-command-button settings-command-button--secondary";
|
|
25380
|
+
copyCode.textContent = messages.accountCopyCode;
|
|
25381
|
+
copyCode.addEventListener("click", () => {
|
|
25382
|
+
void document2.defaultView?.navigator.clipboard?.writeText(login?.userCode ?? "");
|
|
25383
|
+
});
|
|
25384
|
+
const cancel = document2.createElement("button");
|
|
25385
|
+
cancel.type = "button";
|
|
25386
|
+
cancel.className = "settings-command-button settings-command-button--secondary";
|
|
25387
|
+
cancel.textContent = messages.accountLoginCancel;
|
|
25388
|
+
cancel.addEventListener(
|
|
25389
|
+
"click",
|
|
25390
|
+
() => cancelLogin(login?.accountId ?? "", login?.loginId ?? "")
|
|
25391
|
+
);
|
|
25392
|
+
verification.append(prompt, link, code, copyCode, cancel);
|
|
25393
|
+
const verificationRow = document2.createElement("tr");
|
|
25394
|
+
const verificationCell = document2.createElement("td");
|
|
25395
|
+
verificationCell.colSpan = 4;
|
|
25396
|
+
verificationCell.append(verification);
|
|
25397
|
+
verificationRow.append(verificationCell);
|
|
25398
|
+
body.append(verificationRow);
|
|
25399
|
+
}
|
|
25151
25400
|
for (const account of visibleHarnessAccounts) {
|
|
25152
|
-
body.append(
|
|
25401
|
+
body.append(...renderHarnessAccountRows(document2, account, messages, usageDisplay));
|
|
25153
25402
|
}
|
|
25154
25403
|
restoreFocus();
|
|
25155
25404
|
};
|
|
@@ -25160,12 +25409,12 @@ ${error51.stderrTail}`] : []
|
|
|
25160
25409
|
};
|
|
25161
25410
|
const loadUsage = (nextAccounts) => {
|
|
25162
25411
|
const inspect = getClient()?.inspectCodexAccountUsage;
|
|
25163
|
-
const
|
|
25164
|
-
const keep = new Set(
|
|
25412
|
+
const saved = [...nextAccounts];
|
|
25413
|
+
const keep = new Set(saved.map((account) => account.accountId));
|
|
25165
25414
|
for (const accountId of [...usageByAccountId.keys()]) {
|
|
25166
25415
|
if (!keep.has(accountId)) usageByAccountId.delete(accountId);
|
|
25167
25416
|
}
|
|
25168
|
-
const pending =
|
|
25417
|
+
const pending = saved.filter((account) => !usageByAccountId.has(account.accountId));
|
|
25169
25418
|
if (!inspect || pending.length === 0) {
|
|
25170
25419
|
render();
|
|
25171
25420
|
return;
|
|
@@ -25184,7 +25433,12 @@ ${error51.stderrTail}`] : []
|
|
|
25184
25433
|
return;
|
|
25185
25434
|
usageByAccountId.set(
|
|
25186
25435
|
account.accountId,
|
|
25187
|
-
result.accountCredits ? {
|
|
25436
|
+
result.accountCredits ? {
|
|
25437
|
+
status: "ready",
|
|
25438
|
+
credits: result.accountCredits,
|
|
25439
|
+
freshness: result.freshness,
|
|
25440
|
+
observedAt: result.observedAt
|
|
25441
|
+
} : { status: "empty" }
|
|
25188
25442
|
);
|
|
25189
25443
|
} catch {
|
|
25190
25444
|
if (context.signal.aborted || usageByAccountId.get(account.accountId) !== loading)
|
|
@@ -25195,13 +25449,26 @@ ${error51.stderrTail}`] : []
|
|
|
25195
25449
|
})
|
|
25196
25450
|
);
|
|
25197
25451
|
};
|
|
25198
|
-
const setAccounts = (
|
|
25199
|
-
|
|
25452
|
+
const setAccounts = (result) => {
|
|
25453
|
+
if (!shouldApplyCodexAccountSnapshot(
|
|
25454
|
+
hasAccountSnapshot ? { instanceId: accountInstanceId, revision: accountRevision } : null,
|
|
25455
|
+
result
|
|
25456
|
+
)) {
|
|
25457
|
+
return;
|
|
25458
|
+
}
|
|
25459
|
+
hasAccountSnapshot = true;
|
|
25460
|
+
accounts = result.accounts;
|
|
25461
|
+
currentAccountId = result.currentAccountId;
|
|
25462
|
+
accountPhase = result.phase;
|
|
25463
|
+
accountRevision = result.revision;
|
|
25464
|
+
accountInstanceId = result.instanceId;
|
|
25465
|
+
cleanupRequired = result.cleanupRequired ?? false;
|
|
25466
|
+
capabilities = result.capabilities;
|
|
25200
25467
|
for (const accountId of expandedResetAccounts) {
|
|
25201
25468
|
if (!accounts.some((account) => account.accountId === accountId))
|
|
25202
25469
|
expandedResetAccounts.delete(accountId);
|
|
25203
25470
|
}
|
|
25204
|
-
loadUsage(
|
|
25471
|
+
loadUsage(accounts);
|
|
25205
25472
|
};
|
|
25206
25473
|
const refreshInBackground = () => {
|
|
25207
25474
|
if (!client().refreshCodexAccounts) return;
|
|
@@ -25209,18 +25476,18 @@ ${error51.stderrTail}`] : []
|
|
|
25209
25476
|
() => client().refreshCodexAccounts?.() ?? client().listCodexAccounts(),
|
|
25210
25477
|
{
|
|
25211
25478
|
success(result) {
|
|
25212
|
-
setAccounts(result
|
|
25479
|
+
setAccounts(result);
|
|
25213
25480
|
},
|
|
25214
25481
|
failure() {
|
|
25215
25482
|
}
|
|
25216
25483
|
}
|
|
25217
25484
|
);
|
|
25218
25485
|
};
|
|
25219
|
-
const load = () => {
|
|
25486
|
+
const load = (keepMessage = false) => {
|
|
25220
25487
|
void context.runLatest(() => client().listCodexAccounts(), {
|
|
25221
25488
|
success(result) {
|
|
25222
|
-
loginMessage = null;
|
|
25223
|
-
setAccounts(result
|
|
25489
|
+
if (!keepMessage) loginMessage = null;
|
|
25490
|
+
setAccounts(result);
|
|
25224
25491
|
refreshInBackground();
|
|
25225
25492
|
},
|
|
25226
25493
|
failure(error51) {
|
|
@@ -25229,20 +25496,38 @@ ${error51.stderrTail}`] : []
|
|
|
25229
25496
|
}
|
|
25230
25497
|
});
|
|
25231
25498
|
};
|
|
25232
|
-
const
|
|
25233
|
-
if (
|
|
25499
|
+
const completeLogin = (result) => {
|
|
25500
|
+
if (context.signal.aborted || result.loginId !== login?.loginId) return;
|
|
25501
|
+
clearLoginRefresh();
|
|
25502
|
+
login = null;
|
|
25503
|
+
loginStartSnapshot = void 0;
|
|
25504
|
+
cleanupRequired = result.cleanupRequired ?? cleanupRequired;
|
|
25505
|
+
loginMessage = result.saved || result.success ? messages.accountLoginSucceeded : result.error ?? messages.accountLoginFailed;
|
|
25506
|
+
render();
|
|
25507
|
+
if (result.saved || result.success) load(true);
|
|
25508
|
+
};
|
|
25509
|
+
const reconcileLoginStart = (result) => {
|
|
25510
|
+
login = result;
|
|
25511
|
+
const completed = earlyLoginCompletions.get(result.loginId);
|
|
25512
|
+
earlyLoginCompletions.clear();
|
|
25513
|
+
if (completed) {
|
|
25514
|
+
completeLogin(completed);
|
|
25515
|
+
return;
|
|
25516
|
+
}
|
|
25517
|
+
render();
|
|
25518
|
+
scheduleLoginRefresh();
|
|
25519
|
+
};
|
|
25520
|
+
const switchAccount = (accountId) => {
|
|
25521
|
+
if (accountBusy() || !capabilities.switch || accountId === currentAccountId) return;
|
|
25234
25522
|
accountActivating = true;
|
|
25523
|
+
loginMessage = null;
|
|
25235
25524
|
render();
|
|
25236
|
-
void context.runLatest(() =>
|
|
25237
|
-
success(
|
|
25525
|
+
void context.runLatest(() => client().switchCodexAccount({ accountId }), {
|
|
25526
|
+
success() {
|
|
25238
25527
|
accountActivating = false;
|
|
25239
25528
|
loginMessage = null;
|
|
25240
|
-
|
|
25241
|
-
|
|
25242
|
-
...account.accountId === result.account.accountId ? result.account : account,
|
|
25243
|
-
active: account.accountId === result.account.accountId
|
|
25244
|
-
}))
|
|
25245
|
-
);
|
|
25529
|
+
usageByAccountId.delete(accountId);
|
|
25530
|
+
load();
|
|
25246
25531
|
},
|
|
25247
25532
|
failure(error51) {
|
|
25248
25533
|
accountActivating = false;
|
|
@@ -25252,44 +25537,47 @@ ${error51.stderrTail}`] : []
|
|
|
25252
25537
|
});
|
|
25253
25538
|
};
|
|
25254
25539
|
const startLogin = (accountId) => {
|
|
25255
|
-
if (accountBusy()) return;
|
|
25256
|
-
loginStartingAccountId = accountId;
|
|
25540
|
+
if (accountBusy() || !capabilities.login) return;
|
|
25541
|
+
loginStartingAccountId = accountId ?? "new";
|
|
25542
|
+
loginStartSnapshot = { instanceId: accountInstanceId, revision: accountRevision };
|
|
25257
25543
|
loginMessage = messages.accountSigningIn;
|
|
25258
25544
|
render();
|
|
25259
|
-
void context.runLatest(
|
|
25260
|
-
|
|
25261
|
-
|
|
25262
|
-
|
|
25263
|
-
|
|
25264
|
-
|
|
25265
|
-
|
|
25266
|
-
|
|
25267
|
-
|
|
25268
|
-
|
|
25269
|
-
|
|
25270
|
-
|
|
25545
|
+
void context.runLatest(
|
|
25546
|
+
() => client().startCodexAccountLogin(accountId ? { accountId } : {}),
|
|
25547
|
+
{
|
|
25548
|
+
success(result) {
|
|
25549
|
+
loginStartingAccountId = null;
|
|
25550
|
+
loginMessage = null;
|
|
25551
|
+
reconcileLoginStart(result);
|
|
25552
|
+
},
|
|
25553
|
+
failure(error51) {
|
|
25554
|
+
loginStartingAccountId = null;
|
|
25555
|
+
loginStartSnapshot = void 0;
|
|
25556
|
+
earlyLoginCompletions.clear();
|
|
25557
|
+
loginMessage = errorMessage(error51, messages.accountLoginFailed);
|
|
25558
|
+
render();
|
|
25559
|
+
}
|
|
25271
25560
|
}
|
|
25272
|
-
|
|
25561
|
+
);
|
|
25273
25562
|
};
|
|
25274
25563
|
const createAndLogin = () => {
|
|
25275
|
-
if (accountBusy()) return;
|
|
25564
|
+
if (accountBusy() || !capabilities.login) return;
|
|
25276
25565
|
accountCreating = true;
|
|
25566
|
+
loginStartSnapshot = { instanceId: accountInstanceId, revision: accountRevision };
|
|
25277
25567
|
loginMessage = messages.accountSigningIn;
|
|
25278
25568
|
render();
|
|
25279
|
-
void context.runLatest(() => client().
|
|
25569
|
+
void context.runLatest(() => client().startCodexAccountLogin({}), {
|
|
25280
25570
|
success(result) {
|
|
25281
25571
|
accountCreating = false;
|
|
25282
25572
|
loginMessage = null;
|
|
25283
25573
|
search.value = "";
|
|
25284
|
-
|
|
25285
|
-
...accounts.filter(({ accountId }) => accountId !== result.account.accountId),
|
|
25286
|
-
result.account
|
|
25287
|
-
]);
|
|
25288
|
-
startLogin(result.account.accountId);
|
|
25574
|
+
reconcileLoginStart(result);
|
|
25289
25575
|
},
|
|
25290
25576
|
failure(error51) {
|
|
25291
25577
|
accountCreating = false;
|
|
25292
|
-
|
|
25578
|
+
loginStartSnapshot = void 0;
|
|
25579
|
+
earlyLoginCompletions.clear();
|
|
25580
|
+
loginMessage = errorMessage(error51, messages.accountLoginFailed);
|
|
25293
25581
|
render();
|
|
25294
25582
|
}
|
|
25295
25583
|
});
|
|
@@ -25314,7 +25602,9 @@ ${error51.stderrTail}`] : []
|
|
|
25314
25602
|
if (result.accountCredits) {
|
|
25315
25603
|
usageByAccountId.set(accountId, {
|
|
25316
25604
|
status: "ready",
|
|
25317
|
-
credits: result.accountCredits
|
|
25605
|
+
credits: result.accountCredits,
|
|
25606
|
+
freshness: "live",
|
|
25607
|
+
observedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
25318
25608
|
});
|
|
25319
25609
|
} else if (result.outcome === "reset") {
|
|
25320
25610
|
usageByAccountId.delete(accountId);
|
|
@@ -25331,7 +25621,8 @@ ${error51.stderrTail}`] : []
|
|
|
25331
25621
|
};
|
|
25332
25622
|
const deleteAccount = (accountId) => {
|
|
25333
25623
|
const account = accounts.find((candidate) => candidate.accountId === accountId);
|
|
25334
|
-
if (!account || account.
|
|
25624
|
+
if (!account || account.accountId === currentAccountId || !capabilities.delete || accountBusy())
|
|
25625
|
+
return;
|
|
25335
25626
|
if (document2.defaultView?.confirm?.(messages.accountDeleteConfirm) === false) return;
|
|
25336
25627
|
deletingAccountId = accountId;
|
|
25337
25628
|
loginMessage = messages.accountDeleting;
|
|
@@ -25340,12 +25631,7 @@ ${error51.stderrTail}`] : []
|
|
|
25340
25631
|
success() {
|
|
25341
25632
|
deletingAccountId = null;
|
|
25342
25633
|
loginMessage = null;
|
|
25343
|
-
|
|
25344
|
-
accounts.filter((candidate) => candidate.accountId !== accountId).map((candidate) => ({
|
|
25345
|
-
...candidate,
|
|
25346
|
-
active: account.active ? candidate.isDefault : candidate.active
|
|
25347
|
-
}))
|
|
25348
|
-
);
|
|
25634
|
+
load();
|
|
25349
25635
|
},
|
|
25350
25636
|
failure(error51) {
|
|
25351
25637
|
deletingAccountId = null;
|
|
@@ -25354,11 +25640,51 @@ ${error51.stderrTail}`] : []
|
|
|
25354
25640
|
}
|
|
25355
25641
|
});
|
|
25356
25642
|
};
|
|
25357
|
-
const
|
|
25358
|
-
|
|
25643
|
+
const logoutAccount = () => {
|
|
25644
|
+
if (accountBusy() || !capabilities.logout || currentAccountId === null) return;
|
|
25645
|
+
if (document2.defaultView?.confirm?.(messages.accountLogoutConfirm) === false) return;
|
|
25646
|
+
accountLoggingOut = true;
|
|
25647
|
+
loginMessage = messages.accountLoggingOut;
|
|
25648
|
+
render();
|
|
25649
|
+
void context.runLatest(() => client().logoutCodexAccount({}), {
|
|
25650
|
+
success() {
|
|
25651
|
+
accountLoggingOut = false;
|
|
25652
|
+
loginMessage = messages.accountLoggedOut;
|
|
25653
|
+
load();
|
|
25654
|
+
},
|
|
25655
|
+
failure(error51) {
|
|
25656
|
+
accountLoggingOut = false;
|
|
25657
|
+
loginMessage = errorMessage(error51, messages.accountLogoutFailed);
|
|
25658
|
+
render();
|
|
25659
|
+
}
|
|
25660
|
+
});
|
|
25661
|
+
};
|
|
25662
|
+
const recoverAccounts = () => {
|
|
25663
|
+
if (accountBusy() || !capabilities.recover) return;
|
|
25664
|
+
accountRecovering = true;
|
|
25665
|
+
loginMessage = cleanupRequired && accountPhase === "ready" ? messages.accountCleaningUp : messages.accountRecovering;
|
|
25666
|
+
render();
|
|
25667
|
+
void context.runLatest(() => client().recoverCodexAccounts({}), {
|
|
25668
|
+
success(result) {
|
|
25669
|
+
accountRecovering = false;
|
|
25670
|
+
loginMessage = null;
|
|
25671
|
+
setAccounts(result);
|
|
25672
|
+
render();
|
|
25673
|
+
},
|
|
25674
|
+
failure(error51) {
|
|
25675
|
+
accountRecovering = false;
|
|
25676
|
+
loginMessage = errorMessage(error51, messages.accountRecoveryRequired);
|
|
25677
|
+
render();
|
|
25678
|
+
}
|
|
25679
|
+
});
|
|
25680
|
+
};
|
|
25681
|
+
const cancelLogin = (_accountId, loginId) => {
|
|
25682
|
+
void context.runLatest(() => client().cancelCodexAccountLogin({ loginId }), {
|
|
25359
25683
|
success() {
|
|
25360
25684
|
clearLoginRefresh();
|
|
25685
|
+
earlyLoginCompletions.clear();
|
|
25361
25686
|
login = null;
|
|
25687
|
+
loginStartSnapshot = void 0;
|
|
25362
25688
|
loginMessage = null;
|
|
25363
25689
|
render();
|
|
25364
25690
|
},
|
|
@@ -25370,14 +25696,24 @@ ${error51.stderrTail}`] : []
|
|
|
25370
25696
|
};
|
|
25371
25697
|
add.addEventListener("click", createAndLogin);
|
|
25372
25698
|
let unsubscribe;
|
|
25699
|
+
let unsubscribeAccounts;
|
|
25373
25700
|
try {
|
|
25374
|
-
|
|
25375
|
-
|
|
25376
|
-
clearLoginRefresh();
|
|
25377
|
-
login = null;
|
|
25378
|
-
loginMessage = result.success ? messages.accountLoginSucceeded : result.error ?? messages.accountLoginFailed;
|
|
25701
|
+
unsubscribeAccounts = getClient()?.subscribeCodexAccounts?.((result) => {
|
|
25702
|
+
setAccounts(result);
|
|
25379
25703
|
render();
|
|
25380
|
-
|
|
25704
|
+
});
|
|
25705
|
+
unsubscribe = getClient()?.subscribeCodexAccountLogin?.((result) => {
|
|
25706
|
+
if (context.signal.aborted) return;
|
|
25707
|
+
if (result.loginId === login?.loginId) {
|
|
25708
|
+
completeLogin(result);
|
|
25709
|
+
return;
|
|
25710
|
+
}
|
|
25711
|
+
if (login || loginStartingAccountId === null && !accountCreating) return;
|
|
25712
|
+
earlyLoginCompletions.set(result.loginId, result);
|
|
25713
|
+
if (earlyLoginCompletions.size > 4) {
|
|
25714
|
+
const oldestLoginId = earlyLoginCompletions.keys().next().value;
|
|
25715
|
+
if (oldestLoginId) earlyLoginCompletions.delete(oldestLoginId);
|
|
25716
|
+
}
|
|
25381
25717
|
});
|
|
25382
25718
|
} catch {
|
|
25383
25719
|
}
|
|
@@ -25387,7 +25723,9 @@ ${error51.stderrTail}`] : []
|
|
|
25387
25723
|
return () => {
|
|
25388
25724
|
stopCountdowns();
|
|
25389
25725
|
clearLoginRefresh();
|
|
25726
|
+
earlyLoginCompletions.clear();
|
|
25390
25727
|
unsubscribe?.();
|
|
25728
|
+
unsubscribeAccounts?.();
|
|
25391
25729
|
};
|
|
25392
25730
|
}
|
|
25393
25731
|
});
|
|
@@ -25899,7 +26237,7 @@ ${error51.stderrTail}`] : []
|
|
|
25899
26237
|
var shell_default = ':host {\n --settings-bg: light-dark(#ffffff, #202020);\n --settings-sidebar: light-dark(#f7f7f8, #191919);\n --settings-panel: light-dark(#ffffff, #232323);\n --settings-surface: light-dark(#f6f6f6, #292929);\n --settings-surface-hover: light-dark(#eeeeee, #303030);\n --settings-inset: light-dark(#f3f3f3, #161616);\n --settings-text: light-dark(#0d0d0d, #ececec);\n --settings-muted: light-dark(#676767, #a3a3a3);\n --settings-subtle: light-dark(#8a8a8a, #777777);\n --settings-border: light-dark(rgb(13 13 13 / 9%), rgb(255 255 255 / 9%));\n --settings-divider: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 7%));\n --settings-hover: light-dark(rgb(13 13 13 / 5%), rgb(255 255 255 / 7%));\n --settings-active: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 9%));\n --settings-focus: light-dark(#0b75d1, #66aaf9);\n --settings-primary: light-dark(#171717, #f4f4f4);\n --settings-primary-hover: light-dark(#2f2f2f, #ffffff);\n --settings-primary-text: light-dark(#ffffff, #171717);\n --settings-warning: light-dark(#8a5500, #f5c96a);\n --settings-warning-bg: light-dark(#fff8e6, rgb(245 201 106 / 8%));\n --settings-warning-border: light-dark(#ead8a8, rgb(245 201 106 / 24%));\n --settings-danger: light-dark(#b42318, #f87171);\n --settings-danger-bg: light-dark(#fff1f0, rgb(239 68 68 / 8%));\n --settings-danger-border: light-dark(#f3c7c3, rgb(239 68 68 / 22%));\n --settings-success: light-dark(#16784a, #4ade80);\n color: var(--settings-text);\n color-scheme: inherit;\n font:\n 13px/1.5 system-ui,\n -apple-system,\n BlinkMacSystemFont,\n "Segoe UI",\n sans-serif;\n letter-spacing: 0;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n letter-spacing: 0;\n}\n\nbutton,\ninput,\nselect {\n font: inherit;\n}\n\nbutton {\n color: inherit;\n}\n\n[hidden] {\n display: none !important;\n}\n\n.settings-visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n\n.codexhost-settings-dialog {\n width: min(1120px, calc(100vw - 32px));\n height: min(780px, calc(100vh - 32px));\n max-width: none;\n max-height: none;\n margin: auto;\n padding: 0;\n overflow: hidden;\n color: var(--settings-text);\n background: var(--settings-bg);\n border: 1px solid var(--settings-border);\n border-radius: 14px;\n box-shadow: light-dark(0 16px 42px rgb(0 0 0 / 16%), 0 20px 54px rgb(0 0 0 / 42%));\n}\n\n.codexhost-settings-dialog::backdrop {\n background: light-dark(rgb(0 0 0 / 24%), rgb(0 0 0 / 56%));\n backdrop-filter: blur(1px);\n}\n\n.settings-frame,\n.settings-layout {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n}\n\n.settings-frame {\n display: flex;\n flex-direction: column;\n}\n\n.settings-layout {\n flex: 1;\n display: grid;\n grid-template-columns: 184px minmax(0, 1fr);\n background: var(--settings-bg);\n}\n\n.settings-sidebar {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\n background: var(--settings-sidebar);\n border-right: 1px solid var(--settings-border);\n padding-top: 14px;\n}\n\n.settings-header {\n display: flex;\n align-items: center;\n min-width: 0;\n height: 48px;\n flex: none;\n padding: 0 12px;\n border-bottom: 1px solid var(--settings-border);\n}\n\n.settings-header-actions {\n display: flex;\n align-items: center;\n flex: none;\n gap: 12px;\n margin-left: auto;\n}\n\n.settings-brand {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 7px;\n}\n\n.settings-brand__mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n flex: none;\n color: var(--settings-text);\n}\n\n.settings-brand__mark .codexhost-settings-icon {\n width: 24px;\n height: 24px;\n object-fit: contain;\n}\n\n.settings-brand__copy {\n display: flex;\n min-width: 0;\n align-items: baseline;\n gap: 0;\n line-height: 20px;\n}\n\n.settings-brand__name {\n overflow: hidden;\n color: var(--settings-text);\n font-size: 13px;\n font-weight: 600;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-brand__title {\n margin-left: 8px;\n padding-left: 8px;\n color: var(--settings-muted);\n font-size: 13px;\n font-weight: 400;\n border-left: 1px solid var(--settings-border);\n}\n\n.settings-nav {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex: 1;\n flex-direction: column;\n gap: 2px;\n padding: 0 7px 10px;\n overflow-y: auto;\n}\n\n.settings-nav-section-label {\n min-height: 24px;\n padding: 4px 9px 2px;\n color: var(--settings-subtle);\n font-size: 11px;\n font-weight: 600;\n line-height: 18px;\n}\n\n.settings-nav-section-label:not(:first-child) {\n margin-top: 8px;\n}\n\n.settings-nav-button {\n display: grid;\n grid-template-columns: 16px minmax(0, 1fr);\n align-items: center;\n width: 100%;\n position: relative;\n min-height: 34px;\n flex: none;\n gap: 9px;\n padding: 6px 9px;\n color: var(--settings-text);\n font-size: 13px;\n line-height: 20px;\n text-align: left;\n background: transparent;\n border: 0;\n border-radius: 8px;\n cursor: pointer;\n}\n\n.settings-nav-button .codexhost-settings-icon {\n width: 16px;\n height: 16px;\n opacity: 0.9;\n}\n\n.settings-nav-button:hover {\n background: var(--settings-hover);\n}\n\n.settings-nav-button[aria-current="page"] {\n background: var(--settings-active);\n color: var(--settings-text);\n font-weight: 500;\n}\n\n.settings-nav-button span {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-nav-star-link {\n margin-top: 0;\n color: var(--settings-text);\n text-decoration: none;\n}\n\n.settings-nav-star-link .codexhost-settings-icon {\n color: var(--settings-warning);\n}\n\n.settings-nav-star-link:hover {\n color: var(--settings-warning);\n background: var(--settings-warning-bg);\n}\n\n.settings-icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex: none;\n padding: 0;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 8px;\n cursor: pointer;\n}\n\n.settings-icon-button:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-icon-button:focus-visible,\n.settings-nav-button:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 1px;\n}\n\n.settings-page {\n display: block;\n position: relative;\n min-width: 0;\n min-height: 0;\n overflow-y: auto;\n background: var(--settings-bg);\n scrollbar-gutter: stable;\n}\n\n.settings-page__content {\n width: min(930px, calc(100% - 80px));\n margin-inline: auto;\n}\n\n.settings-page__content {\n min-width: 0;\n padding: 28px 0 36px;\n}\n\n.settings-section-label {\n min-height: auto;\n margin: 0;\n padding: 0 0 18px;\n color: var(--settings-text);\n font-size: 18px;\n font-weight: 600;\n line-height: 26px;\n}\n\n.settings-status-list,\n.settings-empty {\n overflow: hidden;\n background: var(--settings-panel);\n}\n\n.settings-status-row {\n display: grid;\n grid-template-columns: minmax(170px, 1fr) auto minmax(280px, 1.45fr);\n position: relative;\n align-items: center;\n min-height: 72px;\n gap: 20px;\n padding: 12px 0;\n}\n\n.settings-status-row:not(:last-child)::after {\n content: "";\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n height: 1px;\n background: var(--settings-divider);\n}\n\n.settings-status-row__identity {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n color: var(--settings-text);\n gap: 10px;\n font-size: 14px;\n font-weight: 500;\n line-height: 22px;\n}\n\n.settings-status-row__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n flex: none;\n color: var(--settings-muted);\n background: var(--settings-surface);\n border-radius: 50%;\n}\n\n.settings-status-badge {\n flex: none;\n padding: 3px 8px;\n color: var(--settings-muted);\n font-size: 11px;\n font-weight: 500;\n line-height: 18px;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-status-row__detail {\n min-width: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-page-description {\n max-width: 760px;\n margin: -10px 0 20px;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-session-import-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 24px;\n}\n\n.settings-session-import-header .settings-section-label {\n min-width: 0;\n}\n\n.settings-session-import-harness {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 12px;\n margin: -12px 0 16px;\n color: var(--settings-muted);\n font-size: 13px;\n}\n\n.settings-session-import-harness > span {\n flex: none;\n}\n\n.settings-session-import-harness__options {\n display: flex;\n align-items: center;\n min-width: 0;\n flex: 1;\n gap: 6px;\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: none;\n}\n\n.settings-session-import-harness__options::-webkit-scrollbar {\n display: none;\n}\n\n.settings-session-import-harness__option {\n min-height: 32px;\n flex: none;\n padding: 6px 10px;\n color: var(--settings-muted);\n font: inherit;\n font-size: 12px;\n white-space: nowrap;\n background: rgb(255 255 255 / 4%);\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-session-import-harness__option[aria-pressed="true"] {\n color: var(--settings-text);\n background: var(--settings-active);\n border-color: rgb(51 156 255 / 50%);\n}\n\n.settings-session-import-harness__option:disabled {\n opacity: 0.38;\n cursor: not-allowed;\n}\n\n.settings-session-import-harness__option:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-session-import-harness + .settings-page-description {\n margin-top: 0;\n margin-bottom: 4px;\n}\n\n.settings-session-import-availability-note {\n margin-top: 0;\n}\n\n.settings-session-import-search,\n.settings-session-import-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 10px;\n margin: 16px 0;\n}\n\n.settings-session-import-search input {\n flex: 1;\n min-width: 160px;\n}\n\n.settings-session-import-search input,\n.settings-session-import-pagination select {\n min-height: 36px;\n padding: 6px 10px;\n color: var(--settings-text);\n background: var(--settings-bg);\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-session-import-search input:focus-visible,\n.settings-session-import-pagination select:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-session-import-pagination {\n color: var(--settings-muted);\n font-size: 12px;\n}\n\n.settings-session-import-pagination label {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.settings-session-import-pagination > span {\n flex: 1;\n min-width: 130px;\n}\n\n.settings-session-import-pagination__navigation {\n display: flex;\n gap: 8px;\n margin-left: auto;\n}\n\n.settings-session-import-content,\n.settings-session-import-list {\n display: grid;\n gap: 10px;\n}\n\n.settings-session-import-status {\n display: flex;\n align-items: center;\n min-height: 64px;\n gap: 12px;\n padding: 16px;\n color: var(--settings-muted);\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-session-import-status.is-error {\n color: #ef4444;\n}\n\n.settings-session-import-recovery {\n display: grid;\n justify-items: start;\n gap: 14px;\n padding: 16px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-session-import-recovery:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-session-import-recovery__copy {\n display: grid;\n gap: 4px;\n}\n\n.settings-session-import-recovery__copy strong {\n color: var(--settings-text);\n font-size: 14px;\n}\n\n.settings-session-import-recovery__copy p {\n margin: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-session-import-recovery__path {\n display: flex;\n align-items: stretch;\n width: 100%;\n min-width: 0;\n overflow: hidden;\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-session-import-recovery__path code {\n min-width: 0;\n flex: 1;\n padding: 8px 10px;\n overflow-x: auto;\n color: var(--settings-text);\n font-size: 12px;\n line-height: 20px;\n white-space: nowrap;\n}\n\n.settings-session-import-recovery__path .settings-command-button {\n min-height: 0;\n flex: none;\n border-width: 0 0 0 1px;\n border-radius: 0;\n}\n\n.settings-session-import-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 20px;\n min-width: 0;\n padding: 16px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-session-import-row__copy {\n display: grid;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-session-import-row__copy strong {\n overflow: hidden;\n color: var(--settings-text);\n font-size: 14px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-session-import-row__copy span,\n.settings-session-import-row__cwd {\n overflow: hidden;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-session-import-row__cwd {\n display: block;\n min-width: 0;\n background: transparent;\n}\n\n.settings-session-import-row__action {\n display: flex;\n align-items: flex-end;\n flex-direction: column;\n gap: 8px;\n}\n\n.settings-session-import-running {\n color: var(--settings-muted);\n font-size: 12px;\n}\n\n.settings-preference-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 32px;\n min-height: 88px;\n padding: 18px 0;\n border-top: 1px solid var(--settings-divider);\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-preference-row__copy {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-width: 0;\n gap: 5px;\n}\n\n.settings-preference-row__copy strong {\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-preference-row__copy span {\n max-width: 680px;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-preference-switch {\n display: inline-flex;\n align-items: center;\n width: 42px;\n height: 24px;\n flex: none;\n padding: 2px;\n border: 0;\n border-radius: 999px;\n background: var(--settings-surface-hover);\n cursor: pointer;\n transition: background 120ms ease;\n}\n\n.settings-preference-switch[aria-checked="true"] {\n justify-content: flex-end;\n background: var(--settings-focus);\n}\n\n.settings-preference-switch:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-preference-switch__thumb {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: var(--settings-primary-text);\n box-shadow: 0 1px 3px rgb(0 0 0 / 24%);\n}\n\n.settings-preference-checkbox {\n width: 18px;\n height: 18px;\n flex: none;\n margin: 0;\n accent-color: var(--settings-focus);\n cursor: pointer;\n}\n\n.settings-preference-checkbox:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-connection-page-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 18px;\n margin-bottom: 18px;\n}\n\n.settings-connection-page-header .settings-section-label {\n padding-bottom: 0;\n}\n\n.settings-connection-page-header .settings-page-description {\n margin: 5px 0 0;\n}\n\n.settings-connections-content,\n.settings-connections-layout,\n.settings-connection-list,\n.settings-connection-rows {\n min-width: 0;\n}\n\n.settings-connections-layout {\n display: grid;\n grid-template-columns: minmax(0, 1.55fr) minmax(280px, 0.85fr);\n align-items: start;\n gap: 18px;\n}\n\n.settings-connection-list,\n.settings-connection-inspector {\n overflow: hidden;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 10px;\n}\n\n.settings-connection-host-strip {\n display: grid;\n grid-template-columns: 30px minmax(0, 1fr) 30px;\n align-items: center;\n min-width: 0;\n gap: 5px;\n padding: 9px 10px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-host-scroll {\n display: none;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 34px;\n padding: 0;\n color: var(--settings-muted);\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n cursor: pointer;\n}\n\n.settings-connection-host-strip[data-connection-host-overflow="true"]\n .settings-connection-host-scroll {\n display: inline-flex;\n}\n\n.settings-connection-host-strip:not([data-connection-host-overflow="true"]) {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.settings-connection-host-scroll:hover:not(:disabled) {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-host-scroll:disabled {\n cursor: default;\n opacity: 0.35;\n}\n\n.settings-connection-host-scroll:focus-visible,\n.settings-connection-host-tab:focus-visible,\n.settings-connection-row:focus-visible,\n.settings-connection-install-link:focus-visible,\n.settings-connection-view-error:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 1px;\n}\n\n.settings-connection-host-tabs {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 6px;\n overflow-x: auto;\n overflow-y: hidden;\n overscroll-behavior-x: contain;\n scrollbar-width: none;\n scroll-behavior: smooth;\n scroll-snap-type: x proximity;\n touch-action: pan-x;\n}\n\n.settings-connection-host-tabs::-webkit-scrollbar {\n display: none;\n}\n\n.settings-connection-host-tab {\n display: inline-flex;\n align-items: center;\n height: 30px;\n min-width: max-content;\n flex: none;\n padding: 0 9px;\n color: var(--settings-muted);\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n white-space: nowrap;\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 7px;\n cursor: pointer;\n scroll-snap-align: start;\n}\n\n.settings-connection-host-tab:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-host-tab[aria-selected="true"] {\n color: var(--settings-text);\n font-weight: 600;\n background: var(--settings-active);\n border-color: var(--settings-border);\n}\n\n.settings-connection-table-header,\n.settings-connection-row {\n display: grid;\n grid-template-columns: minmax(160px, 1fr) minmax(92px, auto) 108px;\n align-items: center;\n min-width: 0;\n gap: 10px;\n}\n\n.settings-connection-table-header {\n min-height: 30px;\n padding: 0 10px;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n background: transparent;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-row {\n min-height: 52px;\n padding: 8px 10px;\n cursor: pointer;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-row:last-child {\n border-bottom: 0;\n}\n\n.settings-connection-row:hover {\n background: var(--settings-hover);\n}\n\n.settings-connection-row[data-connection-selected="true"] {\n background: var(--settings-surface);\n}\n\n.settings-connection-row__identity,\n.settings-connection-inspector__identity {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n gap: 8px;\n color: var(--settings-text);\n}\n\n.settings-connection-row__identity strong,\n.settings-connection-inspector__identity strong {\n min-width: 0;\n overflow-wrap: anywhere;\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-row__mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n flex: none;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 700;\n background: var(--settings-surface);\n border-radius: 6px;\n}\n\n.settings-connection-row__mark--logo {\n color: var(--settings-text);\n background: transparent;\n}\n\n.settings-connection-row__mark--logo > img,\n.settings-connection-row__mark--logo > svg {\n display: block;\n max-width: 18px;\n max-height: 18px;\n}\n\n.settings-connection-row__status {\n display: inline-flex;\n align-items: center;\n width: fit-content;\n gap: 5px;\n color: var(--settings-muted);\n font-size: 11px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-row__status::before {\n width: 6px;\n height: 6px;\n flex: none;\n content: "";\n background: currentColor;\n border-radius: 50%;\n}\n\n.settings-connection-row__status[data-connection-tone="ready"] {\n color: var(--settings-success);\n}\n\n.settings-connection-row__status[data-connection-tone="checking"] {\n color: var(--settings-warning);\n}\n\n.settings-connection-row__status[data-connection-tone="setup"] {\n color: var(--settings-muted);\n}\n\n.settings-connection-row__status[data-connection-tone="setup"]::before {\n background: transparent;\n border: 1.5px solid currentColor;\n}\n\n.settings-connection-row__status[data-connection-tone="failed"] {\n color: var(--settings-danger);\n}\n\n.settings-connection-row__action {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-connection-row__handle {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 16px;\n color: var(--settings-muted);\n cursor: grab;\n opacity: 0.6;\n}\n\n.settings-connection-row__handle:hover {\n opacity: 1;\n}\n\n.settings-connection-row[draggable="true"] {\n cursor: grab;\n}\n\n.settings-connection-row[data-connection-dragging="true"] {\n opacity: 0.4;\n}\n\n.settings-connection-row[data-connection-drop-indicator="before"] {\n box-shadow: inset 0 2px 0 0 var(--settings-focus);\n}\n\n.settings-connection-row[data-connection-drop-indicator="after"] {\n box-shadow: inset 0 -2px 0 0 var(--settings-focus);\n}\n\n.settings-connection-row__group-toggle {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-connection-row__group-toggle:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-group-divider {\n padding: 10px 12px 6px;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n /* No border-top here: the row immediately above already carries its own\n border-bottom (it is no longer :last-child once this divider follows\n it), so adding one here would double the separator line. */\n}\n\n.settings-connection-group-more[data-connection-drag-over="true"] {\n background: rgb(51 156 255 / 8%);\n}\n\n.settings-connection-group-hint {\n display: grid;\n gap: 3px;\n margin: 0 12px 12px;\n padding: 14px 16px;\n text-align: center;\n border: 1.5px dashed var(--settings-border);\n border-radius: 10px;\n}\n\n.settings-connection-group-more[data-connection-drag-over="true"] .settings-connection-group-hint {\n border-color: var(--settings-focus);\n}\n\n.settings-connection-group-hint strong {\n color: var(--settings-text);\n font-size: 12.5px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-group-hint span {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 17px;\n}\n\n.settings-connection-group-reset {\n display: flex;\n width: 100%;\n align-items: center;\n gap: 6px;\n padding: 10px 12px;\n color: var(--settings-muted);\n font: inherit;\n font-size: 12px;\n text-align: left;\n background: transparent;\n border: 0;\n border-top: 1px solid var(--settings-divider);\n cursor: pointer;\n}\n\n.settings-connection-group-reset:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-install-link {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n color: var(--settings-focus);\n text-decoration: none;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 7px;\n opacity: 0;\n transition: opacity 120ms ease;\n}\n\n.settings-connection-row:hover .settings-connection-install-link,\n.settings-connection-install-link:focus-visible {\n opacity: 1;\n}\n\n.settings-connection-install-link:hover {\n color: var(--settings-focus);\n background: var(--settings-active);\n border-color: var(--settings-border);\n}\n\n.settings-connection-view-error {\n padding: 4px 7px;\n color: var(--settings-danger);\n font: inherit;\n font-size: 11px;\n line-height: 18px;\n background: transparent;\n border: 0;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-connection-view-error:hover {\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n}\n\n.settings-connection-inspector {\n position: sticky;\n top: 18px;\n}\n\n.settings-connection-inspector__header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n min-width: 0;\n gap: 10px;\n padding: 12px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-inspector__body {\n display: grid;\n min-width: 0;\n gap: 12px;\n padding: 12px;\n}\n\n.settings-connection-install-callout {\n display: grid;\n grid-template-columns: 28px minmax(0, 1fr);\n gap: 9px;\n padding: 11px;\n background: var(--settings-surface);\n border: 0;\n border-radius: 8px;\n}\n\n.settings-connection-install-callout__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: var(--settings-focus);\n background: var(--settings-active);\n border-radius: 7px;\n}\n\n.settings-connection-install-callout strong,\n.settings-connection-error-summary strong,\n.settings-connection-state-summary strong {\n display: block;\n margin: 0 0 4px;\n color: var(--settings-text);\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-install-callout p,\n.settings-connection-error-summary p,\n.settings-connection-state-summary p,\n.settings-connection-issue-note {\n margin: 0;\n color: var(--settings-muted);\n font-size: 11px;\n line-height: 16px;\n}\n\n.settings-connection-install-button {\n width: fit-content;\n}\n\n.settings-connection-error-summary {\n padding: 13px 14px;\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n border: 1px solid var(--settings-danger-border);\n border-radius: 10px;\n}\n\n.settings-connection-error-metadata {\n display: grid;\n gap: 7px;\n padding: 12px;\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 9px;\n}\n\n.settings-connection-detail-line {\n display: grid;\n grid-template-columns: 92px minmax(0, 1fr);\n gap: 10px;\n min-width: 0;\n color: var(--settings-muted);\n font-size: 10px;\n line-height: 16px;\n}\n\n.settings-connection-detail-line code {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n white-space: pre-wrap;\n}\n\n.settings-connection-error-log-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n}\n\n.settings-connection-error-log-header strong {\n color: var(--settings-text);\n font-size: 11px;\n font-weight: 600;\n}\n\n.settings-connection-error-log-header .settings-command-button {\n min-height: 30px;\n padding: 5px 9px;\n font-size: 11px;\n}\n\n.settings-connection-stderr {\n max-height: 220px;\n min-width: 0;\n margin: 0;\n padding: 11px;\n overflow: auto;\n color: var(--settings-text);\n font:\n 10px/16px ui-monospace,\n "SFMono-Regular",\n Consolas,\n "Liberation Mono",\n monospace;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 9px;\n}\n\n.settings-connection-error-actions {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: 8px;\n}\n\n.settings-connection-error-actions .settings-command-button {\n width: 100%;\n}\n\n.settings-connection-issue-note {\n margin-top: -4px;\n}\n\n.settings-connection-state-summary {\n padding: 14px;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 10px;\n}\n\n.settings-empty {\n display: flex;\n align-items: center;\n min-height: 72px;\n padding: 12px 16px;\n}\n\n.settings-empty > div {\n display: grid;\n min-width: 0;\n gap: 2px;\n}\n\n.settings-empty strong {\n color: var(--settings-text);\n font-size: 13px;\n font-weight: 500;\n line-height: 19px;\n}\n\n.settings-empty span {\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 19px;\n}\n\n.settings-about-panel {\n display: grid;\n max-width: 720px;\n gap: 18px;\n padding: 24px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n}\n\n.settings-about-product {\n color: var(--settings-text);\n font-size: 24px;\n font-weight: 700;\n line-height: 32px;\n}\n\n.settings-about-tagline {\n color: var(--settings-text);\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n}\n\n.settings-about-copy {\n display: grid;\n max-width: 660px;\n gap: 12px;\n}\n\n.settings-about-copy p,\n.settings-about-repository p {\n margin: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 21px;\n}\n\n.settings-about-star-callout {\n margin: 2px 0;\n color: var(--settings-warning);\n font-size: 14px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-about-repository {\n display: grid;\n gap: 10px;\n padding-top: 18px;\n border-top: 1px solid var(--settings-divider);\n}\n\n.settings-about-repository-link {\n display: flex;\n align-items: center;\n width: fit-content;\n min-width: 0;\n max-width: 100%;\n gap: 8px;\n color: var(--settings-focus);\n font-size: 13px;\n font-weight: 600;\n text-decoration: none;\n}\n\n.settings-about-repository-link:hover {\n text-decoration: underline;\n}\n\n.settings-about-repository-link code {\n min-width: 0;\n overflow: hidden;\n color: var(--settings-muted);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 11px;\n font-weight: 400;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-page-error {\n padding: 16px;\n color: var(--settings-text);\n font-size: 13px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 20px;\n}\n\n.settings-update-metadata {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 24px;\n margin-bottom: 24px;\n padding: 0 4px 20px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-update-metadata__item {\n display: grid;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-update-metadata__item span {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-metadata__item strong {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 500;\n line-height: 22px;\n}\n\n/* The only emphasis on this screen: a latest version newer than the installed one. */\n.settings-update-metadata__value--newer {\n color: var(--settings-focus);\n}\n\n.settings-update-panel {\n display: grid;\n gap: 12px;\n padding: 20px;\n color: var(--settings-text);\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-update-panel__head {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 8px;\n}\n\n.settings-update-panel__head .codexhost-settings-icon {\n color: var(--settings-muted);\n}\n\n.settings-update-panel[data-update-state="available"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="downloading"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="installing"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="restarting"] .codexhost-settings-icon {\n color: var(--settings-focus);\n}\n\n.settings-update-panel[data-update-state="current"] .codexhost-settings-icon {\n color: var(--settings-success);\n}\n\n.settings-update-panel[data-update-state="failed"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="error"] .codexhost-settings-icon {\n color: var(--settings-danger);\n}\n\n.settings-update-panel__title {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-size: 14px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-update-summary,\n.settings-update-error {\n margin: 0;\n overflow-wrap: anywhere;\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-update-summary {\n color: var(--settings-muted);\n}\n\n.settings-update-error {\n color: var(--settings-danger);\n}\n\n.settings-update-progress {\n width: 100%;\n height: 8px;\n accent-color: var(--settings-focus);\n}\n\n.settings-update-progress-detail {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n/* Release notes scroll with the page; a scroller inside a scroller traps the wheel. */\n.settings-update-notes-section {\n min-width: 0;\n margin-top: 24px;\n padding-top: 24px;\n border-top: 1px solid var(--settings-divider);\n}\n\n.settings-update-notes-section:empty {\n display: none;\n}\n\n.settings-update-notes {\n display: grid;\n min-width: 0;\n gap: 12px;\n color: var(--settings-muted);\n font-size: 14px;\n line-height: 22px;\n overflow-wrap: anywhere;\n}\n\n.settings-update-notes > :first-child {\n margin-top: 0;\n}\n\n.settings-update-notes > :last-child {\n margin-bottom: 0;\n}\n\n.settings-update-notes h1,\n.settings-update-notes h2,\n.settings-update-notes h3,\n.settings-update-notes h4,\n.settings-update-notes h5,\n.settings-update-notes h6 {\n margin: 6px 0 0;\n color: var(--settings-text);\n font-weight: 600;\n}\n\n.settings-update-notes h1 {\n font-size: 18px;\n line-height: 26px;\n}\n\n.settings-update-notes h2 {\n font-size: 17px;\n line-height: 24px;\n}\n\n.settings-update-notes h3,\n.settings-update-notes h4,\n.settings-update-notes h5,\n.settings-update-notes h6 {\n font-size: 14px;\n line-height: 22px;\n}\n\n.settings-update-notes p,\n.settings-update-notes ul,\n.settings-update-notes ol,\n.settings-update-notes pre,\n.settings-update-notes blockquote {\n margin: 0;\n}\n\n.settings-update-notes ul,\n.settings-update-notes ol {\n padding-left: 24px;\n}\n\n.settings-update-notes li {\n padding-left: 4px;\n}\n\n.settings-update-notes li::marker {\n color: var(--settings-muted);\n font-size: 0.85em;\n}\n\n.settings-update-notes li + li {\n margin-top: 14px;\n}\n\n.settings-update-notes .release-note-translation {\n display: block;\n margin-top: 3px;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-update-notes blockquote {\n padding: 8px 12px;\n color: var(--settings-muted);\n border-left: 3px solid var(--settings-focus);\n background: var(--settings-surface);\n}\n\n.settings-update-notes hr {\n width: 100%;\n margin: 2px 0;\n border: 0;\n border-top: 1px solid var(--settings-divider);\n}\n\n.settings-update-notes strong {\n color: var(--settings-text);\n font-weight: 600;\n}\n\n.settings-update-notes a {\n color: var(--settings-focus);\n text-decoration: none;\n}\n\n.settings-update-notes a:hover {\n text-decoration: underline;\n}\n\n.settings-update-notes code {\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 12px;\n}\n\n.settings-update-notes :not(pre) > code {\n padding: 1px 5px;\n background: var(--settings-surface);\n border-radius: 4px;\n}\n\n.settings-update-notes pre {\n min-width: 0;\n max-width: 100%;\n padding: 10px 12px;\n overflow-x: auto;\n overflow-y: hidden;\n background: var(--settings-inset);\n border-radius: 6px;\n}\n\n.settings-update-notes pre code {\n line-height: 18px;\n white-space: pre-wrap;\n}\n\n/* Manual update sits directly under the status panel, not behind a disclosure:\n automatic updates can fail for machine-local reasons and this is the way out. */\n.settings-update-controls {\n display: grid;\n min-width: 0;\n gap: 10px;\n margin-top: 24px;\n}\n\n.settings-update-manual-title {\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-update-manual {\n display: grid;\n min-width: 0;\n gap: 8px;\n}\n\n.settings-update-manual[hidden] {\n display: none;\n}\n\n.settings-update-manual-description {\n margin: 0;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-manual-description.is-fallback {\n color: var(--settings-danger);\n}\n\n.settings-update-command {\n display: flex;\n align-items: stretch;\n min-width: 0;\n overflow: hidden;\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-update-command code {\n min-width: 0;\n flex: 1;\n padding: 9px 12px;\n overflow-x: auto;\n color: var(--settings-text);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 12px;\n line-height: 20px;\n white-space: nowrap;\n}\n\n.settings-update-command__copy {\n display: inline-flex;\n align-items: center;\n flex: none;\n gap: 6px;\n padding: 0 12px;\n color: var(--settings-muted);\n font-size: 12px;\n background: transparent;\n border: 0;\n border-left: 1px solid var(--settings-border);\n cursor: pointer;\n}\n\n.settings-update-command__copy:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-update-command__copy:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: -2px;\n}\n\n.settings-update-actions {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.settings-command-button,\n.settings-update-link {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: max-content;\n max-width: 100%;\n min-height: 30px;\n gap: 6px;\n padding: 5px 10px;\n white-space: nowrap;\n color: var(--settings-primary-text);\n font: inherit;\n font-size: 12px;\n text-decoration: none;\n background: var(--settings-primary);\n border: 1px solid var(--settings-primary);\n border-radius: 7px;\n cursor: pointer;\n}\n\n.settings-command-button--secondary,\n.settings-update-link {\n color: var(--settings-text);\n background: var(--settings-panel);\n border-color: var(--settings-border);\n}\n\n.settings-command-button:hover:not(:disabled) {\n background: var(--settings-primary-hover);\n border-color: var(--settings-primary-hover);\n}\n\n.settings-command-button--secondary:hover:not(:disabled),\n.settings-update-link:hover {\n background: var(--settings-hover);\n border-color: var(--settings-border);\n}\n\n.settings-command-button--danger {\n color: #f87171;\n}\n\n.settings-command-button--danger:hover:not(:disabled) {\n color: #fecaca;\n background: rgb(127 29 29 / 24%);\n border-color: rgb(248 113 113 / 45%);\n}\n\n.settings-command-button:disabled {\n cursor: default;\n opacity: 0.45;\n}\n\n.settings-command-button:disabled,\n.settings-command-button[aria-disabled="true"] {\n opacity: 0.55;\n cursor: not-allowed;\n filter: none;\n}\n\n.settings-command-button:focus-visible,\n.settings-update-link:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.codexhost-settings-icon {\n display: block;\n flex: none;\n stroke: currentColor;\n}\n\n@media (max-width: 720px) {\n .codexhost-settings-dialog {\n width: calc(100vw - 16px);\n height: calc(100vh - 16px);\n border-radius: 10px;\n }\n\n .settings-layout {\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: auto minmax(0, 1fr);\n }\n\n .settings-session-import-row {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .settings-session-import-row__action {\n align-items: flex-start;\n }\n\n .settings-sidebar {\n border-right: 0;\n border-bottom: 1px solid var(--settings-border);\n }\n\n .settings-header {\n height: 56px;\n padding-inline: 14px;\n }\n\n .settings-sidebar {\n padding-top: 20px;\n }\n\n .settings-nav {\n flex: none;\n flex-direction: row;\n gap: 4px;\n padding: 7px 8px 8px;\n overflow-x: auto;\n overflow-y: hidden;\n }\n\n .settings-nav-section-label {\n display: none;\n }\n\n .settings-nav-button {\n width: auto;\n min-width: max-content;\n min-height: 34px;\n grid-template-columns: 16px auto;\n border-radius: 10px;\n }\n\n .settings-nav-star-link {\n margin-top: 0;\n }\n\n .settings-page__content {\n width: calc(100% - 40px);\n }\n\n .settings-page__content {\n padding-top: 32px;\n padding-bottom: 32px;\n }\n\n .settings-section-label {\n padding-bottom: 20px;\n font-size: 20px;\n line-height: 26px;\n }\n\n .settings-update-metadata {\n grid-template-columns: minmax(0, 1fr);\n gap: 16px;\n }\n\n .settings-status-row {\n grid-template-columns: minmax(0, 1fr) auto;\n gap: 16px;\n }\n\n .settings-account-header,\n .settings-connection-page-header {\n flex-direction: column;\n }\n\n .settings-account-header > .settings-command-button,\n .settings-connection-page-header > .settings-command-button {\n width: 100%;\n }\n\n .settings-connections-layout {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .settings-connection-inspector {\n position: static;\n }\n\n .settings-status-row__detail {\n grid-column: 1 / -1;\n margin: -8px 0 0 58px;\n }\n}\n\n@media (forced-colors: active) {\n :host {\n --settings-bg: Canvas;\n --settings-sidebar: Canvas;\n --settings-panel: Canvas;\n --settings-surface: Canvas;\n --settings-surface-hover: Highlight;\n --settings-inset: Canvas;\n --settings-text: CanvasText;\n --settings-muted: GrayText;\n --settings-subtle: GrayText;\n --settings-border: ButtonBorder;\n --settings-divider: ButtonBorder;\n --settings-hover: Highlight;\n --settings-active: Highlight;\n --settings-focus: Highlight;\n --settings-primary: ButtonFace;\n --settings-primary-hover: Highlight;\n --settings-primary-text: ButtonText;\n --settings-warning: CanvasText;\n --settings-warning-bg: Canvas;\n --settings-warning-border: ButtonBorder;\n --settings-danger: CanvasText;\n --settings-danger-bg: Canvas;\n --settings-danger-border: ButtonBorder;\n --settings-success: CanvasText;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n scroll-behavior: auto !important;\n transition-duration: 0s !important;\n }\n}\n';
|
|
25900
26238
|
|
|
25901
26239
|
// src/settings/accounts.css
|
|
25902
|
-
var accounts_default = '.settings-harness-account__logo {\n display: grid;\n place-items: center;\n width: 34px;\n height: 34px;\n}\n\n.settings-account-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 20px;\n}\n\n.settings-account-header > :first-child {\n min-width: 0;\n flex: 1 1 auto;\n}\n\n.settings-account-header > .settings-command-button {\n flex: none;\n white-space: nowrap;\n margin-top: 0;\n min-height: 36px;\n padding: 8px 12px;\n border-radius: 7px;\n}\n\n.settings-account-header .settings-section-label {\n margin: 0;\n padding: 0;\n font-size: 27px;\n line-height: 1.4;\n font-weight: 650;\n letter-spacing: -0.035em;\n}\n.settings-account-header .settings-page-description {\n margin: 8px 0 0;\n font-size: 13px;\n}\n\n.settings-account-status {\n margin: 0;\n color: var(--settings-muted);\n font-size: 12px;\n}\n.settings-account-status:empty {\n display: none;\n}\n\n.settings-account-toolbar {\n margin-top: 27px;\n padding: 18px 0;\n border-top: 1px solid var(--settings-border);\n display: flex;\n align-items: center;\n gap: 14px;\n flex-wrap: wrap;\n}\n.settings-account-count {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n white-space: nowrap;\n}\n.settings-account-count > :last-child {\n color: var(--settings-muted);\n font-variant-numeric: tabular-nums;\n}\n.settings-account-search {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--settings-muted);\n margin-right: auto;\n min-width: 0;\n max-width: 100%;\n}\n.settings-account-search svg {\n flex: none;\n}\n.settings-account-toolbar input {\n min-width: 80px;\n width: 210px;\n max-width: 100%;\n padding: 5px 0;\n color: var(--settings-text);\n background: transparent;\n border: 0;\n font-size: 13px;\n}\n.settings-account-toolbar input::placeholder {\n color: var(--settings-muted);\n}\n.settings-account-display-controls {\n display: flex;\n padding: 3px;\n border: 1px solid var(--settings-border);\n border-radius: 7px;\n background: var(--settings-inset);\n}\n.settings-account-display-controls button {\n padding: 4px 10px;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 4px;\n font-size: 12px;\n cursor: pointer;\n}\n.settings-account-display-controls button:hover {\n color: var(--settings-text);\n}\n.settings-account-display-controls button[aria-pressed="true"] {\n color: var(--settings-text);\n background: var(--settings-active);\n}\n\n.settings-account-list {\n --account-border: light-dark(#e2e2e8, #36363b);\n --account-muted: light-dark(#676773, #a5a5af);\n border: 1px solid var(--account-border);\n border-radius: 11px;\n overflow: hidden;\n container-type: inline-size;\n}\n.settings-account-table {\n width: 100%;\n table-layout: fixed;\n border-collapse: collapse;\n font-size: 12px;\n}\n.settings-account-table th {\n padding: 12px 16px;\n color: var(--account-muted);\n background: light-dark(#f8f8fa, #202024);\n font-size: 11px;\n font-weight: 500;\n text-align: left;\n}\n.settings-account-table th:nth-child(1) {\n width: 32%;\n}\n.settings-account-table th:nth-child(2),\n.settings-account-table th:nth-child(3) {\n width: 24%;\n}\n.settings-account-table th:nth-child(4) {\n width: 20%;\n text-align: right;\n}\n.settings-account-table td {\n padding: 17px 16px;\n vertical-align: middle;\n border-top: 1px solid var(--settings-divider);\n}\n.settings-account-row {\n background: light-dark(#ffffff, #232326);\n}\n.settings-account-row:hover {\n background: light-dark(#f7f7fa, #26262a);\n}\n.settings-account-row__person {\n display: grid;\n grid-template-columns: 34px minmax(0, 1fr);\n align-items: center;\n gap: 11px;\n min-width: 0;\n}\n.settings-account-row__mark {\n display: grid;\n place-items: center;\n width: 34px;\n height: 34px;\n color: light-dark(#67558d, #c3baff);\n background: light-dark(#f0ecf7, #353044);\n border: 1px solid light-dark(#d9d0e6, #4d435f);\n border-radius: 10px;\n}\n.settings-account-row__identity {\n min-width: 0;\n}\n.settings-account-email {\n display: block;\n min-width: 0;\n overflow: hidden;\n font-size: 12px;\n font-weight: 550;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-metadata {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 5px;\n margin-top: 4px;\n color: var(--settings-muted);\n flex-wrap: wrap;\n font-size: 11px;\n overflow-wrap: anywhere;\n}\n.settings-account-plan {\n flex: none;\n padding: 0 4px;\n color: var(--settings-muted);\n border: 1px solid var(--settings-border);\n border-radius: 5px;\n font-size: 10px;\n max-width: 100%;\n overflow-wrap: anywhere;\n}\n.settings-account-plan--highlighted {\n color: light-dark(#654f91, #c8bfff);\n background: light-dark(#f2edf9, #a99bff18);\n border-color: light-dark(#d9ccea, #a99bff52);\n font-weight: 600;\n}\n.settings-account-active {\n flex: none;\n color: light-dark(#66548e, #c8bfff);\n font-size: 10px;\n white-space: nowrap;\n}\n\n.settings-account-usage {\n display: grid;\n gap: 10px;\n}\n.settings-account-usage__meter {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n grid-template-rows: 20px 4px 17px;\n align-items: center;\n gap: 6px 0;\n min-width: 0;\n font-variant-numeric: tabular-nums;\n}\n.settings-account-usage__title {\n display: none;\n min-width: 0;\n color: var(--settings-muted);\n font-size: 11px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-extra-usage {\n display: grid;\n gap: 12px;\n margin-top: 14px;\n}\n.settings-account-extra-usage .settings-account-usage__meter {\n grid-template-rows: auto 20px 4px 17px;\n}\n.settings-account-extra-usage .settings-account-usage__title {\n display: block;\n grid-column: 1 / -1;\n white-space: normal;\n overflow-wrap: anywhere;\n}\n.settings-account-usage__percent {\n grid-column: 1 / -1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n justify-content: flex-end;\n gap: 7px;\n font-size: 14px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n.settings-account-usage__countdown {\n min-width: 0;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.settings-account-usage__percent > :last-child {\n flex: none;\n}\n.settings-account-usage__percent--warn {\n color: var(--settings-warning);\n}\n.settings-account-usage__percent--hot {\n color: var(--settings-danger);\n}\n.settings-account-usage__bar {\n grid-column: 1 / -1;\n height: 4px;\n overflow: hidden;\n background: light-dark(#e3e1e8, #3c3c43);\n border-radius: 4px;\n}\n.settings-account-usage__bar > span {\n display: block;\n height: 100%;\n background: light-dark(#81769e, #9993b8);\n border-radius: inherit;\n}\n.settings-account-usage__bar--warn > span {\n background: var(--settings-warning);\n}\n.settings-account-usage__bar--hot > span {\n background: var(--settings-danger);\n}\n.settings-account-usage__sub {\n grid-column: 1 / -1;\n color: var(--account-muted);\n font-size: 10px;\n font-variant-numeric: tabular-nums;\n text-align: right;\n white-space: nowrap;\n}\n.settings-account-usage__message {\n color: var(--settings-muted);\n}\n.settings-account-usage__missing {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-content: center;\n gap: 6px;\n min-height: 53px;\n color: var(--settings-muted);\n}\n.settings-account-usage__missing > span:not(.settings-account-usage__title) {\n grid-column: 1 / -1;\n font-size: 14px;\n}\n.settings-account-management {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n}\n.settings-account-native {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 3px;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-native .settings-icon-button {\n width: 25px;\n height: 28px;\n}\n.settings-account-usage > button {\n justify-self: start;\n}\n.settings-account-actions {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n.settings-account-action {\n padding: 4px 5px;\n min-height: 30px;\n font-size: 12px;\n color: var(--settings-text);\n background: transparent;\n border: 1px solid transparent;\n border-radius: 7px;\n white-space: nowrap;\n cursor: pointer;\n}\n.settings-account-action:hover {\n background: var(--settings-hover);\n}\n.settings-account-action:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n.settings-account-delete {\n color: var(--settings-danger);\n}\n.settings-account-delete:hover,\n.settings-account-delete:focus-visible {\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n}\n.settings-account-reset-summary {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n min-height: 24px;\n padding: 3px 0;\n font-size: 10px;\n white-space: nowrap;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 5px;\n cursor: pointer;\n}\n.settings-account-reset-summary:hover {\n background: var(--settings-hover);\n}\n.settings-account-reset-summary[aria-expanded="true"] > svg:last-child {\n transform: rotate(90deg);\n}\n.settings-account-details-row > td {\n background: var(--settings-inset);\n}\n.settings-account-reset-details {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n flex-wrap: wrap;\n}\n.settings-account-reset-details strong {\n font-size: 12px;\n}\n.settings-account-reset-expiry {\n margin: 6px 0;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-reset-expiry.is-warn {\n color: var(--settings-warning);\n}\n.settings-account-reset-expiry.is-hot {\n color: var(--settings-danger);\n}\n.settings-account-reset-list {\n margin: 8px 0 0;\n padding: 0;\n list-style: none;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-reset-list li + li {\n margin-top: 4px;\n}\n.settings-account-empty {\n text-align: center;\n color: var(--settings-muted);\n}\n.settings-account-verification {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n color: var(--settings-muted);\n}\n.settings-account-verification a {\n color: var(--settings-focus);\n overflow-wrap: anywhere;\n}\n.settings-account-verification code {\n padding: 5px 8px;\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n letter-spacing: 0.08em;\n background: var(--settings-inset);\n border-radius: 6px;\n}\n.settings-account-list :focus-visible,\n.settings-account-toolbar :focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: -2px;\n}\n\n.settings-account-dialog {\n position: fixed;\n width: min(360px, calc(100vw - 40px));\n max-height: calc(100vh - 40px);\n overflow: auto;\n padding: 22px;\n color: var(--settings-text);\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n text-align: left;\n}\n.settings-account-dialog::backdrop {\n background: #0005;\n}\n.settings-account-dialog h2 {\n margin: 0 28px 12px 0;\n font-size: 15px;\n}\n.settings-account-dialog p {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 1.6;\n overflow-wrap: anywhere;\n}\n.settings-account-dialog__close {\n position: absolute;\n top: 12px;\n right: 12px;\n}\n.settings-account-dialog__actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n@container (max-width: 680px) {\n .settings-account-table,\n .settings-account-table tbody {\n display: block;\n }\n .settings-account-table thead {\n display: none;\n }\n .settings-account-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);\n padding: 18px;\n gap: 18px 22px;\n border-top: 1px solid var(--settings-divider);\n }\n .settings-account-row:first-child {\n border-top: 0;\n }\n .settings-account-table .settings-account-row > td {\n display: block;\n min-width: 0;\n padding: 0;\n border: 0;\n }\n .settings-account-person-cell,\n .settings-account-management-cell,\n .settings-account-usage-cell--message {\n grid-column: 1 / -1;\n }\n .settings-account-table .settings-account-management-cell {\n border-top: 1px solid var(--settings-divider);\n padding-top: 8px;\n }\n .settings-account-email {\n font-size: 13px;\n }\n .settings-account-usage__title {\n display: block;\n grid-column: 1;\n }\n .settings-account-usage__percent,\n .settings-account-usage__missing > span:not(.settings-account-usage__title) {\n grid-column: 2;\n text-align: right;\n }\n .settings-account-extra-usage .settings-account-usage__percent {\n grid-column: 1 / -1;\n }\n .settings-account-management {\n flex-direction: row;\n justify-content: space-between;\n }\n .settings-account-actions {\n order: 1;\n margin-left: auto;\n }\n .settings-account-native {\n justify-content: flex-start;\n }\n .settings-account-table tr:not(.settings-account-row, [hidden]),\n .settings-account-table tr:not(.settings-account-row, [hidden]) > td {\n display: block;\n }\n}\n\n@container (max-width: 360px) {\n .settings-account-row {\n grid-template-columns: minmax(0, 1fr);\n gap: 16px;\n padding: 16px;\n }\n}\n\n@media (forced-colors: active) {\n .settings-account-usage__bar {\n border: 1px solid CanvasText;\n }\n .settings-account-usage__bar > span {\n background: Highlight;\n }\n}\n';
|
|
26240
|
+
var accounts_default = '.settings-harness-account__logo {\n display: grid;\n place-items: center;\n width: 34px;\n height: 34px;\n}\n\n.settings-account-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 20px;\n}\n\n.settings-account-header > :first-child {\n min-width: 0;\n flex: 1 1 auto;\n}\n\n.settings-account-header > .settings-command-button {\n flex: none;\n white-space: nowrap;\n margin-top: 0;\n min-height: 36px;\n padding: 8px 12px;\n border-radius: 7px;\n}\n\n.settings-account-header .settings-section-label {\n margin: 0;\n padding: 0;\n font-size: 27px;\n line-height: 1.4;\n font-weight: 650;\n letter-spacing: -0.035em;\n}\n.settings-account-header .settings-page-description {\n margin: 8px 0 0;\n font-size: 13px;\n}\n\n.settings-account-status {\n margin: 0;\n color: var(--settings-muted);\n font-size: 12px;\n}\n.settings-account-status:empty {\n display: none;\n}\n\n.settings-account-toolbar {\n margin-top: 27px;\n padding: 18px 0;\n border-top: 1px solid var(--settings-border);\n display: flex;\n align-items: center;\n gap: 14px;\n flex-wrap: wrap;\n}\n.settings-account-count {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n white-space: nowrap;\n}\n.settings-account-count > :last-child {\n color: var(--settings-muted);\n font-variant-numeric: tabular-nums;\n}\n.settings-account-search {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--settings-muted);\n margin-right: auto;\n min-width: 0;\n max-width: 100%;\n}\n.settings-account-search svg {\n flex: none;\n}\n.settings-account-toolbar input {\n min-width: 80px;\n width: 210px;\n max-width: 100%;\n padding: 5px 0;\n color: var(--settings-text);\n background: transparent;\n border: 0;\n font-size: 13px;\n}\n.settings-account-toolbar input::placeholder {\n color: var(--settings-muted);\n}\n.settings-account-display-controls {\n display: flex;\n padding: 3px;\n border: 1px solid var(--settings-border);\n border-radius: 7px;\n background: var(--settings-inset);\n}\n.settings-account-display-controls button {\n padding: 4px 10px;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 4px;\n font-size: 12px;\n cursor: pointer;\n}\n.settings-account-display-controls button:hover {\n color: var(--settings-text);\n}\n.settings-account-display-controls button[aria-pressed="true"] {\n color: var(--settings-text);\n background: var(--settings-active);\n}\n\n.settings-account-list {\n --account-border: light-dark(#e2e2e8, #36363b);\n --account-muted: light-dark(#676773, #a5a5af);\n border: 1px solid var(--account-border);\n border-radius: 11px;\n overflow: hidden;\n container-type: inline-size;\n}\n.settings-account-table {\n width: 100%;\n table-layout: fixed;\n border-collapse: collapse;\n font-size: 12px;\n}\n.settings-account-table th {\n padding: 12px 16px;\n color: var(--account-muted);\n background: light-dark(#f8f8fa, #202024);\n font-size: 11px;\n font-weight: 500;\n text-align: left;\n}\n.settings-account-table th:nth-child(1) {\n width: 32%;\n}\n.settings-account-table th:nth-child(2),\n.settings-account-table th:nth-child(3) {\n width: 24%;\n}\n.settings-account-table th:nth-child(4) {\n width: 20%;\n text-align: right;\n}\n.settings-account-table td {\n padding: 17px 16px;\n vertical-align: middle;\n border-top: 1px solid var(--settings-divider);\n}\n.settings-account-row {\n background: light-dark(#ffffff, #232326);\n}\n.settings-account-row:hover {\n background: light-dark(#f7f7fa, #26262a);\n}\n.settings-account-row__person {\n display: grid;\n grid-template-columns: 34px minmax(0, 1fr);\n align-items: center;\n gap: 11px;\n min-width: 0;\n}\n.settings-account-row__mark {\n display: grid;\n place-items: center;\n width: 34px;\n height: 34px;\n color: light-dark(#67558d, #c3baff);\n background: light-dark(#f0ecf7, #353044);\n border: 1px solid light-dark(#d9d0e6, #4d435f);\n border-radius: 10px;\n}\n.settings-account-row__identity {\n min-width: 0;\n}\n.settings-account-email {\n display: block;\n min-width: 0;\n overflow: hidden;\n font-size: 12px;\n font-weight: 550;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-metadata {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 5px;\n margin-top: 4px;\n color: var(--settings-muted);\n flex-wrap: wrap;\n font-size: 11px;\n overflow-wrap: anywhere;\n}\n.settings-account-plan {\n flex: none;\n padding: 0 4px;\n color: var(--settings-muted);\n border: 1px solid var(--settings-border);\n border-radius: 5px;\n font-size: 10px;\n max-width: 100%;\n overflow-wrap: anywhere;\n}\n.settings-account-plan--highlighted {\n color: light-dark(#654f91, #c8bfff);\n background: light-dark(#f2edf9, #a99bff18);\n border-color: light-dark(#d9ccea, #a99bff52);\n font-weight: 600;\n}\n.settings-account-active {\n flex: none;\n color: light-dark(#66548e, #c8bfff);\n font-size: 10px;\n white-space: nowrap;\n}\n\n.settings-account-usage {\n display: grid;\n gap: 10px;\n}\n.settings-account-usage__meter {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n grid-template-rows: 20px 4px 17px;\n align-items: center;\n gap: 6px 0;\n min-width: 0;\n font-variant-numeric: tabular-nums;\n}\n.settings-account-usage__title {\n display: none;\n min-width: 0;\n color: var(--settings-muted);\n font-size: 11px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-extra-usage {\n display: grid;\n gap: 12px;\n margin-top: 14px;\n}\n.settings-account-extra-usage .settings-account-usage__meter,\n.settings-account-usage__meter--scoped {\n grid-template-rows: auto 20px 4px 17px;\n}\n.settings-account-extra-usage .settings-account-usage__title,\n.settings-account-usage__meter--scoped .settings-account-usage__title {\n display: block;\n grid-column: 1 / -1;\n white-space: normal;\n overflow-wrap: anywhere;\n}\n.settings-account-usage__percent {\n grid-column: 1 / -1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n justify-content: flex-end;\n gap: 7px;\n font-size: 14px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n.settings-account-usage__countdown {\n min-width: 0;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.settings-account-usage__percent > :last-child {\n flex: none;\n}\n.settings-account-usage__percent--warn {\n color: var(--settings-warning);\n}\n.settings-account-usage__percent--hot {\n color: var(--settings-danger);\n}\n.settings-account-usage__bar {\n grid-column: 1 / -1;\n height: 4px;\n overflow: hidden;\n background: light-dark(#e3e1e8, #3c3c43);\n border-radius: 4px;\n}\n.settings-account-usage__bar > span {\n display: block;\n height: 100%;\n background: light-dark(#81769e, #9993b8);\n border-radius: inherit;\n}\n.settings-account-usage__bar--warn > span {\n background: var(--settings-warning);\n}\n.settings-account-usage__bar--hot > span {\n background: var(--settings-danger);\n}\n.settings-account-usage__sub {\n grid-column: 1 / -1;\n color: var(--account-muted);\n font-size: 10px;\n font-variant-numeric: tabular-nums;\n text-align: right;\n white-space: nowrap;\n}\n.settings-account-usage__message {\n color: var(--settings-muted);\n}\n.settings-account-usage__missing {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-content: center;\n gap: 6px;\n min-height: 53px;\n color: var(--settings-muted);\n}\n.settings-account-usage__missing > span:not(.settings-account-usage__title) {\n grid-column: 1 / -1;\n font-size: 14px;\n}\n.settings-account-table .settings-account-spanning-cell {\n vertical-align: top;\n}\n.settings-account-quota-continuation-row > .settings-account-usage-cell {\n background: inherit;\n}\n.settings-account-management {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n}\n.settings-account-native {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 3px;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-native .settings-icon-button {\n width: 25px;\n height: 28px;\n}\n.settings-account-usage > button {\n justify-self: start;\n}\n.settings-account-actions {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n.settings-account-action {\n padding: 4px 5px;\n min-height: 30px;\n font-size: 12px;\n color: var(--settings-text);\n background: transparent;\n border: 1px solid transparent;\n border-radius: 7px;\n white-space: nowrap;\n cursor: pointer;\n}\n.settings-account-action:hover {\n background: var(--settings-hover);\n}\n.settings-account-action:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n.settings-account-delete {\n color: var(--settings-danger);\n}\n.settings-account-delete:hover,\n.settings-account-delete:focus-visible {\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n}\n.settings-account-reset-summary {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n min-height: 24px;\n padding: 3px 0;\n font-size: 10px;\n white-space: nowrap;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 5px;\n cursor: pointer;\n}\n.settings-account-reset-summary:hover {\n background: var(--settings-hover);\n}\n.settings-account-reset-summary[aria-expanded="true"] > svg:last-child {\n transform: rotate(90deg);\n}\n.settings-account-details-row > td {\n background: var(--settings-inset);\n}\n.settings-account-reset-details {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n flex-wrap: wrap;\n}\n.settings-account-reset-details strong {\n font-size: 12px;\n}\n.settings-account-reset-expiry {\n margin: 6px 0;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-reset-expiry.is-warn {\n color: var(--settings-warning);\n}\n.settings-account-reset-expiry.is-hot {\n color: var(--settings-danger);\n}\n.settings-account-reset-list {\n margin: 8px 0 0;\n padding: 0;\n list-style: none;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-reset-list li + li {\n margin-top: 4px;\n}\n.settings-account-empty {\n text-align: center;\n color: var(--settings-muted);\n}\n.settings-account-verification {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n color: var(--settings-muted);\n}\n.settings-account-verification a {\n color: var(--settings-focus);\n overflow-wrap: anywhere;\n}\n.settings-account-verification code {\n padding: 5px 8px;\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n letter-spacing: 0.08em;\n background: var(--settings-inset);\n border-radius: 6px;\n}\n.settings-account-list :focus-visible,\n.settings-account-toolbar :focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: -2px;\n}\n\n.settings-account-dialog {\n position: fixed;\n width: min(360px, calc(100vw - 40px));\n max-height: calc(100vh - 40px);\n overflow: auto;\n padding: 22px;\n color: var(--settings-text);\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n text-align: left;\n}\n.settings-account-dialog::backdrop {\n background: #0005;\n}\n.settings-account-dialog h2 {\n margin: 0 28px 12px 0;\n font-size: 15px;\n}\n.settings-account-dialog p {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 1.6;\n overflow-wrap: anywhere;\n}\n.settings-account-dialog__close {\n position: absolute;\n top: 12px;\n right: 12px;\n}\n.settings-account-dialog__actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n@container (max-width: 680px) {\n .settings-account-table,\n .settings-account-table tbody {\n display: block;\n }\n .settings-account-table thead {\n display: none;\n }\n .settings-account-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);\n padding: 18px;\n gap: 18px 22px;\n border-top: 1px solid var(--settings-divider);\n }\n .settings-account-row:first-child {\n border-top: 0;\n }\n .settings-account-table .settings-account-row > td {\n display: block;\n min-width: 0;\n padding: 0;\n border: 0;\n }\n .settings-account-person-cell,\n .settings-account-management-cell,\n .settings-account-usage-cell--message {\n grid-column: 1 / -1;\n }\n .settings-account-table .settings-account-management-cell {\n border-top: 1px solid var(--settings-divider);\n padding-top: 8px;\n }\n .settings-account-email {\n font-size: 13px;\n }\n .settings-account-usage__title {\n display: block;\n grid-column: 1;\n }\n .settings-account-usage__percent,\n .settings-account-usage__missing > span:not(.settings-account-usage__title) {\n grid-column: 2;\n text-align: right;\n }\n .settings-account-extra-usage .settings-account-usage__percent {\n grid-column: 1 / -1;\n }\n .settings-account-management {\n flex-direction: row;\n justify-content: space-between;\n }\n .settings-account-actions {\n order: 1;\n margin-left: auto;\n }\n .settings-account-native {\n justify-content: flex-start;\n }\n .settings-account-table tr:not(.settings-account-row, [hidden]),\n .settings-account-table tr:not(.settings-account-row, [hidden]) > td {\n display: block;\n }\n}\n\n@container (max-width: 360px) {\n .settings-account-row {\n grid-template-columns: minmax(0, 1fr);\n gap: 16px;\n padding: 16px;\n }\n}\n\n@media (forced-colors: active) {\n .settings-account-usage__bar {\n border: 1px solid CanvasText;\n }\n .settings-account-usage__bar > span {\n background: Highlight;\n }\n}\n';
|
|
25903
26241
|
|
|
25904
26242
|
// src/settings/shell.ts
|
|
25905
26243
|
var SETTINGS_SHELL_ATTRIBUTE = "data-codexhost-settings-shell";
|
|
@@ -26522,6 +26860,82 @@ ${accounts_default}`;
|
|
|
26522
26860
|
};
|
|
26523
26861
|
}
|
|
26524
26862
|
|
|
26863
|
+
// src/renderer-account-navigation.ts
|
|
26864
|
+
function createRendererAccountNavigation(currentThread) {
|
|
26865
|
+
let cancel = () => {
|
|
26866
|
+
};
|
|
26867
|
+
return {
|
|
26868
|
+
async switchAccount(operation) {
|
|
26869
|
+
cancel();
|
|
26870
|
+
const view = currentThread();
|
|
26871
|
+
if (!view) return operation();
|
|
26872
|
+
const controller = new AbortController();
|
|
26873
|
+
let deadline = 0;
|
|
26874
|
+
let timer;
|
|
26875
|
+
let committed = false;
|
|
26876
|
+
let opening = false;
|
|
26877
|
+
let done = false;
|
|
26878
|
+
const finish = () => {
|
|
26879
|
+
if (done) return;
|
|
26880
|
+
done = true;
|
|
26881
|
+
observer.disconnect();
|
|
26882
|
+
if (timer !== void 0) window.clearTimeout(timer);
|
|
26883
|
+
document.removeEventListener("pointerdown", onInput, true);
|
|
26884
|
+
document.removeEventListener("keydown", onInput, true);
|
|
26885
|
+
controller.abort();
|
|
26886
|
+
};
|
|
26887
|
+
const onInput = (event) => {
|
|
26888
|
+
if (!event.composedPath().some(
|
|
26889
|
+
(node) => node instanceof Element && node.hasAttribute("data-codexhost-settings-shell")
|
|
26890
|
+
))
|
|
26891
|
+
finish();
|
|
26892
|
+
};
|
|
26893
|
+
const restore = () => {
|
|
26894
|
+
if (done || !committed || opening || view.composer.isConnected) return;
|
|
26895
|
+
if (Date.now() >= deadline) {
|
|
26896
|
+
finish();
|
|
26897
|
+
return;
|
|
26898
|
+
}
|
|
26899
|
+
const composer = document.querySelector(CODEX_COMPOSER_SELECTOR);
|
|
26900
|
+
if (!composer) return;
|
|
26901
|
+
const selected = composer.querySelector(":scope > [data-above-composer-portal]")?.getAttribute("data-above-composer-conversation-id");
|
|
26902
|
+
if (selected) {
|
|
26903
|
+
finish();
|
|
26904
|
+
return;
|
|
26905
|
+
}
|
|
26906
|
+
opening = true;
|
|
26907
|
+
void openRendererThread(view.threadId, { hostId: "local", signal: controller.signal }).catch(() => {
|
|
26908
|
+
if (!controller.signal.aborted)
|
|
26909
|
+
console.warn(
|
|
26910
|
+
"codexhost: Could not restore the selected Thread after Account switching"
|
|
26911
|
+
);
|
|
26912
|
+
}).finally(finish);
|
|
26913
|
+
};
|
|
26914
|
+
const observer = new MutationObserver(restore);
|
|
26915
|
+
cancel = finish;
|
|
26916
|
+
observer.observe(document.documentElement, { childList: true, subtree: true });
|
|
26917
|
+
document.addEventListener("pointerdown", onInput, true);
|
|
26918
|
+
document.addEventListener("keydown", onInput, true);
|
|
26919
|
+
try {
|
|
26920
|
+
const result = await operation();
|
|
26921
|
+
committed = true;
|
|
26922
|
+
if (!done) {
|
|
26923
|
+
deadline = Date.now() + 3e4;
|
|
26924
|
+
timer = window.setTimeout(finish, 3e4);
|
|
26925
|
+
restore();
|
|
26926
|
+
}
|
|
26927
|
+
return result;
|
|
26928
|
+
} catch (error51) {
|
|
26929
|
+
finish();
|
|
26930
|
+
throw error51;
|
|
26931
|
+
}
|
|
26932
|
+
},
|
|
26933
|
+
dispose() {
|
|
26934
|
+
cancel();
|
|
26935
|
+
}
|
|
26936
|
+
};
|
|
26937
|
+
}
|
|
26938
|
+
|
|
26525
26939
|
// src/renderer-binding-probe.ts
|
|
26526
26940
|
var externalHarnessIds = {
|
|
26527
26941
|
pi: harnessIdSchema.parse("pi"),
|
|
@@ -26533,7 +26947,8 @@ ${accounts_default}`;
|
|
|
26533
26947
|
antigravity: harnessIdSchema.parse("antigravity"),
|
|
26534
26948
|
"kiro-cli": harnessIdSchema.parse("kiro-cli"),
|
|
26535
26949
|
codebuddy: harnessIdSchema.parse("codebuddy"),
|
|
26536
|
-
"cursor-cli": harnessIdSchema.parse("cursor-cli")
|
|
26950
|
+
"cursor-cli": harnessIdSchema.parse("cursor-cli"),
|
|
26951
|
+
hermes: harnessIdSchema.parse("hermes")
|
|
26537
26952
|
};
|
|
26538
26953
|
var externalAgents = [
|
|
26539
26954
|
"pi",
|
|
@@ -26545,7 +26960,8 @@ ${accounts_default}`;
|
|
|
26545
26960
|
"antigravity",
|
|
26546
26961
|
"kiro-cli",
|
|
26547
26962
|
"codebuddy",
|
|
26548
|
-
"cursor-cli"
|
|
26963
|
+
"cursor-cli",
|
|
26964
|
+
"hermes"
|
|
26549
26965
|
];
|
|
26550
26966
|
function isRetryableHarnessAvailability(availability, error51) {
|
|
26551
26967
|
return availability !== void 0 && availability !== "ready" && availability !== "notInstalled" && error51?.retryable === true;
|
|
@@ -26730,6 +27146,13 @@ ${accounts_default}`;
|
|
|
26730
27146
|
...permissionModeId ? { permissionModeId } : {}
|
|
26731
27147
|
};
|
|
26732
27148
|
}
|
|
27149
|
+
if (inspection.harnessId === "hermes") {
|
|
27150
|
+
return {
|
|
27151
|
+
agent: "hermes",
|
|
27152
|
+
...inspection.effectiveModel ? { model: inspection.effectiveModel } : {},
|
|
27153
|
+
...inspection.effectivePermissionModeId ? { permissionModeId: inspection.effectivePermissionModeId } : {}
|
|
27154
|
+
};
|
|
27155
|
+
}
|
|
26733
27156
|
throw new Error("Thread owner is not a Renderer Agent");
|
|
26734
27157
|
}
|
|
26735
27158
|
function isOwnershipSubmissionBlocked(status) {
|
|
@@ -26834,9 +27257,23 @@ ${accounts_default}`;
|
|
|
26834
27257
|
getLocalAgent: localAgentForSidebarThread
|
|
26835
27258
|
});
|
|
26836
27259
|
let connectionDiagnostics = null;
|
|
27260
|
+
const accountNavigation = createRendererAccountNavigation(() => {
|
|
27261
|
+
const views = [...mountedByComposer.values()].filter(
|
|
27262
|
+
(mounted) => mounted.composer.isConnected && mounted.hostId === "local" && mounted.ownershipStatus === "ready" && controller.get(mounted.composer).agent === "codex"
|
|
27263
|
+
);
|
|
27264
|
+
const view = views.length === 1 ? views[0] : void 0;
|
|
27265
|
+
const threadId = view && threadIdFromComposerModelTarget(view.modelTarget);
|
|
27266
|
+
return view && threadId ? { composer: view.composer, threadId } : null;
|
|
27267
|
+
});
|
|
26837
27268
|
const settingsLifecycle = installRendererSettingsLifecycle(window, {
|
|
26838
27269
|
getUpdateClient: () => modelControl,
|
|
26839
|
-
getAccountClient: () =>
|
|
27270
|
+
getAccountClient: () => {
|
|
27271
|
+
const client = modelControl;
|
|
27272
|
+
return client && {
|
|
27273
|
+
...client,
|
|
27274
|
+
switchCodexAccount: (input) => accountNavigation.switchAccount(() => client.switchCodexAccount(input))
|
|
27275
|
+
};
|
|
27276
|
+
},
|
|
26840
27277
|
getConnectionDiagnostics: () => connectionDiagnostics,
|
|
26841
27278
|
getSessionImportClient: () => {
|
|
26842
27279
|
const client = modelClientForHost("local");
|
|
@@ -26876,7 +27313,8 @@ ${accounts_default}`;
|
|
|
26876
27313
|
antigravity: void 0,
|
|
26877
27314
|
"kiro-cli": void 0,
|
|
26878
27315
|
codebuddy: void 0,
|
|
26879
|
-
"cursor-cli": void 0
|
|
27316
|
+
"cursor-cli": void 0,
|
|
27317
|
+
hermes: void 0
|
|
26880
27318
|
},
|
|
26881
27319
|
webUi: Object.fromEntries(
|
|
26882
27320
|
externalAgents.map((agent) => [agent, false])
|
|
@@ -26901,7 +27339,18 @@ ${accounts_default}`;
|
|
|
26901
27339
|
if (!client) return null;
|
|
26902
27340
|
const state = hostHarnessAvailabilityState(hostId);
|
|
26903
27341
|
if (state.codexAccounts?.client !== client) {
|
|
26904
|
-
state.codexAccounts
|
|
27342
|
+
state.codexAccounts?.dispose();
|
|
27343
|
+
state.codexAccounts = new RendererCodexAccountState(client, () => {
|
|
27344
|
+
queueMicrotask(() => {
|
|
27345
|
+
if (disposed || hostHarnessAvailabilityState(hostId).codexAccounts?.client !== client)
|
|
27346
|
+
return;
|
|
27347
|
+
for (const mounted of mountedByComposer.values()) {
|
|
27348
|
+
if (mounted.hostId !== hostId) continue;
|
|
27349
|
+
renderMounted(mounted);
|
|
27350
|
+
void refreshDraftCodexUsage(mounted);
|
|
27351
|
+
}
|
|
27352
|
+
});
|
|
27353
|
+
});
|
|
26905
27354
|
}
|
|
26906
27355
|
return state.codexAccounts;
|
|
26907
27356
|
};
|
|
@@ -26919,12 +27368,7 @@ ${accounts_default}`;
|
|
|
26919
27368
|
const isCurrentModelRequest = (mounted, generation) => isMountedComposer(mounted.composer) && mountedByComposer.get(mounted.composer) === mounted && controller.isCurrentModelRequest(mounted.composer, generation);
|
|
26920
27369
|
const isCurrentOwnershipRequest = (mounted, generation) => mounted.composer.isConnected && mountedByComposer.get(mounted.composer) === mounted && controller.isCurrentOwnershipRequest(mounted.composer, generation);
|
|
26921
27370
|
const notifySubmission = (composer, trigger) => {
|
|
26922
|
-
const
|
|
26923
|
-
const state = controller.recordSubmission(
|
|
26924
|
-
composer,
|
|
26925
|
-
accounts?.selection.selectedAccountId ?? void 0
|
|
26926
|
-
);
|
|
26927
|
-
if (state.agent === "codex" && accounts) accounts.overrideAccountId = null;
|
|
27371
|
+
const state = controller.recordSubmission(composer);
|
|
26928
27372
|
writeNewThreadAgentPreference(state.agent);
|
|
26929
27373
|
if (state.agent !== "codex") {
|
|
26930
27374
|
const model = controller.modelForAgent(composer, state.agent);
|
|
@@ -26948,9 +27392,10 @@ ${accounts_default}`;
|
|
|
26948
27392
|
);
|
|
26949
27393
|
};
|
|
26950
27394
|
const renderMounted = (mounted) => {
|
|
26951
|
-
const state = controller.get(mounted.composer);
|
|
26952
27395
|
const accounts = composerCodexAccounts(mounted.composer);
|
|
26953
|
-
const
|
|
27396
|
+
const currentCodexAccount = accounts?.accounts.find(
|
|
27397
|
+
({ accountId }) => accountId === accounts.readyAccountId
|
|
27398
|
+
);
|
|
26954
27399
|
renderComposerAgentControl(
|
|
26955
27400
|
mounted.control,
|
|
26956
27401
|
controller.get(mounted.composer),
|
|
@@ -26962,10 +27407,7 @@ ${accounts_default}`;
|
|
|
26962
27407
|
mounted.usage,
|
|
26963
27408
|
mounted.accountCredits,
|
|
26964
27409
|
settingsLifecycle.locale,
|
|
26965
|
-
|
|
26966
|
-
...account,
|
|
26967
|
-
active: account.accountId === selectedCodexAccountId
|
|
26968
|
-
})),
|
|
27410
|
+
currentCodexAccount ?? null,
|
|
26969
27411
|
mounted.ownershipStatus === "error"
|
|
26970
27412
|
);
|
|
26971
27413
|
if (mounted.control.usage) {
|
|
@@ -27039,7 +27481,7 @@ ${accounts_default}`;
|
|
|
27039
27481
|
return;
|
|
27040
27482
|
const accounts = composerCodexAccounts(mounted.composer);
|
|
27041
27483
|
const client = accounts?.client;
|
|
27042
|
-
const accountId = accounts?.
|
|
27484
|
+
const accountId = accounts?.readyAccountId;
|
|
27043
27485
|
const hostId = mounted.hostId;
|
|
27044
27486
|
const generation = ++mounted.usageRequestGeneration;
|
|
27045
27487
|
mounted.usage = null;
|
|
@@ -27048,7 +27490,7 @@ ${accounts_default}`;
|
|
|
27048
27490
|
if (accounts?.switching || !accountId || !client?.inspectCodexAccountUsage) return;
|
|
27049
27491
|
try {
|
|
27050
27492
|
const result = await client.inspectCodexAccountUsage({ accountId });
|
|
27051
|
-
if (disposed || mounted.hostId !== hostId || composerCodexAccounts(mounted.composer) !== accounts || !mounted.composer.isConnected || mountedByComposer.get(mounted.composer) !== mounted || mounted.usageRequestGeneration !== generation || controller.get(mounted.composer).agent !== "codex" || controller.get(mounted.composer).phase !== "draft" || controller.isSubmissionPending(mounted.composer) || threadIdFromComposerModelTarget(mounted.modelTarget) || accounts.
|
|
27493
|
+
if (disposed || mounted.hostId !== hostId || composerCodexAccounts(mounted.composer) !== accounts || !mounted.composer.isConnected || mountedByComposer.get(mounted.composer) !== mounted || mounted.usageRequestGeneration !== generation || controller.get(mounted.composer).agent !== "codex" || controller.get(mounted.composer).phase !== "draft" || controller.isSubmissionPending(mounted.composer) || threadIdFromComposerModelTarget(mounted.modelTarget) || accounts.readyAccountId !== accountId || result.accountId !== accountId)
|
|
27052
27494
|
return;
|
|
27053
27495
|
mounted.usage = result.usage;
|
|
27054
27496
|
mounted.accountCredits = result.accountCredits ?? null;
|
|
@@ -27155,8 +27597,7 @@ ${accounts_default}`;
|
|
|
27155
27597
|
agent,
|
|
27156
27598
|
model,
|
|
27157
27599
|
thinkingOptionId,
|
|
27158
|
-
permissionModeId
|
|
27159
|
-
inspection.owner === "codex" ? inspection.accountId : void 0
|
|
27600
|
+
permissionModeId
|
|
27160
27601
|
);
|
|
27161
27602
|
if (!restored) {
|
|
27162
27603
|
throw new Error("Thread owner could not be applied to the Composer");
|
|
@@ -27872,39 +28313,6 @@ ${accounts_default}`;
|
|
|
27872
28313
|
void refreshDraftCodexUsage(mounted);
|
|
27873
28314
|
}
|
|
27874
28315
|
};
|
|
27875
|
-
const selectCodexAccount = async (mounted, accountId) => {
|
|
27876
|
-
const hostId = mounted.hostId;
|
|
27877
|
-
const accounts = composerCodexAccounts(mounted.composer);
|
|
27878
|
-
if (!accounts || accounts.switching || controller.get(mounted.composer).phase === "locked" || !accounts.accounts.some((account) => account.accountId === accountId))
|
|
27879
|
-
return;
|
|
27880
|
-
const isCurrent = () => !disposed && mounted.composer.isConnected && mountedByComposer.get(mounted.composer) === mounted && controller.get(mounted.composer).phase !== "locked" && accounts.accounts.some((account) => account.accountId === accountId) && mounted.hostId === hostId && activeModelHostId() === hostId && composerCodexAccounts(mounted.composer) === accounts;
|
|
27881
|
-
accounts.switching = true;
|
|
27882
|
-
for (const candidate of mountedByComposer.values()) {
|
|
27883
|
-
renderMounted(candidate);
|
|
27884
|
-
void refreshDraftCodexUsage(candidate);
|
|
27885
|
-
}
|
|
27886
|
-
try {
|
|
27887
|
-
if (controller.get(mounted.composer).agent !== "codex" && !await switchComposerAgent(mounted, "codex")) {
|
|
27888
|
-
return;
|
|
27889
|
-
}
|
|
27890
|
-
const policy = await waitForRendererDraftPrewarmPolicy(window);
|
|
27891
|
-
if (!isCurrent() || policy.hostId !== hostId) return;
|
|
27892
|
-
await policy.clear();
|
|
27893
|
-
if (!isCurrent() || window.__codexhostDraftPrewarmPolicyV1 !== policy) return;
|
|
27894
|
-
if (!policy.selectAccount) throw new Error("Codex Account selection is unavailable");
|
|
27895
|
-
const override = accountId === accounts.selection.activeAccountId ? null : accountId;
|
|
27896
|
-
policy.selectAccount(override);
|
|
27897
|
-
accounts.overrideAccountId = override;
|
|
27898
|
-
} catch {
|
|
27899
|
-
if (isCurrent()) void loadCodexAccounts();
|
|
27900
|
-
} finally {
|
|
27901
|
-
accounts.switching = false;
|
|
27902
|
-
for (const candidate of mountedByComposer.values()) {
|
|
27903
|
-
renderMounted(candidate);
|
|
27904
|
-
void refreshDraftCodexUsage(candidate);
|
|
27905
|
-
}
|
|
27906
|
-
}
|
|
27907
|
-
};
|
|
27908
28316
|
const openInstallPage = (agent) => {
|
|
27909
28317
|
const url2 = RENDERER_AGENT_INSTALL_URLS[agent];
|
|
27910
28318
|
window.open(url2, "_blank", "noopener,noreferrer");
|
|
@@ -28175,11 +28583,6 @@ ${accounts_default}`;
|
|
|
28175
28583
|
void switchComposerAgent(mounted2, agent);
|
|
28176
28584
|
},
|
|
28177
28585
|
openInstallPage,
|
|
28178
|
-
async (accountId) => {
|
|
28179
|
-
const mounted2 = mountedByComposer.get(composer);
|
|
28180
|
-
if (!composer.isConnected || !mounted2) return;
|
|
28181
|
-
await selectCodexAccount(mounted2, accountId);
|
|
28182
|
-
},
|
|
28183
28586
|
() => {
|
|
28184
28587
|
void loadCodexAccounts();
|
|
28185
28588
|
},
|
|
@@ -28380,20 +28783,6 @@ ${accounts_default}`;
|
|
|
28380
28783
|
if (!isExternalConfigurationReady(mounted)) return false;
|
|
28381
28784
|
if (current.phase === "locked") return true;
|
|
28382
28785
|
if (!applyComposerAgent(composer)) return false;
|
|
28383
|
-
if (current.agent === "codex") {
|
|
28384
|
-
const selection = composerCodexAccounts(composer)?.selection;
|
|
28385
|
-
const accountId = controller.isSubmissionPending(composer) && current.codexAccountId ? current.codexAccountId : selection?.selectedAccountId;
|
|
28386
|
-
const override = accountId === selection?.activeAccountId ? null : accountId ?? null;
|
|
28387
|
-
const policy = window.__codexhostDraftPrewarmPolicyV1;
|
|
28388
|
-
if (override !== null && (policy?.hostId !== mounted.hostId || !policy.selectAccount)) {
|
|
28389
|
-
return false;
|
|
28390
|
-
}
|
|
28391
|
-
try {
|
|
28392
|
-
if (policy?.hostId === mounted.hostId) policy.selectAccount?.(override);
|
|
28393
|
-
} catch {
|
|
28394
|
-
return false;
|
|
28395
|
-
}
|
|
28396
|
-
}
|
|
28397
28786
|
controller.markSubmissionPending(composer);
|
|
28398
28787
|
renderMounted(mounted);
|
|
28399
28788
|
return true;
|
|
@@ -28585,6 +28974,7 @@ ${accounts_default}`;
|
|
|
28585
28974
|
for (const state of harnessAvailabilityByHost.values()) {
|
|
28586
28975
|
state.requestGeneration += 1;
|
|
28587
28976
|
state.request = null;
|
|
28977
|
+
state.codexAccounts?.dispose();
|
|
28588
28978
|
if (state.retryTimer !== null) window.clearTimeout(state.retryTimer);
|
|
28589
28979
|
}
|
|
28590
28980
|
harnessAvailabilityByHost.clear();
|
|
@@ -28627,6 +29017,7 @@ ${accounts_default}`;
|
|
|
28627
29017
|
mutationObserver.disconnect();
|
|
28628
29018
|
disposeReasoningSoftWrap();
|
|
28629
29019
|
sidebarAgentIcons.dispose();
|
|
29020
|
+
accountNavigation.dispose();
|
|
28630
29021
|
settingsLifecycle.dispose();
|
|
28631
29022
|
document.removeEventListener("beforeinput", onBeforeInput, true);
|
|
28632
29023
|
document.removeEventListener("submit", onSubmit, true);
|
|
@@ -28637,6 +29028,7 @@ ${accounts_default}`;
|
|
|
28637
29028
|
window.removeEventListener("focus", onWindowFocus);
|
|
28638
29029
|
for (const state of harnessAvailabilityByHost.values()) {
|
|
28639
29030
|
state.requestGeneration += 1;
|
|
29031
|
+
state.codexAccounts?.dispose();
|
|
28640
29032
|
if (state.retryTimer !== null) window.clearTimeout(state.retryTimer);
|
|
28641
29033
|
}
|
|
28642
29034
|
harnessAvailabilityByHost.clear();
|