@codexhost/cli-win32-arm64 0.8.0 → 0.9.1-test.2

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.
@@ -19,7 +19,9 @@
19
19
  "kiro-cli",
20
20
  "codebuddy",
21
21
  "cursor-cli",
22
- "hermes"
22
+ "hermes",
23
+ "qoder",
24
+ "qoder-cn"
23
25
  ];
24
26
  var DEFAULT_RENDERER_AGENTS = KNOWN_RENDERER_AGENTS;
25
27
  function defaultIdFactory(sequence) {
@@ -148,6 +150,10 @@
148
150
  else if (agent === "cursor-cli") delete state.cursorCliModel;
149
151
  if (agent === "hermes" && model) state.hermesModel = model;
150
152
  else if (agent === "hermes") delete state.hermesModel;
153
+ if (agent === "qoder" && model) state.qoderModel = model;
154
+ else if (agent === "qoder") delete state.qoderModel;
155
+ if (agent === "qoder-cn" && model) state.qoderCnModel = model;
156
+ else if (agent === "qoder-cn") delete state.qoderCnModel;
151
157
  if (agent === "pi" && thinkingOptionId) state.piThinkingOptionId = thinkingOptionId;
152
158
  else if (agent === "pi") delete state.piThinkingOptionId;
153
159
  if (agent === "claude-code" && thinkingOptionId) {
@@ -169,6 +175,12 @@
169
175
  if (agent === "codebuddy" && thinkingOptionId) {
170
176
  state.codeBuddyThinkingOptionId = thinkingOptionId;
171
177
  } else if (agent === "codebuddy") delete state.codeBuddyThinkingOptionId;
178
+ if (agent === "qoder" && thinkingOptionId) {
179
+ state.qoderThinkingOptionId = thinkingOptionId;
180
+ } else if (agent === "qoder") delete state.qoderThinkingOptionId;
181
+ if (agent === "qoder-cn" && thinkingOptionId) {
182
+ state.qoderCnThinkingOptionId = thinkingOptionId;
183
+ } else if (agent === "qoder-cn") delete state.qoderCnThinkingOptionId;
172
184
  if (agent !== "codex") {
173
185
  const permissionModeByAgent = {};
174
186
  for (const candidate of [
@@ -182,7 +194,9 @@
182
194
  "kiro-cli",
183
195
  "codebuddy",
184
196
  "cursor-cli",
185
- "hermes"
197
+ "hermes",
198
+ "qoder",
199
+ "qoder-cn"
186
200
  ]) {
187
201
  const current = state.permissionModeByAgent?.[candidate];
188
202
  if (candidate !== agent && current) permissionModeByAgent[candidate] = current;
@@ -209,6 +223,8 @@
209
223
  if (agent === "codebuddy") return state.codeBuddyModel;
210
224
  if (agent === "cursor-cli") return state.cursorCliModel;
211
225
  if (agent === "hermes") return state.hermesModel;
226
+ if (agent === "qoder") return state.qoderModel;
227
+ if (agent === "qoder-cn") return state.qoderCnModel;
212
228
  return void 0;
213
229
  }
214
230
  thinkingOptionForAgent(composer, agent) {
@@ -221,6 +237,8 @@
221
237
  if (agent === "antigravity") return state.antigravityThinkingOptionId;
222
238
  if (agent === "kiro-cli") return state.kiroCliThinkingOptionId;
223
239
  if (agent === "codebuddy") return state.codeBuddyThinkingOptionId;
240
+ if (agent === "qoder") return state.qoderThinkingOptionId;
241
+ if (agent === "qoder-cn") return state.qoderCnThinkingOptionId;
224
242
  return void 0;
225
243
  }
226
244
  permissionModeForAgent(composer, agent) {
@@ -247,6 +265,8 @@
247
265
  else if (agent === "codebuddy") state.codeBuddyModel = model;
248
266
  else if (agent === "cursor-cli") state.cursorCliModel = model;
249
267
  else if (agent === "hermes") state.hermesModel = model;
268
+ else if (agent === "qoder") state.qoderModel = model;
269
+ else if (agent === "qoder-cn") state.qoderCnModel = model;
250
270
  else state.antigravityModel = model;
251
271
  return state;
252
272
  }
@@ -292,6 +312,14 @@
292
312
  state.codeBuddyThinkingOptionId = thinkingOptionId;
293
313
  } else if (agent === "codebuddy") {
294
314
  delete state.codeBuddyThinkingOptionId;
315
+ } else if (agent === "qoder" && thinkingOptionId) {
316
+ state.qoderThinkingOptionId = thinkingOptionId;
317
+ } else if (agent === "qoder") {
318
+ delete state.qoderThinkingOptionId;
319
+ } else if (agent === "qoder-cn" && thinkingOptionId) {
320
+ state.qoderCnThinkingOptionId = thinkingOptionId;
321
+ } else if (agent === "qoder-cn") {
322
+ delete state.qoderCnThinkingOptionId;
295
323
  }
296
324
  return state;
297
325
  }
@@ -14897,6 +14925,48 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14897
14925
  // ../shared-contracts/dist/version.js
14898
14926
  var WORKSPACE_CONTRACT_VERSION = 1;
14899
14927
 
14928
+ // ../shared-contracts/dist/idle-release.js
14929
+ var IDLE_RELEASE_SETTINGS_METHOD = "codexhost/settings/idle-release/set";
14930
+ var IDLE_RELEASE_TIMEOUT_MINUTES_MIN = 5;
14931
+ var IDLE_RELEASE_TIMEOUT_MINUTES_MAX = 1440;
14932
+ var idleReleaseSettingsSchema = external_exports.strictObject({
14933
+ enabled: external_exports.boolean(),
14934
+ timeoutMinutes: external_exports.number().int().min(IDLE_RELEASE_TIMEOUT_MINUTES_MIN).max(IDLE_RELEASE_TIMEOUT_MINUTES_MAX)
14935
+ });
14936
+ var DEFAULT_IDLE_RELEASE_SETTINGS = Object.freeze({
14937
+ enabled: false,
14938
+ timeoutMinutes: 30
14939
+ });
14940
+
14941
+ // ../shared-contracts/dist/loaded-sessions.js
14942
+ var LOADED_SESSIONS_METHOD = "codexhost/sessions/loaded/list";
14943
+ var loadedSessionStateSchema = external_exports.enum([
14944
+ "idle",
14945
+ "running",
14946
+ "busy",
14947
+ "closing",
14948
+ "failed",
14949
+ "blocked"
14950
+ ]);
14951
+ var loadedSessionReasonSchema = external_exports.enum([
14952
+ "none",
14953
+ "disabled",
14954
+ "timeout",
14955
+ "operation",
14956
+ "background",
14957
+ "identity",
14958
+ "persistence",
14959
+ "closeFailed"
14960
+ ]);
14961
+ var loadedSessionsSchema = external_exports.array(external_exports.strictObject({
14962
+ threadId: external_exports.string(),
14963
+ title: external_exports.string(),
14964
+ harnessId: external_exports.string(),
14965
+ state: loadedSessionStateSchema,
14966
+ reason: loadedSessionReasonSchema,
14967
+ inactiveMs: external_exports.number().nonnegative()
14968
+ }));
14969
+
14900
14970
  // ../shared-contracts/dist/ids.js
14901
14971
  var opaqueIdSchema = external_exports.string().refine((value) => value.trim().length > 0, {
14902
14972
  message: "Identifier must not be empty or whitespace"
@@ -15475,77 +15545,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15475
15545
  email: external_exports.string().email().max(320).optional(),
15476
15546
  planType: codexAccountPlanTypeSchema.optional()
15477
15547
  }).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();
15548
+ var codexAccountPhaseSchema = external_exports.enum(["ready", "unavailable"]);
15499
15549
  var codexAccountListResultSchema = external_exports.object({
15500
15550
  version: external_exports.literal(2),
15501
15551
  currentAccountId: accountIdSchema.nullable(),
15502
15552
  phase: codexAccountPhaseSchema,
15503
15553
  revision: external_exports.number().int().nonnegative(),
15504
15554
  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)
15511
- }).strict();
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
15555
+ accounts: external_exports.array(codexAccountSchema).max(1)
15521
15556
  }).strict();
15522
15557
  var codexAccountChangedSchema = codexAccountListResultSchema;
15523
- var codexAccountDeleteParamsSchema = external_exports.object({ accountId: accountIdSchema }).strict();
15524
- var codexAccountDeleteResultSchema = external_exports.object({ deletedAccountId: accountIdSchema }).strict();
15525
- var codexAccountLoginStartParamsSchema = external_exports.object({ accountId: accountIdSchema.optional() }).strict();
15526
- var codexAccountLoginStartResultSchema = external_exports.object({
15527
- accountId: accountIdSchema,
15528
- loginId: nonBlankTextSchema3.max(1024),
15529
- verificationUrl: external_exports.string().url().max(16384),
15530
- userCode: nonBlankTextSchema3.max(1024)
15531
- }).strict();
15532
- var codexAccountLoginCancelParamsSchema = external_exports.object({ loginId: nonBlankTextSchema3.max(1024) }).strict();
15533
- var codexAccountLoginCancelResultSchema = external_exports.object({ cancelled: external_exports.boolean() }).strict();
15534
- var codexAccountLoginCompletedSchema = external_exports.object({
15535
- accountId: accountIdSchema,
15536
- loginId: nonBlankTextSchema3.max(1024),
15537
- success: external_exports.boolean(),
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
15546
- }).strict();
15547
- var codexAccountRecoverParamsSchema = external_exports.object({}).strict();
15548
- var codexAccountRecoverResultSchema = codexAccountListResultSchema;
15549
15558
  var codexAccountUsageParamsSchema = external_exports.object({ accountId: accountIdSchema, refresh: external_exports.boolean().optional() }).strict();
15550
15559
  var codexAccountUsageResultSchema = external_exports.object({
15551
15560
  accountId: accountIdSchema,
@@ -15554,21 +15563,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15554
15563
  freshness: external_exports.enum(["live", "cached"]),
15555
15564
  observedAt: external_exports.string().datetime().nullable()
15556
15565
  }).strict();
15557
- var codexAccountResetCreditConsumeParamsSchema = external_exports.object({
15558
- accountId: accountIdSchema,
15559
- idempotencyKey: external_exports.string().uuid().optional()
15560
- }).strict();
15561
- var codexAccountResetCreditConsumeOutcomeSchema = external_exports.enum([
15562
- "reset",
15563
- "nothingToReset",
15564
- "noCredit",
15565
- "alreadyRedeemed"
15566
- ]);
15567
- var codexAccountResetCreditConsumeResultSchema = external_exports.object({
15568
- accountId: accountIdSchema,
15569
- outcome: codexAccountResetCreditConsumeOutcomeSchema,
15570
- accountCredits: accountCreditsSnapshotSchema.optional()
15571
- }).strict();
15572
15566
 
15573
15567
  // ../shared-contracts/dist/reasoning-transcript.js
15574
15568
  var REASONING_TRANSCRIPT_COMMAND = "thinking";
@@ -15942,6 +15936,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15942
15936
  // src/assets/opencode-agent.png
15943
15937
  var opencode_agent_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALQAAAC0CAYAAAA9zQYyAAAFuklEQVR4AezUzY0bRxRF4YZWnp0w3k4a1sZKYaAkbMUiW9EYSmEUl0WBAEFS/Guyurree9+ATbCbxap3zz3Su9/fv//fhUEWB95N/hBIRIDQicoUZZoIzYJUBAidqk5hCF3GgRpBCV2j5zIpCV2m6hpBCV2j5zIpCV2m6hpBCV2j5zIpCT1NU5m2CwQldIGSK0UkdKW2C2QldIGSK0UkdKW2C2QldIGSK0W8InQlFLJmIEDoDC3KsCNA6B0KHzIQIHSGFmXYESD0DoUPGQgQOkOLLTIk2YPQSYoUY0uA0FsO3pMQIHSSIsXYEiD0loP3JAQInaRIMbYECL3lcOndd4EIEDpQWUa9ToDQ1xlZEYgAoQOVZdTrBAh9nZEVgQiEFPrPjx8n1/IMAnm8G/UxoXfb9P3w37dvk2t5Bn1bbXNaSKHbRLdLRgKEzthq4UyELlx+xuiEzthq4UyELlz+nOhR1hI6SlPmvIkAoW/CZFEUAoSO0pQ5byJA6JswWRSFAKGjNGXOmwgQ+iZMlxb5biQChB6pDbM8TIDQDyO0wUgECD1SG2Z5mAChH0Zog5EIEHqkNszyMIFFhX54OhsgMJMAoWcCs3xsAoQeux/TzSRA6JnALB+bAKHH7sd0MwkQeg/Yv1++TJ9eX0NdP2fei7DWx2HOJfRRFd/f3qZI19H45W8JXV6BXAAInavP8mkIXV6BXAAInavP8mkIvbQC9u9KgNBdcTtsaQKEXpqw/bsSIHRX3A5bmgChlyZs/64ECN0Vt8OWJrCm0Etns39BAoQuWHrmyITO3G7BbIQuWHrmyITO3G7BbIQuWHr/yP1OJHQ/1k7qQIDQHSA7oh8BQvdj7aQOBAjdAbIj+hEg9B7rp6en6fn5OdT1c+bJ344AoXcopum3jdB/fPgw9bwePYvQewVuPhJ6A8ErDwFC5+lSkg0BQm8geOUhQOg8XUqyIUDoDQSvPAQGFjoPZEn6ESB0P9ZO6kCA0B0gO6IfAUL3Y+2kDgQI3QGyI/oRIHQ/1k46R6Dhc0I3hGmr9QkQev0OTNCQAKEbwrTV+gQIvX4HJmhIgNANYdpqfQKEXr+DSxP4biYBQs8EZvnYBAg9dj+mm0mA0DOBWT42AUKP3Y/pZhIg9Exglo9NIK7QY3M13UoECL0SeMcuQ4DQy3C160oECL0SeMcuQ4DQy3C160oECL0SeMfeTmDOSkLPoWXt8AQIPXxFBpxDgNBzaFk7PAFCD1+RAecQIPQcWtYOT4DQw1d0aUDfHRMg9DER96EJEDp0fYY/JkDoYyLuQxMgdOj6DH9MgNDHRNyHJpBW6NCtGP5uAoS+G50fjkiA0CO2Yqa7CRD6bnR+OCIBQh+18vLyMkW6jsYvf0voPQX+/vx5+ufr11DXX5uZ9yJU/HiQmdAHONxEJ0Do6A2a/4AAoQ9wuIlOgNDRGzT/AQFCH+BwE50AoaM3eGn+gt8RumDpmSMTOnO7BbMRumDpmSMTOnO7BbMRumDpmSNXFTpzp6WzEbp0/fnCEzpfp6UTEbp0/fnCEzpfp6UTEbp0/fnC/yp0vowSFSJA6EJlV4hK6AotF8pI6EJlV4gaUuhPr6+Ta3kGEf8BhBT6+9vb5HqcwTWGhI5IwMypCIT8HzpVA8I0JUDopjhttjYBQq/dgPObEiB0U5w2W5sAoU824GFUAoSO2py5TxIg9EksHkYlQOiozZn7JAFCn8TiYVQChI7anLlPEpgt9MldPERgEAKEHqQIY7QhQOg2HO0yCAFCD1KEMdoQIHQbjnYZhAChByliwDFCjkTokLUZ+hwBQp8j43lIAoQOWZuhzxEg9DkynockQOiQtRn6HAFCnyNz6bnvhiVA6GGrMdg9BAh9DzW/GZYAoYetxmD3ECD0PdT8ZlgChB62GoPdQ6C10PfM4DcINCNA6GYobTQCAUKP0IIZmhEgdDOUNhqBwA8AAAD//xJjf0UAAAAGSURBVAMA8iYCzXEuU58AAAAASUVORK5CYII=";
15944
15938
 
15939
+ // src/assets/qoder-agent.svg
15940
+ var qoder_agent_default = 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="206" height="206" fill="none" viewBox="0 0 206 206"><rect width="206" height="206" fill="%23f3f3f3" rx="52"/><path fill="%230f0d0c" fill-rule="evenodd" d="M104.003 35.836q.178.08.305.145.4.2.629.321l49.944 26.33.019.01q.139.073.273.155 8.37 4.521 12.99 13.05 4.587 8.466 4.587 19.301v22.489q0 .238-.022.474v40.14q0 7.99-6.72 12.312-6.719 4.323-13.987 1.01l-8.542-3.891-.03.017-.17.097-.12.071q-.849.502-1.319.758-.077.043-.308.165l-.106.056-.252.133q-.622.337-1.213.631l-.619.301-.15.071a79 79 0 0 1-1.167.542l-.773.336q-.387.17-1.115.46l-.135.054-.11.046-.167.068a13 13 0 0 1-.588.228q-.398.146-1.256.444l-.002.001-.164.058q-.249.091-.55.188-.89.294-2.014.605l-3.505.961q-.975.27-1.813.459l-.396.083-.398.081q-.564.12-.9.186a11 11 0 0 1-.52.092l-.509.082-.066.011q-.472.08-.74.118-.189.029-.577.074l-.396.05-.657.076q-.221.025-.494.045l-.114.011-.051.004a42 42 0 0 1-1.407.098l.037-.004q-.223.02-.447.02h-.061q-.6.028-1.016.028h-.666l-.111-.001-.222-.003a24 24 0 0 1-1.27-.049l-.028-.002-.17-.006-.381-.019q-.092-.005-.185-.013l-.7-.062q-.66-.063-1.264-.142l-.199-.024q-.065-.007-.129-.017a50 50 0 0 1-1.393-.228l-.502-.094-.03-.006a12 12 0 0 1-.601-.123l-.046-.011-.066-.015-.121-.028a31 31 0 0 1-1.381-.343l-.027-.007a10 10 0 0 1-.428-.113h-.001a31 31 0 0 1-1.737-.547 5 5 0 0 1-.459-.168l-.12-.046a39 39 0 0 1-1.209-.472 11 11 0 0 1-.333-.144l-.087-.038-.171-.074a29 29 0 0 1-1.098-.502l-.08-.038-.015-.007a6 6 0 0 1-.251-.12q-.104-.052-.209-.107l-.062-.032a5 5 0 0 1-.357-.17l-.003-.001-49.452-26.07a5 5 0 0 1-.972-.517 31 31 0 0 1-6.12-4.384l-.003-.003-.011-.011-.045-.04a32 32 0 0 1-2.374-2.438l-.022-.026-.005-.006a36 36 0 0 1-1.448-1.788q-7.307-9.666-7.307-23.449V90.495q0-.996.043-2.303a20 20 0 0 1 .06-.904q.05-.84.119-1.563a19 19 0 0 1 .11-.975l.035-.301q.083-.72.14-1.117a57 57 0 0 1 .167-1.031l.038-.234q.115-.71.192-1.108v-.005l-.003.017q.023-.15.044-.258a49 49 0 0 1 .389-1.818q.18-.803.45-1.817.051-.2.132-.493l.023-.08a75 75 0 0 1 .604-2.032q.047-.15.12-.356l.012-.032q.359-1.105.677-1.972a35 35 0 0 1 .313-.821l.08-.21q.333-.864.526-1.323l-.004.007q.056-.147.107-.266a16 16 0 0 1 .31-.713q.327-.75.5-1.132a55 55 0 0 1 .668-1.404q.244-.502.382-.772l.032-.065q.075-.157.136-.278a15 15 0 0 1 .36-.676l.137-.257a58 58 0 0 1 .995-1.79 30 30 0 0 1 .642-1.095l-.004.005.007-.011-.007.011q.078-.137.131-.227.155-.257.429-.682.27-.44.588-.93.231-.356.671-1.004l.314-.456.297-.43.063-.09v-.002q.12-.18.211-.306.09-.128.296-.403l.13-.174q.471-.645.726-.979l.357-.456.331-.424a36 36 0 0 1 .837-1.05 17 17 0 0 1 .63-.75l.327-.378q.358-.417.556-.64l.696-.767a74 74 0 0 1 1.015-1.086l.011-.015a11 11 0 0 1 .54-.555l.104-.102a78 78 0 0 1 1.898-1.84 50 50 0 0 1 1.59-1.424l-.011.008q.148-.137.256-.232a5 5 0 0 1 .275-.223l.027-.02.017-.014a77 77 0 0 1 1.496-1.217q.303-.24.475-.37a83 83 0 0 1 1.224-.92q.126-.088.424-.306.585-.423 1.403-.976l-.002.001.045-.032a13 13 0 0 1 .466-.315q.992-.647 1.703-1.075.141-.088.456-.268l.103-.061a47 47 0 0 1 1.32-.758l.632-.337.033-.017q.623-.336 1.213-.631.273-.136.774-.374.509-.243 1.163-.539l.415-.182.358-.155q.448-.193 1.248-.514l.225-.088q.365-.143.565-.218a88 88 0 0 1 1.515-.536q.339-.12.556-.19.924-.302 1.993-.6l3.509-.96a37 37 0 0 1 1.807-.46q.248-.057.627-.133.482-.11 1.1-.228a17 17 0 0 1 .743-.126l.298-.05a33 33 0 0 1 .862-.135l.33-.04.331-.04.248-.032q.424-.054.664-.08.165-.016.33-.023l.324-.024q.695-.06 1.128-.081.21-.013.655-.026h.016l.336-.01a23 23 0 0 1 1.147-.017l.185.001.314.005a26 26 0 0 1 1.376.048l.23.013.344.018q.18.01.524.046l.306.027q.609.058 1.245.14l.014.002h.001q.165.018.29.036.642.086 1.428.228.098.018.194.04l.003-.001.303.059q.336.06.554.11.115.024.294.073l.072.016q.328.073.682.162.293.073.6.157l-.004-.002.033.008q.165.04.304.078l.045.013q.09.024.168.049l.012.003a31 31 0 0 1 1.731.553q.2.067.444.166.697.252 1.267.491l.148.064.459.2q.515.23 1.045.485zm-2.971-1.263h-.002q.004 0 .008.002zm3.871 127.988.763.402q.077.042.269.139l.09.046q.1.045.12.057l.136.064q.41.198.771.353l.011.005q.127.053.317.138l.072.032q.341.141.956.372l.05.02.183.068.014.006q.599.21 1.264.398l-.084-.018q.104.023.206.05l.208.054q.52.14 1.057.261l.073.017.072.016.113.026.108.019.031.006.436.082q.536.095 1.052.173l.2.025q.44.057.878.098l.611.055.186.01.376.016.028.002q.261.017.429.023.098.004.368.008l.239.003h.615q.208 0 .643-.021a4 4 0 0 1 .251-.007h.022l.137-.007-.018.003.178-.013q.25-.012.835-.061l.156-.014.154-.012.07-.006.539-.061.504-.064q.204-.024.312-.04a20 20 0 0 0 .618-.099l.402-.066.199-.032-.009.004q.057-.013.116-.024.252-.048.838-.172l.33-.067.255-.053q.608-.138 1.377-.35l3.477-.953a37 37 0 0 0 1.655-.499l.104-.034.127-.047.239-.084h.002q.78-.27 1.191-.421l.146-.059.135-.055.22-.091.141-.056q.579-.231.832-.342l.639-.278q.57-.257.997-.461l.089-.042.509-.247q.458-.228 1.02-.532l.158-.083.218-.116q.096-.049.178-.095.317-.174 1.018-.587l.207-.122.128-.074h.001q.124-.073.226-.13a39 39 0 0 0 1.26-.793l.358-.245a4.95 4.95 0 0 1 4.843-.416l10.977 5.001q2.352 1.073 4.527-.327t2.176-3.986v-40.637q0-.237.022-.474V95.148q0-17.112-12.596-23.755l-.295-.156-.163-.079-.176-.086a19 19 0 0 0-.767-.354q-.265-.12-.385-.168-.35-.148-.871-.337l-.182-.067-.102-.04q-.56-.194-1.217-.383l-.097-.026-.222-.058a38 38 0 0 0-1.026-.253l-.122-.026a31 31 0 0 0-.681-.144l-.118-.023a25 25 0 0 0-1.016-.163 6 6 0 0 1-.225-.027 29 29 0 0 0-.873-.1h-.006l-.327-.03a37 37 0 0 0-1.369-.078q-.12-.008-.523-.008h-.509a44 44 0 0 0-1.116.038l-.18.007q-.256.013-.859.063l-.046.004-.204.014-.135.01a20 20 0 0 0-.454.053 35 35 0 0 1-.636.075l-.206.025q-.145.022-.496.082l-.612.1q-.197.03-.279.046-.171.032-.602.125l-.237.051a22 22 0 0 1-.524.112q-.735.168-1.382.346l-3.476.953a36 36 0 0 0-1.54.46l-.291.102-.355.122a27 27 0 0 0-1.659.61q-.613.242-.941.383l-.648.284-.42.193V91.28q0 1.152-.056 2.307-.01.223-.037.576l-.001.004-.019.28-.001.026a43 43 0 0 1-.113 1.478 25 25 0 0 1-.076.68l-.052.433-.03.249a32 32 0 0 1-.234 1.677l-.056.354v.002q-.138.833-.221 1.265-.19.999-.399 1.935l-.027.11a45 45 0 0 1-.46 1.83l-.141.512a62 62 0 0 1-.542 1.831l-.151.467a54 54 0 0 1-.663 1.928 19 19 0 0 1-.2.526l-.017.042.004-.01-.112.295-.073.188q-.326.841-.495 1.251a27 27 0 0 1-.354.834l-.063.152q-.269.631-.492 1.106-.124.28-.359.772l-.135.283-.098.204a46 46 0 0 1-.971 1.916l-.314.587-.216.397q-.188.339-.563.993l-.076.132a32 32 0 0 1-.507.856q-.284.475-.6.969l-.084.133a42 42 0 0 1-.965 1.488l-.22.327-.021.032-.58.845-.066.092-.58.805a53 53 0 0 1-1.41 1.856l-.212.268q-.316.401-.48.601-.234.29-.674.806l-.04.046-.005.005q-.386.461-.854.988-.237.266-.69.767a46.143 46.143 0 0 1-1.393 1.477l-.219.223a55 55 0 0 1-1.216 1.193l-.18.174-.202.193-.258.247q-.778.722-1.567 1.402l-.099.086-.08.071-.08.072q-.067.06-.137.117l-.198.165a76 76 0 0 1-1.308 1.071l-.006.005q-.134.11-.339.266l-.147.113-.083.063a58 58 0 0 1-1.375 1.031q-.198.147-.307.225-.66.473-1.278.885l-.32.222-.103.07q-.884.584-1.833 1.157l-.009.005q.348 15.759 11.753 22.249zM85.109 152.14q-1.87-5.93-1.874-12.803v-22.492q0-1.2.056-2.394a20 20 0 0 1 .058-.825l.023-.336q.054-.795.098-1.255.019-.19.059-.524.029-.237.047-.42l.036-.309q.084-.721.145-1.146.06-.399.16-.987l.025-.153q.126-.756.202-1.176a50 50 0 0 1 .435-2.086l.011-.046a61 61 0 0 1 .594-2.337q.275-.996.552-1.867l.01-.028q.022-.074.045-.144.054-.17.132-.387l.006-.016q.387-1.18.662-1.928a36 36 0 0 1 .307-.805 52 52 0 0 1 1.037-2.544q.32-.736.5-1.132.162-.36.48-1.016l.003-.01q.271-.57.547-1.11.136-.273.4-.78l.138-.267a54 54 0 0 1 1.136-2.052l.267-.46.298-.51q.215-.36.604-.977.152-.248.443-.703l.177-.278q.228-.352.645-.965.386-.578.667-.969.323-.46.674-.931.465-.637.71-.958.275-.36.721-.922l.345-.434.39-.49q.232-.281.686-.819l.023-.028.204-.239a51 51 0 0 1 1.37-1.552q.31-.343.926-.994.368-.388.717-.737.525-.533 1.23-1.206.44-.428.662-.63a61 61 0 0 1 1.657-1.483l.013-.012.011-.01-.011.01a8 8 0 0 1 .61-.519q.738-.615 1.302-1.06.203-.159.561-.432.655-.507 1.155-.872l.542-.397q.627-.453 1.35-.938l.049-.034q.216-.15.395-.265a59 59 0 0 1 1.883-1.19q.193-.11.295-.171a50 50 0 0 1 1.797-1.02l.208-.11.148-.076a44 44 0 0 1 1.986-1.005q.645-.307 1.169-.545l.754-.331q.534-.23 1.292-.529.481-.192.76-.297.6-.228 1.397-.494l.247-.086.292-.1a49 49 0 0 1 2.128-.645l3.508-.961q.325-.09.667-.178L100.3 45.05a21 21 0 0 0-.393-.201l-.006-.003.007.004a10 10 0 0 1-.29-.137 28 28 0 0 0-1.186-.536l-.002-.001a16 16 0 0 0-.783-.3 7 7 0 0 1-.282-.107l-.036-.013a24 24 0 0 0-1.27-.405l-.086-.023q-.12-.03-.197-.05a19 19 0 0 0-.981-.242 6 6 0 0 1-.354-.085l-.111-.021-.36-.07h-.003l-.182-.035a23 23 0 0 0-.95-.152 9 9 0 0 1-.291-.035q-.405-.052-.83-.093l-.354-.032-.067-.007h-.004l-.103-.01-.207-.011-.344-.019a18 18 0 0 0-.918-.031l-.311-.005h-.146a8 8 0 0 0-.357 0q-.087 0-.354.01-.25.009-.403.012-.29.009-.396.015-.315.017-.895.066l-.284.021-.23.017-.033.003a39 39 0 0 0-.608.077l-.34.04-.262.032-.46.075a64 64 0 0 1-.811.134q-.489.094-.942.196-.327.066-.456.096-.654.149-1.381.351l-3.516.964q-.838.233-1.604.483-.09.03-.25.086l-.276.097q-.762.265-1.128.399l-.385.15-.207.08a44 44 0 0 0-.952.391l-.33.144-.358.156a58 58 0 0 0-.93.432l-.005.002q-.41.195-.594.287-.456.228-.983.512l-.034.018-.595.317a39 39 0 0 0-1.145.664q-.223.128-.268.156a50 50 0 0 0-1.574.997l-.056.04-.174.12a47 47 0 0 0-2.596 1.874q-.14.106-.374.291-.059.046-.088.07-.623.495-1.143.93-.09.079-.264.216a9 9 0 0 1-.21.188 43 43 0 0 0-1.92 1.752q-.45.432-1.045 1.027a22 22 0 0 1-.308.302l-.011.014a12 12 0 0 1-.269.287q-.51.543-.75.806l-.666.734q-.11.125-.411.474l-.466.54a13 13 0 0 0-.433.522q-.323.395-.572.72l-.357.457-.332.424q-.156.204-.557.754l-.206.277-.162.22-.03.045q-.094.14-.169.246l-.275.4-.297.43q-.362.534-.532.796a41 41 0 0 0-.556.88q-.205.317-.282.444l-.02.037q-.117.205-.217.365-.232.385-.415.714a55 55 0 0 0-.87 1.564l-.133.248a19 19 0 0 1-.221.408l-.068.134-.004.01q-.098.205-.173.349-.07.138-.276.563l-.17.348q-.266.552-.384.811a91 91 0 0 0-.435.988q-.044.103-.131.295a8 8 0 0 0-.142.329l-.002.006.008-.018q-.05.13-.087.219-.147.352-.425 1.075l-.086.222-.068.175q-.13.337-.184.482a46 46 0 0 0-.57 1.663l-.07.209a5 5 0 0 1-.098.3q-.155.493-.44 1.494l-.016.053a9 9 0 0 0-.095.36 38 38 0 0 0-.407 1.643l-.008.036q-.135.582-.274 1.29v.005l.003-.018q-.023.15-.044.257-.054.277-.145.844l-.047.283q-.09.54-.138.847-.032.225-.099.802l-.07.586a12 12 0 0 0-.047.422q-.06.62-.101 1.342l-.026.35q-.019.23-.023.307-.034 1.072-.034 1.906v22.489q0 10.089 4.938 16.98.183.257.372.507.45.599 1.037 1.278a22 22 0 0 0 1.648 1.689l.04.037a21.4 21.4 0 0 0 4.484 3.147l.03.015.051.027zm8.026-23.904q.47-.383.73-.601l.197-.164.014-.012.08-.071.173-.153q.705-.608 1.35-1.206l.146-.142.203-.193.15-.146a48 48 0 0 0 1.62-1.612 59 59 0 0 0 1.356-1.483 37 37 0 0 0 .788-.91l.019-.022a29 29 0 0 0 .899-1.097l.232-.293a40 40 0 0 0 1.143-1.505l.562-.78.022-.031.49-.716.002-.003.188-.28q.254-.377.359-.542.16-.245.432-.677l.088-.141a26 26 0 0 0 .564-.911q.104-.166.347-.589l.082-.143q.33-.574.485-.853l.171-.315.279-.523a41 41 0 0 0 .786-1.549l.104-.217.113-.238a37.223 37.223 0 0 0 .679-1.496l.016-.042.149-.347q.131-.303.181-.426.154-.374.439-1.112l.076-.194.081-.217.07-.178.082-.21q.297-.815.567-1.649l.156-.479q.189-.607.426-1.45l.122-.445q.199-.726.36-1.428l.053-.221q.135-.61.296-1.46.064-.33.177-1.021l.001-.002.046-.294.016-.1q.049-.3.065-.418a30 30 0 0 0 .134-1.055l.05-.421q.037-.296.049-.425.04-.385.089-1.179l.002-.027.024-.358.007-.092.015-.195q.047-.981.047-1.896V79.333l-.311.259-.116.094-.117.094-.003.003.012-.009a8 8 0 0 1-.256.227q-.683.59-1.382 1.24-.145.133-.507.483a50 50 0 0 0-3.576 3.782l-.197.231q-.412.488-.551.655l-.345.435-.341.428a53 53 0 0 0-.596.762q-.19.248-.608.82a43 43 0 0 0-1.103 1.563q-.38.56-.525.783l-.164.258q-.247.388-.385.61-.358.57-.484.778l-.267.46-.264.453a47 47 0 0 0-1.392 2.579q-.235.463-.466.947v.002q-.272.565-.387.817a85 85 0 0 0-.799 1.835q-.228.55-.508 1.289l-.066.171q-.13.338-.19.5-.225.614-.6 1.755l-.048.134-.003.001-.035.112-.05.159a40 40 0 0 0-.547 1.889 51 51 0 0 0-.407 1.643l-.004.014a39 39 0 0 0-.314 1.518q-.059.325-.173 1.015l-.028.171q-.088.512-.13.791-.036.254-.103.831l-.03.251q-.018.192-.059.525l-.035.301q-.028.303-.073.97l-.026.366-.022.287q-.018.23-.022.308-.046.959-.046 1.923z" clip-rule="evenodd"/><path stroke="%230f0d0c" stroke-width="3.5" d="m41.782 61.323.004-.005-.07.114q-.34.561-.572.98a55 55 0 0 0-1.133 2.048l-.075.138a15 15 0 0 0-.42.816l-.032.065q-.139.27-.382.772l-.178.365q-.32.665-.49 1.039a100 100 0 0 0-.57 1.289 16 16 0 0 0-.347.822l.004-.008a50 50 0 0 0-.606 1.534l-.06.156q-.17.435-.253.665a54 54 0 0 0-.677 1.972l-.012.032a10 10 0 0 0-.177.536 75 75 0 0 0-.547 1.851l-.023.08q-.081.293-.131.494a47 47 0 0 0-.492 1.99 49 49 0 0 0-.348 1.645q-.02.108-.044.258l.003-.017v.005q-.077.397-.192 1.108l-.038.234a57 57 0 0 0-.167 1.03 42 42 0 0 0-.175 1.419l-.024.19q-.066.536-.086.785a43 43 0 0 0-.118 1.563l-.016.2q-.03.392-.045.704a72 72 0 0 0-.043 2.303v22.488q0 13.783 7.307 23.449l.277.363a36 36 0 0 0 1.176 1.431l.022.026q1.169 1.332 2.374 2.438l.045.04.011.011.004.003a31 31 0 0 0 6.119 4.384q.458.313.972.517l49.452 26.07.003.001q.177.093.357.17l.062.032q.105.055.209.107.112.057.251.12l.015.007.08.038q.606.29 1.098.502l.171.074.087.038q.19.085.333.144.49.203 1.209.472l.12.046q.225.096.459.168a31 31 0 0 0 1.737.547h.001q.235.067.428.113l.027.007q.74.2 1.381.343l.121.028.066.015.046.011q.239.057.601.123l.03.006.502.094q.708.126 1.393.228.065.01.129.017l.199.024q.604.08 1.264.142l.7.062q.093.008.185.013l.381.019.17.006.028.002q.42.026.609.032a24 24 0 0 0 .994.021h.666q.416 0 1.016-.028h.061q.224 0 .447-.02l-.037.004q.163-.007.295-.017a42 42 0 0 0 1.112-.081l.051-.004.114-.011q.273-.02.494-.045l.657-.076.396-.05q.388-.045.577-.074a35 35 0 0 0 .806-.129l.509-.082.062-.01q.26-.042.458-.082.336-.066.9-.186l.398-.081.396-.083a39 39 0 0 0 1.813-.459l3.505-.961q1.123-.31 2.014-.605.301-.097.55-.188l.164-.058.002-.001q.858-.298 1.256-.444.236-.083.588-.228l.167-.068.11-.046.135-.054q.728-.29 1.115-.46l.773-.336a79 79 0 0 0 1.167-.542l.15-.071.619-.301q.59-.294 1.213-.631l.252-.133.106-.056q.231-.121.308-.165.47-.256 1.319-.758l.12-.071.17-.097.03-.017 8.542 3.891q7.268 3.313 13.987-1.01 6.72-4.322 6.72-12.312v-40.14q.022-.236.022-.474V95.148q0-10.834-4.587-19.302-4.62-8.528-12.99-13.049a5 5 0 0 0-.273-.155l-.019-.01-49.944-26.33a30 30 0 0 0-.629-.322 9 9 0 0 0-.305-.144l-.04-.02a39 39 0 0 0-1.504-.684l-.148-.064q-.57-.24-1.267-.491a8 8 0 0 0-.522-.192 31 31 0 0 0-1.653-.527l-.012-.003-.168-.05-.045-.012-.304-.078-.033-.008.005.002a32 32 0 0 0-1.283-.319l-.072-.016a5 5 0 0 0-.294-.073 14 14 0 0 0-.645-.127l-.212-.042h-.003l-.194-.039q-.786-.142-1.427-.228a9 9 0 0 0-.29-.036h-.002l-.014-.002a37 37 0 0 0-1.245-.14l-.306-.027q-.344-.036-.524-.046l-.344-.018-.23-.013a26 26 0 0 0-1.376-.048l-.314-.005-.185-.001a23.248 23.248 0 0 0-1.147.016q-.2.007-.336.01h-.016q-.445.014-.655.027-.433.023-1.128.081l-.325.024a5 5 0 0 0-.33.024 28 28 0 0 0-.911.111l-.33.04-.33.04-.12.016a33 33 0 0 0-.743.12l-.46.075q-.36.057-.58.1-.62.12-1.102.228-.378.075-.626.133a37 37 0 0 0-1.807.46l-3.509.96q-1.069.299-1.993.6-.217.07-.556.19l-.176.062a88 88 0 0 0-1.339.474q-.2.075-.565.218l-.225.089q-.8.32-1.248.513l-.358.155-.415.182a68 68 0 0 0-1.937.913q-.59.295-1.213.63l-.033.018-.632.337a47 47 0 0 0-1.423.82q-.315.18-.456.267a58 58 0 0 0-1.842 1.167q-.137.09-.327.223l-.044.032.001-.001a55 55 0 0 0-1.949 1.37 83 83 0 0 0-1.686 1.288q-.735.585-1.387 1.13l-.017.014-.027.021-.08.063a5 5 0 0 0-.195.16q-.108.094-.256.232l.01-.008-.002.002a50 50 0 0 0-2.254 2.056 78 78 0 0 0-1.335 1.308q-.128.123-.203.2-.144.142-.337.355l-.01.015-.101.103q-.603.639-.915.983l-.696.767q-.198.223-.556.64l-.438.507a22 22 0 0 0-.601.722q-.435.53-.755.949l-.331.424-.357.456q-.255.334-.727.979l-.129.174a18 18 0 0 0-.507.71l-.063.09-.297.43-.314.457q-.44.648-.67 1.004-.318.49-.589.93-.274.424-.429.682-.054.09-.13.227Zm0 0 .007-.011zm62.786 11.145-.013.012q-.87.75-1.657 1.483-.222.203-.662.63a58 58 0 0 0-4.243 4.49l-.203.238-.024.028q-.454.537-.686.819l-.39.49-.345.434q-.446.56-.72.922-.247.322-.711.958a51 51 0 0 0-1.341 1.9q-.417.613-.645.965l-.177.278q-.291.456-.443.703-.389.618-.604.976l-.298.51-.267.46a57 57 0 0 0-1.674 3.1q-.276.54-.547 1.11l-.004.01q-.315.656-.48 1.016a101 101 0 0 0-.937 2.157 52 52 0 0 0-.647 1.64q-.17.438-.259.684a59 59 0 0 0-.662 1.928l-.006.016a13 13 0 0 0-.178.531l-.009.028a49 49 0 0 0-.67 2.306 61 61 0 0 0-.476 1.898l-.01.046q-.025.099-.044.188a50 50 0 0 0-.392 1.898q-.075.42-.202 1.176l-.025.153q-.1.588-.16.987a41 41 0 0 0-.18 1.455l-.048.42a30 30 0 0 0-.06.524 51 51 0 0 0-.12 1.591l-.015.196q-.031.391-.043.629a50 50 0 0 0-.057 2.394v20.581l.001.095v1.816q.003 6.873 1.874 12.803l-29.357-15.476-.052-.027-.03-.015-.047-.025q-.74-.391-1.444-.837a21.4 21.4 0 0 1-2.992-2.285l-.041-.037-.01-.009a21.6 21.6 0 0 1-2.675-2.958q-.189-.25-.372-.507-4.938-6.891-4.938-16.98V90.495q0-.834.034-1.906.004-.077.023-.308l.026-.349q.042-.722.1-1.342.009-.104.049-.422l.07-.586q.066-.578.098-.801.046-.309.138-.848l.047-.283q.091-.567.145-.844.02-.107.044-.257l-.004.018.001-.006q.14-.706.274-1.289l.008-.036.046-.196a38 38 0 0 1 .392-1.567l.064-.24.015-.053a67 67 0 0 1 .457-1.544q.045-.124.082-.25.037-.105.07-.209.312-.96.57-1.663.054-.146.184-.482l.068-.175.086-.222q.278-.723.425-1.075.037-.09.087-.22l-.008.02.002-.007.06-.145.082-.184q.087-.192.131-.295.294-.675.435-.988a45 45 0 0 1 .554-1.16q.206-.424.276-.562.075-.144.173-.348l.004-.011q.035-.066.067-.134l.083-.152.14-.256.132-.248a46 46 0 0 1 .87-1.564q.183-.33.415-.714.1-.16.216-.365l.021-.037a19 19 0 0 1 .342-.539q.225-.365.496-.785.17-.262.532-.796l.297-.43.275-.4q.075-.106.168-.246l.03-.045.163-.22q.136-.18.206-.277.401-.55.557-.754l.332-.424.357-.456q.25-.327.572-.72a17 17 0 0 0 .244-.302 13 13 0 0 1 .309-.36l.346-.4q.3-.35.41-.475l.666-.733q.24-.264.752-.807a12 12 0 0 0 .268-.287l.011-.014.104-.102.204-.2a66 66 0 0 1 1.63-1.582q.553-.52 1.336-1.197.09-.079.209-.188.174-.137.264-.215.52-.435 1.143-.932l.088-.069q.233-.185.374-.29.305-.237.946-.716.202-.142.505-.365.43-.31 1.145-.793l.174-.121.056-.04q.06-.038.12-.08a50 50 0 0 1 1.454-.917q.046-.03.267-.156l.168-.1q.699-.413.978-.564l.596-.317.033-.018q.527-.285.983-.512.184-.092.594-.287l.005-.002q.427-.204.93-.432l.357-.156.331-.144a44 44 0 0 1 1.544-.621 80 80 0 0 1 1.404-.496q.16-.056.25-.086.765-.25 1.604-.483l3.516-.964q.727-.203 1.381-.35.129-.03.456-.097.453-.102.942-.196.05-.01.235-.038a28 28 0 0 0 .577-.096q.304-.052.46-.075l.262-.032.339-.04a45 45 0 0 0 .608-.078l.033-.002.23-.017.284-.021q.58-.05.895-.066.106-.006.396-.015.153-.003.403-.012a13 13 0 0 1 .711-.01h.146l.31.005a20 20 0 0 1 .919.031 22 22 0 0 0 .55.03l.104.01h.004l.067.007.355.032q.423.04.828.093.126.017.293.035a23 23 0 0 1 1.13.187h.004l.133.028.338.063q.207.056.354.085.387.082.981.243l.197.05.086.022q.596.171 1.27.405l.036.013a7 7 0 0 0 .282.108 22 22 0 0 1 .783.299l.002.001.098.042a33 33 0 0 1 1.377.63l-.006-.003.006.003q.264.132.393.2l28.763 15.164q-.342.088-.667.178l-3.508.961q-1.07.297-2.128.644l-.292.101-.247.086a36 36 0 0 0-2.157.791q-.758.299-1.292.529l-.754.331q-.524.238-1.169.545a44.262 44.262 0 0 0-2.134 1.082l-.208.109q-.06.03-.12.062-.148.08-.28.155-.435.236-1.397.803-.102.06-.295.171-.065.037-.129.077a59 59 0 0 0-2.149 1.378l-.049.034q-.723.485-1.35.938l-.542.397q-.5.365-1.155.872-.359.272-.561.432-.564.445-1.302 1.06-.202.16-.341.279a8 8 0 0 0-.269.24Zm0 0 .011-.01zm-3.536-37.895h-.002q.004 0 .008.002zm3.871 127.988.763.402q.077.042.269.139l.09.046q.1.045.12.057l.136.064q.41.198.771.353l.011.005q.127.053.317.138l.072.032q.341.141.956.372l.05.02.183.068.014.006q.599.21 1.264.398l-.084-.018q.104.023.206.05l.208.054q.52.14 1.057.261l.073.017.072.016.113.026.108.019.031.006.436.082q.536.095 1.052.173l.2.025q.44.057.878.098l.611.055.186.01.376.016.028.002q.261.017.429.023.098.004.368.008l.239.003h.615q.208 0 .643-.021a4 4 0 0 1 .251-.007h.022l.137-.007-.018.003.178-.013q.25-.012.835-.061l.156-.014.154-.012.07-.006.539-.061.504-.064q.204-.024.312-.04a20 20 0 0 0 .618-.099l.402-.066.199-.032-.009.004q.057-.013.116-.024.252-.048.838-.172l.33-.067.255-.053q.608-.138 1.377-.35l3.477-.953a37 37 0 0 0 1.655-.499l.104-.034.127-.047.239-.084h.002q.78-.27 1.191-.421l.146-.059.135-.055.22-.091.141-.056q.579-.231.832-.342l.639-.278q.57-.257.997-.461l.089-.042.509-.247q.458-.228 1.02-.532l.158-.083.218-.116q.096-.049.178-.095.317-.174 1.018-.587l.207-.122.128-.074h.001q.124-.073.226-.13a39 39 0 0 0 1.26-.793l.358-.245a4.95 4.95 0 0 1 4.843-.416l10.977 5.001q2.352 1.073 4.527-.327t2.176-3.986v-40.637q0-.237.022-.474V95.148q0-17.112-12.596-23.755l-.295-.156-.163-.079-.176-.086a19 19 0 0 0-.767-.354q-.265-.12-.385-.168-.35-.148-.871-.337l-.182-.067-.102-.04q-.56-.194-1.217-.383l-.097-.026-.222-.058a38 38 0 0 0-1.026-.253l-.122-.026a31 31 0 0 0-.681-.144l-.118-.023a25 25 0 0 0-1.016-.163 6 6 0 0 1-.225-.027 29 29 0 0 0-.873-.1h-.006l-.327-.03a37 37 0 0 0-1.369-.078q-.12-.008-.523-.008h-.509a44 44 0 0 0-1.116.038l-.18.007q-.256.013-.859.063l-.046.004-.204.014-.135.01a20 20 0 0 0-.454.053 35 35 0 0 1-.636.075l-.206.025q-.145.022-.496.082l-.612.1q-.197.03-.279.046-.171.032-.602.125l-.237.051a22 22 0 0 1-.524.112q-.735.168-1.382.346l-3.476.953a36 36 0 0 0-1.54.46l-.291.102-.355.122a27 27 0 0 0-1.659.61q-.613.242-.941.383l-.648.284-.42.193V91.28q0 1.152-.056 2.307-.01.223-.037.576l-.001.004-.019.28-.001.026a43 43 0 0 1-.113 1.478 25 25 0 0 1-.076.68l-.052.433-.03.249a32 32 0 0 1-.234 1.677l-.056.354v.002q-.138.833-.221 1.265-.19.999-.399 1.935l-.027.11a45 45 0 0 1-.46 1.83l-.141.512a62 62 0 0 1-.542 1.831l-.151.467a54 54 0 0 1-.663 1.928 19 19 0 0 1-.2.526l-.017.042.004-.01-.112.295-.073.188q-.326.841-.495 1.251a27 27 0 0 1-.354.834l-.063.152q-.269.631-.492 1.106-.124.28-.359.772l-.135.283-.098.204a46 46 0 0 1-.971 1.916l-.314.587-.216.397q-.188.339-.563.993l-.076.132a32 32 0 0 1-.507.856q-.284.475-.6.969l-.084.133a42 42 0 0 1-.965 1.488l-.22.327-.021.032-.58.845-.066.092-.58.805a53 53 0 0 1-1.41 1.856l-.212.268q-.316.401-.48.601-.234.29-.674.806l-.04.046-.005.005q-.386.461-.854.988-.237.266-.69.767a46.143 46.143 0 0 1-1.393 1.477l-.219.223a55 55 0 0 1-1.216 1.193l-.18.174-.202.193-.258.247q-.778.722-1.567 1.402l-.099.086-.08.071-.08.072q-.067.06-.137.117l-.198.165a76 76 0 0 1-1.308 1.071l-.006.005q-.134.11-.339.266l-.147.113-.083.063a58 58 0 0 1-1.375 1.031q-.198.147-.307.225-.66.473-1.278.885l-.32.222-.103.07q-.884.584-1.833 1.157l-.009.005q.348 15.759 11.753 22.249zm-11.768-34.325q.47-.383.73-.601l.197-.164.014-.012.08-.071.173-.153q.705-.608 1.35-1.206l.146-.142.203-.193.15-.146a48 48 0 0 0 1.62-1.612 59 59 0 0 0 1.356-1.483 37 37 0 0 0 .788-.91l.019-.022a29 29 0 0 0 .899-1.097l.232-.293a40 40 0 0 0 1.143-1.505l.562-.78.022-.031.49-.716.002-.003.188-.28q.254-.377.359-.542.16-.245.432-.677l.088-.141a26 26 0 0 0 .564-.911q.104-.166.347-.589l.082-.143q.33-.574.485-.853l.171-.315.279-.523a41 41 0 0 0 .786-1.549l.104-.217.113-.238a37.223 37.223 0 0 0 .679-1.496l.016-.042.149-.347q.131-.303.181-.426.154-.374.439-1.112l.076-.194.081-.217.07-.178.082-.21q.297-.815.567-1.649l.156-.479q.189-.607.426-1.45l.122-.445q.199-.726.36-1.428l.053-.221q.135-.61.296-1.46.064-.33.177-1.021l.001-.002.046-.294.016-.1q.049-.3.065-.418a30 30 0 0 0 .134-1.055l.05-.421q.037-.296.049-.425.04-.385.089-1.179l.002-.027.024-.358.007-.092.015-.195q.047-.981.047-1.896V79.333l-.311.259-.116.094-.117.094-.003.003.012-.009a8 8 0 0 1-.256.227q-.683.59-1.382 1.24-.145.133-.507.483a50 50 0 0 0-3.576 3.782l-.197.231q-.412.488-.551.655l-.345.435-.341.428a53 53 0 0 0-.596.762q-.19.248-.608.82a43 43 0 0 0-1.103 1.563q-.38.56-.525.783l-.164.258q-.247.388-.385.61-.358.57-.484.778l-.267.46-.264.453a47 47 0 0 0-1.392 2.579q-.235.463-.466.947v.002q-.272.565-.387.817a85 85 0 0 0-.799 1.835 45 45 0 0 0-.508 1.289l-.066.171q-.13.338-.19.5-.225.614-.6 1.755l-.048.134-.003.001-.035.112-.05.159a40 40 0 0 0-.547 1.889 51 51 0 0 0-.407 1.643l-.004.014a39 39 0 0 0-.314 1.518q-.059.325-.173 1.015l-.028.171q-.088.512-.13.791-.036.254-.103.831l-.03.251q-.018.192-.059.525l-.035.301q-.028.303-.073.97l-.026.366-.022.287q-.018.23-.022.308-.046.959-.046 1.923z"/></svg>';
15941
+
15945
15942
  // src/renderer-agent-icon.ts
15946
15943
  var RENDERER_AGENT_LABELS = {
15947
15944
  codex: "Codex",
@@ -15955,7 +15952,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15955
15952
  "kiro-cli": "Kiro CLI",
15956
15953
  codebuddy: "CodeBuddy",
15957
15954
  "cursor-cli": "Cursor CLI (Experimental)",
15958
- hermes: "Hermes"
15955
+ hermes: "Hermes",
15956
+ qoder: "Qoder",
15957
+ "qoder-cn": "Qoder CN"
15959
15958
  };
15960
15959
  var PI_PATHS = [
15961
15960
  {
@@ -16057,6 +16056,17 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16057
16056
  image.style.flex = "none";
16058
16057
  return image;
16059
16058
  }
16059
+ if (agent === "qoder" || agent === "qoder-cn") {
16060
+ const image = ownerDocument.createElement("img");
16061
+ image.src = qoder_agent_default;
16062
+ image.alt = "";
16063
+ image.draggable = false;
16064
+ image.style.width = `${size}px`;
16065
+ image.style.height = `${size}px`;
16066
+ image.style.objectFit = "contain";
16067
+ image.style.flex = "none";
16068
+ return image;
16069
+ }
16060
16070
  const mark = ownerDocument.createElement("img");
16061
16071
  mark.src = grok_agent_default;
16062
16072
  mark.alt = "";
@@ -16488,7 +16498,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16488
16498
  "kiro-cli": "https://kiro.dev/docs/cli/",
16489
16499
  codebuddy: "https://www.codebuddy.ai/docs/zh/cli/overview",
16490
16500
  "cursor-cli": "https://cursor.com/docs/cli/installation",
16491
- hermes: "https://hermes-agent.nousresearch.com/docs"
16501
+ hermes: "https://hermes-agent.nousresearch.com/docs",
16502
+ qoder: "https://docs.qoder.com/",
16503
+ "qoder-cn": "https://docs.qoder.cn/"
16492
16504
  });
16493
16505
  function connectionStatusLabel(availability, messages, hasError = false) {
16494
16506
  if (hasError && availability !== "notInstalled") return messages.connectionStatusError;
@@ -17266,9 +17278,53 @@ ${error51.stderrTail}`] : []
17266
17278
  sectionsLabel: "Settings sections",
17267
17279
  generalSection: "General",
17268
17280
  otherSection: "Other",
17269
- appearanceDescription: "Adjust how thinking text is displayed in the conversation.",
17281
+ appearanceDescription: "Conversation display and local resource management.",
17282
+ appearanceGroup: "Appearance",
17283
+ loadedSessions: {
17284
+ title: "Loaded sessions",
17285
+ description: "Local external Harnesses only. Refreshes every 10 seconds without waking sessions or resetting activity. Released sessions disappear from this list.",
17286
+ columns: ["Session", "Harness", "State", "Since last activity", "Release constraint"],
17287
+ empty: "No loaded external sessions.",
17288
+ failed: "Could not load session status.",
17289
+ unavailable: "Local Host does not support session status or is unavailable.",
17290
+ loading: "Loading session status\u2026",
17291
+ minutes: "{minutes} min",
17292
+ states: {
17293
+ idle: "Idle",
17294
+ running: "Running",
17295
+ busy: "Busy",
17296
+ closing: "Releasing",
17297
+ failed: "Release failed",
17298
+ blocked: "Blocked"
17299
+ },
17300
+ reasons: {
17301
+ none: "\u2014",
17302
+ disabled: "Automatic release is off",
17303
+ timeout: "Timeout not reached",
17304
+ operation: "Turn or Host operation in progress",
17305
+ background: "Subagent, steering, command or interaction pending",
17306
+ identity: "Session identity unavailable or snapshot-only session",
17307
+ persistence: "Persistence or output error",
17308
+ closeFailed: "Restart Desktop before retrying"
17309
+ }
17310
+ },
17311
+ idleReleaseSection: "Resource management",
17312
+ idleReleaseTitle: "Release idle sessions",
17313
+ idleReleaseDescription: "Close background instances after the idle timeout; they resume on next use.",
17314
+ idleReleaseHelpLabel: "About releasing idle sessions",
17315
+ idleReleaseHelp: Object.freeze([
17316
+ "After an Agent finishes replying, its background process may continue running and using memory. Keeping more sessions open may increase resource usage.",
17317
+ "When enabled, codexhost periodically checks sessions and closes background instances once the idle timeout is reached and no tasks or interactions are pending, reducing resource usage. Chat history is not deleted. Opening the session again or sending a message restarts the process."
17318
+ ]),
17319
+ idleReleaseTimeout: "Idle timeout",
17320
+ idleReleaseTimeoutDescription: "5\u20131440 minutes.",
17321
+ idleReleaseMinutes: "min",
17322
+ idleReleaseInvalid: "Enter a whole number from 5 to 1440.",
17323
+ idleReleasePending: "Syncing\u2026",
17324
+ idleReleaseUnavailable: "Not supported by this Host",
17325
+ idleReleaseFailed: "Sync failed, try again",
17270
17326
  reasoningSoftWrapTitle: "Wrap thinking text",
17271
- reasoningSoftWrapDescription: "Wrap long thinking lines in the transcript. Ordinary shell output is unaffected. Off by default.",
17327
+ reasoningSoftWrapDescription: "Wrap long lines in thinking blocks. Shell output is unaffected.",
17272
17328
  pageUnavailable: "Page unavailable",
17273
17329
  inDevelopment: "In development",
17274
17330
  notAvailable: "Not available",
@@ -17293,7 +17349,6 @@ ${error51.stderrTail}`] : []
17293
17349
  sessionImportUpdatedAt: "Updated",
17294
17350
  sessionImportSessionId: "Session ID",
17295
17351
  sessionImportRunning: "Running",
17296
- sessionImportRunningUnknown: "Activity unknown",
17297
17352
  sessionImportRunningHint: "Close this session in its native client before importing, then refresh.",
17298
17353
  sessionImportAction: "Import and open",
17299
17354
  sessionImportImporting: "Importing...",
@@ -17307,15 +17362,13 @@ ${error51.stderrTail}`] : []
17307
17362
  connectionsDescription: "View runtime status by Host. Select an item to inspect details or complete its setup.",
17308
17363
  accountConnected: "Accounts",
17309
17364
  accountDefaultBadge: "Current",
17310
- accountAdd: "Add Codex account",
17311
17365
  accountColumnAccount: "Account",
17312
17366
  accountColumnActions: "Manage",
17313
17367
  accountSearch: "Search accounts or Agents\u2026",
17314
- accountEmpty: "No accounts yet. Add a Codex account or sign in to an Agent in its native client.",
17368
+ accountEmpty: "No current identities found. Sign in through Codex Desktop or your Harness's native client.",
17315
17369
  accountNoMatches: "No matching accounts.",
17316
17370
  accountNativeManaged: "Native management",
17317
17371
  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.",
17318
- accountMore: "Codex account actions",
17319
17372
  accountDetailsClose: "Close account details",
17320
17373
  accountDefaultHint: "This is the current identity for all Codex Threads.",
17321
17374
  accountCreditsRemaining: "Remaining",
@@ -17324,34 +17377,6 @@ ${error51.stderrTail}`] : []
17324
17377
  accountCreditsFailed: "Could not load limits",
17325
17378
  accountCreditsRetry: "Retry",
17326
17379
  accountCreditsRefresh: "Refresh limits",
17327
- accountDelete: "Delete",
17328
- accountDeleteConfirm: "Delete this Account and its local data? This cannot be undone.",
17329
- accountDeleting: "Deleting Account...",
17330
- accountDeleteFailed: "Could not delete the Account.",
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...",
17346
- accountSignIn: "Sign in",
17347
- accountSigningIn: "Starting device sign-in...",
17348
- accountVerificationDescription: "Open the verification page and enter this one-time code:",
17349
- accountCopyCode: "Copy code",
17350
- accountCopied: "Copied",
17351
- accountLoginCancel: "Cancel sign-in",
17352
- accountLoginSucceeded: "Sign-in completed.",
17353
- accountLoginResultUnconfirmed: "Sign-in finished, but its result was not received. Inspect the saved Account state.",
17354
- accountLoginFailed: "Sign-in failed.",
17355
17380
  accountLoadFailed: "Could not load Codex Accounts.",
17356
17381
  accountCreditsUsed: "Used",
17357
17382
  accountCreditsResetAt: "Quota resets: {time}",
@@ -17365,14 +17390,6 @@ ${error51.stderrTail}`] : []
17365
17390
  accountCreditsPeriodUnknown: "Limit",
17366
17391
  accountCreditsBuild: "Build",
17367
17392
  accountResetCredits: "Reset cards",
17368
- accountResetCreditsUse: "Use reset",
17369
- accountResetCreditsConfirm: "This uses 1 reset card and resets both the 5-hour and 7-day limits. This cannot be undone.",
17370
- accountResetCreditsUsing: "Using reset card...",
17371
- accountResetCreditsFailed: "Could not use the reset card.",
17372
- accountResetCreditsNothingToReset: "Usage does not need a reset right now.",
17373
- accountResetCreditsNoCredit: "No reset cards are available.",
17374
- accountResetCreditsAlreadyRedeemed: "That reset card was already used.",
17375
- accountResetCreditsSucceeded: "Limits were reset.",
17376
17393
  accountResetCreditsDetails: "Reset card details",
17377
17394
  accountResetCreditsCardExpiry: "Card {index} \xB7 expires {time}",
17378
17395
  connectionAdapter: "Renderer adapter",
@@ -17473,7 +17490,7 @@ ${error51.stderrTail}`] : []
17473
17490
  aboutRepository: "Open-source repository",
17474
17491
  pageLabels: Object.freeze({
17475
17492
  connections: "Connections",
17476
- appearance: "Appearance",
17493
+ appearance: "General",
17477
17494
  accounts: "Accounts",
17478
17495
  "session-import": "Session Import",
17479
17496
  updates: "Updates",
@@ -17488,9 +17505,53 @@ ${error51.stderrTail}`] : []
17488
17505
  sectionsLabel: "\u8BBE\u7F6E\u5206\u7C7B",
17489
17506
  generalSection: "\u901A\u7528",
17490
17507
  otherSection: "\u5176\u4ED6",
17491
- appearanceDescription: "\u8C03\u6574\u4F1A\u8BDD\u4E2D\u601D\u8003\u6587\u672C\u7684\u663E\u793A\u65B9\u5F0F\u3002",
17508
+ appearanceDescription: "\u4F1A\u8BDD\u663E\u793A\u4E0E\u672C\u5730\u8D44\u6E90\u7BA1\u7406\u3002",
17509
+ appearanceGroup: "\u5916\u89C2",
17510
+ loadedSessions: {
17511
+ title: "\u5DF2\u52A0\u8F7D\u4F1A\u8BDD",
17512
+ description: "\u4EC5\u663E\u793A\u672C\u5730\u5916\u90E8 Harness\u3002\u6BCF 10 \u79D2\u5237\u65B0\uFF0C\u4E0D\u5524\u9192\u4F1A\u8BDD\u3001\u4E0D\u91CD\u7F6E\u6D3B\u52A8\u65F6\u95F4\u3002\u91CA\u653E\u540E\u7684\u4F1A\u8BDD\u4ECE\u5217\u8868\u79FB\u9664\u3002",
17513
+ columns: ["\u4F1A\u8BDD", "Harness", "\u72B6\u6001", "\u8DDD\u6700\u540E\u6D3B\u52A8", "\u6682\u4E0D\u80FD\u91CA\u653E\u7684\u539F\u56E0"],
17514
+ empty: "\u6682\u65E0\u5DF2\u52A0\u8F7D\u7684\u5916\u90E8\u4F1A\u8BDD\u3002",
17515
+ failed: "\u65E0\u6CD5\u52A0\u8F7D\u4F1A\u8BDD\u72B6\u6001\u3002",
17516
+ unavailable: "\u672C\u5730 Host \u4E0D\u652F\u6301\u4F1A\u8BDD\u72B6\u6001\u67E5\u8BE2\u6216\u5F53\u524D\u4E0D\u53EF\u7528\u3002",
17517
+ loading: "\u6B63\u5728\u52A0\u8F7D\u4F1A\u8BDD\u72B6\u6001\u2026",
17518
+ minutes: "{minutes} \u5206\u949F",
17519
+ states: {
17520
+ idle: "\u7A7A\u95F2",
17521
+ running: "\u6267\u884C\u4E2D",
17522
+ busy: "\u5FD9\u788C",
17523
+ closing: "\u91CA\u653E\u4E2D",
17524
+ failed: "\u91CA\u653E\u5931\u8D25",
17525
+ blocked: "\u4E0D\u53EF\u91CA\u653E"
17526
+ },
17527
+ reasons: {
17528
+ none: "\u2014",
17529
+ disabled: "\u81EA\u52A8\u91CA\u653E\u5DF2\u5173\u95ED",
17530
+ timeout: "\u5C1A\u672A\u8FBE\u5230\u8D85\u65F6",
17531
+ operation: "\u4EFB\u52A1\u6216 Host \u64CD\u4F5C\u5C1A\u672A\u7ED3\u675F",
17532
+ background: "\u5B58\u5728\u5B50\u4EFB\u52A1\u3001\u8F6C\u5411\u3001\u547D\u4EE4\u6216\u5F85\u5904\u7406\u4EA4\u4E92",
17533
+ identity: "\u7F3A\u5C11\u53EF\u6062\u590D\u8EAB\u4EFD\u6216\u4EC5\u6709\u5FEB\u7167",
17534
+ persistence: "\u6301\u4E45\u5316\u6216\u8F93\u51FA\u5F02\u5E38",
17535
+ closeFailed: "\u9700\u91CD\u542F Desktop \u540E\u91CD\u8BD5"
17536
+ }
17537
+ },
17538
+ idleReleaseSection: "\u8D44\u6E90\u7BA1\u7406",
17539
+ idleReleaseTitle: "\u81EA\u52A8\u91CA\u653E\u7A7A\u95F2\u4F1A\u8BDD",
17540
+ idleReleaseDescription: "\u7A7A\u95F2\u8D85\u65F6\u540E\u5173\u95ED\u540E\u53F0\u5B9E\u4F8B\uFF0C\u518D\u6B21\u4F7F\u7528\u65F6\u81EA\u52A8\u6062\u590D\u3002",
17541
+ idleReleaseHelpLabel: "\u81EA\u52A8\u91CA\u653E\u7A7A\u95F2\u4F1A\u8BDD\u8BF4\u660E",
17542
+ idleReleaseHelp: Object.freeze([
17543
+ "Agent \u56DE\u590D\u7ED3\u675F\u540E\uFF0C\u540E\u53F0\u8FDB\u7A0B\u53EF\u80FD\u4ECD\u5728\u8FD0\u884C\u5E76\u5360\u7528\u5185\u5B58\u3002\u6253\u5F00\u7684\u4F1A\u8BDD\u8D8A\u591A\uFF0C\u8D44\u6E90\u5360\u7528\u53EF\u80FD\u8D8A\u5927\u3002",
17544
+ "\u5F00\u542F\u540E\uFF0Ccodexhost \u4F1A\u5B9A\u671F\u68C0\u67E5\uFF0C\u5728\u4F1A\u8BDD\u7A7A\u95F2\u8FBE\u5230\u8BBE\u5B9A\u65F6\u95F4\u3001\u4E14\u6CA1\u6709\u4EFB\u52A1\u6216\u5F85\u5904\u7406\u4EA4\u4E92\u65F6\uFF0C\u81EA\u52A8\u5173\u95ED\u540E\u53F0\u5B9E\u4F8B\uFF0C\u51CF\u5C11\u8D44\u6E90\u5360\u7528\u3002\u804A\u5929\u8BB0\u5F55\u4E0D\u4F1A\u5220\u9664\uFF0C\u518D\u6B21\u6253\u5F00\u6216\u53D1\u9001\u6D88\u606F\u65F6\u4F1A\u91CD\u65B0\u542F\u52A8\u8BE5\u8FDB\u7A0B\u3002"
17545
+ ]),
17546
+ idleReleaseTimeout: "\u7A7A\u95F2\u8D85\u65F6",
17547
+ idleReleaseTimeoutDescription: "5\uFF5E1440 \u5206\u949F\u3002",
17548
+ idleReleaseMinutes: "\u5206\u949F",
17549
+ idleReleaseInvalid: "\u8BF7\u8F93\u5165 5\uFF5E1440 \u4E4B\u95F4\u7684\u6574\u6570\u3002",
17550
+ idleReleasePending: "\u540C\u6B65\u4E2D\u2026",
17551
+ idleReleaseUnavailable: "\u5F53\u524D Host \u4E0D\u652F\u6301",
17552
+ idleReleaseFailed: "\u540C\u6B65\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5",
17492
17553
  reasoningSoftWrapTitle: "\u6362\u884C\u663E\u793A\u601D\u8003\u6587\u672C",
17493
- reasoningSoftWrapDescription: "\u8BA9\u601D\u8003\u5757\u4E2D\u7684\u957F\u884C\u81EA\u52A8\u6362\u884C\u3002\u666E\u901A Shell \u8F93\u51FA\u4E0D\u53D7\u5F71\u54CD\u3002\u9ED8\u8BA4\u5173\u95ED\u3002",
17554
+ reasoningSoftWrapDescription: "\u601D\u8003\u5757\u4E2D\u7684\u957F\u884C\u81EA\u52A8\u6362\u884C\uFF0C\u4E0D\u5F71\u54CD Shell \u8F93\u51FA\u3002",
17494
17555
  pageUnavailable: "\u9875\u9762\u4E0D\u53EF\u7528",
17495
17556
  inDevelopment: "\u5F00\u53D1\u4E2D",
17496
17557
  notAvailable: "\u6682\u4E0D\u53EF\u7528",
@@ -17515,7 +17576,6 @@ ${error51.stderrTail}`] : []
17515
17576
  sessionImportUpdatedAt: "\u66F4\u65B0\u65F6\u95F4",
17516
17577
  sessionImportSessionId: "\u4F1A\u8BDD ID",
17517
17578
  sessionImportRunning: "\u8FD0\u884C\u4E2D",
17518
- sessionImportRunningUnknown: "\u8FD0\u884C\u72B6\u6001\u672A\u77E5",
17519
17579
  sessionImportRunningHint: "\u8BF7\u5148\u5728\u539F\u751F\u5BA2\u6237\u7AEF\u5173\u95ED\u8BE5\u4F1A\u8BDD\uFF0C\u518D\u5237\u65B0\u5E76\u5BFC\u5165\u3002",
17520
17580
  sessionImportAction: "\u5BFC\u5165\u5E76\u6253\u5F00",
17521
17581
  sessionImportImporting: "\u6B63\u5728\u5BFC\u5165\u2026\u2026",
@@ -17529,15 +17589,13 @@ ${error51.stderrTail}`] : []
17529
17589
  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",
17530
17590
  accountConnected: "\u8D26\u53F7",
17531
17591
  accountDefaultBadge: "\u5F53\u524D",
17532
- accountAdd: "\u6DFB\u52A0 Codex \u8D26\u53F7",
17533
17592
  accountColumnAccount: "\u8D26\u53F7",
17534
17593
  accountColumnActions: "\u7BA1\u7406",
17535
17594
  accountSearch: "\u641C\u7D22\u8D26\u53F7\u6216 Agent\u2026",
17536
- accountEmpty: "\u8FD8\u6CA1\u6709\u8D26\u53F7\uFF0C\u53EF\u6DFB\u52A0 Codex \u8D26\u53F7\u6216\u5728\u5176\u4ED6 Agent \u7684\u539F\u751F\u5BA2\u6237\u7AEF\u767B\u5F55\u3002",
17595
+ accountEmpty: "\u5C1A\u672A\u8BC6\u522B\u5230\u5F53\u524D\u8EAB\u4EFD\uFF0C\u8BF7\u5728 Codex Desktop \u6216\u5BF9\u5E94 Harness \u7684\u539F\u751F\u5BA2\u6237\u7AEF\u767B\u5F55\u3002",
17537
17596
  accountNoMatches: "\u6CA1\u6709\u5339\u914D\u7684\u8D26\u53F7\u3002",
17538
17597
  accountNativeManaged: "\u539F\u751F\u7BA1\u7406",
17539
17598
  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",
17540
- accountMore: "Codex \u8D26\u53F7\u64CD\u4F5C",
17541
17599
  accountDetailsClose: "\u5173\u95ED\u8D26\u53F7\u8BE6\u60C5",
17542
17600
  accountDefaultHint: "\u6240\u6709 Codex \u4F1A\u8BDD\u5F53\u524D\u4F7F\u7528\u6B64\u8EAB\u4EFD\u3002",
17543
17601
  accountCreditsRemaining: "\u5269\u4F59",
@@ -17546,34 +17604,6 @@ ${error51.stderrTail}`] : []
17546
17604
  accountCreditsFailed: "\u989D\u5EA6\u8BFB\u53D6\u5931\u8D25",
17547
17605
  accountCreditsRetry: "\u91CD\u8BD5",
17548
17606
  accountCreditsRefresh: "\u5237\u65B0\u989D\u5EA6",
17549
- accountDelete: "\u5220\u9664",
17550
- accountDeleteConfirm: "\u5220\u9664\u6B64\u8D26\u53F7\u53CA\u5176\u672C\u5730\u6570\u636E\uFF1F\u6B64\u64CD\u4F5C\u65E0\u6CD5\u64A4\u9500\u3002",
17551
- accountDeleting: "\u6B63\u5728\u5220\u9664\u8D26\u53F7...",
17552
- accountDeleteFailed: "\u5220\u9664\u8D26\u53F7\u5931\u8D25\u3002",
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...",
17568
- accountSignIn: "\u767B\u5F55",
17569
- accountSigningIn: "\u6B63\u5728\u542F\u52A8\u8BBE\u5907\u767B\u5F55...",
17570
- accountVerificationDescription: "\u6253\u5F00\u9A8C\u8BC1\u9875\u9762\u5E76\u8F93\u5165\u4EE5\u4E0B\u4E00\u6B21\u6027\u4EE3\u7801\uFF1A",
17571
- accountCopyCode: "\u590D\u5236\u4EE3\u7801",
17572
- accountCopied: "\u5DF2\u590D\u5236",
17573
- accountLoginCancel: "\u53D6\u6D88\u767B\u5F55",
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",
17576
- accountLoginFailed: "\u767B\u5F55\u5931\u8D25\u3002",
17577
17607
  accountLoadFailed: "\u65E0\u6CD5\u52A0\u8F7D Codex \u8D26\u53F7\u3002",
17578
17608
  accountCreditsUsed: "\u5DF2\u7528",
17579
17609
  accountCreditsResetAt: "\u989D\u5EA6\u91CD\u7F6E\u65F6\u95F4\uFF1A{time}",
@@ -17587,14 +17617,6 @@ ${error51.stderrTail}`] : []
17587
17617
  accountCreditsPeriodUnknown: "\u989D\u5EA6",
17588
17618
  accountCreditsBuild: "Build",
17589
17619
  accountResetCredits: "\u91CD\u7F6E\u5361",
17590
- accountResetCreditsUse: "\u4F7F\u7528\u91CD\u7F6E",
17591
- accountResetCreditsConfirm: "\u5C06\u6D88\u8017 1 \u5F20\u91CD\u7F6E\u5361\uFF0C\u540C\u65F6\u91CD\u7F6E 5 \u5C0F\u65F6\u548C 7 \u5929\u989D\u5EA6\u3002\u6B64\u64CD\u4F5C\u65E0\u6CD5\u64A4\u9500\u3002",
17592
- accountResetCreditsUsing: "\u6B63\u5728\u4F7F\u7528\u91CD\u7F6E\u5361...",
17593
- accountResetCreditsFailed: "\u4F7F\u7528\u91CD\u7F6E\u5361\u5931\u8D25\u3002",
17594
- accountResetCreditsNothingToReset: "\u5F53\u524D\u989D\u5EA6\u4E0D\u9700\u8981\u91CD\u7F6E\u3002",
17595
- accountResetCreditsNoCredit: "\u6CA1\u6709\u53EF\u7528\u7684\u91CD\u7F6E\u5361\u3002",
17596
- accountResetCreditsAlreadyRedeemed: "\u8FD9\u5F20\u91CD\u7F6E\u5361\u5DF2\u7ECF\u4F7F\u7528\u8FC7\u3002",
17597
- accountResetCreditsSucceeded: "\u989D\u5EA6\u5DF2\u91CD\u7F6E\u3002",
17598
17620
  accountResetCreditsDetails: "\u91CD\u7F6E\u5361\u8BE6\u60C5",
17599
17621
  accountResetCreditsCardExpiry: "\u7B2C {index} \u5F20 \xB7 {time}\u5230\u671F",
17600
17622
  connectionAdapter: "Renderer \u9002\u914D\u5668",
@@ -17695,7 +17717,7 @@ ${error51.stderrTail}`] : []
17695
17717
  aboutRepository: "\u5F00\u6E90\u4ED3\u5E93",
17696
17718
  pageLabels: Object.freeze({
17697
17719
  connections: "\u8FDE\u63A5",
17698
- appearance: "\u5916\u89C2",
17720
+ appearance: "\u901A\u7528",
17699
17721
  accounts: "\u8D26\u53F7",
17700
17722
  "session-import": "\u4F1A\u8BDD\u5BFC\u5165",
17701
17723
  updates: "\u66F4\u65B0",
@@ -17749,7 +17771,9 @@ ${error51.stderrTail}`] : []
17749
17771
  "kiro-cli": "https://kiro.dev/docs/cli/",
17750
17772
  codebuddy: "https://www.codebuddy.ai/docs/zh/cli/overview",
17751
17773
  "cursor-cli": "https://cursor.com/docs/cli/installation",
17752
- hermes: "https://hermes-agent.nousresearch.com/docs"
17774
+ hermes: "https://hermes-agent.nousresearch.com/docs",
17775
+ qoder: "https://docs.qoder.com/",
17776
+ "qoder-cn": "https://docs.qoder.cn/"
17753
17777
  };
17754
17778
  var CONTROL_ATTRIBUTE = "data-codexhost-agent-control";
17755
17779
  var AGENT_MENU_WIDTH = 224;
@@ -18101,6 +18125,7 @@ ${error51.stderrTail}`] : []
18101
18125
  cta.style.background = "transparent";
18102
18126
  });
18103
18127
  cta.addEventListener("click", () => openConnectionsSettings(trigger));
18128
+ let notInstalled = /* @__PURE__ */ new Set();
18104
18129
  let mainAgents = [...enabledAgents];
18105
18130
  let moreAgents = [];
18106
18131
  const regroup = () => {
@@ -18123,8 +18148,9 @@ ${error51.stderrTail}`] : []
18123
18148
  seen.add(agent);
18124
18149
  nextMain.push(agent);
18125
18150
  }
18126
- mainAgents = nextMain;
18127
- moreAgents = nextMore;
18151
+ const installationOrder = (a, b) => Number(notInstalled.has(a)) - Number(notInstalled.has(b));
18152
+ mainAgents = nextMain.sort(installationOrder);
18153
+ moreAgents = nextMore.sort(installationOrder);
18128
18154
  const mainChildren = [];
18129
18155
  for (const agent of mainAgents) {
18130
18156
  const row = rowsByAgent.get(agent);
@@ -18200,6 +18226,18 @@ ${error51.stderrTail}`] : []
18200
18226
  menu,
18201
18227
  agents: [...enabledAgents],
18202
18228
  options,
18229
+ updateAvailability(availability) {
18230
+ const next = new Set(
18231
+ enabledAgents.filter(
18232
+ (agent) => agent !== "codex" && availability[agent] === "notInstalled"
18233
+ )
18234
+ );
18235
+ if (next.size === notInstalled.size && [...next].every((agent) => notInstalled.has(agent))) {
18236
+ return;
18237
+ }
18238
+ notInstalled = next;
18239
+ regroup();
18240
+ },
18203
18241
  close,
18204
18242
  dispose() {
18205
18243
  close();
@@ -18223,6 +18261,7 @@ ${error51.stderrTail}`] : []
18223
18261
  control.agents,
18224
18262
  availability
18225
18263
  );
18264
+ control.updateAvailability(availability);
18226
18265
  if (control.iconSlot.dataset.agent !== state.agent) {
18227
18266
  control.iconSlot.replaceChildren(createRendererAgentIcon(state.agent));
18228
18267
  control.iconSlot.dataset.agent = state.agent;
@@ -18398,6 +18437,103 @@ ${error51.stderrTail}`] : []
18398
18437
  (ownerDocument.head ?? ownerDocument.documentElement).append(style);
18399
18438
  }
18400
18439
 
18440
+ // src/renderer-model-favorites.ts
18441
+ var STORAGE_KEY = "codexhost.model-favorites.v1";
18442
+ function rendererStorage() {
18443
+ try {
18444
+ return window.localStorage;
18445
+ } catch {
18446
+ return null;
18447
+ }
18448
+ }
18449
+ function readModelFavorites(harnessId, storage = rendererStorage()) {
18450
+ try {
18451
+ const value = JSON.parse(storage?.getItem(`${STORAGE_KEY}:${harnessId}`) ?? "[]");
18452
+ return new Set(
18453
+ Array.isArray(value) ? value.filter((id) => typeof id === "string" && id.length > 0) : []
18454
+ );
18455
+ } catch {
18456
+ return /* @__PURE__ */ new Set();
18457
+ }
18458
+ }
18459
+ function writeModelFavorites(harnessId, favorites, storage = rendererStorage()) {
18460
+ try {
18461
+ storage?.setItem(`${STORAGE_KEY}:${harnessId}`, JSON.stringify([...favorites]));
18462
+ } catch {
18463
+ }
18464
+ }
18465
+
18466
+ // src/renderer-model-option-style.ts
18467
+ var STYLE_ATTRIBUTE2 = "data-codexhost-model-option-style";
18468
+ function ensureModelOptionStyle(ownerDocument) {
18469
+ if (ownerDocument.querySelector(`style[${STYLE_ATTRIBUTE2}]`)) return;
18470
+ const style = ownerDocument.createElement("style");
18471
+ style.setAttribute(STYLE_ATTRIBUTE2, "true");
18472
+ style.textContent = `
18473
+ [data-codexhost-model-row] {
18474
+ display: flex;
18475
+ align-items: center;
18476
+ border-radius: 8px;
18477
+ padding: 0 4px;
18478
+ }
18479
+ [data-codexhost-model-row]:hover,
18480
+ [data-codexhost-model-row]:focus-within {
18481
+ background: var(--color-token-list-hover-background, rgba(127, 127, 127, .07));
18482
+ }
18483
+ [data-codexhost-model-row] > button[data-model-id] {
18484
+ background: transparent;
18485
+ min-height: 36px;
18486
+ }
18487
+ [data-codexhost-model-row] > button[data-favorite-model-id] {
18488
+ display: inline-flex;
18489
+ align-items: center;
18490
+ justify-content: center;
18491
+ flex: none;
18492
+ width: 24px;
18493
+ height: 24px;
18494
+ padding: 4px;
18495
+ border: 0;
18496
+ border-radius: 999px;
18497
+ background: transparent;
18498
+ color: var(--color-token-border, #dcdce2);
18499
+ cursor: pointer;
18500
+ }
18501
+ [data-codexhost-model-row] > button[data-favorite-model-id]:hover {
18502
+ background: var(--color-token-list-hover-background, rgba(127, 127, 127, .09));
18503
+ color: var(--color-token-text-secondary, #85858f);
18504
+ }
18505
+ [data-codexhost-model-row] > button[data-favorite-model-id][aria-pressed="true"] {
18506
+ color: #f59e0b;
18507
+ }
18508
+ [data-codexhost-model-row] button:focus-visible {
18509
+ outline: 2px solid var(--color-token-text-secondary, #85858f);
18510
+ outline-offset: -2px;
18511
+ }
18512
+ [data-favorite-model-id] > svg {
18513
+ width: 16px;
18514
+ height: 16px;
18515
+ fill: none;
18516
+ stroke: currentColor;
18517
+ stroke-width: 2;
18518
+ stroke-linejoin: round;
18519
+ }
18520
+ [data-favorite-model-id][aria-pressed="true"] > svg {
18521
+ fill: currentColor;
18522
+ }
18523
+ `;
18524
+ (ownerDocument.head ?? ownerDocument.documentElement).append(style);
18525
+ }
18526
+ function createModelFavoriteIcon(ownerDocument) {
18527
+ return ownerDocument.adoptNode(
18528
+ createElement(Star, {
18529
+ width: 16,
18530
+ height: 16,
18531
+ "aria-hidden": "true",
18532
+ focusable: "false"
18533
+ })
18534
+ );
18535
+ }
18536
+
18401
18537
  // src/renderer-model-picker.ts
18402
18538
  var MENU_CLASSES = "fixed z-50 overflow-hidden rounded-xl bg-token-dropdown-background/90 text-token-foreground shadow-lg backdrop-blur-xl";
18403
18539
  var SEARCH_INPUT_CLASSES = "mb-1 w-full shrink-0 rounded-lg border border-token-border bg-token-dropdown-background/95 px-2 py-1.5 text-sm text-token-foreground outline-none placeholder:text-token-text-tertiary disabled:cursor-not-allowed disabled:opacity-40";
@@ -18547,13 +18683,30 @@ ${error51.stderrTail}`] : []
18547
18683
  let visibleCount = 0;
18548
18684
  for (const option of control.options.values()) {
18549
18685
  const matches = query.length === 0 || option.searchText.includes(query);
18550
- option.button.hidden = !matches;
18686
+ option.row.hidden = !matches;
18687
+ option.row.style.display = matches ? "flex" : "none";
18551
18688
  if (matches) visibleCount += 1;
18552
18689
  }
18553
18690
  control.searchEmpty.hidden = query.length === 0 || visibleCount > 0;
18554
18691
  }
18692
+ function syncFavorite(option, favorite) {
18693
+ option.favorite.setAttribute("aria-pressed", String(favorite));
18694
+ const label = `${favorite ? "Unfavorite" : "Favorite"} ${option.label}`;
18695
+ option.favorite.setAttribute("aria-label", label);
18696
+ option.favorite.title = label;
18697
+ }
18698
+ function orderModelFavorites(control) {
18699
+ for (const favorite of [true, false]) {
18700
+ for (const [id, option] of control.options) {
18701
+ const isFavorite = control.favorites.has(id);
18702
+ syncFavorite(option, isFavorite);
18703
+ if (isFavorite === favorite) control.modelMenu.append(option.row);
18704
+ }
18705
+ }
18706
+ }
18555
18707
  function mountRendererModelPicker(composerId, onSelectModel, onSelectThinking) {
18556
18708
  ensureRendererTriggerChipStyle(document);
18709
+ ensureModelOptionStyle(document);
18557
18710
  const root = document.createElement("div");
18558
18711
  root.setAttribute("data-codexhost-model-control", composerId);
18559
18712
  root.className = "relative min-w-0";
@@ -18664,7 +18817,8 @@ ${error51.stderrTail}`] : []
18664
18817
  const movedToComposer = active === document.body || active instanceof Element && (active.matches('textarea, [contenteditable="true"], [role="textbox"]') || active.closest('textarea, [contenteditable="true"], [role="textbox"]') !== null);
18665
18818
  if (!movedToComposer) return;
18666
18819
  requestAnimationFrame(() => {
18667
- if (popoverOpen2(modelMenu) && searchInput.isConnected) searchInput.focus();
18820
+ if (popoverOpen2(modelMenu) && searchInput.isConnected && !modelMenu.contains(document.activeElement))
18821
+ searchInput.focus();
18668
18822
  });
18669
18823
  };
18670
18824
  searchInput.addEventListener("blur", onSearchBlur);
@@ -18683,6 +18837,9 @@ ${error51.stderrTail}`] : []
18683
18837
  };
18684
18838
  const openModelMenu = (standalone = false) => {
18685
18839
  if (!standalone && !popoverOpen2(menu) || popoverOpen2(modelMenu)) return;
18840
+ control.favorites = readModelFavorites(control.harnessId);
18841
+ orderModelFavorites(control);
18842
+ modelMenu.scrollTop = 0;
18686
18843
  modelMenu.showPopover();
18687
18844
  positionModelMenu(control, standalone);
18688
18845
  modelButton.setAttribute("aria-expanded", "true");
@@ -18726,6 +18883,22 @@ ${error51.stderrTail}`] : []
18726
18883
  }
18727
18884
  };
18728
18885
  const onModelMenuClick = (event) => {
18886
+ const favoriteButton = event.target instanceof Element ? event.target.closest("button[data-favorite-model-id]") : null;
18887
+ const favoriteId = favoriteButton?.dataset.favoriteModelId;
18888
+ if (favoriteId) {
18889
+ event.stopPropagation();
18890
+ control.favorites = readModelFavorites(control.harnessId);
18891
+ if (control.favorites.has(favoriteId)) control.favorites.delete(favoriteId);
18892
+ else control.favorites.add(favoriteId);
18893
+ writeModelFavorites(control.harnessId, control.favorites);
18894
+ const focused = document.activeElement;
18895
+ orderModelFavorites(control);
18896
+ if (focused instanceof HTMLElement && modelMenu.contains(focused)) {
18897
+ focused.focus({ preventScroll: true });
18898
+ }
18899
+ modelMenu.scrollTop = 0;
18900
+ return;
18901
+ }
18729
18902
  const target = event.target instanceof Element ? event.target.closest("button[data-model-id]") : null;
18730
18903
  if (!target?.dataset.modelId) return;
18731
18904
  close();
@@ -18777,6 +18950,8 @@ ${error51.stderrTail}`] : []
18777
18950
  searchInput,
18778
18951
  searchHeader,
18779
18952
  searchEmpty,
18953
+ harnessId: "",
18954
+ favorites: /* @__PURE__ */ new Set(),
18780
18955
  options,
18781
18956
  thinkingOptions,
18782
18957
  close,
@@ -18858,17 +19033,37 @@ ${error51.stderrTail}`] : []
18858
19033
  text.title = model.label;
18859
19034
  const check2 = createCheck();
18860
19035
  button.append(text, check2);
19036
+ const row = document.createElement("div");
19037
+ row.setAttribute("role", "presentation");
19038
+ row.dataset.codexhostModelRow = "true";
19039
+ button.style.minWidth = "0";
19040
+ button.style.flex = "1";
19041
+ const favorite = document.createElement("button");
19042
+ favorite.type = "button";
19043
+ favorite.dataset.favoriteModelId = model.ref.id;
19044
+ favorite.append(createModelFavoriteIcon(document));
19045
+ row.append(button, favorite);
18861
19046
  control.options.set(model.ref.id, {
19047
+ row,
19048
+ favorite,
19049
+ label: model.label,
18862
19050
  button,
18863
19051
  check: check2,
18864
19052
  searchText: `${model.label} ${model.ref.id}`.toLowerCase()
18865
19053
  });
18866
- control.modelMenu.append(button);
19054
+ control.modelMenu.append(row);
18867
19055
  }
19056
+ orderModelFavorites(control);
18868
19057
  applyModelSearchFilter(control);
18869
19058
  if (popoverOpen2(control.modelMenu)) control.searchInput.focus();
18870
19059
  }
18871
- function renderRendererModelPicker(control, view, visible) {
19060
+ function renderRendererModelPicker(control, view, visible, harnessId = "") {
19061
+ if (control.harnessId !== harnessId) {
19062
+ control.close();
19063
+ control.harnessId = harnessId;
19064
+ control.favorites = readModelFavorites(harnessId);
19065
+ delete control.root.dataset.catalogSignature;
19066
+ }
18872
19067
  control.root.style.display = visible ? "inline-flex" : "none";
18873
19068
  control.root.style.alignItems = "center";
18874
19069
  control.root.style.alignSelf = "center";
@@ -20954,7 +21149,7 @@ ${error51.stderrTail}`] : []
20954
21149
  pickerView.nativeModelHidden,
20955
21150
  switching || state.agent !== "codex"
20956
21151
  );
20957
- renderRendererModelPicker(control.modelPicker, modelView, state.agent !== "codex");
21152
+ renderRendererModelPicker(control.modelPicker, modelView, state.agent !== "codex", state.agent);
20958
21153
  const permissionModeVisible = state.agent !== "codex" && permissionModeView.status !== "idle" && permissionModeView.status !== "loading" && permissionModeView.status !== "unsupported" && control.nativePermissionModeControlVerified;
20959
21154
  renderRendererPermissionModePicker(
20960
21155
  control.permissionModePicker,
@@ -21066,15 +21261,6 @@ ${error51.stderrTail}`] : []
21066
21261
  phase = "unavailable";
21067
21262
  revision = 0;
21068
21263
  instanceId;
21069
- cleanupRequired = false;
21070
- pendingOperation;
21071
- capabilities = {
21072
- manage: false,
21073
- switch: false,
21074
- login: false,
21075
- delete: false
21076
- };
21077
- switching = false;
21078
21264
  #hasSnapshot = false;
21079
21265
  #request = null;
21080
21266
  #unsubscribe;
@@ -21110,10 +21296,6 @@ ${error51.stderrTail}`] : []
21110
21296
  this.phase = result.phase;
21111
21297
  this.revision = result.revision;
21112
21298
  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
21299
  return true;
21118
21300
  }
21119
21301
  };
@@ -21197,6 +21379,98 @@ ${error51.stderrTail}`] : []
21197
21379
  };
21198
21380
  }
21199
21381
 
21382
+ // src/renderer-idle-release-preference.ts
21383
+ var IDLE_RELEASE_STORAGE_KEY = "codexhost.idle-release.v1";
21384
+ var IDLE_RELEASE_CHANGE_EVENT = "codexhost:idle-release-changed";
21385
+ var IDLE_RELEASE_STATUS_EVENT = "codexhost:idle-release-status";
21386
+ function readIdleReleasePreference(owner) {
21387
+ try {
21388
+ const raw = owner.localStorage.getItem(IDLE_RELEASE_STORAGE_KEY);
21389
+ const parsed = idleReleaseSettingsSchema.safeParse(raw ? JSON.parse(raw) : null);
21390
+ if (parsed.success) return parsed.data;
21391
+ } catch {
21392
+ }
21393
+ return { ...DEFAULT_IDLE_RELEASE_SETTINGS };
21394
+ }
21395
+ function writeIdleReleasePreference(owner, value) {
21396
+ const parsed = idleReleaseSettingsSchema.safeParse(value);
21397
+ if (!parsed.success) return false;
21398
+ try {
21399
+ owner.localStorage.setItem(IDLE_RELEASE_STORAGE_KEY, JSON.stringify(parsed.data));
21400
+ } catch {
21401
+ return false;
21402
+ }
21403
+ owner.dispatchEvent(new Event(IDLE_RELEASE_CHANGE_EVENT));
21404
+ return true;
21405
+ }
21406
+ function installIdleReleasePreferenceSync(owner) {
21407
+ let client = null;
21408
+ let disposed = false;
21409
+ let generation = 0;
21410
+ let work = { pending: false, dirty: false };
21411
+ const publish = (value) => {
21412
+ owner.dispatchEvent(new CustomEvent(IDLE_RELEASE_STATUS_EVENT, { detail: value }));
21413
+ };
21414
+ const sync = async () => {
21415
+ const currentWork = work;
21416
+ const version2 = generation;
21417
+ currentWork.dirty = true;
21418
+ if (currentWork.pending || disposed) return;
21419
+ currentWork.pending = true;
21420
+ try {
21421
+ while (currentWork.dirty && !disposed && version2 === generation) {
21422
+ currentWork.dirty = false;
21423
+ const target = client;
21424
+ if (!target) {
21425
+ publish("pending");
21426
+ continue;
21427
+ }
21428
+ if (!target.setIdleReleaseSettings) {
21429
+ publish("unavailable");
21430
+ continue;
21431
+ }
21432
+ const settings = readIdleReleasePreference(owner);
21433
+ publish("pending");
21434
+ try {
21435
+ await target.setIdleReleaseSettings(settings);
21436
+ if (!disposed && version2 === generation && !currentWork.dirty) publish("applied");
21437
+ } catch (error51) {
21438
+ if (!disposed && version2 === generation) {
21439
+ publish(error51 instanceof RendererMethodUnavailableError ? "unavailable" : "failed");
21440
+ }
21441
+ }
21442
+ }
21443
+ } finally {
21444
+ currentWork.pending = false;
21445
+ }
21446
+ };
21447
+ const changed = () => {
21448
+ void sync();
21449
+ };
21450
+ const storage = (event) => {
21451
+ if (event.key === IDLE_RELEASE_STORAGE_KEY || event.key === null) changed();
21452
+ };
21453
+ owner.addEventListener(IDLE_RELEASE_CHANGE_EVENT, changed);
21454
+ owner.addEventListener("storage", storage);
21455
+ return {
21456
+ connect(next) {
21457
+ if (disposed) return;
21458
+ if (next === client) return;
21459
+ client = next;
21460
+ generation += 1;
21461
+ work = { pending: false, dirty: false };
21462
+ void sync();
21463
+ },
21464
+ dispose() {
21465
+ disposed = true;
21466
+ generation += 1;
21467
+ client = null;
21468
+ owner.removeEventListener(IDLE_RELEASE_CHANGE_EVENT, changed);
21469
+ owner.removeEventListener("storage", storage);
21470
+ }
21471
+ };
21472
+ }
21473
+
21200
21474
  // src/renderer-sidebar-agent-icons.ts
21201
21475
  var SIDEBAR_THREAD_ROW_ATTRIBUTE = "data-app-action-sidebar-thread-row";
21202
21476
  var SIDEBAR_THREAD_ROW_SELECTOR = `[${SIDEBAR_THREAD_ROW_ATTRIBUTE}]`;
@@ -21260,6 +21534,8 @@ ${error51.stderrTail}`] : []
21260
21534
  if (ownership.harnessId === "codebuddy") return "codebuddy";
21261
21535
  if (ownership.harnessId === "cursor-cli") return "cursor-cli";
21262
21536
  if (ownership.harnessId === "hermes") return "hermes";
21537
+ if (ownership.harnessId === "qoder") return "qoder";
21538
+ if (ownership.harnessId === "qoder-cn") return "qoder-cn";
21263
21539
  return null;
21264
21540
  }
21265
21541
  var BrowserSidebarAgentIconRow = class {
@@ -22035,25 +22311,23 @@ ${error51.stderrTail}`] : []
22035
22311
  var THREAD_USAGE_INSPECT_METHOD = "codexhost/thread/usage/inspect";
22036
22312
  var THREAD_USAGE_UPDATED_METHOD = "codexhost/thread/usage/updated";
22037
22313
  var THREAD_TOKEN_USAGE_UPDATED_METHOD = "thread/tokenUsage/updated";
22314
+ var TURN_COMPLETED_METHOD = "turn/completed";
22315
+ var THREAD_USAGE_REFRESH_METHODS = [
22316
+ THREAD_TOKEN_USAGE_UPDATED_METHOD,
22317
+ THREAD_USAGE_UPDATED_METHOD,
22318
+ TURN_COMPLETED_METHOD
22319
+ ];
22038
22320
  var UPDATE_CHECK_METHOD = "codexhost/update/check";
22039
22321
  var UPDATE_START_METHOD = "codexhost/update/start";
22040
22322
  var UPDATE_STATUS_METHOD = "codexhost/update/status";
22041
22323
  var CODEX_ACCOUNT_LIST_METHOD = "codexhost/account/list";
22042
22324
  var CODEX_ACCOUNT_REFRESH_METHOD = "codexhost/account/refresh";
22043
- var CODEX_ACCOUNT_DELETE_METHOD = "codexhost/account/delete";
22044
- var CODEX_ACCOUNT_SWITCH_METHOD = "codexhost/account/switch";
22045
22325
  var CODEX_ACCOUNT_CHANGED_METHOD = "codexhost/account/changed";
22046
- var CODEX_ACCOUNT_LOGIN_START_METHOD = "codexhost/account/login/start";
22047
- var CODEX_ACCOUNT_LOGIN_CANCEL_METHOD = "codexhost/account/login/cancel";
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";
22051
- var CODEX_ACCOUNT_RESET_CREDIT_CONSUME_METHOD = "codexhost/account/rate-limit-reset/consume";
22052
22326
  function isRecord6(value) {
22053
22327
  return typeof value === "object" && value !== null && !Array.isArray(value);
22054
22328
  }
22055
22329
  function notifiedThreadId(notification) {
22056
- if (!isRecord6(notification) || notification.method !== THREAD_TOKEN_USAGE_UPDATED_METHOD && notification.method !== THREAD_USAGE_UPDATED_METHOD) {
22330
+ if (!isRecord6(notification) || !THREAD_USAGE_REFRESH_METHODS.includes(notification.method)) {
22057
22331
  return null;
22058
22332
  }
22059
22333
  const params = notification.params;
@@ -22069,15 +22343,28 @@ ${error51.stderrTail}`] : []
22069
22343
  function createThreadUsageSubscriptionRelay() {
22070
22344
  const listeners = /* @__PURE__ */ new Set();
22071
22345
  let removeNotificationCallback = null;
22346
+ let connectedClient = null;
22347
+ let generation = 0;
22348
+ const disconnect = () => {
22349
+ generation += 1;
22350
+ removeNotificationCallback?.();
22351
+ removeNotificationCallback = null;
22352
+ connectedClient = null;
22353
+ };
22072
22354
  return {
22073
22355
  connect(client) {
22074
- if (removeNotificationCallback || listeners.size === 0) return;
22356
+ if (client === connectedClient && removeNotificationCallback) return;
22357
+ disconnect();
22358
+ if (!client || listeners.size === 0) return;
22359
+ connectedClient = client;
22360
+ const subscriptionGeneration = generation;
22075
22361
  try {
22076
22362
  removeNotificationCallback = client.subscribeThreadUsage?.((update) => {
22363
+ if (subscriptionGeneration !== generation) return;
22077
22364
  for (const listener of listeners) listener(update);
22078
22365
  }) ?? null;
22079
22366
  } catch {
22080
- removeNotificationCallback = null;
22367
+ disconnect();
22081
22368
  }
22082
22369
  },
22083
22370
  subscribe(listener) {
@@ -22085,13 +22372,11 @@ ${error51.stderrTail}`] : []
22085
22372
  return () => {
22086
22373
  listeners.delete(listener);
22087
22374
  if (listeners.size > 0) return;
22088
- removeNotificationCallback?.();
22089
- removeNotificationCallback = null;
22375
+ disconnect();
22090
22376
  };
22091
22377
  },
22092
22378
  dispose() {
22093
- removeNotificationCallback?.();
22094
- removeNotificationCallback = null;
22379
+ disconnect();
22095
22380
  listeners.clear();
22096
22381
  }
22097
22382
  };
@@ -22148,6 +22433,15 @@ ${error51.stderrTail}`] : []
22148
22433
  return harnessConfigurationStateSchema.parse(result);
22149
22434
  };
22150
22435
  return Object.freeze({
22436
+ async listLoadedSessions() {
22437
+ return loadedSessionsSchema.parse(await manager.sendRequest(LOADED_SESSIONS_METHOD, {}));
22438
+ },
22439
+ async setIdleReleaseSettings(settings) {
22440
+ const params = idleReleaseSettingsSchema.parse(settings);
22441
+ return idleReleaseSettingsSchema.parse(
22442
+ await manager.sendRequest(IDLE_RELEASE_SETTINGS_METHOD, params)
22443
+ );
22444
+ },
22151
22445
  ...createRendererSessionImportClient(
22152
22446
  async (method, params) => manager.sendRequest(method, params)
22153
22447
  ),
@@ -22207,7 +22501,7 @@ ${error51.stderrTail}`] : []
22207
22501
  let disposed = false;
22208
22502
  const generations = /* @__PURE__ */ new Map();
22209
22503
  const removeNotificationCallback = notifications.addNotificationCallback(
22210
- [THREAD_TOKEN_USAGE_UPDATED_METHOD, THREAD_USAGE_UPDATED_METHOD],
22504
+ THREAD_USAGE_REFRESH_METHODS,
22211
22505
  (notification) => {
22212
22506
  const threadId = notifiedThreadId(notification);
22213
22507
  if (!threadId) return;
@@ -22256,13 +22550,6 @@ ${error51.stderrTail}`] : []
22256
22550
  );
22257
22551
  return codexAccountUsageResultSchema.parse(result);
22258
22552
  },
22259
- async consumeCodexAccountResetCredit(input) {
22260
- const result = await manager.sendRequest(
22261
- CODEX_ACCOUNT_RESET_CREDIT_CONSUME_METHOD,
22262
- codexAccountResetCreditConsumeParamsSchema.parse(input)
22263
- );
22264
- return codexAccountResetCreditConsumeResultSchema.parse(result);
22265
- },
22266
22553
  async listHarnessAccountSources() {
22267
22554
  return harnessAccountSourceListResultSchema.parse(
22268
22555
  await manager.sendRequest(HARNESS_ACCOUNT_SOURCES_METHOD, {})
@@ -22292,34 +22579,6 @@ ${error51.stderrTail}`] : []
22292
22579
  const result = await manager.sendRequest(CODEX_ACCOUNT_REFRESH_METHOD, {});
22293
22580
  return codexAccountListResultSchema.parse(result);
22294
22581
  },
22295
- async deleteCodexAccount(input) {
22296
- const result = await manager.sendRequest(
22297
- CODEX_ACCOUNT_DELETE_METHOD,
22298
- codexAccountDeleteParamsSchema.parse(input)
22299
- );
22300
- return codexAccountDeleteResultSchema.parse(result);
22301
- },
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 = {}) {
22310
- const result = await manager.sendRequest(
22311
- CODEX_ACCOUNT_LOGOUT_METHOD,
22312
- codexAccountLogoutParamsSchema.parse(input)
22313
- );
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
22582
  subscribeCodexAccounts(listener) {
22324
22583
  const notifications = notificationTarget(source);
22325
22584
  if (!notifications?.addNotificationCallback) {
@@ -22330,36 +22589,6 @@ ${error51.stderrTail}`] : []
22330
22589
  const state = codexAccountChangedSchema.safeParse(notification.params);
22331
22590
  if (state.success) listener(state.data);
22332
22591
  });
22333
- },
22334
- async startCodexAccountLogin(input) {
22335
- const result = await manager.sendRequest(
22336
- CODEX_ACCOUNT_LOGIN_START_METHOD,
22337
- codexAccountLoginStartParamsSchema.parse(input)
22338
- );
22339
- return codexAccountLoginStartResultSchema.parse(result);
22340
- },
22341
- async cancelCodexAccountLogin(input) {
22342
- const result = await manager.sendRequest(
22343
- CODEX_ACCOUNT_LOGIN_CANCEL_METHOD,
22344
- codexAccountLoginCancelParamsSchema.parse(input)
22345
- );
22346
- return codexAccountLoginCancelResultSchema.parse(result);
22347
- },
22348
- subscribeCodexAccountLogin(listener) {
22349
- const notifications = notificationTarget(source);
22350
- if (!notifications?.addNotificationCallback) {
22351
- throw new Error("Renderer Account login notification callback is unavailable");
22352
- }
22353
- return notifications.addNotificationCallback(
22354
- CODEX_ACCOUNT_LOGIN_COMPLETED_METHOD,
22355
- (notification) => {
22356
- if (!isRecord6(notification) || notification.method !== CODEX_ACCOUNT_LOGIN_COMPLETED_METHOD) {
22357
- return;
22358
- }
22359
- const result = codexAccountLoginCompletedSchema.safeParse(notification.params);
22360
- if (result.success) listener(result.data);
22361
- }
22362
- );
22363
22592
  }
22364
22593
  });
22365
22594
  }
@@ -22410,6 +22639,9 @@ ${error51.stderrTail}`] : []
22410
22639
  if (agent === "kiro-cli") return encodeHarnessPluginRoute({ harnessId: KIRO_CLI_HARNESS_ID });
22411
22640
  if (agent === "codebuddy" || agent === "cursor-cli")
22412
22641
  return encodeHarnessPluginRoute({ harnessId: harnessIdSchema.parse(agent) });
22642
+ if (agent === "qoder" || agent === "qoder-cn") {
22643
+ return encodeHarnessPluginRoute({ harnessId: harnessIdSchema.parse(agent) });
22644
+ }
22413
22645
  return null;
22414
22646
  }
22415
22647
  function isRecord7(value) {
@@ -22871,7 +23103,12 @@ ${error51.stderrTail}`] : []
22871
23103
  ...model ? { model } : {},
22872
23104
  ...thinkingOptionId && agent !== "cursor-cli" ? { thinkingOptionId } : {},
22873
23105
  ...permissionModeId ? { permissionModeId } : {}
22874
- }) : agent === "hermes" ? hermesTransportModelId(model, permissionModeId) : transportModelIdForAgent(agent);
23106
+ }) : agent === "hermes" ? hermesTransportModelId(model, permissionModeId) : agent === "qoder" || agent === "qoder-cn" ? encodeHarnessPluginRoute({
23107
+ harnessId: harnessIdSchema.parse(agent),
23108
+ ...model ? { model } : {},
23109
+ ...thinkingOptionId ? { thinkingOptionId } : {},
23110
+ ...permissionModeId ? { permissionModeId } : {}
23111
+ }) : transportModelIdForAgent(agent);
22875
23112
  return transportModelId ? { model: transportModelId, reasoningEffort } : officialSelection;
22876
23113
  }
22877
23114
  function installCurrentRendererAdapter() {
@@ -22890,6 +23127,7 @@ ${error51.stderrTail}`] : []
22890
23127
  });
22891
23128
  };
22892
23129
  const usageSubscription = createThreadUsageSubscriptionRelay();
23130
+ const idleReleaseSync = installIdleReleasePreferenceSync(window);
22893
23131
  const requestRouteResolver = createRendererRequestRouteResolver(
22894
23132
  () => window.__codexhostDraftPrewarmPolicyV1,
22895
23133
  () => findActivePrewarmTargets(document)
@@ -22900,7 +23138,7 @@ ${error51.stderrTail}`] : []
22900
23138
  const target = targets[0];
22901
23139
  if (targets.length !== 1 || !target) return null;
22902
23140
  const cached2 = clientsByTarget.get(target);
22903
- if (cached2?.policy === policy && cached2.requestClient === target.requestClient)
23141
+ if (cached2 && (policy === null || cached2.policy === policy) && cached2.requestClient === target.requestClient)
22904
23142
  return cached2.client;
22905
23143
  const client = createRendererModelClient([target]);
22906
23144
  if (client) {
@@ -22919,6 +23157,11 @@ ${error51.stderrTail}`] : []
22919
23157
  const syncActiveRoute = (route) => {
22920
23158
  const policy = route?.policy ?? null;
22921
23159
  const client = route ? modelClientForTargets(route.targets, route.policy) : null;
23160
+ usageSubscription.connect(client);
23161
+ const localClient = policy?.hostId === "local" ? client : modelClientForTargets(
23162
+ rendererRequestTargetsForHost(findActivePrewarmTargets(document), "local") ?? []
23163
+ );
23164
+ idleReleaseSync.connect(localClient);
22922
23165
  if (activeRoutePolicy === policy && activeRouteClient === client) return client;
22923
23166
  activeRoutePolicy = policy;
22924
23167
  activeRouteClient = client;
@@ -22932,7 +23175,6 @@ ${error51.stderrTail}`] : []
22932
23175
  const currentModelClient = () => {
22933
23176
  const client = currentRequestRoute() ? activeRouteClient : null;
22934
23177
  if (!client) throw new Error("Renderer Model request manager is unavailable");
22935
- usageSubscription.connect(client);
22936
23178
  return client;
22937
23179
  };
22938
23180
  const modelControl = Object.freeze({
@@ -22971,13 +23213,6 @@ ${error51.stderrTail}`] : []
22971
23213
  if (!client.inspectCodexAccountUsage) throw new Error("Codex Account Usage is unavailable");
22972
23214
  return client.inspectCodexAccountUsage(input);
22973
23215
  },
22974
- consumeCodexAccountResetCredit: (input) => {
22975
- const client = currentModelClient();
22976
- if (!client.consumeCodexAccountResetCredit) {
22977
- throw new Error("Codex Account reset-credit consume is unavailable");
22978
- }
22979
- return client.consumeCodexAccountResetCredit(input);
22980
- },
22981
23216
  listHarnessAccountSources: () => {
22982
23217
  const client = currentModelClient();
22983
23218
  if (!client.listHarnessAccountSources) {
@@ -23002,18 +23237,11 @@ ${error51.stderrTail}`] : []
23002
23237
  const client = currentModelClient();
23003
23238
  return client.refreshCodexAccounts?.() ?? client.listCodexAccounts();
23004
23239
  },
23005
- deleteCodexAccount: (input) => currentModelClient().deleteCodexAccount(input),
23006
- switchCodexAccount: (input) => currentModelClient().switchCodexAccount(input),
23007
- logoutCodexAccount: (input) => currentModelClient().logoutCodexAccount(input),
23008
- recoverCodexAccounts: (input) => currentModelClient().recoverCodexAccounts(input),
23009
23240
  subscribeCodexAccounts: (listener) => {
23010
23241
  const client = currentModelClient();
23011
23242
  if (!client.subscribeCodexAccounts) throw new Error("Codex Account updates are unavailable");
23012
23243
  return client.subscribeCodexAccounts(listener);
23013
- },
23014
- startCodexAccountLogin: (input) => currentModelClient().startCodexAccountLogin(input),
23015
- cancelCodexAccountLogin: (input) => currentModelClient().cancelCodexAccountLogin(input),
23016
- subscribeCodexAccountLogin: (listener) => currentModelClient().subscribeCodexAccountLogin(listener)
23244
+ }
23017
23245
  });
23018
23246
  const forkControl = installRendererForkControl({
23019
23247
  getClient: () => modelControl,
@@ -23148,7 +23376,8 @@ ${error51.stderrTail}`] : []
23148
23376
  () => syncActiveRoute(null),
23149
23377
  () => forkControl.dispose(),
23150
23378
  ...turnControlCleanups,
23151
- () => usageSubscription.dispose()
23379
+ () => usageSubscription.dispose(),
23380
+ () => idleReleaseSync.dispose()
23152
23381
  ];
23153
23382
  for (const cleanup of cleanups) {
23154
23383
  try {
@@ -23162,14 +23391,14 @@ ${error51.stderrTail}`] : []
23162
23391
 
23163
23392
  // src/renderer-permission-mode-preference.ts
23164
23393
  var CLAUDE_PERMISSION_MODE_PREFERENCE_KEY = "codexhost.claude-code.permission-mode.v1";
23165
- function rendererStorage() {
23394
+ function rendererStorage2() {
23166
23395
  try {
23167
23396
  return window.localStorage;
23168
23397
  } catch {
23169
23398
  return null;
23170
23399
  }
23171
23400
  }
23172
- function readClaudePermissionModePreference(catalog, storage = rendererStorage()) {
23401
+ function readClaudePermissionModePreference(catalog, storage = rendererStorage2()) {
23173
23402
  if (!storage) return void 0;
23174
23403
  try {
23175
23404
  const parsed = harnessPermissionModeIdSchema.safeParse(
@@ -23180,7 +23409,7 @@ ${error51.stderrTail}`] : []
23180
23409
  return void 0;
23181
23410
  }
23182
23411
  }
23183
- function writeClaudePermissionModePreference(permissionModeId, storage = rendererStorage()) {
23412
+ function writeClaudePermissionModePreference(permissionModeId, storage = rendererStorage2()) {
23184
23413
  if (!storage) return;
23185
23414
  try {
23186
23415
  storage.setItem(CLAUDE_PERMISSION_MODE_PREFERENCE_KEY, permissionModeId);
@@ -23190,7 +23419,7 @@ ${error51.stderrTail}`] : []
23190
23419
 
23191
23420
  // src/renderer-new-thread-preference.ts
23192
23421
  var RENDERER_NEW_THREAD_PREFERENCE_KEY = "codexhost.new-thread-preference.v1";
23193
- function rendererStorage2() {
23422
+ function rendererStorage3() {
23194
23423
  try {
23195
23424
  return window.localStorage;
23196
23425
  } catch {
@@ -23245,11 +23474,11 @@ ${error51.stderrTail}`] : []
23245
23474
  } catch {
23246
23475
  }
23247
23476
  }
23248
- function readNewThreadAgentPreference(enabledAgents, storage = rendererStorage2()) {
23477
+ function readNewThreadAgentPreference(enabledAgents, storage = rendererStorage3()) {
23249
23478
  const agent = readPreference(storage)?.lastAgent;
23250
23479
  return agent && enabledAgents.has(agent) ? agent : void 0;
23251
23480
  }
23252
- function readNewThreadExternalConfigurationPreference(agent, catalog, permissionModes, storage = rendererStorage2()) {
23481
+ function readNewThreadExternalConfigurationPreference(agent, catalog, permissionModes, storage = rendererStorage3()) {
23253
23482
  const preference = readPreference(storage)?.externalByAgent[agent];
23254
23483
  if (!preference) return void 0;
23255
23484
  const catalogModel = catalog.models.find(({ ref }) => ref.id === preference.model.id);
@@ -23262,7 +23491,7 @@ ${error51.stderrTail}`] : []
23262
23491
  ...permissionModeId ? { permissionModeId } : {}
23263
23492
  };
23264
23493
  }
23265
- function writeNewThreadAgentPreference(agent, storage = rendererStorage2()) {
23494
+ function writeNewThreadAgentPreference(agent, storage = rendererStorage3()) {
23266
23495
  const current = readPreference(storage);
23267
23496
  writePreference(
23268
23497
  {
@@ -23273,7 +23502,7 @@ ${error51.stderrTail}`] : []
23273
23502
  storage
23274
23503
  );
23275
23504
  }
23276
- function writeNewThreadExternalConfigurationPreference(agent, model, thinkingOptionId, permissionModeId, storage = rendererStorage2()) {
23505
+ function writeNewThreadExternalConfigurationPreference(agent, model, thinkingOptionId, permissionModeId, storage = rendererStorage3()) {
23277
23506
  const current = readPreference(storage);
23278
23507
  writePreference(
23279
23508
  {
@@ -23959,10 +24188,10 @@ ${error51.stderrTail}`] : []
23959
24188
  );
23960
24189
  const actionArea = document2.createElement("div");
23961
24190
  actionArea.className = "settings-session-import-row__action";
23962
- if (candidate.running !== false) {
24191
+ if (candidate.running === true) {
23963
24192
  const running = document2.createElement("span");
23964
24193
  running.className = "settings-session-import-running";
23965
- running.textContent = candidate.running === null ? messages.sessionImportRunningUnknown : messages.sessionImportRunning;
24194
+ running.textContent = messages.sessionImportRunning;
23966
24195
  running.title = messages.sessionImportRunningHint;
23967
24196
  running.setAttribute("aria-hidden", "true");
23968
24197
  actionArea.append(
@@ -24085,8 +24314,319 @@ ${error51.stderrTail}`] : []
24085
24314
  });
24086
24315
  }
24087
24316
 
24317
+ // src/settings/loaded-sessions-table.ts
24318
+ function mountLoadedSessionsTable(context, messages, getClient) {
24319
+ const document2 = context.content.ownerDocument;
24320
+ const owner = document2.defaultView;
24321
+ if (!owner) return () => void 0;
24322
+ const text = messages.loadedSessions;
24323
+ const container = document2.createElement("div");
24324
+ container.className = "border-t border-settings-border";
24325
+ const header = document2.createElement("div");
24326
+ header.className = "px-4 pt-4";
24327
+ const title = document2.createElement("p");
24328
+ title.className = "m-0 text-sm font-medium";
24329
+ title.textContent = text.title;
24330
+ const description = document2.createElement("p");
24331
+ description.className = "text-xs text-settings-muted";
24332
+ description.textContent = text.description;
24333
+ const status = document2.createElement("p");
24334
+ status.className = "p-4 text-sm text-settings-muted";
24335
+ status.setAttribute("role", "status");
24336
+ status.textContent = text.loading;
24337
+ const scroll = document2.createElement("div");
24338
+ scroll.className = "overflow-x-auto";
24339
+ const table = document2.createElement("table");
24340
+ table.className = "w-full text-left text-sm";
24341
+ table.setAttribute("aria-label", text.title);
24342
+ const head = table.createTHead().insertRow();
24343
+ for (const label of text.columns) {
24344
+ const cell = document2.createElement("th");
24345
+ cell.scope = "col";
24346
+ cell.className = "px-4 py-3 font-medium text-settings-muted";
24347
+ cell.textContent = label;
24348
+ head.append(cell);
24349
+ }
24350
+ const body = table.createTBody();
24351
+ scroll.append(table);
24352
+ scroll.hidden = true;
24353
+ header.append(title, description);
24354
+ container.append(header, status, scroll);
24355
+ context.content.append(container);
24356
+ let disposed = false;
24357
+ let timer;
24358
+ let requestTimer;
24359
+ const refresh = async () => {
24360
+ try {
24361
+ const client = getClient();
24362
+ if (!client?.listLoadedSessions) {
24363
+ status.textContent = text.unavailable;
24364
+ status.hidden = false;
24365
+ scroll.hidden = true;
24366
+ return;
24367
+ }
24368
+ const rows = await Promise.race([
24369
+ client.listLoadedSessions(),
24370
+ new Promise((_, reject) => {
24371
+ requestTimer = owner.setTimeout(
24372
+ () => reject(new Error("Session status timed out")),
24373
+ 1e4
24374
+ );
24375
+ })
24376
+ ]);
24377
+ if (disposed || context.signal.aborted) return;
24378
+ body.replaceChildren();
24379
+ for (const row of rows.toSorted(
24380
+ (a, b) => b.inactiveMs - a.inactiveMs || a.harnessId.localeCompare(b.harnessId) || a.threadId.localeCompare(b.threadId)
24381
+ )) {
24382
+ const tr = body.insertRow();
24383
+ const values = [
24384
+ row.title,
24385
+ row.harnessId,
24386
+ text.states[row.state],
24387
+ text.minutes.replace("{minutes}", String(Math.floor(row.inactiveMs / 6e4))),
24388
+ text.reasons[row.reason]
24389
+ ];
24390
+ for (const value of values) {
24391
+ const cell = tr.insertCell();
24392
+ cell.className = "max-w-64 break-words px-4 py-3 align-top";
24393
+ cell.textContent = value;
24394
+ }
24395
+ tr.title = row.threadId;
24396
+ }
24397
+ status.textContent = rows.length ? "" : text.empty;
24398
+ status.hidden = rows.length > 0;
24399
+ scroll.hidden = rows.length === 0;
24400
+ } catch (error51) {
24401
+ if (disposed || context.signal.aborted) return;
24402
+ status.textContent = error51 instanceof RendererMethodUnavailableError ? text.unavailable : text.failed;
24403
+ status.hidden = false;
24404
+ scroll.hidden = true;
24405
+ } finally {
24406
+ owner.clearTimeout(requestTimer);
24407
+ if (!disposed && !context.signal.aborted)
24408
+ timer = owner.setTimeout(() => void refresh(), 1e4);
24409
+ }
24410
+ };
24411
+ void refresh();
24412
+ return () => {
24413
+ disposed = true;
24414
+ owner.clearTimeout(timer);
24415
+ owner.clearTimeout(requestTimer);
24416
+ };
24417
+ }
24418
+
24419
+ // src/settings/preference-ui.ts
24420
+ var nextPreferenceId = 0;
24421
+ function preferenceId(prefix) {
24422
+ nextPreferenceId += 1;
24423
+ return `codexhost-${prefix}-${nextPreferenceId}`;
24424
+ }
24425
+ function createPreferenceGroup(document2, title) {
24426
+ const group = document2.createElement("section");
24427
+ group.className = "mt-7 first-of-type:mt-0";
24428
+ const header = document2.createElement("div");
24429
+ header.className = "mb-2 flex min-h-6 items-center gap-2 px-1";
24430
+ const heading = document2.createElement("h3");
24431
+ heading.id = preferenceId("preference-group");
24432
+ heading.className = "m-0 text-[13px] leading-5 font-semibold text-settings-text";
24433
+ heading.textContent = title;
24434
+ header.append(heading);
24435
+ const card = document2.createElement("div");
24436
+ card.className = "rounded-[10px] border border-settings-border bg-settings-panel";
24437
+ group.setAttribute("aria-labelledby", heading.id);
24438
+ group.append(header, card);
24439
+ return { group, header, card };
24440
+ }
24441
+ function createPreferenceItem(document2, input) {
24442
+ const item = document2.createElement("div");
24443
+ item.className = "flex min-h-[60px] items-center justify-between gap-6 border-t border-settings-divider px-4 py-3 first:border-t-0";
24444
+ const copy = document2.createElement("div");
24445
+ copy.className = "flex min-w-0 flex-col gap-0.5";
24446
+ const heading = document2.createElement("div");
24447
+ heading.className = "flex items-center gap-1.5";
24448
+ const title = document2.createElement("label");
24449
+ title.htmlFor = input.controlId;
24450
+ title.className = "cursor-pointer text-[13px] leading-5 font-medium text-settings-text";
24451
+ title.textContent = input.title;
24452
+ heading.append(title);
24453
+ if (input.help) heading.append(createHelpTooltip(document2, input.help.label, input.help.lines));
24454
+ const description = document2.createElement("div");
24455
+ description.id = preferenceId("preference-description");
24456
+ description.className = "text-xs leading-[18px] text-settings-muted data-[invalid=true]:text-settings-danger";
24457
+ description.textContent = input.description;
24458
+ copy.append(heading, description);
24459
+ item.append(copy);
24460
+ return { item, description };
24461
+ }
24462
+ function createHelpTooltip(document2, label, lines) {
24463
+ const wrapper = document2.createElement("span");
24464
+ wrapper.className = "group relative inline-flex";
24465
+ const button = document2.createElement("button");
24466
+ button.type = "button";
24467
+ button.className = "inline-flex size-4 cursor-help items-center justify-center rounded-full border-0 bg-transparent p-0 text-settings-subtle transition-colors hover:text-settings-text focus-visible:text-settings-text focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-settings-focus";
24468
+ button.setAttribute("aria-label", label);
24469
+ button.append(createRendererSettingsIcon("help", 14));
24470
+ const tooltip = document2.createElement("div");
24471
+ tooltip.id = preferenceId("preference-tooltip");
24472
+ tooltip.setAttribute("role", "tooltip");
24473
+ tooltip.className = "pointer-events-none invisible absolute top-full left-0 z-20 mt-2 w-80 rounded-lg border border-settings-border bg-settings-panel px-3 py-2.5 text-xs leading-[18px] font-normal text-settings-text opacity-0 shadow-[0_10px_30px_rgb(0_0_0/0.22)] transition-opacity duration-150 group-hover:visible group-hover:opacity-100 group-focus-within:visible group-focus-within:opacity-100";
24474
+ const list = document2.createElement("ul");
24475
+ list.className = "m-0 grid list-disc gap-1 pl-4 marker:text-settings-subtle";
24476
+ for (const line of lines) {
24477
+ const item = document2.createElement("li");
24478
+ item.textContent = line;
24479
+ list.append(item);
24480
+ }
24481
+ tooltip.append(list);
24482
+ button.setAttribute("aria-describedby", tooltip.id);
24483
+ button.addEventListener("keydown", (event) => {
24484
+ if (event.key === "Escape") button.blur();
24485
+ });
24486
+ wrapper.append(button, tooltip);
24487
+ return wrapper;
24488
+ }
24489
+ function createPreferenceSwitch(document2, id, describedBy) {
24490
+ const input = document2.createElement("input");
24491
+ input.type = "checkbox";
24492
+ input.id = id;
24493
+ input.setAttribute("role", "switch");
24494
+ input.setAttribute("aria-describedby", describedBy);
24495
+ input.className = "relative m-0 h-5 w-9 shrink-0 cursor-pointer appearance-none rounded-full bg-settings-surface-hover ring-1 ring-settings-border transition-colors ring-inset before:absolute before:top-0.5 before:left-0.5 before:size-4 before:rounded-full before:bg-white before:shadow-[0_1px_2px_rgb(0_0_0/0.3)] before:transition-transform checked:bg-settings-focus checked:ring-transparent checked:before:translate-x-4 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-settings-focus";
24496
+ return input;
24497
+ }
24498
+ function createNumberField(document2, input) {
24499
+ const field = document2.createElement("div");
24500
+ field.className = "flex h-8 shrink-0 items-center gap-1.5 rounded-md border border-settings-border bg-settings-surface px-2.5 transition-colors focus-within:border-settings-focus data-[invalid=true]:border-settings-danger";
24501
+ const control = document2.createElement("input");
24502
+ control.type = "number";
24503
+ control.id = input.id;
24504
+ control.min = String(input.min);
24505
+ control.max = String(input.max);
24506
+ control.step = "1";
24507
+ control.setAttribute("aria-describedby", input.describedBy);
24508
+ control.className = "w-14 border-0 bg-transparent p-0 text-right text-[13px] leading-5 text-settings-text tabular-nums outline-none";
24509
+ const unit = document2.createElement("span");
24510
+ unit.className = "text-xs text-settings-muted";
24511
+ unit.setAttribute("aria-hidden", "true");
24512
+ unit.textContent = input.unit;
24513
+ field.append(control, unit);
24514
+ return { field, control };
24515
+ }
24516
+
24517
+ // src/settings/idle-release-controls.ts
24518
+ function mountIdleReleaseControls(context, messages, getLoadedSessionsClient) {
24519
+ const { content } = context;
24520
+ const document2 = content.ownerDocument;
24521
+ const owner = document2.defaultView;
24522
+ if (!owner) return () => void 0;
24523
+ const { group, header, card } = createPreferenceGroup(document2, messages.idleReleaseSection);
24524
+ const status = document2.createElement("div");
24525
+ status.className = "group/status ml-auto inline-flex items-center gap-1.5 text-xs leading-[18px] text-settings-muted data-[state=failed]:text-settings-danger data-[state=unavailable]:text-settings-warning";
24526
+ const statusDot = document2.createElement("span");
24527
+ statusDot.setAttribute("aria-hidden", "true");
24528
+ statusDot.className = "size-1.5 shrink-0 rounded-full bg-settings-subtle group-data-[state=failed]/status:bg-settings-danger group-data-[state=unavailable]/status:bg-settings-warning";
24529
+ const statusText = document2.createElement("span");
24530
+ statusText.setAttribute("role", "status");
24531
+ status.append(statusDot, statusText);
24532
+ header.append(status);
24533
+ const enabledId = preferenceId("idle-release-enabled");
24534
+ const toggle = createPreferenceItem(document2, {
24535
+ title: messages.idleReleaseTitle,
24536
+ description: messages.idleReleaseDescription,
24537
+ controlId: enabledId,
24538
+ help: { label: messages.idleReleaseHelpLabel, lines: messages.idleReleaseHelp }
24539
+ });
24540
+ const enabled = createPreferenceSwitch(document2, enabledId, toggle.description.id);
24541
+ toggle.item.append(enabled);
24542
+ const minutesId = preferenceId("idle-release-minutes");
24543
+ const timeout = createPreferenceItem(document2, {
24544
+ title: messages.idleReleaseTimeout,
24545
+ description: messages.idleReleaseTimeoutDescription,
24546
+ controlId: minutesId
24547
+ });
24548
+ const { field, control: minutes } = createNumberField(document2, {
24549
+ id: minutesId,
24550
+ describedBy: timeout.description.id,
24551
+ unit: messages.idleReleaseMinutes,
24552
+ min: IDLE_RELEASE_TIMEOUT_MINUTES_MIN,
24553
+ max: IDLE_RELEASE_TIMEOUT_MINUTES_MAX
24554
+ });
24555
+ timeout.item.append(field);
24556
+ timeout.item.id = preferenceId("idle-release-timeout");
24557
+ enabled.setAttribute("aria-controls", timeout.item.id);
24558
+ card.append(toggle.item, timeout.item);
24559
+ content.append(group);
24560
+ const disposeTable = mountLoadedSessionsTable(
24561
+ { ...context, content: card },
24562
+ messages,
24563
+ getLoadedSessionsClient
24564
+ );
24565
+ const statusMessages = {
24566
+ pending: messages.idleReleasePending,
24567
+ unavailable: messages.idleReleaseUnavailable,
24568
+ failed: messages.idleReleaseFailed
24569
+ };
24570
+ const showStatus = (value) => {
24571
+ status.dataset.state = value;
24572
+ status.hidden = value === "applied";
24573
+ statusText.textContent = value === "applied" ? "" : statusMessages[value];
24574
+ };
24575
+ const setInvalid = (invalid) => {
24576
+ field.dataset.invalid = String(invalid);
24577
+ timeout.description.dataset.invalid = String(invalid);
24578
+ timeout.description.textContent = invalid ? messages.idleReleaseInvalid : messages.idleReleaseTimeoutDescription;
24579
+ minutes.setAttribute("aria-invalid", String(invalid));
24580
+ minutes.setCustomValidity(invalid ? messages.idleReleaseInvalid : "");
24581
+ };
24582
+ const sync = () => {
24583
+ const settings = readIdleReleasePreference(owner);
24584
+ enabled.checked = settings.enabled;
24585
+ timeout.item.hidden = !settings.enabled;
24586
+ if (!settings.enabled && minutes.getAttribute("aria-invalid") === "true") setInvalid(false);
24587
+ if (minutes.getAttribute("aria-invalid") !== "true") {
24588
+ minutes.value = String(settings.timeoutMinutes);
24589
+ }
24590
+ };
24591
+ const save = (settings) => {
24592
+ if (writeIdleReleasePreference(owner, settings)) return;
24593
+ sync();
24594
+ showStatus("failed");
24595
+ };
24596
+ enabled.addEventListener("change", () => {
24597
+ save({ ...readIdleReleasePreference(owner), enabled: enabled.checked });
24598
+ });
24599
+ minutes.addEventListener("change", () => {
24600
+ const parsed = idleReleaseSettingsSchema.safeParse({
24601
+ enabled: readIdleReleasePreference(owner).enabled,
24602
+ timeoutMinutes: minutes.valueAsNumber
24603
+ });
24604
+ setInvalid(!parsed.success);
24605
+ if (parsed.success) save(parsed.data);
24606
+ });
24607
+ minutes.addEventListener("input", () => {
24608
+ if (minutes.getAttribute("aria-invalid") === "true") setInvalid(false);
24609
+ });
24610
+ const storage = (event) => {
24611
+ if (event.key === IDLE_RELEASE_STORAGE_KEY || event.key === null) sync();
24612
+ };
24613
+ const onStatus = (event) => showStatus(event.detail);
24614
+ owner.addEventListener(IDLE_RELEASE_CHANGE_EVENT, sync);
24615
+ owner.addEventListener(IDLE_RELEASE_STATUS_EVENT, onStatus);
24616
+ owner.addEventListener("storage", storage);
24617
+ sync();
24618
+ showStatus("pending");
24619
+ owner.dispatchEvent(new Event(IDLE_RELEASE_CHANGE_EVENT));
24620
+ return () => {
24621
+ disposeTable();
24622
+ owner.removeEventListener(IDLE_RELEASE_CHANGE_EVENT, sync);
24623
+ owner.removeEventListener(IDLE_RELEASE_STATUS_EVENT, onStatus);
24624
+ owner.removeEventListener("storage", storage);
24625
+ };
24626
+ }
24627
+
24088
24628
  // src/settings/appearance-page.ts
24089
- function createAppearanceSettingsPage(messages) {
24629
+ function createAppearanceSettingsPage(messages, getLoadedSessionsClient = () => null) {
24090
24630
  return Object.freeze({
24091
24631
  id: "appearance",
24092
24632
  label: messages.pageLabels.appearance,
@@ -24101,30 +24641,34 @@ ${error51.stderrTail}`] : []
24101
24641
  const description = document2.createElement("p");
24102
24642
  description.className = "settings-page-description";
24103
24643
  description.textContent = messages.appearanceDescription;
24104
- const row = document2.createElement("label");
24105
- row.className = "settings-preference-row";
24106
- const copy = document2.createElement("span");
24107
- copy.className = "settings-preference-row__copy";
24108
- const title = document2.createElement("strong");
24109
- title.textContent = messages.reasoningSoftWrapTitle;
24110
- const detail = document2.createElement("span");
24111
- detail.textContent = messages.reasoningSoftWrapDescription;
24112
- copy.append(title, detail);
24113
- const checkbox = document2.createElement("input");
24114
- checkbox.type = "checkbox";
24115
- checkbox.className = "settings-preference-checkbox";
24116
- checkbox.checked = readReasoningTranscriptSoftWrap(ownerWindow);
24117
- checkbox.setAttribute("aria-label", messages.reasoningSoftWrapTitle);
24118
- checkbox.addEventListener("change", () => {
24119
- setReasoningTranscriptSoftWrap(ownerWindow, checkbox.checked);
24644
+ const { group, card } = createPreferenceGroup(document2, messages.appearanceGroup);
24645
+ const softWrapId = preferenceId("reasoning-soft-wrap");
24646
+ const row = createPreferenceItem(document2, {
24647
+ title: messages.reasoningSoftWrapTitle,
24648
+ description: messages.reasoningSoftWrapDescription,
24649
+ controlId: softWrapId
24650
+ });
24651
+ const toggle = createPreferenceSwitch(document2, softWrapId, row.description.id);
24652
+ toggle.checked = readReasoningTranscriptSoftWrap(ownerWindow);
24653
+ toggle.addEventListener("change", () => {
24654
+ setReasoningTranscriptSoftWrap(ownerWindow, toggle.checked);
24120
24655
  });
24121
24656
  const sync = () => {
24122
- checkbox.checked = readReasoningTranscriptSoftWrap(ownerWindow);
24657
+ toggle.checked = readReasoningTranscriptSoftWrap(ownerWindow);
24123
24658
  };
24124
24659
  ownerWindow.addEventListener(REASONING_SOFT_WRAP_CHANGE_EVENT, sync);
24125
- row.append(copy, checkbox);
24126
- context.content.append(heading, description, row);
24127
- return () => ownerWindow.removeEventListener(REASONING_SOFT_WRAP_CHANGE_EVENT, sync);
24660
+ row.item.append(toggle);
24661
+ card.append(row.item);
24662
+ context.content.append(heading, description, group);
24663
+ const disposeIdleRelease = mountIdleReleaseControls(
24664
+ context,
24665
+ messages,
24666
+ getLoadedSessionsClient
24667
+ );
24668
+ return () => {
24669
+ ownerWindow.removeEventListener(REASONING_SOFT_WRAP_CHANGE_EVENT, sync);
24670
+ disposeIdleRelease();
24671
+ };
24128
24672
  }
24129
24673
  });
24130
24674
  }
@@ -24326,7 +24870,6 @@ ${error51.stderrTail}`] : []
24326
24870
  trigger.type = "button";
24327
24871
  trigger.className = "settings-icon-button";
24328
24872
  trigger.title = input.triggerLabel ?? input.label;
24329
- trigger.disabled = input.disabled ?? false;
24330
24873
  trigger.dataset.accountFocus = input.focusKey;
24331
24874
  trigger.setAttribute("aria-label", trigger.title);
24332
24875
  trigger.setAttribute("aria-haspopup", "dialog");
@@ -24352,20 +24895,7 @@ ${error51.stderrTail}`] : []
24352
24895
  dialog.addEventListener("close", () => {
24353
24896
  if (trigger.isConnected && !trigger.disabled) trigger.focus({ preventScroll: true });
24354
24897
  });
24355
- dialog.addEventListener(
24356
- "click",
24357
- (event) => {
24358
- if (input.actions.some((action) => action.contains(event.target))) {
24359
- trigger.focus({ preventScroll: true });
24360
- dialog.close();
24361
- }
24362
- },
24363
- { capture: true }
24364
- );
24365
- const actions = document2.createElement("div");
24366
- actions.className = "settings-account-dialog__actions";
24367
- actions.append(...input.actions);
24368
- dialog.append(close, heading, description, actions);
24898
+ dialog.append(close, heading, description);
24369
24899
  trigger.addEventListener("click", () => dialog.showModal());
24370
24900
  root.append(trigger, dialog);
24371
24901
  return root;
@@ -24650,7 +25180,7 @@ ${error51.stderrTail}`] : []
24650
25180
  extra.append(renderUsageWindow(document2, window2, messages, display));
24651
25181
  return { cells, continuationCells, additional: extra };
24652
25182
  }
24653
- function renderAccountResetCredits(document2, credits, messages, options) {
25183
+ function renderAccountResetCredits(document2, credits, messages) {
24654
25184
  const resetCredits = credits.resetCredits;
24655
25185
  if (!resetCredits) return null;
24656
25186
  const summary = document2.createElement("button");
@@ -24696,15 +25226,6 @@ ${error51.stderrTail}`] : []
24696
25226
  copy.append(list);
24697
25227
  }
24698
25228
  details.append(copy);
24699
- if (options.onUseReset) {
24700
- const use = document2.createElement("button");
24701
- use.type = "button";
24702
- use.className = "settings-command-button settings-command-button--secondary";
24703
- use.textContent = options.usingReset ? messages.accountResetCreditsUsing : messages.accountResetCreditsUse;
24704
- use.disabled = options.resetDisabled;
24705
- use.addEventListener("click", options.onUseReset);
24706
- details.append(use);
24707
- }
24708
25229
  return { summary, details };
24709
25230
  }
24710
25231
 
@@ -24852,72 +25373,16 @@ ${error51.stderrTail}`] : []
24852
25373
  actionsCell.className = "settings-account-management-cell";
24853
25374
  const management = document2.createElement("div");
24854
25375
  management.className = "settings-account-management";
24855
- const actions = document2.createElement("div");
24856
- actions.className = "settings-account-actions";
24857
- const more = [];
24858
- if (!input.current) {
24859
- const activate = document2.createElement("button");
24860
- activate.type = "button";
24861
- activate.className = "settings-account-action";
24862
- activate.textContent = messages.accountUse;
24863
- activate.title = messages.accountDefaultHint;
24864
- activate.dataset.accountFocus = `${account.accountId}:activate`;
24865
- activate.disabled = input.actionsDisabled || input.switchDisabled;
24866
- activate.addEventListener("click", input.onActivate);
24867
- actions.append(activate);
24868
- }
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
25376
  if (input.usage) {
24879
25377
  const refresh = document2.createElement("button");
24880
25378
  refresh.type = "button";
24881
25379
  refresh.className = "settings-account-action";
24882
25380
  refresh.textContent = messages.accountCreditsRefresh;
24883
25381
  refresh.dataset.accountFocus = `${account.accountId}:refresh`;
24884
- refresh.disabled = input.actionsDisabled || input.usage.status === "loading";
25382
+ refresh.disabled = input.usage.status === "loading";
24885
25383
  refresh.addEventListener("click", input.onRetry);
24886
- more.push(refresh);
24887
- }
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 {
24898
- const remove = document2.createElement("button");
24899
- remove.type = "button";
24900
- remove.className = "settings-account-action settings-account-delete";
24901
- remove.textContent = messages.accountDelete;
24902
- remove.dataset.accountFocus = `${account.accountId}:delete`;
24903
- remove.setAttribute("aria-label", `${messages.accountDelete}: ${name.full}`);
24904
- remove.disabled = input.actionsDisabled || input.deleteDisabled;
24905
- remove.addEventListener("click", input.onDelete);
24906
- more.push(remove);
24907
- }
24908
- if (more.length)
24909
- actions.append(
24910
- createAccountDetails(document2, messages, {
24911
- label: messages.accountMore,
24912
- triggerLabel: `${name.full} \xB7 ${messages.accountMore}`,
24913
- description: name.full,
24914
- focusKey: `${account.accountId}:more`,
24915
- icon: "ellipsis",
24916
- disabled: input.actionsDisabled,
24917
- actions: more
24918
- })
24919
- );
24920
- management.append(actions);
25384
+ management.append(refresh);
25385
+ }
24921
25386
  actionsCell.append(management);
24922
25387
  const continuationRows = usage.continuationCells.map((cells) => {
24923
25388
  const continuation = document2.createElement("tr");
@@ -24933,7 +25398,7 @@ ${error51.stderrTail}`] : []
24933
25398
  actionsCell.className += " settings-account-spanning-cell";
24934
25399
  }
24935
25400
  row.append(personCell, ...usage.cells, actionsCell);
24936
- const reset = input.usage?.status === "ready" ? renderAccountResetCredits(document2, input.usage.credits, messages, input) : null;
25401
+ const reset = input.usage?.status === "ready" ? renderAccountResetCredits(document2, input.usage.credits, messages) : null;
24937
25402
  if (!reset) return [row, ...continuationRows];
24938
25403
  const detailsRow = document2.createElement("tr");
24939
25404
  detailsRow.className = "settings-account-details-row";
@@ -24995,8 +25460,7 @@ ${error51.stderrTail}`] : []
24995
25460
  label: `${account.harnessName} \xB7 ${messages.accountNativeManaged}`,
24996
25461
  description: messages.accountNativeManagementHint.replace("{harness}", account.harnessName),
24997
25462
  focusKey: `harness:${account.harnessId}:info`,
24998
- icon: "info",
24999
- actions: []
25463
+ icon: "info"
25000
25464
  });
25001
25465
  management.append(label, info);
25002
25466
  managementCell.append(management);
@@ -25119,11 +25583,7 @@ ${error51.stderrTail}`] : []
25119
25583
  heading.className = "settings-section-label";
25120
25584
  heading.textContent = messages.pageLabels.accounts;
25121
25585
  copy.append(heading);
25122
- const add = document2.createElement("button");
25123
- add.type = "button";
25124
- add.className = "settings-command-button";
25125
- add.append(createRendererSettingsIcon("add", 16), messages.accountAdd);
25126
- header.append(copy, add);
25586
+ header.append(copy);
25127
25587
  const status = document2.createElement("p");
25128
25588
  status.className = "settings-account-status";
25129
25589
  status.setAttribute("aria-live", "polite");
@@ -25184,86 +25644,21 @@ ${error51.stderrTail}`] : []
25184
25644
  let accountRevision = 0;
25185
25645
  let accountInstanceId;
25186
25646
  let hasAccountSnapshot = false;
25187
- let cleanupRequired = false;
25188
- let capabilities = {
25189
- manage: false,
25190
- switch: false,
25191
- login: false,
25192
- delete: false
25193
- };
25194
- let accountCreating = false;
25195
- let accountActivating = false;
25196
- let accountRecovering = false;
25197
- let accountLoggingOut = false;
25198
- let deletingAccountId = null;
25199
- let login = null;
25200
- let loginStartingAccountId = null;
25201
- let loginMessage = null;
25202
- let loginRefreshTimer;
25203
- let loginStartSnapshot;
25204
- const earlyLoginCompletions = /* @__PURE__ */ new Map();
25647
+ let loadMessage = null;
25205
25648
  const usageByAccountId = /* @__PURE__ */ new Map();
25206
- let usingResetAccountId = null;
25207
25649
  let usageDisplay = "remaining";
25208
25650
  const expandedResetAccounts = /* @__PURE__ */ new Set();
25209
- const accountBusy = () => accountCreating || accountActivating || accountRecovering || accountLoggingOut || accountPhase === "changing" || deletingAccountId !== null || login !== null || loginStartingAccountId !== null || usingResetAccountId !== null;
25210
- const clearLoginRefresh = () => {
25211
- if (loginRefreshTimer === void 0) return;
25212
- document2.defaultView?.clearTimeout(loginRefreshTimer);
25213
- loginRefreshTimer = void 0;
25214
- };
25215
- const scheduleLoginRefresh = () => {
25216
- clearLoginRefresh();
25217
- if (!login || context.signal.aborted) return;
25218
- loginRefreshTimer = document2.defaultView?.setTimeout(() => {
25219
- loginRefreshTimer = void 0;
25220
- if (!login || context.signal.aborted) return;
25221
- void context.runLatest(
25222
- () => client().refreshCodexAccounts?.() ?? client().listCodexAccounts(),
25223
- {
25224
- success(result) {
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)) {
25229
- login = null;
25230
- loginStartSnapshot = void 0;
25231
- loginMessage = messages.accountLoginResultUnconfirmed;
25232
- render();
25233
- return;
25234
- }
25235
- scheduleLoginRefresh();
25236
- },
25237
- failure() {
25238
- scheduleLoginRefresh();
25239
- }
25240
- }
25241
- );
25242
- }, 750);
25243
- };
25244
25651
  const render = () => {
25245
25652
  const restoreFocus = accountListFocusRestorer(list, search);
25246
25653
  body.replaceChildren();
25247
25654
  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
- }
25655
+ if (loadMessage) status.append(loadMessage);
25260
25656
  connectedCount.textContent = String(accounts.length + harnessAccounts.accounts.length);
25261
25657
  updateDisplay(usageDisplay);
25262
- search.disabled = login !== null || loginStartingAccountId !== null;
25263
25658
  for (const [display, button] of displayButtons) {
25264
25659
  button.setAttribute("aria-pressed", String(display === usageDisplay));
25265
25660
  }
25266
- refreshUsage.disabled = (!getClient()?.inspectCodexAccountUsage || accounts.length === 0) && !getClient()?.listHarnessAccounts || harnessAccounts?.refreshing === true || [...usageByAccountId.values()].some((usage) => usage.status === "loading") || accountBusy();
25661
+ refreshUsage.disabled = (!getClient()?.inspectCodexAccountUsage || accounts.length === 0) && !getClient()?.listHarnessAccounts || harnessAccounts?.refreshing === true || [...usageByAccountId.values()].some((usage) => usage.status === "loading");
25267
25662
  const query = search.value.trim().toLocaleLowerCase();
25268
25663
  const visibleAccounts = accounts.filter(
25269
25664
  (account) => `Codex ${account.email ?? ""} ${account.label} ${accountPlanLabel(account.planType) ?? ""}`.toLocaleLowerCase().includes(query)
@@ -25280,25 +25675,13 @@ ${error51.stderrTail}`] : []
25280
25675
  emptyRow.append(emptyCell);
25281
25676
  body.append(emptyRow);
25282
25677
  }
25283
- add.disabled = accountBusy() || !capabilities.login;
25284
25678
  for (const account of visibleAccounts) {
25285
25679
  body.append(
25286
25680
  ...renderAccountRows(document2, account, messages, {
25287
25681
  current: accountPhase === "ready" && account.accountId === currentAccountId,
25288
25682
  usage: usageByAccountId.get(account.accountId),
25289
25683
  display: usageDisplay,
25290
- actionsDisabled: accountBusy(),
25291
- switchDisabled: !capabilities.switch,
25292
- loginDisabled: !capabilities.login,
25293
- deleteDisabled: !capabilities.delete,
25294
- logoutDisabled: !capabilities.logout,
25295
- usingReset: usingResetAccountId === account.accountId,
25296
- resetDisabled: accountBusy(),
25297
25684
  resetExpanded: expandedResetAccounts.has(account.accountId),
25298
- onActivate: () => switchAccount(account.accountId),
25299
- onSignIn: () => startLogin(account.accountId),
25300
- onDelete: () => deleteAccount(account.accountId),
25301
- onLogout: logoutAccount,
25302
25685
  onRetry: () => {
25303
25686
  usageByAccountId.delete(account.accountId);
25304
25687
  loadUsage(accounts);
@@ -25306,96 +25689,9 @@ ${error51.stderrTail}`] : []
25306
25689
  onResetExpanded: (open) => {
25307
25690
  if (open) expandedResetAccounts.add(account.accountId);
25308
25691
  else expandedResetAccounts.delete(account.accountId);
25309
- },
25310
- ...account.accountId === currentAccountId && accountPhase === "ready" && getClient()?.consumeCodexAccountResetCredit ? { onUseReset: () => useReset(account.accountId) } : {}
25692
+ }
25311
25693
  })
25312
25694
  );
25313
- if (login?.accountId === account.accountId) {
25314
- const verification = document2.createElement("div");
25315
- verification.className = "settings-account-verification";
25316
- const prompt = document2.createElement("span");
25317
- prompt.textContent = messages.accountVerificationDescription;
25318
- const link = document2.createElement("a");
25319
- link.href = login.verificationUrl;
25320
- link.target = "_blank";
25321
- link.rel = "noopener noreferrer";
25322
- link.textContent = login.verificationUrl;
25323
- link.addEventListener("click", (event) => {
25324
- const bridge = document2.defaultView?.electronBridge;
25325
- if (typeof bridge?.sendMessageFromView !== "function") return;
25326
- event.preventDefault();
25327
- void Promise.resolve(
25328
- bridge.sendMessageFromView({
25329
- type: "open-in-browser",
25330
- url: login?.verificationUrl ?? link.href,
25331
- initiator: "open_in_browser_bridge",
25332
- openTarget: "external-browser",
25333
- source: "manual"
25334
- })
25335
- ).catch(() => void 0);
25336
- });
25337
- const code = document2.createElement("code");
25338
- code.textContent = login.userCode;
25339
- const copyCode = document2.createElement("button");
25340
- copyCode.type = "button";
25341
- copyCode.className = "settings-command-button settings-command-button--secondary";
25342
- copyCode.textContent = messages.accountCopyCode;
25343
- copyCode.addEventListener("click", () => {
25344
- void document2.defaultView?.navigator.clipboard?.writeText(login?.userCode ?? "").then(() => {
25345
- copyCode.textContent = messages.accountCopied;
25346
- });
25347
- });
25348
- const cancel = document2.createElement("button");
25349
- cancel.type = "button";
25350
- cancel.className = "settings-command-button settings-command-button--secondary";
25351
- cancel.textContent = messages.accountLoginCancel;
25352
- cancel.addEventListener(
25353
- "click",
25354
- () => cancelLogin(login?.accountId ?? "", login?.loginId ?? "")
25355
- );
25356
- verification.append(prompt, link, code, copyCode, cancel);
25357
- const verificationRow = document2.createElement("tr");
25358
- const verificationCell = document2.createElement("td");
25359
- verificationCell.colSpan = 4;
25360
- verificationCell.append(verification);
25361
- verificationRow.append(verificationCell);
25362
- body.append(verificationRow);
25363
- }
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
25695
  }
25400
25696
  for (const account of visibleHarnessAccounts) {
25401
25697
  body.append(...renderHarnessAccountRows(document2, account, messages, usageDisplay));
@@ -25462,8 +25758,6 @@ ${error51.stderrTail}`] : []
25462
25758
  accountPhase = result.phase;
25463
25759
  accountRevision = result.revision;
25464
25760
  accountInstanceId = result.instanceId;
25465
- cleanupRequired = result.cleanupRequired ?? false;
25466
- capabilities = result.capabilities;
25467
25761
  for (const accountId of expandedResetAccounts) {
25468
25762
  if (!accounts.some((account) => account.accountId === accountId))
25469
25763
  expandedResetAccounts.delete(accountId);
@@ -25483,238 +25777,25 @@ ${error51.stderrTail}`] : []
25483
25777
  }
25484
25778
  );
25485
25779
  };
25486
- const load = (keepMessage = false) => {
25780
+ const load = () => {
25487
25781
  void context.runLatest(() => client().listCodexAccounts(), {
25488
25782
  success(result) {
25489
- if (!keepMessage) loginMessage = null;
25783
+ loadMessage = null;
25490
25784
  setAccounts(result);
25491
25785
  refreshInBackground();
25492
25786
  },
25493
25787
  failure(error51) {
25494
- loginMessage = errorMessage(error51, messages.accountLoadFailed);
25495
- render();
25496
- }
25497
- });
25498
- };
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;
25522
- accountActivating = true;
25523
- loginMessage = null;
25524
- render();
25525
- void context.runLatest(() => client().switchCodexAccount({ accountId }), {
25526
- success() {
25527
- accountActivating = false;
25528
- loginMessage = null;
25529
- usageByAccountId.delete(accountId);
25530
- load();
25531
- },
25532
- failure(error51) {
25533
- accountActivating = false;
25534
- loginMessage = errorMessage(error51, messages.accountLoadFailed);
25535
- render();
25536
- }
25537
- });
25538
- };
25539
- const startLogin = (accountId) => {
25540
- if (accountBusy() || !capabilities.login) return;
25541
- loginStartingAccountId = accountId ?? "new";
25542
- loginStartSnapshot = { instanceId: accountInstanceId, revision: accountRevision };
25543
- loginMessage = messages.accountSigningIn;
25544
- 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
- }
25560
- }
25561
- );
25562
- };
25563
- const createAndLogin = () => {
25564
- if (accountBusy() || !capabilities.login) return;
25565
- accountCreating = true;
25566
- loginStartSnapshot = { instanceId: accountInstanceId, revision: accountRevision };
25567
- loginMessage = messages.accountSigningIn;
25568
- render();
25569
- void context.runLatest(() => client().startCodexAccountLogin({}), {
25570
- success(result) {
25571
- accountCreating = false;
25572
- loginMessage = null;
25573
- search.value = "";
25574
- reconcileLoginStart(result);
25575
- },
25576
- failure(error51) {
25577
- accountCreating = false;
25578
- loginStartSnapshot = void 0;
25579
- earlyLoginCompletions.clear();
25580
- loginMessage = errorMessage(error51, messages.accountLoginFailed);
25581
- render();
25582
- }
25583
- });
25584
- };
25585
- const resetOutcomeMessage = (outcome) => {
25586
- if (outcome === "reset") return messages.accountResetCreditsSucceeded;
25587
- if (outcome === "nothingToReset") return messages.accountResetCreditsNothingToReset;
25588
- if (outcome === "noCredit") return messages.accountResetCreditsNoCredit;
25589
- return messages.accountResetCreditsAlreadyRedeemed;
25590
- };
25591
- const useReset = (accountId) => {
25592
- const consume = getClient()?.consumeCodexAccountResetCredit;
25593
- if (!consume || accountBusy()) return;
25594
- if (document2.defaultView?.confirm?.(messages.accountResetCreditsConfirm) === false) return;
25595
- usingResetAccountId = accountId;
25596
- loginMessage = messages.accountResetCreditsUsing;
25597
- render();
25598
- void context.runLatest(() => consume({ accountId, idempotencyKey: crypto.randomUUID() }), {
25599
- success(result) {
25600
- usingResetAccountId = null;
25601
- loginMessage = resetOutcomeMessage(result.outcome);
25602
- if (result.accountCredits) {
25603
- usageByAccountId.set(accountId, {
25604
- status: "ready",
25605
- credits: result.accountCredits,
25606
- freshness: "live",
25607
- observedAt: (/* @__PURE__ */ new Date()).toISOString()
25608
- });
25609
- } else if (result.outcome === "reset") {
25610
- usageByAccountId.delete(accountId);
25611
- loadUsage(accounts);
25612
- }
25613
- render();
25614
- },
25615
- failure(error51) {
25616
- usingResetAccountId = null;
25617
- loginMessage = errorMessage(error51, messages.accountResetCreditsFailed);
25618
- render();
25619
- }
25620
- });
25621
- };
25622
- const deleteAccount = (accountId) => {
25623
- const account = accounts.find((candidate) => candidate.accountId === accountId);
25624
- if (!account || account.accountId === currentAccountId || !capabilities.delete || accountBusy())
25625
- return;
25626
- if (document2.defaultView?.confirm?.(messages.accountDeleteConfirm) === false) return;
25627
- deletingAccountId = accountId;
25628
- loginMessage = messages.accountDeleting;
25629
- render();
25630
- void context.runLatest(() => client().deleteCodexAccount({ accountId }), {
25631
- success() {
25632
- deletingAccountId = null;
25633
- loginMessage = null;
25634
- load();
25635
- },
25636
- failure(error51) {
25637
- deletingAccountId = null;
25638
- loginMessage = errorMessage(error51, messages.accountDeleteFailed);
25639
- render();
25640
- }
25641
- });
25642
- };
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);
25788
+ loadMessage = errorMessage(error51, messages.accountLoadFailed);
25677
25789
  render();
25678
25790
  }
25679
25791
  });
25680
25792
  };
25681
- const cancelLogin = (_accountId, loginId) => {
25682
- void context.runLatest(() => client().cancelCodexAccountLogin({ loginId }), {
25683
- success() {
25684
- clearLoginRefresh();
25685
- earlyLoginCompletions.clear();
25686
- login = null;
25687
- loginStartSnapshot = void 0;
25688
- loginMessage = null;
25689
- render();
25690
- },
25691
- failure(error51) {
25692
- loginMessage = errorMessage(error51, messages.accountLoginFailed);
25693
- render();
25694
- }
25695
- });
25696
- };
25697
- add.addEventListener("click", createAndLogin);
25698
- let unsubscribe;
25699
25793
  let unsubscribeAccounts;
25700
25794
  try {
25701
25795
  unsubscribeAccounts = getClient()?.subscribeCodexAccounts?.((result) => {
25702
25796
  setAccounts(result);
25703
25797
  render();
25704
25798
  });
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
- }
25717
- });
25718
25799
  } catch {
25719
25800
  }
25720
25801
  const harnessAccounts = createHarnessAccounts(context.signal, getClient, render);
@@ -25722,9 +25803,6 @@ ${error51.stderrTail}`] : []
25722
25803
  load();
25723
25804
  return () => {
25724
25805
  stopCountdowns();
25725
- clearLoginRefresh();
25726
- earlyLoginCompletions.clear();
25727
- unsubscribe?.();
25728
25806
  unsubscribeAccounts?.();
25729
25807
  };
25730
25808
  }
@@ -26210,12 +26288,12 @@ ${error51.stderrTail}`] : []
26210
26288
  }
26211
26289
  });
26212
26290
  }
26213
- function createDefaultRendererSettingsPages(messages = DEFAULT_RENDERER_SETTINGS_MESSAGES, getUpdateClient = () => null, getDiagnostics = () => null, getAccountClient = () => null, getSessionImportClient = () => null, openImportedThread = () => Promise.reject(new Error("Imported Thread navigation is unavailable"))) {
26291
+ function createDefaultRendererSettingsPages(messages = DEFAULT_RENDERER_SETTINGS_MESSAGES, getUpdateClient = () => null, getDiagnostics = () => null, getAccountClient = () => null, getSessionImportClient = () => null, openImportedThread = () => Promise.reject(new Error("Imported Thread navigation is unavailable")), getLoadedSessionsClient = () => null) {
26214
26292
  return Object.freeze([
26215
26293
  createConnectionsSettingsPage(messages, getDiagnostics),
26216
26294
  createAccountsSettingsPage(messages, getAccountClient),
26217
26295
  createSessionImportSettingsPage(messages, getSessionImportClient, openImportedThread),
26218
- createAppearanceSettingsPage(messages),
26296
+ createAppearanceSettingsPage(messages, getLoadedSessionsClient),
26219
26297
  updatesPage(messages, getUpdateClient),
26220
26298
  aboutPage(messages)
26221
26299
  ]);
@@ -26234,10 +26312,1966 @@ ${error51.stderrTail}`] : []
26234
26312
  }
26235
26313
 
26236
26314
  // src/settings/shell.css
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';
26315
+ var shell_default = `:host {
26316
+ --settings-titlebar-height: env(titlebar-area-height, 0px);
26317
+ --settings-bg: light-dark(#ffffff, #202020);
26318
+ --settings-sidebar: light-dark(#f7f7f8, #191919);
26319
+ --settings-panel: light-dark(#ffffff, #232323);
26320
+ --settings-surface: light-dark(#f6f6f6, #292929);
26321
+ --settings-surface-hover: light-dark(#eeeeee, #303030);
26322
+ --settings-inset: light-dark(#f3f3f3, #161616);
26323
+ --settings-text: light-dark(#0d0d0d, #ececec);
26324
+ --settings-muted: light-dark(#676767, #a3a3a3);
26325
+ --settings-subtle: light-dark(#8a8a8a, #777777);
26326
+ --settings-border: light-dark(rgb(13 13 13 / 9%), rgb(255 255 255 / 9%));
26327
+ --settings-divider: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 7%));
26328
+ --settings-hover: light-dark(rgb(13 13 13 / 5%), rgb(255 255 255 / 7%));
26329
+ --settings-active: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 9%));
26330
+ --settings-focus: light-dark(#0b75d1, #66aaf9);
26331
+ --settings-primary: light-dark(#171717, #f4f4f4);
26332
+ --settings-primary-hover: light-dark(#2f2f2f, #ffffff);
26333
+ --settings-primary-text: light-dark(#ffffff, #171717);
26334
+ --settings-warning: light-dark(#8a5500, #f5c96a);
26335
+ --settings-warning-bg: light-dark(#fff8e6, rgb(245 201 106 / 8%));
26336
+ --settings-warning-border: light-dark(#ead8a8, rgb(245 201 106 / 24%));
26337
+ --settings-danger: light-dark(#b42318, #f87171);
26338
+ --settings-danger-bg: light-dark(#fff1f0, rgb(239 68 68 / 8%));
26339
+ --settings-danger-border: light-dark(#f3c7c3, rgb(239 68 68 / 22%));
26340
+ --settings-success: light-dark(#16784a, #4ade80);
26341
+ color: var(--settings-text);
26342
+ color-scheme: inherit;
26343
+ font:
26344
+ 13px/1.5 system-ui,
26345
+ -apple-system,
26346
+ BlinkMacSystemFont,
26347
+ "Segoe UI",
26348
+ sans-serif;
26349
+ letter-spacing: 0;
26350
+ }
26351
+
26352
+ /* Element defaults stay below Tailwind utilities; unlayered component classes still override them. */
26353
+ @layer base {
26354
+ *,
26355
+ *::before,
26356
+ *::after {
26357
+ box-sizing: border-box;
26358
+ letter-spacing: 0;
26359
+ }
26360
+
26361
+ button,
26362
+ input,
26363
+ select {
26364
+ font: inherit;
26365
+ }
26366
+
26367
+ button {
26368
+ color: inherit;
26369
+ }
26370
+ }
26371
+
26372
+ [hidden] {
26373
+ display: none !important;
26374
+ }
26375
+
26376
+ .settings-visually-hidden {
26377
+ position: absolute;
26378
+ width: 1px;
26379
+ height: 1px;
26380
+ padding: 0;
26381
+ margin: -1px;
26382
+ overflow: hidden;
26383
+ clip-path: inset(50%);
26384
+ white-space: nowrap;
26385
+ border: 0;
26386
+ }
26387
+
26388
+ .codexhost-settings-dialog {
26389
+ /* Native window controls sit above the DOM top layer. Center below them. */
26390
+ inset: var(--settings-titlebar-height) 0 0;
26391
+ width: min(1120px, calc(100vw - 32px));
26392
+ height: min(780px, calc(100vh - var(--settings-titlebar-height) - 32px));
26393
+ -webkit-app-region: no-drag;
26394
+ max-width: none;
26395
+ max-height: none;
26396
+ margin: auto;
26397
+ padding: 0;
26398
+ overflow: hidden;
26399
+ color: var(--settings-text);
26400
+ background: var(--settings-bg);
26401
+ border: 1px solid var(--settings-border);
26402
+ border-radius: 14px;
26403
+ box-shadow: light-dark(0 16px 42px rgb(0 0 0 / 16%), 0 20px 54px rgb(0 0 0 / 42%));
26404
+ }
26405
+
26406
+ .codexhost-settings-dialog::backdrop {
26407
+ /* Backdrops do not inherit the shell's custom properties. */
26408
+ top: env(titlebar-area-height, 0px);
26409
+ -webkit-app-region: no-drag;
26410
+ background: light-dark(rgb(0 0 0 / 24%), rgb(0 0 0 / 56%));
26411
+ backdrop-filter: blur(1px);
26412
+ }
26413
+
26414
+ .settings-frame,
26415
+ .settings-layout {
26416
+ width: 100%;
26417
+ height: 100%;
26418
+ min-width: 0;
26419
+ min-height: 0;
26420
+ }
26421
+
26422
+ .settings-frame {
26423
+ display: flex;
26424
+ flex-direction: column;
26425
+ }
26426
+
26427
+ .settings-layout {
26428
+ flex: 1;
26429
+ display: grid;
26430
+ grid-template-columns: 184px minmax(0, 1fr);
26431
+ background: var(--settings-bg);
26432
+ }
26433
+
26434
+ .settings-sidebar {
26435
+ display: flex;
26436
+ min-width: 0;
26437
+ min-height: 0;
26438
+ flex-direction: column;
26439
+ overflow: hidden;
26440
+ background: var(--settings-sidebar);
26441
+ border-right: 1px solid var(--settings-border);
26442
+ padding-top: 14px;
26443
+ }
26444
+
26445
+ .settings-header {
26446
+ display: flex;
26447
+ align-items: center;
26448
+ min-width: 0;
26449
+ height: 48px;
26450
+ flex: none;
26451
+ padding: 0 12px;
26452
+ border-bottom: 1px solid var(--settings-border);
26453
+ }
26454
+
26455
+ .settings-header-actions {
26456
+ display: flex;
26457
+ align-items: center;
26458
+ flex: none;
26459
+ gap: 12px;
26460
+ margin-left: auto;
26461
+ }
26462
+
26463
+ .settings-brand {
26464
+ display: flex;
26465
+ align-items: center;
26466
+ min-width: 0;
26467
+ gap: 7px;
26468
+ }
26469
+
26470
+ .settings-brand__mark {
26471
+ display: inline-flex;
26472
+ align-items: center;
26473
+ justify-content: center;
26474
+ width: 26px;
26475
+ height: 26px;
26476
+ flex: none;
26477
+ color: var(--settings-text);
26478
+ }
26479
+
26480
+ .settings-brand__mark .codexhost-settings-icon {
26481
+ width: 24px;
26482
+ height: 24px;
26483
+ object-fit: contain;
26484
+ }
26485
+
26486
+ .settings-brand__copy {
26487
+ display: flex;
26488
+ min-width: 0;
26489
+ align-items: baseline;
26490
+ gap: 0;
26491
+ line-height: 20px;
26492
+ }
26493
+
26494
+ .settings-brand__name {
26495
+ overflow: hidden;
26496
+ color: var(--settings-text);
26497
+ font-size: 13px;
26498
+ font-weight: 600;
26499
+ text-overflow: ellipsis;
26500
+ white-space: nowrap;
26501
+ }
26502
+
26503
+ .settings-brand__title {
26504
+ margin-left: 8px;
26505
+ padding-left: 8px;
26506
+ color: var(--settings-muted);
26507
+ font-size: 13px;
26508
+ font-weight: 400;
26509
+ border-left: 1px solid var(--settings-border);
26510
+ }
26511
+
26512
+ .settings-nav {
26513
+ display: flex;
26514
+ min-width: 0;
26515
+ min-height: 0;
26516
+ flex: 1;
26517
+ flex-direction: column;
26518
+ gap: 2px;
26519
+ padding: 0 7px 10px;
26520
+ overflow-y: auto;
26521
+ }
26522
+
26523
+ .settings-nav-section-label {
26524
+ min-height: 24px;
26525
+ padding: 4px 9px 2px;
26526
+ color: var(--settings-subtle);
26527
+ font-size: 11px;
26528
+ font-weight: 600;
26529
+ line-height: 18px;
26530
+ }
26531
+
26532
+ .settings-nav-section-label:not(:first-child) {
26533
+ margin-top: 8px;
26534
+ }
26535
+
26536
+ .settings-nav-button {
26537
+ display: grid;
26538
+ grid-template-columns: 16px minmax(0, 1fr);
26539
+ align-items: center;
26540
+ width: 100%;
26541
+ position: relative;
26542
+ min-height: 34px;
26543
+ flex: none;
26544
+ gap: 9px;
26545
+ padding: 6px 9px;
26546
+ color: var(--settings-text);
26547
+ font-size: 13px;
26548
+ line-height: 20px;
26549
+ text-align: left;
26550
+ background: transparent;
26551
+ border: 0;
26552
+ border-radius: 8px;
26553
+ cursor: pointer;
26554
+ }
26555
+
26556
+ .settings-nav-button .codexhost-settings-icon {
26557
+ width: 16px;
26558
+ height: 16px;
26559
+ opacity: 0.9;
26560
+ }
26561
+
26562
+ .settings-nav-button:hover {
26563
+ background: var(--settings-hover);
26564
+ }
26565
+
26566
+ .settings-nav-button[aria-current="page"] {
26567
+ background: var(--settings-active);
26568
+ color: var(--settings-text);
26569
+ font-weight: 500;
26570
+ }
26571
+
26572
+ .settings-nav-button span {
26573
+ min-width: 0;
26574
+ overflow: hidden;
26575
+ text-overflow: ellipsis;
26576
+ white-space: nowrap;
26577
+ }
26578
+
26579
+ .settings-nav-star-link {
26580
+ margin-top: 0;
26581
+ color: var(--settings-text);
26582
+ text-decoration: none;
26583
+ }
26584
+
26585
+ .settings-nav-star-link .codexhost-settings-icon {
26586
+ color: var(--settings-warning);
26587
+ }
26588
+
26589
+ .settings-nav-star-link:hover {
26590
+ color: var(--settings-warning);
26591
+ background: var(--settings-warning-bg);
26592
+ }
26593
+
26594
+ .settings-icon-button {
26595
+ display: inline-flex;
26596
+ align-items: center;
26597
+ justify-content: center;
26598
+ width: 28px;
26599
+ height: 28px;
26600
+ flex: none;
26601
+ padding: 0;
26602
+ color: var(--settings-muted);
26603
+ background: transparent;
26604
+ border: 0;
26605
+ border-radius: 8px;
26606
+ cursor: pointer;
26607
+ }
26608
+
26609
+ .settings-icon-button:hover {
26610
+ color: var(--settings-text);
26611
+ background: var(--settings-hover);
26612
+ }
26613
+
26614
+ .settings-icon-button:focus-visible,
26615
+ .settings-nav-button:focus-visible {
26616
+ outline: 2px solid var(--settings-focus);
26617
+ outline-offset: 1px;
26618
+ }
26619
+
26620
+ .settings-page {
26621
+ display: block;
26622
+ position: relative;
26623
+ min-width: 0;
26624
+ min-height: 0;
26625
+ overflow-y: auto;
26626
+ background: var(--settings-bg);
26627
+ scrollbar-gutter: stable;
26628
+ }
26629
+
26630
+ .settings-page__content {
26631
+ width: min(930px, calc(100% - 80px));
26632
+ margin-inline: auto;
26633
+ }
26634
+
26635
+ .settings-page__content {
26636
+ min-width: 0;
26637
+ padding: 28px 0 36px;
26638
+ }
26639
+
26640
+ .settings-section-label {
26641
+ min-height: auto;
26642
+ margin: 0;
26643
+ padding: 0 0 18px;
26644
+ color: var(--settings-text);
26645
+ font-size: 18px;
26646
+ font-weight: 600;
26647
+ line-height: 26px;
26648
+ }
26649
+
26650
+ .settings-status-list,
26651
+ .settings-empty {
26652
+ overflow: hidden;
26653
+ background: var(--settings-panel);
26654
+ }
26655
+
26656
+ .settings-status-row {
26657
+ display: grid;
26658
+ grid-template-columns: minmax(170px, 1fr) auto minmax(280px, 1.45fr);
26659
+ position: relative;
26660
+ align-items: center;
26661
+ min-height: 72px;
26662
+ gap: 20px;
26663
+ padding: 12px 0;
26664
+ }
26665
+
26666
+ .settings-status-row:not(:last-child)::after {
26667
+ content: "";
26668
+ position: absolute;
26669
+ right: 0;
26670
+ bottom: 0;
26671
+ left: 0;
26672
+ height: 1px;
26673
+ background: var(--settings-divider);
26674
+ }
26675
+
26676
+ .settings-status-row__identity {
26677
+ display: inline-flex;
26678
+ align-items: center;
26679
+ min-width: 0;
26680
+ color: var(--settings-text);
26681
+ gap: 10px;
26682
+ font-size: 14px;
26683
+ font-weight: 500;
26684
+ line-height: 22px;
26685
+ }
26686
+
26687
+ .settings-status-row__icon {
26688
+ display: inline-flex;
26689
+ align-items: center;
26690
+ justify-content: center;
26691
+ width: 36px;
26692
+ height: 36px;
26693
+ flex: none;
26694
+ color: var(--settings-muted);
26695
+ background: var(--settings-surface);
26696
+ border-radius: 50%;
26697
+ }
26698
+
26699
+ .settings-status-badge {
26700
+ flex: none;
26701
+ padding: 3px 8px;
26702
+ color: var(--settings-muted);
26703
+ font-size: 11px;
26704
+ font-weight: 500;
26705
+ line-height: 18px;
26706
+ background: var(--settings-surface);
26707
+ border: 1px solid var(--settings-border);
26708
+ border-radius: 6px;
26709
+ }
26710
+
26711
+ .settings-status-row__detail {
26712
+ min-width: 0;
26713
+ color: var(--settings-muted);
26714
+ font-size: 13px;
26715
+ line-height: 20px;
26716
+ }
26717
+
26718
+ .settings-page-description {
26719
+ max-width: 760px;
26720
+ margin: -10px 0 20px;
26721
+ color: var(--settings-muted);
26722
+ font-size: 12px;
26723
+ line-height: 18px;
26724
+ }
26725
+
26726
+ .settings-session-import-header {
26727
+ display: flex;
26728
+ align-items: flex-start;
26729
+ justify-content: space-between;
26730
+ gap: 24px;
26731
+ }
26732
+
26733
+ .settings-session-import-header .settings-section-label {
26734
+ min-width: 0;
26735
+ }
26736
+
26737
+ .settings-session-import-harness {
26738
+ display: flex;
26739
+ align-items: center;
26740
+ min-width: 0;
26741
+ gap: 12px;
26742
+ margin: -12px 0 16px;
26743
+ color: var(--settings-muted);
26744
+ font-size: 13px;
26745
+ }
26746
+
26747
+ .settings-session-import-harness > span {
26748
+ flex: none;
26749
+ }
26750
+
26751
+ .settings-session-import-harness__options {
26752
+ display: flex;
26753
+ align-items: center;
26754
+ min-width: 0;
26755
+ flex: 1;
26756
+ gap: 6px;
26757
+ overflow-x: auto;
26758
+ overflow-y: hidden;
26759
+ scrollbar-width: none;
26760
+ }
26761
+
26762
+ .settings-session-import-harness__options::-webkit-scrollbar {
26763
+ display: none;
26764
+ }
26765
+
26766
+ .settings-session-import-harness__option {
26767
+ min-height: 32px;
26768
+ flex: none;
26769
+ padding: 6px 10px;
26770
+ color: var(--settings-muted);
26771
+ font: inherit;
26772
+ font-size: 12px;
26773
+ white-space: nowrap;
26774
+ background: rgb(255 255 255 / 4%);
26775
+ border: 1px solid var(--settings-border);
26776
+ border-radius: 6px;
26777
+ cursor: pointer;
26778
+ }
26779
+
26780
+ .settings-session-import-harness__option[aria-pressed="true"] {
26781
+ color: var(--settings-text);
26782
+ background: var(--settings-active);
26783
+ border-color: rgb(51 156 255 / 50%);
26784
+ }
26785
+
26786
+ .settings-session-import-harness__option:disabled {
26787
+ opacity: 0.38;
26788
+ cursor: not-allowed;
26789
+ }
26790
+
26791
+ .settings-session-import-harness__option:focus-visible {
26792
+ outline: 2px solid var(--settings-focus);
26793
+ outline-offset: 2px;
26794
+ }
26795
+
26796
+ .settings-session-import-harness + .settings-page-description {
26797
+ margin-top: 0;
26798
+ margin-bottom: 4px;
26799
+ }
26800
+
26801
+ .settings-session-import-availability-note {
26802
+ margin-top: 0;
26803
+ }
26804
+
26805
+ .settings-session-import-search,
26806
+ .settings-session-import-pagination {
26807
+ display: flex;
26808
+ flex-wrap: wrap;
26809
+ align-items: center;
26810
+ gap: 10px;
26811
+ margin: 16px 0;
26812
+ }
26813
+
26814
+ .settings-session-import-search input {
26815
+ flex: 1;
26816
+ min-width: 160px;
26817
+ }
26818
+
26819
+ .settings-session-import-search input,
26820
+ .settings-session-import-pagination select {
26821
+ min-height: 36px;
26822
+ padding: 6px 10px;
26823
+ color: var(--settings-text);
26824
+ background: var(--settings-bg);
26825
+ border: 1px solid var(--settings-border);
26826
+ border-radius: 6px;
26827
+ }
26828
+
26829
+ .settings-session-import-search input:focus-visible,
26830
+ .settings-session-import-pagination select:focus-visible {
26831
+ outline: 2px solid var(--settings-focus);
26832
+ outline-offset: 2px;
26833
+ }
26834
+
26835
+ .settings-session-import-pagination {
26836
+ color: var(--settings-muted);
26837
+ font-size: 12px;
26838
+ }
26839
+
26840
+ .settings-session-import-pagination label {
26841
+ display: flex;
26842
+ align-items: center;
26843
+ gap: 8px;
26844
+ }
26845
+
26846
+ .settings-session-import-pagination > span {
26847
+ flex: 1;
26848
+ min-width: 130px;
26849
+ }
26850
+
26851
+ .settings-session-import-pagination__navigation {
26852
+ display: flex;
26853
+ gap: 8px;
26854
+ margin-left: auto;
26855
+ }
26856
+
26857
+ .settings-session-import-content,
26858
+ .settings-session-import-list {
26859
+ display: grid;
26860
+ gap: 10px;
26861
+ }
26862
+
26863
+ .settings-session-import-status {
26864
+ display: flex;
26865
+ align-items: center;
26866
+ min-height: 64px;
26867
+ gap: 12px;
26868
+ padding: 16px;
26869
+ color: var(--settings-muted);
26870
+ background: var(--settings-panel);
26871
+ border: 1px solid var(--settings-border);
26872
+ border-radius: 8px;
26873
+ }
26874
+
26875
+ .settings-session-import-status.is-error {
26876
+ color: #ef4444;
26877
+ }
26878
+
26879
+ .settings-session-import-recovery {
26880
+ display: grid;
26881
+ justify-items: start;
26882
+ gap: 14px;
26883
+ padding: 16px;
26884
+ background: var(--settings-panel);
26885
+ border: 1px solid var(--settings-border);
26886
+ border-radius: 8px;
26887
+ }
26888
+
26889
+ .settings-session-import-recovery:focus-visible {
26890
+ outline: 2px solid var(--settings-focus);
26891
+ outline-offset: 2px;
26892
+ }
26893
+
26894
+ .settings-session-import-recovery__copy {
26895
+ display: grid;
26896
+ gap: 4px;
26897
+ }
26898
+
26899
+ .settings-session-import-recovery__copy strong {
26900
+ color: var(--settings-text);
26901
+ font-size: 14px;
26902
+ }
26903
+
26904
+ .settings-session-import-recovery__copy p {
26905
+ margin: 0;
26906
+ color: var(--settings-muted);
26907
+ font-size: 13px;
26908
+ line-height: 20px;
26909
+ }
26910
+
26911
+ .settings-session-import-recovery__path {
26912
+ display: flex;
26913
+ align-items: stretch;
26914
+ width: 100%;
26915
+ min-width: 0;
26916
+ overflow: hidden;
26917
+ border: 1px solid var(--settings-border);
26918
+ border-radius: 6px;
26919
+ }
26920
+
26921
+ .settings-session-import-recovery__path code {
26922
+ min-width: 0;
26923
+ flex: 1;
26924
+ padding: 8px 10px;
26925
+ overflow-x: auto;
26926
+ color: var(--settings-text);
26927
+ font-size: 12px;
26928
+ line-height: 20px;
26929
+ white-space: nowrap;
26930
+ }
26931
+
26932
+ .settings-session-import-recovery__path .settings-command-button {
26933
+ min-height: 0;
26934
+ flex: none;
26935
+ border-width: 0 0 0 1px;
26936
+ border-radius: 0;
26937
+ }
26938
+
26939
+ .settings-session-import-row {
26940
+ display: grid;
26941
+ grid-template-columns: minmax(0, 1fr) auto;
26942
+ align-items: center;
26943
+ gap: 20px;
26944
+ min-width: 0;
26945
+ padding: 16px;
26946
+ background: var(--settings-panel);
26947
+ border: 1px solid var(--settings-border);
26948
+ border-radius: 8px;
26949
+ }
26950
+
26951
+ .settings-session-import-row__copy {
26952
+ display: grid;
26953
+ min-width: 0;
26954
+ gap: 4px;
26955
+ }
26956
+
26957
+ .settings-session-import-row__copy strong {
26958
+ overflow: hidden;
26959
+ color: var(--settings-text);
26960
+ font-size: 14px;
26961
+ text-overflow: ellipsis;
26962
+ white-space: nowrap;
26963
+ }
26964
+
26965
+ .settings-session-import-row__copy span,
26966
+ .settings-session-import-row__cwd {
26967
+ overflow: hidden;
26968
+ color: var(--settings-muted);
26969
+ font-size: 12px;
26970
+ line-height: 18px;
26971
+ text-overflow: ellipsis;
26972
+ white-space: nowrap;
26973
+ }
26974
+
26975
+ .settings-session-import-row__cwd {
26976
+ display: block;
26977
+ min-width: 0;
26978
+ background: transparent;
26979
+ }
26980
+
26981
+ .settings-session-import-row__action {
26982
+ display: flex;
26983
+ align-items: flex-end;
26984
+ flex-direction: column;
26985
+ gap: 8px;
26986
+ }
26987
+
26988
+ .settings-session-import-running {
26989
+ color: var(--settings-muted);
26990
+ font-size: 12px;
26991
+ }
26992
+
26993
+ .settings-connection-page-header {
26994
+ display: flex;
26995
+ align-items: flex-start;
26996
+ justify-content: space-between;
26997
+ gap: 18px;
26998
+ margin-bottom: 18px;
26999
+ }
27000
+
27001
+ .settings-connection-page-header .settings-section-label {
27002
+ padding-bottom: 0;
27003
+ }
27004
+
27005
+ .settings-connection-page-header .settings-page-description {
27006
+ margin: 5px 0 0;
27007
+ }
27008
+
27009
+ .settings-connections-content,
27010
+ .settings-connections-layout,
27011
+ .settings-connection-list,
27012
+ .settings-connection-rows {
27013
+ min-width: 0;
27014
+ }
27015
+
27016
+ .settings-connections-layout {
27017
+ display: grid;
27018
+ grid-template-columns: minmax(0, 1.55fr) minmax(280px, 0.85fr);
27019
+ align-items: start;
27020
+ gap: 18px;
27021
+ }
27022
+
27023
+ .settings-connection-list,
27024
+ .settings-connection-inspector {
27025
+ overflow: hidden;
27026
+ background: var(--settings-panel);
27027
+ border: 1px solid var(--settings-border);
27028
+ border-radius: 10px;
27029
+ }
27030
+
27031
+ .settings-connection-host-strip {
27032
+ display: grid;
27033
+ grid-template-columns: 30px minmax(0, 1fr) 30px;
27034
+ align-items: center;
27035
+ min-width: 0;
27036
+ gap: 5px;
27037
+ padding: 9px 10px;
27038
+ border-bottom: 1px solid var(--settings-divider);
27039
+ }
27040
+
27041
+ .settings-connection-host-scroll {
27042
+ display: none;
27043
+ align-items: center;
27044
+ justify-content: center;
27045
+ width: 30px;
27046
+ height: 34px;
27047
+ padding: 0;
27048
+ color: var(--settings-muted);
27049
+ background: var(--settings-inset);
27050
+ border: 1px solid var(--settings-border);
27051
+ border-radius: 8px;
27052
+ cursor: pointer;
27053
+ }
27054
+
27055
+ .settings-connection-host-strip[data-connection-host-overflow="true"]
27056
+ .settings-connection-host-scroll {
27057
+ display: inline-flex;
27058
+ }
27059
+
27060
+ .settings-connection-host-strip:not([data-connection-host-overflow="true"]) {
27061
+ grid-template-columns: minmax(0, 1fr);
27062
+ }
27063
+
27064
+ .settings-connection-host-scroll:hover:not(:disabled) {
27065
+ color: var(--settings-text);
27066
+ background: var(--settings-hover);
27067
+ }
27068
+
27069
+ .settings-connection-host-scroll:disabled {
27070
+ cursor: default;
27071
+ opacity: 0.35;
27072
+ }
27073
+
27074
+ .settings-connection-host-scroll:focus-visible,
27075
+ .settings-connection-host-tab:focus-visible,
27076
+ .settings-connection-row:focus-visible,
27077
+ .settings-connection-install-link:focus-visible,
27078
+ .settings-connection-view-error:focus-visible {
27079
+ outline: 2px solid var(--settings-focus);
27080
+ outline-offset: 1px;
27081
+ }
27082
+
27083
+ .settings-connection-host-tabs {
27084
+ display: flex;
27085
+ align-items: center;
27086
+ min-width: 0;
27087
+ gap: 6px;
27088
+ overflow-x: auto;
27089
+ overflow-y: hidden;
27090
+ overscroll-behavior-x: contain;
27091
+ scrollbar-width: none;
27092
+ scroll-behavior: smooth;
27093
+ scroll-snap-type: x proximity;
27094
+ touch-action: pan-x;
27095
+ }
27096
+
27097
+ .settings-connection-host-tabs::-webkit-scrollbar {
27098
+ display: none;
27099
+ }
27100
+
27101
+ .settings-connection-host-tab {
27102
+ display: inline-flex;
27103
+ align-items: center;
27104
+ height: 30px;
27105
+ min-width: max-content;
27106
+ flex: none;
27107
+ padding: 0 9px;
27108
+ color: var(--settings-muted);
27109
+ font: inherit;
27110
+ font-size: 12px;
27111
+ line-height: 18px;
27112
+ white-space: nowrap;
27113
+ background: var(--settings-inset);
27114
+ border: 1px solid var(--settings-border);
27115
+ border-radius: 7px;
27116
+ cursor: pointer;
27117
+ scroll-snap-align: start;
27118
+ }
27119
+
27120
+ .settings-connection-host-tab:hover {
27121
+ color: var(--settings-text);
27122
+ background: var(--settings-hover);
27123
+ }
27124
+
27125
+ .settings-connection-host-tab[aria-selected="true"] {
27126
+ color: var(--settings-text);
27127
+ font-weight: 600;
27128
+ background: var(--settings-active);
27129
+ border-color: var(--settings-border);
27130
+ }
27131
+
27132
+ .settings-connection-table-header,
27133
+ .settings-connection-row {
27134
+ display: grid;
27135
+ grid-template-columns: minmax(160px, 1fr) minmax(92px, auto) 108px;
27136
+ align-items: center;
27137
+ min-width: 0;
27138
+ gap: 10px;
27139
+ }
27140
+
27141
+ .settings-connection-table-header {
27142
+ min-height: 30px;
27143
+ padding: 0 10px;
27144
+ color: var(--settings-muted);
27145
+ font-size: 10px;
27146
+ font-weight: 600;
27147
+ line-height: 16px;
27148
+ text-transform: uppercase;
27149
+ letter-spacing: 0.06em;
27150
+ background: transparent;
27151
+ border-bottom: 1px solid var(--settings-divider);
27152
+ }
27153
+
27154
+ .settings-connection-row {
27155
+ min-height: 52px;
27156
+ padding: 8px 10px;
27157
+ cursor: pointer;
27158
+ border-bottom: 1px solid var(--settings-divider);
27159
+ }
27160
+
27161
+ .settings-connection-row:last-child {
27162
+ border-bottom: 0;
27163
+ }
27164
+
27165
+ .settings-connection-row:hover {
27166
+ background: var(--settings-hover);
27167
+ }
27168
+
27169
+ .settings-connection-row[data-connection-selected="true"] {
27170
+ background: var(--settings-surface);
27171
+ }
27172
+
27173
+ .settings-connection-row__identity,
27174
+ .settings-connection-inspector__identity {
27175
+ display: inline-flex;
27176
+ align-items: center;
27177
+ min-width: 0;
27178
+ gap: 8px;
27179
+ color: var(--settings-text);
27180
+ }
27181
+
27182
+ .settings-connection-row__identity strong,
27183
+ .settings-connection-inspector__identity strong {
27184
+ min-width: 0;
27185
+ overflow-wrap: anywhere;
27186
+ font-size: 12px;
27187
+ font-weight: 500;
27188
+ line-height: 18px;
27189
+ }
27190
+
27191
+ .settings-connection-row__mark {
27192
+ display: inline-flex;
27193
+ align-items: center;
27194
+ justify-content: center;
27195
+ width: 24px;
27196
+ height: 24px;
27197
+ flex: none;
27198
+ color: var(--settings-muted);
27199
+ font-size: 10px;
27200
+ font-weight: 700;
27201
+ background: var(--settings-surface);
27202
+ border-radius: 6px;
27203
+ }
27204
+
27205
+ .settings-connection-row__mark--logo {
27206
+ color: var(--settings-text);
27207
+ background: transparent;
27208
+ }
27209
+
27210
+ .settings-connection-row__mark--logo > img,
27211
+ .settings-connection-row__mark--logo > svg {
27212
+ display: block;
27213
+ max-width: 18px;
27214
+ max-height: 18px;
27215
+ }
27216
+
27217
+ .settings-connection-row__status {
27218
+ display: inline-flex;
27219
+ align-items: center;
27220
+ width: fit-content;
27221
+ gap: 5px;
27222
+ color: var(--settings-muted);
27223
+ font-size: 11px;
27224
+ font-weight: 500;
27225
+ line-height: 18px;
27226
+ }
27227
+
27228
+ .settings-connection-row__status::before {
27229
+ width: 6px;
27230
+ height: 6px;
27231
+ flex: none;
27232
+ content: "";
27233
+ background: currentColor;
27234
+ border-radius: 50%;
27235
+ }
27236
+
27237
+ .settings-connection-row__status[data-connection-tone="ready"] {
27238
+ color: var(--settings-success);
27239
+ }
27240
+
27241
+ .settings-connection-row__status[data-connection-tone="checking"] {
27242
+ color: var(--settings-warning);
27243
+ }
27244
+
27245
+ .settings-connection-row__status[data-connection-tone="setup"] {
27246
+ color: var(--settings-muted);
27247
+ }
27248
+
27249
+ .settings-connection-row__status[data-connection-tone="setup"]::before {
27250
+ background: transparent;
27251
+ border: 1.5px solid currentColor;
27252
+ }
27253
+
27254
+ .settings-connection-row__status[data-connection-tone="failed"] {
27255
+ color: var(--settings-danger);
27256
+ }
27257
+
27258
+ .settings-connection-row__action {
27259
+ display: flex;
27260
+ align-items: center;
27261
+ justify-content: flex-end;
27262
+ min-width: 0;
27263
+ gap: 4px;
27264
+ }
27265
+
27266
+ .settings-connection-row__handle {
27267
+ display: inline-flex;
27268
+ flex: none;
27269
+ align-items: center;
27270
+ justify-content: center;
27271
+ width: 16px;
27272
+ color: var(--settings-muted);
27273
+ cursor: grab;
27274
+ opacity: 0.6;
27275
+ }
27276
+
27277
+ .settings-connection-row__handle:hover {
27278
+ opacity: 1;
27279
+ }
27280
+
27281
+ .settings-connection-row[draggable="true"] {
27282
+ cursor: grab;
27283
+ }
27284
+
27285
+ .settings-connection-row[data-connection-dragging="true"] {
27286
+ opacity: 0.4;
27287
+ }
27288
+
27289
+ .settings-connection-row[data-connection-drop-indicator="before"] {
27290
+ box-shadow: inset 0 2px 0 0 var(--settings-focus);
27291
+ }
27292
+
27293
+ .settings-connection-row[data-connection-drop-indicator="after"] {
27294
+ box-shadow: inset 0 -2px 0 0 var(--settings-focus);
27295
+ }
27296
+
27297
+ .settings-connection-row__group-toggle {
27298
+ display: inline-flex;
27299
+ flex: none;
27300
+ align-items: center;
27301
+ justify-content: center;
27302
+ width: 26px;
27303
+ height: 26px;
27304
+ color: var(--settings-muted);
27305
+ background: transparent;
27306
+ border: 0;
27307
+ border-radius: 6px;
27308
+ cursor: pointer;
27309
+ }
27310
+
27311
+ .settings-connection-row__group-toggle:hover {
27312
+ color: var(--settings-text);
27313
+ background: var(--settings-hover);
27314
+ }
27315
+
27316
+ .settings-connection-group-divider {
27317
+ padding: 10px 12px 6px;
27318
+ color: var(--settings-muted);
27319
+ font-size: 10px;
27320
+ font-weight: 600;
27321
+ line-height: 16px;
27322
+ text-transform: uppercase;
27323
+ letter-spacing: 0.06em;
27324
+ /* No border-top here: the row immediately above already carries its own
27325
+ border-bottom (it is no longer :last-child once this divider follows
27326
+ it), so adding one here would double the separator line. */
27327
+ }
27328
+
27329
+ .settings-connection-group-more[data-connection-drag-over="true"] {
27330
+ background: rgb(51 156 255 / 8%);
27331
+ }
27332
+
27333
+ .settings-connection-group-hint {
27334
+ display: grid;
27335
+ gap: 3px;
27336
+ margin: 0 12px 12px;
27337
+ padding: 14px 16px;
27338
+ text-align: center;
27339
+ border: 1.5px dashed var(--settings-border);
27340
+ border-radius: 10px;
27341
+ }
27342
+
27343
+ .settings-connection-group-more[data-connection-drag-over="true"] .settings-connection-group-hint {
27344
+ border-color: var(--settings-focus);
27345
+ }
27346
+
27347
+ .settings-connection-group-hint strong {
27348
+ color: var(--settings-text);
27349
+ font-size: 12.5px;
27350
+ font-weight: 500;
27351
+ line-height: 18px;
27352
+ }
27353
+
27354
+ .settings-connection-group-hint span {
27355
+ color: var(--settings-muted);
27356
+ font-size: 12px;
27357
+ line-height: 17px;
27358
+ }
27359
+
27360
+ .settings-connection-group-reset {
27361
+ display: flex;
27362
+ width: 100%;
27363
+ align-items: center;
27364
+ gap: 6px;
27365
+ padding: 10px 12px;
27366
+ color: var(--settings-muted);
27367
+ font: inherit;
27368
+ font-size: 12px;
27369
+ text-align: left;
27370
+ background: transparent;
27371
+ border: 0;
27372
+ border-top: 1px solid var(--settings-divider);
27373
+ cursor: pointer;
27374
+ }
27375
+
27376
+ .settings-connection-group-reset:hover {
27377
+ color: var(--settings-text);
27378
+ background: var(--settings-hover);
27379
+ }
27380
+
27381
+ .settings-connection-install-link {
27382
+ display: inline-flex;
27383
+ align-items: center;
27384
+ justify-content: center;
27385
+ width: 26px;
27386
+ height: 26px;
27387
+ color: var(--settings-focus);
27388
+ text-decoration: none;
27389
+ background: transparent;
27390
+ border: 1px solid transparent;
27391
+ border-radius: 7px;
27392
+ opacity: 0;
27393
+ transition: opacity 120ms ease;
27394
+ }
27395
+
27396
+ .settings-connection-row:hover .settings-connection-install-link,
27397
+ .settings-connection-install-link:focus-visible {
27398
+ opacity: 1;
27399
+ }
27400
+
27401
+ .settings-connection-install-link:hover {
27402
+ color: var(--settings-focus);
27403
+ background: var(--settings-active);
27404
+ border-color: var(--settings-border);
27405
+ }
27406
+
27407
+ .settings-connection-view-error {
27408
+ padding: 4px 7px;
27409
+ color: var(--settings-danger);
27410
+ font: inherit;
27411
+ font-size: 11px;
27412
+ line-height: 18px;
27413
+ background: transparent;
27414
+ border: 0;
27415
+ border-radius: 6px;
27416
+ cursor: pointer;
27417
+ }
27418
+
27419
+ .settings-connection-view-error:hover {
27420
+ color: var(--settings-danger);
27421
+ background: var(--settings-danger-bg);
27422
+ }
27423
+
27424
+ .settings-connection-inspector {
27425
+ position: sticky;
27426
+ top: 18px;
27427
+ }
27428
+
27429
+ .settings-connection-inspector__header {
27430
+ display: flex;
27431
+ align-items: flex-start;
27432
+ justify-content: space-between;
27433
+ min-width: 0;
27434
+ gap: 10px;
27435
+ padding: 12px;
27436
+ border-bottom: 1px solid var(--settings-divider);
27437
+ }
27438
+
27439
+ .settings-connection-inspector__body {
27440
+ display: grid;
27441
+ min-width: 0;
27442
+ gap: 12px;
27443
+ padding: 12px;
27444
+ }
27445
+
27446
+ .settings-connection-install-callout {
27447
+ display: grid;
27448
+ grid-template-columns: 28px minmax(0, 1fr);
27449
+ gap: 9px;
27450
+ padding: 11px;
27451
+ background: var(--settings-surface);
27452
+ border: 0;
27453
+ border-radius: 8px;
27454
+ }
27455
+
27456
+ .settings-connection-install-callout__icon {
27457
+ display: inline-flex;
27458
+ align-items: center;
27459
+ justify-content: center;
27460
+ width: 28px;
27461
+ height: 28px;
27462
+ color: var(--settings-focus);
27463
+ background: var(--settings-active);
27464
+ border-radius: 7px;
27465
+ }
27466
+
27467
+ .settings-connection-install-callout strong,
27468
+ .settings-connection-error-summary strong,
27469
+ .settings-connection-state-summary strong {
27470
+ display: block;
27471
+ margin: 0 0 4px;
27472
+ color: var(--settings-text);
27473
+ font-size: 12px;
27474
+ font-weight: 500;
27475
+ line-height: 18px;
27476
+ }
27477
+
27478
+ .settings-connection-install-callout p,
27479
+ .settings-connection-error-summary p,
27480
+ .settings-connection-state-summary p,
27481
+ .settings-connection-issue-note {
27482
+ margin: 0;
27483
+ color: var(--settings-muted);
27484
+ font-size: 11px;
27485
+ line-height: 16px;
27486
+ }
27487
+
27488
+ .settings-connection-install-button {
27489
+ width: fit-content;
27490
+ }
27491
+
27492
+ .settings-connection-error-summary {
27493
+ padding: 13px 14px;
27494
+ color: var(--settings-danger);
27495
+ background: var(--settings-danger-bg);
27496
+ border: 1px solid var(--settings-danger-border);
27497
+ border-radius: 10px;
27498
+ }
27499
+
27500
+ .settings-connection-error-metadata {
27501
+ display: grid;
27502
+ gap: 7px;
27503
+ padding: 12px;
27504
+ background: var(--settings-inset);
27505
+ border: 1px solid var(--settings-border);
27506
+ border-radius: 9px;
27507
+ }
27508
+
27509
+ .settings-connection-detail-line {
27510
+ display: grid;
27511
+ grid-template-columns: 92px minmax(0, 1fr);
27512
+ gap: 10px;
27513
+ min-width: 0;
27514
+ color: var(--settings-muted);
27515
+ font-size: 10px;
27516
+ line-height: 16px;
27517
+ }
27518
+
27519
+ .settings-connection-detail-line code {
27520
+ min-width: 0;
27521
+ overflow-wrap: anywhere;
27522
+ color: var(--settings-text);
27523
+ font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
27524
+ white-space: pre-wrap;
27525
+ }
27526
+
27527
+ .settings-connection-error-log-header {
27528
+ display: flex;
27529
+ align-items: center;
27530
+ justify-content: space-between;
27531
+ gap: 10px;
27532
+ }
27533
+
27534
+ .settings-connection-error-log-header strong {
27535
+ color: var(--settings-text);
27536
+ font-size: 11px;
27537
+ font-weight: 600;
27538
+ }
27539
+
27540
+ .settings-connection-error-log-header .settings-command-button {
27541
+ min-height: 30px;
27542
+ padding: 5px 9px;
27543
+ font-size: 11px;
27544
+ }
27545
+
27546
+ .settings-connection-stderr {
27547
+ max-height: 220px;
27548
+ min-width: 0;
27549
+ margin: 0;
27550
+ padding: 11px;
27551
+ overflow: auto;
27552
+ color: var(--settings-text);
27553
+ font:
27554
+ 10px/16px ui-monospace,
27555
+ "SFMono-Regular",
27556
+ Consolas,
27557
+ "Liberation Mono",
27558
+ monospace;
27559
+ white-space: pre-wrap;
27560
+ overflow-wrap: anywhere;
27561
+ background: var(--settings-inset);
27562
+ border: 1px solid var(--settings-border);
27563
+ border-radius: 9px;
27564
+ }
27565
+
27566
+ .settings-connection-error-actions {
27567
+ display: grid;
27568
+ grid-template-columns: minmax(0, 1fr);
27569
+ gap: 8px;
27570
+ }
27571
+
27572
+ .settings-connection-error-actions .settings-command-button {
27573
+ width: 100%;
27574
+ }
27575
+
27576
+ .settings-connection-issue-note {
27577
+ margin-top: -4px;
27578
+ }
27579
+
27580
+ .settings-connection-state-summary {
27581
+ padding: 14px;
27582
+ background: var(--settings-surface);
27583
+ border: 1px solid var(--settings-border);
27584
+ border-radius: 10px;
27585
+ }
27586
+
27587
+ .settings-empty {
27588
+ display: flex;
27589
+ align-items: center;
27590
+ min-height: 72px;
27591
+ padding: 12px 16px;
27592
+ }
27593
+
27594
+ .settings-empty > div {
27595
+ display: grid;
27596
+ min-width: 0;
27597
+ gap: 2px;
27598
+ }
27599
+
27600
+ .settings-empty strong {
27601
+ color: var(--settings-text);
27602
+ font-size: 13px;
27603
+ font-weight: 500;
27604
+ line-height: 19px;
27605
+ }
27606
+
27607
+ .settings-empty span {
27608
+ color: var(--settings-muted);
27609
+ font-size: 13px;
27610
+ line-height: 19px;
27611
+ }
27612
+
27613
+ .settings-about-panel {
27614
+ display: grid;
27615
+ max-width: 720px;
27616
+ gap: 18px;
27617
+ padding: 24px;
27618
+ background: var(--settings-panel);
27619
+ border: 1px solid var(--settings-border);
27620
+ border-radius: 12px;
27621
+ }
27622
+
27623
+ .settings-about-product {
27624
+ color: var(--settings-text);
27625
+ font-size: 24px;
27626
+ font-weight: 700;
27627
+ line-height: 32px;
27628
+ }
27629
+
27630
+ .settings-about-tagline {
27631
+ color: var(--settings-text);
27632
+ font-size: 16px;
27633
+ font-weight: 600;
27634
+ line-height: 24px;
27635
+ }
27636
+
27637
+ .settings-about-copy {
27638
+ display: grid;
27639
+ max-width: 660px;
27640
+ gap: 12px;
27641
+ }
27642
+
27643
+ .settings-about-copy p,
27644
+ .settings-about-repository p {
27645
+ margin: 0;
27646
+ color: var(--settings-muted);
27647
+ font-size: 13px;
27648
+ line-height: 21px;
27649
+ }
27650
+
27651
+ .settings-about-star-callout {
27652
+ margin: 2px 0;
27653
+ color: var(--settings-warning);
27654
+ font-size: 14px;
27655
+ font-weight: 600;
27656
+ line-height: 22px;
27657
+ }
27658
+
27659
+ .settings-about-repository {
27660
+ display: grid;
27661
+ gap: 10px;
27662
+ padding-top: 18px;
27663
+ border-top: 1px solid var(--settings-divider);
27664
+ }
27665
+
27666
+ .settings-about-repository-link {
27667
+ display: flex;
27668
+ align-items: center;
27669
+ width: fit-content;
27670
+ min-width: 0;
27671
+ max-width: 100%;
27672
+ gap: 8px;
27673
+ color: var(--settings-focus);
27674
+ font-size: 13px;
27675
+ font-weight: 600;
27676
+ text-decoration: none;
27677
+ }
27678
+
27679
+ .settings-about-repository-link:hover {
27680
+ text-decoration: underline;
27681
+ }
27682
+
27683
+ .settings-about-repository-link code {
27684
+ min-width: 0;
27685
+ overflow: hidden;
27686
+ color: var(--settings-muted);
27687
+ font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
27688
+ font-size: 11px;
27689
+ font-weight: 400;
27690
+ text-overflow: ellipsis;
27691
+ white-space: nowrap;
27692
+ }
27693
+
27694
+ .settings-page-error {
27695
+ padding: 16px;
27696
+ color: var(--settings-text);
27697
+ font-size: 13px;
27698
+ background: var(--settings-panel);
27699
+ border: 1px solid var(--settings-border);
27700
+ border-radius: 20px;
27701
+ }
27702
+
27703
+ .settings-update-metadata {
27704
+ display: grid;
27705
+ grid-template-columns: repeat(3, minmax(0, 1fr));
27706
+ gap: 24px;
27707
+ margin-bottom: 24px;
27708
+ padding: 0 4px 20px;
27709
+ border-bottom: 1px solid var(--settings-divider);
27710
+ }
27711
+
27712
+ .settings-update-metadata__item {
27713
+ display: grid;
27714
+ min-width: 0;
27715
+ gap: 4px;
27716
+ }
27717
+
27718
+ .settings-update-metadata__item span {
27719
+ color: var(--settings-muted);
27720
+ font-size: 12px;
27721
+ line-height: 18px;
27722
+ }
27723
+
27724
+ .settings-update-metadata__item strong {
27725
+ min-width: 0;
27726
+ overflow-wrap: anywhere;
27727
+ color: var(--settings-text);
27728
+ font-size: 15px;
27729
+ font-weight: 500;
27730
+ line-height: 22px;
27731
+ }
27732
+
27733
+ /* The only emphasis on this screen: a latest version newer than the installed one. */
27734
+ .settings-update-metadata__value--newer {
27735
+ color: var(--settings-focus);
27736
+ }
27737
+
27738
+ .settings-update-panel {
27739
+ display: grid;
27740
+ gap: 12px;
27741
+ padding: 20px;
27742
+ color: var(--settings-text);
27743
+ background: var(--settings-panel);
27744
+ border: 1px solid var(--settings-border);
27745
+ border-radius: 8px;
27746
+ }
27747
+
27748
+ .settings-update-panel__head {
27749
+ display: flex;
27750
+ align-items: center;
27751
+ min-width: 0;
27752
+ gap: 8px;
27753
+ }
27754
+
27755
+ .settings-update-panel__head .codexhost-settings-icon {
27756
+ color: var(--settings-muted);
27757
+ }
27758
+
27759
+ .settings-update-panel[data-update-state="available"] .codexhost-settings-icon,
27760
+ .settings-update-panel[data-update-state="downloading"] .codexhost-settings-icon,
27761
+ .settings-update-panel[data-update-state="installing"] .codexhost-settings-icon,
27762
+ .settings-update-panel[data-update-state="restarting"] .codexhost-settings-icon {
27763
+ color: var(--settings-focus);
27764
+ }
27765
+
27766
+ .settings-update-panel[data-update-state="current"] .codexhost-settings-icon {
27767
+ color: var(--settings-success);
27768
+ }
27769
+
27770
+ .settings-update-panel[data-update-state="failed"] .codexhost-settings-icon,
27771
+ .settings-update-panel[data-update-state="error"] .codexhost-settings-icon {
27772
+ color: var(--settings-danger);
27773
+ }
27774
+
27775
+ .settings-update-panel__title {
27776
+ min-width: 0;
27777
+ overflow-wrap: anywhere;
27778
+ color: var(--settings-text);
27779
+ font-size: 14px;
27780
+ font-weight: 600;
27781
+ line-height: 22px;
27782
+ }
27783
+
27784
+ .settings-update-summary,
27785
+ .settings-update-error {
27786
+ margin: 0;
27787
+ overflow-wrap: anywhere;
27788
+ font-size: 13px;
27789
+ line-height: 20px;
27790
+ }
27791
+
27792
+ .settings-update-summary {
27793
+ color: var(--settings-muted);
27794
+ }
27795
+
27796
+ .settings-update-error {
27797
+ color: var(--settings-danger);
27798
+ }
27799
+
27800
+ .settings-update-progress {
27801
+ width: 100%;
27802
+ height: 8px;
27803
+ accent-color: var(--settings-focus);
27804
+ }
27805
+
27806
+ .settings-update-progress-detail {
27807
+ color: var(--settings-muted);
27808
+ font-size: 12px;
27809
+ line-height: 18px;
27810
+ }
27811
+
27812
+ /* Release notes scroll with the page; a scroller inside a scroller traps the wheel. */
27813
+ .settings-update-notes-section {
27814
+ min-width: 0;
27815
+ margin-top: 24px;
27816
+ padding-top: 24px;
27817
+ border-top: 1px solid var(--settings-divider);
27818
+ }
27819
+
27820
+ .settings-update-notes-section:empty {
27821
+ display: none;
27822
+ }
27823
+
27824
+ .settings-update-notes {
27825
+ display: grid;
27826
+ min-width: 0;
27827
+ gap: 12px;
27828
+ color: var(--settings-muted);
27829
+ font-size: 14px;
27830
+ line-height: 22px;
27831
+ overflow-wrap: anywhere;
27832
+ }
27833
+
27834
+ .settings-update-notes > :first-child {
27835
+ margin-top: 0;
27836
+ }
27837
+
27838
+ .settings-update-notes > :last-child {
27839
+ margin-bottom: 0;
27840
+ }
27841
+
27842
+ .settings-update-notes h1,
27843
+ .settings-update-notes h2,
27844
+ .settings-update-notes h3,
27845
+ .settings-update-notes h4,
27846
+ .settings-update-notes h5,
27847
+ .settings-update-notes h6 {
27848
+ margin: 6px 0 0;
27849
+ color: var(--settings-text);
27850
+ font-weight: 600;
27851
+ }
27852
+
27853
+ .settings-update-notes h1 {
27854
+ font-size: 18px;
27855
+ line-height: 26px;
27856
+ }
27857
+
27858
+ .settings-update-notes h2 {
27859
+ font-size: 17px;
27860
+ line-height: 24px;
27861
+ }
27862
+
27863
+ .settings-update-notes h3,
27864
+ .settings-update-notes h4,
27865
+ .settings-update-notes h5,
27866
+ .settings-update-notes h6 {
27867
+ font-size: 14px;
27868
+ line-height: 22px;
27869
+ }
27870
+
27871
+ .settings-update-notes p,
27872
+ .settings-update-notes ul,
27873
+ .settings-update-notes ol,
27874
+ .settings-update-notes pre,
27875
+ .settings-update-notes blockquote {
27876
+ margin: 0;
27877
+ }
27878
+
27879
+ .settings-update-notes ul,
27880
+ .settings-update-notes ol {
27881
+ padding-left: 24px;
27882
+ }
27883
+
27884
+ .settings-update-notes li {
27885
+ padding-left: 4px;
27886
+ }
27887
+
27888
+ .settings-update-notes li::marker {
27889
+ color: var(--settings-muted);
27890
+ font-size: 0.85em;
27891
+ }
27892
+
27893
+ .settings-update-notes li + li {
27894
+ margin-top: 14px;
27895
+ }
27896
+
27897
+ .settings-update-notes .release-note-translation {
27898
+ display: block;
27899
+ margin-top: 3px;
27900
+ color: var(--settings-muted);
27901
+ font-size: 13px;
27902
+ line-height: 20px;
27903
+ }
27904
+
27905
+ .settings-update-notes blockquote {
27906
+ padding: 8px 12px;
27907
+ color: var(--settings-muted);
27908
+ border-left: 3px solid var(--settings-focus);
27909
+ background: var(--settings-surface);
27910
+ }
27911
+
27912
+ .settings-update-notes hr {
27913
+ width: 100%;
27914
+ margin: 2px 0;
27915
+ border: 0;
27916
+ border-top: 1px solid var(--settings-divider);
27917
+ }
27918
+
27919
+ .settings-update-notes strong {
27920
+ color: var(--settings-text);
27921
+ font-weight: 600;
27922
+ }
27923
+
27924
+ .settings-update-notes a {
27925
+ color: var(--settings-focus);
27926
+ text-decoration: none;
27927
+ }
27928
+
27929
+ .settings-update-notes a:hover {
27930
+ text-decoration: underline;
27931
+ }
27932
+
27933
+ .settings-update-notes code {
27934
+ font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
27935
+ font-size: 12px;
27936
+ }
27937
+
27938
+ .settings-update-notes :not(pre) > code {
27939
+ padding: 1px 5px;
27940
+ background: var(--settings-surface);
27941
+ border-radius: 4px;
27942
+ }
27943
+
27944
+ .settings-update-notes pre {
27945
+ min-width: 0;
27946
+ max-width: 100%;
27947
+ padding: 10px 12px;
27948
+ overflow-x: auto;
27949
+ overflow-y: hidden;
27950
+ background: var(--settings-inset);
27951
+ border-radius: 6px;
27952
+ }
27953
+
27954
+ .settings-update-notes pre code {
27955
+ line-height: 18px;
27956
+ white-space: pre-wrap;
27957
+ }
27958
+
27959
+ /* Manual update sits directly under the status panel, not behind a disclosure:
27960
+ automatic updates can fail for machine-local reasons and this is the way out. */
27961
+ .settings-update-controls {
27962
+ display: grid;
27963
+ min-width: 0;
27964
+ gap: 10px;
27965
+ margin-top: 24px;
27966
+ }
27967
+
27968
+ .settings-update-manual-title {
27969
+ color: var(--settings-text);
27970
+ font-size: 15px;
27971
+ font-weight: 600;
27972
+ line-height: 22px;
27973
+ }
27974
+
27975
+ .settings-update-manual {
27976
+ display: grid;
27977
+ min-width: 0;
27978
+ gap: 8px;
27979
+ }
27980
+
27981
+ .settings-update-manual[hidden] {
27982
+ display: none;
27983
+ }
27984
+
27985
+ .settings-update-manual-description {
27986
+ margin: 0;
27987
+ color: var(--settings-muted);
27988
+ font-size: 12px;
27989
+ line-height: 18px;
27990
+ }
27991
+
27992
+ .settings-update-manual-description.is-fallback {
27993
+ color: var(--settings-danger);
27994
+ }
27995
+
27996
+ .settings-update-command {
27997
+ display: flex;
27998
+ align-items: stretch;
27999
+ min-width: 0;
28000
+ overflow: hidden;
28001
+ border: 1px solid var(--settings-border);
28002
+ border-radius: 6px;
28003
+ }
28004
+
28005
+ .settings-update-command code {
28006
+ min-width: 0;
28007
+ flex: 1;
28008
+ padding: 9px 12px;
28009
+ overflow-x: auto;
28010
+ color: var(--settings-text);
28011
+ font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
28012
+ font-size: 12px;
28013
+ line-height: 20px;
28014
+ white-space: nowrap;
28015
+ }
28016
+
28017
+ .settings-update-command__copy {
28018
+ display: inline-flex;
28019
+ align-items: center;
28020
+ flex: none;
28021
+ gap: 6px;
28022
+ padding: 0 12px;
28023
+ color: var(--settings-muted);
28024
+ font-size: 12px;
28025
+ background: transparent;
28026
+ border: 0;
28027
+ border-left: 1px solid var(--settings-border);
28028
+ cursor: pointer;
28029
+ }
28030
+
28031
+ .settings-update-command__copy:hover {
28032
+ color: var(--settings-text);
28033
+ background: var(--settings-hover);
28034
+ }
28035
+
28036
+ .settings-update-command__copy:focus-visible {
28037
+ outline: 2px solid var(--settings-focus);
28038
+ outline-offset: -2px;
28039
+ }
28040
+
28041
+ .settings-update-actions {
28042
+ display: flex;
28043
+ align-items: center;
28044
+ min-width: 0;
28045
+ gap: 12px;
28046
+ flex-wrap: wrap;
28047
+ }
28048
+
28049
+ .settings-command-button,
28050
+ .settings-update-link {
28051
+ display: inline-flex;
28052
+ align-items: center;
28053
+ justify-content: center;
28054
+ flex: none;
28055
+ width: max-content;
28056
+ max-width: 100%;
28057
+ min-height: 30px;
28058
+ gap: 6px;
28059
+ padding: 5px 10px;
28060
+ white-space: nowrap;
28061
+ color: var(--settings-primary-text);
28062
+ font: inherit;
28063
+ font-size: 12px;
28064
+ text-decoration: none;
28065
+ background: var(--settings-primary);
28066
+ border: 1px solid var(--settings-primary);
28067
+ border-radius: 7px;
28068
+ cursor: pointer;
28069
+ }
28070
+
28071
+ .settings-command-button--secondary,
28072
+ .settings-update-link {
28073
+ color: var(--settings-text);
28074
+ background: var(--settings-panel);
28075
+ border-color: var(--settings-border);
28076
+ }
28077
+
28078
+ .settings-command-button:hover:not(:disabled) {
28079
+ background: var(--settings-primary-hover);
28080
+ border-color: var(--settings-primary-hover);
28081
+ }
28082
+
28083
+ .settings-command-button--secondary:hover:not(:disabled),
28084
+ .settings-update-link:hover {
28085
+ background: var(--settings-hover);
28086
+ border-color: var(--settings-border);
28087
+ }
28088
+
28089
+ .settings-command-button--danger {
28090
+ color: #f87171;
28091
+ }
28092
+
28093
+ .settings-command-button--danger:hover:not(:disabled) {
28094
+ color: #fecaca;
28095
+ background: rgb(127 29 29 / 24%);
28096
+ border-color: rgb(248 113 113 / 45%);
28097
+ }
28098
+
28099
+ .settings-command-button:disabled {
28100
+ cursor: default;
28101
+ opacity: 0.45;
28102
+ }
28103
+
28104
+ .settings-command-button:disabled,
28105
+ .settings-command-button[aria-disabled="true"] {
28106
+ opacity: 0.55;
28107
+ cursor: not-allowed;
28108
+ filter: none;
28109
+ }
28110
+
28111
+ .settings-command-button:focus-visible,
28112
+ .settings-update-link:focus-visible {
28113
+ outline: 2px solid var(--settings-focus);
28114
+ outline-offset: 2px;
28115
+ }
28116
+
28117
+ .codexhost-settings-icon {
28118
+ display: block;
28119
+ flex: none;
28120
+ stroke: currentColor;
28121
+ }
28122
+
28123
+ @media (max-width: 720px) {
28124
+ .codexhost-settings-dialog {
28125
+ width: calc(100vw - 16px);
28126
+ height: calc(100vh - var(--settings-titlebar-height) - 16px);
28127
+ border-radius: 10px;
28128
+ }
28129
+
28130
+ .settings-layout {
28131
+ grid-template-columns: minmax(0, 1fr);
28132
+ grid-template-rows: auto minmax(0, 1fr);
28133
+ }
28134
+
28135
+ .settings-session-import-row {
28136
+ grid-template-columns: minmax(0, 1fr);
28137
+ }
28138
+
28139
+ .settings-session-import-row__action {
28140
+ align-items: flex-start;
28141
+ }
28142
+
28143
+ .settings-sidebar {
28144
+ border-right: 0;
28145
+ border-bottom: 1px solid var(--settings-border);
28146
+ }
28147
+
28148
+ .settings-header {
28149
+ height: 56px;
28150
+ padding-inline: 14px;
28151
+ }
28152
+
28153
+ .settings-sidebar {
28154
+ padding-top: 20px;
28155
+ }
28156
+
28157
+ .settings-nav {
28158
+ flex: none;
28159
+ flex-direction: row;
28160
+ gap: 4px;
28161
+ padding: 7px 8px 8px;
28162
+ overflow-x: auto;
28163
+ overflow-y: hidden;
28164
+ }
28165
+
28166
+ .settings-nav-section-label {
28167
+ display: none;
28168
+ }
28169
+
28170
+ .settings-nav-button {
28171
+ width: auto;
28172
+ min-width: max-content;
28173
+ min-height: 34px;
28174
+ grid-template-columns: 16px auto;
28175
+ border-radius: 10px;
28176
+ }
28177
+
28178
+ .settings-nav-star-link {
28179
+ margin-top: 0;
28180
+ }
28181
+
28182
+ .settings-page__content {
28183
+ width: calc(100% - 40px);
28184
+ }
28185
+
28186
+ .settings-page__content {
28187
+ padding-top: 32px;
28188
+ padding-bottom: 32px;
28189
+ }
28190
+
28191
+ .settings-section-label {
28192
+ padding-bottom: 20px;
28193
+ font-size: 20px;
28194
+ line-height: 26px;
28195
+ }
28196
+
28197
+ .settings-update-metadata {
28198
+ grid-template-columns: minmax(0, 1fr);
28199
+ gap: 16px;
28200
+ }
28201
+
28202
+ .settings-status-row {
28203
+ grid-template-columns: minmax(0, 1fr) auto;
28204
+ gap: 16px;
28205
+ }
28206
+
28207
+ .settings-account-header,
28208
+ .settings-connection-page-header {
28209
+ flex-direction: column;
28210
+ }
28211
+
28212
+ .settings-account-header > .settings-command-button,
28213
+ .settings-connection-page-header > .settings-command-button {
28214
+ width: 100%;
28215
+ }
28216
+
28217
+ .settings-connections-layout {
28218
+ grid-template-columns: minmax(0, 1fr);
28219
+ }
28220
+
28221
+ .settings-connection-inspector {
28222
+ position: static;
28223
+ }
28224
+
28225
+ .settings-status-row__detail {
28226
+ grid-column: 1 / -1;
28227
+ margin: -8px 0 0 58px;
28228
+ }
28229
+ }
28230
+
28231
+ @media (forced-colors: active) {
28232
+ :host {
28233
+ --settings-bg: Canvas;
28234
+ --settings-sidebar: Canvas;
28235
+ --settings-panel: Canvas;
28236
+ --settings-surface: Canvas;
28237
+ --settings-surface-hover: Highlight;
28238
+ --settings-inset: Canvas;
28239
+ --settings-text: CanvasText;
28240
+ --settings-muted: GrayText;
28241
+ --settings-subtle: GrayText;
28242
+ --settings-border: ButtonBorder;
28243
+ --settings-divider: ButtonBorder;
28244
+ --settings-hover: Highlight;
28245
+ --settings-active: Highlight;
28246
+ --settings-focus: Highlight;
28247
+ --settings-primary: ButtonFace;
28248
+ --settings-primary-hover: Highlight;
28249
+ --settings-primary-text: ButtonText;
28250
+ --settings-warning: CanvasText;
28251
+ --settings-warning-bg: Canvas;
28252
+ --settings-warning-border: ButtonBorder;
28253
+ --settings-danger: CanvasText;
28254
+ --settings-danger-bg: Canvas;
28255
+ --settings-danger-border: ButtonBorder;
28256
+ --settings-success: CanvasText;
28257
+ }
28258
+ }
28259
+
28260
+ @media (prefers-reduced-motion: reduce) {
28261
+ *,
28262
+ *::before,
28263
+ *::after {
28264
+ scroll-behavior: auto !important;
28265
+ transition-duration: 0s !important;
28266
+ }
28267
+ }
28268
+ `;
26238
28269
 
26239
28270
  // src/settings/accounts.css
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';
28271
+ 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-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-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-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\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-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';
28272
+
28273
+ // src/settings/tailwind.css
28274
+ var tailwind_default = '@layer properties, theme, base, components, utilities;\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-content:"";--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}@layer theme{:root,:host{--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}}@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.relative{position:relative}.top-full{top:100%}.left-0{left:0}.z-20{z-index:20}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-0{margin:0}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-7{margin-top:calc(var(--spacing) * 7)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-16{margin-top:calc(var(--spacing) * 16)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-1{margin-left:var(--spacing)}.ml-\\[45px\\]{margin-left:45px}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-1\\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-8{height:calc(var(--spacing) * 8)}.min-h-6{min-height:calc(var(--spacing) * 6)}.min-h-\\[60px\\]{min-height:60px}.w-9{width:calc(var(--spacing) * 9)}.w-14{width:calc(var(--spacing) * 14)}.w-80{width:calc(var(--spacing) * 80)}.w-full{width:100%}.w-px{width:1px}.max-w-64{max-width:calc(var(--spacing) * 64)}.min-w-0{min-width:0}.flex-shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-disc{list-style-type:disc}.appearance-none{appearance:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0\\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.overflow-x-auto{overflow-x:auto}.rounded-\\[10px\\]{border-radius:10px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-settings-border{border-color:var(--settings-border)}.border-settings-divider{border-color:var(--settings-divider)}.bg-settings-panel{background-color:var(--settings-panel)}.bg-settings-subtle{background-color:var(--settings-subtle)}.bg-settings-surface{background-color:var(--settings-surface)}.bg-settings-surface-hover{background-color:var(--settings-surface-hover)}.bg-transparent{background-color:#0000}.p-0{padding:0}.p-4{padding:calc(var(--spacing) * 4)}.\\!px-0{padding-inline:0!important}.px-1{padding-inline:var(--spacing)}.px-2\\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pl-4{padding-left:calc(var(--spacing) * 4)}.\\!text-right{text-align:right!important}.text-left{text-align:left}.text-right{text-align:right}.align-top{vertical-align:top}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[11px\\]{font-size:11px}.text-\\[13px\\]{font-size:13px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-7{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.leading-\\[18px\\]{--tw-leading:18px;line-height:18px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-pre-wrap{white-space:pre-wrap}.text-settings-muted{color:var(--settings-muted)}.text-settings-subtle{color:var(--settings-subtle)}.text-settings-text{color:var(--settings-text)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.opacity-0{opacity:0}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\\[0_10px_30px_rgb\\(0_0_0\\/0\\.22\\)\\]{--tw-shadow:0 10px 30px var(--tw-shadow-color,#00000038);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-settings-border{--tw-ring-color:var(--settings-border)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.outline-none{--tw-outline-style:none;outline-style:none}.ring-inset{--tw-ring-inset:inset}.group-focus-within\\:visible:is(:where(.group):focus-within *){visibility:visible}.group-focus-within\\:opacity-100:is(:where(.group):focus-within *){opacity:1}@media (hover:hover){.group-hover\\:visible:is(:where(.group):hover *){visibility:visible}.group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}}.group-data-\\[state\\=failed\\]\\/status\\:bg-settings-danger:is(:where(.group\\/status)[data-state=failed] *){background-color:var(--settings-danger)}.group-data-\\[state\\=unavailable\\]\\/status\\:bg-settings-warning:is(:where(.group\\/status)[data-state=unavailable] *){background-color:var(--settings-warning)}.marker\\:text-settings-subtle ::marker{color:var(--settings-subtle)}.marker\\:text-settings-subtle::marker{color:var(--settings-subtle)}.marker\\:text-settings-subtle ::-webkit-details-marker{color:var(--settings-subtle)}.marker\\:text-settings-subtle::-webkit-details-marker{color:var(--settings-subtle)}.before\\:absolute:before{content:var(--tw-content);position:absolute}.before\\:top-0\\.5:before{content:var(--tw-content);top:calc(var(--spacing) * .5)}.before\\:left-0\\.5:before{content:var(--tw-content);left:calc(var(--spacing) * .5)}.before\\:size-4:before{content:var(--tw-content);width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.before\\:rounded-full:before{content:var(--tw-content);border-radius:3.40282e38px}.before\\:bg-white:before{content:var(--tw-content);background-color:#fff}.before\\:shadow-\\[0_1px_2px_rgb\\(0_0_0\\/0\\.3\\)\\]:before{content:var(--tw-content);--tw-shadow:0 1px 2px var(--tw-shadow-color,#0000004d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.before\\:transition-transform:before{content:var(--tw-content);transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.first\\:border-t-0:first-child{border-top-style:var(--tw-border-style);border-top-width:0}.first-of-type\\:mt-0:first-of-type{margin-top:0}.checked\\:bg-settings-focus:checked{background-color:var(--settings-focus)}.checked\\:ring-transparent:checked{--tw-ring-color:transparent}.checked\\:before\\:translate-x-4:checked:before{content:var(--tw-content);--tw-translate-x:calc(var(--spacing) * 4);translate:var(--tw-translate-x) var(--tw-translate-y)}.focus-within\\:border-settings-focus:focus-within{border-color:var(--settings-focus)}@media (hover:hover){.hover\\:text-settings-text:hover{color:var(--settings-text)}}.focus-visible\\:text-settings-text:focus-visible{color:var(--settings-text)}.focus-visible\\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\\:outline-settings-focus:focus-visible{outline-color:var(--settings-focus)}.data-\\[invalid\\=true\\]\\:border-settings-danger[data-invalid=true]{border-color:var(--settings-danger)}.data-\\[invalid\\=true\\]\\:text-settings-danger[data-invalid=true],.data-\\[state\\=failed\\]\\:text-settings-danger[data-state=failed]{color:var(--settings-danger)}.data-\\[state\\=unavailable\\]\\:text-settings-warning[data-state=unavailable]{color:var(--settings-warning)}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@layer properties{\n *, ::before, ::after, ::backdrop{--tw-border-style:solid;--tw-shadow:0 0 #0000;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-alpha:100%;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-offset-width:0;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-drop-shadow-alpha:100%;--tw-content:"";--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}\n';
26241
28275
 
26242
28276
  // src/settings/shell.ts
26243
28277
  var SETTINGS_SHELL_ATTRIBUTE = "data-codexhost-settings-shell";
@@ -26263,7 +28297,8 @@ ${error51.stderrTail}`] : []
26263
28297
  root.style.colorScheme = RENDERER_SETTINGS_COLOR_SCHEME;
26264
28298
  const shadow = root.attachShadow({ mode: "open" });
26265
28299
  const style = ownerDocument.createElement("style");
26266
- style.textContent = `${shell_default}
28300
+ style.textContent = `${tailwind_default}
28301
+ ${shell_default}
26267
28302
  ${accounts_default}`;
26268
28303
  const dialog = ownerDocument.createElement("dialog");
26269
28304
  dialog.className = "codexhost-settings-dialog";
@@ -26492,8 +28527,10 @@ ${accounts_default}`;
26492
28527
 
26493
28528
  // src/settings/trigger.ts
26494
28529
  var SETTINGS_TRIGGER_ATTRIBUTE = "data-codexhost-settings-trigger";
28530
+ var SETTINGS_HEADER_SURFACE_SELECTOR = '[data-testid="app-shell-header-context-menu-surface"]';
26495
28531
  var SETTINGS_APPLICATION_HEADER_SELECTOR = 'header[data-pip-obstacle="app-shell-header"]';
26496
28532
  var SETTINGS_HEADER_SLOT_SELECTOR = ':scope > [data-test-id="header-shell-slot"]';
28533
+ var SETTINGS_HEADER_NATIVE_ACTION_GROUP_SELECTOR = ':scope > [data-app-shell-header-obstacle="true"]';
26497
28534
  function measuredBounds(element) {
26498
28535
  const bounds = element.getBoundingClientRect();
26499
28536
  return {
@@ -26505,11 +28542,23 @@ ${accounts_default}`;
26505
28542
  height: bounds.height
26506
28543
  };
26507
28544
  }
28545
+ function findNativeHeaderActionGroup(header) {
28546
+ const surface = header.querySelector(SETTINGS_HEADER_SURFACE_SELECTOR);
28547
+ if (!surface) return null;
28548
+ const groups = [
28549
+ ...surface.querySelectorAll(SETTINGS_HEADER_NATIVE_ACTION_GROUP_SELECTOR)
28550
+ ];
28551
+ return groups.at(-1) ?? null;
28552
+ }
26508
28553
  function findRendererSettingsHeaderInsertionPoint(ownerDocument) {
26509
28554
  const header = ownerDocument.querySelector(SETTINGS_APPLICATION_HEADER_SELECTOR);
26510
28555
  if (!header) return null;
26511
28556
  const headerBounds = measuredBounds(header);
26512
28557
  if (headerBounds.width <= 0 || headerBounds.height <= 0) return null;
28558
+ const nativeActionGroup = findNativeHeaderActionGroup(header);
28559
+ if (nativeActionGroup?.parentElement) {
28560
+ return { parent: nativeActionGroup.parentElement, before: nativeActionGroup };
28561
+ }
26513
28562
  const endSlot = [...header.querySelectorAll(SETTINGS_HEADER_SLOT_SELECTOR)].filter((slot) => {
26514
28563
  const bounds = measuredBounds(slot);
26515
28564
  return bounds.width > 0 && bounds.height > 0;
@@ -26715,7 +28764,8 @@ ${accounts_default}`;
26715
28764
  }
26716
28765
  await options.openImportedThread(threadId, signal);
26717
28766
  if (!disposed && !signal.aborted) shell?.close();
26718
- }
28767
+ },
28768
+ options.getLoadedSessionsClient ?? (() => null)
26719
28769
  );
26720
28770
  const nextShell = installRendererSettingsShell(definitions, messages, ownerWindow.document);
26721
28771
  const nextTrigger = installRendererSettingsHeaderTrigger({
@@ -26860,82 +28910,6 @@ ${accounts_default}`;
26860
28910
  };
26861
28911
  }
26862
28912
 
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
-
26939
28913
  // src/renderer-binding-probe.ts
26940
28914
  var externalHarnessIds = {
26941
28915
  pi: harnessIdSchema.parse("pi"),
@@ -26948,7 +28922,9 @@ ${accounts_default}`;
26948
28922
  "kiro-cli": harnessIdSchema.parse("kiro-cli"),
26949
28923
  codebuddy: harnessIdSchema.parse("codebuddy"),
26950
28924
  "cursor-cli": harnessIdSchema.parse("cursor-cli"),
26951
- hermes: harnessIdSchema.parse("hermes")
28925
+ hermes: harnessIdSchema.parse("hermes"),
28926
+ qoder: harnessIdSchema.parse("qoder"),
28927
+ "qoder-cn": harnessIdSchema.parse("qoder-cn")
26952
28928
  };
26953
28929
  var externalAgents = [
26954
28930
  "pi",
@@ -26961,7 +28937,9 @@ ${accounts_default}`;
26961
28937
  "kiro-cli",
26962
28938
  "codebuddy",
26963
28939
  "cursor-cli",
26964
- "hermes"
28940
+ "hermes",
28941
+ "qoder",
28942
+ "qoder-cn"
26965
28943
  ];
26966
28944
  function isRetryableHarnessAvailability(availability, error51) {
26967
28945
  return availability !== void 0 && availability !== "ready" && availability !== "notInstalled" && error51?.retryable === true;
@@ -27153,6 +29131,21 @@ ${accounts_default}`;
27153
29131
  ...inspection.effectivePermissionModeId ? { permissionModeId: inspection.effectivePermissionModeId } : {}
27154
29132
  };
27155
29133
  }
29134
+ if (inspection.harnessId === "qoder" || inspection.harnessId === "qoder-cn") {
29135
+ const route = decodeHarnessPluginRoute(inspection.transportModelId);
29136
+ if (!route || route.harnessId !== inspection.harnessId) {
29137
+ throw new Error("Qoder Thread reported an incompatible transport Model");
29138
+ }
29139
+ const model = inspection.effectiveModel ?? route.model;
29140
+ const thinkingOptionId = inspection.availableThinkingOptions !== void 0 ? selectableThinkingOptionId(inspection) : inspection.effectiveThinkingOptionId ?? route.thinkingOptionId;
29141
+ const permissionModeId = inspection.effectivePermissionModeId ?? route.permissionModeId;
29142
+ return {
29143
+ agent: inspection.harnessId,
29144
+ ...model ? { model } : {},
29145
+ ...thinkingOptionId ? { thinkingOptionId } : {},
29146
+ ...permissionModeId ? { permissionModeId } : {}
29147
+ };
29148
+ }
27156
29149
  throw new Error("Thread owner is not a Renderer Agent");
27157
29150
  }
27158
29151
  function isOwnershipSubmissionBlocked(status) {
@@ -27239,16 +29232,14 @@ ${accounts_default}`;
27239
29232
  const controllerTarget = (target, hostId) => scopedComposerTarget(target, hostId);
27240
29233
  let usageNotificationDispose = null;
27241
29234
  const localAgentForSidebarThread = (input) => {
27242
- const mountedHostId = modelControl?.currentHostId?.() ?? "local";
27243
- if (input.hostId !== mountedHostId) return null;
27244
29235
  for (const mounted of mountedByComposer.values()) {
27245
29236
  const target = mounted.modelTarget;
27246
- if (target?.[0] === "default" && input.draftId !== null && target[1] === input.draftId) {
27247
- return controller.get(mounted.composer).agent;
27248
- }
27249
- if (target?.[0] === "conversation" && input.threadId !== null && target[1] === input.threadId && mounted.ownershipStatus === "ready") {
27250
- return controller.get(mounted.composer).agent;
27251
- }
29237
+ const matchesDraft = target?.[0] === "default" && input.draftId !== null && target[1] === input.draftId;
29238
+ const matchesConversation = target?.[0] === "conversation" && input.threadId !== null && target[1] === input.threadId && mounted.ownershipStatus === "ready";
29239
+ if (!matchesDraft && !matchesConversation) continue;
29240
+ const mountedHostId = modelControl?.currentHostId?.() ?? "local";
29241
+ if (input.hostId !== mountedHostId) return null;
29242
+ return controller.get(mounted.composer).agent;
27252
29243
  }
27253
29244
  return null;
27254
29245
  };
@@ -27257,24 +29248,11 @@ ${accounts_default}`;
27257
29248
  getLocalAgent: localAgentForSidebarThread
27258
29249
  });
27259
29250
  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
- });
27268
29251
  const settingsLifecycle = installRendererSettingsLifecycle(window, {
27269
29252
  getUpdateClient: () => modelControl,
27270
- getAccountClient: () => {
27271
- const client = modelControl;
27272
- return client && {
27273
- ...client,
27274
- switchCodexAccount: (input) => accountNavigation.switchAccount(() => client.switchCodexAccount(input))
27275
- };
27276
- },
29253
+ getAccountClient: () => modelControl,
27277
29254
  getConnectionDiagnostics: () => connectionDiagnostics,
29255
+ getLoadedSessionsClient: () => modelClientForHost("local"),
27278
29256
  getSessionImportClient: () => {
27279
29257
  const client = modelClientForHost("local");
27280
29258
  const sources = client?.listSessionImportSources;
@@ -27314,7 +29292,9 @@ ${accounts_default}`;
27314
29292
  "kiro-cli": void 0,
27315
29293
  codebuddy: void 0,
27316
29294
  "cursor-cli": void 0,
27317
- hermes: void 0
29295
+ hermes: void 0,
29296
+ qoder: void 0,
29297
+ "qoder-cn": void 0
27318
29298
  },
27319
29299
  webUi: Object.fromEntries(
27320
29300
  externalAgents.map((agent) => [agent, false])
@@ -27400,7 +29380,7 @@ ${accounts_default}`;
27400
29380
  mounted.control,
27401
29381
  controller.get(mounted.composer),
27402
29382
  adapterStatus.state,
27403
- accounts?.switching === true || controller.isSwitching(mounted.composer) || mounted.ownershipStatus === "loading",
29383
+ controller.isSwitching(mounted.composer) || mounted.ownershipStatus === "loading",
27404
29384
  activeHarnessAvailabilityState().availability,
27405
29385
  mounted.modelView,
27406
29386
  mounted.permissionModeView,
@@ -27487,7 +29467,7 @@ ${accounts_default}`;
27487
29467
  mounted.usage = null;
27488
29468
  mounted.accountCredits = null;
27489
29469
  renderMounted(mounted);
27490
- if (accounts?.switching || !accountId || !client?.inspectCodexAccountUsage) return;
29470
+ if (!accountId || !client?.inspectCodexAccountUsage) return;
27491
29471
  try {
27492
29472
  const result = await client.inspectCodexAccountUsage({ accountId });
27493
29473
  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)
@@ -28777,7 +30757,7 @@ ${accounts_default}`;
28777
30757
  const mounted = mountedByComposer.get(composer);
28778
30758
  if (!mounted) return null;
28779
30759
  const current = controller.get(composer);
28780
- if (composerCodexAccounts(composer)?.switching || controller.isSwitching(composer) || isOwnershipSubmissionBlocked(mounted.ownershipStatus)) {
30760
+ if (controller.isSwitching(composer) || isOwnershipSubmissionBlocked(mounted.ownershipStatus)) {
28781
30761
  return false;
28782
30762
  }
28783
30763
  if (!isExternalConfigurationReady(mounted)) return false;
@@ -28817,7 +30797,7 @@ ${accounts_default}`;
28817
30797
  const onKeyDown = (event) => {
28818
30798
  const composer = isComposerInputIntent(event) ? composerForTarget(event.target) : null;
28819
30799
  const mounted = composer ? mountedByComposer.get(composer) : void 0;
28820
- if (composer && (composerCodexAccounts(composer)?.switching || controller.isSwitching(composer))) {
30800
+ if (composer && controller.isSwitching(composer)) {
28821
30801
  blockEvent(event);
28822
30802
  return;
28823
30803
  }
@@ -29017,7 +30997,6 @@ ${accounts_default}`;
29017
30997
  mutationObserver.disconnect();
29018
30998
  disposeReasoningSoftWrap();
29019
30999
  sidebarAgentIcons.dispose();
29020
- accountNavigation.dispose();
29021
31000
  settingsLifecycle.dispose();
29022
31001
  document.removeEventListener("beforeinput", onBeforeInput, true);
29023
31002
  document.removeEventListener("submit", onSubmit, true);