@codexhost/cli-win32-arm64 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.
@@ -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, codexAccountId) {
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, codexAccountId) {
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 harnessAccountListParamsSchema = external_exports.object({}).strict();
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
- codexHome: nonBlankTextSchema3.max(16384),
15469
- active: external_exports.boolean(),
15470
- isDefault: external_exports.boolean()
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 codexAccountMutationResultSchema = external_exports.object({ account: codexAccountSchema }).strict();
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({ accountId: accountIdSchema.optional(), loginId: nonBlankTextSchema3.max(1024) }).strict();
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 codexAccountUsageParamsSchema = external_exports.object({ accountId: accountIdSchema }).strict();
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,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";
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: "Codex default",
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: "Use as the default for new Codex tasks only",
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
- accountActive: "Default",
17475
- accountUse: "Set as default",
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: "Codex \u9ED8\u8BA4",
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: "\u4EC5\u8BBE\u4E3A\u65B0 Codex \u4EFB\u52A1\u7684\u9ED8\u8BA4\u8D26\u53F7",
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
- accountActive: "\u9ED8\u8BA4\u8D26\u53F7",
17685
- accountUse: "\u8BBE\u4E3A\u9ED8\u8BA4",
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 = {}, codexAccountCount = 0) {
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 && codexAccountCount < 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, onSelectCodexAccount, onOpen, groupPreference = getSharedAgentGroupPreferenceStore()) {
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 = {}, codexAccounts = [], ownershipError = false) {
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
- const activeAccount = codexAccounts.find(({ active }) => active);
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, onSelectCodexAccount, onOpenProviderPicker, onSelectModel, onSelectThinking, onSelectPermissionMode, onSelectCommand) {
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", codexAccounts = [], ownershipError = false) {
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
- codexAccounts,
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 ? codexAccounts.find((account) => account.active) : void 0;
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 resolveCodexAccountSelection(accounts, overrideAccountId) {
21196
- const activeAccountId = accounts.find((account) => account.active)?.accountId ?? null;
21197
- const validOverrideAccountId = accounts.some((account) => account.accountId === overrideAccountId) ? overrideAccountId : null;
21198
- return {
21199
- activeAccountId,
21200
- overrideAccountId: validOverrideAccountId,
21201
- selectedAccountId: validOverrideAccountId ?? activeAccountId
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
- overrideAccountId = null;
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
- get selection() {
21214
- return resolveCodexAccountSelection(this.accounts, this.overrideAccountId);
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.accounts = result.accounts;
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 CODEX_ACCOUNT_ACTIVATE_METHOD = "codexhost/account/activate";
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 listHarnessAccounts() {
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("codexhost/harness/accounts/list", {})
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 activateCodexAccount(input) {
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
- CODEX_ACCOUNT_ACTIVATE_METHOD,
22352
- codexAccountActivateParamsSchema.parse(input)
22311
+ CODEX_ACCOUNT_LOGOUT_METHOD,
22312
+ codexAccountLogoutParamsSchema.parse(input)
22353
22313
  );
22354
- return codexAccountMutationResultSchema.parse(result);
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
- let fiber = firstFiber2;
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 hookState = hook.memoizedState;
22699
- if (isRecord7(hookState)) {
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 isCurrentDraftWrapper(value) {
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
- if (isCurrentDraftWrapper(value) && typeof value[2] === "string" && value[2].startsWith("client-new-thread:")) {
22775
- draftIds.add(value[2]);
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
- listHarnessAccounts: () => {
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
- activateCodexAccount: (input) => currentModelClient().activateCodexAccount(input),
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 splitUsageWindows(credits, messages) {
24461
- const columns = {};
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
- if (!credits.label && credits.periodType === "five_hour") columns.five_hour = primary;
24469
- else if (!credits.label && ["seven_day", "weekly"].includes(credits.periodType))
24470
- columns.seven_day = { ...primary, label: messages.accountCreditsPeriodSevenDay };
24471
- else additional.push(primary);
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 period = product.product === "7-day window" ? "seven_day" : product.product === "5-hour window" ? "five_hour" : null;
24479
- if (period && !columns[period])
24480
- columns[period] = { ...window2, label: creditsPeriodLabel2(period, messages) };
24481
- else additional.push(window2);
24482
- }
24483
- return { columns, additional };
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 { columns, additional } = splitUsageWindows(state.credits, messages);
24541
- const cells = ["five_hour", "seven_day"].map((period) => {
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
- if (!additional.length) return { cells, additional: null };
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: account.active,
24838
+ active: input.current,
24753
24839
  mark
24754
24840
  })
24755
24841
  );
24756
- const usage = renderAccountUsage(document2, input.usage, messages, input.display, input.onRetry);
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
- if (!account.active) {
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
- if (!account.email) {
24776
- const signIn = document2.createElement("button");
24777
- signIn.type = "button";
24778
- signIn.className = "settings-account-action";
24779
- signIn.textContent = messages.accountSignIn;
24780
- signIn.dataset.accountFocus = `${account.accountId}:login`;
24781
- signIn.disabled = input.actionsDisabled;
24782
- signIn.addEventListener("click", input.onSignIn);
24783
- actions.append(signIn);
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 (!account.isDefault) {
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 renderHarnessAccountRow(document2, account, messages, display) {
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?.listHarnessAccounts) return;
25078
+ if (!client) return;
24907
25079
  refreshing = true;
25080
+ accounts = [];
24908
25081
  onChange();
24909
25082
  try {
24910
- const result = await client.listHarnessAccounts();
24911
- if (!signal.aborted)
24912
- accounts = [...result.accounts].sort((a, b) => a.harnessId.localeCompare(b.harnessId));
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
- const description = document2.createElement("p");
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 signedIn = result.accounts.some(
25032
- (account) => account.accountId === login?.accountId && account.email
25033
- );
25034
- if (signedIn) {
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
- loginMessage = messages.accountLoginSucceeded;
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.textContent = loginMessage ?? "";
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 || !accounts.some((account) => account.email)) && !getClient()?.listHarnessAccounts || harnessAccounts?.refreshing === true || [...usageByAccountId.values()].some((usage) => usage.status === "loading") || accountBusy();
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: () => mutate(() => client().activateCodexAccount({ accountId: account.accountId })),
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(renderHarnessAccountRow(document2, account, messages, usageDisplay));
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 signedIn = nextAccounts.filter((account) => account.email);
25164
- const keep = new Set(signedIn.map((account) => account.accountId));
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 = signedIn.filter((account) => !usageByAccountId.has(account.accountId));
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 ? { status: "ready", credits: result.accountCredits } : { status: "empty" }
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 = (nextAccounts) => {
25199
- accounts = nextAccounts;
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(nextAccounts);
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.accounts);
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.accounts);
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 mutate = (operation) => {
25233
- if (accountBusy()) return;
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(() => operation(), {
25237
- success(result) {
25525
+ void context.runLatest(() => client().switchCodexAccount({ accountId }), {
25526
+ success() {
25238
25527
  accountActivating = false;
25239
25528
  loginMessage = null;
25240
- setAccounts(
25241
- accounts.map((account) => ({
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(() => client().startCodexAccountLogin({ accountId }), {
25260
- success(result) {
25261
- loginStartingAccountId = null;
25262
- login = result;
25263
- loginMessage = null;
25264
- render();
25265
- scheduleLoginRefresh();
25266
- },
25267
- failure(error51) {
25268
- loginStartingAccountId = null;
25269
- loginMessage = errorMessage(error51, messages.accountLoginFailed);
25270
- render();
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().createCodexAccount({}), {
25569
+ void context.runLatest(() => client().startCodexAccountLogin({}), {
25280
25570
  success(result) {
25281
25571
  accountCreating = false;
25282
25572
  loginMessage = null;
25283
25573
  search.value = "";
25284
- setAccounts([
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
- loginMessage = errorMessage(error51, messages.accountCreateFailed);
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.isDefault || accountBusy()) return;
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
- setAccounts(
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 cancelLogin = (accountId, loginId) => {
25358
- void context.runLatest(() => client().cancelCodexAccountLogin({ accountId, loginId }), {
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
- unsubscribe = getClient()?.subscribeCodexAccountLogin?.((result) => {
25375
- if (result.loginId !== login?.loginId) return;
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
- if (result.success) load();
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: () => modelControl,
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 = new RendererCodexAccountState(client);
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 accounts = composerCodexAccounts(composer);
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 selectedCodexAccountId = state.phase === "locked" || controller.isSubmissionPending(mounted.composer) && state.codexAccountId ? state.codexAccountId : accounts?.selection.selectedAccountId;
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
- (accounts?.accounts ?? []).map((account) => ({
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?.selection.selectedAccountId;
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.selection.selectedAccountId !== accountId || result.accountId !== accountId)
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();